1 """Component providing HA sensor support for Ring Door Bell/Chimes."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from dataclasses
import dataclass
7 from typing
import Any, Generic, cast
9 from ring_doorbell
import (
21 SensorEntityDescription,
26 SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
34 from .
import RingConfigEntry
35 from .coordinator
import RingDataCoordinator
40 RingEntityDescription,
41 async_check_create_deprecated,
47 entry: RingConfigEntry,
48 async_add_entities: AddEntitiesCallback,
50 """Set up a sensor for a Ring device."""
51 ring_data = entry.runtime_data
52 devices_coordinator = ring_data.devices_coordinator
55 RingSensor(device, devices_coordinator, description)
56 for description
in SENSOR_TYPES
57 for device
in ring_data.devices.all_devices
58 if description.exists_fn(device)
62 f
"{device.id}-{description.key}",
71 """A sensor implementation for Ring device."""
73 entity_description: RingSensorEntityDescription[RingDeviceT]
78 coordinator: RingDataCoordinator,
79 description: RingSensorEntityDescription[RingDeviceT],
81 """Initialize a sensor for Ring device."""
82 super().
__init__(device, coordinator)
86 description.entity_registry_enabled_default
92 """Call update method."""
102 if extra_attrs := self.
entity_descriptionentity_description.extra_state_attributes_fn(
110 history_data: list[dict[str, Any]], kind: RingEventKind |
None
111 ) -> dict[str, Any] |
None:
115 return history_data[0]
116 for entry
in history_data:
117 if entry[
"kind"] == kind.value:
123 history_data: list[dict[str, Any]], kind: RingEventKind |
None
124 ) -> dict[str, Any] |
None:
127 "created_at": last_event.get(
"created_at"),
128 "answered": last_event.get(
"answered"),
129 "recording_status": last_event.get(
"recording", {}).
get(
"status"),
130 "category": last_event.get(
"kind"),
135 @dataclass(frozen=True, kw_only=True)
137 SensorEntityDescription, RingEntityDescription, Generic[RingDeviceT]
139 """Describes Ring sensor entity."""
141 value_fn: Callable[[RingDeviceT], StateType] =
lambda _:
True
142 exists_fn: Callable[[RingGeneric], bool] =
lambda _:
True
143 extra_state_attributes_fn: Callable[[RingDeviceT], dict[str, Any] |
None] = (
153 SENSOR_TYPES: tuple[RingSensorEntityDescription[Any], ...] = (
154 RingSensorEntityDescription[RingGeneric](
156 native_unit_of_measurement=PERCENTAGE,
157 device_class=SensorDeviceClass.BATTERY,
158 state_class=SensorStateClass.MEASUREMENT,
159 entity_category=EntityCategory.DIAGNOSTIC,
160 value_fn=
lambda device: device.battery_life,
161 exists_fn=
lambda device: device.family !=
"chimes",
163 RingSensorEntityDescription[RingGeneric](
165 translation_key=
"last_activity",
166 device_class=SensorDeviceClass.TIMESTAMP,
167 value_fn=
lambda device: last_event.get(
"created_at")
170 extra_state_attributes_fn=
lambda device: last_event_attrs
173 exists_fn=
lambda device: device.has_capability(RingCapability.HISTORY),
175 RingSensorEntityDescription[RingGeneric](
177 translation_key=
"last_ding",
178 device_class=SensorDeviceClass.TIMESTAMP,
179 value_fn=
lambda device: last_event.get(
"created_at")
180 if (last_event :=
_get_last_event(device.last_history, RingEventKind.DING))
182 extra_state_attributes_fn=
lambda device: last_event_attrs
185 device.last_history, RingEventKind.DING
189 exists_fn=
lambda device: device.has_capability(RingCapability.HISTORY),
191 new_platform=Platform.EVENT, breaks_in_ha_version=
"2025.4.0"
194 RingSensorEntityDescription[RingGeneric](
196 translation_key=
"last_motion",
197 device_class=SensorDeviceClass.TIMESTAMP,
198 value_fn=
lambda device: last_event.get(
"created_at")
199 if (last_event :=
_get_last_event(device.last_history, RingEventKind.MOTION))
201 extra_state_attributes_fn=
lambda device: last_event_attrs
204 device.last_history, RingEventKind.MOTION
208 exists_fn=
lambda device: device.has_capability(RingCapability.HISTORY),
210 new_platform=Platform.EVENT, breaks_in_ha_version=
"2025.4.0"
213 RingSensorEntityDescription[RingDoorBell | RingChime](
215 translation_key=
"volume",
216 value_fn=
lambda device: device.volume,
217 exists_fn=
lambda device: isinstance(device, (RingDoorBell, RingChime)),
219 new_platform=Platform.NUMBER, breaks_in_ha_version=
"2025.4.0"
222 RingSensorEntityDescription[RingOther](
223 key=
"doorbell_volume",
224 translation_key=
"doorbell_volume",
225 value_fn=
lambda device: device.doorbell_volume,
226 exists_fn=
lambda device: isinstance(device, RingOther),
228 new_platform=Platform.NUMBER, breaks_in_ha_version=
"2025.4.0"
231 RingSensorEntityDescription[RingOther](
233 translation_key=
"mic_volume",
234 value_fn=
lambda device: device.mic_volume,
235 exists_fn=
lambda device: isinstance(device, RingOther),
237 new_platform=Platform.NUMBER, breaks_in_ha_version=
"2025.4.0"
240 RingSensorEntityDescription[RingOther](
242 translation_key=
"voice_volume",
243 value_fn=
lambda device: device.voice_volume,
244 exists_fn=
lambda device: isinstance(device, RingOther),
246 new_platform=Platform.NUMBER, breaks_in_ha_version=
"2025.4.0"
249 RingSensorEntityDescription[RingGeneric](
250 key=
"wifi_signal_category",
251 translation_key=
"wifi_signal_category",
252 entity_category=EntityCategory.DIAGNOSTIC,
253 entity_registry_enabled_default=
False,
254 value_fn=
lambda device: device.wifi_signal_category,
256 RingSensorEntityDescription[RingGeneric](
257 key=
"wifi_signal_strength",
258 translation_key=
"wifi_signal_strength",
259 native_unit_of_measurement=SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
260 device_class=SensorDeviceClass.SIGNAL_STRENGTH,
261 entity_category=EntityCategory.DIAGNOSTIC,
262 entity_registry_enabled_default=
False,
263 value_fn=
lambda device: device.wifi_signal_strength,
_attr_extra_state_attributes
RingDevices _get_coordinator_data(self)
_attr_extra_state_attributes
None _handle_coordinator_update(self)
_attr_entity_registry_enabled_default
None __init__(self, RingDeviceT device, RingDataCoordinator coordinator, RingSensorEntityDescription[RingDeviceT] description)
DeviceEntry get_device(HomeAssistant hass, str unique_id)
web.Response get(self, web.Request request, str config_key)
bool async_check_create_deprecated(HomeAssistant hass, Platform platform, str unique_id, RingEntityDescription entity_description)
dict[str, Any]|None _get_last_event_attrs(list[dict[str, Any]] history_data, RingEventKind|None kind)
dict[str, Any]|None _get_last_event(list[dict[str, Any]] history_data, RingEventKind|None kind)
None async_setup_entry(HomeAssistant hass, RingConfigEntry entry, AddEntitiesCallback async_add_entities)