Skip to content

Commit 7c52d1b

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

File tree

1 file changed

+48
-20
lines changed

1 file changed

+48
-20
lines changed

plugwise_usb/nodes/helpers/pulses.py

Lines changed: 48 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,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

Comments
 (0)