Global symbol "$EVTPART1" requires explicit package name

Begonnen von roedert, 08 November 2017, 23:19:59

Vorheriges Thema - Nächstes Thema

roedert

Was der Fehler bedeutet ist klar, aber irgendwie muss man doch ein notify bauen können was einen Parameter haben kann, aber nicht muss.

In meinem Fall ein Dummy xyz mit Attribut SetList SETALMON SETALMOFF SETALMTIME GETALMTIME

Und dazu ein Notify
xyz.* {
  if ($EVTPART0 eq 'SETALMON' || $EVTPART0 eq 'SETALMOFF')
    {system('curl http://xxxx/'.$EVTPART0)}
  elsif ($EVTPART0 eq 'SETALMTIME')
    {system('curl http://xxx/SETALMTIME?time='.$EVTPART1)}
}


Doch nun funktioniert das notify beim set-Aufruf mit SETALMON nicht mehr (wegen dem nicht vorhandenen $EVTPART1), obwohl in diesem if-Zweig $EVTPART1 dies ja gar nicht benötigt wird.

Wie kann man das umgehen?

dev0

ZitatWie kann man das umgehen?
$EVENT benutzen und selbst splitten oder mehrere notify benutzen und die regex entsprechend setzen, dass die erwarteten $EVTPARTx auch vorhanden sind.

kadettilac89

Zitat von: roedert am 08 November 2017, 23:19:59
In meinem Fall ein Dummy xyz mit Attribut SetList SETALMON SETALMOFF SETALMTIME GETALMTIME


Doch nun funktioniert das notify beim set-Aufruf mit SETALMON nicht mehr (wegen dem nicht vorhandenen $EVTPART1), obwohl in diesem if-Zweig $EVTPART1 dies ja gar nicht benötigt wird.

Wie sieht das Event aus (Eventmonitor)? Gibt es überhaupt ein EVTPART0 + EVTPART1? Ich könnte mir vorstellen, dass der Wert schon in $EVTPART0 steht und **1 gar nicht gefüllt ist. Du schreibst, dass du das im Dummy machst.

Poste mal ein List deines Dummy und was im Eventmonitor steht wenn du schaltest

marvin78

Wenn EVTPART1 nicht immer gefüllt ist, hin und wieder aber schon (das kann durchaus vorkommen) muss man eben auf Perl-Ebene auf defined prüfen.

roedert

Zitat von: kadettilac89 am 09 November 2017, 09:43:43
Gibt es überhaupt ein EVTPART0 + EVTPART1?

Ja, das passt schon - das was in dem Auswahlfeld steht (die Werte kommen aus attr setList) wird als $EVTPART0 geliefert, was ich evtl. noch dahinter in das Eingabefeld schreibe, kommt an $EVTPART1 an.

roedert

Zitat von: marvin78 am 09 November 2017, 11:06:53
Wenn EVTPART1 nicht immer gefüllt ist, hin und wieder aber schon (das kann durchaus vorkommen) muss man eben auf Perl-Ebene auf defined prüfen.

Das habe ich auch schon versucht, jedoch erfolglos.
Ein
if (defined $EVTPART1) { $tmpvar = $EVTPART1 }
liefert den gleichen Fehler ... scheinbar ist der FHEM-interne Parser da irgendwie mit überfordert.
$EVENT von Hand zu splitten scheint dann wohl der richtige Weg zu sein.

dev0


viegener

Es gibt wohl eine hässliche Methode das in diesem Fall zu verhindern:


no strict "vars";
...
use strict "vars";


Allerdings muss dann auch die Variable "fully qualified" sein also vermutlich hier $main::EVTPART1

Trotzdem muss natürlich dann auf defined geprüft werden, sonst gibt es die nächste Meldung.

Besser wäre es aber wirklich per split(...) den Event selber aufzuteilen

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können