core/homeassistant/components/traccar_server/entity.py

70 lines
2.2 KiB
Python

"""Base entity for Traccar Server."""
from __future__ import annotations
from typing import Any
from pytraccar import DeviceModel, GeofenceModel, PositionModel
from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.dispatcher import async_dispatcher_connect
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .const import DOMAIN
from .coordinator import TraccarServerCoordinator
class TraccarServerEntity(CoordinatorEntity[TraccarServerCoordinator]):
"""Base entity for Traccar Server."""
def __init__(
self,
coordinator: TraccarServerCoordinator,
device: DeviceModel,
) -> None:
"""Initialize the Traccar Server entity."""
super().__init__(coordinator)
self.device_id = device["id"]
self._attr_device_info = DeviceInfo(
identifiers={(DOMAIN, device["uniqueId"])},
model=device["model"],
name=device["name"],
)
self._attr_unique_id = device["uniqueId"]
@property
def available(self) -> bool:
"""Return True if entity is available."""
return bool(self.coordinator.data and self.device_id in self.coordinator.data)
@property
def traccar_device(self) -> DeviceModel:
"""Return the device."""
return self.coordinator.data[self.device_id]["device"]
@property
def traccar_geofence(self) -> GeofenceModel | None:
"""Return the geofence."""
return self.coordinator.data[self.device_id]["geofence"]
@property
def traccar_position(self) -> PositionModel:
"""Return the position."""
return self.coordinator.data[self.device_id]["position"]
@property
def traccar_attributes(self) -> dict[str, Any]:
"""Return the attributes."""
return self.coordinator.data[self.device_id]["attributes"]
async def async_added_to_hass(self) -> None:
"""Entity added to hass."""
self.async_on_remove(
async_dispatcher_connect(
self.hass,
f"{DOMAIN}_{self.device_id}",
self.async_write_ha_state,
)
)
await super().async_added_to_hass()