NAN (Not a number) readings im Log-file vermeiden?

Begonnen von _Niemand_, 11 Mai 2018, 13:28:55

Vorheriges Thema - Nächstes Thema

_Niemand_

Hallo,
ich habe das Problem, dass ich jeden Tag (kurz vor Mitternacht) einen Wert in ein Logfile schreiben möchte (in meinen Fall der Zählerstand eines Energiezählers).
Dabei kann es aber vorkommen, dass das entsprechende Sensor-Reading gerade mal wieder auf NAN (Not a number) steht und deshalb anstatt des aktuellen Zählerstandes nur "NAN" im Logfile steht.
Jetzt meine Frage, wie kann ich vermeiden, das "NAN" ins Logfile geschrieben wird und stattdessen auf  den nächsten "gültigen" Zählerwert  vom "Sensor" (hier ESPEasy über FHEM HTTP) gewartet wird und dieser dann im Log abgelegt wird?

vielen Dank schon mal...

Amenophis86

Wie wäre es, wenn du erst Mal die entsprechenden Infos lieferst, damit man dir helfen kann. Was du dazu brauchst steht in den Posts, welche im Forum ganz oben angeheftet sind :)
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

_Niemand_

#2
gut Amenophis86 mache ich gerne,  dann versuche ich's mal ausführlicher aber bitte nicht schimpfen, wenn doch noch was Entscheidendes an Infos fehlen sollte  ;)

Wie schon gesagt, ich möchte ein paar Werte von meinen Stromzähler, der über einen ESP8266 (mit ESPeasy) die Werte an FHEM mittels FHEM-HTTP übermittelt, in ein (mehrere) Logfile(s) schreiben.
Zum Teil um die Werte evtl. mit Plots darzustellen, aber auch diese Werte später mal aus FHEM zu exportieren (um sie woanders weiterzubearbeiten).

Das Problem dabei ist, dass die Readings vom ESP manchmal "NAN" anstatt des Wertes aufweisen.
Zum einen macht dieses Verhalten die Logfiles (speziell bei Werten die alle 2 Minuten geloggt werden und wovon dann bis zu 50% NAN-readings sind - wenn ich "event-on-change-reading state" benutze und dann für eine längere Zeit zwischen gleichbleibenden Wert und NAN hin und her gewechselt wird ) unnötig fett und zum anderen (und dies ist mein Hauptanliegen/Problem) geht bei Werten, die nur einmal täglich geloggt werden dann im NAN-Fehlerfall, die ganze Information für diesen Tag verloren.

z.B. hier bei meinen Tageslog:
2018-05-07_23:10:00 ErtragPV 24.266
2018-05-08_23:10:00 ErtragPV 25.723
2018-05-09_23:10:00 ErtragPV 26.753
2018-05-10_23:10:00 ErtragPV nan
2018-05-11_23:10:00 ErtragPV 29.227


Diesen Log schreibe ich mit diesen Settings:
define ErtragPV dummy
define ErtragByTag at *23:10:00 { my $d= ReadingsVal("ESPEasy_ESP_SDM230_Gesamtverbrauch_kWh","Gesamtverbrauch_kWh",0);; fhem("set ErtragPV $d")}
define Log_ErtragPV FileLog ./log/ErtragPV-%Y.log ErtragPV


Jetzt wäre meine Frage, ob man, bevor der Wert ins Logfile geschrieben wird, überprüfen kann, ob er "NAN" ist (also so was, was man in anderen Programmierumgebungen mit  der Funktion "isnan()" machen kann) und wenn (und jetzt wird's schwierig) der Wert NAN ist, dann nicht schreibt, sondern auf einen "gültigen" Wert wartet (geht das mittels "notify"  oder  über  einen einmaligen "event-on-change-reading state" oder ganz anders? Wann ja: wie triggere ich dann "einmal" meinen Logeintrag?)
Ich bitte um Vorschläge von den Experten :) - nur bitte, bitte keinen blanken Verweis auf das statistic Modul in der Commandref
Danke!

Prof. Dr. Peter Henning

Keine Bange. Mein Verweis zielt darauf, Perl besser zu lernen und den Inhalt der geschweiften Klammer in eine ordentliche Perl-sub einzubauen, die per 99_myUtils.pm eingebunden wird.

https://perldoc.perl.org/

LG

pah

Amenophis86

Da hat pah jetzt nicht Unrecht, würde ich auch so machen. Lass mit einem at die Abfrage laufen, die auf eine sub verweist. In der sub prüfst du den Wert und wenn dir der nicht passt, dann setzt du dir ein neues at, welches wieder auf die sub verweist. Alternativ kannst du auch die Zeit des vorhandenen at ändern. Muss dann natürlich später wieder zurück auf die Ursprungs Zeit, wenn die Abfrage ok war.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

Amenophis86

Ach und gernell sollten list der Device gepostet werden und nicht nur die Definitions Zeile ;)
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

_Niemand_

Danke für die Tipps und Anregungen. ;D

Habs genau so gemacht, d.h. den Check auf "nan" in eine sub ausgelagert und bei Auftreten des "nan" ein modify aufs "at" um den Wert eine Minute später nochmals zu überprüfen und ggf. das Spiel von neuen zu starten.
Sieht dann bei mir so aus (und scheint zu tun was es soll):
sub subPVErtragLog(){
    my $x= ReadingsVal("ESPEasy_ESP_SDM230_Gesamtverbrauch_kWh","Gesamtverbrauch_kWh",0);
    if($x ne "nan") {
         fhem("set ErtragPV $x");
fhem("modify ErtragByTag *23:10:00");
    }else{
fhem("modify ErtragByTag +00:01:00");}
}

:)