diff --git a/apps/controller.py b/apps/controller.py index ecffd5f..e597f63 100644 --- a/apps/controller.py +++ b/apps/controller.py @@ -184,6 +184,9 @@ class ControllerDaylight(Hass): ) # self.log(self.adjuster) + self.listen_state(callback=self.handle_off, + entity_id=[e.entity_id for e in self.entities], + new='off') self.listen_state(callback=self.handle_state_change, entity_id=[e.entity_id for e in self.entities], attribute='brightness') @@ -194,21 +197,26 @@ class ControllerDaylight(Hass): 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)}') + ents = delim.join(ents) + self.log(f'Listening for state changes on {ents}') + + interval = self.args.get('interval', 5) self.run_every( callback=self.update_sensors, start='now', - interval=self.args.get('interval', 5) + interval=interval ) - + self.log(f'Updating sensors every {timedelta(seconds=interval)}') + for entity in self.entities: self.run_every( callback=self.ongoing_adjustment, start='now', - interval=self.args.get('interval', 5), - entity=entity + interval=interval, + entity=entity.entity_id ) + self.log(f'Updating sensors every {timedelta(seconds=interval)}') if (entity_name := self.args.get('enable')) is not None: self.enable_entity: Entity = self.get_entity(entity_name) @@ -263,15 +271,22 @@ class ControllerDaylight(Hass): self.enable_entity.set_state(state='on' if new else 'off') def ongoing_adjustment(self, kwargs=None): + # self.log('Ongoing adjustment') + entity: Entity = self.get_entity(kwargs['entity']) + if self.enabled: - 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}') + if not self.matching_state(entity_id=entity.entity_id): + if not self.room.is_sleeping: + self.turn_on(entity_id=entity.entity_id, **settings) + self.log(f'Adjusted {entity.friendly_name} with {settings}') + + else: + self.log(f'Sleeping mode active') + else: + self.log(f'{entity.friendly_name} settings already match') else: self.log(f'{entity.friendly_name} is off - no adjustment') else: @@ -282,6 +297,13 @@ class ControllerDaylight(Hass): id = f'sensor.{self.name}_{key}' self.set_state( entity_id=id, state=val, - attributes={ - 'friendly_name': f'Daylight, {key}, {self.name}', - 'state_class': 'measurement'}) + attributes={'friendly_name': f'Daylight, {key}, {self.name}', + 'state_class': 'measurement'}) + + def handle_off(self, entity, attribute, old, new, kwargs): + self.log('Off handle') + self.run_in( + callback=lambda kwargs: self.enable_entity.set_state(state='on'), + delay=1.0 + ) + self.log('Re-enabled') \ No newline at end of file