Skip to content

Commit c5240b0

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

File tree

1 file changed

+41
-21
lines changed

1 file changed

+41
-21
lines changed

plugwise_usb/nodes/helpers/pulses.py

Lines changed: 41 additions & 21 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
@@ -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

Comments
 (0)