Home Assistant Unofficial Reference 2024.12.1
alarm_control_panel.py
Go to the documentation of this file.
1 """Support for Verisure alarm control panels."""
2 
3 from __future__ import annotations
4 
5 import asyncio
6 
8  AlarmControlPanelEntity,
9  AlarmControlPanelEntityFeature,
10  AlarmControlPanelState,
11  CodeFormat,
12 )
13 from homeassistant.config_entries import ConfigEntry
14 from homeassistant.core import HomeAssistant, callback
15 from homeassistant.helpers.device_registry import DeviceInfo
16 from homeassistant.helpers.entity_platform import AddEntitiesCallback
17 from homeassistant.helpers.update_coordinator import CoordinatorEntity
18 
19 from .const import ALARM_STATE_TO_HA, CONF_GIID, DOMAIN, LOGGER
20 from .coordinator import VerisureDataUpdateCoordinator
21 
22 
24  hass: HomeAssistant,
25  entry: ConfigEntry,
26  async_add_entities: AddEntitiesCallback,
27 ) -> None:
28  """Set up Verisure alarm control panel from a config entry."""
29  async_add_entities([VerisureAlarm(coordinator=hass.data[DOMAIN][entry.entry_id])])
30 
31 
33  CoordinatorEntity[VerisureDataUpdateCoordinator], AlarmControlPanelEntity
34 ):
35  """Representation of a Verisure alarm status."""
36 
37  _attr_code_format = CodeFormat.NUMBER
38  _attr_has_entity_name = True
39  _attr_name = None
40  _attr_supported_features = (
41  AlarmControlPanelEntityFeature.ARM_HOME
42  | AlarmControlPanelEntityFeature.ARM_AWAY
43  )
44 
45  @property
46  def device_info(self) -> DeviceInfo:
47  """Return device information about this entity."""
48  return DeviceInfo(
49  name="Verisure Alarm",
50  manufacturer="Verisure",
51  model="VBox",
52  identifiers={(DOMAIN, self.coordinator.entry.data[CONF_GIID])},
53  configuration_url="https://mypages.verisure.com",
54  )
55 
56  @property
57  def unique_id(self) -> str:
58  """Return the unique ID for this entity."""
59  return self.coordinator.entry.data[CONF_GIID]
60 
62  self, state: str, command_data: dict[str, str | dict[str, str]]
63  ) -> None:
64  """Send set arm state command."""
65  arm_state = await self.hasshasshass.async_add_executor_job(
66  self.coordinator.verisure.request, command_data
67  )
68  LOGGER.debug("Verisure set arm state %s", state)
69  result = None
70  while result is None:
71  await asyncio.sleep(0.5)
72  transaction = await self.hasshasshass.async_add_executor_job(
73  self.coordinator.verisure.request,
74  self.coordinator.verisure.poll_arm_state(
75  list(arm_state["data"].values())[0], state
76  ),
77  )
78  result = (
79  transaction.get("data", {})
80  .get("installation", {})
81  .get("armStateChangePollResult", {})
82  .get("result")
83  )
84 
85  await self.coordinator.async_refresh()
86 
87  async def async_alarm_disarm(self, code: str | None = None) -> None:
88  """Send disarm command."""
89  self._attr_alarm_state_attr_alarm_state = AlarmControlPanelState.DISARMING
90  self.async_write_ha_stateasync_write_ha_state()
91  await self._async_set_arm_state_async_set_arm_state(
92  "DISARMED", self.coordinator.verisure.disarm(code)
93  )
94 
95  async def async_alarm_arm_home(self, code: str | None = None) -> None:
96  """Send arm home command."""
97  self._attr_alarm_state_attr_alarm_state = AlarmControlPanelState.ARMING
98  self.async_write_ha_stateasync_write_ha_state()
99  await self._async_set_arm_state_async_set_arm_state(
100  "ARMED_HOME", self.coordinator.verisure.arm_home(code)
101  )
102 
103  async def async_alarm_arm_away(self, code: str | None = None) -> None:
104  """Send arm away command."""
105  self._attr_alarm_state_attr_alarm_state = AlarmControlPanelState.ARMING
106  self.async_write_ha_stateasync_write_ha_state()
107  await self._async_set_arm_state_async_set_arm_state(
108  "ARMED_AWAY", self.coordinator.verisure.arm_away(code)
109  )
110 
111  @callback
112  def _handle_coordinator_update(self) -> None:
113  """Handle updated data from the coordinator."""
114  self._attr_alarm_state_attr_alarm_state = ALARM_STATE_TO_HA.get(
115  self.coordinator.data["alarm"]["statusType"]
116  )
117  self._attr_changed_by_attr_changed_by = self.coordinator.data["alarm"].get("name")
119 
120  async def async_added_to_hass(self) -> None:
121  """When entity is added to hass."""
122  await super().async_added_to_hass()
123  self._handle_coordinator_update_handle_coordinator_update()
None _async_set_arm_state(self, str state, dict[str, str|dict[str, str]] command_data)
web.Response get(self, web.Request request, str config_key)
Definition: view.py:88
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)