Home Assistant Unofficial Reference 2024.12.1
alarm_control_panel.py
Go to the documentation of this file.
1 """Support for Canary alarm."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
7 from canary.const import LOCATION_MODE_AWAY, LOCATION_MODE_HOME, LOCATION_MODE_NIGHT
8 from canary.model import Location
9 
11  AlarmControlPanelEntity,
12  AlarmControlPanelEntityFeature,
13  AlarmControlPanelState,
14 )
15 from homeassistant.config_entries import ConfigEntry
16 from homeassistant.core import HomeAssistant
17 from homeassistant.helpers.entity_platform import AddEntitiesCallback
18 from homeassistant.helpers.update_coordinator import CoordinatorEntity
19 
20 from .const import DATA_COORDINATOR, DOMAIN
21 from .coordinator import CanaryDataUpdateCoordinator
22 
23 
25  hass: HomeAssistant,
26  entry: ConfigEntry,
27  async_add_entities: AddEntitiesCallback,
28 ) -> None:
29  """Set up Canary alarm control panels based on a config entry."""
30  coordinator: CanaryDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id][
31  DATA_COORDINATOR
32  ]
33  alarms = [
34  CanaryAlarm(coordinator, location)
35  for location_id, location in coordinator.data["locations"].items()
36  ]
37 
38  async_add_entities(alarms, True)
39 
40 
42  CoordinatorEntity[CanaryDataUpdateCoordinator], AlarmControlPanelEntity
43 ):
44  """Representation of a Canary alarm control panel."""
45 
46  _attr_supported_features = (
47  AlarmControlPanelEntityFeature.ARM_HOME
48  | AlarmControlPanelEntityFeature.ARM_AWAY
49  | AlarmControlPanelEntityFeature.ARM_NIGHT
50  )
51  _attr_code_arm_required = False
52 
53  def __init__(
54  self, coordinator: CanaryDataUpdateCoordinator, location: Location
55  ) -> None:
56  """Initialize a Canary security camera."""
57  super().__init__(coordinator)
58  self._location_id: str = location.location_id
59  self._attr_name_attr_name = location.name
60  self._attr_unique_id_attr_unique_id = str(self._location_id)
61 
62  @property
63  def location(self) -> Location:
64  """Return information about the location."""
65  return self.coordinator.data["locations"][self._location_id]
66 
67  @property
68  def alarm_state(self) -> AlarmControlPanelState | None:
69  """Return the state of the device."""
70  if self.locationlocation.is_private:
71  return AlarmControlPanelState.DISARMED
72 
73  mode = self.locationlocation.mode
74  if mode.name == LOCATION_MODE_AWAY:
75  return AlarmControlPanelState.ARMED_AWAY
76  if mode.name == LOCATION_MODE_HOME:
77  return AlarmControlPanelState.ARMED_HOME
78  if mode.name == LOCATION_MODE_NIGHT:
79  return AlarmControlPanelState.ARMED_NIGHT
80 
81  return None
82 
83  @property
84  def extra_state_attributes(self) -> dict[str, Any]:
85  """Return the state attributes."""
86  return {"private": self.locationlocation.is_private}
87 
88  def alarm_disarm(self, code: str | None = None) -> None:
89  """Send disarm command."""
90  self.coordinator.canary.set_location_mode(
91  self._location_id, self.locationlocation.mode.name, True
92  )
93 
94  def alarm_arm_home(self, code: str | None = None) -> None:
95  """Send arm home command."""
96  self.coordinator.canary.set_location_mode(self._location_id, LOCATION_MODE_HOME)
97 
98  def alarm_arm_away(self, code: str | None = None) -> None:
99  """Send arm away command."""
100  self.coordinator.canary.set_location_mode(self._location_id, LOCATION_MODE_AWAY)
101 
102  def alarm_arm_night(self, code: str | None = None) -> None:
103  """Send arm night command."""
104  self.coordinator.canary.set_location_mode(
105  self._location_id, LOCATION_MODE_NIGHT
106  )
None __init__(self, CanaryDataUpdateCoordinator coordinator, Location location)
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)