toggle stuff

This commit is contained in:
John Lancaster
2023-11-25 22:04:10 -06:00
parent e659629c71
commit 148645094a
2 changed files with 24 additions and 20 deletions

View File

@@ -38,11 +38,6 @@ class Button(Mqtt):
async def handle_action(self, action: str): async def handle_action(self, action: str):
if action == 'single': if action == 'single':
self.log(f' {action.upper()} '.center(50, '=')) self.log(f' {action.upper()} '.center(50, '='))
cause = 'button single click' await self.app.toggle(kwargs={'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)
else: else:
pass pass

View File

@@ -98,7 +98,7 @@ class RoomController(Hass, Mqtt):
yield state yield state
states = [s async for s in gen()] 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 return states
async def current_state(self, time: time = None): async def current_state(self, time: time = None):
@@ -109,12 +109,12 @@ class RoomController(Hass, Mqtt):
else: else:
return {} return {}
else: else:
now: datetime = await self.get_now() # now: datetime = await self.get_now()
self.log(f'Getting state for datetime: {now.strftime("%I:%M:%S %p")}') # self.log(f'Getting state for datetime: {now.strftime("%I:%M:%S %p")}')
time = time or (await self.get_now()).time() time = time or (await self.get_now()).time()
for state in self.states[::-1]: for state in self.states:
if state['time'] <= time: 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 return state
else: else:
return self.states[-1] return self.states[-1]
@@ -180,7 +180,8 @@ class RoomController(Hass, Mqtt):
return timedelta() return timedelta()
@utils.sync_wrapper @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}') self.log(f'Activating: {cause}')
scene = await self.current_scene() scene = await self.current_scene()
@@ -205,28 +206,36 @@ class RoomController(Hass, Mqtt):
self.log(f'ERROR: unknown scene: {scene}') self.log(f'ERROR: unknown scene: {scene}')
@utils.sync_wrapper @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 """Activate if all of the entities are off
""" """
if self.all_off: if self.all_off:
# self.log(f'Activate all off args/kwargs: {kwargs}') # self.log(f'Activate all off args/kwargs: {kwargs}')
self.activate(**kwargs) self.activate( *args, **kwargs)
else: else:
self.log(f'Skipped activating - everything is not off') self.log(f'Skipped activating - everything is not off')
@utils.sync_wrapper @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 """Activate if any of the entities are on
""" """
if self.any_on: if self.any_on:
self.activate(**kwargs) self.activate(*args, **kwargs)
else: else:
self.log(f'Skipped activating - everything is off') 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') cause = kwargs.get('cause', 'unknown')
self.log(f'Deactivating: {cause}') self.log(f'Deactivating: {cause}')
for entity in self.app_entities: for e in self.app_entities:
self.turn_off(entity) self.turn_off(e)
self.log(f'Turned off {entity}') 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)