22from __future__ import annotations
33
44import logging
5- from datetime import datetime , timezone
5+ from datetime import datetime
66
77from homeassistant .helpers .entity_registry import RegistryEntry
88
3838 ATTR_PREVIOUS_BATTERY_LEVEL ,
3939 ATTR_REMOVE ,
4040 LAST_REPLACED ,
41+ LAST_REPORTED ,
42+ LAST_REPORTED_LEVEL ,
4143)
4244
4345_LOGGER = logging .getLogger (__name__ )
@@ -51,8 +53,6 @@ class BatteryNotesCoordinator(DataUpdateCoordinator):
5153 battery_type : str
5254 battery_quantity : int
5355 battery_low_threshold : int
54- last_reported : datetime = None
55- last_reported_level : float = None
5656 wrapped_battery : RegistryEntry
5757 _current_battery_level : str = None
5858 enable_replaced : bool = True
@@ -135,7 +135,7 @@ def current_battery_level(self, value):
135135 _LOGGER .debug ("battery_increased event fired" )
136136
137137 if self ._current_battery_level not in [STATE_UNAVAILABLE , STATE_UNKNOWN ]:
138- self .last_reported = datetime .now ( timezone . utc )
138+ self .last_reported = datetime .utcnow ( )
139139 self .last_reported_level = self ._current_battery_level
140140 self ._previous_battery_low = self .battery_low
141141 self ._previous_battery_level = self ._current_battery_level
@@ -159,6 +159,48 @@ def last_replaced(self) -> datetime | None:
159159 return last_replaced_date
160160 return None
161161
162+ @property
163+ def last_reported (self ) -> datetime | None :
164+ """Get the last reported datetime."""
165+ device_entry = self .store .async_get_device (self .device_id )
166+ if device_entry :
167+ if LAST_REPORTED in device_entry :
168+ if device_entry [LAST_REPORTED ]:
169+ last_reported_date = datetime .fromisoformat (
170+ str (device_entry [LAST_REPORTED ]) + "+00:00"
171+ )
172+ return last_reported_date
173+ return None
174+
175+ @last_reported .setter
176+ def last_reported (self , value ):
177+ """Set the last reported datetime and store it."""
178+ device_entry = {"battery_last_reported" : value }
179+
180+ self .async_update_device_config (
181+ device_id = self .device_id , data = device_entry
182+ )
183+
184+ @property
185+ def last_reported_level (self ) -> float | None :
186+ """Get the last reported level."""
187+ device_entry = self .store .async_get_device (self .device_id )
188+ if device_entry :
189+ if LAST_REPORTED_LEVEL in device_entry :
190+ if device_entry [LAST_REPORTED_LEVEL ]:
191+ last_reported_level = float (device_entry [LAST_REPORTED_LEVEL ])
192+ return self ._rounded_level (last_reported_level )
193+ return None
194+
195+ @last_reported_level .setter
196+ def last_reported_level (self , value ):
197+ """Set the last reported level and store it."""
198+ device_entry = {"battery_last_reported_level" : value }
199+
200+ self .async_update_device_config (
201+ device_id = self .device_id , data = device_entry
202+ )
203+
162204 @property
163205 def battery_low (self ) -> bool :
164206 """Check if battery low against threshold."""
@@ -172,10 +214,14 @@ def battery_low(self) -> bool:
172214 @property
173215 def rounded_battery_level (self ) -> float :
174216 """Return the battery level, rounded if preferred."""
175- if isfloat (self .current_battery_level ):
176- return round (float (self .current_battery_level ), 0 if self ._round_battery else 1 )
217+ return self ._rounded_level (self .current_battery_level )
218+
219+ def _rounded_level (self , value ) -> float :
220+ """Round the level, if preferred."""
221+ if isfloat (value ):
222+ return round (float (value ), 0 if value else 1 )
177223 else :
178- return self . current_battery_level
224+ return value
179225
180226 async def _async_update_data (self ):
181227 """Update data."""
0 commit comments