[geklärt/workaround]Problem $EVTPARTx im notify mit events untersch. Anz. x

Begonnen von KölnSolar, 19 Dezember 2020, 15:52:39

Vorheriges Thema - Nächstes Thema

KölnSolar

Hi Rudi,
ich quäl mich den ganzen Tag mit einem etwas komplexeren notify. Nun hab ich das Problem in einer simplen Form nachstellen können. Warum auch immer, kommt bei folgendem notify nur das event des elsif-Zweiges durch. Ändere ich $EVTPART2 in $EVTPART1 funktioniert es wie es soll(außer, dass mein set nun falsch ist).
defmod act_on_tint notify Tint_remote:action.*|Tint_remote:color_temp.* {if ($EVTPART0 eq "action_color_temperature:"){fhem("set lampe color_temp $EVTPART1")}\
elsif ($EVTPART1 eq "scene"){fhem("set lampe scene $EVTPART2")}\
}


Die beiden events sehen so aus:
2020-12-19 15:45:12 MQTT2_DEVICE Tint_remote action_color_temperature: 370
2020-12-19 15:45:45 MQTT2_DEVICE Tint_remote action: scene 6


Kann es etwas damit zu tun haben, dass es bei dem ersten event gar kein $EVTPART2 gibt ?  :-\ Also nur noch events durchlaufen, die auch  $EVTPART2 haben.

Danke&Grüße
Markus
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

betateilchen

Das ist kein Bug im notify, sondern liegt an der Tatsache, dass $EVTPART2 kein echter Variablenname, sondern ein Platzhalter ist, der von FHEM intern ausgewertet wird. Deshalb kannst Du auch nicht mit defined($EVTPART2) prüfen, ob es den Wert überhaupt gibt.

Workaround:


defmod act_on_tint notify Tint_remote:action.*|Tint_remote:color_temp.* { if ($EVTPART0 eq "action_color_temperature:") {fhem("set lampe color_temp $EVTPART1")} elsif ($EVTPART1 eq "scene") {fhem("set lampe scene ".(split(/ /,$EVENT))[2])} }

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

Anders formuliert: die Variable EVTPARTx wird nur dann definiert, falls dafuer ein Wert vorhanden ist.
Mit der obiger Definitions steht nach "trigger Tint_remote action_color_temperature: 370" Folgendes im FHEM-Log:
2020.12.19 18:18:48.124 1: ERROR evaluating 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 ($EVTPART0 eq "action_color_temperature:"){fhem("set lampe color_temp $EVTPART1")}
elsif ($EVTPART1 eq "scene"){fhem("set lampe scene $EVTPART2")}
}: Global symbol "$EVTPART2" requires explicit package name (did you forget to declare "my $EVTPART2"?) at (eval 32) line 2.

2020.12.19 18:18:48.124 3: act_on_tint return value: Global symbol "$EVTPART2" requires explicit package name (did you forget to declare "my $EVTPART2"?) at (eval 32) line 2.


Wie man sieht, my $EVTPART2= fehlt.
Wenn man Events mit unterschiedlichen Anzahl an Woerten pruefen will, muss man $EVENT selbst splitten.

KölnSolar

Der workaround funktioniert.  8) Danke Dir.

Aus "Anwendersicht" halte ich das aber trotzdem für einen Bug oder zumindest unschön. Man benutzt es ja wie eine Variable
Zitat$EVTPART0,$EVTPART1,$EVTPART2,etc contain the space separated event parts (e.g. $EVTPART0="measured-temp:", $EVTPART1="21.7", $EVTPART2="(Celsius)". This data is available as a local variable in perl, as environment variable for shell scripts, and will be textually replaced for FHEM commands.

ZitatWenn man Events mit unterschiedlichen Anzahl an Woerten pruefen will, muss man $EVENT selbst splitten.
Es wird ja nicht geprüft, sondern nur im set "benutzt". Für diesen case ist $EVTPART2 dann auch gefüllt/definiert. Aber mit Deinem Test hab ich zumindest verstanden, was da passiert.  ;)
Entscheidend ist also
Zitat....Events mit unterschiedlichen Anzahl an Woerten....

Wie gesagt, den Hintergrund verstehe ich, aber so richtig glücklich bin ich damit auch nicht. Ich könnt ja jetzt die Frage stellen, warum überhaupt $EVTPARTx, wenn es nicht immer funktioniert. In meinem Code  $EVENT in ein Array gesplittet hätte funktioniert.
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

rudolfkoenig

Richtig gluecklich bin ich damit auch nicht, ich weiss aber nicht, wie man es gut _und_ kompatibel  loest.
Am liebsten wuerde ich EVTPARTx abschaffen, vmtl. fuehrt es aber zum Aufschrei.

betateilchen

Zitat von: KölnSolar am 19 Dezember 2020, 19:22:24
Ich könnt ja jetzt die Frage stellen, warum überhaupt $EVTPARTx, wenn es nicht immer funktioniert. In meinem Code  $EVENT in ein Array gesplittet hätte funktioniert.

Als Hilfestellung für Anwender, die nicht so komplizierte notify bauen wollen wie Du.

Zitat von: KölnSolar am 19 Dezember 2020, 19:22:24
In meinem Code  $EVENT in ein Array gesplittet hätte funktioniert.

Das funktioniert in solchen Szenarien immer.




Zitat von: rudolfkoenig am 19 Dezember 2020, 19:28:02
Am liebsten wuerde ich EVTPARTx abschaffen, vmtl. fuehrt es aber zum Aufschrei.

*dafür*

Der Aufschrei würde aber vorbeigehen. Schlimmer als der Aufschrei damals, als man von %EVENT auf $EVENT umgestellt hat, wird es nicht werden :)

Also trau Dich einfach. Meiner Meinung nach reicht $EVENT völlig aus.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

KölnSolar

ZitatAm liebsten wuerde ich EVTPARTx abschaffen, vmtl. fuehrt es aber zum Aufschrei.
Ich glaub mehr als das. ;D
Ein hint in der commandref ? usage of $EVTPARTx might cause problems, if events with different no. of event parts are selected
Aber ich würd Betateilchen auch zustimmen. Lieber die Nutzung des perl-splits in der commandref erklären.

Zitatdie nicht so komplizierte notify bauen wollen wie Du.
Eigentlich ist das nicht kompliziert. Leider liefert das device das so. ::)
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

rudolfkoenig

ZitatIn meinem Code  $EVENT in ein Array gesplittet hätte funktioniert.
Die aktuelle Loesung hat den netten Effekt, dass $EVTPARTx im Shell- und in "direkten" FHEM-Befehlen funktioniert.
Weiss nicht, wie man das mit einem Array nachbaut. Arrays sind was fuer Fortgeschrittene: wer sowas referenzieren kann, der kann auch selbst welche herstellen.

KölnSolar

ZitatDie aktuelle Loesung hat den netten Effekt, dass $EVTPARTx im
ZitatShell- und in "direkten" FHEM-Befehlen
funktioniert.
Oha, ja, stimmt.
ZitatWeiss nicht, wie man das mit einem Array nachbaut.
Du meinst für
ZitatShell- und in "direkten" FHEM-Befehlen

Für die die in diesen Thread  stolpern: Mein Bsp. geht ohne $EVTPARTx sodefmod act_on_tint notify Tint_remote:action.*|Tint_remote:color_temp.* {my @EVTPAR = split(/ /,$EVENT);; if ($EVTPAR[0] eq "action_color_temperature:"){fhem("set Stehlampe color_temp $EVTPAR[1]")}\
                                                              elsif ($EVTPAR[1] eq "scene"){fhem("set Stehlampe scene $EVTPAR[2]")}\
}
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt