Home Assistant Unofficial Reference 2024.12.1
device_action.py
Go to the documentation of this file.
1 """Provides device automations for Climate."""
2 
3 from __future__ import annotations
4 
5 import voluptuous as vol
6 
8  async_get_entity_registry_entry_or_raise,
9  async_validate_entity_schema,
10 )
11 from homeassistant.const import (
12  ATTR_ENTITY_ID,
13  CONF_DEVICE_ID,
14  CONF_DOMAIN,
15  CONF_ENTITY_ID,
16  CONF_TYPE,
17 )
18 from homeassistant.core import Context, HomeAssistant
19 from homeassistant.exceptions import HomeAssistantError
20 from homeassistant.helpers import entity_registry as er
22 from homeassistant.helpers.entity import get_capability, get_supported_features
23 from homeassistant.helpers.typing import ConfigType, TemplateVarsType
24 
25 from . import DOMAIN, const
26 
27 ACTION_TYPES = {"set_hvac_mode", "set_preset_mode"}
28 
29 SET_HVAC_MODE_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend(
30  {
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),
34  }
35 )
36 
37 SET_PRESET_MODE_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend(
38  {
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,
42  }
43 )
44 
45 _ACTION_SCHEMA = vol.Any(SET_HVAC_MODE_SCHEMA, SET_PRESET_MODE_SCHEMA)
46 
47 
49  hass: HomeAssistant, config: ConfigType
50 ) -> ConfigType:
51  """Validate config."""
52  return async_validate_entity_schema(hass, config, _ACTION_SCHEMA)
53 
54 
56  hass: HomeAssistant, device_id: str
57 ) -> list[dict[str, str]]:
58  """List device actions for Climate devices."""
59  registry = er.async_get(hass)
60  actions = []
61 
62  # Get all the integrations entities for this device
63  for entry in er.async_entries_for_device(registry, device_id):
64  if entry.domain != DOMAIN:
65  continue
66 
67  supported_features = get_supported_features(hass, entry.entity_id)
68 
69  base_action = {
70  CONF_DEVICE_ID: device_id,
71  CONF_DOMAIN: DOMAIN,
72  CONF_ENTITY_ID: entry.id,
73  }
74 
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"})
78 
79  return actions
80 
81 
83  hass: HomeAssistant,
84  config: ConfigType,
85  variables: TemplateVarsType,
86  context: Context | None,
87 ) -> None:
88  """Execute a device action."""
89  service_data = {ATTR_ENTITY_ID: config[CONF_ENTITY_ID]}
90 
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]
97 
98  await hass.services.async_call(
99  DOMAIN, service, service_data, blocking=True, context=context
100  )
101 
102 
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]
109 
110  fields = {}
111 
112  if action_type == "set_hvac_mode":
113  try:
114  entry = async_get_entity_registry_entry_or_raise(hass, entity_id_or_uuid)
115  hvac_modes = (
116  get_capability(hass, entry.entity_id, const.ATTR_HVAC_MODES) or []
117  )
118  except HomeAssistantError:
119  hvac_modes = []
120  fields[vol.Required(const.ATTR_HVAC_MODE)] = vol.In(hvac_modes)
121  elif action_type == "set_preset_mode":
122  try:
123  entry = async_get_entity_registry_entry_or_raise(hass, entity_id_or_uuid)
124  preset_modes = (
125  get_capability(hass, entry.entity_id, const.ATTR_PRESET_MODES) or []
126  )
127  except HomeAssistantError:
128  preset_modes = []
129  fields[vol.Required(const.ATTR_PRESET_MODE)] = vol.In(preset_modes)
130 
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)
Definition: __init__.py:332
ConfigType async_validate_entity_schema(HomeAssistant hass, ConfigType config, VolSchemaType schema)
Definition: __init__.py:344
int get_supported_features(HomeAssistant hass, str entity_id)
Definition: entity.py:169
Any|None get_capability(HomeAssistant hass, str entity_id, str capability)
Definition: entity.py:139