1 """Support for Traccar server sensors."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from dataclasses
import dataclass
7 from typing
import Any, Literal
9 from pytraccar
import DeviceModel, GeofenceModel, PositionModel
14 SensorEntityDescription,
23 from .const
import DOMAIN
24 from .coordinator
import TraccarServerCoordinator
25 from .entity
import TraccarServerEntity
28 @dataclass(frozen=True, kw_only=True)
30 """Describe Traccar Server sensor entity."""
32 data_key: Literal[
"position",
"device",
"geofence",
"attributes"]
33 entity_registry_enabled_default =
False
34 entity_category = EntityCategory.DIAGNOSTIC
35 value_fn: Callable[[_T], StateType]
38 TRACCAR_SERVER_SENSOR_ENTITY_DESCRIPTIONS: tuple[
39 TraccarServerSensorEntityDescription[Any], ...
41 TraccarServerSensorEntityDescription[PositionModel](
42 key=
"attributes.batteryLevel",
44 native_unit_of_measurement=PERCENTAGE,
45 device_class=SensorDeviceClass.BATTERY,
46 state_class=SensorStateClass.MEASUREMENT,
47 suggested_display_precision=0,
48 value_fn=
lambda x: x[
"attributes"].
get(
"batteryLevel"),
50 TraccarServerSensorEntityDescription[PositionModel](
53 device_class=SensorDeviceClass.SPEED,
54 state_class=SensorStateClass.MEASUREMENT,
55 native_unit_of_measurement=UnitOfSpeed.KNOTS,
56 suggested_display_precision=0,
57 value_fn=
lambda x: x[
"speed"],
59 TraccarServerSensorEntityDescription[PositionModel](
62 translation_key=
"altitude",
63 state_class=SensorStateClass.MEASUREMENT,
64 native_unit_of_measurement=UnitOfLength.METERS,
65 suggested_display_precision=1,
66 value_fn=
lambda x: x[
"altitude"],
68 TraccarServerSensorEntityDescription[PositionModel](
71 translation_key=
"address",
72 value_fn=
lambda x: x[
"address"],
74 TraccarServerSensorEntityDescription[GeofenceModel |
None](
77 translation_key=
"geofence",
78 value_fn=
lambda x: x[
"name"]
if x
else None,
86 async_add_entities: AddEntitiesCallback,
88 """Set up sensor entities."""
89 coordinator: TraccarServerCoordinator = hass.data[DOMAIN][entry.entry_id]
92 coordinator=coordinator,
93 device=entry[
"device"],
94 description=description,
96 for entry
in coordinator.data.values()
97 for description
in TRACCAR_SERVER_SENSOR_ENTITY_DESCRIPTIONS
102 """Represent a tracked device."""
104 _attr_has_entity_name =
True
105 entity_description: TraccarServerSensorEntityDescription[_T]
109 coordinator: TraccarServerCoordinator,
111 description: TraccarServerSensorEntityDescription[_T],
113 """Initialize the Traccar Server sensor."""
114 super().
__init__(coordinator, device)
117 f
"{device['uniqueId']}_{description.data_key}_{description.key}"
122 """Return the value of the sensor."""
124 getattr(self, f
"traccar_{self.entity_description.data_key}")
StateType native_value(self)
None __init__(self, TraccarServerCoordinator coordinator, DeviceModel device, TraccarServerSensorEntityDescription[_T] description)
web.Response get(self, web.Request request, str config_key)
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)