Home Assistant Unofficial Reference 2024.12.1
siren.py
Go to the documentation of this file.
1 """Support for EZVIZ sirens."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from datetime import datetime, timedelta
7 from typing import Any
8 
9 from pyezviz import HTTPError, PyEzvizError, SupportExt
10 
12  SirenEntity,
13  SirenEntityDescription,
14  SirenEntityFeature,
15 )
16 from homeassistant.config_entries import ConfigEntry
17 from homeassistant.const import STATE_ON
18 from homeassistant.core import HomeAssistant, callback
19 from homeassistant.exceptions import HomeAssistantError
20 from homeassistant.helpers.entity_platform import AddEntitiesCallback
21 import homeassistant.helpers.event as evt
22 from homeassistant.helpers.restore_state import RestoreEntity
23 
24 from .const import DATA_COORDINATOR, DOMAIN
25 from .coordinator import EzvizDataUpdateCoordinator
26 from .entity import EzvizBaseEntity
27 
28 PARALLEL_UPDATES = 1
29 OFF_DELAY = timedelta(seconds=60) # Camera firmware has hard coded turn off.
30 
31 SIREN_ENTITY_TYPE = SirenEntityDescription(
32  key="siren",
33  translation_key="siren",
34 )
35 
36 
38  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
39 ) -> None:
40  """Set up EZVIZ sensors based on a config entry."""
41  coordinator: EzvizDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id][
42  DATA_COORDINATOR
43  ]
44 
46  EzvizSirenEntity(coordinator, camera, SIREN_ENTITY_TYPE)
47  for camera in coordinator.data
48  for capability, value in coordinator.data[camera]["supportExt"].items()
49  if capability == str(SupportExt.SupportActiveDefense.value)
50  if value != "0"
51  )
52 
53 
55  """Representation of a EZVIZ Siren entity."""
56 
57  _attr_supported_features = SirenEntityFeature.TURN_ON | SirenEntityFeature.TURN_OFF
58  _attr_should_poll = False
59  _attr_assumed_state = True
60 
61  def __init__(
62  self,
63  coordinator: EzvizDataUpdateCoordinator,
64  serial: str,
65  description: SirenEntityDescription,
66  ) -> None:
67  """Initialize the Siren."""
68  super().__init__(coordinator, serial)
69  self._attr_unique_id_attr_unique_id = f"{serial}_{description.key}"
70  self.entity_descriptionentity_description = description
71  self._attr_is_on_attr_is_on = False
72  self._delay_listener_delay_listener: Callable | None = None
73 
74  async def async_added_to_hass(self) -> None:
75  """Run when entity about to be added to hass."""
76  if not (last_state := await self.async_get_last_stateasync_get_last_state()):
77  return
78  self._attr_is_on_attr_is_on = last_state.state == STATE_ON
79 
80  if self._attr_is_on_attr_is_on:
81  evt.async_call_later(self.hasshass, OFF_DELAY, self.off_delay_listeneroff_delay_listener)
82 
83  async def async_turn_off(self, **kwargs: Any) -> None:
84  """Turn off camera siren."""
85  try:
86  result = await self.hasshass.async_add_executor_job(
87  self.coordinatorcoordinator.ezviz_client.sound_alarm, self._serial_serial, 1
88  )
89 
90  except (HTTPError, PyEzvizError) as err:
91  raise HomeAssistantError(
92  f"Failed to turn siren off for {self.name}"
93  ) from err
94 
95  if result:
96  if self._delay_listener_delay_listener is not None:
97  self._delay_listener_delay_listener()
98  self._delay_listener_delay_listener = None
99 
100  self._attr_is_on_attr_is_on = False
101  self.async_write_ha_stateasync_write_ha_state()
102 
103  async def async_turn_on(self, **kwargs: Any) -> None:
104  """Turn on camera siren."""
105  try:
106  result = self.hasshass.async_add_executor_job(
107  self.coordinatorcoordinator.ezviz_client.sound_alarm, self._serial_serial, 2
108  )
109 
110  except (HTTPError, PyEzvizError) as err:
111  raise HomeAssistantError(
112  f"Failed to turn siren on for {self.name}"
113  ) from err
114 
115  if result:
116  if self._delay_listener_delay_listener is not None:
117  self._delay_listener_delay_listener()
118  self._delay_listener_delay_listener = None
119 
120  self._attr_is_on_attr_is_on = True
121  self._delay_listener_delay_listener = evt.async_call_later(
122  self.hasshass, OFF_DELAY, self.off_delay_listeneroff_delay_listener
123  )
124  self.async_write_ha_stateasync_write_ha_state()
125 
126  @callback
127  def off_delay_listener(self, now: datetime) -> None:
128  """Switch device off after a delay.
129 
130  Camera firmware has hard coded turn off after 60 seconds.
131  """
132  self._attr_is_on_attr_is_on = False
133  self._delay_listener_delay_listener = None
134  self.async_write_ha_stateasync_write_ha_state()
None __init__(self, EzvizDataUpdateCoordinator coordinator, str serial, SirenEntityDescription description)
Definition: siren.py:66
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: siren.py:39