Add shorthand attributes to device_tracker entities (#126599)

* Add shorthand attributes to device_tracker entities

* Simplify

* Update config_entry.py

* Update config_entry.py

* Update device_tracker.py

* Update device_tracker.py
This commit is contained in:
epenet 2024-09-24 15:21:33 +02:00 committed by GitHub
parent 622f4975ef
commit 9dc84bfdca
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 50 additions and 42 deletions

View file

@ -170,6 +170,7 @@ class BaseTrackerEntity(Entity):
_attr_device_info: None = None
_attr_entity_category = EntityCategory.DIAGNOSTIC
_attr_source_type: SourceType
@cached_property
def battery_level(self) -> int | None:
@ -182,6 +183,8 @@ class BaseTrackerEntity(Entity):
@property
def source_type(self) -> SourceType | str:
"""Return the source type, eg gps or router, of the device."""
if hasattr(self, "_attr_source_type"):
return self._attr_source_type
raise NotImplementedError
@property
@ -195,9 +198,24 @@ class BaseTrackerEntity(Entity):
return attr
class TrackerEntity(BaseTrackerEntity):
CACHED_TRACKER_PROPERTIES_WITH_ATTR_ = {
"latitude",
"location_accuracy",
"location_name",
"longitude",
}
class TrackerEntity(
BaseTrackerEntity, cached_properties=CACHED_TRACKER_PROPERTIES_WITH_ATTR_
):
"""Base class for a tracked device."""
_attr_latitude: float | None = None
_attr_location_accuracy: int = 0
_attr_location_name: str | None = None
_attr_longitude: float | None = None
@cached_property
def should_poll(self) -> bool:
"""No polling for entities that have location pushed."""
@ -214,22 +232,22 @@ class TrackerEntity(BaseTrackerEntity):
Value in meters.
"""
return 0
return self._attr_location_accuracy
@cached_property
def location_name(self) -> str | None:
"""Return a location name for the current location of the device."""
return None
return self._attr_location_name
@cached_property
def latitude(self) -> float | None:
"""Return latitude value of the device."""
return None
return self._attr_latitude
@cached_property
def longitude(self) -> float | None:
"""Return longitude value of the device."""
return None
return self._attr_longitude
@property
def state(self) -> str | None:
@ -266,23 +284,36 @@ class TrackerEntity(BaseTrackerEntity):
return attr
class ScannerEntity(BaseTrackerEntity):
CACHED_SCANNER_PROPERTIES_WITH_ATTR_ = {
"ip_address",
"mac_address",
"hostname",
}
class ScannerEntity(
BaseTrackerEntity, cached_properties=CACHED_SCANNER_PROPERTIES_WITH_ATTR_
):
"""Base class for a tracked device that is on a scanned network."""
_attr_hostname: str | None = None
_attr_ip_address: str | None = None
_attr_mac_address: str | None = None
@cached_property
def ip_address(self) -> str | None:
"""Return the primary ip address of the device."""
return None
return self._attr_ip_address
@cached_property
def mac_address(self) -> str | None:
"""Return the mac address of the device."""
return None
return self._attr_mac_address
@cached_property
def hostname(self) -> str | None:
"""Return hostname of the device."""
return None
return self._attr_hostname
@property
def state(self) -> str:

View file

@ -89,6 +89,8 @@ class DevoloScannerEntity(
):
"""Representation of a devolo device tracker."""
_attr_source_type = SourceType.ROUTER
def __init__(
self,
coordinator: DataUpdateCoordinator[list[ConnectedStationInfo]],
@ -98,7 +100,7 @@ class DevoloScannerEntity(
"""Initialize entity."""
super().__init__(coordinator)
self._device = device
self._mac = mac
self._attr_mac_address = mac
@property
def extra_state_attributes(self) -> dict[str, str]:
@ -140,17 +142,7 @@ class DevoloScannerEntity(
if station.mac_address == self.mac_address
)
@property
def mac_address(self) -> str:
"""Return mac_address."""
return self._mac
@property
def source_type(self) -> SourceType:
"""Return tracker source type."""
return SourceType.ROUTER
@property
def unique_id(self) -> str:
"""Return unique ID of the entity."""
return f"{self._device.serial_number}_{self._mac}"
return f"{self._device.serial_number}_{self.mac_address}"

View file

@ -47,9 +47,9 @@ class TractiveDeviceTracker(TractiveEntity, TrackerEntity):
)
self._battery_level: int | None = item.hw_info.get("battery_level")
self._latitude: float = item.pos_report["latlong"][0]
self._longitude: float = item.pos_report["latlong"][1]
self._accuracy: int = item.pos_report["pos_uncertainty"]
self._attr_latitude = item.pos_report["latlong"][0]
self._attr_longitude = item.pos_report["latlong"][1]
self._attr_location_accuracy: int = item.pos_report["pos_uncertainty"]
self._source_type: str = item.pos_report["sensor_used"]
self._attr_unique_id = item.trackable["_id"]
@ -62,21 +62,6 @@ class TractiveDeviceTracker(TractiveEntity, TrackerEntity):
return SourceType.ROUTER
return SourceType.GPS
@property
def latitude(self) -> float:
"""Return latitude value of the device."""
return self._latitude
@property
def longitude(self) -> float:
"""Return longitude value of the device."""
return self._longitude
@property
def location_accuracy(self) -> int:
"""Return the gps accuracy of the device."""
return self._accuracy
@property
def battery_level(self) -> int | None:
"""Return the battery level of the device."""
@ -90,9 +75,9 @@ class TractiveDeviceTracker(TractiveEntity, TrackerEntity):
@callback
def _handle_position_update(self, event: dict[str, Any]) -> None:
self._latitude = event["latitude"]
self._longitude = event["longitude"]
self._accuracy = event["accuracy"]
self._attr_latitude = event["latitude"]
self._attr_longitude = event["longitude"]
self._attr_location_accuracy = event["accuracy"]
self._source_type = event["sensor_used"]
self._attr_available = True
self.async_write_ha_state()