unify configs

This commit is contained in:
Bas Nijholt 2020-09-15 23:33:19 +02:00
commit 48c16ff637
6 changed files with 96 additions and 188 deletions

View file

@ -63,7 +63,7 @@ These graphs were generated using the values calculated by the Circadian Lightin
![cl_percent|690x131](https://community-home-assistant-assets.s3.dualstack.us-west-2.amazonaws.com/original/3X/6/5/657ff98beb65a94598edeb4bdfd939095db1a22c.PNG)
##### Color Temperature:
![cl_colortemp|690x129](https://community-home-assistant-assets.s3.dualstack.us-west-2.amazonaws.com/original/3X/5/9/59e84263cbecd8e428cb08777a0413672c48dfcd.PNG)
![cl_color_temp|690x129](https://community-home-assistant-assets.s3.dualstack.us-west-2.amazonaws.com/original/3X/5/9/59e84263cbecd8e428cb08777a0413672c48dfcd.PNG)
##### Brightness:
![cl_brightness|690x130](https://community-home-assistant-assets.s3.dualstack.us-west-2.amazonaws.com/original/3X/5/8/58ebd994b62a8b1abfb3497a5288d923ff4e2330.PNG)

View file

@ -15,12 +15,12 @@ from .const import (
CONF_INTERVAL,
CONF_LIGHTS,
CONF_MAX_BRIGHTNESS,
CONF_MAX_CT,
CONF_MAX_COLOR_TEMP,
CONF_MIN_BRIGHTNESS,
CONF_MIN_CT,
CONF_MIN_COLOR_TEMP,
CONF_ONLY_ONCE,
CONF_SLEEP_BRIGHTNESS,
CONF_SLEEP_CT,
CONF_SLEEP_COLOR_TEMP,
CONF_SLEEP_ENTITY,
CONF_SLEEP_STATE,
CONF_SUNRISE_OFFSET,
@ -28,14 +28,19 @@ from .const import (
CONF_SUNSET_OFFSET,
CONF_SUNSET_TIME,
CONF_TRANSITION,
DEFAULT_DISABLE_BRIGHTNESS_ADJUST,
DEFAULT_INITIAL_TRANSITION,
DEFAULT_INTERVAL,
DEFAULT_LIGHTS,
DEFAULT_MAX_BRIGHTNESS,
DEFAULT_MAX_CT,
DEFAULT_MAX_COLOR_TEMP,
DEFAULT_MIN_BRIGHTNESS,
DEFAULT_MIN_CT,
DEFAULT_MIN_COLOR_TEMP,
DEFAULT_ONLY_ONCE,
DEFAULT_SLEEP_BRIGHTNESS,
DEFAULT_SLEEP_CT,
DEFAULT_SLEEP_COLOR_TEMP,
DEFAULT_SUNRISE_OFFSET,
DEFAULT_SUNSET_OFFSET,
DEFAULT_TRANSITION,
DOMAIN,
)
@ -57,11 +62,7 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
self._abort_if_unique_id_configured()
return self.async_create_entry(title=user_input["name"], data=user_input)
return self.async_show_form(
step_id="user",
data_schema=vol.Schema({vol.Required("name"): str}),
errors=errors,
)
return self.async_show_form(step_id="user", data_schema=vol.Schema({vol.Required("name"): str}), errors=errors,)
@staticmethod
@callback
@ -84,26 +85,24 @@ class OptionsFlowHandler(config_entries.OptionsFlow):
options = self.config_entry.options
lights = options.get(CONF_LIGHTS, [])
disable_brightness_adjust = options.get(CONF_DISABLE_BRIGHTNESS_ADJUST, False)
lights = options.get(CONF_LIGHTS, DEFAULT_LIGHTS)
disable_brightness_adjust = options.get(CONF_DISABLE_BRIGHTNESS_ADJUST, DEFAULT_DISABLE_BRIGHTNESS_ADJUST)
disable_entity = options.get(CONF_DISABLE_ENTITY)
disable_state = options.get(CONF_DISABLE_STATE)
initial_transition = options.get(
CONF_INITIAL_TRANSITION, DEFAULT_INITIAL_TRANSITION
)
initial_transition = options.get(CONF_INITIAL_TRANSITION, DEFAULT_INITIAL_TRANSITION)
interval = options.get(CONF_INTERVAL, DEFAULT_INTERVAL)
max_brightness = options.get(CONF_MAX_BRIGHTNESS, DEFAULT_MAX_BRIGHTNESS)
max_colortemp = options.get(CONF_MAX_CT, DEFAULT_MAX_CT)
max_color_temp = options.get(CONF_MAX_COLOR_TEMP, DEFAULT_MAX_COLOR_TEMP)
min_brightness = options.get(CONF_MIN_BRIGHTNESS, DEFAULT_MIN_BRIGHTNESS)
min_colortemp = options.get(CONF_MIN_CT, DEFAULT_MIN_CT)
only_once = options.get(CONF_ONLY_ONCE, False)
min_color_temp = options.get(CONF_MIN_COLOR_TEMP, DEFAULT_MIN_COLOR_TEMP)
only_once = options.get(CONF_ONLY_ONCE, DEFAULT_ONLY_ONCE)
sleep_brightness = options.get(CONF_SLEEP_BRIGHTNESS, DEFAULT_SLEEP_BRIGHTNESS)
sleep_colortemp = options.get(CONF_SLEEP_CT, DEFAULT_SLEEP_CT)
sleep_color_temp = options.get(CONF_SLEEP_COLOR_TEMP, DEFAULT_SLEEP_COLOR_TEMP)
sleep_entity = options.get(CONF_SLEEP_ENTITY)
sleep_state = options.get(CONF_SLEEP_STATE)
sunrise_offset = options.get(CONF_SUNRISE_OFFSET, 0)
sunrise_offset = options.get(CONF_SUNRISE_OFFSET, DEFAULT_SUNRISE_OFFSET)
sunrise_time = options.get(CONF_SUNRISE_TIME)
sunset_offset = options.get(CONF_SUNSET_OFFSET, 0)
sunset_offset = options.get(CONF_SUNSET_OFFSET, DEFAULT_SUNSET_OFFSET)
sunset_time = options.get(CONF_SUNSET_TIME)
transition = options.get(CONF_TRANSITION, DEFAULT_TRANSITION)
@ -113,34 +112,18 @@ class OptionsFlowHandler(config_entries.OptionsFlow):
options_schema = vol.Schema(
{
vol.Optional(CONF_LIGHTS, default=lights): all_lights,
vol.Optional(
CONF_DISABLE_BRIGHTNESS_ADJUST, default=disable_brightness_adjust
): bool,
vol.Optional(CONF_DISABLE_BRIGHTNESS_ADJUST, default=disable_brightness_adjust): bool,
vol.Optional(CONF_DISABLE_ENTITY, default=disable_entity): str,
vol.Optional(CONF_DISABLE_STATE, default=disable_state): str,
vol.Optional(
CONF_INITIAL_TRANSITION, default=initial_transition
): cv.positive_int,
vol.Optional(CONF_INITIAL_TRANSITION, default=initial_transition): cv.positive_int,
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)
),
vol.Optional(CONF_MAX_CT, default=max_colortemp): vol.All(
vol.Coerce(int), vol.Range(min=1000, max=10000)
),
vol.Optional(CONF_MIN_BRIGHTNESS, default=min_brightness): vol.All(
vol.Coerce(int), vol.Range(min=1, max=100)
),
vol.Optional(CONF_MIN_CT, default=min_colortemp): vol.All(
vol.Coerce(int), vol.Range(min=1000, max=10000)
),
vol.Optional(CONF_MAX_BRIGHTNESS, default=max_brightness): vol.All(vol.Coerce(int), vol.Range(min=1, max=100)),
vol.Optional(CONF_MAX_COLOR_TEMP, default=max_color_temp): vol.All(vol.Coerce(int), vol.Range(min=1000, max=10000)),
vol.Optional(CONF_MIN_BRIGHTNESS, default=min_brightness): vol.All(vol.Coerce(int), vol.Range(min=1, max=100)),
vol.Optional(CONF_MIN_COLOR_TEMP, default=min_color_temp): vol.All(vol.Coerce(int), vol.Range(min=1000, max=10000)),
vol.Optional(CONF_ONLY_ONCE, default=only_once): bool,
vol.Optional(CONF_SLEEP_BRIGHTNESS, default=sleep_brightness): vol.All(
vol.Coerce(int), vol.Range(min=1, max=100)
),
vol.Optional(CONF_SLEEP_CT, default=sleep_colortemp): vol.All(
vol.Coerce(int), vol.Range(min=1000, max=10000)
),
vol.Optional(CONF_SLEEP_BRIGHTNESS, default=sleep_brightness): vol.All(vol.Coerce(int), vol.Range(min=1, max=100)),
vol.Optional(CONF_SLEEP_COLOR_TEMP, default=sleep_color_temp): vol.All(vol.Coerce(int), vol.Range(min=1000, max=10000)),
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,

View file

@ -4,23 +4,26 @@ DOMAIN = "adaptive_lighting"
SUN_EVENT_NOON = "solar_noon"
SUN_EVENT_MIDNIGHT = "solar_midnight"
CONF_LIGHTS = "lights"
CONF_DISABLE_BRIGHTNESS_ADJUST = "disable_brightness_adjust"
CONF_LIGHTS, DEFAULT_LIGHTS = "lights", []
CONF_DISABLE_BRIGHTNESS_ADJUST, DEFAULT_DISABLE_BRIGHTNESS_ADJUST = (
"disable_brightness_adjust",
False,
)
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
CONF_MAX_BRIGHTNESS, DEFAULT_MAX_BRIGHTNESS = "max_brightness", 100
CONF_MAX_CT, DEFAULT_MAX_CT = "max_colortemp", 5500
CONF_MAX_COLOR_TEMP, DEFAULT_MAX_COLOR_TEMP = "max_color_temp", 5500
CONF_MIN_BRIGHTNESS, DEFAULT_MIN_BRIGHTNESS = "min_brightness", 1
CONF_MIN_CT, DEFAULT_MIN_CT = "min_colortemp", 2500
CONF_ONLY_ONCE = "only_once"
CONF_MIN_COLOR_TEMP, DEFAULT_MIN_COLOR_TEMP = "min_color_temp", 2500
CONF_ONLY_ONCE, DEFAULT_ONLY_ONCE = "only_once", False
CONF_SLEEP_BRIGHTNESS, DEFAULT_SLEEP_BRIGHTNESS = "sleep_brightness", 1
CONF_SLEEP_CT, DEFAULT_SLEEP_CT = "sleep_colortemp", 1000
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 = "sunrise_offset"
CONF_SUNRISE_OFFSET, DEFAULT_SUNRISE_OFFSET = "sunrise_offset", 0
CONF_SUNRISE_TIME = "sunrise_time"
CONF_SUNSET_OFFSET = "sunset_offset"
CONF_SUNSET_OFFSET, DEFAULT_SUNSET_OFFSET = "sunset_offset", 0
CONF_SUNSET_TIME = "sunset_time"
CONF_TRANSITION, DEFAULT_TRANSITION = "transition", 60

View file

@ -30,12 +30,12 @@
"initial_transition": "`initial_transition`, the transition of the lights when turning them on or when `disable_state` or `sleep_state` change",
"interval": "`interval`",
"max_brightness": "`max_brightness`",
"max_colortemp": "`max_colortemp`",
"max_color_temp": "`max_color_temp`",
"min_brightness": "`min_brightness`",
"min_colortemp": "`min_colortemp`",
"min_color_temp": "`min_color_temp`",
"only_once": "`only_once`",
"sleep_brightness": "`sleep_brightness`",
"sleep_colortemp": "`sleep_colortemp`",
"sleep_color_temp": "`sleep_color_temp`",
"sleep_entity": "`sleep_entity`",
"sleep_state": "`sleep_state`",
"sunrise_offset": "`sunrise_offset`",

View file

@ -82,12 +82,12 @@ from .const import (
CONF_INTERVAL,
CONF_LIGHTS,
CONF_MAX_BRIGHTNESS,
CONF_MAX_CT,
CONF_MAX_COLOR_TEMP,
CONF_MIN_BRIGHTNESS,
CONF_MIN_CT,
CONF_MIN_COLOR_TEMP,
CONF_ONLY_ONCE,
CONF_SLEEP_BRIGHTNESS,
CONF_SLEEP_CT,
CONF_SLEEP_COLOR_TEMP,
CONF_SLEEP_ENTITY,
CONF_SLEEP_STATE,
CONF_SUNRISE_OFFSET,
@ -95,14 +95,19 @@ from .const import (
CONF_SUNSET_OFFSET,
CONF_SUNSET_TIME,
CONF_TRANSITION,
DEFAULT_DISABLE_BRIGHTNESS_ADJUST,
DEFAULT_INITIAL_TRANSITION,
DEFAULT_INTERVAL,
DEFAULT_LIGHTS,
DEFAULT_MAX_BRIGHTNESS,
DEFAULT_MAX_CT,
DEFAULT_MAX_COLOR_TEMP,
DEFAULT_MIN_BRIGHTNESS,
DEFAULT_MIN_CT,
DEFAULT_MIN_COLOR_TEMP,
DEFAULT_ONLY_ONCE,
DEFAULT_SLEEP_BRIGHTNESS,
DEFAULT_SLEEP_CT,
DEFAULT_SLEEP_COLOR_TEMP,
DEFAULT_SUNRISE_OFFSET,
DEFAULT_SUNSET_OFFSET,
DEFAULT_TRANSITION,
DOMAIN,
ICON,
@ -126,38 +131,24 @@ PLATFORM_SCHEMA = vol.Schema(
{
vol.Required(CONF_PLATFORM): DOMAIN,
vol.Optional(CONF_NAME, default="Adaptive Lighting"): cv.string,
vol.Optional(CONF_LIGHTS): cv.entity_ids,
vol.Optional(CONF_DISABLE_BRIGHTNESS_ADJUST, default=False): cv.boolean,
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_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_CT, default=DEFAULT_MAX_CT): 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_CT, default=DEFAULT_MIN_CT): vol.All(
vol.Coerce(int), vol.Range(min=1000, max=10000)
),
vol.Optional(CONF_ONLY_ONCE, default=False): 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_CT, default=DEFAULT_SLEEP_CT): vol.All(
vol.Coerce(int), vol.Range(min=1000, max=10000)
),
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=0): cv.time_period,
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=0): cv.time_period,
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,
}
@ -169,19 +160,19 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
switch = AdaptiveSwitch(
hass,
name=config[CONF_NAME],
lights=config.get(CONF_LIGHTS, []),
lights=config[CONF_LIGHTS],
disable_brightness_adjust=config[CONF_DISABLE_BRIGHTNESS_ADJUST],
disable_entity=config.get(CONF_DISABLE_ENTITY),
disable_state=config.get(CONF_DISABLE_STATE),
initial_transition=config[CONF_INITIAL_TRANSITION],
interval=config[CONF_INTERVAL],
max_brightness=config[CONF_MAX_BRIGHTNESS],
max_color_temp=config[CONF_MAX_CT],
max_color_temp=config[CONF_MAX_COLOR_TEMP],
min_brightness=config[CONF_MIN_BRIGHTNESS],
min_color_temp=config[CONF_MIN_CT],
min_color_temp=config[CONF_MIN_COLOR_TEMP],
only_once=config[CONF_ONLY_ONCE],
sleep_brightness=config[CONF_SLEEP_BRIGHTNESS],
sleep_color_temp=config[CONF_SLEEP_CT],
sleep_color_temp=config[CONF_SLEEP_COLOR_TEMP],
sleep_entity=config.get(CONF_SLEEP_ENTITY),
sleep_state=config.get(CONF_SLEEP_STATE),
sunrise_offset=config[CONF_SUNRISE_OFFSET],
@ -202,28 +193,13 @@ def _difference_between_states(from_state, to_state):
if to_state is None:
return start + f"from_state: {from_state}, to_state: None"
changed_attrs = ", ".join(
[
f"{key}: {val}"
for key, val in to_state.attributes.items()
if from_state.attributes.get(key) != val
]
)
changed_attrs = ", ".join([f"{key}: {val}" for key, val in to_state.attributes.items() if from_state.attributes.get(key) != val])
if from_state.state == to_state.state:
return start + (
f"{from_state.entity_id} is still {to_state.state} but"
f" these attributes changes: {changed_attrs}."
)
return start + (f"{from_state.entity_id} is still {to_state.state} but" f" these attributes changes: {changed_attrs}.")
elif changed_attrs != "":
return start + (
f"{from_state.entity_id} changed from {from_state.state} to"
f" {to_state.state} and these attributes changes: {changed_attrs}."
)
return start + (f"{from_state.entity_id} changed from {from_state.state} to" f" {to_state.state} and these attributes changes: {changed_attrs}.")
else:
return start + (
f"{from_state.entity_id} changed from {from_state.state} to"
f" {to_state.state} and no attributes changed."
)
return start + (f"{from_state.entity_id} changed from {from_state.state} to" f" {to_state.state} and no attributes changed.")
class AdaptiveSwitch(SwitchEntity, RestoreEntity):
@ -312,9 +288,7 @@ class AdaptiveSwitch(SwitchEntity, RestoreEntity):
def _supported_features(self, light):
state = self.hass.states.get(light)
supported_features = state.attributes["supported_features"]
return {
key for key, value in _SUPPORT_OPTS.items() if supported_features & value
}
return {key for key, value in _SUPPORT_OPTS.items() if supported_features & value}
def _unpack_light_groups(self, lights):
all_lights = []
@ -336,11 +310,7 @@ class AdaptiveSwitch(SwitchEntity, RestoreEntity):
"""Call when entity about to be added to hass."""
if self._lights:
async_track_state_change(
self.hass,
self._unpack_light_groups(self._lights),
self._light_state_changed,
to_state="on",
from_state="off",
self.hass, self._unpack_light_groups(self._lights), self._light_state_changed, to_state="on", from_state="off",
)
track_kwargs = dict(hass=self.hass, action=self._state_changed)
if self._sleep_entity is not None:
@ -350,9 +320,7 @@ class AdaptiveSwitch(SwitchEntity, RestoreEntity):
if self._disable_entity is not None:
disable_kwargs = dict(track_kwargs, entity_ids=self._disable_entity)
async_track_state_change(
**disable_kwargs, from_state=self._disable_state
)
async_track_state_change(**disable_kwargs, from_state=self._disable_state)
async_track_state_change(**disable_kwargs, to_state=self._disable_state)
last_state = await self.async_get_last_state()
@ -383,9 +351,7 @@ class AdaptiveSwitch(SwitchEntity, RestoreEntity):
async def async_turn_on(self, **kwargs):
"""Turn on adaptive lighting."""
await self._update_lights(transition=self._initial_transition, force=True)
self.unsub_tracker = async_track_time_interval(
self.hass, self._async_update_at_interval, self._interval
)
self.unsub_tracker = async_track_time_interval(self.hass, self._async_update_at_interval, self._interval)
async def async_turn_off(self, **kwargs):
"""Turn off adaptive lighting."""
@ -399,9 +365,7 @@ class AdaptiveSwitch(SwitchEntity, RestoreEntity):
self._percent = self._calc_percent()
self._brightness = self._calc_brightness()
self._color_temp_kelvin = self._calc_color_temp_kelvin()
self._color_temp_mired = color_temperature_kelvin_to_mired(
self._color_temp_kelvin
)
self._color_temp_mired = color_temperature_kelvin_to_mired(self._color_temp_kelvin)
self._rgb_color = color_temperature_to_rgb(self._color_temp_kelvin)
self._xy_color = color_RGB_to_xy(*self._rgb_color)
self._hs_color = color_xy_to_hs(*self._xy_color)
@ -420,24 +384,11 @@ class AdaptiveSwitch(SwitchEntity, RestoreEntity):
def _get_sun_events(self, date):
def _replace_time(date, key):
other_date = getattr(self, f"_{key}_time")
return date.replace(
hour=other_date.hour,
minute=other_date.minute,
second=other_date.second,
microsecond=other_date.microsecond,
)
return date.replace(hour=other_date.hour, minute=other_date.minute, second=other_date.second, microsecond=other_date.microsecond,)
location = get_astral_location(self.hass)
sunrise = (
location.sunrise(date, local=False)
if self._sunrise_time is None
else _replace_time(date, "sunrise")
) + self._sunrise_offset
sunset = (
location.sunset(date, local=False)
if self._sunset_time is None
else _replace_time(date, "sunset")
) + self._sunset_offset
sunrise = (location.sunrise(date, local=False) if self._sunrise_time is None else _replace_time(date, "sunrise")) + self._sunrise_offset
sunset = (location.sunset(date, local=False) if self._sunset_time is None else _replace_time(date, "sunset")) + self._sunset_offset
if self._sunrise_time is None and self._sunset_time is None:
solar_noon = location.solar_noon(date, local=False)
@ -462,10 +413,7 @@ class AdaptiveSwitch(SwitchEntity, RestoreEntity):
# It's before sunrise (after midnight), because it's before
# sunrise (and after midnight) sunset must have happend yesterday.
yesterday = self._get_sun_events(now - timedelta(days=1))
if (
today[SUN_EVENT_MIDNIGHT] > today[SUN_EVENT_SUNSET]
and yesterday[SUN_EVENT_MIDNIGHT] > yesterday[SUN_EVENT_SUNSET]
):
if today[SUN_EVENT_MIDNIGHT] > today[SUN_EVENT_SUNSET] and yesterday[SUN_EVENT_MIDNIGHT] > yesterday[SUN_EVENT_SUNSET]:
# Solar midnight is after sunset so use yesterdays's time
today[SUN_EVENT_MIDNIGHT] = yesterday[SUN_EVENT_MIDNIGHT]
today[SUN_EVENT_SUNSET] = yesterday[SUN_EVENT_SUNSET]
@ -473,10 +421,7 @@ class AdaptiveSwitch(SwitchEntity, RestoreEntity):
# It's after sunset (before midnight), because it's after sunset
# (and before midnight) sunrise should happen tomorrow.
tomorrow = self._get_sun_events(now + timedelta(days=1))
if (
today[SUN_EVENT_MIDNIGHT] < today[SUN_EVENT_SUNRISE]
and tomorrow[SUN_EVENT_MIDNIGHT] < tomorrow[SUN_EVENT_SUNRISE]
):
if today[SUN_EVENT_MIDNIGHT] < today[SUN_EVENT_SUNRISE] and tomorrow[SUN_EVENT_MIDNIGHT] < tomorrow[SUN_EVENT_SUNRISE]:
# Solar midnight is before sunrise so use tomorrow's time
today[SUN_EVENT_MIDNIGHT] = tomorrow[SUN_EVENT_MIDNIGHT]
today[SUN_EVENT_SUNRISE] = tomorrow[SUN_EVENT_SUNRISE]
@ -492,22 +437,14 @@ class AdaptiveSwitch(SwitchEntity, RestoreEntity):
h = today[SUN_EVENT_NOON]
k = 1
# parabola before solar_noon else after solar_noon
x = (
today[SUN_EVENT_SUNRISE]
if now_ts < today[SUN_EVENT_NOON]
else today[SUN_EVENT_SUNSET]
)
x = today[SUN_EVENT_SUNRISE] if now_ts < today[SUN_EVENT_NOON] else today[SUN_EVENT_SUNSET]
# sunset -> sunrise parabola
elif today[SUN_EVENT_SUNSET] < now_ts < today[SUN_EVENT_SUNRISE]:
h = today[SUN_EVENT_MIDNIGHT]
k = -1
# parabola before solar_midnight else after solar_midnight
x = (
today[SUN_EVENT_SUNSET]
if now_ts < today[SUN_EVENT_MIDNIGHT]
else today[SUN_EVENT_SUNRISE]
)
x = today[SUN_EVENT_SUNSET] if now_ts < today[SUN_EVENT_MIDNIGHT] else today[SUN_EVENT_SUNRISE]
y = 0
a = (y - k) / (h - x) ** 2
@ -515,10 +452,7 @@ class AdaptiveSwitch(SwitchEntity, RestoreEntity):
return percentage
def _is_sleep(self):
return (
self._sleep_entity is not None
and self.hass.states.get(self._sleep_entity).state in self._sleep_state
)
return self._sleep_entity is not None and self.hass.states.get(self._sleep_entity).state in self._sleep_state
def _calc_color_temp_kelvin(self):
if self._is_sleep():
@ -540,10 +474,7 @@ class AdaptiveSwitch(SwitchEntity, RestoreEntity):
return (delta_brightness * percent) + self._min_brightness
def _is_disabled(self):
return (
self._disable_entity is not None
and self.hass.states.get(self._disable_entity).state in self._disable_state
)
return self._disable_entity is not None and self.hass.states.get(self._disable_entity).state in self._disable_state
async def _adjust_light(self, light, transition):
service_data = {ATTR_ENTITY_ID: light}
@ -563,12 +494,9 @@ class AdaptiveSwitch(SwitchEntity, RestoreEntity):
service_data[ATTR_COLOR_TEMP] = self._color_temp_mired
_LOGGER.debug(
"Scheduling 'light.turn_on' with the following 'service_data': %s",
service_data,
)
return self.hass.services.async_call(
LIGHT_DOMAIN, SERVICE_TURN_ON, service_data
"Scheduling 'light.turn_on' with the following 'service_data': %s", service_data,
)
return self.hass.services.async_call(LIGHT_DOMAIN, SERVICE_TURN_ON, service_data)
def _should_adjust(self):
if not self._lights or not self.is_on or self._is_disabled():
@ -578,20 +506,14 @@ class AdaptiveSwitch(SwitchEntity, RestoreEntity):
async def _adjust_lights(self, lights, transition):
if not self._should_adjust():
return
tasks = [
await self._adjust_light(light, transition)
for light in lights
if is_on(self.hass, light)
]
tasks = [await self._adjust_light(light, transition) for light in lights if is_on(self.hass, light)]
if tasks:
await asyncio.wait(tasks)
async def _light_state_changed(self, entity_id, from_state, to_state):
assert to_state.state == "on" and from_state.state == "off"
_LOGGER.debug(_difference_between_states(from_state, to_state))
await self._update_lights(
lights=[entity_id], transition=self._initial_transition, force=True
)
await self._update_lights(lights=[entity_id], transition=self._initial_transition, force=True)
async def _state_changed(self, entity_id, from_state, to_state):
_LOGGER.debug(_difference_between_states(from_state, to_state))

View file

@ -30,12 +30,12 @@
"initial_transition": "`initial_transition`, the transition of the lights when turning them on or when `disable_state` or `sleep_state` change",
"interval": "`interval`",
"max_brightness": "`max_brightness`",
"max_colortemp": "`max_colortemp`",
"max_color_temp": "`max_color_temp`",
"min_brightness": "`min_brightness`",
"min_colortemp": "`min_colortemp`",
"min_color_temp": "`min_color_temp`",
"only_once": "`only_once`",
"sleep_brightness": "`sleep_brightness`",
"sleep_colortemp": "`sleep_colortemp`",
"sleep_color_temp": "`sleep_color_temp`",
"sleep_entity": "`sleep_entity`",
"sleep_state": "`sleep_state`",
"sunrise_offset": "`sunrise_offset`",