From f8c1a50107032dc619e5d5075c2da61ceabf5ecc Mon Sep 17 00:00:00 2001 From: Bas Nijholt Date: Sun, 20 Sep 2020 20:21:17 +0200 Subject: [PATCH] convert strings to timedeltas and datetimes --- .../adaptive_lighting/config_flow.py | 18 ++---- custom_components/adaptive_lighting/const.py | 57 ++++--------------- custom_components/adaptive_lighting/switch.py | 26 ++++----- 3 files changed, 27 insertions(+), 74 deletions(-) diff --git a/custom_components/adaptive_lighting/config_flow.py b/custom_components/adaptive_lighting/config_flow.py index ea7f0171..e22f7d5d 100644 --- a/custom_components/adaptive_lighting/config_flow.py +++ b/custom_components/adaptive_lighting/config_flow.py @@ -128,8 +128,8 @@ class OptionsFlowHandler(config_entries.OptionsFlow): # vol.Optional(CONF_DISABLE_STATE, default=disable_state): str, vol.Optional( CONF_INITIAL_TRANSITION, default=initial_transition - ): cv.positive_int, - # vol.Optional(CONF_INTERVAL, default=interval): cv.positive_int, + ): VALID_TRANSITION, + vol.Optional(CONF_INTERVAL, default=interval): cv.positive_int, vol.Optional(CONF_MAX_BRIGHTNESS, default=max_brightness): vol.All( vol.Coerce(int), vol.Range(min=1, max=100) ), @@ -151,16 +151,10 @@ class OptionsFlowHandler(config_entries.OptionsFlow): ), # vol.Optional(CONF_SLEEP_ENTITY, default=sleep_entity): str, # vol.Optional(CONF_SLEEP_STATE, default=sleep_state): str, - # vol.Optional(CONF_SUNRISE_OFFSET, default=sunrise_offset): int, - vol.Optional( - CONF_SUNRISE_TIME - # , default=sunrise_time - ): cv.positive_time_period_dict, - # vol.Optional(CONF_SUNSET_OFFSET, default=sunset_offset): int, - vol.Optional( - CONF_SUNSET_TIME - # , default=sunset_time - ): cv.positive_time_period_dict, + vol.Optional(CONF_SUNRISE_OFFSET, default=sunrise_offset): int, + vol.Optional(CONF_SUNRISE_TIME, default=sunrise_time): str, + vol.Optional(CONF_SUNSET_OFFSET, default=sunset_offset): int, + vol.Optional(CONF_SUNSET_TIME, default=sunset_time): str, vol.Optional(CONF_TRANSITION, default=transition): VALID_TRANSITION, } ) diff --git a/custom_components/adaptive_lighting/const.py b/custom_components/adaptive_lighting/const.py index 205b689d..bf83bced 100644 --- a/custom_components/adaptive_lighting/const.py +++ b/custom_components/adaptive_lighting/const.py @@ -1,6 +1,5 @@ import voluptuous as vol -from datetime import timedelta import homeassistant.helpers.config_validation as cv from homeassistant.components.light import VALID_TRANSITION @@ -19,7 +18,7 @@ CONF_DISABLE_BRIGHTNESS_ADJUST, DEFAULT_DISABLE_BRIGHTNESS_ADJUST = ( CONF_DISABLE_ENTITY = "disable_entity" CONF_DISABLE_STATE = "disable_state" CONF_INITIAL_TRANSITION, DEFAULT_INITIAL_TRANSITION = "initial_transition", 1 -CONF_INTERVAL, DEFAULT_INTERVAL = "interval", timedelta(seconds=90) +CONF_INTERVAL, DEFAULT_INTERVAL = "interval", 90 CONF_MAX_BRIGHTNESS, DEFAULT_MAX_BRIGHTNESS = "max_brightness", 100 CONF_MAX_COLOR_TEMP, DEFAULT_MAX_COLOR_TEMP = "max_color_temp", 5500 CONF_MIN_BRIGHTNESS, DEFAULT_MIN_BRIGHTNESS = "min_brightness", 1 @@ -29,54 +28,18 @@ CONF_SLEEP_BRIGHTNESS, DEFAULT_SLEEP_BRIGHTNESS = "sleep_brightness", 1 CONF_SLEEP_COLOR_TEMP, DEFAULT_SLEEP_COLOR_TEMP = "sleep_color_temp", 1000 CONF_SLEEP_ENTITY = "sleep_entity" CONF_SLEEP_STATE = "sleep_state" -CONF_SUNRISE_OFFSET, DEFAULT_SUNRISE_OFFSET = "sunrise_offset", timedelta(seconds=0) +CONF_SUNRISE_OFFSET, DEFAULT_SUNRISE_OFFSET = "sunrise_offset", 0 CONF_SUNRISE_TIME = "sunrise_time" -CONF_SUNSET_OFFSET, DEFAULT_SUNSET_OFFSET = "sunset_offset", timedelta(seconds=0) +CONF_SUNSET_OFFSET, DEFAULT_SUNSET_OFFSET = "sunset_offset", 0 CONF_SUNSET_TIME = "sunset_time" CONF_TRANSITION, DEFAULT_TRANSITION = "transition", 60 UNDO_UPDATE_LISTENER = "undo_update_listener" -_COMMON_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, -} - - -def _convert_to_options_schema(hass, options): - schema = {} - for key, value in _COMMON_SCHEMA.items(): - if key.schema == CONF_LIGHTS: - all_lights = hass.states.async_entity_ids("light") - to_type = cv.multi_select(all_lights) - elif value == cv.boolean: - to_type = bool - elif (isinstance(value, vol.All) and hasattr(value.validators, "type") and value.validators[0].type == int) or value == VALID_TRANSITION: - to_type = value - elif value == cv.time_period: - to_type = cv.time_period_dict - else: - to_type = str - - default = key.default() if not isinstance(key.default, vol.Undefined) else vol.UNDEFINED - default = options.get(key.schema, default) - schema[vol.Optional(key.schema, default=default)] = to_type - return vol.Schema(schema) +# _COMMON_SCHEMA = { +# vol.Optional(CONF_DISABLE_ENTITY): cv.entity_id, +# vol.Optional(CONF_DISABLE_STATE): vol.All(cv.ensure_list, [cv.string]), +# vol.Optional(CONF_INTERVAL, default=DEFAULT_INTERVAL): cv.time_period, +# vol.Optional(CONF_SLEEP_ENTITY): cv.entity_id, +# vol.Optional(CONF_SLEEP_STATE): vol.All(cv.ensure_list, [cv.string]), +# } diff --git a/custom_components/adaptive_lighting/switch.py b/custom_components/adaptive_lighting/switch.py index d1da49c8..c0ccd2b6 100755 --- a/custom_components/adaptive_lighting/switch.py +++ b/custom_components/adaptive_lighting/switch.py @@ -192,21 +192,17 @@ class AdaptiveSwitch(SwitchEntity, RestoreEntity): self._sunset_time = opts.get(CONF_SUNSET_TIME) self._transition = opts.get(CONF_TRANSITION, DEFAULT_TRANSITION) - for which in ["_sunrise_time", "_sunset_time"]: - # I use a hack to be able to use cv.positive_time_period_dict in - # the options flow, which is the only serializable time setter, - # however, I need a time, so I convert the timedelta to a datetime. - sun_time = getattr(self, which) - if sun_time is not None: - dt = cv.time( - { - "hours": sun_time.hours, - "minutes": sun_time.minutes, - "seconds": sun_time.seconds, - "milliseconds": sun_time.milliseconds, - } - ) - setattr(self, which, dt) + 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), + ]: + attr = getattr(self, name) + if attr is not None: + dt = validate(attr) + setattr(self, name, dt) # Initialize attributes that will be set in self._update_attrs self._percent = None