Moving average gibt nur aktuellen Wert aus

Begonnen von Bjoernar, 25 November 2016, 10:19:58

Vorheriges Thema - Nächstes Thema

Bjoernar

Hallo,
ich versuche mit Moving average den Mittelwert über 5 bzw. 10 min zu ermitteln.

Leider bekomme ich keinen Mittelwert sondern immer nur den Aktuellen Wert angezeigt. Beim Aktualisieren des Readings kann ich sehen wie der AV Wert sicher über ca. 2 Sekunden immer wieder verändert bis der gleich dem Reading ist.

Wo liegt mein Fehler?

###############################################################################
#
#  Moving average
#
#  Aufruf: movingAverage(devicename,readingname,zeitspanne in s)
#
# MH changes:
#    timestamp handling, delete old entries, delete entries if # >= 24, Log3, ....
###############################################################################

sub movingAverage($$$){
   my ($name,$reading,$avtime) = @_;
   my $hash = $defs{$name};
   my $val =  $hash->{READINGS}{$reading}{VAL};
   my $time = $hash->{READINGS}{$reading}{TIME};
   my $ctime = time_str2num($time);
   Log3 $name, 4,"[movingAverage $name] time= $time $ctime reading= $reading value= $val";
   my @new = ($val,$ctime);
   my $num;
   my $arr;
   #-- initialize if requested
   if( ($avtime eq "-1") ){
     $hash->{READINGS}{$reading}{"history"}=undef;
   }
   #-- test for existence
   if( !$hash->{READINGS}{$reading}{"history"}){
      Log3 $name, 3,"[movingAverage $name] ARRAY CREATED";
      push(@{$hash->{READINGS}{$reading}{"history"}},\@new);
      $num = 1;
      $arr=\@{$hash->{READINGS}{$reading}{"history"}};
   } else {
      $num = int(@{$hash->{READINGS}{$reading}{"history"}});
      $arr=\@{$hash->{READINGS}{$reading}{"history"}};
      my $stime = $arr->[0][1];
      while( ($num >= 24) || ((($ctime-$stime) > $avtime) && $num > 1) ){ #delete "old" entries, or more then 24 entries
        Log3 $name, 5,"[movingaverage $name] ARRAY has $num elements, deleting one w. Timestamp=" .  movingAverageTS($stime);
        shift(@{$hash->{READINGS}{$reading}{"history"}});
        $num--; # correct # of entries
        $arr=\@{$hash->{READINGS}{$reading}{"history"}};
        $stime = $arr->[0][1];
      }
      push(@{$hash->{READINGS}{$reading}{"history"}},\@new); # always push the last one
      $num++; # correct # of entries
      Log3 $name, 4,"[movingaverage $name] ARRAY has $num elements, added one";
    }
    #-- output and average
    my $average = 0;
    for(my $i=0;$i<$num;$i++){
      $average+=$arr->[$i][0];
      Log3 $name, 5,"[movingaverage $name] Value= ".$arr->[$i][0]." Time= " . movingAverageTS($arr->[$i][1]);
    }
    $average=sprintf( "%5.3f", $average/$num);
    #--average
    Log3 $name, 4,"[movingaverage $name] calculated over $num values is $average";
    return $average;
}


define AC_Einspeisung dummy
attr AC_Einspeisung event-min-interval .*:3600
attr AC_Einspeisung event-on-change-reading .*
attr AC_Einspeisung group Strom
attr AC_Einspeisung room HWR
attr AC_Einspeisung stateFormat { sprintf("%.0f"." W", ReadingsVal("AC_Einspeisung","Einspeisung__W",0)) }
attr AC_Einspeisung userReadings Einspeisung__W.av600 {movingAverage("AC_Einspeisung","Einspeisung__W",600)}, Einspeisung_ohne_LWP__W.av300 {movingAverage("AC_Einspeisung","Einspeisung_ohne_LWP__W",300)}
attr AC_Einspeisung verbose 0


Danke und Gruß

Björnar

Bjoernar

habe Verbose nun mal auf 4 gestellt.

2016.11.25 12:21:19 4: [movingAverage AC_Einspeisung] time= 2016-11-25 12:21:19 1480072879 reading= Einspeisung_ohne_LWP__W value= 1252.7
2016.11.25 12:21:19 4: [movingaverage AC_Einspeisung] ARRAY has 24 elements, added one
2016.11.25 12:21:19 4: [movingaverage AC_Einspeisung] calculated over 24 values is 1268.992
2016.11.25 12:21:20 4: [movingAverage AC_Einspeisung] time= 2016-11-25 12:21:19 1480072879 reading= Einspeisung_ohne_LWP__W value= 1252.7
2016.11.25 12:21:20 4: [movingaverage AC_Einspeisung] ARRAY has 24 elements, added one
2016.11.25 12:21:20 4: [movingaverage AC_Einspeisung] calculated over 24 values is 1268.283
2016.11.25 12:21:20 4: [movingAverage AC_Einspeisung] time= 2016-11-25 12:21:19 1480072879 reading= Einspeisung_ohne_LWP__W value= 1252.7
2016.11.25 12:21:20 4: [movingaverage AC_Einspeisung] ARRAY has 24 elements, added one
2016.11.25 12:21:20 4: [movingaverage AC_Einspeisung] calculated over 24 values is 1267.575
2016.11.25 12:21:20 4: [movingAverage AC_Einspeisung] time= 2016-11-25 12:21:20 1480072880 reading= Einspeisung_ohne_LWP__W value= 1252.7
2016.11.25 12:21:20 4: [movingaverage AC_Einspeisung] ARRAY has 24 elements, added one
2016.11.25 12:21:20 4: [movingaverage AC_Einspeisung] calculated over 24 values is 1266.867
2016.11.25 12:21:20 4: [movingAverage AC_Einspeisung] time= 2016-11-25 12:21:20 1480072880 reading= Einspeisung_ohne_LWP__W value= 1252.7
2016.11.25 12:21:20 4: [movingaverage AC_Einspeisung] ARRAY has 24 elements, added one
2016.11.25 12:21:20 4: [movingaverage AC_Einspeisung] calculated over 24 values is 1266.158
2016.11.25 12:21:20 4: [movingAverage AC_Einspeisung] time= 2016-11-25 12:21:20 1480072880 reading= Einspeisung_ohne_LWP__W value= 1252.7
2016.11.25 12:21:20 4: [movingaverage AC_Einspeisung] ARRAY has 24 elements, added one
2016.11.25 12:21:20 4: [movingaverage AC_Einspeisung] calculated over 24 values is 1265.450
2016.11.25 12:21:20 4: [movingAverage AC_Einspeisung] time= 2016-11-25 12:21:20 1480072880 reading= Einspeisung_ohne_LWP__W value= 1252.7
2016.11.25 12:21:20 4: [movingaverage AC_Einspeisung] ARRAY has 24 elements, added one
2016.11.25 12:21:20 4: [movingaverage AC_Einspeisung] calculated over 24 values is 1264.742
2016.11.25 12:21:20 4: [movingAverage AC_Einspeisung] time= 2016-11-25 12:21:20 1480072880 reading= Einspeisung_ohne_LWP__W value= 1252.7
2016.11.25 12:21:20 4: [movingaverage AC_Einspeisung] ARRAY has 24 elements, added one
2016.11.25 12:21:20 4: [movingaverage AC_Einspeisung] calculated over 24 values is 1264.033
2016.11.25 12:21:20 4: [movingAverage AC_Einspeisung] time= 2016-11-25 12:21:20 1480072880 reading= Einspeisung_ohne_LWP__W value= 1252.7
2016.11.25 12:21:20 4: [movingaverage AC_Einspeisung] ARRAY has 24 elements, added one
2016.11.25 12:21:20 4: [movingaverage AC_Einspeisung] calculated over 24 values is 1263.325
2016.11.25 12:21:21 4: [movingAverage AC_Einspeisung] time= 2016-11-25 12:21:21 1480072881 reading= Einspeisung_ohne_LWP__W value= 1252.7
2016.11.25 12:21:21 4: [movingaverage AC_Einspeisung] ARRAY has 24 elements, added one
2016.11.25 12:21:21 4: [movingaverage AC_Einspeisung] calculated over 24 values is 1262.617
2016.11.25 12:21:21 4: [movingAverage AC_Einspeisung] time= 2016-11-25 12:21:21 1480072881 reading= Einspeisung_ohne_LWP__W value= 1252.7
2016.11.25 12:21:21 4: [movingaverage AC_Einspeisung] ARRAY has 24 elements, added one
2016.11.25 12:21:21 4: [movingaverage AC_Einspeisung] calculated over 24 values is 1261.908
2016.11.25 12:21:21 4: [movingAverage AC_Einspeisung] time= 2016-11-25 12:21:21 1480072881 reading= Einspeisung_ohne_LWP__W value= 1252.7
2016.11.25 12:21:21 4: [movingaverage AC_Einspeisung] ARRAY has 24 elements, added one
2016.11.25 12:21:21 4: [movingaverage AC_Einspeisung] calculated over 24 values is 1261.200
2016.11.25 12:21:21 4: [movingAverage AC_Einspeisung] time= 2016-11-25 12:21:21 1480072881 reading= Einspeisung_ohne_LWP__W value= 1252.7
2016.11.25 12:21:21 4: [movingaverage AC_Einspeisung] ARRAY has 24 elements, added one
2016.11.25 12:21:21 4: [movingaverage AC_Einspeisung] calculated over 24 values is 1260.492
2016.11.25 12:21:21 4: [movingAverage AC_Einspeisung] time= 2016-11-25 12:21:21 1480072881 reading= Einspeisung_ohne_LWP__W value= 1252.7
2016.11.25 12:21:21 4: [movingaverage AC_Einspeisung] ARRAY has 24 elements, added one
2016.11.25 12:21:21 4: [movingaverage AC_Einspeisung] calculated over 24 values is 1259.783
2016.11.25 12:21:21 4: [movingAverage AC_Einspeisung] time= 2016-11-25 12:21:21 1480072881 reading= Einspeisung_ohne_LWP__W value= 1252.7
2016.11.25 12:21:21 4: [movingaverage AC_Einspeisung] ARRAY has 24 elements, added one
2016.11.25 12:21:21 4: [movingaverage AC_Einspeisung] calculated over 24 values is 1259.075
2016.11.25 12:21:22 4: [movingAverage AC_Einspeisung] time= 2016-11-25 12:21:22 1480072882 reading= Einspeisung_ohne_LWP__W value= 1253.7
2016.11.25 12:21:22 4: [movingaverage AC_Einspeisung] ARRAY has 24 elements, added one
2016.11.25 12:21:22 4: [movingaverage AC_Einspeisung] calculated over 24 values is 1258.408
2016.11.25 12:21:22 4: [movingAverage AC_Einspeisung] time= 2016-11-25 12:21:22 1480072882 reading= Einspeisung_ohne_LWP__W value= 1253.7
2016.11.25 12:21:22 4: [movingaverage AC_Einspeisung] ARRAY has 24 elements, added one
2016.11.25 12:21:22 4: [movingaverage AC_Einspeisung] calculated over 24 values is 1257.742
2016.11.25 12:21:22 4: [movingAverage AC_Einspeisung] time= 2016-11-25 12:21:22 1480072882 reading= Einspeisung_ohne_LWP__W value= 1253.7
2016.11.25 12:21:22 4: [movingaverage AC_Einspeisung] ARRAY has 24 elements, added one
2016.11.25 12:21:22 4: [movingaverage AC_Einspeisung] calculated over 24 values is 1257.075
2016.11.25 12:21:22 4: [movingAverage AC_Einspeisung] time= 2016-11-25 12:21:22 1480072882 reading= Einspeisung_ohne_LWP__W value= 1253.7
2016.11.25 12:21:22 4: [movingaverage AC_Einspeisung] ARRAY has 24 elements, added one
2016.11.25 12:21:22 4: [movingaverage AC_Einspeisung] calculated over 24 values is 1256.408
2016.11.25 12:21:22 4: [movingAverage AC_Einspeisung] time= 2016-11-25 12:21:22 1480072882 reading= Einspeisung_ohne_LWP__W value= 1253.7
2016.11.25 12:21:22 4: [movingaverage AC_Einspeisung] ARRAY has 24 elements, added one
2016.11.25 12:21:22 4: [movingaverage AC_Einspeisung] calculated over 24 values is 1255.742
2016.11.25 12:21:22 4: [movingAverage AC_Einspeisung] time= 2016-11-25 12:21:22 1480072882 reading= Einspeisung_ohne_LWP__W value= 1253.7
2016.11.25 12:21:22 4: [movingaverage AC_Einspeisung] ARRAY has 24 elements, added one
2016.11.25 12:21:22 4: [movingaverage AC_Einspeisung] calculated over 24 values is 1255.075
2016.11.25 12:21:23 4: [movingAverage AC_Einspeisung] time= 2016-11-25 12:21:23 1480072883 reading= Einspeisung_ohne_LWP__W value= 1253.7
2016.11.25 12:21:23 4: [movingaverage AC_Einspeisung] ARRAY has 24 elements, added one
2016.11.25 12:21:23 4: [movingaverage AC_Einspeisung] calculated over 24 values is 1254.408
2016.11.25 12:21:23 4: [movingAverage AC_Einspeisung] time= 2016-11-25 12:21:23 1480072883 reading= Einspeisung_ohne_LWP__W value= 1253.7
2016.11.25 12:21:23 4: [movingaverage AC_Einspeisung] ARRAY has 24 elements, added one
2016.11.25 12:21:23 4: [movingaverage AC_Einspeisung] calculated over 24 values is 1253.742
2016.11.25 12:21:23 4: [movingAverage AC_Einspeisung] time= 2016-11-25 12:21:23 1480072883 reading= Einspeisung_ohne_LWP__W value= 1253.7
2016.11.25 12:21:23 4: [movingaverage AC_Einspeisung] ARRAY has 24 elements, added one
2016.11.25 12:21:23 4: [movingaverage AC_Einspeisung] calculated over 24 values is 1253.075
2016.11.25 12:21:23 4: [movingAverage AC_Einspeisung] time= 2016-11-25 12:21:23 1480072883 reading= Einspeisung_ohne_LWP__W value= 1253.7
2016.11.25 12:21:23 4: [movingaverage AC_Einspeisung] ARRAY has 24 elements, added one
2016.11.25 12:21:23 4: [movingaverage AC_Einspeisung] calculated over 24 values is 1253.117
2016.11.25 12:21:23 4: [movingAverage AC_Einspeisung] time= 2016-11-25 12:21:23 1480072883 reading= Einspeisung_ohne_LWP__W value= 1253.7
2016.11.25 12:21:23 4: [movingaverage AC_Einspeisung] ARRAY has 24 elements, added one
2016.11.25 12:21:23 4: [movingaverage AC_Einspeisung] calculated over 24 values is 1253.158
2016.11.25 12:21:23 4: [movingAverage AC_Einspeisung] time= 2016-11-25 12:21:23 1480072883 reading= Einspeisung_ohne_LWP__W value= 1253.7
2016.11.25 12:21:23 4: [movingaverage AC_Einspeisung] ARRAY has 24 elements, added one
2016.11.25 12:21:23 4: [movingaverage AC_Einspeisung] calculated over 24 values is 1253.200


Er schreibt scheinbar alle werte des Arrays mit dem aktuellen Wert voll, dann ist auch klar warum sich der Wert immer weiter den Aktuellen Wert nähert und nach den zwei Sekunden genau wie der Aktuelle ist.

Aber warum macht er das?

Bjoernar

hinzu kommt der es in 5 Minuten eigentlich nur 10 Werte sein müssten.