Home Assistant Unofficial Reference 2024.12.1
binary_sensor.py
Go to the documentation of this file.
1 """SFR Box sensor platform."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from dataclasses import dataclass
7 from typing import TYPE_CHECKING
8 
9 from sfrbox_api.models import DslInfo, FtthInfo, SystemInfo, WanInfo
10 
12  BinarySensorDeviceClass,
13  BinarySensorEntity,
14  BinarySensorEntityDescription,
15 )
16 from homeassistant.config_entries import ConfigEntry
17 from homeassistant.const import EntityCategory
18 from homeassistant.core import HomeAssistant
19 from homeassistant.helpers.device_registry import DeviceInfo
20 from homeassistant.helpers.entity_platform import AddEntitiesCallback
21 from homeassistant.helpers.update_coordinator import CoordinatorEntity
22 
23 from .const import DOMAIN
24 from .coordinator import SFRDataUpdateCoordinator
25 from .models import DomainData
26 
27 
28 @dataclass(frozen=True, kw_only=True)
29 class SFRBoxBinarySensorEntityDescription[_T](BinarySensorEntityDescription):
30  """Description for SFR Box binary sensors."""
31 
32  value_fn: Callable[[_T], bool | None]
33 
34 
35 DSL_SENSOR_TYPES: tuple[SFRBoxBinarySensorEntityDescription[DslInfo], ...] = (
36  SFRBoxBinarySensorEntityDescription[DslInfo](
37  key="status",
38  device_class=BinarySensorDeviceClass.CONNECTIVITY,
39  entity_category=EntityCategory.DIAGNOSTIC,
40  value_fn=lambda x: x.status == "up",
41  translation_key="dsl_status",
42  ),
43 )
44 FTTH_SENSOR_TYPES: tuple[SFRBoxBinarySensorEntityDescription[FtthInfo], ...] = (
45  SFRBoxBinarySensorEntityDescription[FtthInfo](
46  key="status",
47  device_class=BinarySensorDeviceClass.CONNECTIVITY,
48  entity_category=EntityCategory.DIAGNOSTIC,
49  value_fn=lambda x: x.status == "up",
50  translation_key="ftth_status",
51  ),
52 )
53 WAN_SENSOR_TYPES: tuple[SFRBoxBinarySensorEntityDescription[WanInfo], ...] = (
54  SFRBoxBinarySensorEntityDescription[WanInfo](
55  key="status",
56  device_class=BinarySensorDeviceClass.CONNECTIVITY,
57  entity_category=EntityCategory.DIAGNOSTIC,
58  value_fn=lambda x: x.status == "up",
59  translation_key="wan_status",
60  ),
61 )
62 
63 
65  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
66 ) -> None:
67  """Set up the sensors."""
68  data: DomainData = hass.data[DOMAIN][entry.entry_id]
69  system_info = data.system.data
70  if TYPE_CHECKING:
71  assert system_info is not None
72 
73  entities: list[SFRBoxBinarySensor] = [
74  SFRBoxBinarySensor(data.wan, description, system_info)
75  for description in WAN_SENSOR_TYPES
76  ]
77  if (net_infra := system_info.net_infra) == "adsl":
78  entities.extend(
79  SFRBoxBinarySensor(data.dsl, description, system_info)
80  for description in DSL_SENSOR_TYPES
81  )
82  elif net_infra == "ftth":
83  entities.extend(
84  SFRBoxBinarySensor(data.ftth, description, system_info)
85  for description in FTTH_SENSOR_TYPES
86  )
87 
88  async_add_entities(entities)
89 
90 
92  CoordinatorEntity[SFRDataUpdateCoordinator[_T]], BinarySensorEntity
93 ):
94  """SFR Box sensor."""
95 
96  entity_description: SFRBoxBinarySensorEntityDescription[_T]
97  _attr_has_entity_name = True
98 
99  def __init__(
100  self,
101  coordinator: SFRDataUpdateCoordinator[_T],
102  description: SFRBoxBinarySensorEntityDescription,
103  system_info: SystemInfo,
104  ) -> None:
105  """Initialize the sensor."""
106  super().__init__(coordinator)
107  self.entity_descriptionentity_description = description
108  self._attr_unique_id_attr_unique_id = (
109  f"{system_info.mac_addr}_{coordinator.name}_{description.key}"
110  )
111  self._attr_device_info_attr_device_info = DeviceInfo(
112  identifiers={(DOMAIN, system_info.mac_addr)},
113  )
114 
115  @property
116  def is_on(self) -> bool | None:
117  """Return the native value of the device."""
118  if self.coordinator.data is None:
119  return None
120  return self.entity_descriptionentity_description.value_fn(self.coordinator.data)
None __init__(self, SFRDataUpdateCoordinator[_T] coordinator, SFRBoxBinarySensorEntityDescription description, SystemInfo system_info)
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)