|
1 | 1 | from enum import Enum, auto
|
2 |
| -from datetime import datetime |
| 2 | +from datetime import datetime, timedelta, timezone |
3 | 3 | from typing import Optional
|
4 | 4 | import ciso8601
|
5 | 5 | import uuid
|
@@ -55,9 +55,11 @@ def __init__(
|
55 | 55 | self._realtime = {}
|
56 | 56 | self._devices: dict[str, SenseDevice] = {}
|
57 | 57 | self._trend_data: dict[Scale, dict] = {}
|
| 58 | + self._trend_data_updated: dict[Scale, datetime] = {} |
58 | 59 | self._monitor = {}
|
59 | 60 | for scale in Scale:
|
60 | 61 | self._trend_data[scale] = {}
|
| 62 | + self._trend_data_updated[scale] = datetime(2000, 1, 1, tzinfo=timezone.utc) |
61 | 63 | self.set_ssl_context(ssl_verify, ssl_cafile)
|
62 | 64 | if device_id:
|
63 | 65 | self.device_id = device_id
|
@@ -97,6 +99,10 @@ def _set_auth_data(self, data):
|
97 | 99 | def _update_device_trends(self, scale: Scale):
|
98 | 100 | if not self._trend_data[scale]["consumption"].get("devices"):
|
99 | 101 | return
|
| 102 | + update = self.trend_update(scale) |
| 103 | + if not update or update < self._trend_data_updated[scale]: |
| 104 | + return |
| 105 | + |
100 | 106 | for d in self._devices.values():
|
101 | 107 | d.energy_kwh[scale] = 0
|
102 | 108 | for d in self._trend_data[scale]["consumption"]["devices"]:
|
@@ -286,6 +292,17 @@ def trend_start(self, scale: Scale) -> Optional[datetime]:
|
286 | 292 | pass
|
287 | 293 | return None
|
288 | 294 |
|
| 295 | + def trend_update(self, scale: Scale) -> Optional[datetime]: |
| 296 | + """Return an update value of trend last updated.""" |
| 297 | + |
| 298 | + update = self.trend_start(scale) |
| 299 | + if not update: |
| 300 | + return None |
| 301 | + val = self._trend_data[scale]["from_grid"] / 100.0 |
| 302 | + seconds = int(val) |
| 303 | + microseconds = int((val % 1) * 1000000) |
| 304 | + return update + timedelta(seconds=seconds, microseconds=microseconds) |
| 305 | + |
289 | 306 | def get_stat(self, scale: Scale, key: str) -> float:
|
290 | 307 | key = "consumption" if key == "usage" else key
|
291 | 308 | if scale not in self._trend_data or key not in self._trend_data[scale]:
|
|
0 commit comments