@@ -272,6 +272,83 @@ def update_pulse_counter(
272272 self ._pulses_consumption = pulses_consumed
273273 self ._pulses_production = pulses_produced
274274
275+ def update_pulse_counter (
276+ self , pulses_consumed : int , pulses_produced : int , timestamp : datetime
277+ ) -> None :
278+ """Update pulse counter."""
279+ self ._pulses_timestamp = timestamp
280+ self ._update_rollover ()
281+ if not (self ._rollover_consumption or self ._rollover_production ):
282+ # No rollover based on time, check rollover based on counter reset
283+ # Required for special cases like nodes which have been power off for several days
284+ if (
285+ self ._pulses_consumption is not None
286+ and self ._pulses_consumption > pulses_consumed
287+ ):
288+ self ._rollover_consumption = True
289+ if (
290+ self ._pulses_production is not None
291+ and self ._pulses_production > pulses_produced
292+ ):
293+ self ._rollover_production = True
294+ self ._pulses_consumption = pulses_consumed
295+ self ._pulses_production = pulses_produced
296+
297+ ######### still to finish
298+ def _update_rollover (self ) -> None :
299+ """Update rollover states. Returns True if rollover is applicable."""
300+ if self ._log_addresses_missing is not None and self ._log_addresses_missing :
301+ return
302+
303+ if (
304+ self ._pulses_timestamp is None
305+ or self ._last_log_timestamp is None
306+ ):
307+ # Unable to determine rollover
308+ return
309+
310+ if self ._pulses_timestamp > self ._next_log_timestamp :
311+ if CONSUMPTION : # TODO
312+ self ._rollover_consumption = True
313+ _LOGGER .debug (
314+ "_update_rollover | %s | set consumption rollover => pulses newer" ,
315+ self ._mac ,
316+ )
317+ if PRODUCTION : # TODO
318+ self ._rollover_production = True
319+ _LOGGER .debug (
320+ "_update_rollover | %s | set production rollover => pulses newer" ,
321+ self ._mac ,
322+ )
323+ elif self ._pulses_timestamp < self ._last_log_timestamp :
324+ if CONSUMPTION : # TODO
325+ self ._rollover_consumption = True
326+ _LOGGER .debug (
327+ "_update_rollover | %s | set consumption rollover => log newer" ,
328+ self ._mac ,
329+ )
330+ if PRODUCTION : # TODO
331+ self ._rollover_production = True
332+ _LOGGER .debug (
333+ "_update_rollover | %s | reset production rollover => log newer" ,
334+ self ._mac ,
335+ )
336+ elif (
337+ self ._last_log_timestamp
338+ < self ._pulses_timestamp
339+ < self ._next_log_timestamp
340+ ):
341+ if CONSUMPTION : # TODO
342+ if self ._rollover_consumption :
343+ _LOGGER .debug ("_update_rollover | %s | reset consumption" , self ._mac )
344+ self ._rollover_consumption = False
345+ if PRODUCTION : # TODO
346+ if self ._rollover_production :
347+ _LOGGER .debug ("_update_rollover | %s | reset production" , self ._mac )
348+ self ._rollover_production = False
349+ else :
350+ _LOGGER .debug ("_update_rollover | %s | unexpected consumption/production" , self ._mac )
351+
275352 def add_empty_log (self , address : int , slot : int ) -> None :
276353 """Add empty energy log record to mark any start of beginning of energy log collection."""
277354 recalculate = False
0 commit comments