Home Assistant Unofficial Reference 2024.12.1
device_trigger.py
Go to the documentation of this file.
1 """Provides device automations for RFXCOM RFXtrx."""
2 
3 from __future__ import annotations
4 
5 import voluptuous as vol
6 
8  DEVICE_TRIGGER_BASE_SCHEMA,
9  InvalidDeviceAutomationConfig,
10 )
11 from homeassistant.components.homeassistant.triggers import event as event_trigger
12 from homeassistant.const import (
13  ATTR_DEVICE_ID,
14  CONF_DEVICE_ID,
15  CONF_DOMAIN,
16  CONF_PLATFORM,
17  CONF_TYPE,
18 )
19 from homeassistant.core import CALLBACK_TYPE, HomeAssistant
20 from homeassistant.helpers.trigger import TriggerActionType, TriggerInfo
21 from homeassistant.helpers.typing import ConfigType
22 
23 from . import DOMAIN
24 from .const import EVENT_RFXTRX_EVENT
25 from .helpers import async_get_device_object
26 
27 CONF_SUBTYPE = "subtype"
28 
29 CONF_TYPE_COMMAND = "command"
30 CONF_TYPE_STATUS = "status"
31 
32 TRIGGER_SELECTION = {
33  CONF_TYPE_COMMAND: "COMMANDS",
34  CONF_TYPE_STATUS: "STATUS",
35 }
36 TRIGGER_TYPES = [
37  CONF_TYPE_COMMAND,
38  CONF_TYPE_STATUS,
39 ]
40 TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend(
41  {
42  vol.Required(CONF_TYPE): vol.In(TRIGGER_TYPES),
43  vol.Required(CONF_SUBTYPE): str,
44  }
45 )
46 
47 
49  hass: HomeAssistant, device_id: str
50 ) -> list[dict[str, str]]:
51  """List device triggers for RFXCOM RFXtrx devices."""
52  device = async_get_device_object(hass, device_id)
53 
54  return [
55  {
56  CONF_PLATFORM: "device",
57  CONF_DEVICE_ID: device_id,
58  CONF_DOMAIN: DOMAIN,
59  CONF_TYPE: conf_type,
60  CONF_SUBTYPE: command,
61  }
62  for conf_type in TRIGGER_TYPES
63  for command in getattr(device, TRIGGER_SELECTION[conf_type], {}).values()
64  ]
65 
66 
68  hass: HomeAssistant, config: ConfigType
69 ) -> ConfigType:
70  """Validate config."""
71  config = TRIGGER_SCHEMA(config)
72 
73  device = async_get_device_object(hass, config[CONF_DEVICE_ID])
74 
75  action_type = config[CONF_TYPE]
76  sub_type = config[CONF_SUBTYPE]
77  commands = getattr(device, TRIGGER_SELECTION[action_type], {})
78  if config[CONF_SUBTYPE] not in commands.values():
80  f"Subtype {sub_type} not found in device triggers {commands}"
81  )
82 
83  return config
84 
85 
87  hass: HomeAssistant,
88  config: ConfigType,
89  action: TriggerActionType,
90  trigger_info: TriggerInfo,
91 ) -> CALLBACK_TYPE:
92  """Attach a trigger."""
93  config = TRIGGER_SCHEMA(config)
94 
95  event_data = {ATTR_DEVICE_ID: config[CONF_DEVICE_ID]}
96 
97  if config[CONF_TYPE] == CONF_TYPE_COMMAND:
98  event_data["values"] = {"Command": config[CONF_SUBTYPE]}
99  elif config[CONF_TYPE] == CONF_TYPE_STATUS:
100  event_data["values"] = {"Status": config[CONF_SUBTYPE]}
101 
102  event_config = event_trigger.TRIGGER_SCHEMA(
103  {
104  event_trigger.CONF_PLATFORM: "event",
105  event_trigger.CONF_EVENT_TYPE: EVENT_RFXTRX_EVENT,
106  event_trigger.CONF_EVENT_DATA: event_data,
107  }
108  )
109 
110  return await event_trigger.async_attach_trigger(
111  hass, event_config, action, trigger_info, platform_type="device"
112  )
CALLBACK_TYPE async_attach_trigger(HomeAssistant hass, ConfigType config, TriggerActionType action, TriggerInfo trigger_info)
ConfigType async_validate_trigger_config(HomeAssistant hass, ConfigType config)
list[dict[str, str]] async_get_triggers(HomeAssistant hass, str device_id)
RFXtrxDevice async_get_device_object(HomeAssistant hass, str device_id)
Definition: helpers.py:12