Home Assistant Unofficial Reference 2024.12.1
device_trigger.py
Go to the documentation of this file.
1 """Provides device triggers for LCN."""
2 
3 from __future__ import annotations
4 
5 import voluptuous as vol
6 
7 from homeassistant.components.device_automation import DEVICE_TRIGGER_BASE_SCHEMA
9 from homeassistant.const import CONF_DEVICE_ID, CONF_DOMAIN, CONF_PLATFORM, CONF_TYPE
10 from homeassistant.core import CALLBACK_TYPE, HomeAssistant
11 from homeassistant.helpers import config_validation as cv, device_registry as dr
12 from homeassistant.helpers.trigger import TriggerActionType, TriggerInfo
13 from homeassistant.helpers.typing import ConfigType
14 
15 from .const import DOMAIN, KEY_ACTIONS, SENDKEYS
16 
17 TRIGGER_TYPES = {"transmitter", "transponder", "fingerprint", "codelock", "send_keys"}
18 
19 LCN_DEVICE_TRIGGER_BASE_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend(
20  {vol.Required(CONF_TYPE): vol.In(TRIGGER_TYPES)}
21 )
22 
23 ACCESS_CONTROL_SCHEMA = {vol.Optional("code"): vol.All(vol.Lower, cv.string)}
24 
25 TRANSMITTER_SCHEMA = {
26  **ACCESS_CONTROL_SCHEMA,
27  vol.Optional("level"): cv.positive_int,
28  vol.Optional("key"): cv.positive_int,
29  vol.Optional("action"): vol.In([action.lower() for action in KEY_ACTIONS]),
30 }
31 
32 SENDKEYS_SCHEMA = {
33  vol.Optional("key"): vol.In([key.lower() for key in SENDKEYS]),
34  vol.Optional("action"): vol.In([action.lower() for action in KEY_ACTIONS]),
35 }
36 
37 TRIGGER_SCHEMA = vol.Any(
38  LCN_DEVICE_TRIGGER_BASE_SCHEMA.extend(ACCESS_CONTROL_SCHEMA),
39  LCN_DEVICE_TRIGGER_BASE_SCHEMA.extend(TRANSMITTER_SCHEMA),
40  LCN_DEVICE_TRIGGER_BASE_SCHEMA.extend(SENDKEYS_SCHEMA),
41 )
42 
43 TYPE_SCHEMAS = {
44  "transmitter": {"extra_fields": vol.Schema(TRANSMITTER_SCHEMA)},
45  "transponder": {"extra_fields": vol.Schema(ACCESS_CONTROL_SCHEMA)},
46  "fingerprint": {"extra_fields": vol.Schema(ACCESS_CONTROL_SCHEMA)},
47  "codelock": {"extra_fields": vol.Schema(ACCESS_CONTROL_SCHEMA)},
48  "send_keys": {"extra_fields": vol.Schema(SENDKEYS_SCHEMA)},
49 }
50 
51 
53  hass: HomeAssistant, device_id: str
54 ) -> list[dict[str, str]]:
55  """List device triggers for LCN devices."""
56  device_registry = dr.async_get(hass)
57  if (device := device_registry.async_get(device_id)) is None:
58  return []
59 
60  identifier = next(iter(device.identifiers))
61  if (identifier[1].count("-") != 1) or device.model.startswith("LCN group"): # type: ignore[union-attr]
62  return []
63 
64  base_trigger = {
65  CONF_PLATFORM: "device",
66  CONF_DOMAIN: DOMAIN,
67  CONF_DEVICE_ID: device_id,
68  }
69 
70  return [{**base_trigger, CONF_TYPE: type_} for type_ in TRIGGER_TYPES]
71 
72 
74  hass: HomeAssistant,
75  config: ConfigType,
76  action: TriggerActionType,
77  trigger_info: TriggerInfo,
78 ) -> CALLBACK_TYPE:
79  """Attach a trigger."""
80  event_data = {
81  CONF_DEVICE_ID: config[CONF_DEVICE_ID],
82  **{
83  key: config[key]
84  for key in ("code", "level", "key", "action")
85  if key in config
86  },
87  }
88 
89  event_config = event.TRIGGER_SCHEMA(
90  {
91  event.CONF_PLATFORM: "event",
92  event.CONF_EVENT_TYPE: f"lcn_{config[CONF_TYPE]}",
93  event.CONF_EVENT_DATA: event_data,
94  }
95  )
96 
97  return await event.async_attach_trigger(
98  hass, event_config, action, trigger_info, platform_type="device"
99  )
100 
101 
103  hass: HomeAssistant, config: ConfigType
104 ) -> dict[str, vol.Schema]:
105  """List trigger capabilities."""
106  return TYPE_SCHEMAS.get(config[CONF_TYPE], {})
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, str]] async_get_triggers(HomeAssistant hass, str device_id)