diff --git a/homeassistant/components/tessie/sensor.py b/homeassistant/components/tessie/sensor.py index 7ed1b0416e3..07f54ebde5b 100644 --- a/homeassistant/components/tessie/sensor.py +++ b/homeassistant/components/tessie/sensor.py @@ -3,6 +3,7 @@ from __future__ import annotations from collections.abc import Callable from dataclasses import dataclass +from datetime import datetime, timedelta from homeassistant.components.sensor import ( SensorDeviceClass, @@ -24,20 +25,29 @@ from homeassistant.const import ( UnitOfTemperature, UnitOfTime, ) -from homeassistant.core import HomeAssistant +from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.typing import StateType +from homeassistant.util import dt as dt_util from .const import DOMAIN from .coordinator import TessieStateUpdateCoordinator from .entity import TessieEntity +@callback +def hours_to_datetime(value: StateType) -> datetime | None: + """Convert relative hours into absolute datetime.""" + if isinstance(value, (int, float)) and value > 0: + return dt_util.now() + timedelta(minutes=value) + return None + + @dataclass(frozen=True, kw_only=True) class TessieSensorEntityDescription(SensorEntityDescription): """Describes Tessie Sensor entity.""" - value_fn: Callable[[StateType], StateType] = lambda x: x + value_fn: Callable[[StateType], StateType | datetime] = lambda x: x DESCRIPTIONS: tuple[TessieSensorEntityDescription, ...] = ( @@ -81,6 +91,12 @@ DESCRIPTIONS: tuple[TessieSensorEntityDescription, ...] = ( device_class=SensorDeviceClass.SPEED, entity_category=EntityCategory.DIAGNOSTIC, ), + TessieSensorEntityDescription( + key="charge_state_minutes_to_full_charge", + device_class=SensorDeviceClass.TIMESTAMP, + entity_category=EntityCategory.DIAGNOSTIC, + value_fn=hours_to_datetime, + ), TessieSensorEntityDescription( key="charge_state_battery_range", state_class=SensorStateClass.MEASUREMENT, @@ -243,6 +259,6 @@ class TessieSensorEntity(TessieEntity, SensorEntity): self.entity_description = description @property - def native_value(self) -> StateType: + def native_value(self) -> StateType | datetime: """Return the state of the sensor.""" return self.entity_description.value_fn(self.get()) diff --git a/homeassistant/components/tessie/strings.json b/homeassistant/components/tessie/strings.json index d8ccf47bb73..1f0a42bb781 100644 --- a/homeassistant/components/tessie/strings.json +++ b/homeassistant/components/tessie/strings.json @@ -88,6 +88,9 @@ "charge_state_battery_range": { "name": "Battery range" }, + "charge_state_minutes_to_full_charge": { + "name": "Time to full charge" + }, "drive_state_speed": { "name": "Speed" }, diff --git a/tests/components/tessie/fixtures/vehicles.json b/tests/components/tessie/fixtures/vehicles.json index c1b0851eee6..359e23f9cdd 100644 --- a/tests/components/tessie/fixtures/vehicles.json +++ b/tests/components/tessie/fixtures/vehicles.json @@ -62,7 +62,7 @@ "fast_charger_type": "ACSingleWireCAN", "ideal_battery_range": 263.68, "max_range_charge_counter": 0, - "minutes_to_full_charge": 30, + "minutes_to_full_charge": 0, "not_enough_power_to_heat": null, "off_peak_charging_enabled": false, "off_peak_charging_times": "all_week", @@ -77,7 +77,7 @@ "scheduled_departure_time": 1694899800, "scheduled_departure_time_minutes": 450, "supercharger_session_trip_planner": false, - "time_to_full_charge": 0.5, + "time_to_full_charge": 0, "timestamp": 1701139037461, "trip_charging": false, "usable_battery_level": 75,