1 """Provides device actions for lights."""
3 from __future__
import annotations
5 import voluptuous
as vol
8 async_get_entity_registry_entry_or_raise,
9 async_validate_entity_schema,
28 ATTR_BRIGHTNESS_STEP_PCT,
36 get_supported_color_modes,
41 TYPE_BRIGHTNESS_INCREASE =
"brightness_increase"
42 TYPE_BRIGHTNESS_DECREASE =
"brightness_decrease"
45 _ACTION_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend(
47 vol.Required(ATTR_ENTITY_ID): cv.entity_id_or_uuid,
48 vol.Required(CONF_DOMAIN): DOMAIN,
49 vol.Required(CONF_TYPE): vol.In(
51 *toggle_entity.DEVICE_ACTION_TYPES,
52 TYPE_BRIGHTNESS_INCREASE,
53 TYPE_BRIGHTNESS_DECREASE,
57 vol.Optional(ATTR_BRIGHTNESS_PCT): VALID_BRIGHTNESS_PCT,
58 vol.Optional(ATTR_FLASH): VALID_FLASH,
64 hass: HomeAssistant, config: ConfigType
66 """Validate config."""
73 variables: TemplateVarsType,
74 context: Context |
None,
76 """Change state based on configuration."""
78 config[CONF_TYPE]
in toggle_entity.DEVICE_ACTION_TYPES
79 and config[CONF_TYPE] != toggle_entity.CONF_TURN_ON
81 await toggle_entity.async_call_action_from_config(
82 hass, config, variables, context, DOMAIN
86 data = {ATTR_ENTITY_ID: config[ATTR_ENTITY_ID]}
88 if config[CONF_TYPE] == TYPE_BRIGHTNESS_INCREASE:
89 data[ATTR_BRIGHTNESS_STEP_PCT] = 10
90 elif config[CONF_TYPE] == TYPE_BRIGHTNESS_DECREASE:
91 data[ATTR_BRIGHTNESS_STEP_PCT] = -10
92 elif ATTR_BRIGHTNESS_PCT
in config:
93 data[ATTR_BRIGHTNESS_PCT] = config[ATTR_BRIGHTNESS_PCT]
95 if config[CONF_TYPE] == TYPE_FLASH:
96 data[ATTR_FLASH] = config.get(ATTR_FLASH, FLASH_SHORT)
98 await hass.services.async_call(
99 DOMAIN, SERVICE_TURN_ON, data, blocking=
True, context=context
104 hass: HomeAssistant, device_id: str
105 ) -> list[dict[str, str]]:
106 """List device actions."""
107 actions = await toggle_entity.async_get_actions(hass, device_id, DOMAIN)
109 entity_registry = er.async_get(hass)
111 for entry
in er.async_entries_for_device(entity_registry, device_id):
112 if entry.domain != DOMAIN:
119 CONF_DEVICE_ID: device_id,
121 CONF_ENTITY_ID: entry.id,
127 {**base_action, CONF_TYPE: TYPE_BRIGHTNESS_INCREASE},
128 {**base_action, CONF_TYPE: TYPE_BRIGHTNESS_DECREASE},
132 if supported_features & LightEntityFeature.FLASH:
133 actions.append({**base_action, CONF_TYPE: TYPE_FLASH})
139 hass: HomeAssistant, config: ConfigType
140 ) -> dict[str, vol.Schema]:
141 """List action capabilities."""
142 if config[CONF_TYPE] != toggle_entity.CONF_TURN_ON:
149 except HomeAssistantError:
150 supported_color_modes =
None
151 supported_features = 0
153 extra_fields: VolDictType = {}
156 extra_fields[vol.Optional(ATTR_BRIGHTNESS_PCT)] = VALID_BRIGHTNESS_PCT
158 if supported_features & LightEntityFeature.FLASH:
159 extra_fields[vol.Optional(ATTR_FLASH)] = VALID_FLASH
161 return {
"extra_fields": vol.Schema(extra_fields)}
if extra_fields
else {}
er.RegistryEntry async_get_entity_registry_entry_or_raise(HomeAssistant hass, str entity_registry_id)
ConfigType async_validate_entity_schema(HomeAssistant hass, ConfigType config, VolSchemaType schema)
dict[str, vol.Schema] async_get_action_capabilities(HomeAssistant hass, ConfigType config)
None async_call_action_from_config(HomeAssistant hass, ConfigType config, TemplateVarsType variables, Context|None context)
list[dict[str, str]] async_get_actions(HomeAssistant hass, str device_id)
ConfigType async_validate_action_config(HomeAssistant hass, ConfigType config)
set[str]|None get_supported_color_modes(HomeAssistant hass, str entity_id)
bool brightness_supported(Iterable[ColorMode|str]|None color_modes)
int get_supported_features(HomeAssistant hass, str entity_id)