Home Assistant Unofficial Reference 2024.12.1
device_tracker.py
Go to the documentation of this file.
1 """Support for Subaru device tracker."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
7 from subarulink.const import LATITUDE, LONGITUDE, TIMESTAMP
8 
10 from homeassistant.config_entries import ConfigEntry
11 from homeassistant.core import HomeAssistant
12 from homeassistant.helpers.entity_platform import AddEntitiesCallback
14  CoordinatorEntity,
15  DataUpdateCoordinator,
16 )
17 
18 from . import get_device_info
19 from .const import (
20  DOMAIN,
21  ENTRY_COORDINATOR,
22  ENTRY_VEHICLES,
23  VEHICLE_HAS_REMOTE_SERVICE,
24  VEHICLE_STATUS,
25  VEHICLE_VIN,
26 )
27 
28 
30  hass: HomeAssistant,
31  config_entry: ConfigEntry,
32  async_add_entities: AddEntitiesCallback,
33 ) -> None:
34  """Set up the Subaru device tracker by config_entry."""
35  entry: dict = hass.data[DOMAIN][config_entry.entry_id]
36  coordinator: DataUpdateCoordinator = entry[ENTRY_COORDINATOR]
37  vehicle_info: dict = entry[ENTRY_VEHICLES]
39  SubaruDeviceTracker(vehicle, coordinator)
40  for vehicle in vehicle_info.values()
41  if vehicle[VEHICLE_HAS_REMOTE_SERVICE]
42  )
43 
44 
46  CoordinatorEntity[DataUpdateCoordinator[dict[str, Any]]], TrackerEntity
47 ):
48  """Class for Subaru device tracker."""
49 
50  _attr_translation_key = "location"
51  _attr_has_entity_name = True
52  _attr_name = None
53 
54  def __init__(self, vehicle_info: dict, coordinator: DataUpdateCoordinator) -> None:
55  """Initialize the device tracker."""
56  super().__init__(coordinator)
57  self.vinvin = vehicle_info[VEHICLE_VIN]
58  self._attr_device_info_attr_device_info = get_device_info(vehicle_info)
59  self._attr_unique_id_attr_unique_id = f"{self.vin}_location"
60 
61  @property
62  def extra_state_attributes(self) -> dict[str, Any] | None:
63  """Return entity specific state attributes."""
64  return {
65  "Position timestamp": self.coordinator.data[self.vinvin][VEHICLE_STATUS].get(
66  TIMESTAMP
67  )
68  }
69 
70  @property
71  def latitude(self) -> float | None:
72  """Return latitude value of the vehicle."""
73  return self.coordinator.data[self.vinvin][VEHICLE_STATUS].get(LATITUDE)
74 
75  @property
76  def longitude(self) -> float | None:
77  """Return longitude value of the vehicle."""
78  return self.coordinator.data[self.vinvin][VEHICLE_STATUS].get(LONGITUDE)
79 
80  @property
81  def available(self) -> bool:
82  """Return if entity is available."""
83  if vehicle_data := self.coordinator.data.get(self.vinvin):
84  if status := vehicle_data.get(VEHICLE_STATUS):
85  return status.keys() & {LATITUDE, LONGITUDE, TIMESTAMP}
86  return False
None __init__(self, dict vehicle_info, DataUpdateCoordinator coordinator)
web.Response get(self, web.Request request, str config_key)
Definition: view.py:88
Definition: config_entry.py:1
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
def get_device_info(vehicle_info)
Definition: __init__.py:167