Home Assistant Unofficial Reference 2024.12.1
binary_sensor.py
Go to the documentation of this file.
1 """Support for Fritzbox binary sensors."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from dataclasses import dataclass
7 from typing import Final
8 
9 from pyfritzhome.fritzhomedevice import FritzhomeDevice
10 
12  BinarySensorDeviceClass,
13  BinarySensorEntity,
14  BinarySensorEntityDescription,
15 )
16 from homeassistant.const import EntityCategory
17 from homeassistant.core import HomeAssistant, callback
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 
20 from .coordinator import FritzboxConfigEntry
21 from .entity import FritzBoxDeviceEntity
22 from .model import FritzEntityDescriptionMixinBase
23 
24 
25 @dataclass(frozen=True)
27  """BinarySensor description mixin for Fritz!Smarthome entities."""
28 
29  is_on: Callable[[FritzhomeDevice], bool | None]
30 
31 
32 @dataclass(frozen=True)
34  BinarySensorEntityDescription, FritzEntityDescriptionMixinBinarySensor
35 ):
36  """Description for Fritz!Smarthome binary sensor entities."""
37 
38 
39 BINARY_SENSOR_TYPES: Final[tuple[FritzBinarySensorEntityDescription, ...]] = (
41  key="alarm",
42  translation_key="alarm",
43  device_class=BinarySensorDeviceClass.WINDOW,
44  suitable=lambda device: device.has_alarm,
45  is_on=lambda device: device.alert_state,
46  ),
48  key="lock",
49  translation_key="lock",
50  device_class=BinarySensorDeviceClass.LOCK,
51  entity_category=EntityCategory.DIAGNOSTIC,
52  suitable=lambda device: device.lock is not None,
53  is_on=lambda device: not device.lock,
54  ),
56  key="device_lock",
57  translation_key="device_lock",
58  device_class=BinarySensorDeviceClass.LOCK,
59  entity_category=EntityCategory.DIAGNOSTIC,
60  suitable=lambda device: device.device_lock is not None,
61  is_on=lambda device: not device.device_lock,
62  ),
63 )
64 
65 
67  hass: HomeAssistant,
68  entry: FritzboxConfigEntry,
69  async_add_entities: AddEntitiesCallback,
70 ) -> None:
71  """Set up the FRITZ!SmartHome binary sensor from ConfigEntry."""
72  coordinator = entry.runtime_data
73 
74  @callback
75  def _add_entities(devices: set[str] | None = None) -> None:
76  """Add devices."""
77  if devices is None:
78  devices = coordinator.new_devices
79  if not devices:
80  return
82  FritzboxBinarySensor(coordinator, ain, description)
83  for ain in devices
84  for description in BINARY_SENSOR_TYPES
85  if description.suitable(coordinator.data.devices[ain])
86  )
87 
88  entry.async_on_unload(coordinator.async_add_listener(_add_entities))
89 
90  _add_entities(set(coordinator.data.devices))
91 
92 
94  """Representation of a binary FRITZ!SmartHome device."""
95 
96  entity_description: FritzBinarySensorEntityDescription
97 
98  @property
99  def is_on(self) -> bool | None:
100  """Return true if sensor is on."""
101  return self.entity_descriptionentity_description.is_on(self.datadatadatadatadata)
None async_setup_entry(HomeAssistant hass, FritzboxConfigEntry entry, AddEntitiesCallback async_add_entities)