Fix percentage_charged in Teslemetry (#136798)

Fix percentage_charged
This commit is contained in:
Brett Adams 2025-01-29 18:12:36 +10:00 committed by GitHub
parent 0c6c9e0ae6
commit 447096b295
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -4,7 +4,7 @@ from __future__ import annotations
from collections.abc import Callable from collections.abc import Callable
from dataclasses import dataclass from dataclasses import dataclass
from datetime import timedelta from datetime import datetime, timedelta
from propcache.api import cached_property from propcache.api import cached_property
from teslemetry_stream import Signal from teslemetry_stream import Signal
@ -369,8 +369,16 @@ VEHICLE_TIME_DESCRIPTIONS: tuple[TeslemetryTimeEntityDescription, ...] = (
), ),
) )
ENERGY_LIVE_DESCRIPTIONS: tuple[SensorEntityDescription, ...] = (
SensorEntityDescription( @dataclass(frozen=True, kw_only=True)
class TeslemetryEnergySensorEntityDescription(SensorEntityDescription):
"""Describes Teslemetry Sensor entity."""
value_fn: Callable[[StateType], StateType | datetime] = lambda x: x
ENERGY_LIVE_DESCRIPTIONS: tuple[TeslemetryEnergySensorEntityDescription, ...] = (
TeslemetryEnergySensorEntityDescription(
key="solar_power", key="solar_power",
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=UnitOfPower.WATT, native_unit_of_measurement=UnitOfPower.WATT,
@ -378,7 +386,7 @@ ENERGY_LIVE_DESCRIPTIONS: tuple[SensorEntityDescription, ...] = (
suggested_display_precision=2, suggested_display_precision=2,
device_class=SensorDeviceClass.POWER, device_class=SensorDeviceClass.POWER,
), ),
SensorEntityDescription( TeslemetryEnergySensorEntityDescription(
key="energy_left", key="energy_left",
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=UnitOfEnergy.WATT_HOUR, native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
@ -387,7 +395,7 @@ ENERGY_LIVE_DESCRIPTIONS: tuple[SensorEntityDescription, ...] = (
device_class=SensorDeviceClass.ENERGY_STORAGE, device_class=SensorDeviceClass.ENERGY_STORAGE,
entity_category=EntityCategory.DIAGNOSTIC, entity_category=EntityCategory.DIAGNOSTIC,
), ),
SensorEntityDescription( TeslemetryEnergySensorEntityDescription(
key="total_pack_energy", key="total_pack_energy",
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=UnitOfEnergy.WATT_HOUR, native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
@ -397,14 +405,15 @@ ENERGY_LIVE_DESCRIPTIONS: tuple[SensorEntityDescription, ...] = (
entity_category=EntityCategory.DIAGNOSTIC, entity_category=EntityCategory.DIAGNOSTIC,
entity_registry_enabled_default=False, entity_registry_enabled_default=False,
), ),
SensorEntityDescription( TeslemetryEnergySensorEntityDescription(
key="percentage_charged", key="percentage_charged",
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=PERCENTAGE, native_unit_of_measurement=PERCENTAGE,
device_class=SensorDeviceClass.BATTERY, device_class=SensorDeviceClass.BATTERY,
suggested_display_precision=2, suggested_display_precision=2,
value_fn=lambda value: value or 0,
), ),
SensorEntityDescription( TeslemetryEnergySensorEntityDescription(
key="battery_power", key="battery_power",
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=UnitOfPower.WATT, native_unit_of_measurement=UnitOfPower.WATT,
@ -412,7 +421,7 @@ ENERGY_LIVE_DESCRIPTIONS: tuple[SensorEntityDescription, ...] = (
suggested_display_precision=2, suggested_display_precision=2,
device_class=SensorDeviceClass.POWER, device_class=SensorDeviceClass.POWER,
), ),
SensorEntityDescription( TeslemetryEnergySensorEntityDescription(
key="load_power", key="load_power",
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=UnitOfPower.WATT, native_unit_of_measurement=UnitOfPower.WATT,
@ -420,7 +429,7 @@ ENERGY_LIVE_DESCRIPTIONS: tuple[SensorEntityDescription, ...] = (
suggested_display_precision=2, suggested_display_precision=2,
device_class=SensorDeviceClass.POWER, device_class=SensorDeviceClass.POWER,
), ),
SensorEntityDescription( TeslemetryEnergySensorEntityDescription(
key="grid_power", key="grid_power",
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=UnitOfPower.WATT, native_unit_of_measurement=UnitOfPower.WATT,
@ -428,7 +437,7 @@ ENERGY_LIVE_DESCRIPTIONS: tuple[SensorEntityDescription, ...] = (
suggested_display_precision=2, suggested_display_precision=2,
device_class=SensorDeviceClass.POWER, device_class=SensorDeviceClass.POWER,
), ),
SensorEntityDescription( TeslemetryEnergySensorEntityDescription(
key="grid_services_power", key="grid_services_power",
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=UnitOfPower.WATT, native_unit_of_measurement=UnitOfPower.WATT,
@ -436,7 +445,7 @@ ENERGY_LIVE_DESCRIPTIONS: tuple[SensorEntityDescription, ...] = (
suggested_display_precision=2, suggested_display_precision=2,
device_class=SensorDeviceClass.POWER, device_class=SensorDeviceClass.POWER,
), ),
SensorEntityDescription( TeslemetryEnergySensorEntityDescription(
key="generator_power", key="generator_power",
state_class=SensorStateClass.MEASUREMENT, state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=UnitOfPower.WATT, native_unit_of_measurement=UnitOfPower.WATT,
@ -445,7 +454,7 @@ ENERGY_LIVE_DESCRIPTIONS: tuple[SensorEntityDescription, ...] = (
device_class=SensorDeviceClass.POWER, device_class=SensorDeviceClass.POWER,
entity_registry_enabled_default=False, entity_registry_enabled_default=False,
), ),
SensorEntityDescription( TeslemetryEnergySensorEntityDescription(
key="island_status", key="island_status",
device_class=SensorDeviceClass.ENUM, device_class=SensorDeviceClass.ENUM,
options=[ options=[
@ -555,6 +564,7 @@ async def async_setup_entry(
if energysite.live_coordinator if energysite.live_coordinator
for description in ENERGY_LIVE_DESCRIPTIONS for description in ENERGY_LIVE_DESCRIPTIONS
if description.key in energysite.live_coordinator.data if description.key in energysite.live_coordinator.data
or description.key == "percentage_charged"
) )
entities.extend( entities.extend(
@ -704,12 +714,12 @@ class TeslemetryVehicleTimeSensorEntity(TeslemetryVehicleEntity, SensorEntity):
class TeslemetryEnergyLiveSensorEntity(TeslemetryEnergyLiveEntity, SensorEntity): class TeslemetryEnergyLiveSensorEntity(TeslemetryEnergyLiveEntity, SensorEntity):
"""Base class for Teslemetry energy site metric sensors.""" """Base class for Teslemetry energy site metric sensors."""
entity_description: SensorEntityDescription entity_description: TeslemetryEnergySensorEntityDescription
def __init__( def __init__(
self, self,
data: TeslemetryEnergyData, data: TeslemetryEnergyData,
description: SensorEntityDescription, description: TeslemetryEnergySensorEntityDescription,
) -> None: ) -> None:
"""Initialize the sensor.""" """Initialize the sensor."""
self.entity_description = description self.entity_description = description
@ -718,7 +728,7 @@ class TeslemetryEnergyLiveSensorEntity(TeslemetryEnergyLiveEntity, SensorEntity)
def _async_update_attrs(self) -> None: def _async_update_attrs(self) -> None:
"""Update the attributes of the sensor.""" """Update the attributes of the sensor."""
self._attr_available = not self.is_none self._attr_available = not self.is_none
self._attr_native_value = self._value self._attr_native_value = self.entity_description.value_fn(self._value)
class TeslemetryWallConnectorSensorEntity(TeslemetryWallConnectorEntity, SensorEntity): class TeslemetryWallConnectorSensorEntity(TeslemetryWallConnectorEntity, SensorEntity):