diff --git a/button.py b/button.py index 1b55afb..be915b4 100644 --- a/button.py +++ b/button.py @@ -38,11 +38,6 @@ class Button(Mqtt): async def handle_action(self, action: str): if action == 'single': self.log(f' {action.upper()} '.center(50, '=')) - cause = 'button single click' - state = await self.get_state(entity_id=self.args['ref_entity']) - if state == 'on': - self.app.deactivate(entity='', kwargs={'cause': cause}) - else: - await self.app.activate(cause=cause) + await self.app.toggle(kwargs={'cause': 'button single click'}) else: pass \ No newline at end of file diff --git a/room_control.py b/room_control.py index 7fe7ecd..7ebd644 100755 --- a/room_control.py +++ b/room_control.py @@ -98,7 +98,7 @@ class RoomController(Hass, Mqtt): yield state states = [s async for s in gen()] - states = sorted(states, key=lambda s: s['time']) + states = sorted(states, key=lambda s: s['time'], reverse=True) return states async def current_state(self, time: time = None): @@ -109,12 +109,12 @@ class RoomController(Hass, Mqtt): else: return {} else: - now: datetime = await self.get_now() - self.log(f'Getting state for datetime: {now.strftime("%I:%M:%S %p")}') + # now: datetime = await self.get_now() + # self.log(f'Getting state for datetime: {now.strftime("%I:%M:%S %p")}') time = time or (await self.get_now()).time() - for state in self.states[::-1]: + for state in self.states: if state['time'] <= time: - self.log(f'Selected state from {state["time"].strftime("%I:%M:%S %p")}') + # self.log(f'Selected state from {state["time"].strftime("%I:%M:%S%p")}') return state else: return self.states[-1] @@ -180,7 +180,8 @@ class RoomController(Hass, Mqtt): return timedelta() @utils.sync_wrapper - async def activate(self, *args, cause: str = 'unknown', **kwargs): + async def activate(self, entity = None, attribute = None, old = None, new = None, kwargs = None): + cause = kwargs.get('cause', 'unknown') self.log(f'Activating: {cause}') scene = await self.current_scene() @@ -205,28 +206,36 @@ class RoomController(Hass, Mqtt): self.log(f'ERROR: unknown scene: {scene}') @utils.sync_wrapper - async def activate_all_off(self, entity, attribute = None, old = None, new = None, kwargs = None): + async def activate_all_off(self, *args, **kwargs): """Activate if all of the entities are off """ if self.all_off: # self.log(f'Activate all off args/kwargs: {kwargs}') - self.activate(**kwargs) + self.activate( *args, **kwargs) else: self.log(f'Skipped activating - everything is not off') @utils.sync_wrapper - async def activate_any_on(self, entity, attribute = None, old = None, new = None, kwargs = None): + async def activate_any_on(self, *args, **kwargs): """Activate if any of the entities are on """ if self.any_on: - self.activate(**kwargs) + self.activate(*args, **kwargs) else: self.log(f'Skipped activating - everything is off') - def deactivate(self, entity, attribute = None, old = None, new = None, kwargs = None): + def deactivate(self, entity = None, attribute = None, old = None, new = None, kwargs = None): cause = kwargs.get('cause', 'unknown') self.log(f'Deactivating: {cause}') - for entity in self.app_entities: - self.turn_off(entity) - self.log(f'Turned off {entity}') + for e in self.app_entities: + self.turn_off(e) + self.log(f'Turned off {e}') + @utils.sync_wrapper + async def toggle(self, *args, **kwargs): + state = await self.get_state(self.args['ref_entity']) + kwargs['kwargs']['cause'] += f': toggle while {state}' + if state == 'on': + self.deactivate(*args, **kwargs) + else: + await self.activate(*args, **kwargs)