Skip to content

Commit 251574e

Browse files
committed
Simplify code based on no separate slots for consumption-production
No rollover based on time, only on counter reset
1 parent a4e01d7 commit 251574e

File tree

1 file changed

+32
-138
lines changed

1 file changed

+32
-138
lines changed

plugwise_usb/nodes/helpers/pulses.py

Lines changed: 32 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -219,24 +219,16 @@ def _collect_pulses_from_logs(
219219
if self._logs is None:
220220
_LOGGER.debug("_collect_pulses_from_logs | %s | self._logs=None", self._mac)
221221
return None
222-
if is_consumption:
223-
if self._last_log_consumption_timestamp is None:
224-
_LOGGER.debug(
225-
"_collect_pulses_from_logs | %s | self._last_log_consumption_timestamp=None",
226-
self._mac,
227-
)
228-
return None
229-
if from_timestamp > self._last_log_consumption_timestamp:
230-
return 0
231-
else:
232-
if self._last_log_production_timestamp is None:
233-
_LOGGER.debug(
234-
"_collect_pulses_from_logs | %s | self._last_log_production_timestamp=None",
235-
self._mac,
236-
)
237-
return None
238-
if from_timestamp > self._last_log_production_timestamp:
239-
return 0
222+
223+
if self._last_log_timestamp is None:
224+
_LOGGER.debug(
225+
"_collect_pulses_from_logs | %s | self._last_log_timestamp=None",
226+
self._mac,
227+
)
228+
return None
229+
230+
if from_timestamp > self._last_log_timestamp:
231+
return 0
240232

241233
missing_logs = self._logs_missing(from_timestamp)
242234
if missing_logs is None or missing_logs:
@@ -256,112 +248,38 @@ def _collect_pulses_from_logs(
256248
and slot_item.timestamp > from_timestamp
257249
):
258250
log_pulses += slot_item.pulses
251+
259252
return log_pulses
260253

261254
def update_pulse_counter(
262255
self, pulses_consumed: int, pulses_produced: int, timestamp: datetime
263256
) -> None:
264-
"""Update pulse counter."""
257+
"""Update pulse counter, checking for rollover based on counter reset."""
265258
self._pulses_timestamp = timestamp
266-
self._update_rollover()
267-
if not (self._rollover_consumption or self._rollover_production):
268-
# No rollover based on time, check rollover based on counter reset
269-
# Required for special cases like nodes which have been power off for several days
270-
if (
271-
self._pulses_consumption is not None
272-
and self._pulses_consumption > pulses_consumed
273-
):
274-
self._rollover_consumption = True
275-
_LOGGER.debug(
276-
"_rollover_consumption | self._pulses_consumption=%s > pulses_consumed=%s",
277-
self._pulses_consumption,
278-
pulses_consumed,
279-
)
280-
281-
if (
282-
self._pulses_production is not None
283-
and self._pulses_production < pulses_produced
284-
):
285-
self._rollover_production = True
286-
_LOGGER.debug(
287-
"_rollover_production | self._pulses_production=%s < pulses_produced=%s",
288-
self._pulses_production,
289-
pulses_produced,
290-
)
291-
292-
self._pulses_consumption = pulses_consumed
293-
self._pulses_production = pulses_produced
294-
295-
def _update_rollover(self) -> None:
296-
"""Update rollover states. Returns True if rollover is applicable."""
297-
if self._log_addresses_missing is not None and self._log_addresses_missing:
298-
return
299259
if (
300-
self._pulses_timestamp is None
301-
or self._last_log_consumption_timestamp is None
302-
or self._next_log_consumption_timestamp is None
260+
self._pulses_consumption is not None
261+
and self._pulses_consumption > pulses_consumed
303262
):
304-
# Unable to determine rollover
305-
return
306-
307-
if self._pulses_timestamp > self._next_log_consumption_timestamp:
308-
self._rollover_consumption = True
309-
_LOGGER.debug(
310-
"_update_rollover | %s | set consumption rollover => pulses newer",
311-
self._mac,
312-
)
313-
elif self._pulses_timestamp < self._last_log_consumption_timestamp:
314263
self._rollover_consumption = True
315264
_LOGGER.debug(
316-
"_update_rollover | %s | set consumption rollover => log newer",
317-
self._mac,
265+
"_rollover_consumption | self._pulses_consumption=%s > pulses_consumed=%s",
266+
self._pulses_consumption,
267+
pulses_consumed,
318268
)
319-
elif (
320-
self._last_log_consumption_timestamp
321-
< self._pulses_timestamp
322-
< self._next_log_consumption_timestamp
323-
):
324-
if self._rollover_consumption:
325-
_LOGGER.debug("_update_rollover | %s | reset consumption", self._mac)
326-
self._rollover_consumption = False
327-
else:
328-
_LOGGER.debug("_update_rollover | %s | unexpected consumption", self._mac)
329-
330-
if not self._log_production:
331-
return
332269

333270
if (
334-
self._last_log_production_timestamp is None
335-
or self._next_log_production_timestamp is None
271+
self._pulses_production is not None
272+
and self._pulses_production < pulses_produced
336273
):
337-
# Unable to determine rollover
338-
return
339-
340-
if not self._log_production:
341-
return
342-
343-
if self._pulses_timestamp > self._next_log_production_timestamp:
344-
self._rollover_production = True
345-
_LOGGER.debug(
346-
"_update_rollover | %s | set production rollover => pulses newer",
347-
self._mac,
348-
)
349-
elif self._pulses_timestamp < self._last_log_production_timestamp:
350274
self._rollover_production = True
351275
_LOGGER.debug(
352-
"_update_rollover | %s | reset production rollover => log newer",
353-
self._mac,
276+
"_rollover_production | self._pulses_production=%s < pulses_produced=%s",
277+
self._pulses_production,
278+
pulses_produced,
354279
)
355-
elif (
356-
self._last_log_production_timestamp
357-
< self._pulses_timestamp
358-
< self._next_log_production_timestamp
359-
):
360-
if self._rollover_production:
361-
_LOGGER.debug("_update_rollover | %s | reset production", self._mac)
362-
self._rollover_production = False
363-
else:
364-
_LOGGER.debug("_update_rollover | %s | unexpected production", self._mac)
280+
281+
self._pulses_consumption = pulses_consumed
282+
self._pulses_production = pulses_produced
365283

366284
def add_empty_log(self, address: int, slot: int) -> None:
367285
"""Add empty energy log record to mark any start of beginning of energy log collection."""
@@ -426,7 +344,6 @@ def add_log(
426344
return False
427345
self._update_log_references(address, slot)
428346
self._update_log_interval()
429-
self._update_rollover()
430347
if not import_only:
431348
self.recalculate_missing_log_addresses()
432349
return True
@@ -554,17 +471,13 @@ def _log_exists(self, address: int, slot: int) -> bool:
554471
return True
555472

556473
def _update_last_log_reference(
557-
self, address: int, slot: int, timestamp: datetime, is_consumption: bool
474+
self, address: int, slot: int, timestamp: datetime
558475
) -> None:
559476
"""Update references to last (most recent) log record."""
560477
if self._last_log_timestamp is None or self._last_log_timestamp < timestamp:
561478
self._last_log_address = address
562479
self._last_log_slot = slot
563480
self._last_log_timestamp = timestamp
564-
elif self._last_log_timestamp == timestamp and not is_consumption:
565-
self._last_log_address = address
566-
self._last_log_slot = slot
567-
self._last_log_timestamp = timestamp
568481

569482
def _update_last_consumption_log_reference(
570483
self, address: int, slot: int, timestamp: datetime
@@ -683,8 +596,8 @@ def _update_log_references(self, address: int, slot: int) -> None:
683596
is_consumption = self._logs[address][slot].is_consumption
684597

685598
# Update log references
686-
self._update_first_log_reference(address, slot, log_time_stamp, is_consumption)
687-
self._update_last_log_reference(address, slot, log_time_stamp, is_consumption)
599+
self._update_first_log_reference(address, slot, log_time_stamp)
600+
self._update_last_log_reference(address, slot, log_time_stamp)
688601

689602
if is_consumption:
690603
self._update_first_consumption_log_reference(address, slot, log_time_stamp)
@@ -698,32 +611,13 @@ def log_addresses_missing(self) -> list[int] | None:
698611
"""Return the addresses of missing logs."""
699612
return self._log_addresses_missing
700613

701-
def _last_log_reference(
702-
self, is_consumption: bool | None = None
703-
) -> tuple[int | None, int | None]:
614+
def _last_log_reference(self) -> tuple[int | None, int | None]:
704615
"""Address and slot of last log."""
705-
if is_consumption is None:
706-
return (self._last_log_address, self._last_log_slot)
616+
return (self._last_log_address, self._last_log_slot)
707617

708-
if is_consumption:
709-
return (self._last_log_consumption_address, self._last_log_consumption_slot)
710-
711-
return (self._last_log_production_address, self._last_log_production_slot)
712-
713-
def _first_log_reference(
714-
self, is_consumption: bool | None = None
715-
) -> tuple[int | None, int | None]:
618+
def _first_log_reference(self) -> tuple[int | None, int | None]:
716619
"""Address and slot of first log."""
717-
if is_consumption is None:
718-
return (self._first_log_address, self._first_log_slot)
719-
720-
if is_consumption:
721-
return (
722-
self._first_log_consumption_address,
723-
self._first_log_consumption_slot,
724-
)
725-
726-
return (self._first_log_production_address, self._first_log_production_slot)
620+
return (self._first_log_address, self._first_log_slot)
727621

728622
def _logs_missing(self, from_timestamp: datetime) -> list[int] | None:
729623
"""Calculate list of missing log addresses."""

0 commit comments

Comments
 (0)