mirror of
https://github.com/basnijholt/adaptive-lighting.git
synced 2026-09-11 22:34:04 +02:00
## Summary - Fixes regression in v1.30.0 where lights turned on by automations were incorrectly marked as "manually controlled" - Makes `adapt_only_on_bare_turn_on` respect individual attribute tracking from #1356 ## Root Cause PR #1356 added a call to `update_manually_controlled_from_event()` in the `turn_on_off_event_listener.on()` handler for ALL `light.turn_on` events, including when turning a light on from OFF state. When an automation turns on a light with brightness/color attributes, this incorrectly marked the light as "manually controlled", preventing Adaptive Lighting from adapting it. ## Fix 1. Only call `update_manually_controlled_from_event()` when the light was **already ON** before the turn_on event. Turning on from OFF is handled by `_respond_to_off_to_on_event()`. 2. Make `adapt_only_on_bare_turn_on` respect `take_over_control_mode`: - With `PAUSE_CHANGED`: Only pause adaptation of specified attributes, continue adapting unspecified ones - With `PAUSE_ALL`: Pause all adaptation (existing behavior) ## Expected Behavior After Fix | Scenario | `adapt_only_on_bare_turn_on` | `take_over_control_mode` | Result | |----------|------------------------------|--------------------------|--------| | Turn on from OFF with brightness | `false` | Either | NOT manually controlled | | Turn on from OFF with brightness | `true` | `PAUSE_ALL` | All adaptation paused | | Turn on from OFF with brightness | `true` | `PAUSE_CHANGED` | Only brightness paused, color adapts | | Turn on from OFF without attributes | Either | Either | NOT manually controlled | | Change brightness while ON | Either | Either | Brightness manually controlled | ## Test plan - [x] Turn on light via automation with brightness/color (`adapt_only_on_bare_turn_on=false`) - should adapt - [x] Turn on light via scene (`adapt_only_on_bare_turn_on=true`, `PAUSE_ALL`) - should pause all adaptation - [x] Turn on light with brightness only (`adapt_only_on_bare_turn_on=true`, `PAUSE_CHANGED`) - should adapt color - [x] Both intercept=True and intercept=False paths tested for consistency - [x] CI tests pass Fixes #1378 Co-authored-by: Mario Guggenberger <mg@protyposis.net>
281 lines
17 KiB
JSON
281 lines
17 KiB
JSON
{
|
|
"config": {
|
|
"step": {
|
|
"user": {
|
|
"title": "Choose a name for the Adaptive Lighting instance",
|
|
"description": "Every instance can contain multiple lights!",
|
|
"data": {
|
|
"name": "Name"
|
|
}
|
|
},
|
|
"menu": {
|
|
"title": "Create or Duplicate",
|
|
"description": "Do you want to create a new instance or duplicate an existing one?",
|
|
"data": {
|
|
"action": "Action"
|
|
}
|
|
}
|
|
},
|
|
"abort": {
|
|
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
|
|
}
|
|
},
|
|
"options": {
|
|
"step": {
|
|
"init": {
|
|
"title": "Adaptive Lighting options",
|
|
"description": "Configure an Adaptive Lighting component. Option names align with the YAML settings. If you've defined this entry in YAML, no options will appear here. For interactive graphs that demonstrate parameter effects, visit [this web app](https://basnijholt.github.io/adaptive-lighting). For further details, see the [official documentation](https://github.com/basnijholt/adaptive-lighting#readme).",
|
|
"data": {
|
|
"lights": "lights: List of light entity_ids to be controlled (may be empty). 🌟",
|
|
"interval": "interval",
|
|
"transition": "transition",
|
|
"initial_transition": "initial_transition",
|
|
"min_brightness": "min_brightness: Minimum brightness percentage. 💡",
|
|
"max_brightness": "max_brightness: Maximum brightness percentage. 💡",
|
|
"min_color_temp": "min_color_temp: Warmest color temperature in Kelvin. 🔥",
|
|
"max_color_temp": "max_color_temp: Coldest color temperature in Kelvin. ❄️",
|
|
"prefer_rgb_color": "prefer_rgb_color: Whether to prefer RGB color adjustment over light color temperature when possible. 🌈",
|
|
"sleep_brightness": "sleep_brightness",
|
|
"sleep_rgb_or_color_temp": "sleep_rgb_or_color_temp",
|
|
"sleep_color_temp": "sleep_color_temp",
|
|
"sleep_rgb_color": "sleep_rgb_color",
|
|
"sleep_transition": "sleep_transition",
|
|
"transition_until_sleep": "transition_until_sleep: When enabled, Adaptive Lighting will treat sleep settings as the minimum, transitioning to these values after sunset. 🌙",
|
|
"sunrise_time": "sunrise_time",
|
|
"min_sunrise_time": "min_sunrise_time",
|
|
"max_sunrise_time": "max_sunrise_time",
|
|
"sunrise_offset": "sunrise_offset",
|
|
"sunset_time": "sunset_time",
|
|
"min_sunset_time": "min_sunset_time",
|
|
"max_sunset_time": "max_sunset_time",
|
|
"sunset_offset": "sunset_offset",
|
|
"brightness_mode": "brightness_mode",
|
|
"brightness_mode_time_dark": "brightness_mode_time_dark",
|
|
"brightness_mode_time_light": "brightness_mode_time_light",
|
|
"take_over_control": "take_over_control: Pause adaptation of individual lights and hand over (manual) control to other sources that issue `light.turn_on` calls for lights that are on. 🔒",
|
|
"take_over_control_mode": "take_over_control_mode",
|
|
"detect_non_ha_changes": "detect_non_ha_changes: Detects and halts adaptations for non-`light.turn_on` state changes. Needs `take_over_control` enabled. 🕵️ Caution: ⚠️ Some lights might falsely indicate an 'on' state, which could result in lights turning on unexpectedly. Note that this calls `homeassistant.update_entity` every `interval`! Disable this feature if you encounter such issues.",
|
|
"autoreset_control_seconds": "autoreset_control_seconds",
|
|
"only_once": "only_once: Adapt lights only when they are turned on (`true`) or keep adapting them (`false`). 🔄",
|
|
"adapt_only_on_bare_turn_on": "adapt_only_on_bare_turn_on: When turning lights on initially. If set to `true`, AL adapts only if `light.turn_on` is invoked without specifying color or brightness. ❌🌈 This e.g., prevents adaptation when activating a scene and marks the light as manually controlled. If `false`, AL adapts regardless of the presence of color or brightness in the initial `service_data`. Needs `take_over_control` enabled. 🕵️",
|
|
"separate_turn_on_commands": "separate_turn_on_commands: Use separate `light.turn_on` calls for color and brightness, needed for some light types. 🔀",
|
|
"send_split_delay": "send_split_delay",
|
|
"adapt_delay": "adapt_delay",
|
|
"skip_redundant_commands": "skip_redundant_commands: Skip sending adaptation commands whose target state already equals the light's known state. Minimizes network traffic and improves the adaptation responsivity in some situations. 📉Disable if physical light states get out of sync with HA's recorded state.",
|
|
"intercept": "intercept: Intercept and adapt `light.turn_on` calls to enabling instantaneous color and brightness adaptation. 🏎️ Disable for lights that do not support `light.turn_on` with color and brightness.",
|
|
"multi_light_intercept": "multi_light_intercept: Intercept and adapt `light.turn_on` calls that target multiple lights. ➗⚠️ This might result in splitting up a single `light.turn_on` call into multiple calls, e.g., when lights are in different switches. Requires `intercept` to be enabled.",
|
|
"include_config_in_attributes": "include_config_in_attributes: Show all options as attributes on the switch in Home Assistant when set to `true`. 📝"
|
|
},
|
|
"data_description": {
|
|
"interval": "Frequency to adapt the lights, in seconds. 🔄",
|
|
"transition": "Duration of transition when lights change, in seconds. 🕑",
|
|
"initial_transition": "Duration of the first transition when lights turn from `off` to `on` in seconds. ⏲️",
|
|
"sleep_brightness": "Brightness percentage of lights in sleep mode. 😴",
|
|
"sleep_rgb_or_color_temp": "Use either `\"rgb_color\"` or `\"color_temp\"` in sleep mode. 🌙",
|
|
"sleep_color_temp": "Color temperature in sleep mode (used when `sleep_rgb_or_color_temp` is `color_temp`) in Kelvin. 😴",
|
|
"sleep_rgb_color": "RGB color in sleep mode (used when `sleep_rgb_or_color_temp` is \"rgb_color\"). 🌈",
|
|
"sleep_transition": "Duration of transition when \"sleep mode\" is toggled in seconds. 😴",
|
|
"sunrise_time": "Set a fixed time (HH:MM:SS) for sunrise. 🌅",
|
|
"min_sunrise_time": "Set the earliest virtual sunrise time (HH:MM:SS), allowing for later sunrises. 🌅",
|
|
"max_sunrise_time": "Set the latest virtual sunrise time (HH:MM:SS), allowing for earlier sunrises. 🌅",
|
|
"sunrise_offset": "Adjust sunrise time with a positive or negative offset in seconds. ⏰",
|
|
"sunset_time": "Set a fixed time (HH:MM:SS) for sunset. 🌇",
|
|
"min_sunset_time": "Set the earliest virtual sunset time (HH:MM:SS), allowing for later sunsets. 🌇",
|
|
"max_sunset_time": "Set the latest virtual sunset time (HH:MM:SS), allowing for earlier sunsets. 🌇",
|
|
"sunset_offset": "Adjust sunset time with a positive or negative offset in seconds. ⏰",
|
|
"brightness_mode": "Brightness mode to use. Possible values are `default`, `linear`, and `tanh` (uses `brightness_mode_time_dark` and `brightness_mode_time_light`). 📈",
|
|
"brightness_mode_time_dark": "(Ignored if `brightness_mode='default'`) The duration in seconds to ramp up/down the brightness before/after sunrise/sunset. 📈📉",
|
|
"brightness_mode_time_light": "(Ignored if `brightness_mode='default'`) The duration in seconds to ramp up/down the brightness after/before sunrise/sunset. 📈📉.",
|
|
"take_over_control_mode": "The adaptation pausing mode when other sources change brightness and/or color of lights. `pause_all` always pauses both brightness and color adaptation. `pause_changed` pauses the adaptation of only the changed attributes and continues adapting unchanged attributes, e.g., continues color adaptation when only brightness was changed.",
|
|
"autoreset_control_seconds": "Automatically reset the manual control after a number of seconds. Set to 0 to disable. ⏲️",
|
|
"send_split_delay": "Delay (ms) between `separate_turn_on_commands` for lights that don't support simultaneous brightness and color setting. ⏲️",
|
|
"adapt_delay": "Wait time (seconds) between light turn on and Adaptive Lighting applying changes. Might help to avoid flickering. ⏲️"
|
|
}
|
|
}
|
|
},
|
|
"error": {
|
|
"option_error": "Invalid option",
|
|
"entity_missing": "One or more selected light entities are missing from Home Assistant"
|
|
}
|
|
},
|
|
"services": {
|
|
"apply": {
|
|
"name": "apply",
|
|
"description": "Applies the current Adaptive Lighting settings to lights.",
|
|
"fields": {
|
|
"entity_id": {
|
|
"description": "The `entity_id` of the switch with the settings to apply. 📝",
|
|
"name": "entity_id"
|
|
},
|
|
"lights": {
|
|
"description": "A light (or list of lights) to apply the settings to. 💡",
|
|
"name": "lights"
|
|
},
|
|
"transition": {
|
|
"description": "Duration of transition when lights change, in seconds. 🕑",
|
|
"name": "transition"
|
|
},
|
|
"adapt_brightness": {
|
|
"description": "Whether to adapt the brightness of the light. 🌞",
|
|
"name": "adapt_brightness"
|
|
},
|
|
"adapt_color": {
|
|
"description": "Whether to adapt the color on supporting lights. 🌈",
|
|
"name": "adapt_color"
|
|
},
|
|
"prefer_rgb_color": {
|
|
"description": "Whether to prefer RGB color adjustment over light color temperature when possible. 🌈",
|
|
"name": "prefer_rgb_color"
|
|
},
|
|
"turn_on_lights": {
|
|
"description": "Whether to turn on lights that are currently off. 🔆",
|
|
"name": "turn_on_lights"
|
|
}
|
|
}
|
|
},
|
|
"set_manual_control": {
|
|
"name": "set_manual_control",
|
|
"description": "Mark whether a light is 'manually controlled'.",
|
|
"fields": {
|
|
"entity_id": {
|
|
"description": "The `entity_id` of the switch in which to (un)mark the light as being `manually controlled`. 📝",
|
|
"name": "entity_id"
|
|
},
|
|
"lights": {
|
|
"description": "entity_id(s) of lights, if not specified, all lights in the switch are selected. 💡",
|
|
"name": "lights"
|
|
},
|
|
"manual_control": {
|
|
"description": "Whether to add (\"true\") or remove (\"false\") all adapted attributes of the light from the \"manual_control\" list, or the name of an attribute for selective addition. 🔒",
|
|
"name": "manual_control"
|
|
}
|
|
}
|
|
},
|
|
"change_switch_settings": {
|
|
"name": "change_switch_settings",
|
|
"description": "Change any settings you'd like in the switch. All options here are the same as in the config flow.",
|
|
"fields": {
|
|
"entity_id": {
|
|
"description": "Entity ID of the switch. 📝",
|
|
"name": "entity_id"
|
|
},
|
|
"use_defaults": {
|
|
"description": "Sets the default values not specified in this service call. Options: \"current\" (default, retains current values), \"factory\" (resets to documented defaults), or \"configuration\" (reverts to switch config defaults). ⚙️",
|
|
"name": "use_defaults"
|
|
},
|
|
"include_config_in_attributes": {
|
|
"description": "Show all options as attributes on the switch in Home Assistant when set to `true`. 📝",
|
|
"name": "include_config_in_attributes"
|
|
},
|
|
"turn_on_lights": {
|
|
"description": "Whether to turn on lights that are currently off. 🔆",
|
|
"name": "turn_on_lights"
|
|
},
|
|
"initial_transition": {
|
|
"description": "Duration of the first transition when lights turn from `off` to `on` in seconds. ⏲️",
|
|
"name": "initial_transition"
|
|
},
|
|
"sleep_transition": {
|
|
"description": "Duration of transition when \"sleep mode\" is toggled in seconds. 😴",
|
|
"name": "sleep_transition"
|
|
},
|
|
"max_brightness": {
|
|
"description": "Maximum brightness percentage. 💡",
|
|
"name": "max_brightness"
|
|
},
|
|
"max_color_temp": {
|
|
"description": "Coldest color temperature in Kelvin. ❄️",
|
|
"name": "max_color_temp"
|
|
},
|
|
"min_brightness": {
|
|
"description": "Minimum brightness percentage. 💡",
|
|
"name": "min_brightness"
|
|
},
|
|
"min_color_temp": {
|
|
"description": "Warmest color temperature in Kelvin. 🔥",
|
|
"name": "min_color_temp"
|
|
},
|
|
"only_once": {
|
|
"description": "Adapt lights only when they are turned on (`true`) or keep adapting them (`false`). 🔄",
|
|
"name": "only_once"
|
|
},
|
|
"prefer_rgb_color": {
|
|
"description": "Whether to prefer RGB color adjustment over light color temperature when possible. 🌈",
|
|
"name": "prefer_rgb_color"
|
|
},
|
|
"separate_turn_on_commands": {
|
|
"description": "Use separate `light.turn_on` calls for color and brightness, needed for some light types. 🔀",
|
|
"name": "separate_turn_on_commands"
|
|
},
|
|
"send_split_delay": {
|
|
"description": "Delay (ms) between `separate_turn_on_commands` for lights that don't support simultaneous brightness and color setting. ⏲️",
|
|
"name": "send_split_delay"
|
|
},
|
|
"sleep_brightness": {
|
|
"description": "Brightness percentage of lights in sleep mode. 😴",
|
|
"name": "sleep_brightness"
|
|
},
|
|
"sleep_rgb_or_color_temp": {
|
|
"description": "Use either `\"rgb_color\"` or `\"color_temp\"` in sleep mode. 🌙",
|
|
"name": "sleep_rgb_or_color_temp"
|
|
},
|
|
"sleep_rgb_color": {
|
|
"description": "RGB color in sleep mode (used when `sleep_rgb_or_color_temp` is \"rgb_color\"). 🌈",
|
|
"name": "sleep_rgb_color"
|
|
},
|
|
"sleep_color_temp": {
|
|
"description": "Color temperature in sleep mode (used when `sleep_rgb_or_color_temp` is `color_temp`) in Kelvin. 😴",
|
|
"name": "sleep_color_temp"
|
|
},
|
|
"sunrise_offset": {
|
|
"description": "Adjust sunrise time with a positive or negative offset in seconds. ⏰",
|
|
"name": "sunrise_offset"
|
|
},
|
|
"sunrise_time": {
|
|
"description": "Set a fixed time (HH:MM:SS) for sunrise. 🌅",
|
|
"name": "sunrise_time"
|
|
},
|
|
"sunset_offset": {
|
|
"description": "Adjust sunset time with a positive or negative offset in seconds. ⏰",
|
|
"name": "sunset_offset"
|
|
},
|
|
"sunset_time": {
|
|
"description": "Set a fixed time (HH:MM:SS) for sunset. 🌇",
|
|
"name": "sunset_time"
|
|
},
|
|
"max_sunrise_time": {
|
|
"description": "Set the latest virtual sunrise time (HH:MM:SS), allowing for earlier sunrises. 🌅",
|
|
"name": "max_sunrise_time"
|
|
},
|
|
"min_sunset_time": {
|
|
"description": "Set the earliest virtual sunset time (HH:MM:SS), allowing for later sunsets. 🌇",
|
|
"name": "min_sunset_time"
|
|
},
|
|
"take_over_control": {
|
|
"description": "Pause adaptation of individual lights and hand over (manual) control to other sources that issue `light.turn_on` calls for lights that are on. 🔒",
|
|
"name": "take_over_control"
|
|
},
|
|
"take_over_control_mode": {
|
|
"description": "The adaptation pausing mode when other sources change brightness and/or color of lights. `pause_all` always pauses both brightness and color adaptation. `pause_changed` pauses the adaptation of only the changed attributes and continues adapting unchanged attributes, e.g., continues color adaptation when only brightness was changed.",
|
|
"name": "take_over_control_mode"
|
|
},
|
|
"detect_non_ha_changes": {
|
|
"description": "Detects and halts adaptations for non-`light.turn_on` state changes. Needs `take_over_control` enabled. 🕵️ Caution: ⚠️ Some lights might falsely indicate an 'on' state, which could result in lights turning on unexpectedly. Note that this calls `homeassistant.update_entity` every `interval`! Disable this feature if you encounter such issues.",
|
|
"name": "detect_non_ha_changes"
|
|
},
|
|
"transition": {
|
|
"description": "Duration of transition when lights change, in seconds. 🕑",
|
|
"name": "transition"
|
|
},
|
|
"adapt_delay": {
|
|
"description": "Wait time (seconds) between light turn on and Adaptive Lighting applying changes. Might help to avoid flickering. ⏲️",
|
|
"name": "adapt_delay"
|
|
},
|
|
"autoreset_control_seconds": {
|
|
"description": "Automatically reset the manual control after a number of seconds. Set to 0 to disable. ⏲️",
|
|
"name": "autoreset_control_seconds"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|