1 """Contains sensors exposed by the Starlink integration."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from dataclasses
import dataclass
7 from datetime
import datetime, timedelta
12 SensorEntityDescription,
28 from .const
import DOMAIN
29 from .coordinator
import StarlinkData
30 from .entity
import StarlinkEntity
34 hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
36 """Set up all sensors for this entry."""
37 coordinator = hass.data[DOMAIN][entry.entry_id]
44 @dataclass(frozen=True, kw_only=True)
46 """Describes a Starlink sensor entity."""
48 value_fn: Callable[[StarlinkData], datetime | StateType]
52 """A SensorEntity for Starlink devices. Handles creating unique IDs."""
54 entity_description: StarlinkSensorEntityDescription
58 """Calculate the sensor value from the entity description."""
62 SENSORS: tuple[StarlinkSensorEntityDescription, ...] = (
65 translation_key=
"ping",
66 state_class=SensorStateClass.MEASUREMENT,
67 native_unit_of_measurement=UnitOfTime.MILLISECONDS,
68 suggested_display_precision=0,
69 value_fn=
lambda data: data.status[
"pop_ping_latency_ms"],
73 translation_key=
"azimuth",
74 state_class=SensorStateClass.MEASUREMENT,
75 entity_category=EntityCategory.DIAGNOSTIC,
76 native_unit_of_measurement=DEGREE,
77 entity_registry_enabled_default=
False,
78 suggested_display_precision=0,
79 value_fn=
lambda data: data.status[
"direction_azimuth"],
83 translation_key=
"elevation",
84 state_class=SensorStateClass.MEASUREMENT,
85 entity_category=EntityCategory.DIAGNOSTIC,
86 native_unit_of_measurement=DEGREE,
87 entity_registry_enabled_default=
False,
88 suggested_display_precision=0,
89 value_fn=
lambda data: data.status[
"direction_elevation"],
92 key=
"uplink_throughput",
93 translation_key=
"uplink_throughput",
94 state_class=SensorStateClass.MEASUREMENT,
95 device_class=SensorDeviceClass.DATA_RATE,
96 native_unit_of_measurement=UnitOfDataRate.BITS_PER_SECOND,
97 suggested_display_precision=0,
98 value_fn=
lambda data: data.status[
"uplink_throughput_bps"],
101 key=
"downlink_throughput",
102 translation_key=
"downlink_throughput",
103 state_class=SensorStateClass.MEASUREMENT,
104 device_class=SensorDeviceClass.DATA_RATE,
105 native_unit_of_measurement=UnitOfDataRate.BITS_PER_SECOND,
106 suggested_display_precision=0,
107 value_fn=
lambda data: data.status[
"downlink_throughput_bps"],
110 key=
"last_boot_time",
111 translation_key=
"last_boot_time",
112 device_class=SensorDeviceClass.TIMESTAMP,
113 entity_category=EntityCategory.DIAGNOSTIC,
114 value_fn=
lambda data:
now() -
timedelta(seconds=data.status[
"uptime"]),
117 key=
"ping_drop_rate",
118 translation_key=
"ping_drop_rate",
119 state_class=SensorStateClass.MEASUREMENT,
120 native_unit_of_measurement=PERCENTAGE,
121 value_fn=
lambda data: data.status[
"pop_ping_drop_rate"] * 100,
StateType|datetime native_value(self)
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
datetime now(HomeAssistant hass)