1 """Support for Tailscale sensors."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from dataclasses
import dataclass
7 from datetime
import datetime
9 from tailscale
import Device
as TailscaleDevice
14 SensorEntityDescription,
21 from .const
import DOMAIN
22 from .entity
import TailscaleEntity
25 @dataclass(frozen=True, kw_only=True)
27 """Describes a Tailscale sensor entity."""
29 value_fn: Callable[[TailscaleDevice], datetime | str |
None]
32 SENSORS: tuple[TailscaleSensorEntityDescription, ...] = (
35 translation_key=
"expires",
36 device_class=SensorDeviceClass.TIMESTAMP,
37 entity_category=EntityCategory.DIAGNOSTIC,
38 value_fn=
lambda device: device.expires,
43 entity_category=EntityCategory.DIAGNOSTIC,
44 value_fn=
lambda device: device.addresses[0]
if device.addresses
else None,
48 translation_key=
"last_seen",
49 device_class=SensorDeviceClass.TIMESTAMP,
50 value_fn=
lambda device: device.last_seen,
58 async_add_entities: AddEntitiesCallback,
60 """Set up a Tailscale sensors based on a config entry."""
61 coordinator = hass.data[DOMAIN][entry.entry_id]
64 coordinator=coordinator,
66 description=description,
68 for device
in coordinator.data.values()
69 for description
in SENSORS
74 """Defines a Tailscale sensor."""
76 entity_description: TailscaleSensorEntityDescription
80 """Return the state of the sensor."""
datetime|str|None native_value(self)
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)