@@ -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