1 """Component providing HA Siren support for Ring Chimes."""
3 from collections.abc
import Callable, Coroutine
4 from dataclasses
import dataclass
6 from typing
import Any, Generic, cast
8 from ring_doorbell
import (
19 SirenEntityDescription,
21 SirenTurnOnServiceParameters,
27 from .
import RingConfigEntry
28 from .coordinator
import RingDataCoordinator
32 RingEntityDescription,
33 async_check_create_deprecated,
37 _LOGGER = logging.getLogger(__name__)
40 @dataclass(frozen=True, kw_only=True)
42 SirenEntityDescription, RingEntityDescription, Generic[RingDeviceT]
44 """Describes a Ring siren entity."""
46 exists_fn: Callable[[RingGeneric], bool]
47 unique_id_fn: Callable[[RingDeviceT], str] =
lambda device:
str(
50 is_on_fn: Callable[[RingDeviceT], bool] |
None =
None
52 Callable[[RingDeviceT, SirenTurnOnServiceParameters], Coroutine[Any, Any, Any]]
55 turn_off_fn: Callable[[RingDeviceT], Coroutine[Any, Any,
None]] |
None =
None
58 SIRENS: tuple[RingSirenEntityDescription[Any], ...] = (
59 RingSirenEntityDescription[RingChime](
61 translation_key=
"siren",
62 available_tones=[RingEventKind.DING.value, RingEventKind.MOTION.value],
64 unique_id_fn=
lambda device: f
"{device.device_api_id}-siren",
65 exists_fn=
lambda device: isinstance(device, RingChime),
66 turn_on_fn=
lambda device, kwargs: device.async_test_sound(
67 kind=
str(kwargs.get(ATTR_TONE)
or "")
or RingEventKind.DING.value
70 RingSirenEntityDescription[RingStickUpCam](
72 translation_key=
"siren",
73 exists_fn=
lambda device: device.has_capability(RingCapability.SIREN),
74 is_on_fn=
lambda device: device.siren > 0,
75 turn_on_fn=
lambda device, _: device.async_set_siren(1),
76 turn_off_fn=
lambda device: device.async_set_siren(0),
83 entry: RingConfigEntry,
84 async_add_entities: AddEntitiesCallback,
86 """Create the sirens for the Ring devices."""
87 ring_data = entry.runtime_data
88 devices_coordinator = ring_data.devices_coordinator
91 RingSiren(device, devices_coordinator, description)
92 for device
in ring_data.devices.all_devices
93 for description
in SIRENS
94 if description.exists_fn(device)
98 description.unique_id_fn(device),
105 """Creates a siren to play the test chimes of a Chime device."""
107 entity_description: RingSirenEntityDescription[RingDeviceT]
112 coordinator: RingDataCoordinator,
113 description: RingSirenEntityDescription[RingDeviceT],
115 """Initialize a Ring Chime siren."""
116 super().
__init__(device, coordinator)
119 if description.is_on_fn:
122 if description.turn_on_fn:
123 features = features | SirenEntityFeature.TURN_ON
124 if description.turn_off_fn:
125 features = features | SirenEntityFeature.TURN_OFF
126 if description.available_tones:
127 features = features | SirenEntityFeature.TONES
132 turn_on_params = cast(SirenTurnOnServiceParameters, kwargs)
143 """Turn on the siren."""
148 """Turn off the siren."""
153 """Call update method."""
RingDevices _get_coordinator_data(self)
None __init__(self, RingDeviceT device, RingDataCoordinator coordinator, RingSirenEntityDescription[RingDeviceT] description)
None _async_set_siren(self, bool siren_on, **Any kwargs)
None async_turn_on(self, **Any kwargs)
None _handle_coordinator_update(self)
None async_turn_off(self, **Any kwargs)
None async_write_ha_state(self)
DeviceEntry get_device(HomeAssistant hass, str unique_id)
bool async_check_create_deprecated(HomeAssistant hass, Platform platform, str unique_id, RingEntityDescription entity_description)
None async_setup_entry(HomeAssistant hass, RingConfigEntry entry, AddEntitiesCallback async_add_entities)