current state moved to RoomConfig

This commit is contained in:
John Lancaster
2024-01-22 18:32:36 -06:00
parent 53cb116372
commit 6ef45830fb

View File

@@ -19,7 +19,6 @@ def str_to_timedelta(input_str: str) -> timedelta:
except Exception: except Exception:
return timedelta() return timedelta()
@dataclass @dataclass
class RoomState: class RoomState:
scene: Dict[str, Dict[str, str | int]] scene: Dict[str, Dict[str, str | int]]
@@ -86,6 +85,23 @@ class RoomConfig:
cfg: Dict = yaml.load(f, Loader=yaml.SafeLoader)[app_name] cfg: Dict = yaml.load(f, Loader=yaml.SafeLoader)[app_name]
return cls.from_app_config(cfg) return cls.from_app_config(cfg)
def sort_states(self):
"""Should only be called after all the times have been resolved
"""
assert all(isinstance(state.time, time) for state in self.states), 'Times have not all been resolved yet'
self.states = sorted(self.states, key=lambda s: s.time, reverse=True)
def current_state(self, current_time: time) -> RoomState:
time_fmt = "%I:%M:%S %p"
print(current_time.strftime(time_fmt))
self.sort_states()
for state in self.states:
if state.time <= current_time:
return state
else:
# self.log(f'Defaulting to first state')
return self.states[0]
class RoomController(Hass, Mqtt): class RoomController(Hass, Mqtt):
"""Class for linking an light with a motion sensor. """Class for linking an light with a motion sensor.
@@ -175,7 +191,7 @@ class RoomController(Hass, Mqtt):
except Exception as e: except Exception as e:
self.log(f'Failed with {type(e)}: {e}') self.log(f'Failed with {type(e)}: {e}')
async def current_state(self, time: time = None) -> RoomState: async def current_state(self, now: time = None) -> RoomState:
if (await self.sleep_bool()): if (await self.sleep_bool()):
self.log(f'sleep: active') self.log(f'sleep: active')
if (state := self.args.get('sleep_state')): if (state := self.args.get('sleep_state')):
@@ -183,24 +199,16 @@ class RoomController(Hass, Mqtt):
else: else:
return RoomState(scene={}) return RoomState(scene={})
else: else:
# now: datetime = await self.get_now() now = now or (await self.get_now()).time()
# self.log(f'Getting state for datetime: {now.strftime("%I:%M:%S %p")}') self.log(f'Getting state for {now}', level='DEBUG')
time = time or (await self.get_now()).time()
time_fmt = "%I:%M:%S %p"
# self.log(f'Getting state before: {time.strftime(time_fmt)}')
for state in self.states:
time_str = state.time.strftime(time_fmt)
if state.time <= time:
# self.log(f'Selected state from {time_str}')
return state
# else:
# self.log(f'Not {time_str}')
else:
# self.log(f'Defaulting to first state')
return self.states[0]
async def current_scene(self, time: time = None) -> Dict[str, Dict[str, str | int]]: state = self._room_config.current_state(now)
state = await self.current_state(time=time) self.log(f'Current state: {state}', level='DEBUG')
return state
async def current_scene(self, now: time = None) -> Dict[str, Dict[str, str | int]]:
state = await self.current_state(now)
assert isinstance(state, RoomState) assert isinstance(state, RoomState)
self.log(f'Current scene: {state}') self.log(f'Current scene: {state}')
return state.scene return state.scene