Home Assistant Unofficial Reference 2024.12.1
alarm_control_panel.py
Go to the documentation of this file.
1 """Support for deCONZ alarm control panel devices."""
2 
3 from __future__ import annotations
4 
5 from pydeconz.models.alarm_system import AlarmSystemArmAction
6 from pydeconz.models.event import EventType
7 from pydeconz.models.sensor.ancillary_control import (
8  AncillaryControl,
9  AncillaryControlPanel,
10 )
11 
13  DOMAIN as ALARM_CONTROl_PANEL_DOMAIN,
14  AlarmControlPanelEntity,
15  AlarmControlPanelEntityFeature,
16  AlarmControlPanelState,
17  CodeFormat,
18 )
19 from homeassistant.config_entries import ConfigEntry
20 from homeassistant.core import HomeAssistant, callback
21 from homeassistant.helpers.entity_platform import AddEntitiesCallback
22 
23 from .entity import DeconzDevice
24 from .hub import DeconzHub
25 
26 DECONZ_TO_ALARM_STATE = {
27  AncillaryControlPanel.ARMED_AWAY: AlarmControlPanelState.ARMED_AWAY,
28  AncillaryControlPanel.ARMED_NIGHT: AlarmControlPanelState.ARMED_NIGHT,
29  AncillaryControlPanel.ARMED_STAY: AlarmControlPanelState.ARMED_HOME,
30  AncillaryControlPanel.ARMING_AWAY: AlarmControlPanelState.ARMING,
31  AncillaryControlPanel.ARMING_NIGHT: AlarmControlPanelState.ARMING,
32  AncillaryControlPanel.ARMING_STAY: AlarmControlPanelState.ARMING,
33  AncillaryControlPanel.DISARMED: AlarmControlPanelState.DISARMED,
34  AncillaryControlPanel.ENTRY_DELAY: AlarmControlPanelState.PENDING,
35  AncillaryControlPanel.EXIT_DELAY: AlarmControlPanelState.PENDING,
36  AncillaryControlPanel.IN_ALARM: AlarmControlPanelState.TRIGGERED,
37 }
38 
39 
40 def get_alarm_system_id_for_unique_id(hub: DeconzHub, unique_id: str) -> str | None:
41  """Retrieve alarm system ID the unique ID is registered to."""
42  for alarm_system in hub.api.alarm_systems.values():
43  if unique_id in alarm_system.devices:
44  return alarm_system.resource_id
45  return None
46 
47 
49  hass: HomeAssistant,
50  config_entry: ConfigEntry,
51  async_add_entities: AddEntitiesCallback,
52 ) -> None:
53  """Set up the deCONZ alarm control panel devices."""
54  hub = DeconzHub.get_hub(hass, config_entry)
55  hub.entities[ALARM_CONTROl_PANEL_DOMAIN] = set()
56 
57  @callback
58  def async_add_sensor(_: EventType, sensor_id: str) -> None:
59  """Add alarm control panel devices from deCONZ."""
60  sensor = hub.api.sensors.ancillary_control[sensor_id]
61  if alarm_system_id := get_alarm_system_id_for_unique_id(hub, sensor.unique_id):
62  async_add_entities([DeconzAlarmControlPanel(sensor, hub, alarm_system_id)])
63 
64  hub.register_platform_add_device_callback(
65  async_add_sensor,
66  hub.api.sensors.ancillary_control,
67  )
68 
69 
70 class DeconzAlarmControlPanel(DeconzDevice[AncillaryControl], AlarmControlPanelEntity):
71  """Representation of a deCONZ alarm control panel."""
72 
73  _update_key = "panel"
74  TYPE = ALARM_CONTROl_PANEL_DOMAIN
75 
76  _attr_code_format = CodeFormat.NUMBER
77  _attr_supported_features = (
78  AlarmControlPanelEntityFeature.ARM_AWAY
79  | AlarmControlPanelEntityFeature.ARM_HOME
80  | AlarmControlPanelEntityFeature.ARM_NIGHT
81  )
82 
83  def __init__(
84  self,
85  device: AncillaryControl,
86  hub: DeconzHub,
87  alarm_system_id: str,
88  ) -> None:
89  """Set up alarm control panel device."""
90  super().__init__(device, hub)
91  self.alarm_system_idalarm_system_id = alarm_system_id
92 
93  @callback
94  def async_update_callback(self) -> None:
95  """Update the control panels state."""
96  if self._device.panel in DECONZ_TO_ALARM_STATE:
97  super().async_update_callback()
98 
99  @property
100  def alarm_state(self) -> AlarmControlPanelState | None:
101  """Return the state of the control panel."""
102  if self._device.panel in DECONZ_TO_ALARM_STATE:
103  return DECONZ_TO_ALARM_STATE[self._device.panel]
104  return None
105 
106  async def async_alarm_arm_away(self, code: str | None = None) -> None:
107  """Send arm away command."""
108  if code:
109  await self.hub.api.alarm_systems.arm(
110  self.alarm_system_idalarm_system_id, AlarmSystemArmAction.AWAY, code
111  )
112 
113  async def async_alarm_arm_home(self, code: str | None = None) -> None:
114  """Send arm home command."""
115  if code:
116  await self.hub.api.alarm_systems.arm(
117  self.alarm_system_idalarm_system_id, AlarmSystemArmAction.STAY, code
118  )
119 
120  async def async_alarm_arm_night(self, code: str | None = None) -> None:
121  """Send arm night command."""
122  if code:
123  await self.hub.api.alarm_systems.arm(
124  self.alarm_system_idalarm_system_id, AlarmSystemArmAction.NIGHT, code
125  )
126 
127  async def async_alarm_disarm(self, code: str | None = None) -> None:
128  """Send disarm command."""
129  if code:
130  await self.hub.api.alarm_systems.arm(
131  self.alarm_system_idalarm_system_id, AlarmSystemArmAction.DISARM, code
132  )
None __init__(self, AncillaryControl device, DeconzHub hub, str alarm_system_id)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
str|None get_alarm_system_id_for_unique_id(DeconzHub hub, str unique_id)