[Gelöst] > vs gt (movingAverage + isn't numeric in numeric gt (>) at Problem

Begonnen von Hackstall, 04 September 2020, 18:28:46

Vorheriges Thema - Nächstes Thema

Hackstall

Hallo eigentlich ein einfaches Thema aber irgendwie habe ich Probleme damit:

Die folgende Routine


fhem("get ZWave_SENSOR_MULTILEVEL_46.03 smStatus");
fhem("get ZWave_SENSOR_MULTILEVEL_46.04 smStatus");
fhem("get ZWave_SENSOR_MULTILEVEL_46.05 smStatus");
fhem("get ZWave_SENSOR_MULTILEVEL_46.06 smStatus");

my $tmp_Oben_Val = ReadingsVal("ZWave_SENSOR_MULTILEVEL_46.05","temperature",0.0);
my $tmp_Mitte_Val = ReadingsVal("ZWave_SENSOR_MULTILEVEL_46.04","temperature",0.0);
my $tmp_Unten_Val = ReadingsVal("ZWave_SENSOR_MULTILEVEL_46.03","temperature",0.0);
my $tmp_WW_Val = ReadingsVal("ZWave_SENSOR_MULTILEVEL_46.06","temperature",0.0);

my @tmp_oben =  split(/ /,$tmp_Oben_Val);
my @tmp_Mitte =  split(/ /,$tmp_Mitte_Val);
my @tmp_Unten =  split(/ /,$tmp_Unten_Val);
my @tmp_WW =  split(/ /,$tmp_WW_Val);


if (($tmp_Oben[0] < 100.0) && ($tmp_Oben[0] > 10.0))
   {
     fhem("set UG.KE.Pufferspeicher PS_Oben $tmp_Oben[0]");
   }
if (($tmp_Mitte[0] < 100.0) && ($tmp_Mitte[0] > 10.0))
   {
     fhem("set UG.KE.Pufferspeicher PS_Mitte $tmp_Mitte[0|");
   }
if (($tmp_Unten[0] < 100.0) && ($tmp_Unten[0] > 10.0))
   {
     fhem("set UG.KE.Pufferspeicher PS_Unten $tmp_Unten[0]");
   }
if (($tmp_WW[0] < 100.0) && ($tmp_WW[0] > 10.0))
   {
    fhem("set UG.KE.Pufferspeicher PS_WarmWasser $tmp_WW[0]");
   }
}


bringt im LOG immer 4 mal folgende Ausgaben:


2020.09.04 18:24:31 1: PERL WARNING: Argument "" isn't numeric in numeric gt (>) at (eval 111730) line 1.
2020.09.04 18:24:31 1: PERL WARNING: Argument "" isn't numeric in numeric gt (>) at (eval 111740) line 1.
2020.09.04 18:24:31 1: PERL WARNING: Argument "" isn't numeric in numeric gt (>) at (eval 111750) line 1.
2020.09.04 18:24:31 1: PERL WARNING: Argument "" isn't numeric in numeric gt (>) at (eval 111760) line 1.


Kann mir jemand weiterhelfen was an meiner Routine nicht stimmt oder sagen wenn nicht relevant wie man
dieses Log abschalten kann.

Danke Andreas

Wzut

Ersetze alle ReadingsVal("ZWave durch ReadingsNum("ZWave und erspare dir den Umweg über sie splitterei
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Hackstall

Ja genau das hatte ich ich am Anfang mit gleicher Meldung, funktionierte somit auch nicht.

Übrigens  die Eingangswerte sind zBsp. 35.6 C

Das Resultat ohne splitting ist wie folgt:

Code (als at definiert:

+*00:02 {
fhem("get ZWave_SENSOR_MULTILEVEL_46.03 smStatus");
fhem("get ZWave_SENSOR_MULTILEVEL_46.04 smStatus");
fhem("get ZWave_SENSOR_MULTILEVEL_46.05 smStatus");
fhem("get ZWave_SENSOR_MULTILEVEL_46.06 smStatus");

my $tmp_Oben = ReadingsNum("ZWave_SENSOR_MULTILEVEL_46.05","temperature",0.0);
my $tmp_Mitte = ReadingsNum("ZWave_SENSOR_MULTILEVEL_46.04","temperature",0.0);
my $tmp_Unten = ReadingsNum("ZWave_SENSOR_MULTILEVEL_46.03","temperature",0.0);
my $tmp_WW = ReadingsNum("ZWave_SENSOR_MULTILEVEL_46.06","temperature",0.0);

Log 1, "Step 1";
if (($tmp_Oben < 100.0) && ($tmp_Oben > 10.0))
   {
     fhem("set UG.KE.Pufferspeicher PS_Oben $tmp_Oben");
   }
Log 1, "Step 2";
if (($tmp_Mitte < 100.0) && ($tmp_Mitte > 10.0))
   {
     fhem("set UG.KE.Pufferspeicher PS_Mitte $tmp_Mitte");
   }
Log 1, "Step 3";   
if (($tmp_Unten < 100.0) && ($tmp_Unten > 10.0))
   {
     fhem("set UG.KE.Pufferspeicher PS_Unten $tmp_Unten");
   }
Log 1, "Step 4";   
if (($tmp_WW < 100.0) && ($tmp_WW > 10.0))
   {
    fhem("set UG.KE.Pufferspeicher PS_WarmWasser $tmp_WW");
   }
}


Resultat:

2020.09.04 23:06:05 1: Step 1
2020.09.04 23:06:05 1: PERL WARNING: Argument "" isn't numeric in numeric gt (>) at (eval 226205) line 1.
2020.09.04 23:06:05 1: Step 2
2020.09.04 23:06:05 1: PERL WARNING: Argument "" isn't numeric in numeric gt (>) at (eval 226215) line 1.
2020.09.04 23:06:05 1: Step 3
2020.09.04 23:06:05 1: PERL WARNING: Argument "" isn't numeric in numeric gt (>) at (eval 226225) line 1.
2020.09.04 23:06:05 1: Step 4
2020.09.04 23:06:05 1: PERL WARNING: Argument "" isn't numeric in numeric gt (>) at (eval 226235) line 1.


Danke Andreas

amenomade

Mach mal ein Log 1, "Step 1: tmp_Oben=$tmp_Oben"; dann siehst Du was du kriegst
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Hackstall

Hallo ich habe etwas weiter recherchiert und herausgefunden dass die Fehlermeldung wohl irreführend ist.

Am Ende verursacht das set Statement wohl das Problem:

fhem("set UG.KE.Pufferspeicher PS_Unten $tmp_Unten");


Dieses triggert ein UserReading welches wiederum die movingAverage Funktion aufruft:

attr UG.KE.Pufferspeicher userReadings PS_WarmWasser.av {movingAverage("UG.KE.Pufferspeicher","PS_WarmWasser",900);;},PS_Oben.av {movingAverage("UG.KE.Pufferspeicher","PS_Oben",900);;},PS_Mitte.av {movingAverage("UG.KE.Pufferspeicher","PS_Mitte",1);;;;},PS_Unten.av {movingAverage("UG.KE.Pufferspeicher","PS_Unten",900);;}


1) Hier werden Float Werte an die Moving Average übergeben. Ich denke dass sollte doch der MovingAverage Funktion egal sein oder?
2) Sowie ich die Moving Average Funktion per Attribute lösche gibt es auch keine Einträge über "isn't numeric in numeric gt" mehr.

Habt Ihr Ideen oder Erfahrungen?

Im übrigen funktioniert jedoch alles wie erwartet. Es sind nur die Fehlermeldungen die mein Log Vollschreiben.

Danke Andeas

Wzut

Zitat von: Hackstall am 05 September 2020, 00:21:11
dass sollte doch der MovingAverage Funktion egal sein oder?
nein wieso ? Es kommt ja drauf an wie sich MV die Werte holt. D.h. wieder ReadingsVal vs. ReadingsNum oder ganz anders.
Nutzt du pahs Original aus dem Wiki -> https://wiki.fhem.de/wiki/Gleitende_Mittelwerte_berechnen_und_loggen ?
dann legt das Problem hier
my @new = my ($val,$time) = ($hash->{READINGS}{$reading}{VAL},$hash->{READINGS}{$reading}{TIME});
bei mir sieht die schon lange so aus :
my @new = my ($val,$time) = (ReadingsNum($name,$reading,0),$hash->{READINGS}{$reading}{TIME});
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Hackstall

Danke für die Antwort und den Hinweis.

Ja ich hatte noch die alte Version ohne ReadingsNum aber das war nicht mein Fehler.

Ich hatte nochmals detailliert geforscht und herausgefunden dass ein Reading falsch geschrieben war und als Default Wert "" zurückgegeben werden sollte. Blöder Fehler schwer zu finden da das Reading erst im weiteren DOIF verwendet wurde.

Danke für Eure Hilfe

Gruss Andreas