diff --git a/fhem/FHEM/98_DOIF.pm b/fhem/FHEM/98_DOIF.pm index a50680c05..d6751bddc 100644 --- a/fhem/FHEM/98_DOIF.pm +++ b/fhem/FHEM/98_DOIF.pm @@ -1404,8 +1404,13 @@ sub addDOIF_Readings sub setDOIF_Reading { - my ($hash,$DOIF_Reading,$reading,$ReadingType) = @_; + my ($hash,$DOIF_Reading,$reading,$ReadingType,$eventa,$eventas,$dev) = @_; $lastWarningMsg=""; + $hash->{helper}{triggerEvents}=$eventa; + $hash->{helper}{triggerEventsState}=$eventas; + $hash->{helper}{triggerDev}=$dev; + $hash->{helper}{event}=join(",",@{$eventa}) if ($eventa); + my $ret = eval $hash->{$ReadingType}{$DOIF_Reading}; if ($@) { $@ =~ s/^(.*) at \(eval.*\)(.*)$/$1,$2/; @@ -2350,6 +2355,7 @@ sub DOIF_Trigger } + sub DOIF_Notify($$) { @@ -2496,7 +2502,7 @@ DOIF_Notify($$) #readingsBeginUpdate($hash); foreach my $reading (keys %{$hash->{Regex}{"DOIF_Readings"}{$device}}) { my $readingregex=CheckRegexpDoIf($hash,"DOIF_Readings",$dev->{NAME},$reading,$eventas,0); - setDOIF_Reading($hash,$reading,$readingregex,"DOIF_Readings") if (defined($readingregex)); + setDOIF_Reading($hash,$reading,$readingregex,"DOIF_Readings",$eventa, $eventas,$dev->{NAME}) if (defined($readingregex)); } #readingsEndUpdate($hash, 1); } @@ -2504,7 +2510,7 @@ DOIF_Notify($$) if (defined ($hash->{helper}{DOIF_eventas})) { #$SELF events foreach my $reading (keys %{$hash->{Regex}{"DOIF_Readings"}{$hash->{NAME}}}) { my $readingregex=CheckRegexpDoIf($hash,"DOIF_Readings",$hash->{NAME},$reading,$hash->{helper}{DOIF_eventas},0); - setDOIF_Reading($hash,$reading,$readingregex,"DOIF_Readings") if (defined($readingregex)); + setDOIF_Reading($hash,$reading,$readingregex,"DOIF_Readings",$eventa, $eventas,$dev->{NAME}) if (defined($readingregex)); } } } @@ -2534,7 +2540,7 @@ DOIF_Notify($$) #readingsBeginUpdate($hash); foreach my $reading (keys %{$hash->{Regex}{"event_Readings"}{$device}}) { my $readingregex=CheckRegexpDoIf($hash,"event_Readings",$dev->{NAME},$reading,$eventas,0); - setDOIF_Reading($hash,$reading,$readingregex,"event_Readings") if (defined($readingregex)); + setDOIF_Reading($hash,$reading,$readingregex,"event_Readings",$eventa, $eventas,$dev->{NAME}) if (defined($readingregex)); } #readingsEndUpdate($hash,1); } @@ -2542,7 +2548,7 @@ DOIF_Notify($$) if (defined ($hash->{helper}{DOIF_eventas})) { #$SELF events foreach my $reading (keys %{$hash->{Regex}{"event_Readings"}{$hash->{NAME}}}) { my $readingregex=CheckRegexpDoIf($hash,"event_Readings",$hash->{NAME},$reading,$hash->{helper}{DOIF_eventas},0); - setDOIF_Reading($hash,$reading,$readingregex,"event_Readings") if (defined($readingregex)); + setDOIF_Reading($hash,$reading,$readingregex,"event_Readings",$eventa, $eventas,$dev->{NAME}) if (defined($readingregex)); } } } @@ -3274,7 +3280,7 @@ DOIF_Attr(@) } else { if ($init_done) { foreach my $reading (keys %{$hash->{$a[2]}}) { - setDOIF_Reading ($hash,$reading,"",$a[2]); + setDOIF_Reading ($hash,$reading,"",$a[2],"","",""); } } } @@ -4871,7 +4877,6 @@ Zwischen 5:00 und 22:00 Uhr läuft die Zirkulationspumpe alle 60 Minuten jeweils define di_presence_simulation DOIF ([19:00-00:00])(set lamp on-for-timer {(int(rand(1800)+300))}) DOELSE (set lamp off)
attr di_presence_simulation repeatcmd rand(3600)+2200


-
  • Zwangspause für das Ausführen eines Kommandos seit der letzten Zustandsänderung   back

    @@ -4941,6 +4946,7 @@ Die Attribute wait und waitdel lassen sich für versch
    attr di_cmd wait 2:0
    attr di_cmd waitdel 0:2

    +
  • Readingauswertung bei jedem Event des Devices   back

    @@ -5420,7 +5426,7 @@ Mit dem Attribut initialize Wird der Status vorbelegt, mit Initiali
    Anwendungsbeispiel: Nach dem Neustart soll der Zustand von di_lamp mit "initialized" vorbelegt werden. Das Reading cmd_nr wird auf 0 gesetzt, damit wird ein Zustandswechsel provoziert, das Modul wird initialisiert - der nächste Trigger führt zum Ausführen eines Kommandos.

    -attr di_lamp intialize initialized
    +attr di_lamp initialize initialized

    Das ist insb. dann sinnvoll, wenn das System ohne Sicherung der Konfiguration (unvorhergesehen) beendet wurde und nach dem Neustart die zuletzt gespeicherten Zustände des Moduls nicht mit den tatsächlichen übereinstimmen.

    @@ -6026,42 +6032,33 @@ Es sind beliebige Hierarchietiefen möglich:

    Bemerkung: Innerhalb eines Ereignisblocks muss mindestens ein Trigger definiert werden, damit der gesamte Block beim passenden Trigger ausgeführt wird.

    - -Inhaltsübersicht (Beispiele im Perlmodus sind besonders gekennzeichnet)
    + +Inhaltsübersicht Perl-Modus

    -Eigene Funktionen
    + +Eigene Funktionen   back

    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.
    @@ -6083,7 +6080,8 @@ subs { ## Definition von Perlfunktionen lamp_on und lamp_off
    {[08:00];lamp_off()} ## Um 08:00 Uhr wird die Funktion lamp_off aufgerufen


    -Eigene Funktionen mit Parametern
    + +Eigene Funktionen mit Parametern   back

    Unter Verwendung von Funktionsparamerter lassen sich Definitionen oft vereinfachen, das obige Beispiel lässt sich mit Hilfe nur einer Funktion kürzer wie folgt definieren:

    @@ -6099,6 +6097,9 @@ subs { ## Definition der Perlfunktion lamp
    {[08:00];lamp("off")} ## Um 08:00 Uhr wird die Funktion lamp mit dem Parameter "off" aufgerufen


    + +Eigener Namensraum   back
    +
    Der Namensraum im Perl-Modus ist gekapselt. Selbstdefinierte Funktionen im DOIF-Device können nicht bereits existierende Perlfunktionen in FHEM (Namensraum main) überschreiben. Funktionen aus dem Namensraum main müssen mit vorangestellem Doppelpunkt angegeben werden: ::<perlfunction>

    @@ -6110,8 +6111,9 @@ Folgende FHEM-Perlfunktionen wurden ebenfalls im DOIF-Namensraum definiert, sie fhem, Log, Log3, InternVal, InternalNum, OldReadingsVal, OldReadingsNum, OldReadingsTimestamp, ReadingsVal, ReadingsNum, ReadingsTimestamp, ReadingsAge, Value, OldValue, OldTimestamp, AttrVal, AttrNum

    -Spezifische Perl-Funktionen im Perl-Modus
    +Spezifische Perl-Funktionen im Perl-Modus   back

    + FHEM set-Befehl ausführen: fhem_set(<content>), mit <content> Übergabeparameter des FHEM set-Befehls

    Beispiel: Lampe ausschalten:
    @@ -6124,34 +6126,40 @@ entspricht:

    Der Aufruf der fhem_set-Funktion ist performater, da das Parsen nach dem set-Befehl im Gegensatz zum Aufruf mit der Funktion fhem entfällt.

    + Ein beliebiges FHEM-Event absetzen: set_Event(<Event>)

    Beispiel: Setze das Event "on":

    set_Event("on");

    + Status setzen: set_State(<value>,<trigger>), mit <trigger>: 0 ohne Trigger, 1 mit Trigger, <trigger> ist optional, default ist 1

    Beispiel: Status des eignen DOIF-Device auf "on" setzen:

    set_State("on");

    + Status des eigenen DOIF-Devices holen: get_State()

    Beispiel: Schalte lampe mit dem eigenen Status:

    fhem_set("lamp ".get_State());

    + Reading des eigenen DOIF-Devices schreiben: set_Reading(<readingName>,<value>,<trigger>), mit <trigger>: 0 ohne Trigger, 1 mit Trigger, <trigger> ist optional, default ist 0

    set_Reading("weather","cold");

    + Reading des eigenen DOIF-Devices holen: get_Reading(<readingName>)

    Beispiel: Schalte Lampe mit dem Inhalt des eigenen Readings "dim":

    fhem_set("lamp ".get_Reading("dim"));

    + Setzen mehrerer Readings des eigenen DOIF-Devices in einem Eventblock:

    set_Reading_Begin()
    @@ -6169,17 +6177,21 @@ Die Readings "temperature" und "humidity" sollen in einem Eventblock mit dem zuv set_Reading_Update("humidity",$hum);
    set_Reading_End(1);

    -Ausführungstimer
    + +Ausführungstimer   back

    Mit Hilfe von Ausführungstimern können Anweisungen verzögert ausgeführt werden. Im Gegensatz zum FHEM-Modus können beliebig viele Timer gleichzeitig genutzt werden. Ein Ausführungstimer wird mit einem Timer-Namen eindeutig definiert. Über den Timer-Namen kann die Restlaufzeit abgefragt werden, ebenfalls kann er vor seinem Ablauf gelöscht werden.

    + Timer setzen: set_Exec(<timerName>, <seconds>, <perlCode>, <parameter>), mit <timerName>: beliebige Angabe, sie spezifiziert eindeutig einen Timer, welcher nach Ablauf den angegebenen Perlcode <perlCode> aufruft. Falls als Perlcode eine Perlfunktion angegeben wird, kann optional ein Übergabeparameter <parameter> angegeben werden. Die Perlfunkion muss eindeutig sein und in FHEM zuvor deklariert worden sein. Wird set_Exec mit dem gleichen <timerName> vor seinem Ablauf erneut aufgerufen, so wird der laufender Timer gelöscht und neugesetzt.

    + Timer holen: get_Exec(<timerName>), Returnwert: 0, wenn Timer abgelaufen oder nicht gesetzt ist, sonst Anzahl der Sekunden bis zum Ablauf des Timers

    + Laufenden Timer löschen: del_Exec(<timerName>)

    Beispiel: Funktion namens "lamp" mit dem Übergabeparameter "on" 30 Sekunden verzögert aufrufen:
    @@ -6198,13 +6210,15 @@ Beispiel: Das Event "off" 30 Sekunden verzögert auslösen:

    set_Exec("off_Event",30,'set_Event("off")');

    -init-Block
    + +init-Block   back

    Wird ein Ereignisblock mit dem Namen init benannt, so wird dieser Block beim Systemstart ausgeführt. Er bietet sich insb. an, um Device-Variablen des Moduls vorzubelegen.

    -Device-Variablen
    + +Device-Variablen   back

    -Device-Variablen sind sogenannte Instanzvariablen, die global innerhalb eines DOIF-Devices genutzt werden können. Deren Inhalt bleibt während der Laufzeit des System erhalten. Sie beginnen mit $_ und müssen nicht deklariert werden. +Device-Variablen sind sogenannte Instanzvariablen, die global innerhalb eines DOIF-Devices genutzt werden können. Deren Inhalt bleibt von Trigger zu Trigger während der Laufzeit des System erhalten. Sie beginnen mit $_ und müssen nicht deklariert werden. Wenn sie nicht vorbelegt werden, gelten sie als nicht definiert. Das lässt sich abfragen mit:

    if (defined $_...) ...
    @@ -6223,7 +6237,8 @@ $_betrag{$i}=100;
    Ebenso funktionieren hash-Variablen z. B.:
    $_betrag{heute}=100;

    -Blokierende Funktionsaufrufe (blocking calls)
    + +Blockierende Funktionsaufrufe (blocking calls)   back

    DOIF verwaltet blockierende Funktionsaufrufe, d.h. die in diesem Zusammenhang gestarteten FHEM-Instanzen werden gelöscht, beim Herunterfahren (shutdown), Wiedereinlesen der Konfiguration (rereadcfg) Änderung der Konfiguration (modify) und Deaktivieren des Gerätes (disabled).

    @@ -6240,7 +6255,7 @@ Wenn <blocking function>, <finish function> und < $_blockingcalls ist eine für DOIF reservierte Variable und darf nur in der beschriebener Weise verwendet werden.

    -Nutzbare Attribute im Perl-Modus
    +Nutzbare Attribute im Perl-Modus   back


    -Weitere Anwendungsbeispiele:
    + +Anwendungsbeispiele im Perlmodus:   back

    Treppenhauslicht mit Bewegungsmelder