Home Assistant Unofficial Reference 2024.12.1
device_tracker.py
Go to the documentation of this file.
1 """Contains device trackers exposed by the Starlink integration."""
2 
3 from collections.abc import Callable
4 from dataclasses import dataclass
5 from typing import Any
6 
8  TrackerEntity,
9  TrackerEntityDescription,
10 )
11 from homeassistant.config_entries import ConfigEntry
12 from homeassistant.core import HomeAssistant
13 from homeassistant.helpers.entity_platform import AddEntitiesCallback
14 
15 from .const import ATTR_ALTITUDE, DOMAIN
16 from .coordinator import StarlinkData
17 from .entity import StarlinkEntity
18 
19 
21  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
22 ) -> None:
23  """Set up all binary sensors for this entry."""
24  coordinator = hass.data[DOMAIN][entry.entry_id]
25 
27  StarlinkDeviceTrackerEntity(coordinator, description)
28  for description in DEVICE_TRACKERS
29  )
30 
31 
32 @dataclass(frozen=True, kw_only=True)
33 class StarlinkDeviceTrackerEntityDescription(TrackerEntityDescription):
34  """Describes a Starlink button entity."""
35 
36  latitude_fn: Callable[[StarlinkData], float]
37  longitude_fn: Callable[[StarlinkData], float]
38  altitude_fn: Callable[[StarlinkData], float]
39 
40 
41 DEVICE_TRACKERS = [
43  key="device_location",
44  translation_key="device_location",
45  entity_registry_enabled_default=False,
46  latitude_fn=lambda data: data.location["latitude"],
47  longitude_fn=lambda data: data.location["longitude"],
48  altitude_fn=lambda data: data.location["altitude"],
49  ),
50 ]
51 
52 
54  """A TrackerEntity for Starlink devices. Handles creating unique IDs."""
55 
56  entity_description: StarlinkDeviceTrackerEntityDescription
57 
58  @property
59  def latitude(self) -> float | None:
60  """Return latitude value of the device."""
61  return self.entity_descriptionentity_description.latitude_fn(self.coordinator.data)
62 
63  @property
64  def longitude(self) -> float | None:
65  """Return longitude value of the device."""
66  return self.entity_descriptionentity_description.longitude_fn(self.coordinator.data)
67 
68  @property
69  def extra_state_attributes(self) -> dict[str, Any]:
70  """Return device specific attributes."""
71  return {
72  ATTR_ALTITUDE: self.entity_descriptionentity_description.altitude_fn(self.coordinator.data)
73  }