@@ -90,7 +90,7 @@ def __init__(self, mac: str) -> None:
9090
9191 self ._logs : dict [int , dict [int , PulseLogRecord ]] | None = None
9292 self ._log_addresses_missing : list [int ] | None = None
93- self ._log_production : bool | None = None
93+ self ._log_production = False
9494 self ._pulses_consumption : int | None = None
9595 self ._pulses_production : int | None = None
9696 self ._pulses_timestamp : datetime | None = None
@@ -493,32 +493,55 @@ def _add_log_record(
493493
494494 return True
495495
496+ def _log_production_state (
497+ self , address : int , slot : int , timestamp : datetime
498+ ) -> bool | None :
499+ """Determine _log_production state based on the new and two previous slots."""
500+ prev_address , prev_slot = calc_log_address (address , slot , - 1 )
501+ prev_prev_address , prev_prev_slot = calc_log_address (address , slot , - 2 )
502+ if not (
503+ self ._log_exists (prev_address , prev_slot )
504+ and self ._log_exists (prev_prev_address , prev_prev_slot )
505+ ):
506+ return None
507+
508+ timestamp_2 = self ._logs [prev_address ][prev_slot ].timestamp
509+ timestamp_3 = self ._logs [prev_prev_address ][prev_prev_slot ].timestamp
510+ if (
511+ timestamp_2 == timestamp and timestamp_3 != timestamp
512+ ) or (
513+ timestamp_2 == timestamp_3 and timestamp_2 != timestamp
514+ ):
515+ return = True
516+ else :
517+ return False
518+
496519 def _update_log_direction (
497520 self , address : int , slot : int , timestamp : datetime
498521 ) -> None :
499522 """Update Energy direction of log record.
500523
501524 Two subsequential logs with the same timestamp indicates the first
502- is consumption and second production.
525+ is consumption and second(=newest) production.
503526 """
504527 if self ._logs is None :
505528 return
506529
507- prev_address , prev_slot = calc_log_address (address , slot , - 1 )
508- if self . _log_exists ( prev_address , prev_slot ):
509- if self . _logs [ prev_address ][ prev_slot ]. timestamp == timestamp :
510- # Given log is the second log with same timestamp,
511- # mark direction as production
512- self . _logs [ address ][ slot ]. is_consumption = False
513- self . _logs [ prev_address ][ prev_slot ]. is_consumption = True
514- self ._log_production = True
515- elif self ._log_production :
516- self ._logs [address ][ slot ].is_consumption = True
517- if self . _logs [ prev_address ][ prev_slot ]. is_consumption :
518- self ._logs [prev_address ][ prev_slot ].is_consumption = False
519- self ._reset_log_references ()
520- elif self ._log_production is None :
521- self ._log_production = False
530+ if ( producing := self . _log_production_state (address , slot , timestamp )) is None :
531+ return
532+
533+ self . _log_production = producing
534+ if not self . _log_production :
535+ return
536+
537+ if self ._logs [ prev_address ][ prev_slot ]. timestamp == timestamp :
538+ self ._logs [ address ][ slot ]. is_consumption = False
539+ self ._logs [prev_address ][ prev_slot ].is_consumption = True
540+ else :
541+ self ._logs [address ][ slot ].is_consumption = True
542+ if self ._logs [ prev_address ][ prev_slot ]. is_consumption :
543+ self ._logs [ prev_address ][ prev_slot ]. is_consumption = False
544+ self ._reset_log_references ()
522545
523546 next_address , next_slot = calc_log_address (address , slot , 1 )
524547 if self ._log_exists (next_address , next_slot ):
@@ -529,12 +552,9 @@ def _update_log_direction(
529552 if self ._logs [next_address ][next_slot ].is_consumption :
530553 self ._logs [next_address ][next_slot ].is_consumption = False
531554 self ._reset_log_references ()
532- self ._log_production = True
533- elif self ._log_production :
555+ else :
534556 self ._logs [address ][slot ].is_consumption = False
535557 self ._logs [next_address ][next_slot ].is_consumption = True
536- elif self ._log_production is None :
537- self ._log_production = False
538558
539559 def _update_log_interval (self ) -> None :
540560 """Update the detected log interval based on the most recent two logs."""
0 commit comments