1
1
"""TeslaFi data update coordinator"""
2
2
3
- from datetime import timedelta
4
- from typing_extensions import override
3
+ from datetime import datetime , timedelta
4
+ from typing import override
5
+
5
6
from homeassistant .core import HomeAssistant , callback
6
7
from homeassistant .helpers .update_coordinator import DataUpdateCoordinator
7
8
@@ -23,7 +24,8 @@ class TeslaFiCoordinator(DataUpdateCoordinator[TeslaFiVehicle]):
23
24
_vehicle : TeslaFiVehicle
24
25
data : TeslaFiVehicle
25
26
26
- _override_next_refresh : timedelta = None
27
+ _last_charge_reset : datetime | None = None
28
+ _override_next_refresh : timedelta | None = None
27
29
28
30
def __init__ (
29
31
self ,
@@ -33,6 +35,7 @@ def __init__(
33
35
self ._client = client
34
36
self .data = None
35
37
self ._vehicle = TeslaFiVehicle ({})
38
+ self ._last_charge_reset = None
36
39
# TODO: implement custom Debouncer to ensure no more than 2x per min,
37
40
# as per API rate limit?
38
41
super ().__init__ (
@@ -55,6 +58,11 @@ def schedule_refresh_in(self, delta: timedelta):
55
58
self ._override_next_refresh = delta
56
59
self ._schedule_refresh ()
57
60
61
+ @property
62
+ def last_charge_reset (self ) -> datetime | None :
63
+ """Last charge reset time."""
64
+ return self ._last_charge_reset
65
+
58
66
@override
59
67
@callback
60
68
def _schedule_refresh (self ) -> None :
@@ -78,9 +86,11 @@ async def _refresh(self) -> TeslaFiVehicle:
78
86
"""Refresh"""
79
87
current = await self ._client .last_good ()
80
88
LOGGER .debug ("Last good: %s" , current )
89
+
90
+ self ._infer_charge_session (prev = self .data , current = current )
91
+
81
92
self ._vehicle .update_non_empty (current )
82
- last_remote_update = self ._vehicle .get ("Date" )
83
- LOGGER .debug ("Remote data last updated %s" , last_remote_update )
93
+ LOGGER .debug ("Remote data last updated %s" , self ._vehicle .last_remote_update )
84
94
85
95
assert current .vin
86
96
assert self ._vehicle .vin
@@ -101,3 +111,20 @@ async def _refresh(self) -> TeslaFiVehicle:
101
111
self ._override_next_refresh = None
102
112
103
113
return self ._vehicle
114
+
115
+ def _infer_charge_session (
116
+ self ,
117
+ prev : TeslaFiVehicle ,
118
+ current : TeslaFiVehicle ,
119
+ ):
120
+ if prev and current and (prev != current ):
121
+ if not prev .is_plugged_in and current .is_plugged_in :
122
+ LOGGER .info ("Vehicle is newly plugged in: resetting charge session" )
123
+ self ._last_charge_reset = current .last_remote_update
124
+ elif current .charge_session_number and (
125
+ prev .charge_session_number != current .charge_session_number
126
+ ):
127
+ LOGGER .info (
128
+ f"New charge session detected: { prev .charge_session_number } -> { current .charge_session_number } "
129
+ )
130
+ self ._last_charge_reset = current .last_remote_update
0 commit comments