1 """Support for Tailscale binary sensors."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from dataclasses
import dataclass
8 from tailscale
import Device
as TailscaleDevice
11 BinarySensorDeviceClass,
13 BinarySensorEntityDescription,
20 from .const
import DOMAIN
21 from .entity
import TailscaleEntity
24 @dataclass(frozen=True, kw_only=True)
26 """Describes a Tailscale binary sensor entity."""
28 is_on_fn: Callable[[TailscaleDevice], bool |
None]
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,
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,
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,
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,
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,
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,
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,
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,
87 async_add_entities: AddEntitiesCallback,
89 """Set up a Tailscale binary sensors based on a config entry."""
90 coordinator = hass.data[DOMAIN][entry.entry_id]
93 coordinator=coordinator,
95 description=description,
97 for device
in coordinator.data.values()
98 for description
in BINARY_SENSORS
103 """Defines a Tailscale binary sensor."""
105 entity_description: TailscaleBinarySensorEntityDescription
109 """Return the state of the sensor."""
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)