From 97a6da6815e8573aa167aebef613014b103f68ee Mon Sep 17 00:00:00 2001 From: John Lancaster <32917998+jsl12@users.noreply.github.com> Date: Sun, 23 Apr 2023 23:40:45 -0500 Subject: [PATCH] hopefully simplified the state change callbacks --- apps/controller.py | 89 ++++++++++++++++++++-------------------------- 1 file changed, 39 insertions(+), 50 deletions(-) diff --git a/apps/controller.py b/apps/controller.py index 653642c..ecffd5f 100644 --- a/apps/controller.py +++ b/apps/controller.py @@ -1,5 +1,6 @@ from dataclasses import dataclass, field from datetime import datetime, timedelta +import logging from typing import List from appdaemon.entity import Entity @@ -184,46 +185,45 @@ class ControllerDaylight(Hass): # self.log(self.adjuster) self.listen_state(callback=self.handle_state_change, - entity_id=[e.entity_id for e in self.entities]) - # self.listen_state(callback=self.handle_brightness_change, - # entity_id=[e.entity_id for e in self.entities], - # attribute='brightness') - # self.listen_state(callback=self.handle_brightness_change, - # entity_id=[e.entity_id for e in self.entities], - # attribute='color_temp') + entity_id=[e.entity_id for e in self.entities], + attribute='brightness') + self.listen_state(callback=self.handle_state_change, + entity_id=[e.entity_id for e in self.entities], + attribute='color_temp') ents = [e.friendly_name for e in self.entities] if len(ents) > 1: ents[-1] = f'and {ents[-1]}' delim = ', ' if len(ents) >= 3 else ' ' self.log(f'Listening for state changes on {delim.join(ents)}') - self.run_every(callback=self.update_sensors, start='now', interval=5.0) - + self.run_every( + callback=self.update_sensors, + start='now', + interval=self.args.get('interval', 5) + ) + for entity in self.entities: - if entity.get_state() == 'on': - self.start_adjustments(entity.entity_id) + self.run_every( + callback=self.ongoing_adjustment, + start='now', + interval=self.args.get('interval', 5), + entity=entity + ) if (entity_name := self.args.get('enable')) is not None: self.enable_entity: Entity = self.get_entity(entity_name) self.log(f'enabled by {self.enable_entity.friendly_name}[{entity_name}]') - # self.listen_state( - # callback=lambda entity, attribute, old, new, kwargs: self.log(f'{self.enable_entity.friendly_name}: {old} -> {new}'), - # entity_id=entity_name - # ) + self.listen_state( + callback=lambda entity, attribute, old, new, kwargs: self.ongoing_adjustment({'entity': entity}), + entity_id=entity_name, + new='on' + ) def handle_state_change(self, entity=None, attribute=None, old=None, new=None, kwargs=None): - self.log(f'{entity}: {old} -> {new}') - if new == 'on': - if old == 'off': - self.start_adjustments(entity) - else: - self.stop_adjustments() - - def handle_brightness_change(self, entity=None, attribute=None, old=None, new=None, kwargs=None): if not self.matching_state(entity): self.log(f'{entity}.{attribute}: {old} -> {new}') self.log(f'State does not match adjuster settings, disabling adjustments') - self.stop_adjustments() + self.enabled = False def matching_state(self, entity_id: str) -> bool: """Checks whether the current state of the light matches the settings from the DaylightAdjuster @@ -245,10 +245,10 @@ class ControllerDaylight(Hass): return False else: valid = all((state[s] == val) for s, val in settings.items()) - if not valid: - for s, val in settings.items(): - if state[s] != val: - self.log(f'{entity_id}.{s}: {state[s]} != {val}') + # if not valid: + # for s, val in settings.items(): + # if state[s] != val: + # self.log(f'{entity_id}.{s}: {state[s]} != {val}') return valid @property @@ -262,29 +262,18 @@ class ControllerDaylight(Hass): def enabled(self, new: bool) -> bool: self.enable_entity.set_state(state='on' if new else 'off') - def start_adjustments(self, entity: str): - self.adjustment_handle = self.run_every( - callback=self.ongoing_adjustment, - start='now', - interval=10, - entity=entity - ) - self.log(f'Started adjustments') - - def stop_adjustments(self): - if hasattr(self, 'adjustment_handle'): - self.cancel_timer(self.adjustment_handle) - del self.adjustment_handle - self.log(f'Cancelled adjustments') - - def ongoing_adjustment(self, kwargs): + def ongoing_adjustment(self, kwargs=None): if self.enabled: - self.log(f'Ongoing adjustment') - settings = self.adjuster.current_settings - matching = self.matching_state(entity_id=kwargs['entity']) - if not matching and not self.room.is_sleeping: - self.turn_on(entity_id=kwargs['entity'], **settings) - self.log(f'Adjusted {self.friendly_name(kwargs["entity"])} with {settings}') + entity: Entity = self.get_entity(kwargs['entity']) + if entity.get_state() == 'on': + self.log(f'Ongoing adjustment for {entity.friendly_name}') + settings = self.adjuster.current_settings + matching = self.matching_state(entity_id=kwargs['entity']) + if not matching and not self.room.is_sleeping: + self.turn_on(entity_id=kwargs['entity'], **settings) + self.log(f'Adjusted {self.friendly_name(kwargs["entity"])} with {settings}') + else: + self.log(f'{entity.friendly_name} is off - no adjustment') else: self.log(f'App disabled by {self.enable_entity.friendly_name}')