Home Assistant Unofficial Reference 2024.12.1
alarm_control_panel.py
Go to the documentation of this file.
1 """Support for Yale Alarm."""
2 
3 from __future__ import annotations
4 
5 from typing import TYPE_CHECKING
6 
7 from yalesmartalarmclient.const import (
8  YALE_STATE_ARM_FULL,
9  YALE_STATE_ARM_PARTIAL,
10  YALE_STATE_DISARM,
11 )
12 
14  AlarmControlPanelEntity,
15  AlarmControlPanelEntityFeature,
16  AlarmControlPanelState,
17 )
18 from homeassistant.const import CONF_NAME
19 from homeassistant.core import HomeAssistant
20 from homeassistant.exceptions import HomeAssistantError
21 from homeassistant.helpers.entity_platform import AddEntitiesCallback
22 
23 from . import YaleConfigEntry
24 from .const import DOMAIN, STATE_MAP, YALE_ALL_ERRORS
25 from .coordinator import YaleDataUpdateCoordinator
26 from .entity import YaleAlarmEntity
27 
28 
30  hass: HomeAssistant, entry: YaleConfigEntry, async_add_entities: AddEntitiesCallback
31 ) -> None:
32  """Set up the alarm entry."""
33 
34  async_add_entities([YaleAlarmDevice(coordinator=entry.runtime_data)])
35 
36 
38  """Represent a Yale Smart Alarm."""
39 
40  _attr_code_arm_required = False
41  _attr_supported_features = (
42  AlarmControlPanelEntityFeature.ARM_HOME
43  | AlarmControlPanelEntityFeature.ARM_AWAY
44  )
45  _attr_name = None
46 
47  def __init__(self, coordinator: YaleDataUpdateCoordinator) -> None:
48  """Initialize the Yale Alarm Device."""
49  super().__init__(coordinator)
50  self._attr_unique_id_attr_unique_id = coordinator.entry.entry_id
51 
52  async def async_alarm_disarm(self, code: str | None = None) -> None:
53  """Send disarm command."""
54  return await self.async_set_alarmasync_set_alarm(YALE_STATE_DISARM, code)
55 
56  async def async_alarm_arm_home(self, code: str | None = None) -> None:
57  """Send arm home command."""
58  return await self.async_set_alarmasync_set_alarm(YALE_STATE_ARM_PARTIAL, code)
59 
60  async def async_alarm_arm_away(self, code: str | None = None) -> None:
61  """Send arm away command."""
62  return await self.async_set_alarmasync_set_alarm(YALE_STATE_ARM_FULL, code)
63 
64  async def async_set_alarm(self, command: str, code: str | None = None) -> None:
65  """Set alarm."""
66  if TYPE_CHECKING:
67  assert self.coordinator.yale, "Connection to API is missing"
68 
69  try:
70  if command == YALE_STATE_ARM_FULL:
71  alarm_state = await self.hasshasshass.async_add_executor_job(
72  self.coordinator.yale.arm_full
73  )
74  if command == YALE_STATE_ARM_PARTIAL:
75  alarm_state = await self.hasshasshass.async_add_executor_job(
76  self.coordinator.yale.arm_partial
77  )
78  if command == YALE_STATE_DISARM:
79  alarm_state = await self.hasshasshass.async_add_executor_job(
80  self.coordinator.yale.disarm
81  )
82  except YALE_ALL_ERRORS as error:
83  raise HomeAssistantError(
84  translation_domain=DOMAIN,
85  translation_key="set_alarm",
86  translation_placeholders={
87  "name": self.coordinator.entry.data[CONF_NAME],
88  "error": str(error),
89  },
90  ) from error
91 
92  if alarm_state:
93  self.coordinator.data["alarm"] = command
94  self.async_write_ha_stateasync_write_ha_state()
95  return
96  raise HomeAssistantError(
97  translation_domain=DOMAIN,
98  translation_key="could_not_change_alarm",
99  )
100 
101  @property
102  def available(self) -> bool:
103  """Return True if alarm is available."""
104  if STATE_MAP.get(self.coordinator.data["alarm"]) is None:
105  return False
106  return super().available
107 
108  @property
109  def alarm_state(self) -> AlarmControlPanelState | None:
110  """Return the state of the alarm."""
111  return STATE_MAP.get(self.coordinator.data["alarm"])
None async_setup_entry(HomeAssistant hass, YaleConfigEntry entry, AddEntitiesCallback async_add_entities)