Home Assistant Unofficial Reference 2024.12.1
device_trigger.py
Go to the documentation of this file.
1 """Provides device triggers for Select."""
2 
3 from __future__ import annotations
4 
5 import voluptuous as vol
6 
8  DEVICE_TRIGGER_BASE_SCHEMA,
9  async_get_entity_registry_entry_or_raise,
10 )
12  CONF_FOR,
13  CONF_FROM,
14  CONF_TO,
15  async_attach_trigger as async_attach_state_trigger,
16  async_validate_trigger_config as async_validate_state_trigger_config,
17 )
18 from homeassistant.const import (
19  CONF_DEVICE_ID,
20  CONF_DOMAIN,
21  CONF_ENTITY_ID,
22  CONF_PLATFORM,
23  CONF_TYPE,
24 )
25 from homeassistant.core import CALLBACK_TYPE, HomeAssistant
26 from homeassistant.exceptions import HomeAssistantError
27 from homeassistant.helpers import config_validation as cv, entity_registry as er
28 from homeassistant.helpers.entity import get_capability
29 from homeassistant.helpers.trigger import TriggerActionType, TriggerInfo
30 from homeassistant.helpers.typing import ConfigType
31 
32 from .const import ATTR_OPTIONS, DOMAIN
33 
34 TRIGGER_TYPES = {"current_option_changed"}
35 
36 TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend(
37  {
38  vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid,
39  vol.Required(CONF_TYPE): vol.In(TRIGGER_TYPES),
40  vol.Optional(CONF_TO): vol.Any(vol.Coerce(str)),
41  vol.Optional(CONF_FROM): vol.Any(vol.Coerce(str)),
42  vol.Optional(CONF_FOR): cv.positive_time_period_dict,
43  }
44 )
45 
46 
48  hass: HomeAssistant, device_id: str
49 ) -> list[dict[str, str]]:
50  """List device triggers for Select devices."""
51  registry = er.async_get(hass)
52  return [
53  {
54  CONF_PLATFORM: "device",
55  CONF_DEVICE_ID: device_id,
56  CONF_DOMAIN: DOMAIN,
57  CONF_ENTITY_ID: entry.id,
58  CONF_TYPE: "current_option_changed",
59  }
60  for entry in er.async_entries_for_device(registry, device_id)
61  if entry.domain == DOMAIN
62  ]
63 
64 
66  hass: HomeAssistant,
67  config: ConfigType,
68  action: TriggerActionType,
69  trigger_info: TriggerInfo,
70 ) -> CALLBACK_TYPE:
71  """Attach a trigger."""
72  state_config = {
73  CONF_PLATFORM: "state",
74  CONF_ENTITY_ID: config[CONF_ENTITY_ID],
75  }
76 
77  if CONF_TO in config:
78  state_config[CONF_TO] = config[CONF_TO]
79 
80  if CONF_FROM in config:
81  state_config[CONF_FROM] = config[CONF_FROM]
82 
83  if CONF_FOR in config:
84  state_config[CONF_FOR] = config[CONF_FOR]
85 
86  state_config = await async_validate_state_trigger_config(hass, state_config)
87  return await async_attach_state_trigger(
88  hass, state_config, action, trigger_info, platform_type="device"
89  )
90 
91 
93  hass: HomeAssistant, config: ConfigType
94 ) -> dict[str, vol.Schema]:
95  """List trigger capabilities."""
96 
97  try:
98  entry = async_get_entity_registry_entry_or_raise(hass, config[CONF_ENTITY_ID])
99  options = get_capability(hass, entry.entity_id, ATTR_OPTIONS) or []
100  except HomeAssistantError:
101  options = []
102 
103  return {
104  "extra_fields": vol.Schema(
105  {
106  vol.Optional(CONF_FROM): vol.In(options),
107  vol.Optional(CONF_TO): vol.In(options),
108  vol.Optional(CONF_FOR): cv.positive_time_period_dict,
109  }
110  )
111  }
er.RegistryEntry async_get_entity_registry_entry_or_raise(HomeAssistant hass, str entity_registry_id)
Definition: __init__.py:332
list[dict[str, str]] async_get_triggers(HomeAssistant hass, str device_id)
dict[str, vol.Schema] async_get_trigger_capabilities(HomeAssistant hass, ConfigType config)
CALLBACK_TYPE async_attach_trigger(HomeAssistant hass, ConfigType config, TriggerActionType action, TriggerInfo trigger_info)
Any|None get_capability(HomeAssistant hass, str entity_id, str capability)
Definition: entity.py:139