1 """Provides device actions for Select."""
3 from __future__
import annotations
5 from contextlib
import suppress
7 import voluptuous
as vol
10 async_get_entity_registry_entry_or_raise,
11 async_validate_entity_schema,
37 SERVICE_SELECT_OPTION,
38 SERVICE_SELECT_PREVIOUS,
41 _ACTION_SCHEMA = vol.Any(
42 cv.DEVICE_ACTION_BASE_SCHEMA.extend(
44 vol.Required(CONF_TYPE): SERVICE_SELECT_FIRST,
45 vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid,
48 cv.DEVICE_ACTION_BASE_SCHEMA.extend(
50 vol.Required(CONF_TYPE): SERVICE_SELECT_LAST,
51 vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid,
54 cv.DEVICE_ACTION_BASE_SCHEMA.extend(
56 vol.Required(CONF_TYPE): SERVICE_SELECT_NEXT,
57 vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid,
58 vol.Optional(CONF_CYCLE, default=
True): cv.boolean,
61 cv.DEVICE_ACTION_BASE_SCHEMA.extend(
63 vol.Required(CONF_TYPE): SERVICE_SELECT_PREVIOUS,
64 vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid,
65 vol.Optional(CONF_CYCLE, default=
True): cv.boolean,
68 cv.DEVICE_ACTION_BASE_SCHEMA.extend(
70 vol.Required(CONF_TYPE): SERVICE_SELECT_OPTION,
71 vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid,
72 vol.Required(CONF_OPTION): cv.string,
79 hass: HomeAssistant, config: ConfigType
81 """Validate config."""
86 hass: HomeAssistant, device_id: str
87 ) -> list[dict[str, str]]:
88 """List device actions for Select devices."""
89 registry = er.async_get(hass)
92 CONF_DEVICE_ID: device_id,
94 CONF_ENTITY_ID: entry.id,
95 CONF_TYPE: service_conf_type,
97 for service_conf_type
in (
101 SERVICE_SELECT_OPTION,
102 SERVICE_SELECT_PREVIOUS,
104 for entry
in er.async_entries_for_device(registry, device_id)
105 if entry.domain == DOMAIN
112 variables: TemplateVarsType,
113 context: Context |
None,
115 """Execute a device action."""
116 service_data = {ATTR_ENTITY_ID: config[CONF_ENTITY_ID]}
117 if config[CONF_TYPE] == SERVICE_SELECT_OPTION:
118 service_data[ATTR_OPTION] = config[CONF_OPTION]
119 if config[CONF_TYPE]
in {SERVICE_SELECT_NEXT, SERVICE_SELECT_PREVIOUS}:
120 service_data[ATTR_CYCLE] = config[CONF_CYCLE]
122 await hass.services.async_call(
132 hass: HomeAssistant, config: ConfigType
133 ) -> dict[str, vol.Schema]:
134 """List action capabilities."""
135 if config[CONF_TYPE]
in {SERVICE_SELECT_NEXT, SERVICE_SELECT_PREVIOUS}:
137 "extra_fields": vol.Schema(
138 {vol.Optional(CONF_CYCLE, default=
True): cv.boolean}
142 if config[CONF_TYPE] == SERVICE_SELECT_OPTION:
143 options: list[str] = []
144 with suppress(HomeAssistantError):
146 hass, config[CONF_ENTITY_ID]
148 options =
get_capability(hass, entry.entity_id, ATTR_OPTIONS)
or []
150 "extra_fields": vol.Schema({vol.Required(CONF_OPTION): vol.In(options)})
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)
list[dict[str, str]] async_get_actions(HomeAssistant hass, str device_id)
ConfigType async_validate_action_config(HomeAssistant hass, ConfigType config)
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)
Any|None get_capability(HomeAssistant hass, str entity_id, str capability)