added SleepSetter
This commit is contained in:
77
apps/sleep.py
Executable file
77
apps/sleep.py
Executable file
@@ -0,0 +1,77 @@
|
|||||||
|
from appdaemon.entity import Entity
|
||||||
|
from appdaemon.plugins.hass import hassapi as hass
|
||||||
|
|
||||||
|
|
||||||
|
class SleepSetter(hass.Hass):
|
||||||
|
def initialize(self):
|
||||||
|
assert self.entity_exists(entity_id=self.variable), f'{self.variable} does not exist'
|
||||||
|
|
||||||
|
if isinstance(self.button, list):
|
||||||
|
for button in self.button:
|
||||||
|
self.listen_event(self.handle_button, event='deconz_event', id=button)
|
||||||
|
else:
|
||||||
|
self.listen_event(self.handle_button, event='deconz_event', id=self.button)
|
||||||
|
|
||||||
|
self.variable_entity.listen_state(callback=self.handle_state)
|
||||||
|
|
||||||
|
self.log(f'{self.variable} can be set using {self.button}, currently {self.state}')
|
||||||
|
|
||||||
|
def handle_state(self, entity, attribute, old, new, kwargs):
|
||||||
|
self.log(f'{entity}: {old} -> {new}')
|
||||||
|
if self.state and self.sun_elevation < -10:
|
||||||
|
self.all_off()
|
||||||
|
self.turn_on(self.scene)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def button(self) -> str:
|
||||||
|
return self.args['button']
|
||||||
|
|
||||||
|
@property
|
||||||
|
def scene(self) -> str:
|
||||||
|
res = self.args['scene']
|
||||||
|
if not res.startswith('scene.'):
|
||||||
|
res = f'scene.{res}'
|
||||||
|
return res
|
||||||
|
|
||||||
|
@property
|
||||||
|
def variable(self) -> str:
|
||||||
|
return self.args['variable']
|
||||||
|
|
||||||
|
@property
|
||||||
|
def variable_entity(self) -> Entity:
|
||||||
|
return self.get_entity(self.variable)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def state(self) -> bool:
|
||||||
|
return self.variable_entity.get_state('state') == 'on'
|
||||||
|
|
||||||
|
@state.setter
|
||||||
|
def state(self, new: bool):
|
||||||
|
state = 'on' if bool(new) else 'off'
|
||||||
|
self.log(f'Setting {self.variable} to {state}')
|
||||||
|
return self.variable_entity.set_state(state=state)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def sun_elevation(self) -> float:
|
||||||
|
return float(self.get_state('sun.sun', 'elevation'))
|
||||||
|
|
||||||
|
def handle_button(self, event_name, data, kwargs):
|
||||||
|
if (elev := self.sun_elevation) < 0:
|
||||||
|
# long-press down
|
||||||
|
if data['event'] == 1001:
|
||||||
|
self.state = True
|
||||||
|
|
||||||
|
# long-press up
|
||||||
|
# if data['event'] == 1003:
|
||||||
|
# self.state = True
|
||||||
|
else:
|
||||||
|
self.log(f'Ignoring event because sun elevation {elev} > 0')
|
||||||
|
|
||||||
|
def all_off(self):
|
||||||
|
self.log(f'Turning off')
|
||||||
|
for entity in self.args['off_entities']:
|
||||||
|
try:
|
||||||
|
self.turn_off(entity)
|
||||||
|
except:
|
||||||
|
self.log(f'Failed to turn off {entity}')
|
||||||
|
continue
|
||||||
16
apps/sleep.yaml
Executable file
16
apps/sleep.yaml
Executable file
@@ -0,0 +1,16 @@
|
|||||||
|
sleep:
|
||||||
|
module: sleep
|
||||||
|
class: SleepSetter
|
||||||
|
scene: in_bed
|
||||||
|
variable: input_boolean.sleeping
|
||||||
|
button:
|
||||||
|
- bedroom
|
||||||
|
- bedroom2
|
||||||
|
- living_room
|
||||||
|
off_entities:
|
||||||
|
- light.living_room
|
||||||
|
- light.bathroom
|
||||||
|
- light.patio
|
||||||
|
- light.closet
|
||||||
|
- light.kitchen
|
||||||
|
- light.corner_light
|
||||||
Reference in New Issue
Block a user