Home Assistant Unofficial Reference 2024.12.1
binary_sensor.py
Go to the documentation of this file.
1 """Support for the NextDNS service."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from dataclasses import dataclass
7 
8 from nextdns import ConnectionStatus
9 
11  BinarySensorDeviceClass,
12  BinarySensorEntity,
13  BinarySensorEntityDescription,
14 )
15 from homeassistant.const import EntityCategory
16 from homeassistant.core import HomeAssistant, callback
17 from homeassistant.helpers.entity_platform import AddEntitiesCallback
18 from homeassistant.helpers.update_coordinator import CoordinatorEntity
19 
20 from . import NextDnsConfigEntry
21 from .coordinator import NextDnsUpdateCoordinator
22 
23 PARALLEL_UPDATES = 1
24 
25 
26 @dataclass(frozen=True, kw_only=True)
28  """NextDNS binary sensor entity description."""
29 
30  state: Callable[[ConnectionStatus, str], bool]
31 
32 
33 SENSORS = (
35  key="this_device_nextdns_connection_status",
36  entity_category=EntityCategory.DIAGNOSTIC,
37  translation_key="device_connection_status",
38  device_class=BinarySensorDeviceClass.CONNECTIVITY,
39  state=lambda data, _: data.connected,
40  ),
42  key="this_device_profile_connection_status",
43  entity_category=EntityCategory.DIAGNOSTIC,
44  translation_key="device_profile_connection_status",
45  device_class=BinarySensorDeviceClass.CONNECTIVITY,
46  state=lambda data, profile_id: profile_id == data.profile_id,
47  ),
48 )
49 
50 
52  hass: HomeAssistant,
53  entry: NextDnsConfigEntry,
54  async_add_entities: AddEntitiesCallback,
55 ) -> None:
56  """Add NextDNS entities from a config_entry."""
57  coordinator = entry.runtime_data.connection
58 
60  NextDnsBinarySensor(coordinator, description) for description in SENSORS
61  )
62 
63 
65  CoordinatorEntity[NextDnsUpdateCoordinator[ConnectionStatus]], BinarySensorEntity
66 ):
67  """Define an NextDNS binary sensor."""
68 
69  _attr_has_entity_name = True
70  entity_description: NextDnsBinarySensorEntityDescription
71 
72  def __init__(
73  self,
74  coordinator: NextDnsUpdateCoordinator[ConnectionStatus],
75  description: NextDnsBinarySensorEntityDescription,
76  ) -> None:
77  """Initialize."""
78  super().__init__(coordinator)
79  self._attr_device_info_attr_device_info = coordinator.device_info
80  self._attr_unique_id_attr_unique_id = f"{coordinator.profile_id}_{description.key}"
81  self._attr_is_on_attr_is_on = description.state(coordinator.data, coordinator.profile_id)
82  self.entity_descriptionentity_description = description
83 
84  @callback
85  def _handle_coordinator_update(self) -> None:
86  """Handle updated data from the coordinator."""
87  self._attr_is_on_attr_is_on = self.entity_descriptionentity_description.state(
88  self.coordinator.data, self.coordinator.profile_id
89  )
90  self.async_write_ha_stateasync_write_ha_state()
None __init__(self, NextDnsUpdateCoordinator[ConnectionStatus] coordinator, NextDnsBinarySensorEntityDescription description)
None async_setup_entry(HomeAssistant hass, NextDnsConfigEntry entry, AddEntitiesCallback async_add_entities)