use VALIDATION in switch.py

This commit is contained in:
Bas Nijholt 2020-09-23 12:35:57 +02:00
commit 5a4da9512a
4 changed files with 69 additions and 24 deletions

View file

@ -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."""

View file

@ -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)

View file

@ -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])),
]

View file

@ -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))