1 """Provides device automations for Climate."""
3 from __future__
import annotations
5 import voluptuous
as vol
8 async_get_entity_registry_entry_or_raise,
9 async_validate_entity_schema,
25 from .
import DOMAIN, const
27 ACTION_TYPES = {
"set_hvac_mode",
"set_preset_mode"}
29 SET_HVAC_MODE_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend(
31 vol.Required(CONF_TYPE):
"set_hvac_mode",
32 vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid,
33 vol.Required(const.ATTR_HVAC_MODE): vol.In(const.HVAC_MODES),
37 SET_PRESET_MODE_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend(
39 vol.Required(CONF_TYPE):
"set_preset_mode",
40 vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid,
41 vol.Required(const.ATTR_PRESET_MODE): str,
45 _ACTION_SCHEMA = vol.Any(SET_HVAC_MODE_SCHEMA, SET_PRESET_MODE_SCHEMA)
49 hass: HomeAssistant, config: ConfigType
51 """Validate config."""
56 hass: HomeAssistant, device_id: str
57 ) -> list[dict[str, str]]:
58 """List device actions for Climate devices."""
59 registry = er.async_get(hass)
63 for entry
in er.async_entries_for_device(registry, device_id):
64 if entry.domain != DOMAIN:
70 CONF_DEVICE_ID: device_id,
72 CONF_ENTITY_ID: entry.id,
75 actions.append({**base_action, CONF_TYPE:
"set_hvac_mode"})
76 if supported_features & const.ClimateEntityFeature.PRESET_MODE:
77 actions.append({**base_action, CONF_TYPE:
"set_preset_mode"})
85 variables: TemplateVarsType,
86 context: Context |
None,
88 """Execute a device action."""
89 service_data = {ATTR_ENTITY_ID: config[CONF_ENTITY_ID]}
91 if config[CONF_TYPE] ==
"set_hvac_mode":
92 service = const.SERVICE_SET_HVAC_MODE
93 service_data[const.ATTR_HVAC_MODE] = config[const.ATTR_HVAC_MODE]
94 elif config[CONF_TYPE] ==
"set_preset_mode":
95 service = const.SERVICE_SET_PRESET_MODE
96 service_data[const.ATTR_PRESET_MODE] = config[const.ATTR_PRESET_MODE]
98 await hass.services.async_call(
99 DOMAIN, service, service_data, blocking=
True, context=context
104 hass: HomeAssistant, config: ConfigType
105 ) -> dict[str, vol.Schema]:
106 """List action capabilities."""
107 action_type = config[CONF_TYPE]
108 entity_id_or_uuid = config[CONF_ENTITY_ID]
112 if action_type ==
"set_hvac_mode":
116 get_capability(hass, entry.entity_id, const.ATTR_HVAC_MODES)
or []
118 except HomeAssistantError:
120 fields[vol.Required(const.ATTR_HVAC_MODE)] = vol.In(hvac_modes)
121 elif action_type ==
"set_preset_mode":
125 get_capability(hass, entry.entity_id, const.ATTR_PRESET_MODES)
or []
127 except HomeAssistantError:
129 fields[vol.Required(const.ATTR_PRESET_MODE)] = vol.In(preset_modes)
131 return {
"extra_fields": vol.Schema(fields)}
list[dict[str, str]] async_get_actions(HomeAssistant hass, str device_id)
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)
ConfigType async_validate_action_config(HomeAssistant hass, ConfigType config)
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)
int get_supported_features(HomeAssistant hass, str entity_id)
Any|None get_capability(HomeAssistant hass, str entity_id, str capability)