FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: jnewton957 am 07 Mai 2016, 10:03:40

Titel: nach rereadcfg statistics Werte negativ
Beitrag von: jnewton957 am 07 Mai 2016, 10:03:40
Hallo,

ich hatte mich mehrfach darüber gwundert, warum meine statistics Werte manchmal negativ sind und nach einem weiteren Tag wieder korrekt sind.

Nun habe ich den "Verursacher" gefunden.

Ich bastle viel an meiner fhem Konfiguration herum. Sei es in einzelnen cfg Dateien oder in den TabletUi Konfigurationen.
Da mache ich dann häufiger mal ein "rereadcfg".

Und genau danach sind die Wetrte, die ich mit dem statistics Modul errechnen lasse, negativ. Und zwar genau einen Tag lang.



define counter_wohnzimmer FRM_IN 25
attr counter_wohnzimmer IODev FIRMATA
attr counter_wohnzimmer alias Stromzähler-Wohnzimmer
attr counter_wohnzimmer count-mode falling
attr counter_wohnzimmer event-min-interval power:1
attr counter_wohnzimmer internal-pullup on
attr counter_wohnzimmer room Zähler
attr counter_wohnzimmer stateFormat time
attr counter_wohnzimmer userReadings time:reading:.off { use Time::HiRes qw(time);; time();; }, power:reading:.off { use Time::HiRes qw(time);; sprintf("%.2f", 3600 / (time() - OldValue("counter_wohnzimmer"))) . " W";; }
define weblink_wohnzimmer SVG log_zaehler:my_leistung_energie:CURRENT
attr weblink_wohnzimmer alias Diagramm-Wohnzimmer
attr weblink_wohnzimmer label "Leistung (W)"::"Energie (Wh)"
attr weblink_wohnzimmer plotfunction 4:counter_wohnzimmer.power::$fld[3]>3600?0:$fld[3] 4:counter_wohnzimmer.power::$cnt[0]
attr weblink_wohnzimmer room Bereiche
attr weblink_wohnzimmer sortby 01
attr weblink_wohnzimmer title "Wohnzimmer"


define counter_wohnzimmer.stat statistics counter_wohnzimmer
attr counter_wohnzimmer.stat deltaReadings counter
attr counter_wohnzimmer.stat room 96_Stromzaehler


Am statistics Modul kann es eigentlich nicht liegen, da ich einen weiteren Stromzähler habe, den ich per USBEHZ /dev/ttyUSB1 angeschlossen habe. Und dessen statisticswerte bleiben bei rereadcfg korrekt.

Ich komme einfach nicht weiter, da ich den "Fehler" nicht finde. Wenn es überhaupt ein Fehler ist.
Mir würde ansonsten auch ein workaround helfen.

Grüße
Jörg
Titel: Antw:nach rereadcfg statistics Werte negativ
Beitrag von: Gisbert am 22 Januar 2017, 05:18:12
Hallo Jörg,

ich nutze eine Mittelwertbildung, um Schwankungen bei einem Eigenbau-Lichtsensor zu glätten, z.B. bei vorbeiziehenden Wolken.
Die Mittelwertbildung als gleitender Mittelwert liegt als Funktion in 99_myUtils.pm:
#  Moving average                                                #       
#  Aufruf: movingAverage(devicename,readingname,zeitspanne in s) #
##################################################################

sub movingAverage($$$){
   my ($name,$reading,$avtime) = @_;
   my $hash = $defs{$name};
   my @new = my ($val,$time) = ($hash->{READINGS}{$reading}{VAL},$hash->{READINGS}{$reading}{TIME});
   my ($cyear, $cmonth, $cday, $chour, $cmin, $csec) = $time =~ /(\d+)-(\d+)-(\d+)\s(\d+):(\d+):(\d+)/;
   my $ctime = $csec+60*$cmin+3600*$chour;
   my $num;
   my $arr;
   #-- initialize if requested
   if( ($avtime eq "-1") ){
     $hash->{READINGS}{$reading}{"history"}=undef;
   }
   #-- test for existence
   if( !$hash->{READINGS}{$reading}{"history"}){
      #Log 1,"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 $starttime = $arr->[0][1];
      my ($syear, $smonth, $sday, $shour, $smin, $ssec) = $starttime =~ /(\d+)-(\d+)-(\d+)\s(\d+):(\d+):(\d+)/;
      my $stime = $ssec+60*$smin+3600*$shour;
      #-- correct for daybreak
      $stime-=86400
        if( $stime > $ctime);
      if( ($num < 25)&&( ($ctime-$stime)<$avtime) ){
        #Log 1,"ARRAY has $num elements, adding another one";
        push(@{$hash->{READINGS}{$reading}{"history"}},\@new);
      }else{
        shift(@{$hash->{READINGS}{$reading}{"history"}});
        push(@{$hash->{READINGS}{$reading}{"history"}},\@new);
      }
    }
    #-- output and average
    my $average = 0;
    for(my $i=0;$i<$num;$i++){
      $average+=$arr->[$i][0];
      Log 4,"[$name moving average] Value = ".$arr->[$i][0]." Time = ".$arr->[$i][1];
    }
    $average=sprintf( "%5.3f", $average/$num);
    #--average
    Log 4,"[$name moving average] calculated over $num values is $average"; 
    return $average;
}

Den Code habe ich nicht selbst geschrieben, im Moment weiß ich aber die Quelle nicht.

Die Funktion schreibt die Mittelwerte in den Logfile:
attr Lichstaerke userReadings Lichtstaerke.Ostseite {sprintf('%.0f', ReadingsVal('Lichtstaerke','Lichtstaerke.Ostseite',0))}, Lichtstaerke.Ostseite.Av {sprintf('%.0f', movingAverage('Lichtstaerke','Lichtstaerke.Ostseite',600))}

Ich bin mir nicht sicher, ob es den Kern deines Problems trifft. Auf jeden Fall werden die Mittelwerte nach einem rereadcfg richtig wiedergegeben.

Viele Grüße
Gisbert

PS: Dieses Problem könnten wir beim nächsten Treffen in Köln ansprechen.