Skip to content

Commit a3c5a47

Browse files
committed
Updating _update_log_direction()
1 parent 4d43c74 commit a3c5a47

1 file changed

Lines changed: 50 additions & 20 deletions

File tree

plugwise_usb/nodes/helpers/pulses.py

Lines changed: 50 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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,63 @@ 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+
if (
517+
timestamp_2 == timestamp and timestamp_3 != timestamp
518+
) or (
519+
timestamp_2 == timestamp_3 and timestamp_2 != timestamp
520+
):
521+
return True
522+
else:
523+
return False
524+
496525
def _update_log_direction(
497526
self, address: int, slot: int, timestamp: datetime
498527
) -> None:
499528
"""Update Energy direction of log record.
500529
501530
Two subsequential logs with the same timestamp indicates the first
502-
is consumption and second production.
531+
is consumption and second(=newest) production.
503532
"""
504533
if self._logs is None:
505534
return
506535

507536
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
537+
if (producing := self._log_production_state(
538+
address, slot, prev_address, prev_slot, timestamp
539+
)
540+
) is None:
541+
return
542+
543+
self._log_production = producing
544+
if not self._log_production:
545+
return
546+
547+
if self._logs[prev_address][prev_slot].timestamp == timestamp:
548+
self._logs[address][slot].is_consumption = False
549+
self._logs[prev_address][prev_slot].is_consumption = True
550+
else:
551+
self._logs[address][slot].is_consumption = True
552+
if self._logs[prev_address][prev_slot].is_consumption:
553+
self._logs[prev_address][prev_slot].is_consumption = False
554+
self._reset_log_references()
522555

523556
next_address, next_slot = calc_log_address(address, slot, 1)
524557
if self._log_exists(next_address, next_slot):
@@ -529,12 +562,9 @@ def _update_log_direction(
529562
if self._logs[next_address][next_slot].is_consumption:
530563
self._logs[next_address][next_slot].is_consumption = False
531564
self._reset_log_references()
532-
self._log_production = True
533-
elif self._log_production:
565+
else:
534566
self._logs[address][slot].is_consumption = False
535567
self._logs[next_address][next_slot].is_consumption = True
536-
elif self._log_production is None:
537-
self._log_production = False
538568

539569
def _update_log_interval(self) -> None:
540570
"""Update the detected log interval based on the most recent two logs."""

0 commit comments

Comments
 (0)