current state moved to RoomConfig
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user