From 5a4da9512a9ae8849785bde1e00e118e3e63c1f3 Mon Sep 17 00:00:00 2001 From: Bas Nijholt Date: Wed, 23 Sep 2020 12:35:57 +0200 Subject: [PATCH] use VALIDATION in switch.py --- .../adaptive_lighting/__init__.py | 46 ++++++++++++++++++- .../adaptive_lighting/config_flow.py | 17 ++----- custom_components/adaptive_lighting/const.py | 16 +++++++ custom_components/adaptive_lighting/switch.py | 14 ++---- 4 files changed, 69 insertions(+), 24 deletions(-) diff --git a/custom_components/adaptive_lighting/__init__.py b/custom_components/adaptive_lighting/__init__.py index 9b003798..3c83bab2 100755 --- a/custom_components/adaptive_lighting/__init__.py +++ b/custom_components/adaptive_lighting/__init__.py @@ -28,7 +28,7 @@ Technical notes: I had to make a lot of assumptions when writing this app """ import asyncio import logging - +import voluptuous as vol from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry from .const import DOMAIN, UNDO_UPDATE_LISTENER @@ -37,6 +37,50 @@ _LOGGER = logging.getLogger(__name__) PLATFORMS = ["switch"] +# _SCHEMA = { +# vol.Optional(CONF_LIGHTS, default=DEFAULT_LIGHTS): cv.entity_ids, +# vol.Optional( +# CONF_DISABLE_BRIGHTNESS_ADJUST, +# default=DEFAULT_DISABLE_BRIGHTNESS_ADJUST, +# ): cv.boolean, +# 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_INTERVAL, default=DEFAULT_INTERVAL): cv.time_period, +# vol.Optional(CONF_MAX_BRIGHTNESS, default=DEFAULT_MAX_BRIGHTNESS): vol.All( +# vol.Coerce(int), vol.Range(min=1, max=100) +# ), +# vol.Optional(CONF_MAX_COLOR_TEMP, default=DEFAULT_MAX_COLOR_TEMP): vol.All( +# vol.Coerce(int), vol.Range(min=1000, max=10000) +# ), +# vol.Optional(CONF_MIN_BRIGHTNESS, default=DEFAULT_MIN_BRIGHTNESS): vol.All( +# vol.Coerce(int), vol.Range(min=1, max=100) +# ), +# vol.Optional(CONF_MIN_COLOR_TEMP, default=DEFAULT_MIN_COLOR_TEMP): vol.All( +# vol.Coerce(int), vol.Range(min=1000, max=10000) +# ), +# vol.Optional(CONF_ONLY_ONCE, default=DEFAULT_ONLY_ONCE): cv.boolean, +# vol.Optional(CONF_SLEEP_BRIGHTNESS, default=DEFAULT_SLEEP_BRIGHTNESS): vol.All( +# vol.Coerce(int), vol.Range(min=1, max=100) +# ), +# vol.Optional(CONF_SLEEP_COLOR_TEMP, default=DEFAULT_SLEEP_COLOR_TEMP): vol.All( +# vol.Coerce(int), vol.Range(min=1000, max=10000) +# ), +# vol.Optional(CONF_SLEEP_ENTITY): cv.entity_id, +# vol.Optional(CONF_SLEEP_STATE): vol.All(cv.ensure_list, [cv.string]), +# vol.Optional(CONF_SUNRISE_OFFSET, default=DEFAULT_SUNRISE_OFFSET): cv.time_period, +# vol.Optional(CONF_SUNRISE_TIME): cv.time, +# vol.Optional(CONF_SUNSET_OFFSET, default=DEFAULT_SUNSET_OFFSET): cv.time_period, +# vol.Optional(CONF_SUNSET_TIME): cv.time, +# vol.Optional(CONF_TRANSITION, default=DEFAULT_TRANSITION): VALID_TRANSITION, +# } +# CONFIG_SCHEMA = vol.Schema( +# {DOMAIN: vol.All(vol.Schema(_SCHEMA))}, +# extra=vol.ALLOW_EXTRA, +# ) + async def async_setup(hass, config): """Import integration from config.""" diff --git a/custom_components/adaptive_lighting/config_flow.py b/custom_components/adaptive_lighting/config_flow.py index f505022f..3136b697 100644 --- a/custom_components/adaptive_lighting/config_flow.py +++ b/custom_components/adaptive_lighting/config_flow.py @@ -45,6 +45,7 @@ from .const import ( DEFAULT_TRANSITION, DOMAIN, FAKE_NONE, + VALIDATION, ) _LOGGER = logging.getLogger(__name__) @@ -88,17 +89,7 @@ class OptionsFlowHandler(config_entries.OptionsFlow): """Handle options flow.""" errors = {} if user_input is not None: - for key, validate in [ - (CONF_SUNRISE_TIME, cv.time), - (CONF_SUNSET_TIME, cv.time), - (CONF_SUNRISE_OFFSET, cv.time_period), - (CONF_SUNSET_OFFSET, cv.time_period), - (CONF_INTERVAL, cv.time_period), - (CONF_DISABLE_ENTITY, cv.entity_id), - (CONF_SLEEP_ENTITY, cv.entity_id), - (CONF_DISABLE_STATE, vol.All(cv.ensure_list_csv, [cv.string])), - (CONF_SLEEP_STATE, vol.All(cv.ensure_list_csv, [cv.string])), - ]: + for key, validate in VALIDATION: try: value = user_input.get(key) if value == FAKE_NONE: @@ -106,7 +97,9 @@ class OptionsFlowHandler(config_entries.OptionsFlow): if value is not None: validate(user_input[key]) except vol.Invalid: - _LOGGER.exception("Configuration option %s=%s is incorrect", key, value) + _LOGGER.exception( + "Configuration option %s=%s is incorrect", key, value + ) errors["base"] = "option_error" if not errors: return self.async_create_entry(title="", data=user_input) diff --git a/custom_components/adaptive_lighting/const.py b/custom_components/adaptive_lighting/const.py index 9d0185d7..c07a9af6 100644 --- a/custom_components/adaptive_lighting/const.py +++ b/custom_components/adaptive_lighting/const.py @@ -1,3 +1,7 @@ +import voluptuous as vol + +import homeassistant.helpers.config_validation as cv + ICON = "mdi:theme-light-dark" DOMAIN = "adaptive_lighting" @@ -31,3 +35,15 @@ CONF_TRANSITION, DEFAULT_TRANSITION = "transition", 60 UNDO_UPDATE_LISTENER = "undo_update_listener" FAKE_NONE = "None" + +VALIDATION = [ # these validators cannot be serialized + (CONF_SUNRISE_TIME, cv.time), + (CONF_SUNSET_TIME, cv.time), + (CONF_SUNRISE_OFFSET, cv.time_period), + (CONF_SUNSET_OFFSET, cv.time_period), + (CONF_INTERVAL, cv.time_period), + (CONF_DISABLE_ENTITY, cv.entity_id), + (CONF_SLEEP_ENTITY, cv.entity_id), + (CONF_DISABLE_STATE, vol.All(cv.ensure_list_csv, [cv.string])), + (CONF_SLEEP_STATE, vol.All(cv.ensure_list_csv, [cv.string])), +] diff --git a/custom_components/adaptive_lighting/switch.py b/custom_components/adaptive_lighting/switch.py index ea6b0081..378880d9 100755 --- a/custom_components/adaptive_lighting/switch.py +++ b/custom_components/adaptive_lighting/switch.py @@ -87,6 +87,7 @@ from .const import ( ICON, SUN_EVENT_MIDNIGHT, SUN_EVENT_NOON, + VALIDATION, ) _SUPPORT_OPTS = { @@ -159,17 +160,8 @@ class AdaptiveSwitch(SwitchEntity, RestoreEntity): self._sunset_time = opts.get(CONF_SUNSET_TIME) self._transition = opts.get(CONF_TRANSITION, DEFAULT_TRANSITION) - for name, validate in [ - ("_sunrise_time", cv.time), - ("_sunset_time", cv.time), - ("_sunrise_offset", cv.time_period), - ("_sunset_offset", cv.time_period), - ("_interval", cv.time_period), - ("_disable_entity", cv.entity_id), - ("_sleep_entity", cv.entity_id), - ("_disable_state", vol.All(cv.ensure_list_csv, [cv.string])), - ("_sleep_state", vol.All(cv.ensure_list_csv, [cv.string])), - ]: + for name, validate in VALIDATION: + name = f"_{name}" attr = getattr(self, name) if attr is not None and attr != FAKE_NONE: setattr(self, name, validate(attr))