diff --git a/motion.py b/motion.py index 038c0ce..e58b7bb 100644 --- a/motion.py +++ b/motion.py @@ -15,6 +15,14 @@ class Motion(Hass): def sensor_state(self) -> bool: return self.sensor.state == 'on' + @property + def ref_entity(self) -> Entity: + return self.get_entity(self.args['ref_entity']) + + @property + def ref_entity_state(self) -> bool: + return self.ref_entity.get_state() == 'on' + @property def off_duration(self) -> timedelta: return self.app.off_duration @@ -23,8 +31,8 @@ class Motion(Hass): self.app: RoomController = self.get_app(self.args['app']) self.log(f'Connected to app {self.app.name}') - self.listen_state(self.callback_light_on, self.args['entity'], new='on') - self.listen_state(self.callback_light_off, self.args['entity'], new='off') + self.listen_state(self.callback_light_on, self.ref_entity.entity_id, new='on') + self.listen_state(self.callback_light_off, self.ref_entity.entity_id, new='off') self.sync_state() @@ -33,7 +41,7 @@ class Motion(Hass): Essentially mimics the `state_change` callback based on the current state of the light. """ - if self.app.entity_state: + if self.ref_entity_state: self.callback_light_on() else: self.callback_light_off() diff --git a/room_control.py b/room_control.py index 8f2fcab..dba8daf 100755 --- a/room_control.py +++ b/room_control.py @@ -27,47 +27,47 @@ class RoomController(Hass, Mqtt): self.log(f'Setting up input button: {self.friendly_name(ha_button)}') self.listen_state(callback=self.activate_any_on, entity_id=ha_button) - @property - def entity(self) -> str: - return self.args['entity'] + # @property + # def entity(self) -> str: + # return self.args['entity'] - @property - def entity_state(self) -> bool: - return self.get_state(self.entity) == 'on' + # @property + # def entity_state(self) -> bool: + # return self.get_state(self.entity) == 'on' - @entity_state.setter - def entity_state(self, new): - if isinstance(new, str): - if new == 'on': - self.turn_on(self.entity) - elif new == 'off': - self.turn_on(self.entity) - else: - raise ValueError(f'Invalid value for entity state: {new}') - elif isinstance(new, bool): - if new: - self.turn_on(self.entity) - self.log(f'Turned on {self.friendly_name(self.entity)}') - else: - self.turn_off(self.entity) - self.log(f'Turned off {self.friendly_name(self.entity)}') - elif isinstance(new, dict): - if any(isinstance(val, dict) for val in new.values()): - # self.log(f'Setting scene with nested dict: {new}') - for entity, state in new.items(): - if state.pop('state', 'on') == 'on': - # self.log(f'Setting {entity} state with: {state}') - self.turn_on(entity_id=entity, **state) - else: - self.turn_off(entity) - else: - if new.pop('state', 'on') == 'on': - self.turn_on(self.entity, **new) - else: - self.turn_off(self.entity) + # @entity_state.setter + # def entity_state(self, new): + # if isinstance(new, str): + # if new == 'on': + # self.turn_on(self.entity) + # elif new == 'off': + # self.turn_on(self.entity) + # else: + # raise ValueError(f'Invalid value for entity state: {new}') + # elif isinstance(new, bool): + # if new: + # self.turn_on(self.entity) + # self.log(f'Turned on {self.friendly_name(self.entity)}') + # else: + # self.turn_off(self.entity) + # self.log(f'Turned off {self.friendly_name(self.entity)}') + # elif isinstance(new, dict): + # if any(isinstance(val, dict) for val in new.values()): + # # self.log(f'Setting scene with nested dict: {new}') + # for entity, state in new.items(): + # if state.pop('state', 'on') == 'on': + # # self.log(f'Setting {entity} state with: {state}') + # self.turn_on(entity_id=entity, **state) + # else: + # self.turn_off(entity) + # else: + # if new.pop('state', 'on') == 'on': + # self.turn_on(self.entity, **new) + # else: + # self.turn_off(self.entity) - else: - raise TypeError(f'Invalid type: {type(new)}: {new}') + # else: + # raise TypeError(f'Invalid type: {type(new)}: {new}') def parse_states(self): def gen():