2020-09-28 13:10:41 +02:00
|
|
|
"""Constants for the Adaptive Lighting integration."""
|
2022-08-31 22:15:24 -07:00
|
|
|
|
2025-11-27 21:01:05 +01:00
|
|
|
from datetime import timedelta
|
2025-12-23 07:55:16 +01:00
|
|
|
from enum import Enum
|
2025-11-27 21:01:05 +01:00
|
|
|
from typing import Any
|
|
|
|
|
|
2023-07-23 14:24:22 -07:00
|
|
|
import homeassistant.helpers.config_validation as cv
|
|
|
|
|
import voluptuous as vol
|
2020-09-23 18:20:25 +02:00
|
|
|
from homeassistant.components.light import VALID_TRANSITION
|
2023-04-03 00:58:39 -07:00
|
|
|
from homeassistant.const import CONF_ENTITY_ID
|
2022-08-31 22:01:21 -07:00
|
|
|
from homeassistant.helpers import selector
|
2020-09-23 12:35:57 +02:00
|
|
|
|
2023-03-25 22:22:05 -05:00
|
|
|
ICON_MAIN = "mdi:theme-light-dark"
|
|
|
|
|
ICON_BRIGHTNESS = "mdi:brightness-4"
|
|
|
|
|
ICON_COLOR_TEMP = "mdi:sun-thermometer"
|
|
|
|
|
ICON_SLEEP = "mdi:sleep"
|
2020-09-12 23:25:36 +02:00
|
|
|
|
|
|
|
|
DOMAIN = "adaptive_lighting"
|
|
|
|
|
|
2025-12-23 07:55:16 +01:00
|
|
|
|
|
|
|
|
class TakeOverControlMode(Enum):
|
|
|
|
|
"""Modes for pausing adaptation when control of a light is taken over externally."""
|
|
|
|
|
|
|
|
|
|
PAUSE_ALL = "pause_all"
|
|
|
|
|
PAUSE_CHANGED = "pause_changed"
|
|
|
|
|
|
|
|
|
|
|
2023-04-03 00:58:39 -07:00
|
|
|
DOCS = {CONF_ENTITY_ID: "Entity ID of the switch. 📝"}
|
2023-04-01 23:43:20 -07:00
|
|
|
|
|
|
|
|
|
2020-09-19 11:10:54 +02:00
|
|
|
CONF_NAME, DEFAULT_NAME = "name", "default"
|
2023-04-01 23:43:20 -07:00
|
|
|
DOCS[CONF_NAME] = "Display name for this switch. 📝"
|
|
|
|
|
|
2020-09-15 23:33:19 +02:00
|
|
|
CONF_LIGHTS, DEFAULT_LIGHTS = "lights", []
|
Add scripts to auto update en.json, strings.json and services.yaml (#520)
* Add scripts to auto update strings.json and services.yaml
* Run services
* simplify
* Run strings
* rerun
* revert
* allow unicode
* Add CODEOWNERS
* Update CODEOWNERS
* set CONF_USE_DEFAULTS docs
* add field_name
* Auto run scripts
* Update desc
* Update README.md, strings.json, and services.yaml
* double quotes
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Update README.md, strings.json, and services.yaml
* Add newline
* sync changes between en.json and strings.json
* Update README.md, strings.json, and services.yaml
* double quotes
* fix
* Update README.md, strings.json, and services.yaml
* Add comments
* Remove comments
* shorter
* Update README.md, strings.json, and services.yaml
* Rephrase
* Update README.md, strings.json, and services.yaml
* remove key from desc
---------
Co-authored-by: Benjamin Auquite <halomastar@gmail.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2023-04-03 14:59:14 -07:00
|
|
|
DOCS[CONF_LIGHTS] = "List of light entity_ids to be controlled (may be empty). 🌟"
|
2023-04-01 23:43:20 -07:00
|
|
|
|
2020-10-04 15:09:58 +02:00
|
|
|
CONF_DETECT_NON_HA_CHANGES, DEFAULT_DETECT_NON_HA_CHANGES = (
|
|
|
|
|
"detect_non_ha_changes",
|
|
|
|
|
False,
|
|
|
|
|
)
|
2023-04-01 23:43:20 -07:00
|
|
|
DOCS[CONF_DETECT_NON_HA_CHANGES] = (
|
2023-07-28 15:17:17 -07:00
|
|
|
"Detects and halts adaptations for non-`light.turn_on` state changes. "
|
2025-01-01 23:18:54 +01:00
|
|
|
"Needs `take_over_control` enabled. 🕵️ "
|
2023-07-28 15:17:17 -07:00
|
|
|
"Caution: ⚠️ Some lights might falsely indicate an 'on' state, which could result "
|
|
|
|
|
"in lights turning on unexpectedly. "
|
2025-12-23 07:55:16 +01:00
|
|
|
"Note that this calls `homeassistant.update_entity` every `interval`! "
|
2023-07-28 15:17:17 -07:00
|
|
|
"Disable this feature if you encounter such issues."
|
2023-04-01 23:43:20 -07:00
|
|
|
)
|
|
|
|
|
|
2023-03-25 14:43:51 -05:00
|
|
|
CONF_INCLUDE_CONFIG_IN_ATTRIBUTES, DEFAULT_INCLUDE_CONFIG_IN_ATTRIBUTES = (
|
|
|
|
|
"include_config_in_attributes",
|
|
|
|
|
False,
|
|
|
|
|
)
|
2023-04-01 23:43:20 -07:00
|
|
|
DOCS[CONF_INCLUDE_CONFIG_IN_ATTRIBUTES] = (
|
|
|
|
|
"Show all options as attributes on the switch in "
|
|
|
|
|
"Home Assistant when set to `true`. 📝"
|
|
|
|
|
)
|
|
|
|
|
|
2020-09-12 23:25:36 +02:00
|
|
|
CONF_INITIAL_TRANSITION, DEFAULT_INITIAL_TRANSITION = "initial_transition", 1
|
2023-04-01 23:43:20 -07:00
|
|
|
DOCS[CONF_INITIAL_TRANSITION] = (
|
2023-04-03 00:58:39 -07:00
|
|
|
"Duration of the first transition when lights turn "
|
|
|
|
|
"from `off` to `on` in seconds. ⏲️"
|
2023-04-01 23:43:20 -07:00
|
|
|
)
|
|
|
|
|
|
2021-09-16 14:15:36 +10:00
|
|
|
CONF_SLEEP_TRANSITION, DEFAULT_SLEEP_TRANSITION = "sleep_transition", 1
|
2024-02-05 14:13:13 -08:00
|
|
|
DOCS[CONF_SLEEP_TRANSITION] = (
|
|
|
|
|
'Duration of transition when "sleep mode" is toggled in seconds. 😴'
|
|
|
|
|
)
|
2023-04-01 23:43:20 -07:00
|
|
|
|
2020-09-20 20:21:17 +02:00
|
|
|
CONF_INTERVAL, DEFAULT_INTERVAL = "interval", 90
|
2023-04-01 23:43:20 -07:00
|
|
|
DOCS[CONF_INTERVAL] = "Frequency to adapt the lights, in seconds. 🔄"
|
|
|
|
|
|
2020-09-12 23:25:36 +02:00
|
|
|
CONF_MAX_BRIGHTNESS, DEFAULT_MAX_BRIGHTNESS = "max_brightness", 100
|
2023-04-01 23:43:20 -07:00
|
|
|
DOCS[CONF_MAX_BRIGHTNESS] = "Maximum brightness percentage. 💡"
|
|
|
|
|
|
2020-09-15 23:33:19 +02:00
|
|
|
CONF_MAX_COLOR_TEMP, DEFAULT_MAX_COLOR_TEMP = "max_color_temp", 5500
|
2023-04-01 23:43:20 -07:00
|
|
|
DOCS[CONF_MAX_COLOR_TEMP] = "Coldest color temperature in Kelvin. ❄️"
|
|
|
|
|
|
2020-09-12 23:25:36 +02:00
|
|
|
CONF_MIN_BRIGHTNESS, DEFAULT_MIN_BRIGHTNESS = "min_brightness", 1
|
2023-04-01 23:43:20 -07:00
|
|
|
DOCS[CONF_MIN_BRIGHTNESS] = "Minimum brightness percentage. 💡"
|
|
|
|
|
|
2020-10-05 14:41:21 +02:00
|
|
|
CONF_MIN_COLOR_TEMP, DEFAULT_MIN_COLOR_TEMP = "min_color_temp", 2000
|
2023-04-01 23:43:20 -07:00
|
|
|
DOCS[CONF_MIN_COLOR_TEMP] = "Warmest color temperature in Kelvin. 🔥"
|
|
|
|
|
|
2020-09-15 23:33:19 +02:00
|
|
|
CONF_ONLY_ONCE, DEFAULT_ONLY_ONCE = "only_once", False
|
2023-04-01 23:43:20 -07:00
|
|
|
DOCS[CONF_ONLY_ONCE] = (
|
|
|
|
|
"Adapt lights only when they are turned on (`true`) or keep adapting them "
|
|
|
|
|
"(`false`). 🔄"
|
|
|
|
|
)
|
|
|
|
|
|
2023-08-05 20:56:32 -07:00
|
|
|
CONF_ADAPT_ONLY_ON_BARE_TURN_ON, DEFAULT_ADAPT_ONLY_ON_BARE_TURN_ON = (
|
|
|
|
|
"adapt_only_on_bare_turn_on",
|
|
|
|
|
False,
|
|
|
|
|
)
|
|
|
|
|
DOCS[CONF_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. ❌🌈 "
|
2026-01-12 13:40:55 +01:00
|
|
|
"This e.g., prevents adaptation when activating a scene and marks the light as manually controlled. "
|
2023-08-05 20:56:32 -07:00
|
|
|
"If `false`, AL adapts regardless of the presence of color or brightness in the initial `service_data`. "
|
2025-01-01 23:18:54 +01:00
|
|
|
"Needs `take_over_control` enabled. 🕵️"
|
2023-08-05 20:56:32 -07:00
|
|
|
)
|
|
|
|
|
|
2020-09-28 20:48:09 +02:00
|
|
|
CONF_PREFER_RGB_COLOR, DEFAULT_PREFER_RGB_COLOR = "prefer_rgb_color", False
|
2023-04-03 00:58:39 -07:00
|
|
|
DOCS[CONF_PREFER_RGB_COLOR] = (
|
|
|
|
|
"Whether to prefer RGB color adjustment over "
|
|
|
|
|
"light color temperature when possible. 🌈"
|
|
|
|
|
)
|
2023-04-01 23:43:20 -07:00
|
|
|
|
2020-10-27 20:39:05 +01:00
|
|
|
CONF_SEPARATE_TURN_ON_COMMANDS, DEFAULT_SEPARATE_TURN_ON_COMMANDS = (
|
|
|
|
|
"separate_turn_on_commands",
|
|
|
|
|
False,
|
|
|
|
|
)
|
2023-04-01 23:43:20 -07:00
|
|
|
DOCS[CONF_SEPARATE_TURN_ON_COMMANDS] = (
|
|
|
|
|
"Use separate `light.turn_on` calls for color and brightness, needed for "
|
|
|
|
|
"some light types. 🔀"
|
|
|
|
|
)
|
|
|
|
|
|
2020-09-12 23:25:36 +02:00
|
|
|
CONF_SLEEP_BRIGHTNESS, DEFAULT_SLEEP_BRIGHTNESS = "sleep_brightness", 1
|
2023-04-03 00:58:39 -07:00
|
|
|
DOCS[CONF_SLEEP_BRIGHTNESS] = "Brightness percentage of lights in sleep mode. 😴"
|
2023-04-01 23:43:20 -07:00
|
|
|
|
2020-09-15 23:33:19 +02:00
|
|
|
CONF_SLEEP_COLOR_TEMP, DEFAULT_SLEEP_COLOR_TEMP = "sleep_color_temp", 1000
|
2023-04-01 23:43:20 -07:00
|
|
|
DOCS[CONF_SLEEP_COLOR_TEMP] = (
|
|
|
|
|
"Color temperature in sleep mode (used when `sleep_rgb_or_color_temp` is "
|
2023-04-03 00:58:39 -07:00
|
|
|
"`color_temp`) in Kelvin. 😴"
|
2023-04-01 23:43:20 -07:00
|
|
|
)
|
|
|
|
|
|
2022-08-31 22:01:21 -07:00
|
|
|
CONF_SLEEP_RGB_COLOR, DEFAULT_SLEEP_RGB_COLOR = "sleep_rgb_color", [255, 56, 0]
|
2024-02-05 14:13:13 -08:00
|
|
|
DOCS[CONF_SLEEP_RGB_COLOR] = (
|
|
|
|
|
'RGB color in sleep mode (used when `sleep_rgb_or_color_temp` is "rgb_color"). 🌈'
|
|
|
|
|
)
|
2023-04-01 23:43:20 -07:00
|
|
|
|
2022-08-31 22:05:31 -07:00
|
|
|
CONF_SLEEP_RGB_OR_COLOR_TEMP, DEFAULT_SLEEP_RGB_OR_COLOR_TEMP = (
|
|
|
|
|
"sleep_rgb_or_color_temp",
|
|
|
|
|
"color_temp",
|
|
|
|
|
)
|
2024-02-05 14:13:13 -08:00
|
|
|
DOCS[CONF_SLEEP_RGB_OR_COLOR_TEMP] = (
|
|
|
|
|
'Use either `"rgb_color"` or `"color_temp"` in sleep mode. 🌙'
|
|
|
|
|
)
|
2023-04-01 23:43:20 -07:00
|
|
|
|
2020-09-20 20:21:17 +02:00
|
|
|
CONF_SUNRISE_OFFSET, DEFAULT_SUNRISE_OFFSET = "sunrise_offset", 0
|
2024-02-05 14:13:13 -08:00
|
|
|
DOCS[CONF_SUNRISE_OFFSET] = (
|
|
|
|
|
"Adjust sunrise time with a positive or negative offset in seconds. ⏰"
|
|
|
|
|
)
|
2023-04-01 23:43:20 -07:00
|
|
|
|
2020-09-12 23:25:36 +02:00
|
|
|
CONF_SUNRISE_TIME = "sunrise_time"
|
2023-04-03 00:58:39 -07:00
|
|
|
DOCS[CONF_SUNRISE_TIME] = "Set a fixed time (HH:MM:SS) for sunrise. 🌅"
|
2023-04-01 23:43:20 -07:00
|
|
|
|
2023-08-05 15:08:45 -07:00
|
|
|
CONF_MIN_SUNRISE_TIME = "min_sunrise_time"
|
2024-02-05 14:13:13 -08:00
|
|
|
DOCS[CONF_MIN_SUNRISE_TIME] = (
|
|
|
|
|
"Set the earliest virtual sunrise time (HH:MM:SS), allowing for later sunrises. 🌅"
|
|
|
|
|
)
|
2023-08-05 15:08:45 -07:00
|
|
|
|
2022-11-08 17:37:57 +01:00
|
|
|
CONF_MAX_SUNRISE_TIME = "max_sunrise_time"
|
2023-04-01 23:43:20 -07:00
|
|
|
DOCS[CONF_MAX_SUNRISE_TIME] = (
|
2023-04-03 00:58:39 -07:00
|
|
|
"Set the latest virtual sunrise time (HH:MM:SS), allowing"
|
2023-08-04 14:45:12 -07:00
|
|
|
" for earlier sunrises. 🌅"
|
2023-04-01 23:43:20 -07:00
|
|
|
)
|
|
|
|
|
|
2020-09-20 20:21:17 +02:00
|
|
|
CONF_SUNSET_OFFSET, DEFAULT_SUNSET_OFFSET = "sunset_offset", 0
|
2024-02-05 14:13:13 -08:00
|
|
|
DOCS[CONF_SUNSET_OFFSET] = (
|
|
|
|
|
"Adjust sunset time with a positive or negative offset in seconds. ⏰"
|
|
|
|
|
)
|
2023-04-01 23:43:20 -07:00
|
|
|
|
2020-09-12 23:25:36 +02:00
|
|
|
CONF_SUNSET_TIME = "sunset_time"
|
2023-04-03 00:58:39 -07:00
|
|
|
DOCS[CONF_SUNSET_TIME] = "Set a fixed time (HH:MM:SS) for sunset. 🌇"
|
2023-04-01 23:43:20 -07:00
|
|
|
|
2022-11-08 17:37:57 +01:00
|
|
|
CONF_MIN_SUNSET_TIME = "min_sunset_time"
|
2024-02-05 14:13:13 -08:00
|
|
|
DOCS[CONF_MIN_SUNSET_TIME] = (
|
|
|
|
|
"Set the earliest virtual sunset time (HH:MM:SS), allowing for later sunsets. 🌇"
|
|
|
|
|
)
|
2023-04-01 23:43:20 -07:00
|
|
|
|
2023-08-05 15:08:45 -07:00
|
|
|
CONF_MAX_SUNSET_TIME = "max_sunset_time"
|
2024-02-05 14:13:13 -08:00
|
|
|
DOCS[CONF_MAX_SUNSET_TIME] = (
|
|
|
|
|
"Set the latest virtual sunset time (HH:MM:SS), allowing for earlier sunsets. 🌇"
|
|
|
|
|
)
|
2023-08-05 15:08:45 -07:00
|
|
|
|
2023-08-05 13:14:21 -07:00
|
|
|
CONF_BRIGHTNESS_MODE, DEFAULT_BRIGHTNESS_MODE = "brightness_mode", "default"
|
|
|
|
|
DOCS[CONF_BRIGHTNESS_MODE] = (
|
|
|
|
|
"Brightness mode to use. Possible values are `default`, `linear`, and `tanh` "
|
|
|
|
|
"(uses `brightness_mode_time_dark` and `brightness_mode_time_light`). 📈"
|
|
|
|
|
)
|
|
|
|
|
CONF_BRIGHTNESS_MODE_TIME_DARK, DEFAULT_BRIGHTNESS_MODE_TIME_DARK = (
|
|
|
|
|
"brightness_mode_time_dark",
|
|
|
|
|
900,
|
|
|
|
|
)
|
|
|
|
|
DOCS[CONF_BRIGHTNESS_MODE_TIME_DARK] = (
|
|
|
|
|
"(Ignored if `brightness_mode='default'`) The duration in seconds to ramp up/down "
|
|
|
|
|
"the brightness before/after sunrise/sunset. 📈📉"
|
|
|
|
|
)
|
|
|
|
|
CONF_BRIGHTNESS_MODE_TIME_LIGHT, DEFAULT_BRIGHTNESS_MODE_TIME_LIGHT = (
|
|
|
|
|
"brightness_mode_time_light",
|
|
|
|
|
3600,
|
|
|
|
|
)
|
|
|
|
|
DOCS[CONF_BRIGHTNESS_MODE_TIME_LIGHT] = (
|
|
|
|
|
"(Ignored if `brightness_mode='default'`) The duration in seconds to ramp up/down "
|
|
|
|
|
"the brightness after/before sunrise/sunset. 📈📉."
|
|
|
|
|
)
|
|
|
|
|
|
2020-10-04 15:09:58 +02:00
|
|
|
CONF_TAKE_OVER_CONTROL, DEFAULT_TAKE_OVER_CONTROL = "take_over_control", True
|
2023-04-01 23:43:20 -07:00
|
|
|
DOCS[CONF_TAKE_OVER_CONTROL] = (
|
2025-12-23 07:55:16 +01:00
|
|
|
"Pause adaptation of individual lights and hand over (manual) control to other sources that "
|
|
|
|
|
"issue `light.turn_on` calls for lights that are on. 🔒"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
CONF_TAKE_OVER_CONTROL_MODE, DEFAULT_TAKE_OVER_CONTROL_MODE = (
|
|
|
|
|
"take_over_control_mode",
|
|
|
|
|
TakeOverControlMode.PAUSE_ALL.value,
|
|
|
|
|
)
|
|
|
|
|
DOCS[CONF_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."
|
2023-04-01 23:43:20 -07:00
|
|
|
)
|
|
|
|
|
|
2020-10-05 14:41:21 +02:00
|
|
|
CONF_TRANSITION, DEFAULT_TRANSITION = "transition", 45
|
2023-04-01 23:43:20 -07:00
|
|
|
DOCS[CONF_TRANSITION] = "Duration of transition when lights change, in seconds. 🕑"
|
|
|
|
|
|
2023-04-03 08:27:07 +01:00
|
|
|
CONF_ADAPT_UNTIL_SLEEP, DEFAULT_ADAPT_UNTIL_SLEEP = (
|
|
|
|
|
"transition_until_sleep",
|
|
|
|
|
False,
|
|
|
|
|
)
|
|
|
|
|
DOCS[CONF_ADAPT_UNTIL_SLEEP] = (
|
2023-04-03 00:58:39 -07:00
|
|
|
"When enabled, Adaptive Lighting will treat sleep settings as the minimum, "
|
|
|
|
|
"transitioning to these values after sunset. 🌙"
|
2023-04-03 08:27:07 +01:00
|
|
|
)
|
|
|
|
|
|
2023-04-01 23:43:20 -07:00
|
|
|
CONF_ADAPT_DELAY, DEFAULT_ADAPT_DELAY = "adapt_delay", 0
|
|
|
|
|
DOCS[CONF_ADAPT_DELAY] = (
|
|
|
|
|
"Wait time (seconds) between light turn on and Adaptive Lighting applying "
|
Add scripts to auto update en.json, strings.json and services.yaml (#520)
* Add scripts to auto update strings.json and services.yaml
* Run services
* simplify
* Run strings
* rerun
* revert
* allow unicode
* Add CODEOWNERS
* Update CODEOWNERS
* set CONF_USE_DEFAULTS docs
* add field_name
* Auto run scripts
* Update desc
* Update README.md, strings.json, and services.yaml
* double quotes
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Update README.md, strings.json, and services.yaml
* Add newline
* sync changes between en.json and strings.json
* Update README.md, strings.json, and services.yaml
* double quotes
* fix
* Update README.md, strings.json, and services.yaml
* Add comments
* Remove comments
* shorter
* Update README.md, strings.json, and services.yaml
* Rephrase
* Update README.md, strings.json, and services.yaml
* remove key from desc
---------
Co-authored-by: Benjamin Auquite <halomastar@gmail.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2023-04-03 14:59:14 -07:00
|
|
|
"changes. Might help to avoid flickering. ⏲️"
|
2023-04-01 23:43:20 -07:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
CONF_SEND_SPLIT_DELAY, DEFAULT_SEND_SPLIT_DELAY = "send_split_delay", 0
|
|
|
|
|
DOCS[CONF_SEND_SPLIT_DELAY] = (
|
Add scripts to auto update en.json, strings.json and services.yaml (#520)
* Add scripts to auto update strings.json and services.yaml
* Run services
* simplify
* Run strings
* rerun
* revert
* allow unicode
* Add CODEOWNERS
* Update CODEOWNERS
* set CONF_USE_DEFAULTS docs
* add field_name
* Auto run scripts
* Update desc
* Update README.md, strings.json, and services.yaml
* double quotes
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Update README.md, strings.json, and services.yaml
* Add newline
* sync changes between en.json and strings.json
* Update README.md, strings.json, and services.yaml
* double quotes
* fix
* Update README.md, strings.json, and services.yaml
* Add comments
* Remove comments
* shorter
* Update README.md, strings.json, and services.yaml
* Rephrase
* Update README.md, strings.json, and services.yaml
* remove key from desc
---------
Co-authored-by: Benjamin Auquite <halomastar@gmail.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2023-04-03 14:59:14 -07:00
|
|
|
"Delay (ms) between `separate_turn_on_commands` for lights that don't support "
|
|
|
|
|
"simultaneous brightness and color setting. ⏲️"
|
2023-04-01 23:43:20 -07:00
|
|
|
)
|
|
|
|
|
|
2023-04-02 19:22:23 -07:00
|
|
|
CONF_AUTORESET_CONTROL, DEFAULT_AUTORESET_CONTROL = "autoreset_control_seconds", 0
|
|
|
|
|
DOCS[CONF_AUTORESET_CONTROL] = (
|
|
|
|
|
"Automatically reset the manual control after a number of seconds. "
|
|
|
|
|
"Set to 0 to disable. ⏲️"
|
|
|
|
|
)
|
2020-09-16 00:00:54 +02:00
|
|
|
|
2026-09-06 12:35:45 +02:00
|
|
|
(
|
|
|
|
|
CONF_RESET_MANUAL_CONTROL_ON_SLEEP_MODE_CHANGE,
|
|
|
|
|
DEFAULT_RESET_MANUAL_CONTROL_ON_SLEEP_MODE_CHANGE,
|
|
|
|
|
) = ("reset_manual_control_on_sleep_mode_change", True)
|
|
|
|
|
DOCS[CONF_RESET_MANUAL_CONTROL_ON_SLEEP_MODE_CHANGE] = (
|
|
|
|
|
"Reset manual control when the sleep mode switch is toggled. "
|
|
|
|
|
"Set to `false` to preserve manual control across sleep mode changes. 😴"
|
|
|
|
|
)
|
|
|
|
|
|
2023-07-03 00:26:07 +02:00
|
|
|
CONF_SKIP_REDUNDANT_COMMANDS, DEFAULT_SKIP_REDUNDANT_COMMANDS = (
|
|
|
|
|
"skip_redundant_commands",
|
|
|
|
|
False,
|
|
|
|
|
)
|
|
|
|
|
DOCS[CONF_SKIP_REDUNDANT_COMMANDS] = (
|
|
|
|
|
"Skip sending adaptation commands whose target state already "
|
|
|
|
|
"equals the light's known state. Minimizes network traffic and improves the "
|
2023-08-03 17:47:09 -07:00
|
|
|
"adaptation responsivity in some situations. 📉"
|
2023-07-03 00:26:07 +02:00
|
|
|
"Disable if physical light states get out of sync with HA's recorded state."
|
|
|
|
|
)
|
|
|
|
|
|
2023-08-15 12:23:56 -07:00
|
|
|
CONF_INTERCEPT, DEFAULT_INTERCEPT = "intercept", True
|
|
|
|
|
DOCS[CONF_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."
|
|
|
|
|
)
|
|
|
|
|
|
2023-08-03 17:47:09 -07:00
|
|
|
CONF_MULTI_LIGHT_INTERCEPT, DEFAULT_MULTI_LIGHT_INTERCEPT = (
|
|
|
|
|
"multi_light_intercept",
|
|
|
|
|
True,
|
|
|
|
|
)
|
|
|
|
|
DOCS[CONF_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 "
|
2023-08-15 12:23:56 -07:00
|
|
|
"into multiple calls, e.g., when lights are in different switches. "
|
|
|
|
|
"Requires `intercept` to be enabled."
|
2023-08-03 17:47:09 -07:00
|
|
|
)
|
|
|
|
|
|
2020-10-20 00:06:10 +02:00
|
|
|
SLEEP_MODE_SWITCH = "sleep_mode_switch"
|
2020-10-21 23:05:12 +02:00
|
|
|
ADAPT_COLOR_SWITCH = "adapt_color_switch"
|
|
|
|
|
ADAPT_BRIGHTNESS_SWITCH = "adapt_brightness_switch"
|
2023-07-22 17:57:49 -07:00
|
|
|
ATTR_ADAPTIVE_LIGHTING_MANAGER = "manager"
|
2020-09-20 18:33:26 +02:00
|
|
|
UNDO_UPDATE_LISTENER = "undo_update_listener"
|
2020-09-28 13:10:41 +02:00
|
|
|
NONE_STR = "None"
|
2020-10-21 23:05:12 +02:00
|
|
|
ATTR_ADAPT_COLOR = "adapt_color"
|
2023-04-03 00:58:39 -07:00
|
|
|
DOCS[ATTR_ADAPT_COLOR] = "Whether to adapt the color on supporting lights. 🌈"
|
2020-10-21 23:05:12 +02:00
|
|
|
ATTR_ADAPT_BRIGHTNESS = "adapt_brightness"
|
2023-04-03 00:58:39 -07:00
|
|
|
DOCS[ATTR_ADAPT_BRIGHTNESS] = "Whether to adapt the brightness of the light. 🌞"
|
2020-09-23 12:35:57 +02:00
|
|
|
|
2020-10-16 14:14:44 +02:00
|
|
|
SERVICE_SET_MANUAL_CONTROL = "set_manual_control"
|
|
|
|
|
CONF_MANUAL_CONTROL = "manual_control"
|
2023-04-03 00:58:39 -07:00
|
|
|
DOCS[CONF_MANUAL_CONTROL] = "Whether to manually control the lights. 🔒"
|
2020-09-25 16:45:10 +02:00
|
|
|
SERVICE_APPLY = "apply"
|
2020-09-29 23:39:46 +02:00
|
|
|
CONF_TURN_ON_LIGHTS = "turn_on_lights"
|
2023-04-03 00:58:39 -07:00
|
|
|
DOCS[CONF_TURN_ON_LIGHTS] = "Whether to turn on lights that are currently off. 🔆"
|
2023-03-26 22:47:50 -07:00
|
|
|
SERVICE_CHANGE_SWITCH_SETTINGS = "change_switch_settings"
|
|
|
|
|
CONF_USE_DEFAULTS = "use_defaults"
|
Add scripts to auto update en.json, strings.json and services.yaml (#520)
* Add scripts to auto update strings.json and services.yaml
* Run services
* simplify
* Run strings
* rerun
* revert
* allow unicode
* Add CODEOWNERS
* Update CODEOWNERS
* set CONF_USE_DEFAULTS docs
* add field_name
* Auto run scripts
* Update desc
* Update README.md, strings.json, and services.yaml
* double quotes
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Update README.md, strings.json, and services.yaml
* Add newline
* sync changes between en.json and strings.json
* Update README.md, strings.json, and services.yaml
* double quotes
* fix
* Update README.md, strings.json, and services.yaml
* Add comments
* Remove comments
* shorter
* Update README.md, strings.json, and services.yaml
* Rephrase
* Update README.md, strings.json, and services.yaml
* remove key from desc
---------
Co-authored-by: Benjamin Auquite <halomastar@gmail.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2023-04-03 14:59:14 -07:00
|
|
|
DOCS[CONF_USE_DEFAULTS] = (
|
|
|
|
|
"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). ⚙️'
|
|
|
|
|
)
|
2023-04-01 23:43:20 -07:00
|
|
|
|
2020-09-27 00:06:31 +02:00
|
|
|
TURNING_OFF_DELAY = 5
|
|
|
|
|
|
2023-04-03 00:58:39 -07:00
|
|
|
DOCS_MANUAL_CONTROL = {
|
|
|
|
|
CONF_ENTITY_ID: "The `entity_id` of the switch in which to (un)mark the "
|
|
|
|
|
"light as being `manually controlled`. 📝",
|
|
|
|
|
CONF_LIGHTS: "entity_id(s) of lights, if not specified, all lights in the "
|
|
|
|
|
"switch are selected. 💡",
|
2025-12-23 07:55:16 +01:00
|
|
|
CONF_MANUAL_CONTROL: '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. 🔒",
|
2023-04-03 00:58:39 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DOCS_APPLY = {
|
|
|
|
|
CONF_ENTITY_ID: "The `entity_id` of the switch with the settings to apply. 📝",
|
|
|
|
|
CONF_LIGHTS: "A light (or list of lights) to apply the settings to. 💡",
|
|
|
|
|
}
|
|
|
|
|
|
2026-09-06 17:18:42 +02:00
|
|
|
# Basic options shown at top level in options flow (not in collapsed section)
|
|
|
|
|
BASIC_OPTIONS: set[str] = {
|
|
|
|
|
CONF_LIGHTS,
|
|
|
|
|
CONF_MIN_BRIGHTNESS,
|
|
|
|
|
CONF_MAX_BRIGHTNESS,
|
|
|
|
|
CONF_MIN_COLOR_TEMP,
|
|
|
|
|
CONF_MAX_COLOR_TEMP,
|
|
|
|
|
CONF_SLEEP_BRIGHTNESS,
|
|
|
|
|
CONF_SLEEP_COLOR_TEMP,
|
|
|
|
|
CONF_TRANSITION,
|
|
|
|
|
CONF_INTERVAL,
|
|
|
|
|
}
|
|
|
|
|
|
2020-09-23 18:20:25 +02:00
|
|
|
|
2025-11-27 21:01:05 +01:00
|
|
|
def int_between(min_int: int, max_int: int) -> vol.All:
|
2020-09-27 16:21:42 +02:00
|
|
|
"""Return an integer between 'min_int' and 'max_int'."""
|
|
|
|
|
return vol.All(vol.Coerce(int), vol.Range(min=min_int, max=max_int))
|
2020-09-23 18:20:25 +02:00
|
|
|
|
|
|
|
|
|
2025-11-27 21:01:05 +01:00
|
|
|
VALIDATION_TUPLES: list[tuple[str, Any, Any]] = [
|
|
|
|
|
(CONF_LIGHTS, DEFAULT_LIGHTS, cv.entity_ids), # type: ignore[arg-type]
|
2020-09-23 18:20:25 +02:00
|
|
|
(CONF_INTERVAL, DEFAULT_INTERVAL, cv.positive_int),
|
2023-08-04 14:45:12 -07:00
|
|
|
(CONF_TRANSITION, DEFAULT_TRANSITION, VALID_TRANSITION),
|
|
|
|
|
(CONF_INITIAL_TRANSITION, DEFAULT_INITIAL_TRANSITION, VALID_TRANSITION),
|
2020-09-23 18:20:25 +02:00
|
|
|
(CONF_MIN_BRIGHTNESS, DEFAULT_MIN_BRIGHTNESS, int_between(1, 100)),
|
2020-10-05 14:41:21 +02:00
|
|
|
(CONF_MAX_BRIGHTNESS, DEFAULT_MAX_BRIGHTNESS, int_between(1, 100)),
|
2020-09-23 18:20:25 +02:00
|
|
|
(CONF_MIN_COLOR_TEMP, DEFAULT_MIN_COLOR_TEMP, int_between(1000, 10000)),
|
2020-10-05 14:41:21 +02:00
|
|
|
(CONF_MAX_COLOR_TEMP, DEFAULT_MAX_COLOR_TEMP, int_between(1000, 10000)),
|
2023-08-04 14:45:12 -07:00
|
|
|
(CONF_PREFER_RGB_COLOR, DEFAULT_PREFER_RGB_COLOR, bool),
|
2020-09-23 18:20:25 +02:00
|
|
|
(CONF_SLEEP_BRIGHTNESS, DEFAULT_SLEEP_BRIGHTNESS, int_between(1, 100)),
|
2022-08-31 22:15:24 -07:00
|
|
|
(
|
|
|
|
|
CONF_SLEEP_RGB_OR_COLOR_TEMP,
|
|
|
|
|
DEFAULT_SLEEP_RGB_OR_COLOR_TEMP,
|
2025-11-27 21:01:05 +01:00
|
|
|
selector.SelectSelector( # type: ignore[arg-type]
|
2022-08-31 22:15:24 -07:00
|
|
|
selector.SelectSelectorConfig(
|
2022-08-31 22:44:07 -07:00
|
|
|
options=["color_temp", "rgb_color"],
|
2022-08-31 22:15:24 -07:00
|
|
|
multiple=False,
|
|
|
|
|
mode=selector.SelectSelectorMode.DROPDOWN,
|
|
|
|
|
),
|
2022-08-31 22:44:07 -07:00
|
|
|
),
|
2022-08-31 22:15:24 -07:00
|
|
|
),
|
2022-08-31 22:54:37 -07:00
|
|
|
(CONF_SLEEP_COLOR_TEMP, DEFAULT_SLEEP_COLOR_TEMP, int_between(1000, 10000)),
|
|
|
|
|
(
|
|
|
|
|
CONF_SLEEP_RGB_COLOR,
|
|
|
|
|
DEFAULT_SLEEP_RGB_COLOR,
|
2025-11-27 21:01:05 +01:00
|
|
|
selector.ColorRGBSelector(selector.ColorRGBSelectorConfig()), # type: ignore[arg-type]
|
2022-08-31 22:54:37 -07:00
|
|
|
),
|
2023-08-04 14:45:12 -07:00
|
|
|
(CONF_SLEEP_TRANSITION, DEFAULT_SLEEP_TRANSITION, VALID_TRANSITION),
|
|
|
|
|
(CONF_ADAPT_UNTIL_SLEEP, DEFAULT_ADAPT_UNTIL_SLEEP, bool),
|
2020-09-24 23:54:14 +02:00
|
|
|
(CONF_SUNRISE_TIME, NONE_STR, str),
|
2023-08-05 15:08:45 -07:00
|
|
|
(CONF_MIN_SUNRISE_TIME, NONE_STR, str),
|
2022-11-08 17:37:57 +01:00
|
|
|
(CONF_MAX_SUNRISE_TIME, NONE_STR, str),
|
2020-10-05 14:41:21 +02:00
|
|
|
(CONF_SUNRISE_OFFSET, DEFAULT_SUNRISE_OFFSET, int),
|
2020-09-24 23:54:14 +02:00
|
|
|
(CONF_SUNSET_TIME, NONE_STR, str),
|
2022-11-08 17:37:57 +01:00
|
|
|
(CONF_MIN_SUNSET_TIME, NONE_STR, str),
|
2023-08-05 15:08:45 -07:00
|
|
|
(CONF_MAX_SUNSET_TIME, NONE_STR, str),
|
2020-10-05 14:41:21 +02:00
|
|
|
(CONF_SUNSET_OFFSET, DEFAULT_SUNSET_OFFSET, int),
|
2023-08-05 13:14:21 -07:00
|
|
|
(
|
|
|
|
|
CONF_BRIGHTNESS_MODE,
|
|
|
|
|
DEFAULT_BRIGHTNESS_MODE,
|
2025-11-27 21:01:05 +01:00
|
|
|
selector.SelectSelector( # type: ignore[arg-type]
|
2023-08-05 13:14:21 -07:00
|
|
|
selector.SelectSelectorConfig(
|
|
|
|
|
options=["default", "linear", "tanh"],
|
|
|
|
|
multiple=False,
|
|
|
|
|
mode=selector.SelectSelectorMode.DROPDOWN,
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
(CONF_BRIGHTNESS_MODE_TIME_DARK, DEFAULT_BRIGHTNESS_MODE_TIME_DARK, int),
|
|
|
|
|
(CONF_BRIGHTNESS_MODE_TIME_LIGHT, DEFAULT_BRIGHTNESS_MODE_TIME_LIGHT, int),
|
2020-10-02 19:47:06 +02:00
|
|
|
(CONF_TAKE_OVER_CONTROL, DEFAULT_TAKE_OVER_CONTROL, bool),
|
2025-12-23 07:55:16 +01:00
|
|
|
(
|
|
|
|
|
CONF_TAKE_OVER_CONTROL_MODE,
|
|
|
|
|
DEFAULT_TAKE_OVER_CONTROL_MODE,
|
|
|
|
|
selector.SelectSelector( # type: ignore[arg-type]
|
|
|
|
|
selector.SelectSelectorConfig(
|
|
|
|
|
options=[
|
|
|
|
|
TakeOverControlMode.PAUSE_ALL.value,
|
|
|
|
|
TakeOverControlMode.PAUSE_CHANGED.value,
|
|
|
|
|
],
|
|
|
|
|
multiple=False,
|
|
|
|
|
mode=selector.SelectSelectorMode.DROPDOWN,
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
),
|
2020-10-04 15:12:14 +02:00
|
|
|
(CONF_DETECT_NON_HA_CHANGES, DEFAULT_DETECT_NON_HA_CHANGES, bool),
|
2023-04-02 19:22:23 -07:00
|
|
|
(
|
|
|
|
|
CONF_AUTORESET_CONTROL,
|
|
|
|
|
DEFAULT_AUTORESET_CONTROL,
|
2023-04-03 01:57:12 -05:00
|
|
|
int_between(0, 365 * 24 * 60 * 60), # 1 year max
|
2023-04-02 19:22:23 -07:00
|
|
|
),
|
2023-08-04 14:45:12 -07:00
|
|
|
(CONF_ONLY_ONCE, DEFAULT_ONLY_ONCE, bool),
|
2023-08-05 20:56:32 -07:00
|
|
|
(CONF_ADAPT_ONLY_ON_BARE_TURN_ON, DEFAULT_ADAPT_ONLY_ON_BARE_TURN_ON, bool),
|
2026-09-06 12:35:45 +02:00
|
|
|
(
|
|
|
|
|
CONF_RESET_MANUAL_CONTROL_ON_SLEEP_MODE_CHANGE,
|
|
|
|
|
DEFAULT_RESET_MANUAL_CONTROL_ON_SLEEP_MODE_CHANGE,
|
|
|
|
|
bool,
|
|
|
|
|
),
|
2023-08-04 14:45:12 -07:00
|
|
|
(CONF_SEPARATE_TURN_ON_COMMANDS, DEFAULT_SEPARATE_TURN_ON_COMMANDS, bool),
|
|
|
|
|
(CONF_SEND_SPLIT_DELAY, DEFAULT_SEND_SPLIT_DELAY, int_between(0, 10000)),
|
|
|
|
|
(CONF_ADAPT_DELAY, DEFAULT_ADAPT_DELAY, cv.positive_float),
|
2023-07-03 00:26:07 +02:00
|
|
|
(
|
|
|
|
|
CONF_SKIP_REDUNDANT_COMMANDS,
|
|
|
|
|
DEFAULT_SKIP_REDUNDANT_COMMANDS,
|
|
|
|
|
bool,
|
|
|
|
|
),
|
2023-08-15 12:23:56 -07:00
|
|
|
(CONF_INTERCEPT, DEFAULT_INTERCEPT, bool),
|
2023-08-03 17:47:09 -07:00
|
|
|
(CONF_MULTI_LIGHT_INTERCEPT, DEFAULT_MULTI_LIGHT_INTERCEPT, bool),
|
2023-08-04 14:45:12 -07:00
|
|
|
(CONF_INCLUDE_CONFIG_IN_ATTRIBUTES, DEFAULT_INCLUDE_CONFIG_IN_ATTRIBUTES, bool),
|
2020-09-23 12:35:57 +02:00
|
|
|
]
|
2020-09-23 18:20:25 +02:00
|
|
|
|
2020-09-24 20:41:24 +02:00
|
|
|
|
2025-11-27 21:01:05 +01:00
|
|
|
def timedelta_as_int(value: timedelta) -> float:
|
2020-09-26 16:38:22 +02:00
|
|
|
"""Convert a `datetime.timedelta` object to an integer.
|
|
|
|
|
|
|
|
|
|
This integer can be serialized to json but a timedelta cannot.
|
|
|
|
|
"""
|
2020-09-24 20:41:24 +02:00
|
|
|
return value.total_seconds()
|
|
|
|
|
|
|
|
|
|
|
2020-09-24 23:42:21 +02:00
|
|
|
# conf_option: (validator, coerce) tuples
|
|
|
|
|
# these validators cannot be serialized but can be serialized when coerced by coerce.
|
2025-11-27 21:01:05 +01:00
|
|
|
EXTRA_VALIDATION: dict[str, tuple[Any, Any]] = {
|
2020-09-24 20:41:24 +02:00
|
|
|
CONF_INTERVAL: (cv.time_period, timedelta_as_int),
|
|
|
|
|
CONF_SUNRISE_OFFSET: (cv.time_period, timedelta_as_int),
|
|
|
|
|
CONF_SUNRISE_TIME: (cv.time, str),
|
2023-08-06 19:21:16 -07:00
|
|
|
CONF_MIN_SUNRISE_TIME: (cv.time, str),
|
2022-11-08 17:37:57 +01:00
|
|
|
CONF_MAX_SUNRISE_TIME: (cv.time, str),
|
2020-09-24 20:41:24 +02:00
|
|
|
CONF_SUNSET_OFFSET: (cv.time_period, timedelta_as_int),
|
|
|
|
|
CONF_SUNSET_TIME: (cv.time, str),
|
2022-11-08 17:37:57 +01:00
|
|
|
CONF_MIN_SUNSET_TIME: (cv.time, str),
|
2023-08-06 19:21:16 -07:00
|
|
|
CONF_MAX_SUNSET_TIME: (cv.time, str),
|
2023-08-05 13:14:21 -07:00
|
|
|
CONF_BRIGHTNESS_MODE_TIME_LIGHT: (cv.time_period, timedelta_as_int),
|
|
|
|
|
CONF_BRIGHTNESS_MODE_TIME_DARK: (cv.time_period, timedelta_as_int),
|
2020-09-23 18:20:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-11-27 21:01:05 +01:00
|
|
|
def maybe_coerce(key: str, validation: Any) -> vol.All | Any:
|
2020-09-26 16:38:22 +02:00
|
|
|
"""Coerce the validation into a json serializable type."""
|
2020-09-24 23:42:21 +02:00
|
|
|
validation, coerce = EXTRA_VALIDATION.get(key, (validation, None))
|
|
|
|
|
if coerce is not None:
|
|
|
|
|
return vol.All(validation, vol.Coerce(coerce))
|
|
|
|
|
return validation
|
2020-09-24 20:41:24 +02:00
|
|
|
|
2020-09-23 18:20:25 +02:00
|
|
|
|
2025-11-27 21:01:05 +01:00
|
|
|
def replace_none_str(value: Any, replace_with: Any | None = None) -> Any:
|
2020-09-26 16:38:22 +02:00
|
|
|
"""Replace "None" -> replace_with."""
|
2020-09-25 10:49:58 +02:00
|
|
|
return value if value != NONE_STR else replace_with
|
2020-09-23 18:20:25 +02:00
|
|
|
|
2020-09-24 23:42:21 +02:00
|
|
|
|
2020-09-26 13:05:27 +02:00
|
|
|
_yaml_validation_tuples = [
|
2020-09-25 10:33:49 +02:00
|
|
|
(key, default, maybe_coerce(key, validation))
|
2020-09-24 23:42:21 +02:00
|
|
|
for key, default, validation in VALIDATION_TUPLES
|
|
|
|
|
] + [(CONF_NAME, DEFAULT_NAME, cv.string)]
|
|
|
|
|
|
|
|
|
|
_DOMAIN_SCHEMA = vol.Schema(
|
|
|
|
|
{
|
2020-09-26 13:01:43 +02:00
|
|
|
vol.Optional(key, default=replace_none_str(default, vol.UNDEFINED)): validation
|
2020-09-26 13:05:27 +02:00
|
|
|
for key, default, validation in _yaml_validation_tuples
|
2023-07-23 14:24:22 -07:00
|
|
|
},
|
2020-09-24 23:42:21 +02:00
|
|
|
)
|
2023-04-01 23:43:20 -07:00
|
|
|
|
|
|
|
|
|
2026-09-06 05:04:18 -06:00
|
|
|
def apply_service_schema() -> vol.Schema:
|
2023-04-03 00:58:39 -07:00
|
|
|
"""Return the schema for the apply service."""
|
|
|
|
|
return vol.Schema(
|
|
|
|
|
{
|
2025-11-27 21:01:05 +01:00
|
|
|
vol.Optional(CONF_ENTITY_ID): cv.entity_ids, # type: ignore[arg-type]
|
|
|
|
|
vol.Optional(CONF_LIGHTS, default=[]): cv.entity_ids, # type: ignore[arg-type]
|
2026-09-06 05:04:18 -06:00
|
|
|
vol.Optional(CONF_TRANSITION): VALID_TRANSITION,
|
2023-04-03 00:58:39 -07:00
|
|
|
vol.Optional(ATTR_ADAPT_BRIGHTNESS, default=True): cv.boolean,
|
|
|
|
|
vol.Optional(ATTR_ADAPT_COLOR, default=True): cv.boolean,
|
|
|
|
|
vol.Optional(CONF_PREFER_RGB_COLOR, default=False): cv.boolean,
|
|
|
|
|
vol.Optional(CONF_TURN_ON_LIGHTS, default=False): cv.boolean,
|
2023-07-23 14:24:22 -07:00
|
|
|
},
|
2023-04-03 00:58:39 -07:00
|
|
|
)
|
2023-04-01 23:43:20 -07:00
|
|
|
|
2023-04-03 00:58:39 -07:00
|
|
|
|
2026-09-06 05:04:18 -06:00
|
|
|
def change_switch_settings_schema() -> dict[vol.Marker, Any]:
|
|
|
|
|
"""Return the schema for the change_switch_settings service."""
|
|
|
|
|
args: dict[vol.Marker, Any] = {
|
|
|
|
|
vol.Optional(CONF_USE_DEFAULTS, default="current"): cv.string,
|
|
|
|
|
}
|
|
|
|
|
# Modifying these after init isn't possible
|
|
|
|
|
skip = (CONF_INTERVAL, CONF_NAME, CONF_LIGHTS)
|
|
|
|
|
for k, _, valid in VALIDATION_TUPLES:
|
|
|
|
|
if k not in skip:
|
|
|
|
|
args[vol.Optional(k)] = valid
|
|
|
|
|
return args
|
|
|
|
|
|
|
|
|
|
|
2023-04-03 00:58:39 -07:00
|
|
|
SET_MANUAL_CONTROL_SCHEMA = vol.Schema(
|
|
|
|
|
{
|
2025-11-27 21:01:05 +01:00
|
|
|
vol.Optional(CONF_ENTITY_ID): cv.entity_ids, # type: ignore[arg-type]
|
|
|
|
|
vol.Optional(CONF_LIGHTS, default=[]): cv.entity_ids, # type: ignore[arg-type]
|
2025-12-23 07:55:16 +01:00
|
|
|
vol.Optional(CONF_MANUAL_CONTROL, default=True): vol.Any(
|
|
|
|
|
cv.boolean,
|
|
|
|
|
vol.In(["brightness", "color"]),
|
|
|
|
|
),
|
2023-07-23 14:24:22 -07:00
|
|
|
},
|
2023-04-03 00:58:39 -07:00
|
|
|
)
|