Notify mit $EVTPART0 und $EVTPART1 bringt immer wieder Fehler

Begonnen von blade-of-fire, 18 Juli 2019, 20:18:38

Vorheriges Thema - Nächstes Thema

blade-of-fire

Hallo zusammen,
ich habe eine Problem mit Notifys, wo ich bisher noch keine für mich funktionierende Lösung gefunden habe. Der entsprechende Wiki-Eintrag konnte mir nicht helfen. Ich denke mal, ich brauch nur mal den richtigen Stupser in die richtige Richtung.
Ich habe ein Notify, das wie folgt aussieht
MQTT2_sonoff_pow1:POWER:.* {

if (($EVENT eq $EVTPART0) || ($EVENT eq "$EVTPART0 "))
{
Log(3, "Notify_MQTT2_sonoff_pow1: $EVENT");
return;
}

my $basicstate = ReadingsVal("MQTT2_sonoff_basic1","POWER","OFF");

if ($EVTPART1 eq "ON"){
if ($basicstate eq "OFF"){
fhem "set MQTT2_sonoff_basic1 on";
}
}
elsif ($EVTPART1 eq "OFF"){
if ($basicstate eq "ON"){
fhem "set MQTT2_sonoff_basic1 off";
}
}

}


Dieses Notify erzeugt bei sporadisch Fehlermeldungen:
ERROR evaluating my $SELF='notify_MQTT2_sonoff_pow1';my $TYPE='MQTT2_DEVICE';my $EVENT='POWER: ';my $EVTPART0='POWER:';my $NAME='MQTT2_sonoff_pow';{
...}: Global symbol "$EVTPART1" requires explicit package name (did you forget to declare "my $EVTPART1"?) at (eval 12375) line 11.


Es ist wohl so, dass der Sonoff POW ab und zu ein leeres POWER-Event absetzt. Das Versuche ich durch die erste IF-Abfrage abzufangen. Allerdings scheint das nicht zu funktionieren.
Ist der return; Befehl aus dem Notify überhaupt wirksam?
Gib es vielleicht eine bessere Methode, das EVENT auf zusplitten? Es geht hier im Grunde nicht um die Funktion an sich des Events, sondern viel mehr um das Problem mit $EVTPART1.

Danke schonmal.

Gruß
Patrick
VM mit Ubuntu und FHEM-Instanz (Hauptinstanz)
FHEM2FHEM
Raspberry Pi 3 B+ mit Eigenbau-Platine + Relais-Platine + Cul-Stick + FHEMDuino

flummy1978

Hallöchen,

es ist leider nur ein Versuch dahinter zu kommen und zu helfen, ohne direkt die Lösung zu wissen, aber vielleicht hilft es ja:

Zitat von: blade-of-fire am 18 Juli 2019, 20:18:38
Es ist wohl so, dass der Sonoff POW ab und zu ein leeres POWER-Event absetzt. Das Versuche ich durch die erste IF-Abfrage abzufangen. Allerdings scheint das nicht zu funktionieren.
Warum sollte es so sein ? Wenn das Gerät schaltet ist es on oder off. Aber vielleicht ist es bei mir auch nie so, weil ich mir bei meinen Sonoff Geräten (von den ich sehr viele im Einsatz habe) angewöhnt habe, als erstes das Template: A_01z_tasmota_set_lowercase_texts_and_state1 zu setzen, bevor ich irgendwas anderes mache. Somit wird IMMER Power1 genutzt um das STATE auszugeben. Damit umgehst Du auch schnell diese Groß - Klein Schreib Problematik mit vielen anderen Geräten.  Vielleicht ist das schon die Lösung der "leeren Events"

Ansonsten mache ich bei solchen Abfragen immer das was es tatsächlich sein soll:

if ($EVTPART1 eq "ON"){ ... }
elsif ($EVTPART1 eq "OFF"){ .... }
else { ... }
}

Damit solltest Du eigentlich auch dinge umgehen, die was unplausibles liefern - und wenn es ein mal in 1000 Events ist :)

Hoffe geholfen zu haben.

Grüße
Andreas

Otto123

#2
Hallo Patrick,

Perl Befehle müssen mit einem ; abgeschlossen werden:
if (){};
Das fehlt bei Dir. Deswegen erkennt er den nächsten Befehl nicht.
Sorry Fehler von mir.

Gruß Otto
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

blade-of-fire

Danke schonmal für die Antworten.
ZitatWarum sollte es so sein ? Wenn das Gerät schaltet ist es on oder off.
Warum das so ist, kann ich mir auch nicht erklären. Ich kam noch nicht dazu, die MQTT-Nachrichten mal zu tracken, aber ich habe auch schon an einem anderen Sonoff in den Readingsgesehen, dass ab und zu das Reading POWER leer ist.

ZitatHallo Patrick,

Perl Befehle müssen mit einem ; abgeschlossen werden:
if (){};
Das fehlt bei Dir. Deswegen erkennt er den nächsten Befehl nicht.

Gruß Otto
Grundsätzliche Befehle ja, aber es ist mir neu, dass ein If-Statement mit ";" abgeschlossen werden muss.

Das Notify funktioniert ja grundsätzlich, ich möchte nur diese Fehlermeldungen weg bekommen, weil mir das verhalten schon an anderen Notifys in Verbindung mit $EVTPART1 aufgefallen ist.

Meine Vermutung dahingehend ist folgende.
Angenommen wir haben ein Event von dummy1 durch den Befehl "set dumm1 POWER".
Dann würde ja $EVTPART1 nicht definiert werden und $EVENT = $EVTPART0. Das versuche ich ja mit dem if abzufangen
if (($EVENT eq $EVTPART0) || ($EVENT eq "$EVTPART0 "))
{
Log(3, "Notify_MQTT2_sonoff_pow1: $EVENT");
return;
}

Ich habe aber den Eindruck, dass er auch wenn er durch "return;" das notify verlassen soll, dennoch das Notify nach definierten Variablen überprüft und dabei feststellt, dass $EVTPART1 nicht definiert ist.
VM mit Ubuntu und FHEM-Instanz (Hauptinstanz)
FHEM2FHEM
Raspberry Pi 3 B+ mit Eigenbau-Platine + Relais-Platine + Cul-Stick + FHEMDuino

rudolfkoenig

#4
@Patrick:
Das Problem hier ist, dass der Interpreter $EVTPART1 auch dann vermisst, wenn es dank if Abfrage nie angefasst wird.
Ich empfehle in diesem Fall auf $EVTPARTx zu verzichten, mit "my @ea = split(" ", $EVENT);" selbst zu trennen, und mit $ea[x] zu arbeiten (x ist mit Ziffern zu ersetzen).

ZitatPerl Befehle müssen mit einem ; abgeschlossen werden:
Das ist so nicht ganz richtig: nach einem {} Block muss/sollte kein Strichpunkt kommen, und auch der letzte Befehl in einem Block braucht keinen.

blade-of-fire

@rudolfkoenig
Also lag ich mit meiner Vermutung ja richtig. Gut, dann weiss ich in Zukunft bescheid, wie ich das Problem umgehen kann. Danke  :)
VM mit Ubuntu und FHEM-Instanz (Hauptinstanz)
FHEM2FHEM
Raspberry Pi 3 B+ mit Eigenbau-Platine + Relais-Platine + Cul-Stick + FHEMDuino

flummy1978

Moinsen,

Zitat von: blade-of-fire am 19 Juli 2019, 08:40:17
Warum das so ist, kann ich mir auch nicht erklären. Ich kam noch nicht dazu, die MQTT-Nachrichten mal zu tracken, aber ich habe auch schon an einem anderen Sonoff in den Readingsgesehen, dass ab und zu das Reading POWER leer ist.
würde mich wirklich mal interessieren, ob / warum das so ist. Vor allem vielleicht auch in Zusammenhang mit meinem Tipp von oben (A_01z_tasmota_set_lowercase_texts_and_state1)? Vielleicht ist das der Grund, dass mir das nie aufgefallen ist, weil es bei mir einfach durch das Reading auf POWER1 nie zu dem leeren Event kommt *grübel*

Bei dem Semikolon war ich mir sicher, dass dieser nicht nach Abschluss von  {  } kommen muss, weil das Notify ja grundsätzlich auch ohne Warnung / Fehler korrekt funktioniert. Aber der Tipp kam von jemandem der definitiv vieeeeeeel weiter ist als ich und ich mich daher zwar gewundert habe, aber sollte schon seine Richtigkeit haben ;) ---- Wieder was gelernt.

Grüße
Andreas

Otto123

Zitat von: flummy1978 am 19 Juli 2019, 10:13:36
Aber der Tipp kam von jemandem der definitiv vieeeeeeel weiter ist als ich und ich mich daher zwar gewundert habe, aber sollte schon seine Richtigkeit haben ;) ---- Wieder was gelernt.
Hallo Andreas,

die Anzahl der Beiträge ist keine Aussage über das Wissen, genauso wenig wie das Alter  :D

Ich war mir sicher, dass das letzte Semikolon im Block {} nicht notwendig und somit überflüssig ist. Ich bin ein ziemlicher Perl Anfänger und habe noch immer nicht alles verstanden wann da wirklich ein semikolon hin muss und wann nicht  :-[
Ich denke das mit dem Block werde ich jetzt behalten. :)

Gruß Otto
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

blade-of-fire

Zitat von: flummy1978 am 19 Juli 2019, 10:13:36
Moinsen,
würde mich wirklich mal interessieren, ob / warum das so ist. Vor allem vielleicht auch in Zusammenhang mit meinem Tipp von oben (A_01z_tasmota_set_lowercase_texts_and_state1)? Vielleicht ist das der Grund, dass mir das nie aufgefallen ist, weil es bei mir einfach durch das Reading auf POWER1 nie zu dem leeren Event kommt *grübel*
Ich schaue mir das jetzt am Wochenende mal an. Das mit den Templates hatte ich bisher noch gar nicht auf dem Schirm.
VM mit Ubuntu und FHEM-Instanz (Hauptinstanz)
FHEM2FHEM
Raspberry Pi 3 B+ mit Eigenbau-Platine + Relais-Platine + Cul-Stick + FHEMDuino

flummy1978

Hallo nochmal,

@Otto:
Zitat von: Otto123 am 19 Juli 2019, 10:45:54
die Anzahl der Beiträge ist keine Aussage über das Wissen, genauso wenig wie das Alter  :D
Eigentlich würde ich Dir da immer Recht geben. Allerdings ist für mich >12000 Beiträge schon eine Menge auf die man nicht so ohne weiteres kommt nur weil man fröhlich im Forum Spamt  ;)

Wie dem auch sei, ich hätte nicht gedacht, dass ich jemanden wie Dich, der ja nunmal schon sehr lange mit Fhem zu tun hat, bei so etwas korrigieren könnte / würde... Daher war ich da etwas zurückhaltender. Ich hab vor zig Jahren mal einigermaßen viel mit Perl (in Verbindung mit Web-Programmierung) zu tun gehabt, daher kommen meine Grundwissen dort.  8)
Aber passt, mit der Aufklärung von Rudolf haben wir denke ich beide noch mal was gelernt :)

@Patrick: Bin gespannt ob sie möglicherweise Deine Problematik ggf lösen können. Ich bastel grad an meiner Ventilsteuerung. Dort hab ich auch ein notify das diese steuert. Mal sehen ob ich dort das Problem mit dem EVTPART nachbilden kann.

Grüße
Andreas

blade-of-fire

@Andreas: Das kenne ich nur zu gut. Ich bin hauptberuflich Softwareentwickler im .Net Umfeld und habe schon etliche Zeilen Code in Perl geschrieben. Dennoch war ich kurz verunsichert, ob ich nicht die ganze Zeit was falsch gemacht habe, wenn man von einem entsprechenden Foren Mitglied darauf hingewiesen wird. [emoji85]

Ich hoffe, ich komme morgen dazu, das mal umfangreicher zu testen und dann melde ich mich wieder.

Gruß
Patrick

Gesendet von meinem LYA-L29 mit Tapatalk

VM mit Ubuntu und FHEM-Instanz (Hauptinstanz)
FHEM2FHEM
Raspberry Pi 3 B+ mit Eigenbau-Platine + Relais-Platine + Cul-Stick + FHEMDuino