[gelöst]funktionierendes notify mit Perl-Warnung im Log

Begonnen von frober, 22 Februar 2021, 18:24:54

Vorheriges Thema - Nächstes Thema

frober

Hallo zusammen,

ich habe zwei notify am laufen, die mir PERL WARNUNG im Log bringen.

Dieses notify funktioniert problemlos:
defmod n_Luft_aussen notify MYSENSOR_4:(temperature2|humidity2).* {fhem("sleep 0.1 quiet;; setreading Luft_aussen temperature " . (ReadingsNum("MYSENSOR_4","temperature2",undef)));; fhem("sleep 0.1 quiet;; setreading Luft_aussen humidity " . (ReadingsNum("MYSENSOR_4","humidity2",undef)));;}


Logauszug:
2021.02.22 08:30:41 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at (eval 8044283) line 1.
2021.02.22 08:30:41 3: eval: my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $NAME=   $evalSpecials->{'%NAME'};my $SELF=   $evalSpecials->{'%SELF'};my $TYPE=   $evalSpecials->{'%TYPE'};{fhem("sleep 0.1 quiet; setreading Luft_aussen temperature " . (ReadingsNum("MYSENSOR_4","temperature2",undef))); fhem("sleep 0.1 quiet; setreading Luft_aussen humidity " . (ReadingsNum("MYSENSOR_4","humidity2",undef)));}



Hier vermute ich, dass es funktioniert ;), da der Sensor nicht mehr ausgestiegen ist, habe ich keinen Beweis :):
defmod n_SensorLueftung notify MYSENSOR_4:temperature2.* {if (ReadingsVal($NAME,"temperature2",undef) eq "NAN" && OldReadingsVal($NAME,"temperature2",undef) eq "NAN") {sendMail('xxxx@xxx.de', 'FHEM-Meldung (NAN)', 'Sensor (DHT) misst nicht mehr, bitte resetten')};;}


Dazu auch die Logmeldung:
2021.02.22 08:20:40 1: PERL WARNING: Use of uninitialized value in string eq at (eval 8041188) line 1.
2021.02.22 08:20:40 3: eval: my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $NAME=   $evalSpecials->{'%NAME'};my $SELF=   $evalSpecials->{'%SELF'};my $TYPE=   $evalSpecials->{'%TYPE'};{if (ReadingsVal($NAME,"temperature2",undef) eq "NAN" && OldReadingsVal($NAME,"temperature2",undef) eq "NAN") {sendMail('frober@web.de', 'FHEM-Meldung (NAN)', 'Sensor (DHT) misst nicht mehr, bitte resetten')};}


Danke und Gruß
Bernd

Nachtrag: Die Logeintrage kommen sporadisch, also mehrere Std. nicht, und dann mehrfach hintereinander. Also müsste es zwischenzeitlich funktionieren!?
Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

betateilchen

Abgesehen davon, dass man sowas einfach per userReading ganz ohne notify lösen könnte, sind in der Definition m.E. ein paar Klammern zuviel.

Der Fehler tritt vermutlich auf, wenn einer der ReadingsNum() Aufrufe ein undef zurückliefert und dieser default-Wert dann nicht an den vorhandenen Teilstring angehängt werden kann.

Eingrenzen kannst Du das für Testzwecke dadurch, dass Du das notify duplizierst und jeweils einmal auf termperature2 und einmal auf humidity2 triggern lässt.
Vielleicht erkennst Du dann einen Zusammenhang, welcher der Werte für das Problem verantwortlich ist.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

frober

Zitat von: betateilchen am 22 Februar 2021, 19:11:53
Abgesehen davon, dass man sowas einfach per userReading ganz ohne notify lösen könnte, sind in der Definition m.E. ein paar Klammern zuviel.
Ich übertrage die Werte von eine MySensor-Node in ein Dummy, da funktioniert mWn kein userReading...
Die Sensoren waren vorher anders angeschlossen, so kann ich weiterloggen, ohne alles (dbLog, Plots,...) umzukonfigurieren.

Klammern zuviel? Die um das ReadingsVal? Da war ich mir nicht sicher...

Mit dem notify duplizieren werde ich versuchen...

Danke
Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

Otto123

Ist es nicht genau Sinn des dritten Wertes in den Funktionen ReadingsVal() & co  eben im Fehlerfall kein undef zurück zuliefern? Macht man sich durch Angaben von undef das Leben nicht extra schwer?  Damit muss man diese Ausnahme im Code selbst abfangen.

Wozu ist eigentlich die Kompliziertheit mit sleep 0.1 eingebaut? Die braucht man doch nur wenn man im gleichen Device schreiben will?
ZitatAchtung: setreading generiert kein Event für ein Gerät X, falls es aus einem notify für Gerät X aufgerufen wurde. In so einem Fall könnte man auf "sleep 0.1; setreading X Y Z" ausweichen.
Wenn durch A getriggert wird und man nach B schreiben will - braucht man das doch nicht?

Dann könnte man einfacher setreading Luft_aussen temperature [MYSENSOR_4:temperature2]  machen und bräuchte den Umweg über Perl nicht.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

frober

Zitat von: Otto123 am 22 Februar 2021, 22:34:24
Ist es nicht genau Sinn des dritten Wertes in den Funktionen ReadingsVal() & co  eben im Fehlerfall kein undef zurück zuliefern? Macht man sich durch Angaben von undef das Leben nicht extra schwer?  Damit muss man diese Ausnahme im Code selbst abfangen.
Das war mir nicht klar...undef habe ich benutzt, um keine falschen Werte zu loggen...

Zitat
Wozu ist eigentlich die Kompliziertheit mit sleep 0.1 eingebaut? Die braucht man doch nur wenn man im gleichen Device schreiben will? Wenn durch A getriggert wird und man nach B schreiben will - braucht man das doch nicht?
Mir geht es ums triggern, d.h. die Daten im Dummy werden geloggt. Ich dachte setreading
im notify triggern allgemein nicht...

Zitat
Dann könnte man einfacher setreading Luft_aussen temperature [MYSENSOR_4:temperature2]  machen und bräuchte den Umweg über Perl nicht.
Das werde ich ausprobieren, diese Schreibweise habe ich schon gesehen aber noch nie umgesetzt... ???
Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

Otto123

Zitat von: frober am 23 Februar 2021, 06:02:10
Das war mir nicht klar...undef habe ich benutzt, um keine falschen Werte zu loggen...
Dann dürftest Du in dem Fall die Werte nicht in den Dummy übertragen, dann werden sie nicht geloggt.
Du bleibst doch in Perl und machst es in der Art (für die FHEM Kommandozeile zum testen) else ist nur zum anzeigen
{if (my $val=ReadingsVal('willi','wert',1500)) {"der Wert ist $val"} else{'der Wert ist nicht definiert'}}
{if (my $val=ReadingsVal('willi','wert',undef)) {"der Wert ist $val"} else{'der Wert ist nicht definiert'}}
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

frober

Zitat von: Otto123 am 23 Februar 2021, 09:44:55
Dann dürftest Du in dem Fall die Werte nicht in den Dummy übertragen, dann werden sie nicht geloggt.
Du bleibst doch in Perl und machst es in der Art (für die FHEM Kommandozeile zum testen) else ist nur zum anzeigen
{if (my $val=ReadingsVal('willi','wert',1500)) {"der Wert ist $val"} else{'der Wert ist nicht definiert'}}
{if (my $val=ReadingsVal('willi','wert',undef)) {"der Wert ist $val"} else{'der Wert ist nicht definiert'}}
Wenn der Sensor keine Werte bringt, kommt von MySensors ein 'NAN'.
An Stelle undef, könnte ich in ReadingsVal auch als default ein 'NAN' angeben und in dbLog (oder direkt im Device) mit attr DbLogValueFn das loggen verhindern.

Was wird bei
setreading Luft_aussen temperature [MYSENSOR_4:temperature2]
als default geliefert?

Trotz allem werde ich per logging schauen, ob der Sensor noch andere Werte liefert.

Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

Otto123

siehe auch https://fhem.de/commandref_modular_DE.html#set
Da Dein Gerät und das Reading ja existiert wird der Wert genommen der im Reading steht. Wenn der Sensor nicht ausliefert vielleicht der Letzte?  oder wie Du sagst NAN. Einen default Wert gibt es bei set magic nach meinem Verständnis nicht.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

frober

Zitat von: Otto123 am 23 Februar 2021, 15:29:21
siehe auch https://fhem.de/commandref_modular_DE.html#set
Da Dein Gerät und das Reading ja existiert wird der Wert genommen der im Reading steht. Wenn der Sensor nicht ausliefert vielleicht der Letzte?  oder wie Du sagst NAN. Einen default Wert gibt es bei set magic nach meinem Verständnis nicht.

OK, danke.
Dann setzte ich es so um und wenn alles funktioniert den Threads auf gelöst.
Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

frober

1. default in ReadingsVal, undef ersetzt durch NAN -> keine PERL WARNING mehr im Log -> Problem gelöst  :)

Trotz allem verstehe ich nicht, wo das Problem her kommt, ok undef muss ich abfangen, soweit klar. Aber laut den Daten in dbLog gab es keine Probleme, auch nach der Änderung kein 'NAN' im Log, somit wurde mE nicht auf den default-Wert zugegriffen!?

Zu dem habe ich das gleiche notify für eine weiteren Sensor in der selben Node ohne Logmeldungen :o

2. Auf Fhem-Ebene bleiben, erstes notify geändert, wenn keine Logmeldungen auftauchen, werde ich die anderen nachziehen.
Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...