@@ -336,13 +336,7 @@ def calc_derivative(
336336 "" if unit is None else unit
337337 )
338338
339- # filter out all derivatives older than `time_window` from our window list
340- self ._state_list = [
341- (time_start , time_end , state )
342- for time_start , time_end , state in self ._state_list
343- if (new_state .last_reported - time_end ).total_seconds ()
344- < self ._time_window
345- ]
339+ self ._prune_state_list (new_state .last_reported )
346340
347341 try :
348342 elapsed_time = (
@@ -380,25 +374,14 @@ def calc_derivative(
380374 (old_last_reported , new_state .last_reported , new_derivative )
381375 )
382376
383- def calculate_weight (
384- start : datetime , end : datetime , now : datetime
385- ) -> float :
386- window_start = now - timedelta (seconds = self ._time_window )
387- if start < window_start :
388- weight = (end - window_start ).total_seconds () / self ._time_window
389- else :
390- weight = (end - start ).total_seconds () / self ._time_window
391- return weight
392-
393377 # If outside of time window just report derivative (is the same as modeling it in the window),
394378 # otherwise take the weighted average with the previous derivatives
395379 if elapsed_time > self ._time_window :
396380 derivative = new_derivative
397381 else :
398- derivative = Decimal ("0.00" )
399- for start , end , value in self ._state_list :
400- weight = calculate_weight (start , end , new_state .last_reported )
401- derivative = derivative + (value * Decimal (weight ))
382+ derivative = self ._calc_derivative_from_state_list (
383+ new_state .last_reported
384+ )
402385 self ._attr_native_value = round (derivative , self ._round_digits )
403386 self .async_write_ha_state ()
404387
0 commit comments