Home Assistant Unofficial Reference 2024.12.1
device_trigger.py
Go to the documentation of this file.
1 """Provides device automations for Alarm control panel."""
2 
3 from __future__ import annotations
4 
5 from typing import Final
6 
7 import voluptuous as vol
8 
9 from homeassistant.components.device_automation import DEVICE_TRIGGER_BASE_SCHEMA
10 from homeassistant.components.homeassistant.triggers import state as state_trigger
11 from homeassistant.const import (
12  CONF_DEVICE_ID,
13  CONF_DOMAIN,
14  CONF_ENTITY_ID,
15  CONF_FOR,
16  CONF_PLATFORM,
17  CONF_TYPE,
18 )
19 from homeassistant.core import CALLBACK_TYPE, HomeAssistant
20 from homeassistant.helpers import config_validation as cv, entity_registry as er
21 from homeassistant.helpers.entity import get_supported_features
22 from homeassistant.helpers.trigger import TriggerActionType, TriggerInfo
23 from homeassistant.helpers.typing import ConfigType
24 
25 from . import DOMAIN, AlarmControlPanelState
26 from .const import AlarmControlPanelEntityFeature
27 
28 BASIC_TRIGGER_TYPES: Final[set[str]] = {"triggered", "disarmed", "arming"}
29 TRIGGER_TYPES: Final[set[str]] = BASIC_TRIGGER_TYPES | {
30  "armed_home",
31  "armed_away",
32  "armed_night",
33  "armed_vacation",
34 }
35 
36 TRIGGER_SCHEMA: Final = 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_FOR): cv.positive_time_period_dict,
41  }
42 )
43 
44 
46  hass: HomeAssistant, device_id: str
47 ) -> list[dict[str, str]]:
48  """List device triggers for Alarm control panel devices."""
49  registry = er.async_get(hass)
50  triggers: list[dict[str, str]] = []
51 
52  # Get all the integrations entities for this device
53  for entry in er.async_entries_for_device(registry, device_id):
54  if entry.domain != DOMAIN:
55  continue
56 
57  supported_features = get_supported_features(hass, entry.entity_id)
58 
59  # Add triggers for each entity that belongs to this integration
60  base_trigger = {
61  CONF_PLATFORM: "device",
62  CONF_DEVICE_ID: device_id,
63  CONF_DOMAIN: DOMAIN,
64  CONF_ENTITY_ID: entry.id,
65  }
66 
67  triggers += [
68  {
69  **base_trigger,
70  CONF_TYPE: trigger,
71  }
72  for trigger in BASIC_TRIGGER_TYPES
73  ]
74  if supported_features & AlarmControlPanelEntityFeature.ARM_HOME:
75  triggers.append(
76  {
77  **base_trigger,
78  CONF_TYPE: "armed_home",
79  }
80  )
81  if supported_features & AlarmControlPanelEntityFeature.ARM_AWAY:
82  triggers.append(
83  {
84  **base_trigger,
85  CONF_TYPE: "armed_away",
86  }
87  )
88  if supported_features & AlarmControlPanelEntityFeature.ARM_NIGHT:
89  triggers.append(
90  {
91  **base_trigger,
92  CONF_TYPE: "armed_night",
93  }
94  )
95  if supported_features & AlarmControlPanelEntityFeature.ARM_VACATION:
96  triggers.append(
97  {
98  **base_trigger,
99  CONF_TYPE: "armed_vacation",
100  }
101  )
102 
103  return triggers
104 
105 
107  hass: HomeAssistant, config: ConfigType
108 ) -> dict[str, vol.Schema]:
109  """List trigger capabilities."""
110  return {
111  "extra_fields": vol.Schema(
112  {vol.Optional(CONF_FOR): cv.positive_time_period_dict}
113  )
114  }
115 
116 
118  hass: HomeAssistant,
119  config: ConfigType,
120  action: TriggerActionType,
121  trigger_info: TriggerInfo,
122 ) -> CALLBACK_TYPE:
123  """Attach a trigger."""
124  if config[CONF_TYPE] == "triggered":
125  to_state = AlarmControlPanelState.TRIGGERED
126  elif config[CONF_TYPE] == "disarmed":
127  to_state = AlarmControlPanelState.DISARMED
128  elif config[CONF_TYPE] == "arming":
129  to_state = AlarmControlPanelState.ARMING
130  elif config[CONF_TYPE] == "armed_home":
131  to_state = AlarmControlPanelState.ARMED_HOME
132  elif config[CONF_TYPE] == "armed_away":
133  to_state = AlarmControlPanelState.ARMED_AWAY
134  elif config[CONF_TYPE] == "armed_night":
135  to_state = AlarmControlPanelState.ARMED_NIGHT
136  elif config[CONF_TYPE] == "armed_vacation":
137  to_state = AlarmControlPanelState.ARMED_VACATION
138 
139  state_config = {
140  state_trigger.CONF_PLATFORM: "state",
141  CONF_ENTITY_ID: config[CONF_ENTITY_ID],
142  state_trigger.CONF_TO: to_state,
143  }
144  if CONF_FOR in config:
145  state_config[CONF_FOR] = config[CONF_FOR]
146  state_config = await state_trigger.async_validate_trigger_config(hass, state_config)
147  return await state_trigger.async_attach_trigger(
148  hass, state_config, action, trigger_info, platform_type="device"
149  )
list[dict[str, str]] async_get_triggers(HomeAssistant hass, str device_id)
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)
int get_supported_features(HomeAssistant hass, str entity_id)
Definition: entity.py:169