Home Assistant Unofficial Reference 2024.12.1
alarm_control_panel.py
Go to the documentation of this file.
1 """Support for Blink Alarm Control Panel."""
2 
3 from __future__ import annotations
4 
5 import logging
6 
7 from blinkpy.blinkpy import Blink, BlinkSyncModule
8 
10  AlarmControlPanelEntity,
11  AlarmControlPanelEntityFeature,
12  AlarmControlPanelState,
13 )
14 from homeassistant.const import ATTR_ATTRIBUTION
15 from homeassistant.core import HomeAssistant, callback
16 from homeassistant.exceptions import HomeAssistantError
17 from homeassistant.helpers.device_registry import DeviceInfo
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 from homeassistant.helpers.update_coordinator import CoordinatorEntity
20 
21 from .const import DEFAULT_ATTRIBUTION, DEFAULT_BRAND, DOMAIN
22 from .coordinator import BlinkConfigEntry, BlinkUpdateCoordinator
23 
24 _LOGGER = logging.getLogger(__name__)
25 
26 
28  hass: HomeAssistant,
29  config_entry: BlinkConfigEntry,
30  async_add_entities: AddEntitiesCallback,
31 ) -> None:
32  """Set up the Blink Alarm Control Panels."""
33  coordinator = config_entry.runtime_data
34 
35  sync_modules = []
36  for sync_name, sync_module in coordinator.api.sync.items():
37  sync_modules.append(BlinkSyncModuleHA(coordinator, sync_name, sync_module))
38  async_add_entities(sync_modules)
39 
40 
42  CoordinatorEntity[BlinkUpdateCoordinator], AlarmControlPanelEntity
43 ):
44  """Representation of a Blink Alarm Control Panel."""
45 
46  _attr_supported_features = AlarmControlPanelEntityFeature.ARM_AWAY
47  _attr_code_arm_required = False
48  _attr_has_entity_name = True
49  _attr_name = None
50 
51  def __init__(
52  self, coordinator: BlinkUpdateCoordinator, name: str, sync: BlinkSyncModule
53  ) -> None:
54  """Initialize the alarm control panel."""
55  super().__init__(coordinator)
56  self.apiapi: Blink = coordinator.api
57  self.syncsync = sync
58  self._attr_unique_id: str = sync.serial
59  self._attr_device_info_attr_device_info = DeviceInfo(
60  identifiers={(DOMAIN, sync.serial)},
61  name=f"{DOMAIN} {name}",
62  manufacturer=DEFAULT_BRAND,
63  serial_number=sync.serial,
64  sw_version=sync.version,
65  )
66  self._update_attr_update_attr()
67 
68  @callback
69  def _handle_coordinator_update(self) -> None:
70  """Handle coordinator update."""
71  self._update_attr_update_attr()
73 
74  @callback
75  def _update_attr(self) -> None:
76  """Update attributes for alarm control panel."""
77  self.syncsync.attributes["network_info"] = self.apiapi.networks
78  self.syncsync.attributes["associated_cameras"] = list(self.syncsync.cameras)
79  self.syncsync.attributes[ATTR_ATTRIBUTION] = DEFAULT_ATTRIBUTION
80  self._attr_extra_state_attributes_attr_extra_state_attributes = self.syncsync.attributes
81  self._attr_alarm_state_attr_alarm_state = (
82  AlarmControlPanelState.ARMED_AWAY
83  if self.syncsync.arm
84  else AlarmControlPanelState.DISARMED
85  )
86 
87  async def async_alarm_disarm(self, code: str | None = None) -> None:
88  """Send disarm command."""
89  try:
90  await self.syncsync.async_arm(False)
91 
92  except TimeoutError as er:
93  raise HomeAssistantError("Blink failed to disarm camera") from er
94 
95  await self.coordinator.async_refresh()
96 
97  async def async_alarm_arm_away(self, code: str | None = None) -> None:
98  """Send arm command."""
99  try:
100  await self.syncsync.async_arm(True)
101 
102  except TimeoutError as er:
103  raise HomeAssistantError("Blink failed to arm camera away") from er
104 
105  await self.coordinator.async_refresh()