@@ -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
@@ -377,6 +377,8 @@ def _detect_rollover(
377377 )
378378 return False
379379
380+ return False
381+
380382 def add_empty_log (self , address : int , slot : int ) -> None :
381383 """Add empty energy log record to mark any start of beginning of energy log collection."""
382384 recalculate = False
@@ -493,32 +495,61 @@ def _add_log_record(
493495
494496 return True
495497
498+ def _log_production_state (
499+ self ,
500+ address : int ,
501+ prev_address : int ,
502+ slot : int ,
503+ prev_slot : int ,
504+ timestamp : datetime ,
505+ ) -> bool | None :
506+ """Determine _log_production state based on the new and two previous slots."""
507+ prev_prev_address , prev_prev_slot = calc_log_address (address , slot , - 2 )
508+ if not (
509+ self ._log_exists (prev_address , prev_slot )
510+ and self ._log_exists (prev_prev_address , prev_prev_slot )
511+ ):
512+ return None
513+
514+ timestamp_2 = self ._logs [prev_address ][prev_slot ].timestamp
515+ timestamp_3 = self ._logs [prev_prev_address ][prev_prev_slot ].timestamp
516+ return (
517+ timestamp_2 == timestamp and timestamp_3 != timestamp
518+ ) or (
519+ timestamp_2 == timestamp_3 and timestamp_2 != timestamp
520+ )
521+
496522 def _update_log_direction (
497523 self , address : int , slot : int , timestamp : datetime
498524 ) -> None :
499525 """Update Energy direction of log record.
500526
501527 Two subsequential logs with the same timestamp indicates the first
502- is consumption and second production.
528+ is consumption and second(=newest) production.
503529 """
504530 if self ._logs is None :
505531 return
506532
507533 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
534+ if (
535+ producing := self ._log_production_state (
536+ address , prev_address , slot , prev_slot , timestamp
537+ )
538+ ) is None :
539+ return
540+
541+ self ._log_production = producing
542+ if not self ._log_production :
543+ return
544+
545+ if self ._logs [prev_address ][prev_slot ].timestamp == timestamp :
546+ self ._logs [address ][slot ].is_consumption = False
547+ self ._logs [prev_address ][prev_slot ].is_consumption = True
548+ else :
549+ self ._logs [address ][slot ].is_consumption = True
550+ if self ._logs [prev_address ][prev_slot ].is_consumption :
551+ self ._logs [prev_address ][prev_slot ].is_consumption = False
552+ self ._reset_log_references ()
522553
523554 next_address , next_slot = calc_log_address (address , slot , 1 )
524555 if self ._log_exists (next_address , next_slot ):
@@ -529,12 +560,9 @@ def _update_log_direction(
529560 if self ._logs [next_address ][next_slot ].is_consumption :
530561 self ._logs [next_address ][next_slot ].is_consumption = False
531562 self ._reset_log_references ()
532- self ._log_production = True
533- elif self ._log_production :
563+ else :
534564 self ._logs [address ][slot ].is_consumption = False
535565 self ._logs [next_address ][next_slot ].is_consumption = True
536- elif self ._log_production is None :
537- self ._log_production = False
538566
539567 def _update_log_interval (self ) -> None :
540568 """Update the detected log interval based on the most recent two logs."""
0 commit comments