Home Assistant Unofficial Reference 2024.12.1
alarm_control_panel.py
Go to the documentation of this file.
1 """Support for Comelit VEDO system."""
2 
3 from __future__ import annotations
4 
5 import logging
6 
7 from aiocomelit.api import ComelitVedoAreaObject
8 from aiocomelit.const import ALARM_AREAS, AlarmAreaState
9 
11  AlarmControlPanelEntity,
12  AlarmControlPanelEntityFeature,
13  AlarmControlPanelState,
14  CodeFormat,
15 )
16 from homeassistant.config_entries import ConfigEntry
17 from homeassistant.core import HomeAssistant
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 from homeassistant.helpers.update_coordinator import CoordinatorEntity
20 
21 from .const import DOMAIN
22 from .coordinator import ComelitVedoSystem
23 
24 _LOGGER = logging.getLogger(__name__)
25 
26 AWAY = "away"
27 DISABLE = "disable"
28 HOME = "home"
29 HOME_P1 = "home_p1"
30 HOME_P2 = "home_p2"
31 NIGHT = "night"
32 
33 ALARM_ACTIONS: dict[str, str] = {
34  DISABLE: "dis", # Disarm
35  HOME: "p1", # Arm P1
36  NIGHT: "p12", # Arm P1+P2
37  AWAY: "tot", # Arm P1+P2 + IR / volumetric
38 }
39 
40 
41 ALARM_AREA_ARMED_STATUS: dict[str, int] = {
42  HOME_P1: 1,
43  HOME_P2: 2,
44  NIGHT: 3,
45  AWAY: 4,
46 }
47 
48 
50  hass: HomeAssistant,
51  config_entry: ConfigEntry,
52  async_add_entities: AddEntitiesCallback,
53 ) -> None:
54  """Set up the Comelit VEDO system alarm control panel devices."""
55 
56  coordinator: ComelitVedoSystem = hass.data[DOMAIN][config_entry.entry_id]
57 
59  ComelitAlarmEntity(coordinator, device, config_entry.entry_id)
60  for device in coordinator.data[ALARM_AREAS].values()
61  )
62 
63 
64 class ComelitAlarmEntity(CoordinatorEntity[ComelitVedoSystem], AlarmControlPanelEntity):
65  """Representation of a Ness alarm panel."""
66 
67  _attr_has_entity_name = True
68  _attr_name = None
69  _attr_code_format = CodeFormat.NUMBER
70  _attr_code_arm_required = False
71  _attr_supported_features = (
72  AlarmControlPanelEntityFeature.ARM_AWAY
73  | AlarmControlPanelEntityFeature.ARM_HOME
74  )
75 
76  def __init__(
77  self,
78  coordinator: ComelitVedoSystem,
79  area: ComelitVedoAreaObject,
80  config_entry_entry_id: str,
81  ) -> None:
82  """Initialize the alarm panel."""
83  self._api_api = coordinator.api
84  self._area_index_area_index = area.index
85  super().__init__(coordinator)
86  # Use config_entry.entry_id as base for unique_id
87  # because no serial number or mac is available
88  self._attr_unique_id_attr_unique_id = f"{config_entry_entry_id}-{area.index}"
89  self._attr_device_info_attr_device_info = coordinator.platform_device_info(area, "area")
90  if area.p2:
91  self._attr_supported_features_attr_supported_features |= AlarmControlPanelEntityFeature.ARM_NIGHT
92 
93  @property
94  def _area(self) -> ComelitVedoAreaObject:
95  """Return area object."""
96  return self.coordinator.data[ALARM_AREAS][self._area_index_area_index]
97 
98  @property
99  def available(self) -> bool:
100  """Return True if alarm is available."""
101  if self._area_area.human_status in [AlarmAreaState.ANOMALY, AlarmAreaState.UNKNOWN]:
102  return False
103  return super().available
104 
105  @property
106  def alarm_state(self) -> AlarmControlPanelState | None:
107  """Return the state of the alarm."""
108 
109  _LOGGER.debug(
110  "Area %s status is: %s. Armed is %s",
111  self._area_area.name,
112  self._area_area.human_status,
113  self._area_area.armed,
114  )
115  if self._area_area.human_status == AlarmAreaState.ARMED:
116  if self._area_area.armed == ALARM_AREA_ARMED_STATUS[AWAY]:
117  return AlarmControlPanelState.ARMED_AWAY
118  if self._area_area.armed == ALARM_AREA_ARMED_STATUS[NIGHT]:
119  return AlarmControlPanelState.ARMED_NIGHT
120  return AlarmControlPanelState.ARMED_HOME
121 
122  return {
123  AlarmAreaState.DISARMED: AlarmControlPanelState.DISARMED,
124  AlarmAreaState.ENTRY_DELAY: AlarmControlPanelState.DISARMING,
125  AlarmAreaState.EXIT_DELAY: AlarmControlPanelState.ARMING,
126  AlarmAreaState.TRIGGERED: AlarmControlPanelState.TRIGGERED,
127  }.get(self._area_area.human_status)
128 
129  async def async_alarm_disarm(self, code: str | None = None) -> None:
130  """Send disarm command."""
131  if code != str(self._api_api.device_pin):
132  return
133  await self._api_api.set_zone_status(self._area_area.index, ALARM_ACTIONS[DISABLE])
134 
135  async def async_alarm_arm_away(self, code: str | None = None) -> None:
136  """Send arm away command."""
137  await self._api_api.set_zone_status(self._area_area.index, ALARM_ACTIONS[AWAY])
138 
139  async def async_alarm_arm_home(self, code: str | None = None) -> None:
140  """Send arm home command."""
141  await self._api_api.set_zone_status(self._area_area.index, ALARM_ACTIONS[HOME])
142 
143  async def async_alarm_arm_night(self, code: str | None = None) -> None:
144  """Send arm night command."""
145  await self._api_api.set_zone_status(self._area_area.index, ALARM_ACTIONS[NIGHT])
None __init__(self, ComelitVedoSystem coordinator, ComelitVedoAreaObject area, str config_entry_entry_id)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
web.Response get(self, web.Request request, str config_key)
Definition: view.py:88