started ControllerDaylight

This commit is contained in:
John Lancaster
2023-04-15 16:05:06 -05:00
parent 6aa9154a78
commit e301c6838f
2 changed files with 66 additions and 8 deletions

View File

@@ -1,11 +1,11 @@
from dataclasses import dataclass, field from dataclasses import dataclass, field
from datetime import timedelta from datetime import datetime, timedelta
from html import entities
from typing import List from typing import List
from appdaemon.adapi import ADAPI
from appdaemon.entity import Entity from appdaemon.entity import Entity
from appdaemon.plugins.hass.hassapi import Hass from appdaemon.plugins.hass.hassapi import Hass
from daylight_adjuster import DaylightAdjuster
@dataclass(init=False) @dataclass(init=False)
@@ -26,6 +26,7 @@ class ControllerBase(Hass):
self.log(f'Initialized controller for {[e.friendly_name for e in self.entities]}') self.log(f'Initialized controller for {[e.friendly_name for e in self.entities]}')
@dataclass(init=False) @dataclass(init=False)
class ControllerRoom(ControllerBase): class ControllerRoom(ControllerBase):
def initialize(self): def initialize(self):
@@ -47,6 +48,7 @@ class ControllerRoom(ControllerBase):
def state(self) -> bool: def state(self) -> bool:
return any([e.get_state() == 'on' for e in self.entities]) return any([e.get_state() == 'on' for e in self.entities])
@dataclass(init=False) @dataclass(init=False)
class ControllerMotion(ControllerBase): class ControllerMotion(ControllerBase):
room: ControllerRoom room: ControllerRoom
@@ -67,7 +69,6 @@ class ControllerMotion(ControllerBase):
self.off_duration = timedelta() self.off_duration = timedelta()
self.sync_state() self.sync_state()
self.listen_state(self.sync_state, [e.entity_id for e in self.entities]) self.listen_state(self.sync_state, [e.entity_id for e in self.entities])
@property @property
@@ -115,6 +116,7 @@ class ControllerMotion(ControllerBase):
self.log(f'Motion stopped on {self.friendly_name(entity)} for {self.off_duration}') self.log(f'Motion stopped on {self.friendly_name(entity)} for {self.off_duration}')
self.room.deactivate() self.room.deactivate()
@dataclass(init=False) @dataclass(init=False)
class ControllerButton(Hass): class ControllerButton(Hass):
room: ControllerRoom room: ControllerRoom
@@ -143,3 +145,30 @@ class ControllerButton(Hass):
else: else:
self.room.activate() self.room.activate()
@dataclass(init=False)
class ControllerDaylight(ControllerBase):
latitude: float
longitude: float
def initialize(self):
super().initialize()
self.adjuster = DaylightAdjuster(
latitude=self.args['latitude'],
longitude=self.args['longitude'],
periods=self.args['periods'],
resolution=500
)
self.log(self.adjuster)
self.listen_state(callback=self.adjust, entity_id=[e.entity_id for e in self.entities])
self.log(f'Listening for state {[e.friendly_name for e in self.entities]}')
def adjust(self, entity, attribute, old, new, kwargs):
if new == 'on':
self.adjustment_handle = self.run_every(callback=self.ongoing_adjustment, start='now', interval=10, entity=entity)
else:
self.log(f'Cancelling adjustments')
self.cancel_timer(self.adjustment_handle)
def ongoing_adjustment(self, kwargs):
self.log(f'Adjusting {self.friendly_name(kwargs["entity"])}')

View File

@@ -11,7 +11,6 @@ kitchen_motion:
off_duration: 00:01:00 off_duration: 00:01:00
entities: entities:
- binary_sensor.motion_kitchen - binary_sensor.motion_kitchen
# - binary_sensor.motion_bedroom
kitchen_button: kitchen_button:
module: controller module: controller
@@ -19,3 +18,33 @@ kitchen_button:
room: kitchen room: kitchen
buttons: buttons:
- kitchen - kitchen
kitchen_daylight:
module: controller
class: ControllerDaylight
entities:
- light.kitchen
latitude: 30.150380
longitude: -97.4487
periods:
- time: '04:00:00am'
brightness: 75
color_temp: 200
- elevation: 0
direction: rising
brightness: 150
color_temp: 200
- time: noon
brightness: 255
color_temp: 300
- elevation: 0
direction: setting
brightness: 125
color_temp: 325
- time: '10:30:00pm'
brightness: 75
color_temp: 350