FHEM Forum

FHEM => Automatisierung => Thema gestartet von: Groby am 25 März 2013, 17:59:07

Titel: notify Aenderungen
Beitrag von: Groby am 25 März 2013, 17:59:07
Hallo,

das neue notify Modul erzeugt folgenden Fehler:

Global symbol "$EVTPART1" requires explicit package name at (eval 114) line 1.
Global symbol "$EVTPART2" requires explicit package name at (eval 114) line 1.


define Mynotify notify * {Log 1, Mynotify: $NAME, $TYPE, $EVENT, $EVTPART0, $EVTPART1, $EVTPART2"}


Gleicher code mit % liefert:
Mynotify: FS20_ST1, FS20, on-for-timer 10, on-for-timer, 10, %EVTPART2

Gruss, Groby
Titel: Aw: notify Aenderungen
Beitrag von: rudolfkoenig am 26 März 2013, 09:30:13
1. das * in der notify Zeile ist falsch, vmtl. hast Du .* gemeint. Das " vor Mynotfy fehlt auch. Ist den restlichen Meldungen noch zu trauen?
2. Die Fehlermeldung mit $EVTPART1 sollte nicht fuer "on-for-timer 10" kommen, nur die mit $EVTPART2. Kannst Du das bitte pruefen?
3. Sonst sind die Fehlermeldungen mir bekannt/bewusst und ich finde sie in Ordung, es gibt auch kein $EVTPART2.
Titel: Aw: notify Aenderungen
Beitrag von: Groby am 26 März 2013, 19:31:29
Hallo Rudi,

zu 3) Sorry. $EVTPART2 habe ich logischer Weise weggelassen. Da kam ich wegen $EVTPART1/usw in der Ankündigung drauf...

zu 2) Stimmt. on-for-timer x funktioniert ohne $EVTPART2 ;)

zu 1) "*" war richtig. Ich habe einfach mal 4 Versionen  von notify angelegt:

define notify_test1 notify .* {Log 1, "notify_test1: $NAME, $TYPE, $EVENT, $EVTPART0, $EVTPART1"}
define notify_test2 notify .* {Log 1, "notify_test2: %NAME, %TYPE, %EVENT, %EVTPART0, %EVTPART1"}
define notify_test3 notify * {Log 1, "notify_test3: $NAME, $TYPE, $EVENT, $EVTPART0, $EVTPART1"}
define notify_test4 notify * {Log 1, "notify_test4: %NAME, %TYPE, %EVENT, %EVTPART0, %EVTPART1"}


cmd line: set z_FS20_ST1 on; set z_FS20_ST1 on-for-timer 10

Log files:
2013.03.26 19:06:46 3: FS20 set z_FS20_ST1 on
2013.03.26 19:06:46 3: notify_test1 return value: Global symbol "$EVTPART1" requires explicit package name at (eval 737) line 1.
2013.03.26 19:06:46 1: notify_test2: z_FS20_ST1, FS20, on, on, %EVTPART1
2013.03.26 19:06:46 3: notify_test3 return value: Global symbol "$EVTPART1" requires explicit package name at (eval 739) line 1.
2013.03.26 19:06:46 1: notify_test4: z_FS20_ST1, FS20, on, on, %EVTPART1
2013.03.26 19:06:46 3: FS20 set z_FS20_ST1 on-for-timer 10
2013.03.26 19:06:46 1: notify_test1: global, Global, DEFINED z_FS20_ST1_timer, DEFINED, z_FS20_ST1_timer
2013.03.26 19:06:46 1: notify_test2: global, Global, DEFINED z_FS20_ST1_timer, DEFINED, z_FS20_ST1_timer
2013.03.26 19:06:46 1: notify_test3: global, Global, DEFINED z_FS20_ST1_timer, DEFINED, z_FS20_ST1_timer
2013.03.26 19:06:46 1: notify_test4: global, Global, DEFINED z_FS20_ST1_timer, DEFINED, z_FS20_ST1_timer
2013.03.26 19:06:46 1: notify_test1: z_FS20_ST1, FS20, on-for-timer 10, on-for-timer, 10
2013.03.26 19:06:46 1: notify_test2: z_FS20_ST1, FS20, on-for-timer 10, on-for-timer, 10
2013.03.26 19:06:47 1: notify_test3: z_FS20_ST1, FS20, on-for-timer 10, on-for-timer, 10
2013.03.26 19:06:47 1: notify_test4: z_FS20_ST1, FS20, on-for-timer 10, on-for-timer, 10

MfG Groby
Titel: Aw: notify Aenderungen
Beitrag von: LaLeLu am 01 April 2013, 07:29:57
Hi Rudi,

ich habe meinen Code auf die neue Syntax umstellen wollen und bin genau an der von Groby beschriebenen Stelle
Zitat2013.03.26 19:06:46 1: notify_test2: z_FS20_ST1, FS20, on, on, %EVTPART1
2013.03.26 19:06:46 3: notify_test3 return value: Global symbol "$EVTPART1" requires explicit package name at (eval 739) line 1.
hängen geblieben. Bislang habe ich das nicht Vorhandensein von %EVTPART1 so abgefragt:
if( "%EVTPART1" =~ /EVTPART1/i ) {\
{Log 4, ("  n_Aufruf_von_f_FHEMK_Termine:  PART1: %EVTPART1 ist keine UID => keine weitere Aktion")}\
  }\

Wie kann ich dies mit der neuen Syntax machen?
if( "$EVTPART1" =~ /EVTPART1/i ) {\
{Log 4, ("  n_Aufruf_von_f_FHEMK_Termine:  PART1: %EVTPART1 ist keine UID => keine weitere Aktion")}\
  }\
führt zum oben beschriebenem Fehler.

Danke für die Mühe! Deine Neuerung benötige ich nämlich dringend, da ich den an anderer Stelle beschriebenen Split-Befehl für mehrere Kalender-Termine an derselben Uhrzeit dringend ermöglichen möchte.
Titel: Aw: notify Aenderungen
Beitrag von: rudolfkoenig am 01 April 2013, 11:38:54
Ich sehe hier nur die Symptome, aber nicht die Ursache, deswegen rate ich mal: das Regexp der Notify trifft auf Nachrichten zu, die manchmal keinen zweiten Argument haben.

Ich sehe 3 Moeglichkeiten:
- $EVENT selbst zu splitten ($EVTPARTx ist eh was fuer Anfaenger :)
- das regexp so modifizieren, dass dieser Parameter immer vorhanden ist, d.h. evtl. mehrere notifys
- no strict 'vars' vor dem ersten Aufruf von $EVTPART1 einbauen.
Titel: Aw: notify Aenderungen
Beitrag von: Groby am 01 April 2013, 18:13:23
Da muss ich leider widersprechen...

Natürlich kann man $event selber splitten. Wenn das Hauptmodul $evtpartx zur Verfügung stellt, wäre es doppelt gemoppelt wenn man jedes mal den String nochmals selber aufteilt nur um die Fehlermeldungen zu umgehen.

Wenn $evtpartx für "Anfänger" sein soll, macht es wesentlich mehr Sinn den eigentlichen Wert oder "" zu übergeben damit auch "Anfänger" damit klarkommen und unnötige Log-Einträge / Fehlermeldungen ausbleiben.

Sonst wäre es wesentlich sinnvoller die $evtpartx-Funktion komplett einzustellen, damit jeder mit $event arbeitet...
Titel: Aw: notify Aenderungen
Beitrag von: jsb73 am 02 April 2013, 00:42:16
Hallo,

ich habe folgenden Dummy getestet:

define sw_Dummy FS20 0101 3333
attr sw_Dummy model fs20su
attr sw_Dummy room Flur

define notify_test notify sw_Dummy {Log 1, "notify_test: $NAME, $TYPE, $EVENT, $EVTPART0, $EVTPART1"}


Ein "set sw_Dummy on" wird mit Fehler abgebrochen, ein "set sw_Dummy on-for-timer 30" geht.

In diesem Fall wird aus 91_notify.pm die Funktion
AnalyzeCommandChain(undef,{Log 1, "notify_test: $NAME, $TYPE, $EVENT, $EVTPART0, $EVTPART1"})
aufgerufen.
Von dort wird AnalyzeCommand() => AnalyzePerlCommand() aufgerufen. Hier steht:

  if($evalSpecials) {
    $cmd = join("", map { my $n = substr($_,1);
                          my $v = $evalSpecials->{$_};
                          $v =~ s/(['\\])/\\$1/g;
                          "my \$$n='$v';";
                        } keys %{$evalSpecials})
           . $cmd;


%evalSpecials hat die Keys: %EVTPART0, %TYPE, %EVENT, %NAME, weshalb in $cmd dies hier steht:

my $EVTPART0='off';my $TYPE='FS20';my $EVENT='off';my $NAME='sw_Dummy';{Log 1, "notify_test: $NAME, $TYPE, $EVENT, $EVTPART0, $EVTPART1"}

Evtl. ist es wirklich sinnvoll, $EVTPART0 ... $EVTPART2 in EvalSpecials() leer zu initialisieren, um Fehler bzw. Abbrüche zu verhindern. Alternativ sollte in der Doku darauf hingewiesen werden, dass die Variablen uninitialisiert sein können. Gerade Anfänger tun sich sonst unnötig schwer.

just my 2c
Jan
Titel: Aw: notify Aenderungen
Beitrag von: rudolfkoenig am 02 April 2013, 10:23:41
Die Fehlermeldung existiert nur, wenn das notify mit einem unerwarteten Event aufgerufen wird.

Statt lange "Einzeiler" mit { if(defined($EVTPART1)) {...} } zu bauen sollte man mehrere notifys mit passenden regexp bauen, oder wenn das nicht geht, alles in eine Funktion auslagern, die man mit $EVENT aufruft, und wo man mit @EVTPART = split(" ", $EVENT) selbst die Stuecke bekommt.

Vielleicht sehe ich aber das Problem nicht, und ich kann mit einem konkreten Beispiel belehrt werden.