Home Assistant Unofficial Reference 2024.12.1
device_tracker.py
Go to the documentation of this file.
1 """Device tracker for MyBMW vehicles."""
2 
3 from __future__ import annotations
4 
5 import logging
6 from typing import Any
7 
8 from bimmer_connected.vehicle import MyBMWVehicle
9 
10 from homeassistant.components.device_tracker import TrackerEntity
11 from homeassistant.core import HomeAssistant
12 from homeassistant.helpers.entity_platform import AddEntitiesCallback
13 
14 from . import BMWConfigEntry
15 from .const import ATTR_DIRECTION
16 from .coordinator import BMWDataUpdateCoordinator
17 from .entity import BMWBaseEntity
18 
19 _LOGGER = logging.getLogger(__name__)
20 
21 
23  hass: HomeAssistant,
24  config_entry: BMWConfigEntry,
25  async_add_entities: AddEntitiesCallback,
26 ) -> None:
27  """Set up the MyBMW tracker from config entry."""
28  coordinator = config_entry.runtime_data.coordinator
29  entities: list[BMWDeviceTracker] = []
30 
31  for vehicle in coordinator.account.vehicles:
32  entities.append(BMWDeviceTracker(coordinator, vehicle))
33  if not vehicle.is_vehicle_tracking_enabled:
34  _LOGGER.info(
35  (
36  "Tracking is (currently) disabled for vehicle %s (%s), defaulting"
37  " to unknown"
38  ),
39  vehicle.name,
40  vehicle.vin,
41  )
42  async_add_entities(entities)
43 
44 
45 class BMWDeviceTracker(BMWBaseEntity, TrackerEntity):
46  """MyBMW device tracker."""
47 
48  _attr_force_update = False
49  _attr_translation_key = "car"
50  _attr_icon = "mdi:car"
51 
52  def __init__(
53  self,
54  coordinator: BMWDataUpdateCoordinator,
55  vehicle: MyBMWVehicle,
56  ) -> None:
57  """Initialize the Tracker."""
58  super().__init__(coordinator, vehicle)
59 
60  self._attr_unique_id_attr_unique_id = vehicle.vin
61  self._attr_name_attr_name = None
62 
63  @property
64  def extra_state_attributes(self) -> dict[str, Any]:
65  """Return entity specific state attributes."""
66  return {ATTR_DIRECTION: self.vehiclevehicle.vehicle_location.heading}
67 
68  @property
69  def latitude(self) -> float | None:
70  """Return latitude value of the device."""
71  return (
72  self.vehiclevehicle.vehicle_location.location[0]
73  if self.vehiclevehicle.is_vehicle_tracking_enabled
74  and self.vehiclevehicle.vehicle_location.location
75  else None
76  )
77 
78  @property
79  def longitude(self) -> float | None:
80  """Return longitude value of the device."""
81  return (
82  self.vehiclevehicle.vehicle_location.location[1]
83  if self.vehiclevehicle.is_vehicle_tracking_enabled
84  and self.vehiclevehicle.vehicle_location.location
85  else None
86  )
None __init__(self, BMWDataUpdateCoordinator coordinator, MyBMWVehicle vehicle)
None async_setup_entry(HomeAssistant hass, BMWConfigEntry config_entry, AddEntitiesCallback async_add_entities)