Skip to content

Commit 73962c4

Browse files
committed
Add device tracker
1 parent d802e98 commit 73962c4

File tree

2 files changed

+91
-0
lines changed

2 files changed

+91
-0
lines changed

custom_components/teslemetry/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
Platform.BUTTON,
2424
Platform.COVER,
2525
Platform.CLIMATE,
26+
Platform.DEVICE_TRACKER,
2627
Platform.SENSOR,
2728
]
2829

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
"""Device Tracker platform for Teslemetry integration."""
2+
from __future__ import annotations
3+
4+
from homeassistant.components.device_tracker import SourceType
5+
from homeassistant.components.device_tracker.config_entry import TrackerEntity
6+
from homeassistant.config_entries import ConfigEntry
7+
from homeassistant.core import HomeAssistant
8+
from homeassistant.helpers.entity_platform import AddEntitiesCallback
9+
from homeassistant.helpers.typing import StateType
10+
11+
from .const import DOMAIN
12+
from .entity import (
13+
TeslemetryEnergyEntity,
14+
TeslemetryVehicleEntity,
15+
TeslemetryWallConnectorEntity,
16+
)
17+
from .coordinator import (
18+
TeslemetryEnergyDataCoordinator,
19+
TeslemetryVehicleDataCoordinator,
20+
)
21+
from .models import TeslemetryEnergyData, TeslemetryVehicleData
22+
23+
24+
async def async_setup_entry(
25+
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
26+
) -> None:
27+
"""Set up the Teslemetry device tracker platform from a config entry."""
28+
data = hass.data[DOMAIN][entry.entry_id]
29+
30+
async_add_entities(
31+
klass(vehicle)
32+
for klass in (
33+
TeslemetryDeviceTrackerLocationEntity,
34+
TeslemetryDeviceTrackerRouteEntity,
35+
)
36+
for vehicle in data.vehicles
37+
)
38+
39+
40+
class TeslemetryDeviceTrackerEntity(TeslemetryVehicleEntity, TrackerEntity):
41+
"""Base class for Teslemetry Tracker Entities."""
42+
43+
def __init__(
44+
self,
45+
vehicle: TeslemetryVehicleData,
46+
) -> None:
47+
"""Initialize the device tracker."""
48+
super().__init__(vehicle, self.key)
49+
50+
@property
51+
def source_type(self) -> SourceType | str:
52+
"""Return the source type of the device tracker."""
53+
return SourceType.GPS
54+
55+
@property
56+
def available(self) -> bool:
57+
"""Return if sensor is available."""
58+
return super().available and self.longitude is not None and self.latitude is not None
59+
60+
61+
class TeslemetryDeviceTrackerLocationEntity(TeslemetryDeviceTrackerEntity):
62+
"""Vehicle Location Device Tracker Class."""
63+
64+
key = "location"
65+
66+
@property
67+
def longitude(self) -> float | None:
68+
"""Return the longitude of the device tracker."""
69+
return self.get("drive_state_longitude")
70+
71+
@property
72+
def latitude(self) -> float | None:
73+
"""Return the latitude of the device tracker."""
74+
return self.get("drive_state_latitude")
75+
76+
77+
class TeslemetryDeviceTrackerRouteEntity(TeslemetryDeviceTrackerEntity):
78+
"""Vehicle Navigation Device Tracker Class."""
79+
80+
key = "route"
81+
82+
@property
83+
def longitude(self) -> float | None:
84+
"""Return the longitude of the device tracker."""
85+
return self.get("drive_state_active_route_longitude")
86+
87+
@property
88+
def latitude(self) -> float | None:
89+
"""Return the latitude of the device tracker."""
90+
return self.get("drive_state_active_route_latitude")

0 commit comments

Comments
 (0)