Home Assistant Unofficial Reference 2024.12.1
alarm_control_panel.py
Go to the documentation of this file.
1 """Support for Ezviz alarm."""
2 
3 from __future__ import annotations
4 
5 from dataclasses import dataclass
6 from datetime import timedelta
7 import logging
8 
9 from pyezviz import PyEzvizError
10 from pyezviz.constants import DefenseModeType
11 
13  AlarmControlPanelEntity,
14  AlarmControlPanelEntityDescription,
15  AlarmControlPanelEntityFeature,
16  AlarmControlPanelState,
17 )
18 from homeassistant.config_entries import ConfigEntry
19 from homeassistant.core import HomeAssistant
20 from homeassistant.exceptions import HomeAssistantError
21 from homeassistant.helpers.device_registry import DeviceInfo
22 from homeassistant.helpers.entity_platform import AddEntitiesCallback
23 
24 from .const import DATA_COORDINATOR, DOMAIN, MANUFACTURER
25 from .coordinator import EzvizDataUpdateCoordinator
26 
27 _LOGGER = logging.getLogger(__name__)
28 
29 SCAN_INTERVAL = timedelta(seconds=60)
30 PARALLEL_UPDATES = 0
31 
32 
33 @dataclass(frozen=True, kw_only=True)
35  """Describe an EZVIZ Alarm control panel entity."""
36 
37  ezviz_alarm_states: list
38 
39 
41  key="ezviz_alarm",
42  ezviz_alarm_states=[
43  None,
44  AlarmControlPanelState.DISARMED,
45  AlarmControlPanelState.ARMED_AWAY,
46  AlarmControlPanelState.ARMED_HOME,
47  ],
48 )
49 
50 
52  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
53 ) -> None:
54  """Set up Ezviz alarm control panel."""
55  coordinator: EzvizDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id][
56  DATA_COORDINATOR
57  ]
58 
59  device_info = DeviceInfo(
60  identifiers={(DOMAIN, entry.unique_id)}, # type: ignore[arg-type]
61  name="EZVIZ Alarm",
62  model="EZVIZ Alarm",
63  manufacturer=MANUFACTURER,
64  )
65 
67  [EzvizAlarm(coordinator, entry.entry_id, device_info, ALARM_TYPE)]
68  )
69 
70 
72  """Representation of an Ezviz alarm control panel."""
73 
74  entity_description: EzvizAlarmControlPanelEntityDescription
75  _attr_has_entity_name = True
76  _attr_name = None
77  _attr_supported_features = (
78  AlarmControlPanelEntityFeature.ARM_AWAY
79  | AlarmControlPanelEntityFeature.ARM_HOME
80  )
81  _attr_code_arm_required = False
82 
83  def __init__(
84  self,
85  coordinator: EzvizDataUpdateCoordinator,
86  entry_id: str,
87  device_info: DeviceInfo,
88  entity_description: EzvizAlarmControlPanelEntityDescription,
89  ) -> None:
90  """Initialize alarm control panel entity."""
91  self._attr_unique_id_attr_unique_id = f"{entry_id}_{entity_description.key}"
92  self._attr_device_info_attr_device_info = device_info
93  self.entity_descriptionentity_description = entity_description
94  self.coordinatorcoordinator = coordinator
95  self._attr_alarm_state_attr_alarm_state = None
96 
97  async def async_added_to_hass(self) -> None:
98  """Entity added to hass."""
99  self.async_schedule_update_ha_stateasync_schedule_update_ha_state(True)
100 
101  def alarm_disarm(self, code: str | None = None) -> None:
102  """Send disarm command."""
103  try:
104  if self.coordinatorcoordinator.ezviz_client.api_set_defence_mode(
105  DefenseModeType.HOME_MODE.value
106  ):
107  self._attr_alarm_state_attr_alarm_state = AlarmControlPanelState.DISARMED
108 
109  except PyEzvizError as err:
110  raise HomeAssistantError("Cannot disarm EZVIZ alarm") from err
111 
112  def alarm_arm_away(self, code: str | None = None) -> None:
113  """Send arm away command."""
114  try:
115  if self.coordinatorcoordinator.ezviz_client.api_set_defence_mode(
116  DefenseModeType.AWAY_MODE.value
117  ):
118  self._attr_alarm_state_attr_alarm_state = AlarmControlPanelState.ARMED_AWAY
119 
120  except PyEzvizError as err:
121  raise HomeAssistantError("Cannot arm EZVIZ alarm") from err
122 
123  def alarm_arm_home(self, code: str | None = None) -> None:
124  """Send arm home command."""
125  try:
126  if self.coordinatorcoordinator.ezviz_client.api_set_defence_mode(
127  DefenseModeType.SLEEP_MODE.value
128  ):
129  self._attr_alarm_state_attr_alarm_state = AlarmControlPanelState.ARMED_HOME
130 
131  except PyEzvizError as err:
132  raise HomeAssistantError("Cannot arm EZVIZ alarm") from err
133 
134  def update(self) -> None:
135  """Fetch data from EZVIZ."""
136  ezviz_alarm_state_number = "0"
137  try:
138  ezviz_alarm_state_number = (
139  self.coordinatorcoordinator.ezviz_client.get_group_defence_mode()
140  )
141  _LOGGER.debug(
142  "Updating EZVIZ alarm with response %s", ezviz_alarm_state_number
143  )
144  self._attr_alarm_state_attr_alarm_state = self.entity_descriptionentity_description.ezviz_alarm_states[
145  int(ezviz_alarm_state_number)
146  ]
147 
148  except PyEzvizError as error:
149  raise HomeAssistantError(
150  f"Could not fetch EZVIZ alarm status: {error}"
151  ) from error
None __init__(self, EzvizDataUpdateCoordinator coordinator, str entry_id, DeviceInfo device_info, EzvizAlarmControlPanelEntityDescription entity_description)
None async_schedule_update_ha_state(self, bool force_refresh=False)
Definition: entity.py:1265
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)