diff --git a/room_control.py b/room_control.py index a0307ed..5c8d125 100755 --- a/room_control.py +++ b/room_control.py @@ -18,7 +18,6 @@ def str_to_timedelta(input_str: str) -> timedelta: return timedelta(hours=hours, minutes=minutes, seconds=seconds) except Exception: return timedelta() - @dataclass class RoomState: @@ -85,7 +84,24 @@ class RoomConfig: with yaml_path.open('r') as f: cfg: Dict = yaml.load(f, Loader=yaml.SafeLoader)[app_name] 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 for linking an light with a motion sensor. @@ -175,7 +191,7 @@ class RoomController(Hass, Mqtt): except Exception as 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()): self.log(f'sleep: active') if (state := self.args.get('sleep_state')): @@ -183,24 +199,16 @@ class RoomController(Hass, Mqtt): else: return RoomState(scene={}) else: - # 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() - 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] + now = now or (await self.get_now()).time() + self.log(f'Getting state for {now}', level='DEBUG') - async def current_scene(self, time: time = None) -> Dict[str, Dict[str, str | int]]: - state = await self.current_state(time=time) + state = self._room_config.current_state(now) + 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) self.log(f'Current scene: {state}') return state.scene