From c509bd81c04d03fa1385df1e9adcc746b4dc2f63 Mon Sep 17 00:00:00 2001 From: MangoScango Date: Fri, 24 Dec 2021 11:44:34 -0500 Subject: [PATCH 1/2] add adapt_delay config Option to set a delay between when a lightstate off -> on event is detected, and lights are adapted. Trying to adapt lights that are still going through their initial turning on fade in transition can cause flickering, so setting this to a number higher than the transition time avoids the problem. --- custom_components/adaptive_lighting/const.py | 2 ++ custom_components/adaptive_lighting/switch.py | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/custom_components/adaptive_lighting/const.py b/custom_components/adaptive_lighting/const.py index b182ed82..03cf9ca3 100644 --- a/custom_components/adaptive_lighting/const.py +++ b/custom_components/adaptive_lighting/const.py @@ -52,6 +52,7 @@ CONF_MANUAL_CONTROL = "manual_control" SERVICE_APPLY = "apply" CONF_TURN_ON_LIGHTS = "turn_on_lights" +CONF_ADAPT_DELAY, DEFAULT_ADAPT_DELAY = "adapt_delay", 0 TURNING_OFF_DELAY = 5 @@ -81,6 +82,7 @@ VALIDATION_TUPLES = [ (CONF_TAKE_OVER_CONTROL, DEFAULT_TAKE_OVER_CONTROL, bool), (CONF_DETECT_NON_HA_CHANGES, DEFAULT_DETECT_NON_HA_CHANGES, bool), (CONF_SEPARATE_TURN_ON_COMMANDS, DEFAULT_SEPARATE_TURN_ON_COMMANDS, bool), + (CONF_ADAPT_DELAY, DEFAULT_ADAPT_DELAY, int_between(0, 100)), ] diff --git a/custom_components/adaptive_lighting/switch.py b/custom_components/adaptive_lighting/switch.py index 7e023134..2dffd1f6 100755 --- a/custom_components/adaptive_lighting/switch.py +++ b/custom_components/adaptive_lighting/switch.py @@ -128,6 +128,7 @@ from .const import ( SUN_EVENT_MIDNIGHT, SUN_EVENT_NOON, TURNING_OFF_DELAY, + CONF_ADAPT_DELAY, VALIDATION_TUPLES, replace_none_str, ) @@ -572,6 +573,7 @@ class AdaptiveSwitch(SwitchEntity, RestoreEntity): self._separate_turn_on_commands = data[CONF_SEPARATE_TURN_ON_COMMANDS] self._take_over_control = data[CONF_TAKE_OVER_CONTROL] self._transition = data[CONF_TRANSITION] + self._adapt_delay = data[CONF_ADAPT_DELAY] _loc = get_astral_location(self.hass) if isinstance(_loc, tuple): # Astral v2.2 @@ -966,6 +968,21 @@ class AdaptiveSwitch(SwitchEntity, RestoreEntity): "%s: Cancelling adjusting lights for %s", self._name, entity_id ) return + + if self._adapt_delay > 0: + _LOGGER.debug( + "%s: sleep started for '%s' with context.id='%s'", + self._name, + entity_id, + event.context.id, + ) + await asyncio.sleep(self._adapt_delay) + _LOGGER.debug( + "%s: sleep ended for '%s' with context.id='%s'", + self._name, + entity_id, + event.context.id, + ) await self._update_attrs_and_maybe_adapt_lights( lights=[entity_id], From d56852a197f2da9f9115aca98a6fb66fdb689884 Mon Sep 17 00:00:00 2001 From: MangoScango Date: Fri, 24 Dec 2021 12:46:02 -0500 Subject: [PATCH 2/2] Update Strings --- custom_components/adaptive_lighting/const.py | 2 +- custom_components/adaptive_lighting/strings.json | 3 ++- custom_components/adaptive_lighting/translations/en.json | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/custom_components/adaptive_lighting/const.py b/custom_components/adaptive_lighting/const.py index 03cf9ca3..e7dfb1de 100644 --- a/custom_components/adaptive_lighting/const.py +++ b/custom_components/adaptive_lighting/const.py @@ -82,7 +82,7 @@ VALIDATION_TUPLES = [ (CONF_TAKE_OVER_CONTROL, DEFAULT_TAKE_OVER_CONTROL, bool), (CONF_DETECT_NON_HA_CHANGES, DEFAULT_DETECT_NON_HA_CHANGES, bool), (CONF_SEPARATE_TURN_ON_COMMANDS, DEFAULT_SEPARATE_TURN_ON_COMMANDS, bool), - (CONF_ADAPT_DELAY, DEFAULT_ADAPT_DELAY, int_between(0, 100)), + (CONF_ADAPT_DELAY, DEFAULT_ADAPT_DELAY, int_between(0, 10000)), ] diff --git a/custom_components/adaptive_lighting/strings.json b/custom_components/adaptive_lighting/strings.json index 72fdcb3b..9bae4d3e 100644 --- a/custom_components/adaptive_lighting/strings.json +++ b/custom_components/adaptive_lighting/strings.json @@ -39,7 +39,8 @@ "sunset_time": "sunset_time, in 'HH:MM:SS' format (if 'None', it uses the actual sunset time at your location)", "take_over_control": "take_over_control, if anything but Adaptive Lighting calls 'light.turn_on' when a light is already on, stop adapting that light until it (or the switch) toggles off -> on.", "detect_non_ha_changes": "detect_non_ha_changes, detects all >5% changes made to the lights (also outside of HA), requires 'take_over_control' to be enabled (calls 'homeassistant.update_entity' every 'interval'!)", - "transition": "transition, in seconds" + "transition": "transition, in seconds", + "adapt_delay": "Wait time between light turn on, and Adaptive Lights applying changes to the light state. May avoid flickering." } } }, diff --git a/custom_components/adaptive_lighting/translations/en.json b/custom_components/adaptive_lighting/translations/en.json index cc32a722..ecc6eff8 100644 --- a/custom_components/adaptive_lighting/translations/en.json +++ b/custom_components/adaptive_lighting/translations/en.json @@ -39,7 +39,8 @@ "sunset_time": "sunset_time: Manual override of the sunset time, if 'None', it uses the actual sunrise time at your location (HH:MM:SS)", "take_over_control": "take_over_control: If anything but Adaptive Lighting calls 'light.turn_on' when a light is already on, stop adapting that light until it (or the switch) toggles off -> on.", "detect_non_ha_changes": "detect_non_ha_changes: detects all >10% changes made to the lights (also outside of HA), requires 'take_over_control' to be enabled (calls 'homeassistant.update_entity' every 'interval'!)", - "transition": "Transition time when applying a change to the lights (seconds)" + "transition": "Transition time when applying a change to the lights (seconds)", + "adapt_delay": "Wait time between light turn on, and Adaptive Lights applying changes to the light state. May avoid flickering." } } },