Müssen alle EVTPART Variablen immer existieren?

Begonnen von haus:automation, 17 Juli 2016, 14:27:49

Vorheriges Thema - Nächstes Thema

haus:automation

Ich habe folgendes Notify:


WhatsAppMatthias:message.* {
    if ($EVTPART1 eq 'Licht') {
        if ($EVTPART2 eq 'an') {
            fhem("set WZ_Dekolicht on");
            fhem("set WZ_Fensterlicht on");
            fhem("set WZ_Fernsehlicht on");
        }
        if ($EVTPART2 eq 'aus') {
            fhem("set WZ_Dekolicht off");
            fhem("set WZ_Fensterlicht off");
            fhem("set WZ_Fernsehlicht off");
        }
    }
    if ($EVTPART1 eq 'Zocken') {
        fhem("set WZ_Fernsehlicht on");
        fhem("set WZ_Receiver on");
        fhem("set WZ_TV power on");
        fhem("sleep 5 quiet");
        fhem("set WZ_TV input hdmi1");
        fhem("set WZ_Receiver input GAME");
    }
    if ($EVTPART1 eq 'Nacht') {
        fhem("set WZ_Dekolicht off");
        fhem("set WZ_Fensterlicht off");
        fhem("set WZ_Fernsehlicht off");
        fhem("set WZ_Receiver off");
        fhem("set WZ_TV power off");
        fhem("set $NAME send Profil Nacht aktiviert");
    }
    if ($EVTPART1 eq 'Status') {
        my $temperature = ReadingsVal("WZ_Balkontuer", "temperature", "");
        fhem("set $NAME send Temperatur: $temperature");
    }
}


Licht an und Licht aus klappt auch wunderbar, wenn ich allerdings nur "Status" schreibe, bekomme ich im Log:

Zitat2016.07.17 14:20:45 3: n_WhatsAppNachricht return value: Global symbol "$EVTPART2" requires explicit package name at (eval 191) line 3.
Global symbol "$EVTPART2" requires explicit package name at (eval 191) line 8.

Warum ist das so? Wenn ich "Status yxz" schreibe klappt alles. Es wird also erwartet, dass selbst im Code, welcher nicht durchlaufen wird, die Variable $EVTPART2 deklariert wurde.

Hier wurde das Problem auch schon einmal behandelt: https://forum.fhem.de/index.php?topic=11897.0
Aber in meinem Code, wird die Variable ja nicht einmal abgefragt, wenn ich z.B. "Status" übermittle. Ist das in Perl immer so?!
Ex-FHEM-Nutzer. Inaktiv.

dev0

Wenn nicht klar ist, ob eine Variable definiert ist oder nicht, dann kannst Du das mit {if(defined $EVTPARTx &&  $EVTPARTx eq 'foobar') {...}} abfangen. Dann gibt es keinen Hinweis dazu.

frank

Zitat von: haus-automatisierung.com am 20 Juli 2016, 10:31:03
Okay vielen Dank! Aber ist es normal, dass in Perl auch gemeckert wird, wenn der betreffende Code gar nicht durchlaufen wird?
die prüfung der bedingung wird doch sehr wohl "durchlaufen".
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

justme1968

ja und nein...

bevor der code ausgeführt wird gibt es erst noch einen syntax check. die meldung um die es hier geht kommt beim diesem syntax check. bevor der code durchlaufen wird. die meldung beim durchlaufen wäre eine andere.

das zusätzliche defined(...) stellt auch den syntax check zufrieden.

tatsächlich kann man das ganze ohne fhem mit einem perl dreizeiler nachstellen. seltsamer weise aber nur unter bestimmten randbedingungen. d.h. es ist zwar die syntax prüfung, warum diese hier zuschlägt und an anderen stellen nicht ist mir auch noch nicht ganz klar.


gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

dev0

Zitat von: haus-automatisierung.com am 21 Juli 2016, 10:06:56
Oder könnte es sein, dass es mit folgendem Attribut zu tun hat?
attr global perlSyntaxCheck 1
Nein.