Diese "Ausreißer" habe ich noch nicht bemerkt, da ich mein Device noch nicht logge und plotte. Ich hab das auch noch nicht lange am Laufen und die Jahre zuvor hatte ich einen 1- Wire- Bus mit vielen Sensoren an die Therme gebastelt, der bis heute zuverlässig die Temperaturkurven liefert. Aber gegen die Ausreißer kann man etwas tun. Zum beheben der Ursache reicht mein Wissen nicht, aber ich kann dir zeigen wie du die falschen Werte rausfiltern kannst. Du legst in der "99_myUtils.pm" eine kleine Routine an, die z.B. bewirkt dass die negativen Werte verworfen werden (das sprintf "%.1f" kürzt bei Bedarf noch auf eine Kommastelle): sub v200_filter_kesseltemp($) { my ($v200_name) = @_; # übergebene Daten einlesen my $temp = ReadingsNum("$v200_name","Kessel_Ist",0); # Variable mit akt. Temp.- Wert befüllen if ($temp > 0 ) { # nur positive Werte durchlassen return sprintf "%.1f",$temp; # Rückgabe der pos. Werte und kürzen auf eine Kommastelle } } Diese Routine rufst du dann in deinem Vito.- Device als "userReadings" (ist ein Attribut) auf und bekommst dadurch immer eine sauber plotbare Wertereihe geliefert (es muss dann dieses userReading geloggt werden): kesseltemp_filter {v200_filter_kesseltemp($name)} So kann man sich viele Arten von "Ausreißern" gut hinbiegen. Falls du dazu den alten Wert zum Vergleich alt/aktuell brauchst, musst du für das entspr. Reading das Attribut "oldreadings" aktivieren. Der Zugriff geht dann so (Beispiel mit Vergleich alt/aktuell): sub v200_filter_kesseltemp($) { my ($v200_name) = @_; # übergebene Daten einlesen my $temp = ReadingsNum("$v200_name","Kessel_Ist",0); # Variable mit akt. Temp.- Wert befüllen my $old_temp = OldReadingsNum("$v200_name","Kessel_Ist","$temp"); # Variable mit altem Temp.- Wert befüllen my $diff = ($temp - $old_temp); # Subtraktion der beiden Werte (aktuell - alt) if ($diff >= 100) { # Ergebnis der Subtraktion auswerten -> wenn größer/gleich 100 -> liefere alten Wert Log 1, "if... temp:$temp old-temp:$old_temp diff:$diff" ; # Testausgabe der Werte im Logfile (später auskommentieren!) return sprintf "%.1f",$old_temp; } else { # sonst liefere aktuellen Wert Log 1, "else... temp:$temp old-temp:$old_temp diff:$diff" ; # Testausgabe der Werte im Logfile (später auskommentieren!) return sprintf "%.1f",$temp; } }
... Mehr anzeigen