Home Assistant Unofficial Reference 2024.12.1
binary_sensor.py
Go to the documentation of this file.
1 """Support for Tailscale binary sensors."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from dataclasses import dataclass
7 
8 from tailscale import Device as TailscaleDevice
9 
11  BinarySensorDeviceClass,
12  BinarySensorEntity,
13  BinarySensorEntityDescription,
14 )
15 from homeassistant.config_entries import ConfigEntry
16 from homeassistant.const import EntityCategory
17 from homeassistant.core import HomeAssistant
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 
20 from .const import DOMAIN
21 from .entity import TailscaleEntity
22 
23 
24 @dataclass(frozen=True, kw_only=True)
26  """Describes a Tailscale binary sensor entity."""
27 
28  is_on_fn: Callable[[TailscaleDevice], bool | None]
29 
30 
31 BINARY_SENSORS: tuple[TailscaleBinarySensorEntityDescription, ...] = (
33  key="update_available",
34  translation_key="client",
35  device_class=BinarySensorDeviceClass.UPDATE,
36  entity_category=EntityCategory.DIAGNOSTIC,
37  is_on_fn=lambda device: device.update_available,
38  ),
40  key="key_expiry_disabled",
41  translation_key="key_expiry_disabled",
42  entity_category=EntityCategory.DIAGNOSTIC,
43  is_on_fn=lambda device: device.key_expiry_disabled,
44  ),
46  key="client_supports_hair_pinning",
47  translation_key="client_supports_hair_pinning",
48  entity_category=EntityCategory.DIAGNOSTIC,
49  is_on_fn=lambda device: device.client_connectivity.client_supports.hair_pinning,
50  ),
52  key="client_supports_ipv6",
53  translation_key="client_supports_ipv6",
54  entity_category=EntityCategory.DIAGNOSTIC,
55  is_on_fn=lambda device: device.client_connectivity.client_supports.ipv6,
56  ),
58  key="client_supports_pcp",
59  translation_key="client_supports_pcp",
60  entity_category=EntityCategory.DIAGNOSTIC,
61  is_on_fn=lambda device: device.client_connectivity.client_supports.pcp,
62  ),
64  key="client_supports_pmp",
65  translation_key="client_supports_pmp",
66  entity_category=EntityCategory.DIAGNOSTIC,
67  is_on_fn=lambda device: device.client_connectivity.client_supports.pmp,
68  ),
70  key="client_supports_udp",
71  translation_key="client_supports_udp",
72  entity_category=EntityCategory.DIAGNOSTIC,
73  is_on_fn=lambda device: device.client_connectivity.client_supports.udp,
74  ),
76  key="client_supports_upnp",
77  translation_key="client_supports_upnp",
78  entity_category=EntityCategory.DIAGNOSTIC,
79  is_on_fn=lambda device: device.client_connectivity.client_supports.upnp,
80  ),
81 )
82 
83 
85  hass: HomeAssistant,
86  entry: ConfigEntry,
87  async_add_entities: AddEntitiesCallback,
88 ) -> None:
89  """Set up a Tailscale binary sensors based on a config entry."""
90  coordinator = hass.data[DOMAIN][entry.entry_id]
93  coordinator=coordinator,
94  device=device,
95  description=description,
96  )
97  for device in coordinator.data.values()
98  for description in BINARY_SENSORS
99  )
100 
101 
103  """Defines a Tailscale binary sensor."""
104 
105  entity_description: TailscaleBinarySensorEntityDescription
106 
107  @property
108  def is_on(self) -> bool | None:
109  """Return the state of the sensor."""
110  return self.entity_descriptionentity_description.is_on_fn(self.coordinator.data[self.device_iddevice_id])
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)