diff --git a/fhem/FHEM/98_DOIF.pm b/fhem/FHEM/98_DOIF.pm
index d1656b054..a7b8490c9 100644
--- a/fhem/FHEM/98_DOIF.pm
+++ b/fhem/FHEM/98_DOIF.pm
@@ -56,7 +56,7 @@ sub DOIF_delAll($)
delete ($hash->{helper});
delete ($hash->{condition});
delete ($hash->{do});
- delete ($hash->{devices});
+ #delete ($hash->{devices});
delete ($hash->{time});
delete ($hash->{timer});
delete ($hash->{timers});
@@ -179,9 +179,10 @@ sub DOIF_UpdateCell
my $reg="";
my $VALUE="";
if ($doifId =~ /.*_(.*)_c_(.*)_(.*)_(.*)_(.*)$/) {
- eval ($hash->{$1}{table}{$2}{$3}{$4}{$5});
+ my $command=$hash->{$1}{table}{$2}{$3}{$4}{$5};
+ eval ($command);
if ($@) {
- my $err="$pn: eval: $hash->{$1}{table}{$2}{$3}{$4}{$5} error: $@" ;
+ my $err="$pn: eval: $command error: $@" ;
Log3 $pn,3,$err;
}
}
@@ -189,26 +190,24 @@ sub DOIF_UpdateCell
sub DOIF_Widget
{
- my ($hash,$reg,$doifId,$value,$style,$widget,$dev,$reading,$command)=@_;
+ my ($hash,$reg,$doifId,$value,$style,$widget,$command,$dev,$reading)=@_;
if ($reg) {
return DOIF_Widget_Register($doifId,$value,$style,$widget,$dev,$reading,$command);
} else {
- DOIF_Widget_Update($hash->{NAME},$doifId,$value,$style,$widget,$dev,$reading,$command);
+ DOIF_Widget_Update($hash->{NAME},$doifId,$value,$style,$widget,$command,$dev,$reading);
}
}
sub DOIF_Widget_Update
{
- my ($pn,$doifId,$value,$style,$widget,$dev,$reading,$command)=@_;
- if (defined $widget) {
- if (1) {
+ my ($pn,$doifId,$value,$style,$widget,$command,$dev,$reading)=@_;
+ if (defined $widget and $widget ne "") {
map {
- FW_directNotify("#FHEMWEB:$_", "doifUpdateCell('$pn','informid','$dev-$reading','$value')","")
+ FW_directNotify("#FHEMWEB:$_", "doifUpdateCell('$pn','informid','$dev-$reading','$value')","");
} devspec2array("TYPE=FHEMWEB");
- }
} else {
map {
- FW_directNotify("#FHEMWEB:$_", "doifUpdateCell('$pn','doifId','$doifId','$value','display:inline;$style')","")
+ FW_directNotify("#FHEMWEB:$_", "doifUpdateCell('$pn','doifId','$doifId','$value','display:inline;$style')","");
} devspec2array("TYPE=FHEMWEB") if ($value ne "");
}
}
@@ -218,8 +217,8 @@ sub DOIF_Widget_Register
my ($doifId,$value,$style,$widget,$dev,$reading,$command)=@_;
my $type;
my $cmd='';
- if (defined $widget) {
- if (defined $command) {
+ if (defined $widget and $widget ne "") {
+ if (defined $command and $command ne "") {
if ($command =~ /^([^ ]*) *(.*)/) {
$type = !defined $1 ? '': $1;
$cmd = !defined $2 ? '': $2;
@@ -278,13 +277,25 @@ sub DOIF_RegisterCell
$err="'error $err: in expression: $expr'";
return $err;
} else {
- eval $expr;
+ my ($exp,$sty,$wid,$com)=eval ($hash->{$table}{package}.$expr);
if ($@) {
return "'error $@ in expression: $expr'";
}
+ if (defined $sty and $sty eq "") {
+ if (defined $wid and $wid ne "") {
+ if ($event) {
+ $dev=$hash->{$table}{dev} if (defined $hash->{$table}{dev});
+ $reading=$hash->{$table}{reading} if (defined $hash->{$table}{reading});
+ } else {
+ return "'no trigger reading in widget: $expr'";
+ }
+ $reading="state" if ($reading eq '&STATE');
+ return "$hash->{$table}{package}::DOIF_Widget(".'$hash,$reg,'."'$doifId',$expr,".(defined $com ? "":"'',")."'$dev','$reading')";
+ }
+ }
}
$trigger=$event;
- if (defined($widget)) {
+ if (defined $widget and $widget ne "") {
if ($event) {
$dev=$hash->{$table}{dev} if (defined $hash->{$table}{dev});
$reading=$hash->{$table}{reading} if (defined $hash->{$table}{reading});
@@ -297,7 +308,7 @@ sub DOIF_RegisterCell
$err="'error $err: in widget: $widget'";
return $err;
} else {
- eval $widget;
+ eval ($widget);
if ($@) {
return "'error $@ in widget: $widget'";
}
@@ -305,7 +316,7 @@ sub DOIF_RegisterCell
} else {
$widget="";
}
- if (defined $style) {
+ if ($style) {
($style,$err,$event)=ReplaceAllReadingsDoIf($hash,$style,($table eq "uiTable" ? -5:-6),0,$doifId);
$trigger=$event if ($event);
if ($err) {
@@ -323,9 +334,9 @@ sub DOIF_RegisterCell
if ($widsty==2) {
$reading="state" if ($reading eq '&STATE');
- return "DOIF_Widget(".'$hash,$reg,'."'$doifId',$expr,$style,$widget,'$dev','$reading'".(defined $command ? ",$command)":")");
+ return "$hash->{$table}{package}::DOIF_Widget(".'$hash,$reg,'."'$doifId',$expr,$style,$widget,".(defined $command ? "$command":"''").",'$dev','$reading')";
} elsif (($widsty==1) or $trigger) {
- return "DOIF_Widget(".'$hash,$reg,'."'$doifId',$expr,$style)";
+ return "$hash->{$table}{package}::DOIF_Widget(".'$hash,$reg,'."'$doifId',$expr,$style)";
} else {
return $expr;
}
@@ -362,18 +373,21 @@ sub parse_tpl
$wcmd =~ s/\$VAR/\$hash->{var}/g;
$wcmd =~ s/\$SELF/$d/g;
- $wcmd =~ s/FUNC_/DOIF_FUNC_$d\_/g;
- $wcmd =~ s/PUP[ \t]*\(/DOIF_tablePopUp(\"$d\",/g;
+ $wcmd =~ s/FUNC_/::DOIF_FUNC_$d\_/g;
+ $wcmd =~ s/PUP[ \t]*\(/::DOIF_tablePopUp(\"$d\",/g;
$wcmd =~ s/\$SHOWNOSTATE/\$hash->{$table}{shownostate}/;
$wcmd =~ s/\$SHOWNODEVICELINK/\$hash->{$table}{shownodevicelink}/;
$wcmd =~ s/\$SHOWNODEVICELINE/\$hash->{$table}{shownodeviceline}/;
-
+ $hash->{$table}{package} = "" if (!defined ($hash->{$table}{package}));
if ($wcmd=~ /^\s*\{/) { # perl block
my ($beginning,$currentBlock,$err,$tailBlock)=GetBlockDoIf($wcmd,'[\{\}]');
if ($err) {
return ("error in $table: $err","");
} elsif ($currentBlock ne "") {
$currentBlock ="no warnings 'redefine';".$currentBlock;
+ if ($currentBlock =~ /\s*package\s*(\w*)/) {
+ $hash->{$table}{package}="package $1;";
+ }
eval ($currentBlock);
if ($@) {
$err="$d: error: $@ in $table: $currentBlock";
@@ -1363,8 +1377,8 @@ sub AddRegexpTriggerDoIf
$dev="" if (!defined($dev));
$reading="" if (!defined($reading));
my $regexpid='"'.$regexp.'"';
-
if ($dev) {
+ $hash->{NOTIFYDEV}.=",$dev" if ($hash->{NOTIFYDEV}!~/,$dev(,|$)/);
if ($reading){
$hash->{Regex}{$type}{$dev}{$element}{$reading}=(($reading =~ "^\&") ? "\^$dev\$":"\^$dev\$:\^$reading: ");
} elsif ($regexp) {
@@ -1372,6 +1386,22 @@ sub AddRegexpTriggerDoIf
}
return;
}
+ my($regdev)=split(/:/,$regexp);
+ if ($regdev eq "") {
+ $regdev=".*";
+ } else {
+ if ($regdev=~/^\^/) {
+ $regdev=~s/^\^//;
+ } else {
+ $regdev=".*".$regdev;
+ }
+ if ($regdev=~/\$$/) {
+ $regdev=~s/\$$//;
+ } else {
+ $regdev.=".*";
+ }
+ }
+ $hash->{NOTIFYDEV}.=",$regdev" if ($hash->{NOTIFYDEV}!~/,$regdev(,|$)/);
$hash->{Regex}{$type}{$dev}{$element}{$regexpid}=$regexp;
}
@@ -1502,45 +1532,46 @@ sub ReplaceAllReadingsDoIf
return ($block,$err) if ($err);
if ($condition >= 0) {
if ($trigger) {
- $hash->{devices}{$condition} = AddItemDoIf($hash->{devices}{$condition},$device);
- $hash->{devices}{all} = AddItemDoIf($hash->{devices}{all},$device);
+ #$hash->{devices}{$condition} = AddItemDoIf($hash->{devices}{$condition},$device);
+ #$hash->{devices}{all} = AddItemDoIf($hash->{devices}{all},$device);
+ AddRegexpTriggerDoIf($hash,"cond","",$condition,$device,((defined $reading) ? $reading :((defined $internal) ? ("&".$internal):"&STATE")));
$event=1;
}
- $hash->{readings}{$condition} = AddItemDoIf($hash->{readings}{$condition},"$device:$reading") if (defined ($reading) and $trigger);
- $hash->{internals}{$condition} = AddItemDoIf($hash->{internals}{$condition},"$device:$internal") if (defined ($internal));
+ #$hash->{readings}{$condition} = AddItemDoIf($hash->{readings}{$condition},"$device:$reading") if (defined ($reading) and $trigger);
+ #$hash->{internals}{$condition} = AddItemDoIf($hash->{internals}{$condition},"$device:$internal") if (defined ($internal));
$hash->{readings}{all} = AddItemDoIf($hash->{readings}{all},"$device:$reading") if (defined ($reading) and $trigger);
$hash->{internals}{all} = AddItemDoIf($hash->{internals}{all},"$device:$internal") if (defined ($internal));
$hash->{trigger}{all} = AddItemDoIf($hash->{trigger}{all},"$device") if (!defined ($internal) and !defined($reading));
-
} elsif ($condition == -2) {
if ($trigger) {
- AddRegexpTriggerDoIf($hash,"STATE","","STATE",$device,((defined $reading) ? $reading : "&STATE"));
+ AddRegexpTriggerDoIf($hash,"STATE","","STATE",$device,((defined $reading) ? $reading :((defined $internal) ? ("&".$internal):"&STATE")));
$event=1;
}
} elsif ($condition == -3) {
- $hash->{itimer}{all} = AddItemDoIf($hash->{itimer}{all},$device);
+ AddRegexpTriggerDoIf($hash,"itimer","","itimer",$device,((defined $reading) ? $reading :((defined $internal) ? ("&".$internal):"&STATE")));
+ #$hash->{itimer}{all} = AddItemDoIf($hash->{itimer}{all},$device);
} elsif ($condition == -4) {
if ($trigger) {
- AddRegexpTriggerDoIf($hash,"DOIF_Readings","",$id,$device,((defined $reading) ? $reading :"&STATE"));
+ AddRegexpTriggerDoIf($hash,"DOIF_Readings","",$id,$device,((defined $reading) ? $reading :((defined $internal) ? ("&".$internal):"&STATE")));
$event=1;
}
} elsif ($condition == -5) {
if ($trigger) {
- AddRegexpTriggerDoIf($hash,"uiTable","",$id,$device,((defined $reading) ? $reading : "&STATE"));
+ AddRegexpTriggerDoIf($hash,"uiTable","",$id,$device,((defined $reading) ? $reading :((defined $internal) ? ("&".$internal):"&STATE")));
$hash->{uiTable}{dev}=$device;
- $hash->{uiTable}{reading}=((defined $reading) ? $reading : "&STATE");
+ $hash->{uiTable}{reading}=((defined $reading) ? $reading :((defined $internal) ? ("&".$internal):"&STATE"));
$event=1;
}
} elsif ($condition == -6) {
if ($trigger) {
- AddRegexpTriggerDoIf($hash,"uiState","",$id,$device,((defined $reading) ? $reading : "&STATE"));
+ AddRegexpTriggerDoIf($hash,"uiState","",$id,$device,((defined $reading) ? $reading :((defined $internal) ? ("&".$internal):"&STATE")));
$hash->{uiState}{dev}=$device;
- $hash->{uiState}{reading}=((defined $reading) ? $reading : "&STATE");
+ $hash->{uiState}{reading}=((defined $reading) ? $reading :((defined $internal) ? ("&".$internal):"&STATE"));
$event=1;
}
} elsif ($condition == -7) {
if ($trigger) {
- AddRegexpTriggerDoIf($hash,"event_Readings","",$id,$device,((defined $reading) ? $reading :"&STATE"));
+ AddRegexpTriggerDoIf($hash,"event_Readings","",$id,$device,((defined $reading) ? $reading :((defined $internal) ? ("&".$internal):"&STATE")));
$event=1;
}
}
@@ -1928,26 +1959,16 @@ sub DOIF_CheckCond($$) {
if ($eventa) {
$events=join(",",@{$eventa});
}
- if (defined ($hash->{readings}{$condition})) {
- foreach my $devReading (split(/ /,$hash->{readings}{$condition})) {
- $devReading=~ s/\$DEVICE/$hash->{helper}{triggerDev}/g if ($devReading);
- #if (!AttrVal($hash->{NAME},'notexist',undef)) {
- # ($dev,$reading)=(split(":",$devReading));
- # return (-1,"device does not exist: [$dev:$reading]") if ($devReading and !defined ($defs{$dev}));
- # return (-1,"reading does not exist: [$dev:$reading]") if ($devReading and !defined($defs{$dev}{READINGS}{$reading}{VAL}));
- #}
- }
- }
- if (defined ($hash->{internals}{$condition})) {
- foreach my $devInternal (split(/ /,$hash->{internals}{$condition})) {
- $devInternal=~ s/\$DEVICE/$hash->{helper}{triggerDev}/g if ($devInternal);
- #if (!AttrVal($hash->{NAME},'notexist',undef)) {
- # ($dev,$internal)=(split(":",$devInternal));
- # return (-1,"device does not exist: [$dev:$internal]") if ($devInternal and !defined ($defs{$dev}));
- # return (-1,"internal does not exist: [$dev:$internal]") if ($devInternal and !defined($defs{$dev}{$internal}));
- #}
- }
- }
+ #if (defined ($hash->{readings}{$condition})) {
+ # foreach my $devReading (split(/ /,$hash->{readings}{$condition})) {
+ # $devReading=~ s/\$DEVICE/$hash->{helper}{triggerDev}/g if ($devReading);
+ # }
+ #}
+ #if (defined ($hash->{internals}{$condition})) {
+ # foreach my $devInternal (split(/ /,$hash->{internals}{$condition})) {
+ # $devInternal=~ s/\$DEVICE/$hash->{helper}{triggerDev}/g if ($devInternal);
+ # }
+ #}
my $command=$hash->{condition}{$condition};
if ($command) {
my $eventa=$hash->{helper}{triggerEvents};
@@ -2151,7 +2172,7 @@ sub CheckRegexpDoIf
my @devlist;
return undef if (!defined $hash->{Regex}{$type});
- if ($id eq "") {
+ if (!AttrVal($hash->{NAME}, "checkReadingEvent", 1)) {
if (defined $hash->{Regex}{$type}{$device}) {
return 1;
}
@@ -2241,11 +2262,7 @@ sub DOIF_Perl_Trigger
$hash->{helper}{triggerDev}="";
$hash->{helper}{event}=$event;
} else { #event
- if (!defined CheckRegexpDoIf($hash,"cond", $device,$i,$hash->{helper}{triggerEvents},1)) {
- next if (!defined ($hash->{devices}{$i}));
- next if ($hash->{devices}{$i} !~ / $device /);
- next if (AttrVal($pn, "checkReadingEvent", 1) and !CheckReadingDoIf ($device,$hash->{readings}{$i},$hash->{helper}{triggerEventsState}) and (defined $hash->{internals}{$i} ? $hash->{internals}{$i} !~ / $device:.+ /:1));
- }
+ next if (!defined (CheckRegexpDoIf($hash,"cond", $device,$i,$hash->{helper}{triggerEventsState},1)));
$event="$device";
}
if (($ret,$err)=DOIF_CheckCond($hash,$i)) {
@@ -2308,12 +2325,10 @@ sub DOIF_Trigger
$hash->{helper}{triggerDev}="";
$hash->{helper}{event}=$event;
} else { #event
- if (!defined CheckRegexpDoIf($hash,"cond", $device,$i,$hash->{helper}{triggerEvents},1)) {
- if (AttrVal($pn, "checkall", 0) !~ "1|all|event" and !defined $checkall) {
- next if (!defined ($hash->{devices}{$i}));
- next if ($hash->{devices}{$i} !~ / $device /);
- next if (AttrVal($pn, "checkReadingEvent", 1) and !CheckReadingDoIf ($device,$hash->{readings}{$i},$hash->{helper}{triggerEventsState}) and (defined $hash->{internals}{$i} ? $hash->{internals}{$i} !~ / $device:.+ /:1))
- }
+ if (!defined (CheckRegexpDoIf($hash,"cond", $device,$i,$hash->{helper}{triggerEventsState},1))) {
+ if (!defined ($checkall) and AttrVal($pn, "checkall", 0) !~ "1|all|event") {
+ next;
+ }
}
$event="$device";
}
@@ -2429,7 +2444,8 @@ DOIF_Notify($$)
return "" if (!$hash->{helper}{globalinit});
#return "" if (!$hash->{itimer}{all} and !$hash->{devices}{all} and !keys %{$hash->{Regex}});
- if (($hash->{itimer}{all}) and $hash->{itimer}{all} =~ / $dev->{NAME} /) {
+ #if (($hash->{itimer}{all}) and $hash->{itimer}{all} =~ / $dev->{NAME} /) {
+ if (defined CheckRegexpDoIf($hash,"itimer",$dev->{NAME},"itimer",$eventas,1)) {
for (my $j=0; $j<$hash->{helper}{last_timer};$j++) {
if (CheckiTimerDoIf ($dev->{NAME},$hash->{time}{$j},$eventas)) {
DOIF_SetTimer ($hash,"DOIF_TimerTrigger",$j);
@@ -2452,8 +2468,8 @@ DOIF_Notify($$)
accu_setValue($hash,$device,$reading);
}
}
-
- if ((($hash->{devices}{all}) and $hash->{devices}{all} =~ / $dev->{NAME} /) or defined CheckRegexpDoIf($hash,"cond",$dev->{NAME},"",$eventa,0)){
+
+ if (defined CheckRegexpDoIf($hash,"cond",$dev->{NAME},"",$eventas,0)) {
$hash->{helper}{cur_cmd_nr}="Trigger $dev->{NAME}" if (AttrVal($hash->{NAME},"selftrigger","") ne "all");
$hash->{helper}{triggerEvents}=$eventa;
$hash->{helper}{triggerEventsState}=$eventas;
@@ -2485,7 +2501,7 @@ DOIF_Notify($$)
$ret=$hash->{MODEL} eq "Perl" ? DOIF_Perl_Trigger($hash,$dev->{NAME}) : DOIF_Trigger($hash,$dev->{NAME});
}
- if ((defined CheckRegexpDoIf($hash,"STATE",$dev->{NAME},"STATE",$eventa,1)) and !$ret) {
+ if ((defined CheckRegexpDoIf($hash,"STATE",$dev->{NAME},"STATE",$eventas,1)) and !$ret) {
$hash->{helper}{triggerEvents}=$eventa;
$hash->{helper}{triggerEventsState}=$eventas;
$hash->{helper}{triggerDev}=$dev->{NAME};
@@ -2986,6 +3002,7 @@ CmdDoIfPerl($$)
$hash->{helper}{last_timer}=0;
$hash->{helper}{sleeptimer}=-1;
+ $hash->{NOTIFYDEV} = "global";
return("","") if ($tail =~ /^ *$/);
@@ -3069,6 +3086,7 @@ CmdDoIf($$)
$hash->{helper}{last_timer}=0;
$hash->{helper}{sleeptimer}=-1;
+ $hash->{NOTIFYDEV} = "global";
return("","") if ($tail =~ /^ *$/);
@@ -3655,6 +3673,13 @@ sub AttrNum {
return (::AttrNum($d,$n,$default,$round));
}
+package ui_Table;
+
+sub FW_makeImage {
+ my ($image) = @_;
+ return (::FW_makeImage($image));
+}
+
1;
@@ -3898,7 +3923,7 @@ So könnte eine Definition aussehen:
Im Folgenden wird die Funktionalität des Moduls im Einzelnen an vielen praktischen Beispielen erklärt.
-
+
Ereignissteuerung back
Vergleichende Abfragen werden in der Bedingung, mit Perl-Operatoren ==, !=, <, <=, >, >= bei Zahlen und mit eq, ne, lt, le, gt, ge, =~, !~ bei Zeichenketten angegeben.
@@ -3915,7 +3940,7 @@ Das Modul wird getriggert, sobald das angegebene Device hier "remotecontrol" ein
Ausgewertet wird hier der Zustand des Status von remotecontrol nicht das Event selbst. Im FHEM-Modus arbeitet das Modul mit Zuständen, indem es den eigenen Status auswertet.
Die Ausführung erfolgt standardmäßig nur ein mal, bis ein anderer DOIF-Zweig und damit eine Ändernung des eigenen Status erfolgt.
Das bedeutet, dass ein mehrmaliges Drücken der Fernbedienung auf "on" nur einmal "set garage on" ausführt. Die nächste mögliche Ausführung ist "set garage off", wenn Fernbedienung "off" liefert.
-
+
Wünscht man eine Ausführung des gleichen Befehls mehrfach nacheinander bei jedem Trigger, unabhängig davon welchen Status das DOIF-Modul hat,
weil z. B. Garage nicht nur über die Fernbedienung geschaltet wird, dann muss man das per "do always"-Attribut angeben:
@@ -3939,7 +3964,7 @@ Diese Verhalten entspricht dem Verhalten mit dem Attribut do always im FHEM-Modu
define di_heating DOIF {if ([sens:temperature] < 20) {if (Value("heating") ne "on") {fhem_set"heating on"}}}
-
+
Teilausdrücke abfragen back
Abfragen nach Vorkommen eines Wortes innerhalb einer Zeichenkette können mit Hilfe des Perl-Operators =~ vorgenommen werden.
@@ -3954,7 +3979,7 @@ attr di_garage do always
Weitere Möglichkeiten bei der Nutzung des Perl-Operators: =~, insbesondere in Verbindung mit regulären Ausdrücken, können in der Perl-Dokumentation nachgeschlagen werden.
-
+
Ereignissteuerung über Auswertung von Events back
Eine Alternative zur Auswertung von Status oder Readings ist das Auswerten von Ereignissen (Events) mit Hilfe von regulären Ausdrücken. Der Suchstring wird als regulärer Ausdruck in Anführungszeichen angegeben.
@@ -4037,7 +4062,7 @@ Wenn kein Filter, wie obigen Beispiel, angegeben wird, so wird intern folgende R
Durch eigene Regex-Filter-Angaben kann man beliebige Teile des Events herausfiltern, ggf. über Output formatieren und in der Bedingung entsprechend auswerten,
ohne auf Readings zurückgreifen zu müssen.
-
+
Filtern nach Ausdrücken mit Ausgabeformatierung back
Syntax: [<device>:<reading>|<internal>:d<number>|"<regex>":<output>]
@@ -4082,7 +4107,7 @@ Der Inhalt des Dummys Alarm soll in einem Text eingebunden werden:
Die Definition von regulären Ausdrücken mit Nutzung der Perl-Variablen $1, $2 usw. kann in der Perldokumentation nachgeschlagen werden.
-
+
Durchschnitt, Median, Differenz, anteiliger Anstieg back
Die folgenden Funktionen werden auf die letzten gesendeten Werte eines Readings angewendet. Das angegebene Reading muss Events liefern, damit seine Werte intern im Modul gesammelt und die Berechnung der angegenen Funktion erfolgen kann.
@@ -4148,7 +4173,7 @@ Zu beachten:
Der Durchschnitt/Median/Differenz/Anstieg werden bereits gebildet, sobald die ersten Werte eintreffen. Beim ersten Wert ist der Durchschnitt bzw. Median logischerweise der Wert selbst,
Differenz und der Anstieg ist in diesem Fall 0. Die intern gesammelten Werte werden nicht dauerhaft gespeichert, nach einem Neustart sind sie gelöscht. Die angegebenen Readings werden intern automatisch für die Auswertung nach Zahlen gefiltert.
-
+
Angaben im Ausführungsteil (gilt nur für FHEM-Modus): back
Der Ausführungsteil wird durch runde Klammern eingeleitet. Es werden standardmäßig FHEM-Befehle angegeben, wie z. B.: ...(set lamp on)
@@ -4327,7 +4352,7 @@ Für reine Perlangaben gibt es eine entsprechende Perlfunktion namens Aggr
define di_Temperature DOIF {if (["^room:temperature"]) {foreach (AggrDoIf('@','^room','temperature','$_ < 15')) {Log3 "di_Temperatur",3,"im Zimmer $_ ist zu kalt"}}
-
+
Zeitsteuerung back
Zeitangaben in der Bedingung im Format: [HH:MM:SS] oder [HH:MM] oder [Zahl]
@@ -4353,7 +4378,7 @@ Zeitsteuerung mit mehreren Zeitschaltpunkten:
{if ([08:00] or [10:00] or [20:00]) {fhem_set"switch on"}}
{if ([09:00] or [11:00] or [00:00]) {fhem_set"switch off"}}
-
+
Relative Zeitangaben back
Zeitangaben, die mit Pluszeichen beginnen, werden relativ behandelt, d. h. die angegebene Zeit wird zum aktuellen Zeitpunkt hinzuaddiert.
@@ -4368,7 +4393,7 @@ attr di_save do always
Ebenfalls lassen sich relative Angaben in Sekunden angeben. [+01:00] entspricht [+3600];
-
+
Zeitangaben nach Zeitraster ausgerichtet back
Das Format lautet: [:MM] MM sind Minutenangaben zwischen 00 und 59.
@@ -4382,7 +4407,7 @@ Das Format lautet: [:MM] MM sind Minutenangaben zwischen 00 und 59.
{[:30];system"mplayer /opt/fhem/Sound/BigBen_30.mp3 -volume 90 −really−quiet &"}
{[:45];system"mplayer /opt/fhem/Sound/BigBen_45.mp3 -volume 90 −really−quiet &"}
-
+
Relative Zeitangaben nach Zeitraster ausgerichtet back
Das Format lautet: [+:MM] MM sind Minutenangaben zwischen 1 und 59.
@@ -4395,7 +4420,7 @@ attr di_gong do always
Perl-Modus:
define di_gong DOIF {[+:15];fhem_set"Gong_mp3 playTone 1"}
-
+
Zeitangaben nach Zeitraster ausgerichtet alle X Stunden back
Format: [+[h]:MM] mit: h sind Stundenangaben zwischen 2 und 23 und MM Minuten zwischen 00 und 59
@@ -4408,7 +4433,7 @@ attr di_gong do always
Perl-Modus:
define di_gong DOIF {[+[2]:05];fhem_set"pump on-for-timer 300"}
-
+
Wochentagsteuerung back
Hinter der Zeitangabe kann ein oder mehrere Wochentage getrennt mit einem Pipezeichen | angegeben werden. Die Syntax lautet:
@@ -4424,8 +4449,9 @@ oder entsprechend mit englischen Bezeichnern:
[<time>|Su Mo Tu We Th Fr Sa WE WD TWE]
weekdays können beliebige Wochentagbezeichnungen definiert werden. Die Syntax lautet:weekdays können beliebige Wochentagbezeichnungen definiert werden.weekdays <Bezeichnung für Sonntag>,<Bezeichnung für Montag>,...,<Bezeichnung für Wochenende oder Feiertag>,<Bezeichnung für Arbeitstage>,<Bezeichnung für Wochenende oder Feiertag morgen>[<begin>-<end>],
@@ -4520,7 +4546,7 @@ Schalten mit Zeitfunktionen, hier: bei Sonnenaufgang und Sonnenuntergang:define di_time DOIF {if ([[begin]-[end]|7]) {fhem_set"radio on"} else {fhem_set"radio off"}}define di_rand_lamp DOIF {[{sunset()}-[end:state],+(rand(600)+900)|Sa So];fhem_set"lamp on-for-timer 300"}define di_shutters DOIF ([sensor:brightness]>100 and [06:25-09:00|8] or [09:00|7]) (set shutters up) DOELSEIF ([sensor:brightness]<50) (set shutters down)define di_motion DOIF {if ([?06:00-10:00] and [button] and [?Home] eq "present"){fhem_set"lamp on-for-timer 600"}}define di_pushmsg DOIF ([window] eq "open" and [alarm] eq "armed") (set Pushover msg 'alarm' 'open windows [window:LastDevice]' '' 2 'persistent' 30 3600)attr <DOIF-module> wait <Sekunden für Befehlsfolge des ersten DO-Falls>:<Sekunden für Befehlsfolge des zweiten DO-Falls>:...
(set lamp1 on, set lamp2 on), soll vor dem Schalten von lamp2 eine Verzögerung von einer Sekunde stattfinden.
@@ -4835,9 +4860,9 @@ attr di_push do resetwaitrepeatcmd definiert. Syntax:attr <DOIF-modul> repeatcmd <Sekunden für Befehlsfolge des ersten DO-Falls>:<Sekunden für Befehlsfolge des zweiten DO-Falls>:...
cmdpause <Sekunden für cmd_1>:<Sekunden für cmd_2>:... wird die Zeitspanne in Sekunden angegeben für eine Zwangspause seit der letzten Zustandsänderung.
In der angegebenen Zeitspanne wird ein Kommando nicht ausgeführt, auch wenn die dazugehörige Bedingung wahr wird.repeatsame <maximale Anzahl von cmd_1>:<maximale Anzahl von cmd_2>:... wird die maximale Anzahl hintereinander folgenden Ausführungen festgelegt.waitsame <Zeitspanne in Sekunden für cmd_1>:<Zeitspanne in Sekunden für das cmd_2>:... wird ein Kommando erst dann ausgeführt, wenn innerhalb einer definierten Zeitspanne die entsprechende Bedingung zweimal hintereinander wahr wird.waitsame nicht gelten soll, werden die entsprechenden Sekundenangaben ausgelassen oder auf Null gesetzt.repeatsame-Attribut ist das Attribut waitdel. Die Syntax mit Sekundenangaben pro Kommando entspricht der, des wait-Attributs. Im Gegensatz zum wait-Attribut, wird ein laufender Timer gelöscht, falls eine Bedingung wiederholt wahr wird.
Sekundenangaben können pro Kommando ausgelassen oder auf Null gesetzt werden.[<Device>:<Reading>] wird das Modul getriggert, wenn ein Ereignis zum angegebenen Device und Reading kommt. Soll das Modul, wie bei Statusangaben der Art [<Device>], auf alle Ereignisse des Devices reagieren, so muss das Attribut auf Null gesetzt werden.checkReadingEvent 0 die Voreinstellung des Moduls. Da die aktuelle Voreinstellung des Moduls checkReadingEvent 1 ist, hat das Setzen von
@@ -4958,8 +4982,8 @@ Bemerkung: In früheren Versionen des Moduls war checkReadingEvent 0
addStateEvent bewerksteligen.
Bei Statusänderungen eines Devices wird bei der Angabe des Attributes addStateEvent im Event "state: " vorangestellt, darauf kann man dann gezielt im DOIF-Modul triggern.selftrigger wait gesetzt ist, kann das DOIF-Modul auf selbst ausgelöste Events reagieren. Dazu müssen die entsprchenden Kommandos mit wait verzögert werden.
Bei der Angabe selftrigger all reagiert das Modul grundsätzlich alle selbst ausgelösten Trigger.timerevent ungleich Null gesetzt ist, wird beim S
[<Device>:<Reading>:sec] in Sekunden seit der letzten Änderung bestimmt werden.define di_lamp DOIF ([BM:state:sec] < 5) (set lamp on-for-timer 300)
-attr di_lamp do alwaysdefine di_monitor DOIF ([+01:00] and [?sensor:temperature:sec]>3600)(set pushbullet message sensor failed)
+attr di_monitor do alwaysattr <name> notexist "<Ersatzwert>"attr <name> intialize <Status nach Neustart>attr <name> initialize <Status nach Neustart>attr <name> disable <0|1>fhem, Log, Log3, InternVal, InternalNum, OldReadingsVal, OldReadingsNum, OldReadingsTimestamp, ReadingsVal, ReadingsNum, ReadingsTimestamp, ReadingsAge, Value, OldValue, OldTimestamp, AttrVal, AttrNumfhem_set(<content>), mit <content> Übergabeparameter des FHEM set-Befehlsfhem("set lamp off");fhem entfällt.set_Event(<Event>)set_Event("on");set_State(<value>,<trigger>), mit <trigger>: 0 ohne Trigger, 1 mit Trigger, <trigger> ist optional, default ist 1set_State("on");get_State()fhem_set("lamp ".get_State());set_Reading(<readingName>,<value>,<trigger>), mit <trigger>: 0 ohne Trigger, 1 mit Trigger, <trigger> ist optional, default ist 0set_Reading("weather","cold");get_Reading(<readingName>)fhem_set("lamp ".get_Reading("dim"));set_Reading_Begin()set_Reading_Update("temperature",$temp);set_Reading_Update("humidity",$hum);set_Reading_End(1);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.get_Exec(<timerName>), Returnwert: 0, wenn Timer abgelaufen oder nicht gesetzt ist, sonst Anzahl der Sekunden bis zum Ablauf des Timersdel_Exec(<timerName>)set_Exec("off_Event",30,'set_Event("off")');$_betrag{heute}=100;DOIF::<blocking function>
define di_light DOIF {
@@ -6283,8 +6285,7 @@ define di_light DOIF {
}
}
-