mirror of
https://github.com/basnijholt/adaptive-lighting.git
synced 2026-09-12 06:44:04 +02:00
another attempt
This commit is contained in:
parent
ae64db7077
commit
7cbe6a4258
3 changed files with 79 additions and 96 deletions
|
|
@ -57,8 +57,6 @@ from homeassistant.util.color import (
|
|||
color_xy_to_hs,
|
||||
)
|
||||
|
||||
from .const import _PROFILE_SCHEMA, CONF_PROFILES
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
DOMAIN = "circadian_lighting"
|
||||
|
|
@ -74,30 +72,35 @@ CONF_SUNSET_OFFSET = "sunset_offset"
|
|||
CONF_SUNRISE_TIME = "sunrise_time"
|
||||
CONF_SUNSET_TIME = "sunset_time"
|
||||
DEFAULT_TRANSITION = 60
|
||||
CONF_PROFILES = "profiles"
|
||||
|
||||
_DOMAIN_SCHEMA = {
|
||||
vol.Optional(CONF_MIN_CT, default=DEFAULT_MIN_CT): vol.All(
|
||||
vol.Coerce(int), vol.Range(min=1000, max=10000)
|
||||
),
|
||||
vol.Optional(CONF_MAX_CT, default=DEFAULT_MAX_CT): vol.All(
|
||||
vol.Coerce(int), vol.Range(min=1000, max=10000)
|
||||
),
|
||||
vol.Optional(CONF_SUNRISE_OFFSET): cv.time_period_str,
|
||||
vol.Optional(CONF_SUNSET_OFFSET): cv.time_period_str,
|
||||
vol.Optional(CONF_SUNRISE_TIME): cv.time,
|
||||
vol.Optional(CONF_SUNSET_TIME): cv.time,
|
||||
vol.Optional(CONF_LATITUDE): cv.latitude,
|
||||
vol.Optional(CONF_LONGITUDE): cv.longitude,
|
||||
vol.Optional(CONF_ELEVATION): float,
|
||||
vol.Optional(CONF_INTERVAL, default=DEFAULT_INTERVAL): cv.time_period,
|
||||
vol.Optional(ATTR_TRANSITION, default=DEFAULT_TRANSITION): VALID_TRANSITION,
|
||||
}
|
||||
|
||||
_DOMAIN_SCHEMA_NO_DEFAULTS = {type(k)(k): v for k, v in _DOMAIN_SCHEMA.items()}
|
||||
|
||||
CONFIG_SCHEMA = vol.Schema(
|
||||
{
|
||||
DOMAIN: vol.Schema(
|
||||
{
|
||||
vol.Optional(CONF_MIN_CT, default=DEFAULT_MIN_CT): vol.All(
|
||||
vol.Coerce(int), vol.Range(min=1000, max=10000)
|
||||
),
|
||||
vol.Optional(CONF_MAX_CT, default=DEFAULT_MAX_CT): vol.All(
|
||||
vol.Coerce(int), vol.Range(min=1000, max=10000)
|
||||
),
|
||||
vol.Optional(CONF_SUNRISE_OFFSET): cv.time_period_str,
|
||||
vol.Optional(CONF_SUNSET_OFFSET): cv.time_period_str,
|
||||
vol.Optional(CONF_SUNRISE_TIME): cv.time,
|
||||
vol.Optional(CONF_SUNSET_TIME): cv.time,
|
||||
vol.Optional(CONF_LATITUDE): cv.latitude,
|
||||
vol.Optional(CONF_LONGITUDE): cv.longitude,
|
||||
vol.Optional(CONF_ELEVATION): float,
|
||||
vol.Optional(CONF_INTERVAL, default=DEFAULT_INTERVAL): cv.time_period,
|
||||
vol.Optional(
|
||||
ATTR_TRANSITION, default=DEFAULT_TRANSITION
|
||||
): VALID_TRANSITION,
|
||||
**_DOMAIN_SCHEMA,
|
||||
vol.Optional(CONF_PROFILES): vol.Schema(
|
||||
{cv.string: vol.Schema(_PROFILE_SCHEMA)}
|
||||
{cv.string: vol.Schema(_DOMAIN_SCHEMA_NO_DEFAULTS)}
|
||||
),
|
||||
}
|
||||
),
|
||||
|
|
|
|||
|
|
@ -1,43 +0,0 @@
|
|||
import voluptuous as vol
|
||||
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
from homeassistant.components.light import VALID_TRANSITION
|
||||
|
||||
# Switch and profile settings
|
||||
CONF_PROFILE = "profile"
|
||||
CONF_PROFILES = "profiles"
|
||||
CONF_DISABLE_BRIGHTNESS_ADJUST = "disable_brightness_adjust"
|
||||
CONF_MIN_BRIGHT, DEFAULT_MIN_BRIGHT = "min_brightness", 1
|
||||
CONF_MAX_BRIGHT, DEFAULT_MAX_BRIGHT = "max_brightness", 100
|
||||
CONF_SLEEP_ENTITY = "sleep_entity"
|
||||
CONF_SLEEP_STATE = "sleep_state"
|
||||
CONF_SLEEP_CT, DEFAULT_SLEEP_CT = "sleep_colortemp", 1000
|
||||
CONF_SLEEP_BRIGHT, DEFAULT_SLEEP_BRIGHT = "sleep_brightness", 1
|
||||
CONF_DISABLE_ENTITY = "disable_entity"
|
||||
CONF_DISABLE_STATE = "disable_state"
|
||||
CONF_INITIAL_TRANSITION, DEFAULT_INITIAL_TRANSITION = "initial_transition", 1
|
||||
CONF_ONLY_ONCE = "only_once"
|
||||
|
||||
_PROFILE_SCHEMA = {
|
||||
vol.Optional(CONF_DISABLE_BRIGHTNESS_ADJUST, default=False): cv.boolean,
|
||||
vol.Optional(CONF_MIN_BRIGHT, default=DEFAULT_MIN_BRIGHT): vol.All(
|
||||
vol.Coerce(int), vol.Range(min=1, max=100)
|
||||
),
|
||||
vol.Optional(CONF_MAX_BRIGHT, default=DEFAULT_MAX_BRIGHT): vol.All(
|
||||
vol.Coerce(int), vol.Range(min=1, max=100)
|
||||
),
|
||||
vol.Optional(CONF_SLEEP_ENTITY): cv.entity_id,
|
||||
vol.Optional(CONF_SLEEP_STATE): vol.All(cv.ensure_list, [cv.string]),
|
||||
vol.Optional(CONF_SLEEP_CT, default=DEFAULT_SLEEP_CT): vol.All(
|
||||
vol.Coerce(int), vol.Range(min=1000, max=10000)
|
||||
),
|
||||
vol.Optional(CONF_SLEEP_BRIGHT, default=DEFAULT_SLEEP_BRIGHT): vol.All(
|
||||
vol.Coerce(int), vol.Range(min=1, max=100)
|
||||
),
|
||||
vol.Optional(CONF_DISABLE_ENTITY): cv.entity_id,
|
||||
vol.Optional(CONF_DISABLE_STATE): vol.All(cv.ensure_list, [cv.string]),
|
||||
vol.Optional(
|
||||
CONF_INITIAL_TRANSITION, default=DEFAULT_INITIAL_TRANSITION
|
||||
): VALID_TRANSITION,
|
||||
vol.Optional(CONF_ONLY_ONCE, default=False): cv.boolean,
|
||||
}
|
||||
|
|
@ -18,7 +18,7 @@ from homeassistant.components.light import (
|
|||
ATTR_XY_COLOR,
|
||||
)
|
||||
from homeassistant.components.light import DOMAIN as LIGHT_DOMAIN
|
||||
from homeassistant.components.light import is_on
|
||||
from homeassistant.components.light import VALID_TRANSITION, is_on
|
||||
from homeassistant.components.switch import SwitchEntity
|
||||
from homeassistant.const import (
|
||||
ATTR_ENTITY_ID,
|
||||
|
|
@ -39,21 +39,6 @@ from homeassistant.util.color import (
|
|||
)
|
||||
|
||||
from . import CIRCADIAN_LIGHTING_UPDATE_TOPIC, DOMAIN
|
||||
from .const import (
|
||||
_PROFILE_SCHEMA,
|
||||
CONF_DISABLE_BRIGHTNESS_ADJUST,
|
||||
CONF_DISABLE_ENTITY,
|
||||
CONF_DISABLE_STATE,
|
||||
CONF_INITIAL_TRANSITION,
|
||||
CONF_MAX_BRIGHT,
|
||||
CONF_MIN_BRIGHT,
|
||||
CONF_ONLY_ONCE,
|
||||
CONF_PROFILE,
|
||||
CONF_SLEEP_BRIGHT,
|
||||
CONF_SLEEP_CT,
|
||||
CONF_SLEEP_ENTITY,
|
||||
CONF_SLEEP_STATE,
|
||||
)
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
|
@ -63,6 +48,18 @@ CONF_LIGHTS_CT = "lights_ct"
|
|||
CONF_LIGHTS_RGB = "lights_rgb"
|
||||
CONF_LIGHTS_XY = "lights_xy"
|
||||
CONF_LIGHTS_BRIGHT = "lights_brightness"
|
||||
CONF_DISABLE_BRIGHTNESS_ADJUST = "disable_brightness_adjust"
|
||||
CONF_MIN_BRIGHT, DEFAULT_MIN_BRIGHT = "min_brightness", 1
|
||||
CONF_MAX_BRIGHT, DEFAULT_MAX_BRIGHT = "max_brightness", 100
|
||||
CONF_SLEEP_ENTITY = "sleep_entity"
|
||||
CONF_SLEEP_STATE = "sleep_state"
|
||||
CONF_SLEEP_CT, DEFAULT_SLEEP_CT = "sleep_colortemp", 1000
|
||||
CONF_SLEEP_BRIGHT, DEFAULT_SLEEP_BRIGHT = "sleep_brightness", 1
|
||||
CONF_DISABLE_ENTITY = "disable_entity"
|
||||
CONF_DISABLE_STATE = "disable_state"
|
||||
CONF_INITIAL_TRANSITION, DEFAULT_INITIAL_TRANSITION = "initial_transition", 1
|
||||
CONF_ONLY_ONCE = "only_once"
|
||||
CONF_PROFILE = "profile"
|
||||
|
||||
PLATFORM_SCHEMA = vol.Schema(
|
||||
{
|
||||
|
|
@ -72,8 +69,28 @@ PLATFORM_SCHEMA = vol.Schema(
|
|||
vol.Optional(CONF_LIGHTS_RGB): cv.entity_ids,
|
||||
vol.Optional(CONF_LIGHTS_XY): cv.entity_ids,
|
||||
vol.Optional(CONF_LIGHTS_BRIGHT): cv.entity_ids,
|
||||
vol.Optional(CONF_DISABLE_BRIGHTNESS_ADJUST, default=False): cv.boolean,
|
||||
vol.Optional(CONF_MIN_BRIGHT, default=DEFAULT_MIN_BRIGHT): vol.All(
|
||||
vol.Coerce(int), vol.Range(min=1, max=100)
|
||||
),
|
||||
vol.Optional(CONF_MAX_BRIGHT, default=DEFAULT_MAX_BRIGHT): vol.All(
|
||||
vol.Coerce(int), vol.Range(min=1, max=100)
|
||||
),
|
||||
vol.Optional(CONF_SLEEP_ENTITY): cv.entity_id,
|
||||
vol.Optional(CONF_SLEEP_STATE): vol.All(cv.ensure_list, [cv.string]),
|
||||
vol.Optional(CONF_SLEEP_CT, default=DEFAULT_SLEEP_CT): vol.All(
|
||||
vol.Coerce(int), vol.Range(min=1000, max=10000)
|
||||
),
|
||||
vol.Optional(CONF_SLEEP_BRIGHT, default=DEFAULT_SLEEP_BRIGHT): vol.All(
|
||||
vol.Coerce(int), vol.Range(min=1, max=100)
|
||||
),
|
||||
vol.Optional(CONF_DISABLE_ENTITY): cv.entity_id,
|
||||
vol.Optional(CONF_DISABLE_STATE): vol.All(cv.ensure_list, [cv.string]),
|
||||
vol.Optional(
|
||||
CONF_INITIAL_TRANSITION, default=DEFAULT_INITIAL_TRANSITION
|
||||
): VALID_TRANSITION,
|
||||
vol.Optional(CONF_ONLY_ONCE, default=False): cv.boolean,
|
||||
vol.Optional(CONF_PROFILE): cv.string,
|
||||
**_PROFILE_SCHEMA,
|
||||
}
|
||||
)
|
||||
|
||||
|
|
@ -82,7 +99,14 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
|||
"""Set up the Circadian Lighting switches."""
|
||||
circadian_lighting = hass.data.get(DOMAIN)
|
||||
if circadian_lighting is not None:
|
||||
switch_settings = dict(
|
||||
switch = CircadianSwitch(
|
||||
hass,
|
||||
circadian_lighting,
|
||||
name=config.get(CONF_NAME),
|
||||
lights_ct=config.get(CONF_LIGHTS_CT, []),
|
||||
lights_rgb=config.get(CONF_LIGHTS_RGB, []),
|
||||
lights_xy=config.get(CONF_LIGHTS_XY, []),
|
||||
lights_brightness=config.get(CONF_LIGHTS_BRIGHT, []),
|
||||
disable_brightness_adjust=config.get(CONF_DISABLE_BRIGHTNESS_ADJUST),
|
||||
min_brightness=config.get(CONF_MIN_BRIGHT),
|
||||
max_brightness=config.get(CONF_MAX_BRIGHT),
|
||||
|
|
@ -94,19 +118,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
|||
disable_state=config.get(CONF_DISABLE_STATE),
|
||||
initial_transition=config.get(CONF_INITIAL_TRANSITION),
|
||||
only_once=config.get(CONF_ONLY_ONCE),
|
||||
)
|
||||
profile = config.get(CONF_PROFILE)
|
||||
profile_settings = circadian_lighting._profiles.get(profile, {})
|
||||
settings = dict(switch_settings, **profile_settings)
|
||||
switch = CircadianSwitch(
|
||||
hass,
|
||||
circadian_lighting,
|
||||
name=config.get(CONF_NAME),
|
||||
lights_ct=config.get(CONF_LIGHTS_CT, []),
|
||||
lights_rgb=config.get(CONF_LIGHTS_RGB, []),
|
||||
lights_xy=config.get(CONF_LIGHTS_XY, []),
|
||||
lights_brightness=config.get(CONF_LIGHTS_BRIGHT, []),
|
||||
**settings,
|
||||
profile=config.get(CONF_PROFILE),
|
||||
)
|
||||
add_devices([switch])
|
||||
|
||||
|
|
@ -171,6 +183,7 @@ class CircadianSwitch(SwitchEntity, RestoreEntity):
|
|||
disable_state,
|
||||
initial_transition,
|
||||
only_once,
|
||||
profile,
|
||||
):
|
||||
"""Initialize the Circadian Lighting switch."""
|
||||
self.hass = hass
|
||||
|
|
@ -192,12 +205,22 @@ class CircadianSwitch(SwitchEntity, RestoreEntity):
|
|||
self._disable_state = disable_state
|
||||
self._initial_transition = initial_transition
|
||||
self._only_once = only_once
|
||||
self._profile = profile
|
||||
self._lights_types = dict(zip(lights_ct, repeat("ct")))
|
||||
self._lights_types.update(zip(lights_rgb, repeat("rgb")))
|
||||
self._lights_types.update(zip(lights_xy, repeat("xy")))
|
||||
self._lights_types.update(zip(lights_brightness, repeat("brightness")))
|
||||
self._lights = list(self._lights_types.keys())
|
||||
|
||||
def from_profile(key):
|
||||
default = getattr(self._circadian_lighting, key)
|
||||
if self._profile is None:
|
||||
return default
|
||||
value = self._circadian_lighting._profiles.get(self._profile, {}).get(key)
|
||||
if value is not None:
|
||||
return value
|
||||
return default
|
||||
|
||||
@property
|
||||
def entity_id(self):
|
||||
"""Return the entity ID of the switch."""
|
||||
|
|
@ -278,7 +301,7 @@ class CircadianSwitch(SwitchEntity, RestoreEntity):
|
|||
|
||||
def _color_temperature(self):
|
||||
return (
|
||||
self._circadian_lighting._colortemp
|
||||
self.from_profile("_colortemp")
|
||||
if not self._is_sleep()
|
||||
else self._sleep_colortemp
|
||||
)
|
||||
|
|
@ -336,7 +359,7 @@ class CircadianSwitch(SwitchEntity, RestoreEntity):
|
|||
return
|
||||
|
||||
if transition is None:
|
||||
transition = self._circadian_lighting._transition
|
||||
transition = self.from_profile("_transition")
|
||||
|
||||
tasks = []
|
||||
for light in lights:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue