Skip to content

Commit 22a1fec

Browse files
authored
Merge pull request #125 from dirixmjm/main
Fixes to energy_consumption_hour
2 parents 58472a7 + 19da5a6 commit 22a1fec

File tree

1 file changed

+33
-6
lines changed

1 file changed

+33
-6
lines changed

plugwise_usb/nodes/circle.py

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,9 @@ def __init__(self, mac, address, message_sender):
7070
self._energy_history_collecting = False
7171
self._energy_history_collecting_timestamp = datetime.now()
7272
self._energy_history = {}
73+
self._energy_history_failed_address = []
7374
self._energy_last_collected_timestamp = datetime(2000, 1, 1)
74-
self._energy_ratelimit_startup_collection_timestamp = datetime(2000, 1, 1)
75+
self._energy_ratelimit_collection_timestamp = datetime(2000, 1, 1)
7576
self._energy_last_rollover_timestamp = datetime(2000, 1, 1)
7677
self._energy_last_local_hour = datetime.now().hour
7778
self._energy_last_populated_slot = 0
@@ -223,12 +224,22 @@ def request_power_update(self, callback=None):
223224
minute=0, second=0, microsecond=0
224225
):
225226
self.request_energy_counters()
227+
elif (
228+
len(self._energy_history_failed_address) != 0
229+
and self._energy_ratelimit_collection_timestamp <
230+
datetime.utcnow().replace(
231+
second=0, microsecond=0
232+
)
233+
):
234+
for _mem_address in self._energy_history_failed_address:
235+
self.request_energy_counters(_mem_address)
236+
self._energy_history_failed_address.remove(_mem_address)
226237
else:
227238
# No history collected yet, request energy history
228-
if self._energy_ratelimit_startup_collection_timestamp < datetime.utcnow().replace(
239+
if self._energy_ratelimit_collection_timestamp < datetime.utcnow().replace(
229240
second=0, microsecond=0
230241
):
231-
self._energy_ratelimit_startup_collection_timestamp = datetime.utcnow()
242+
self._energy_ratelimit_collection_timestamp = datetime.utcnow()
232243
self.request_energy_counters()
233244

234245
def message_for_circle(self, message):
@@ -394,7 +405,6 @@ def _collect_energy_pulses(self, start_utc: datetime, end_utc: datetime):
394405
hours = 0
395406
else:
396407
hours = int((end_utc - start_utc).seconds / 3600)
397-
_energy_history_failed = False
398408
_energy_pulses = 0
399409
for hour in range(0, hours + 1):
400410
_log_timestamp = start_utc + timedelta(hours=hour)
@@ -409,6 +419,7 @@ def _collect_energy_pulses(self, start_utc: datetime, end_utc: datetime):
409419
)
410420
else:
411421
_mem_address = self._energy_timestamp_memory_address(_log_timestamp)
422+
self._energy_history_failed_address.append(_mem_address)
412423
_LOGGER.info(
413424
"_collect_energy_pulses for %s at %s not found, request counter from memory %s (from mem=%s, slot=%s, timestamp=%s)",
414425
self.mac,
@@ -420,7 +431,7 @@ def _collect_energy_pulses(self, start_utc: datetime, end_utc: datetime):
420431
)
421432

422433
# Validate all history values where present
423-
if not _energy_history_failed:
434+
if len(self._energy_history_failed_address) == 0:
424435
return _energy_pulses
425436
return None
426437

@@ -438,7 +449,10 @@ def _update_energy_current_hour(self, _pulses_cur_hour):
438449
self.do_callback(FEATURE_POWER_CONSUMPTION_CURRENT_HOUR["id"])
439450
else:
440451
if self._energy_pulses_current_hour != _pulses_cur_hour:
441-
if self._energy_pulses_current_hour > _pulses_cur_hour:
452+
if (
453+
self._energy_pulses_current_hour > _pulses_cur_hour
454+
and int((self._energy_pulses_current_hour-_pulses_cur_hour)/self._energy_pulses_current_hour*100) > 1
455+
):
442456
_hour_rollover = True
443457
self._energy_pulses_current_hour = _pulses_cur_hour
444458
self.do_callback(FEATURE_POWER_CONSUMPTION_CURRENT_HOUR["id"])
@@ -508,6 +522,19 @@ def _update_energy_today_now(
508522
)
509523

510524
if _pulses_today_now is None:
525+
if (
526+
self._energy_pulses_today_hourly is None
527+
or self._energy_rollover_history_started
528+
):
529+
_utc_hour_timestamp = datetime.utcnow().replace(
530+
minute=0, second=0, microsecond=0
531+
)
532+
_local_hour = datetime.now().hour
533+
_utc_midnight_timestamp = _utc_hour_timestamp - timedelta(hours=_local_hour)
534+
self._update_energy_today_hourly(
535+
_utc_midnight_timestamp + timedelta(hours=1),
536+
_utc_hour_timestamp,
537+
)
511538
_LOGGER.info(
512539
"_update_energy_today_now for %s | skip update, hour: %s=%s=%s, history: %s=%s=%s, day: %s=%s=%s",
513540
self.mac,

0 commit comments

Comments
 (0)