I guess I’m not understanding why I can’t have multiple run_daily objects in parallel?
Oh wait… I suppose I’m starting to get it. so yeah I need to move the run_daily callbacks into the alarm_set_event function and then add handles for each so I can cancel them before re-initializing on an alarm_set_event?
I guess the only thing I’m still unclear about is if the best practice is to run multiple run_daily events or to run a single_run_daily with “run_in” steps inside of it? Do multiple timer callbacks block each other?
UPDATED:
import appdaemon.plugins.hass.hassapi as hass
import datetime
import time
# Declare Class
class WakeUp(hass.Hass):
#initialize() function which will be called at startup and reload
def initialize(self):
self.handle_espresso = None
self.handle_hvac = None
self.handle_lights = None
self.handle_wakeup = None
# Default to 8:15
self.wakeup = datetime.time(8, 15, 0)
self.set_timers()
self.listen_state(self.alarm_set_event, self.args["alarm_switch"], attribute="brightness")
#self.log("listening: {}".format(self.args["alarm_switch"]))
def alarm_set_event(self, entity, attrubite, old, new, kwargs):
if new == 127:
self.wakeup = datetime.time(5, 00, 0)
elif new == 130:
self.wakeup = datetime.time(5, 15, 0)
elif new == 132:
self.wakeup = datetime.time(5, 30, 0)
elif new == 135:
self.wakeup = datetime.time(5, 45, 0)
elif new == 153:
self.wakeup = datetime.time(6, 00, 0)
elif new == 155:
self.wakeup = datetime.time(6, 15, 0)
elif new == 158:
self.wakeup = datetime.time(6, 30, 0)
elif new == 160:
self.wakeup = datetime.time(6, 45, 0)
elif new == 178:
self.wakeup = datetime.time(7, 00, 0)
elif new == 181:
self.wakeup = datetime.time(7, 15, 0)
elif new == 183:
self.wakeup = datetime.time(7, 30, 0)
elif new == 186:
self.wakeup = datetime.time(7, 45, 0)
elif new == 204:
self.wakeup = datetime.time(8, 00, 0)
elif new == 206:
self.wakeup = datetime.time(8, 15, 0)
elif new == 209:
self.wakeup = datetime.time(8, 30, 0)
elif new == 211:
self.wakeup = datetime.time(8, 45, 0)
elif new == 229:
self.wakeup = datetime.time(9, 00, 0)
elif new == 232:
self.wakeup = datetime.time(9, 15, 0)
elif new == 234:
self.wakeup = datetime.time(9, 30, 0)
elif new == 237:
self.wakeup = datetime.time(9, 45, 0)
elif new == 25:
self.wakeup = datetime.time(10, 00, 0)
elif new == 28:
self.wakeup = datetime.time(10, 15, 0)
elif new == 30:
self.wakeup = datetime.time(10, 30, 0)
elif new == 33:
self.wakeup = datetime.time(10, 45, 0)
else:
self.wakeup = datetime.time(8, 15, 0)
self.set_timers()
def set_timers(self):
self.cancel()
self.espresso_on = (datetime.datetime.combine(datetime.date(1, 1, 1), self.wakeup) - datetime.timedelta(minutes=45)).time()
self.lights_on = (datetime.datetime.combine(datetime.date(1, 1, 1), self.wakeup) - datetime.timedelta(minutes=15)).time()
self.hvac_on = (datetime.datetime.combine(datetime.date(1, 1, 1), self.wakeup) - datetime.timedelta(minutes=7)).time()
self.handle_espresso = self.run_daily(self.run_espresso, self.espresso_on)
self.handle_hvac = self.run_daily(self.run_hvac, self.hvac_on)
self.handle_lights = self.run_daily(self.run_fade, self.lights_on)
self.handle_wakeup = self.run_daily(self.run_wakeup, self.wakeup)
self.log("Alarm Set for: {}".format(self.wakeup))
self.log("Espresso Machine On: {}".format(self.espresso_on))
self.log("Light Fade Start: {}".format(self.lights_on))
self.log("HVAC On: {}".format(self.hvac_on))
def run_fade(self, kwargs):
self.log("Starting lights")
self.fire_event("MODE_CHANGE", mode = "Morning")
for b in range(1,15):
self.turn_on("group.bedroom_lights", brightness_pct=b)
time.sleep(58)
def run_espresso(self, kwargs):
self.log("Starting Espresso Machine")
self.turn_on("switch.espresso_machine")
def run_hvac(self, kwargs):
self.log("Starting HVAC")
# Why twice? Dunno but it works.
self.call_service("climate/set_operation_mode", entity_id = "climate.Heating", operation_mode = "Heating")
self.call_service("climate/set_operation_mode", entity_id = "climate.Heating", operation_mode = "Heating")
self.turn_on("switch.hotwater_tank")
def run_wakeup(self, kwargs):
self.log("Starting Wakeup")
self.fire_event("MODE_CHANGE", mode = "Present")
self.turn_on("group.bedroom_lights", brightness_pct=60)
self.turn_on("switch.hotwater_loop")
def cancel(self):
self.log("Cancel existing timers")
self.cancel_timer(self.handle_espresso)
self.cancel_timer(self.handle_lights)
self.cancel_timer(self.handle_hvac)
self.cancel_timer(self.handle_wakeup)