Home Assistant Unofficial Reference 2024.12.1
siren.py
Go to the documentation of this file.
1 """Support for Z-Wave controls using the siren platform."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
7 from zwave_js_server.client import Client as ZwaveClient
8 from zwave_js_server.const.command_class.sound_switch import ToneID
9 from zwave_js_server.model.driver import Driver
10 
12  ATTR_TONE,
13  ATTR_VOLUME_LEVEL,
14  DOMAIN as SIREN_DOMAIN,
15  SirenEntity,
16  SirenEntityFeature,
17 )
18 from homeassistant.config_entries import ConfigEntry
19 from homeassistant.core import HomeAssistant, callback
20 from homeassistant.helpers.dispatcher import async_dispatcher_connect
21 from homeassistant.helpers.entity_platform import AddEntitiesCallback
22 
23 from .const import DATA_CLIENT, DOMAIN
24 from .discovery import ZwaveDiscoveryInfo
25 from .entity import ZWaveBaseEntity
26 
27 PARALLEL_UPDATES = 0
28 
29 
31  hass: HomeAssistant,
32  config_entry: ConfigEntry,
33  async_add_entities: AddEntitiesCallback,
34 ) -> None:
35  """Set up Z-Wave Siren entity from Config Entry."""
36  client: ZwaveClient = config_entry.runtime_data[DATA_CLIENT]
37 
38  @callback
39  def async_add_siren(info: ZwaveDiscoveryInfo) -> None:
40  """Add Z-Wave siren entity."""
41  driver = client.driver
42  assert driver is not None # Driver is ready before platforms are loaded.
43  entities: list[ZWaveBaseEntity] = []
44  entities.append(ZwaveSirenEntity(config_entry, driver, info))
45  async_add_entities(entities)
46 
47  config_entry.async_on_unload(
49  hass,
50  f"{DOMAIN}_{config_entry.entry_id}_add_{SIREN_DOMAIN}",
51  async_add_siren,
52  )
53  )
54 
55 
57  """Representation of a Z-Wave siren entity."""
58 
59  def __init__(
60  self, config_entry: ConfigEntry, driver: Driver, info: ZwaveDiscoveryInfo
61  ) -> None:
62  """Initialize a ZwaveSirenEntity entity."""
63  super().__init__(config_entry, driver, info)
64  # Entity class attributes
65  self._attr_available_tones_attr_available_tones = {
66  int(state_id): val
67  for state_id, val in self.infoinfo.primary_value.metadata.states.items()
68  }
69  self._attr_supported_features_attr_supported_features = (
70  SirenEntityFeature.TURN_ON
71  | SirenEntityFeature.TURN_OFF
72  | SirenEntityFeature.VOLUME_SET
73  )
74  if self._attr_available_tones_attr_available_tones:
75  self._attr_supported_features_attr_supported_features |= SirenEntityFeature.TONES
76 
77  self._attr_name_attr_name_attr_name = self.generate_namegenerate_name(include_value_name=True)
78 
79  @property
80  def is_on(self) -> bool | None:
81  """Return whether device is on."""
82  if self.infoinfo.primary_value.value is None:
83  return None
84  return bool(self.infoinfo.primary_value.value)
85 
86  async def async_turn_on(self, **kwargs: Any) -> None:
87  """Turn the device on."""
88  tone_id: int | None = kwargs.get(ATTR_TONE)
89  options = {}
90  if (volume := kwargs.get(ATTR_VOLUME_LEVEL)) is not None:
91  options["volume"] = round(volume * 100)
92  # Play the default tone if a tone isn't provided
93  if tone_id is None:
94  await self._async_set_value_async_set_value(
95  self.infoinfo.primary_value, ToneID.DEFAULT, options
96  )
97  return
98 
99  await self._async_set_value_async_set_value(self.infoinfo.primary_value, tone_id, options)
100 
101  async def async_turn_off(self, **kwargs: Any) -> None:
102  """Turn the device off."""
103  await self._async_set_value_async_set_value(self.infoinfo.primary_value, ToneID.OFF)
str generate_name(self, bool include_value_name=False, str|None alternate_value_name=None, Sequence[str|None]|None additional_info=None, str|None name_prefix=None)
Definition: entity.py:163
SetValueResult|None _async_set_value(self, ZwaveValue value, Any new_value, dict|None options=None, bool|None wait_for_result=None)
Definition: entity.py:330
None __init__(self, ConfigEntry config_entry, Driver driver, ZwaveDiscoveryInfo info)
Definition: siren.py:61
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: siren.py:34
Callable[[], None] async_dispatcher_connect(HomeAssistant hass, str signal, Callable[..., Any] target)
Definition: dispatcher.py:103