diff --git a/apps/sleep.py b/apps/sleep.py index 4b067f1..f5e4e32 100755 --- a/apps/sleep.py +++ b/apps/sleep.py @@ -1,14 +1,44 @@ +from datetime import datetime, timedelta import json from appdaemon.entity import Entity from appdaemon.plugins.hass.hassapi import Hass from appdaemon.plugins.mqtt.mqttapi import Mqtt +from appdaemon.adbase import ADBase + + +class SleepTV(ADBase): + handle: str = None + + def initialize(self): + self.adapi = self.get_ad_api() + self.adapi.set_log_level('DEBUG') + self.sleep_time.listen_state(self.handle_sleep_time_change) + + @property + def sleep_time(self) -> Entity: + return self.adapi.get_entity(self.args['sleep_time']) + + @property + def tv(self) -> Entity: + return self.adapi.get_entity(self.args['tv']) + + def handle_sleep_time_change(self, entity: str, attribute: str, old: str, new: str, **kwargs): + now = self.adapi.get_now() + dt = datetime.strptime(new, '%H:%M:%S') + dt = datetime.combine(now.date(), dt.time()) + + if dt.time() < now.time(): + dt += timedelta(days=1) + + self.adapi.cancel_timer(self.handle, silent=True) + self.handle = self.adapi.run_at(lambda **kwargs: self.tv.turn_off(), dt) class SleepSetter(Hass, Mqtt): def initialize(self): assert self.entity_exists(entity_id=self.variable), f'{self.variable} does not exist' - self.listen_state(callback=self.handle_state, entity_id=self.variable) + self.variable_entity.listen_state(self.handle_state) self.setup_buttons() def setup_buttons(self): @@ -20,7 +50,7 @@ class SleepSetter(Hass, Mqtt): def setup_button(self, name: str): topic = f'zigbee2mqtt/{name}' - self.mqtt_subscribe(topic, namespace='mqtt') + # self.mqtt_subscribe(topic, namespace='mqtt') self.listen_event( self.handle_button, 'MQTT_MESSAGE', diff --git a/apps/sleep.yaml b/apps/sleep.yaml index 5c4a1a4..b6e89a6 100755 --- a/apps/sleep.yaml +++ b/apps/sleep.yaml @@ -9,6 +9,7 @@ sleep: - Bedroom Button 2 - Living Room Button - Bathroom Button + off_apps: # - bedroom - living_room @@ -21,3 +22,9 @@ sleep: on_apps: - living_room - bedroom + +sleep_tv: + module: sleep + class: SleepTV + sleep_time: input_datetime.tv_sleep_time + tv: media_player.bedroom_vizio