if(defined($EVTPART1)) funktioniert nicht

Begonnen von TeeVau, 31 Juli 2013, 15:21:32

Vorheriges Thema - Nächstes Thema

TeeVau

Hallo,

mit dem folgenden notify habe ich ärger, wenn $EVTPART1 nicht gesetzt ist. Durch die Abfrage mit defined wollte ich diesen Fehler eigentlich abfangen, leider klappt das aber nicht.

Das notify ist:

bk_drip_.*:(dripHead.*|update) {
  Log 3, "Debug: Name: $NAME, Event: $EVENT";
  if(defined($EVTPART1)) {
    readingsSingleUpdate($defs{$NAME},"$EVTPART0", "$EVTPART1", 1);
  }
  my $totalAmmount = ReadingsVal($NAME, 'dripHead1', '-1') + ReadingsVal($NAME, 'dripHead2', '-1');
  Log 3, "Debug: totalAmmount: $totalAmmount lh";
  readingsSingleUpdate($defs{$NAME},"totalAmmount", "$totalAmmount", 1);
 
  my $totalAmmountPeriode = ($totalAmmount*1000 / 60) * Value('bk_duration');
  Log 3, "Debug: totalAmmountPeriode: $totalAmmountPeriode ml";
  readingsSingleUpdate($defs{$NAME},"totalAmmountPeriode", "$totalAmmountPeriode", 1);
 
  my $totalAmmountDay = (24 / Value('bk_frequency')) *  $totalAmmountPeriode;
  Log 3, "Debug: totalAmmountDay: $totalAmmountDay ml";
  readingsSingleUpdate($defs{$NAME},"totalAmmountDay", "$totalAmmountDay", 1);
}


Ein Aufruf mit "trigger bk_drip_Kasten1 dripHead1 8" klappt ohne Probleme ($EVTPART0 und $EVTPART1) sind ja vorhanden).
Der Aufruf "trigger bk_drip_Kasten1 update" läuft in einen Fehler mit der Meldung:
Global symbol "$EVTPART1" requires explicit package name at (eval 881) line 1.

Ich dachte, dass ich diesen Fehler abfragen kann, in dem ich mit "if(defined($EVTPART1))" prüfe, ob $EVTPART1 vorhanden ist. Funktioniert aber nicht, die Fehlermeldung bleibt.
Was mache ich falsch?

Per Suche habe ich mal ein Reply von Rudi gefunden (Link). Sieht mir allerdings auch nach einer Eselsbrücke aus und nicht nach 100%ig geprüftem Code. Von daher bin ich etwas unsicher, ob das mit dem defined() überhaupt funktioniert.

Besten Dank im Vorraus, Tobias
FHEM 5.8 dev (virtualisiert) / FBF 7390 (CUL 868MHz V 1.51 / panStick (AVR1))
FS20: fs20di,fs20pira,fs20sm8,fs20st2,fs20tfk,fs20ue1,fs20ws1
panStamp (AVR1): RGB Multi von ext23, 1W-DSxxxx, I/O Sketch, Spritzpumpe
Multimedia: Panasonic TV (VIERA), Kodi, Yamaha RX-V781, LMS
Sonstiges: XiaomiFlowerSen

rudolfkoenig

Die Abfrage funktioniert nicht, weil defined in perl eine definierte Variable benoetigt, und es "nur" dessen Wert ueberprueft.

Im verlinkten Artikel analysiert jsb73 das Problem sehr genau, und eine andere Loesung habe ich dafuer immer noch nicht.

Nicht wirklich eine Anfaengerfrage.

betateilchen

In Perl gibts dafür "exists", ob man das auch für einzelne Variablen nutzbar machen kann, weiß ich aber nicht - ich habe es noch nie probiert.

http://perldoc.perl.org/functions/exists.html
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TeeVau

Hallo

danke für die Hinweise. exists() funktioniert nicht. Ich bin davon ausgegangen, dass defined prüft ob eine Variable vorhanden ist oder nicht. Habe jetzt $EVENT selber gesplittet:


bk_drip_.*:(dripHead.*|update) {
  my @EVTPART = split(" ", $EVENT);
  Log 3, "Debug: Name: $NAME, Event: $EVENT";  
 
  readingsSingleUpdate($defs{$NAME},"$EVTPART[0]", "$EVTPART[1]", 1) if (@EVTPART == 2);
 
  my $totalAmmount = ReadingsVal($NAME, 'dripHead1', '-1') + ReadingsVal($NAME, 'dripHead2', '-1');
  Log 3, "Debug: totalAmmount: $totalAmmount lh";
  readingsSingleUpdate($defs{$NAME},"totalAmmount", "$totalAmmount", 1);
 
  my $totalAmmountPeriode = ceil(($totalAmmount*1000 / 60) * Value('bk_duration'));
  Log 3, "Debug: totalAmmountPeriode: $totalAmmountPeriode ml";
  readingsSingleUpdate($defs{$NAME},"totalAmmountPeriode", "$totalAmmountPeriode", 1);
 
  my $totalAmmountDay = ceil((24 / Value('bk_frequency')) *  $totalAmmountPeriode);
  Log 3, "Debug: totalAmmountDay: $totalAmmountDay ml";
  readingsSingleUpdate($defs{$NAME},"totalAmmountDay", "$totalAmmountDay", 1);
}
FHEM 5.8 dev (virtualisiert) / FBF 7390 (CUL 868MHz V 1.51 / panStick (AVR1))
FS20: fs20di,fs20pira,fs20sm8,fs20st2,fs20tfk,fs20ue1,fs20ws1
panStamp (AVR1): RGB Multi von ext23, 1W-DSxxxx, I/O Sketch, Spritzpumpe
Multimedia: Panasonic TV (VIERA), Kodi, Yamaha RX-V781, LMS
Sonstiges: XiaomiFlowerSen