1 """Component providing HA number support for Ring Door Bell/Chimes."""
3 from collections.abc
import Awaitable, Callable
4 from dataclasses
import dataclass
5 from typing
import Any, Generic, cast
7 from ring_doorbell
import RingChime, RingDoorBell, RingGeneric, RingOther
8 import ring_doorbell.const
12 NumberEntityDescription,
19 from .
import RingConfigEntry
20 from .coordinator
import RingDataCoordinator
21 from .entity
import RingDeviceT, RingEntity, refresh_after
26 entry: RingConfigEntry,
27 async_add_entities: AddEntitiesCallback,
29 """Set up a numbers for a Ring device."""
30 ring_data = entry.runtime_data
31 devices_coordinator = ring_data.devices_coordinator
34 RingNumber(device, devices_coordinator, description)
35 for description
in NUMBER_TYPES
36 for device
in ring_data.devices.all_devices
37 if description.exists_fn(device)
41 @dataclass(frozen=True, kw_only=True)
43 """Describes Ring number entity."""
45 value_fn: Callable[[RingDeviceT], StateType]
46 setter_fn: Callable[[RingDeviceT, float], Awaitable[
None]]
47 exists_fn: Callable[[RingGeneric], bool]
50 NUMBER_TYPES: tuple[RingNumberEntityDescription[Any], ...] = (
51 RingNumberEntityDescription[RingChime](
53 translation_key=
"volume",
54 mode=NumberMode.SLIDER,
55 native_min_value=ring_doorbell.const.CHIME_VOL_MIN,
56 native_max_value=ring_doorbell.const.CHIME_VOL_MAX,
58 value_fn=
lambda device: device.volume,
59 setter_fn=
lambda device, value: device.async_set_volume(
int(value)),
60 exists_fn=
lambda device: isinstance(device, RingChime),
62 RingNumberEntityDescription[RingDoorBell](
64 translation_key=
"volume",
65 mode=NumberMode.SLIDER,
66 native_min_value=ring_doorbell.const.DOORBELL_VOL_MIN,
67 native_max_value=ring_doorbell.const.DOORBELL_VOL_MAX,
69 value_fn=
lambda device: device.volume,
70 setter_fn=
lambda device, value: device.async_set_volume(
int(value)),
71 exists_fn=
lambda device: isinstance(device, RingDoorBell),
73 RingNumberEntityDescription[RingOther](
74 key=
"doorbell_volume",
75 translation_key=
"doorbell_volume",
76 mode=NumberMode.SLIDER,
77 native_min_value=ring_doorbell.const.OTHER_DOORBELL_VOL_MIN,
78 native_max_value=ring_doorbell.const.OTHER_DOORBELL_VOL_MAX,
80 value_fn=
lambda device: device.doorbell_volume,
81 setter_fn=
lambda device, value: device.async_set_doorbell_volume(
int(value)),
82 exists_fn=
lambda device: isinstance(device, RingOther),
84 RingNumberEntityDescription[RingOther](
86 translation_key=
"mic_volume",
87 mode=NumberMode.SLIDER,
88 native_min_value=ring_doorbell.const.MIC_VOL_MIN,
89 native_max_value=ring_doorbell.const.MIC_VOL_MAX,
91 value_fn=
lambda device: device.mic_volume,
92 setter_fn=
lambda device, value: device.async_set_mic_volume(
int(value)),
93 exists_fn=
lambda device: isinstance(device, RingOther),
95 RingNumberEntityDescription[RingOther](
97 translation_key=
"voice_volume",
98 mode=NumberMode.SLIDER,
99 native_min_value=ring_doorbell.const.VOICE_VOL_MIN,
100 native_max_value=ring_doorbell.const.VOICE_VOL_MAX,
102 value_fn=
lambda device: device.voice_volume,
103 setter_fn=
lambda device, value: device.async_set_voice_volume(
int(value)),
104 exists_fn=
lambda device: isinstance(device, RingOther),
110 """A number implementation for Ring device."""
112 entity_description: RingNumberEntityDescription[RingDeviceT]
117 coordinator: RingDataCoordinator,
118 description: RingNumberEntityDescription[RingDeviceT],
120 """Initialize a number for Ring device."""
121 super().
__init__(device, coordinator)
128 if native_value
is not None:
133 """Call update method."""
146 """Call setter on Ring device."""
RingDevices _get_coordinator_data(self)
None _handle_coordinator_update(self)
None _update_native_value(self)
None async_set_native_value(self, float value)
None __init__(self, RingDeviceT device, RingDataCoordinator coordinator, RingNumberEntityDescription[RingDeviceT] description)
None async_write_ha_state(self)
DeviceEntry get_device(HomeAssistant hass, str unique_id)
None async_setup_entry(HomeAssistant hass, RingConfigEntry entry, AddEntitiesCallback async_add_entities)