adaptive-lighting/custom_components/adaptive_lighting/const.py

126 lines
4.8 KiB
Python
Raw Normal View History

"""Constants for the Adaptive Lighting Component in Home-Assistant."""
2020-09-23 18:20:25 +02:00
import voluptuous as vol
2020-09-24 20:41:24 +02:00
import homeassistant.helpers.config_validation as cv
2020-09-23 18:20:25 +02:00
from homeassistant.components.light import VALID_TRANSITION
2020-09-23 12:35:57 +02:00
2020-09-12 23:25:36 +02:00
ICON = "mdi:theme-light-dark"
DOMAIN = "adaptive_lighting"
SUN_EVENT_NOON = "solar_noon"
SUN_EVENT_MIDNIGHT = "solar_midnight"
2020-09-19 11:10:54 +02:00
CONF_NAME, DEFAULT_NAME = "name", "default"
2020-09-15 23:33:19 +02:00
CONF_LIGHTS, DEFAULT_LIGHTS = "lights", []
CONF_DISABLE_BRIGHTNESS_ADJUST, DEFAULT_DISABLE_BRIGHTNESS_ADJUST = (
"disable_brightness_adjust",
False,
)
2020-09-12 23:25:36 +02:00
CONF_DISABLE_ENTITY = "disable_entity"
CONF_DISABLE_STATE = "disable_state"
CONF_INITIAL_TRANSITION, DEFAULT_INITIAL_TRANSITION = "initial_transition", 1
CONF_INTERVAL, DEFAULT_INTERVAL = "interval", 90
2020-09-12 23:25:36 +02:00
CONF_MAX_BRIGHTNESS, DEFAULT_MAX_BRIGHTNESS = "max_brightness", 100
2020-09-15 23:33:19 +02:00
CONF_MAX_COLOR_TEMP, DEFAULT_MAX_COLOR_TEMP = "max_color_temp", 5500
2020-09-12 23:25:36 +02:00
CONF_MIN_BRIGHTNESS, DEFAULT_MIN_BRIGHTNESS = "min_brightness", 1
2020-09-15 23:33:19 +02:00
CONF_MIN_COLOR_TEMP, DEFAULT_MIN_COLOR_TEMP = "min_color_temp", 2500
CONF_ONLY_ONCE, DEFAULT_ONLY_ONCE = "only_once", False
2020-09-12 23:25:36 +02:00
CONF_SLEEP_BRIGHTNESS, DEFAULT_SLEEP_BRIGHTNESS = "sleep_brightness", 1
2020-09-15 23:33:19 +02:00
CONF_SLEEP_COLOR_TEMP, DEFAULT_SLEEP_COLOR_TEMP = "sleep_color_temp", 1000
2020-09-12 23:25:36 +02:00
CONF_SLEEP_ENTITY = "sleep_entity"
CONF_SLEEP_STATE = "sleep_state"
CONF_SUNRISE_OFFSET, DEFAULT_SUNRISE_OFFSET = "sunrise_offset", 0
2020-09-12 23:25:36 +02:00
CONF_SUNRISE_TIME = "sunrise_time"
CONF_SUNSET_OFFSET, DEFAULT_SUNSET_OFFSET = "sunset_offset", 0
2020-09-12 23:25:36 +02:00
CONF_SUNSET_TIME = "sunset_time"
CONF_TRANSITION, DEFAULT_TRANSITION = "transition", 60
UNDO_UPDATE_LISTENER = "undo_update_listener"
2020-09-24 23:54:14 +02:00
NONE_STR = "None" # TODO: use `from homeassistant.const import ENTITY_MATCH_NONE`?
2020-09-23 12:35:57 +02:00
2020-09-25 16:45:10 +02:00
SERVICE_APPLY = "apply"
CONF_COLORS_ONLY = "colors_only"
CONF_ON_LIGHTS_ONLY = "on_lights_only"
2020-09-23 18:20:25 +02:00
def int_between(a, b):
"""Return an integer between 'a' and 'b'."""
2020-09-23 18:20:25 +02:00
return vol.All(vol.Coerce(int), vol.Range(min=a, max=b))
VALIDATION_TUPLES = [
(CONF_LIGHTS, DEFAULT_LIGHTS, cv.entity_ids),
(CONF_DISABLE_BRIGHTNESS_ADJUST, DEFAULT_DISABLE_BRIGHTNESS_ADJUST, bool),
2020-09-24 23:54:14 +02:00
(CONF_DISABLE_ENTITY, NONE_STR, str),
(CONF_DISABLE_STATE, NONE_STR, str),
2020-09-23 18:20:25 +02:00
(CONF_INITIAL_TRANSITION, DEFAULT_INITIAL_TRANSITION, VALID_TRANSITION),
(CONF_INTERVAL, DEFAULT_INTERVAL, cv.positive_int),
(CONF_MAX_BRIGHTNESS, DEFAULT_MAX_BRIGHTNESS, int_between(1, 100)),
(CONF_MAX_COLOR_TEMP, DEFAULT_MAX_COLOR_TEMP, int_between(1000, 10000)),
(CONF_MIN_BRIGHTNESS, DEFAULT_MIN_BRIGHTNESS, int_between(1, 100)),
(CONF_MIN_COLOR_TEMP, DEFAULT_MIN_COLOR_TEMP, int_between(1000, 10000)),
(CONF_ONLY_ONCE, DEFAULT_ONLY_ONCE, bool),
(CONF_SLEEP_BRIGHTNESS, DEFAULT_SLEEP_BRIGHTNESS, int_between(1, 100)),
(CONF_SLEEP_COLOR_TEMP, DEFAULT_SLEEP_COLOR_TEMP, int_between(1000, 10000)),
2020-09-24 23:54:14 +02:00
(CONF_SLEEP_ENTITY, NONE_STR, str),
(CONF_SLEEP_STATE, NONE_STR, str),
2020-09-23 18:20:25 +02:00
(CONF_SUNRISE_OFFSET, DEFAULT_SUNRISE_OFFSET, int),
2020-09-24 23:54:14 +02:00
(CONF_SUNRISE_TIME, NONE_STR, str),
2020-09-23 18:20:25 +02:00
(CONF_SUNSET_OFFSET, DEFAULT_SUNSET_OFFSET, int),
2020-09-24 23:54:14 +02:00
(CONF_SUNSET_TIME, NONE_STR, str),
2020-09-23 18:20:25 +02:00
(CONF_TRANSITION, DEFAULT_TRANSITION, VALID_TRANSITION),
2020-09-23 12:35:57 +02:00
]
2020-09-23 18:20:25 +02:00
2020-09-24 20:41:24 +02:00
def timedelta_as_int(value):
"""Convert a `datetime.timedelta` object to an integer.
This integer can be serialized to json but a timedelta cannot.
"""
2020-09-24 20:41:24 +02:00
return value.total_seconds()
def join_strings(lst):
"""Join a list to comma-separated values string."""
2020-09-24 20:41:24 +02:00
return ",".join(lst)
2020-09-24 23:42:21 +02:00
# conf_option: (validator, coerce) tuples
# these validators cannot be serialized but can be serialized when coerced by coerce.
2020-09-24 20:41:24 +02:00
EXTRA_VALIDATION = {
CONF_DISABLE_ENTITY: (cv.entity_id, str),
CONF_DISABLE_STATE: (vol.All(cv.ensure_list_csv, [cv.string]), join_strings),
CONF_INTERVAL: (cv.time_period, timedelta_as_int),
CONF_SLEEP_ENTITY: (cv.entity_id, str),
CONF_SLEEP_STATE: (vol.All(cv.ensure_list_csv, [cv.string]), join_strings),
CONF_SUNRISE_OFFSET: (cv.time_period, timedelta_as_int),
CONF_SUNRISE_TIME: (cv.time, str),
CONF_SUNSET_OFFSET: (cv.time_period, timedelta_as_int),
CONF_SUNSET_TIME: (cv.time, str),
2020-09-23 18:20:25 +02:00
}
2020-09-25 10:33:49 +02:00
def maybe_coerce(key, validation):
"""Coerce the validation into a json serializable type."""
2020-09-24 23:42:21 +02:00
validation, coerce = EXTRA_VALIDATION.get(key, (validation, None))
if coerce is not None:
return vol.All(validation, vol.Coerce(coerce))
return validation
2020-09-24 20:41:24 +02:00
2020-09-23 18:20:25 +02:00
def replace_none_str(value, replace_with=None):
"""Replace "None" -> replace_with."""
2020-09-25 10:49:58 +02:00
return value if value != NONE_STR else replace_with
2020-09-23 18:20:25 +02:00
2020-09-24 23:42:21 +02:00
2020-09-26 13:05:27 +02:00
_yaml_validation_tuples = [
2020-09-25 10:33:49 +02:00
(key, default, maybe_coerce(key, validation))
2020-09-24 23:42:21 +02:00
for key, default, validation in VALIDATION_TUPLES
] + [(CONF_NAME, DEFAULT_NAME, cv.string)]
_DOMAIN_SCHEMA = vol.Schema(
{
vol.Optional(key, default=replace_none_str(default, vol.UNDEFINED)): validation
2020-09-26 13:05:27 +02:00
for key, default, validation in _yaml_validation_tuples
2020-09-23 18:20:25 +02:00
}
2020-09-24 23:42:21 +02:00
)