diff --git a/custom_components/circadian_lighting/__init__.py b/custom_components/circadian_lighting/__init__.py index 9784868c..dd650360 100755 --- a/custom_components/circadian_lighting/__init__.py +++ b/custom_components/circadian_lighting/__init__.py @@ -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)} ), } ), diff --git a/custom_components/circadian_lighting/const.py b/custom_components/circadian_lighting/const.py deleted file mode 100644 index 19253342..00000000 --- a/custom_components/circadian_lighting/const.py +++ /dev/null @@ -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, -} diff --git a/custom_components/circadian_lighting/switch.py b/custom_components/circadian_lighting/switch.py index f811763e..c1b33f9e 100755 --- a/custom_components/circadian_lighting/switch.py +++ b/custom_components/circadian_lighting/switch.py @@ -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: