From 767de2e1bada2c9960d4f9b2128a41ecbf6d8c69 Mon Sep 17 00:00:00 2001 From: Damian <> Date: Wed, 19 Sep 2018 19:15:59 +0000 Subject: [PATCH] 98_DOIF.pm: fixed set checkall: Can't use an undefined value as an ARRAY reference at, fixed set_Exec with parameter, commandref perl mode git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@17373 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- FHEM/98_DOIF.pm | 53 +++++++++++++++++++++++++------------------------ 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/FHEM/98_DOIF.pm b/FHEM/98_DOIF.pm index 5b3aa0ecc..d3b93302d 100644 --- a/FHEM/98_DOIF.pm +++ b/FHEM/98_DOIF.pm @@ -2078,7 +2078,7 @@ sub CheckRegexpDoIf } return $i; } - my $max = int(@{$eventa}); + my $max=defined $eventa ? int(@{$eventa}):0; my $s; my $found; for (my $j = 0; $j < $max; $j++) { @@ -2872,7 +2872,7 @@ sub DOIF_ExecTimer if (!defined ($param)) { eval ($subname); } else { - eval ('$subname("$param")'); + eval ("$subname(\"$param\")"); } if ($@) { Log3 ($defs{$name}{NAME},1 , "$name error in $subname: $@"); @@ -5548,10 +5548,10 @@ Die Abläufe lassen sich, wie in höheren Programmiersprachen üblich, strukturi
Syntax Perl-Modus:

-
    define <name> DOIF <Blockname> {<Perlcode mit Ereignis-/Zeittriggern in eckigen Klammern>}
+
    define <name> DOIF <Blockname> {<Ereignisblock: Perlcode mit Ereignis-/Zeittriggern in eckigen Klammern>}

-Ein Perlblock wird ausgeführt, wenn dieser bedingt durch Ereignis- und Zeittrigger in eckigen Klammern innerhalb des Blocks, getriggert wird. -Es wird die vollständige Perl-Syntax unterstützt. Es können beliebig viele Perlblöcke innerhalb eines DOIF-Devices definiert werden. Sie werden unabhängig voneinander durch passende Trigger ausgeführt. Der Name eines Blocks ist optional.
+Ein Ereignisblock wird ausgeführt, wenn dieser bedingt durch Ereignis- und Zeittrigger in eckigen Klammern innerhalb des Blocks, getriggert wird. +Es wird die vollständige Perl-Syntax unterstützt. Es können beliebig viele Ereignisblöcke innerhalb eines DOIF-Devices definiert werden. Sie werden unabhängig voneinander durch passende Trigger ausgeführt. Der Name eines Ereignisblocks ist optional.

Der Status des Moduls wird nicht vom Modul gesetzt, er kann vom Anwender mit Hilfe der Funktion set_Reading verändert werden, siehe spezifische Perl-Funktionen im Perl-Modus. FHEM-Befehle werden durch den Aufruf der Perlfunktion fhem"..." ausgeführt.
@@ -5560,22 +5560,34 @@ Der Benutzer kann mit der Funktion set_Timer/set_Exec beliebig viel
Definitionen im FHEM-Modus der Form:

-DOIF (<Bedingung mit Trigger>) (<FHEM-Befehle>) DOELSE (<FHEM-Befehle>)
+  DOIF (<Bedingung mit Trigger>) (<FHEM-Befehle>) DOELSE (<FHEM-Befehle>)

lassen sich wie folgt in Perl-Modus übertragen:

-DOIF {if (<Bedingung mit Trigger>) {fhem"<FHEM-Befehle>"} else {fhem"<FHEM-Befehle>"}}
+  DOIF {if (<Bedingung mit Trigger>) {fhem"<FHEM-Befehle>"} else {fhem"<FHEM-Befehle>"}}

Die Bedingungen des FHEM-Modus können ohne Änderungen in Perl-Modus übernommen werden.

-Im Perl-Modus können beliebig viele Blöcke definiert werden, die unabhängig von einander durch einen Trigger ausgewertet und zur Ausführung führen können:
+ +Einfache Anwendungsbeispiele (vgl. Anwendungsbeispiele im FHEM-Modus):
    +
    +define di_rc_tv DOIF {if ([remotecontol:"on"]) {fhem"set tv on"} else {fhem"set tv off"}}
    +
    +define di_clock_radio DOIF {if ([06:30|Mo Di Mi] or [08:30|Do Fr Sa So]) {fhem"set radio on"}} {if ([08:00|Mo Di Mi] or [09:30|Do Fr Sa So]) {fhem"set radio off"}}
    +
    +define di_lamp DOIF {if ([06:00-09:00] and [sensor:brightness] < 40) {fhem"set lamp:FILTER=STATE!=on on"} else {fhem"set lamp:FILTER=STATE!=off off"}}
    +
    +
+Bemerkung: Im Gegensatz zum FHEM-Modus arbeitet der Perl-Modus ohne Zustandsauswertung, daher muss der Anwender selbst darauf achten, wiederholende Ausführungen zu vermeiden (im oberen Beispiel z.B. mit FILTER-Option)
+
+Es können beliebig viele Ereignisblöcke definiert werden, die unabhängig von einander durch einen Trigger ausgewertet und zur Ausführung führen können:

DOIF
{ if (<Bedingung mit Trigger>) ... }
{ if (<Bedingung mit Trigger>) ... }
...


-Im Perlmodus sind beliebige Hierarchietiefen möglich:
+Es sind beliebige Hierarchietiefen möglich:

DOIF
{ if (<Bedingung>) {
@@ -5587,11 +5599,11 @@ Im Perlmodus sind beliebige Hierarchietiefen möglich:
  }
}


-Bemerkung: Innerhalb eines DOIF-Blocks muss mindestens ein Trigger in irgendeiner Bedingung definiert werden, damit der gesamte Block beim passenden Trigger ausgewertet wird.
+Bemerkung: Innerhalb eines Ereignisblocks muss mindestens ein Trigger in irgendeiner Bedingung definiert werden, damit der gesamte Block beim passenden Trigger ausgewertet wird.

Eigene Funktionen

-Ein besonderer Perlblock ist der Block namens "subs". In diesem Block werden Perlfunktionen definiert, die innerhalb des DOIFs genutzt werden. +Ein besonderer Block ist der Block namens "subs". In diesem Block werden Perlfunktionen definiert, die innerhalb des DOIFs genutzt werden. Um eine möglichst hohe Kompatibilität zu Perl sicherzustellen, wird keine DOIF-Syntax in eckigen Klammern unterstützt, insb. gibt es keine Trigger, die den Block ausführen können.

Beispiel:
@@ -5607,20 +5619,9 @@ subs { ## Definition von Perlfunktionen lamp_on und lamp_off
     set_Reading("state","off",1);
  }
}
-{if ([06:00]) {lamp_on()  # Um 06:00 Uhr wird die Funktion lamp_on aufgerufen }
-{if ([08:00]) {lamp_off() # Um 08:00 Uhr wird die Funktion lamp_off aufgerufen }
+{if ([06:00]) {lamp_on()}}  ## Um 06:00 Uhr wird die Funktion lamp_on aufgerufen
+{if ([08:00]) {lamp_off()}} ## Um 08:00 Uhr wird die Funktion lamp_off aufgerufen

- -Einfache Anwendungsbeispiele (vgl. Anwendungsbeispiele im FHEM-Modus):
    -
    -define di_rc_tv DOIF {if ([remotecontol:"on"]) {fhem"set tv on"} else {fhem"set tv off"}}
    -
    -define di_clock_radio DOIF {if ([06:30|Mo Di Mi] or [08:30|Do Fr Sa So]) {fhem"set radio on"}} {if ([08:00|Mo Di Mi] or [09:30|Do Fr Sa So]) {fhem"set radio off"}}
    -
    -define di_lamp DOIF {if ([06:00-09:00] and [sensor:brightness] < 40) {fhem"set lamp:FILTER=STATE!=on on"} else {fhem"set lamp:FILTER=STATE!=off off"}}
    -
    -
-Bemerkung: Im Gegensatz zum FHEM-Modus arbeitet der Perl-Modus ohne Zustandsauswertung, daher muss der Anwender selbst darauf achten, wiederholende Ausführungen zu vermeiden (im oberen Beispiel z.B. mit FILTER-Option)

Spezifische Perl-Funktionen im Perl-Modus
@@ -5637,7 +5638,7 @@ Laufenden Timer löschen: del_Timer(<TimerEvent>)

Beispiel: Das Event "hello" 30 Sekunden verzögert auslösen:

-set_Time("event",30,"hello");
+set_Time("hell",30);

Ausführungstimer

@@ -5659,7 +5660,7 @@ Reading schreiben: set_Reading(<readingName>,<content>,<
init-Block

-Wird ein Perlblock mit dem Namen "init" benannt, so wird er ausgeführt, nachdem das FHEM-System hochgefahren wurde. Er bietet sich insb. an, um Instanzvariablen des Moduls vorzubelegen.
+Wird ein Perlblock mit dem Namen "init" benannt, so wird dieser Block beim Systemstart ausgeführt. Er bietet sich insb. an, um Instanzvariablen des Moduls vorzubelegen.

Instanzvariablen