Home Assistant Unofficial Reference 2024.12.1
device_trigger.py
Go to the documentation of this file.
1 """Provides device triggers for KNX."""
2 
3 from __future__ import annotations
4 
5 from typing import Any, Final
6 
7 import voluptuous as vol
8 
10  DEVICE_TRIGGER_BASE_SCHEMA,
11  InvalidDeviceAutomationConfig,
12 )
13 from homeassistant.const import CONF_DEVICE_ID, CONF_DOMAIN, CONF_PLATFORM, CONF_TYPE
14 from homeassistant.core import CALLBACK_TYPE, HomeAssistant
15 from homeassistant.helpers import selector
16 from homeassistant.helpers.trigger import TriggerActionType, TriggerInfo
17 from homeassistant.helpers.typing import ConfigType
18 
19 from . import trigger
20 from .const import DOMAIN, KNX_MODULE_KEY
21 from .trigger import (
22  CONF_KNX_DESTINATION,
23  CONF_KNX_GROUP_VALUE_READ,
24  CONF_KNX_GROUP_VALUE_RESPONSE,
25  CONF_KNX_GROUP_VALUE_WRITE,
26  CONF_KNX_INCOMING,
27  CONF_KNX_OUTGOING,
28  PLATFORM_TYPE_TRIGGER_TELEGRAM,
29  TELEGRAM_TRIGGER_SCHEMA,
30  TRIGGER_SCHEMA as TRIGGER_TRIGGER_SCHEMA,
31 )
32 
33 TRIGGER_TELEGRAM: Final = "telegram"
34 
35 TRIGGER_SCHEMA: Final = DEVICE_TRIGGER_BASE_SCHEMA.extend(
36  {
37  vol.Required(CONF_TYPE): TRIGGER_TELEGRAM,
38  **TELEGRAM_TRIGGER_SCHEMA,
39  }
40 )
41 
42 
44  hass: HomeAssistant, device_id: str
45 ) -> list[dict[str, Any]]:
46  """List device triggers for KNX devices."""
47  triggers = []
48 
49  knx = hass.data[KNX_MODULE_KEY]
50  if knx.interface_device.device.id == device_id:
51  # Add trigger for KNX telegrams to interface device
52  triggers.append(
53  {
54  # Default fields when initializing the trigger
55  CONF_PLATFORM: "device",
56  CONF_DOMAIN: DOMAIN,
57  CONF_DEVICE_ID: device_id,
58  CONF_TYPE: TRIGGER_TELEGRAM,
59  }
60  )
61 
62  return triggers
63 
64 
66  hass: HomeAssistant, config: ConfigType
67 ) -> dict[str, vol.Schema]:
68  """List trigger capabilities."""
69  project = hass.data[KNX_MODULE_KEY].project
70  options = [
71  selector.SelectOptionDict(value=ga.address, label=f"{ga.address} - {ga.name}")
72  for ga in project.group_addresses.values()
73  ]
74  return {
75  "extra_fields": vol.Schema(
76  {
77  vol.Optional(CONF_KNX_DESTINATION): selector.SelectSelector(
78  selector.SelectSelectorConfig(
79  mode=selector.SelectSelectorMode.DROPDOWN,
80  multiple=True,
81  custom_value=True,
82  options=options,
83  ),
84  ),
85  vol.Optional(
86  CONF_KNX_GROUP_VALUE_WRITE, default=True
87  ): selector.BooleanSelector(),
88  vol.Optional(
89  CONF_KNX_GROUP_VALUE_RESPONSE, default=True
90  ): selector.BooleanSelector(),
91  vol.Optional(
92  CONF_KNX_GROUP_VALUE_READ, default=True
93  ): selector.BooleanSelector(),
94  vol.Optional(
95  CONF_KNX_INCOMING, default=True
96  ): selector.BooleanSelector(),
97  vol.Optional(
98  CONF_KNX_OUTGOING, default=True
99  ): selector.BooleanSelector(),
100  }
101  )
102  }
103 
104 
106  hass: HomeAssistant,
107  config: ConfigType,
108  action: TriggerActionType,
109  trigger_info: TriggerInfo,
110 ) -> CALLBACK_TYPE:
111  """Attach a trigger."""
112  # Remove device trigger specific fields and add trigger platform identifier
113  trigger_config = {
114  key: config[key] for key in (config.keys() & TELEGRAM_TRIGGER_SCHEMA.keys())
115  } | {CONF_PLATFORM: PLATFORM_TYPE_TRIGGER_TELEGRAM}
116 
117  try:
118  trigger_config = TRIGGER_TRIGGER_SCHEMA(trigger_config)
119  except vol.Invalid as err:
120  raise InvalidDeviceAutomationConfig(f"{err}") from err
121 
122  return await trigger.async_attach_trigger(
123  hass, config=trigger_config, action=action, trigger_info=trigger_info
124  )
CALLBACK_TYPE async_attach_trigger(HomeAssistant hass, ConfigType config, TriggerActionType action, TriggerInfo trigger_info)
dict[str, vol.Schema] async_get_trigger_capabilities(HomeAssistant hass, ConfigType config)
list[dict[str, Any]] async_get_triggers(HomeAssistant hass, str device_id)