Skip to content

Commit b98dc16

Browse files
Retain the battery_last_reported in store (#972)
* Retain the battery_last_reported in store * Lint fix
1 parent cc7f919 commit b98dc16

File tree

3 files changed

+57
-7
lines changed

3 files changed

+57
-7
lines changed

custom_components/battery_notes/const.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
ISSUEURL = manifest_data.get("issue_tracker")
2222
MANUFACTURER = "@Andrew-CodeChimp"
2323
LAST_REPLACED = "battery_last_replaced"
24+
LAST_REPORTED = "battery_last_reported"
25+
LAST_REPORTED_LEVEL = "battery_last_reported_level"
2426

2527
DOMAIN_CONFIG = "config"
2628

custom_components/battery_notes/coordinator.py

Lines changed: 53 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from __future__ import annotations
33

44
import logging
5-
from datetime import datetime, timezone
5+
from datetime import datetime
66

77
from homeassistant.helpers.entity_registry import RegistryEntry
88

@@ -38,6 +38,8 @@
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."""

custom_components/battery_notes/store.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ class DeviceEntry:
3131

3232
device_id = attr.ib(type=str, default=None)
3333
battery_last_replaced = attr.ib(type=datetime, default=None)
34+
battery_last_reported = attr.ib(type=datetime, default=None)
35+
battery_last_reported_level = attr.ib(type=float, default=None)
3436

3537

3638
class MigratableStore(Store):

0 commit comments

Comments
 (0)