Home Assistant Unofficial Reference 2024.12.1
alarm_control_panel.py
Go to the documentation of this file.
1 """Interfaces with Egardia/Woonveilig alarm control panel."""
2 
3 from __future__ import annotations
4 
5 import logging
6 
7 import requests
8 
10  AlarmControlPanelEntity,
11  AlarmControlPanelEntityFeature,
12  AlarmControlPanelState,
13 )
14 from homeassistant.core import HomeAssistant
15 from homeassistant.helpers.entity_platform import AddEntitiesCallback
16 from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
17 
18 from . import (
19  CONF_REPORT_SERVER_CODES,
20  CONF_REPORT_SERVER_ENABLED,
21  CONF_REPORT_SERVER_PORT,
22  EGARDIA_DEVICE,
23  EGARDIA_SERVER,
24  REPORT_SERVER_CODES_IGNORE,
25 )
26 
27 _LOGGER = logging.getLogger(__name__)
28 
29 STATES = {
30  "ARM": AlarmControlPanelState.ARMED_AWAY,
31  "DAY HOME": AlarmControlPanelState.ARMED_HOME,
32  "DISARM": AlarmControlPanelState.DISARMED,
33  "ARMHOME": AlarmControlPanelState.ARMED_HOME,
34  "HOME": AlarmControlPanelState.ARMED_HOME,
35  "NIGHT HOME": AlarmControlPanelState.ARMED_NIGHT,
36  "TRIGGERED": AlarmControlPanelState.TRIGGERED,
37 }
38 
39 
41  hass: HomeAssistant,
42  config: ConfigType,
43  add_entities: AddEntitiesCallback,
44  discovery_info: DiscoveryInfoType | None = None,
45 ) -> None:
46  """Set up the Egardia Alarm Control Panael platform."""
47  if discovery_info is None:
48  return
49  device = EgardiaAlarm(
50  discovery_info["name"],
51  hass.data[EGARDIA_DEVICE],
52  discovery_info[CONF_REPORT_SERVER_ENABLED],
53  discovery_info.get(CONF_REPORT_SERVER_CODES),
54  discovery_info[CONF_REPORT_SERVER_PORT],
55  )
56 
57  add_entities([device], True)
58 
59 
61  """Representation of a Egardia alarm."""
62 
63  _attr_code_arm_required = False
64  _attr_supported_features = (
65  AlarmControlPanelEntityFeature.ARM_HOME
66  | AlarmControlPanelEntityFeature.ARM_AWAY
67  )
68 
69  def __init__(
70  self, name, egardiasystem, rs_enabled=False, rs_codes=None, rs_port=52010
71  ):
72  """Initialize the Egardia alarm."""
73  self._attr_name_attr_name = name
74  self._egardiasystem_egardiasystem = egardiasystem
75  self._rs_enabled_rs_enabled = rs_enabled
76  self._rs_codes_rs_codes = rs_codes
77  self._rs_port_rs_port = rs_port
78 
79  async def async_added_to_hass(self) -> None:
80  """Add Egardiaserver callback if enabled."""
81  if self._rs_enabled_rs_enabled:
82  _LOGGER.debug("Registering callback to Egardiaserver")
83  self.hasshass.data[EGARDIA_SERVER].register_callback(self.handle_status_eventhandle_status_event)
84 
85  @property
86  def should_poll(self) -> bool:
87  """Poll if no report server is enabled."""
88  if not self._rs_enabled_rs_enabled:
89  return True
90  return False
91 
92  def handle_status_event(self, event):
93  """Handle the Egardia system status event."""
94  if (statuscode := event.get("status")) is not None:
95  status = self.lookupstatusfromcodelookupstatusfromcode(statuscode)
96  self.parsestatusparsestatus(status)
97  self.schedule_update_ha_stateschedule_update_ha_state()
98 
99  def lookupstatusfromcode(self, statuscode):
100  """Look at the rs_codes and returns the status from the code."""
101  return next(
102  (
103  status_group.upper()
104  for status_group, codes in self._rs_codes_rs_codes.items()
105  for code in codes
106  if statuscode == code
107  ),
108  "UNKNOWN",
109  )
110 
111  def parsestatus(self, status):
112  """Parse the status."""
113  _LOGGER.debug("Parsing status %s", status)
114  # Ignore the statuscode if it is IGNORE
115  if status.lower().strip() != REPORT_SERVER_CODES_IGNORE:
116  _LOGGER.debug("Not ignoring status %s", status)
117  newstatus = STATES.get(status.upper())
118  _LOGGER.debug("newstatus %s", newstatus)
119  self._attr_alarm_state_attr_alarm_state = newstatus
120  else:
121  _LOGGER.error("Ignoring status")
122 
123  def update(self) -> None:
124  """Update the alarm status."""
125  status = self._egardiasystem_egardiasystem.getstate()
126  self.parsestatusparsestatus(status)
127 
128  def alarm_disarm(self, code: str | None = None) -> None:
129  """Send disarm command."""
130  try:
131  self._egardiasystem_egardiasystem.alarm_disarm()
132  except requests.exceptions.RequestException as err:
133  _LOGGER.error(
134  "Egardia device exception occurred when sending disarm command: %s",
135  err,
136  )
137 
138  def alarm_arm_home(self, code: str | None = None) -> None:
139  """Send arm home command."""
140  try:
141  self._egardiasystem_egardiasystem.alarm_arm_home()
142  except requests.exceptions.RequestException as err:
143  _LOGGER.error(
144  "Egardia device exception occurred when sending arm home command: %s",
145  err,
146  )
147 
148  def alarm_arm_away(self, code: str | None = None) -> None:
149  """Send arm away command."""
150  try:
151  self._egardiasystem_egardiasystem.alarm_arm_away()
152  except requests.exceptions.RequestException as err:
153  _LOGGER.error(
154  "Egardia device exception occurred when sending arm away command: %s",
155  err,
156  )
def __init__(self, name, egardiasystem, rs_enabled=False, rs_codes=None, rs_port=52010)
None schedule_update_ha_state(self, bool force_refresh=False)
Definition: entity.py:1244
None add_entities(AsusWrtRouter router, AddEntitiesCallback async_add_entities, set[str] tracked)
None setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback add_entities, DiscoveryInfoType|None discovery_info=None)