1 """Component providing HA sensor support for Ring Door Bell/Chimes."""
3 from __future__
import annotations
5 from collections.abc
import Mapping
6 from dataclasses
import dataclass
7 from datetime
import datetime
8 from typing
import Any, Generic
10 from ring_doorbell
import RingCapability, RingEvent
11 from ring_doorbell.const
import KIND_DING, KIND_MOTION
14 BinarySensorDeviceClass,
16 BinarySensorEntityDescription,
23 from .
import RingConfigEntry
24 from .coordinator
import RingListenCoordinator
29 RingEntityDescription,
30 async_check_create_deprecated,
34 @dataclass(frozen=True, kw_only=True)
36 BinarySensorEntityDescription, RingEntityDescription, Generic[RingDeviceT]
38 """Describes Ring binary sensor entity."""
40 capability: RingCapability
43 BINARY_SENSOR_TYPES: tuple[RingBinarySensorEntityDescription, ...] = (
46 translation_key=KIND_DING,
47 device_class=BinarySensorDeviceClass.OCCUPANCY,
48 capability=RingCapability.DING,
50 new_platform=Platform.EVENT, breaks_in_ha_version=
"2025.4.0"
55 translation_key=KIND_MOTION,
56 device_class=BinarySensorDeviceClass.MOTION,
57 capability=RingCapability.MOTION_DETECTION,
59 new_platform=Platform.EVENT, breaks_in_ha_version=
"2025.4.0"
67 entry: RingConfigEntry,
68 async_add_entities: AddEntitiesCallback,
70 """Set up the Ring binary sensors from a config entry."""
71 ring_data = entry.runtime_data
72 listen_coordinator = ring_data.listen_coordinator
76 for description
in BINARY_SENSOR_TYPES
77 for device
in ring_data.devices.all_devices
78 if device.has_capability(description.capability)
81 Platform.BINARY_SENSOR,
82 f
"{device.id}-{description.key}",
89 RingBaseEntity[RingListenCoordinator, RingDeviceT], BinarySensorEntity
91 """A binary sensor implementation for Ring device."""
93 _active_alert: RingEvent |
None =
None
94 RingBinarySensorEntityDescription[RingDeviceT]
99 coordinator: RingListenCoordinator,
100 description: RingBinarySensorEntityDescription[RingDeviceT],
102 """Initialize a binary sensor for Ring device."""
115 """Handle the event."""
119 when = loop.time() + alert.expires_in
126 """Clear the event."""
133 return self.coordinator.alerts.get(
145 """Return if entity is available."""
146 return self.coordinator.event_listener.started
149 """All updates are passive."""
153 """Return the state attributes."""
154 attrs = super().extra_state_attributes
159 assert isinstance(attrs, dict)
163 assert now
and expires_in
164 attrs[
"expires_at"] = datetime.fromtimestamp(now + expires_in).isoformat()
None _handle_coordinator_update(self)
None _async_handle_event(self, RingEvent alert)
RingEvent|None _get_coordinator_alert(self)
Mapping[str, Any]|None extra_state_attributes(self)
None _async_cancel_event(self, Any _now)
None __init__(self, RingDeviceT device, RingListenCoordinator coordinator, RingBinarySensorEntityDescription[RingDeviceT] description)
None async_write_ha_state(self)
None async_setup_entry(HomeAssistant hass, RingConfigEntry entry, AddEntitiesCallback async_add_entities)
bool async_check_create_deprecated(HomeAssistant hass, Platform platform, str unique_id, RingEntityDescription entity_description)
CALLBACK_TYPE async_call_at(HomeAssistant hass, HassJob[[datetime], Coroutine[Any, Any, None]|None]|Callable[[datetime], Coroutine[Any, Any, None]|None] action, float loop_time)