mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-04-28 17:12:32 +00:00
98_DOIF.pm: states, readings in time functions, set enable, item helper, item summery
git-svn-id: https://svn.fhem.de/fhem/trunk@12215 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
97dc2bcec2
commit
0c3ad5dc45
@ -1333,9 +1333,9 @@ DOIF_TimerTrigger ($)
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub
|
sub
|
||||||
DOIF_DetTime($)
|
DOIF_DetTime($$)
|
||||||
{
|
{
|
||||||
my ($timeStr) = @_;
|
my ($hash, $timeStr) = @_;
|
||||||
my $rel=0;
|
my $rel=0;
|
||||||
my $align;
|
my $align;
|
||||||
my $hr=0;
|
my $hr=0;
|
||||||
@ -1359,11 +1359,8 @@ DOIF_DetTime($)
|
|||||||
} elsif ($timeStr =~ m/^(\-?([0-9]+))$/) {
|
} elsif ($timeStr =~ m/^(\-?([0-9]+))$/) {
|
||||||
$s=$1;
|
$s=$1;
|
||||||
} else {
|
} else {
|
||||||
if ($timeStr =~ m/^\$hms$/) {
|
($timeStr,$err)=ReplaceAllReadingsDoIf($hash,$timeStr,-3,1);
|
||||||
$timeStr = sprintf("%02d:%02d:%02d", $hour, $min, $sec);
|
return ($err) if ($err);
|
||||||
} elsif ($timeStr =~ m/^\$hm$/) {
|
|
||||||
$timeStr = sprintf("%02d:%02d", $hour, $min);
|
|
||||||
}
|
|
||||||
($err, $h, $m, $s, $fn) = GetTimeSpec($timeStr);
|
($err, $h, $m, $s, $fn) = GetTimeSpec($timeStr);
|
||||||
return $err if ($err);
|
return $err if ($err);
|
||||||
}
|
}
|
||||||
@ -1416,14 +1413,13 @@ DOIF_CalcTime($$)
|
|||||||
my $pos;
|
my $pos;
|
||||||
my $ret;
|
my $ret;
|
||||||
if ($block=~ m/^\+\[([0-9]+)\]:([0-5][0-9])$/) {
|
if ($block=~ m/^\+\[([0-9]+)\]:([0-5][0-9])$/) {
|
||||||
($err,$rel,$block)=DOIF_DetTime($block);
|
($err,$rel,$block)=DOIF_DetTime($hash,$block);
|
||||||
return ($block,$err,$rel);
|
return ($block,$err,$rel);
|
||||||
} elsif ($block =~ /^\+\(/ or $block =~ /^\+\[/) {
|
} elsif ($block =~ /^\+\(/ or $block =~ /^\+\[/) {
|
||||||
$relGlobal=1;
|
$relGlobal=1;
|
||||||
#$pos=pos($block);
|
#$pos=pos($block);
|
||||||
$block=substr($block,1);
|
$block=substr($block,1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($block =~ /^\(/) {
|
if ($block =~ /^\(/) {
|
||||||
($beginning,$tailBlock,$err,$tailBlock)=GetBlockDoIf($block,'[\(\)]');
|
($beginning,$tailBlock,$err,$tailBlock)=GetBlockDoIf($block,'[\(\)]');
|
||||||
return ($tailBlock,$err) if ($err);
|
return ($tailBlock,$err) if ($err);
|
||||||
@ -1434,11 +1430,25 @@ DOIF_CalcTime($$)
|
|||||||
($block,$err,$device,$reading,$internal)=ReplaceReadingEvalDoIf($hash,$block,1);
|
($block,$err,$device,$reading,$internal)=ReplaceReadingEvalDoIf($hash,$block,1);
|
||||||
return ($block,$err) if ($err);
|
return ($block,$err) if ($err);
|
||||||
}
|
}
|
||||||
($err,$rel,$block)=DOIF_DetTime($block);
|
($err,$rel,$block)=DOIF_DetTime($hash, $block);
|
||||||
$rel=1 if ($relGlobal);
|
$rel=1 if ($relGlobal);
|
||||||
return ($block,$err,$rel);
|
return ($block,$err,$rel);
|
||||||
}
|
}
|
||||||
$tailBlock=$block;
|
$tailBlock=$block;
|
||||||
|
while ($tailBlock ne "") {
|
||||||
|
($beginning,$block,$err,$tailBlock)=GetBlockDoIf($tailBlock,'[\{\}]');
|
||||||
|
return ($block,$err) if ($err);
|
||||||
|
if ($block ne "") {
|
||||||
|
# $ret = eval $block;
|
||||||
|
# return($block." ",$@) if ($@);
|
||||||
|
# $block=$ret;
|
||||||
|
($err,$rel,$block)=DOIF_DetTime($hash,"{".$block."}");
|
||||||
|
return ($block,$err) if ($err);
|
||||||
|
}
|
||||||
|
$cmd.=$beginning.$block;
|
||||||
|
}
|
||||||
|
$tailBlock=$cmd;
|
||||||
|
$cmd="";
|
||||||
while ($tailBlock ne "") {
|
while ($tailBlock ne "") {
|
||||||
($beginning,$block,$err,$tailBlock)=GetBlockDoIf($tailBlock,'[\[\]]');
|
($beginning,$block,$err,$tailBlock)=GetBlockDoIf($tailBlock,'[\[\]]');
|
||||||
return ($block,$err) if ($err);
|
return ($block,$err) if ($err);
|
||||||
@ -1447,22 +1457,7 @@ DOIF_CalcTime($$)
|
|||||||
($block,$err,$device,$reading,$internal)=ReplaceReadingEvalDoIf($hash,$block,1);
|
($block,$err,$device,$reading,$internal)=ReplaceReadingEvalDoIf($hash,$block,1);
|
||||||
return ($block,$err) if ($err);
|
return ($block,$err) if ($err);
|
||||||
}
|
}
|
||||||
($err,$rel,$block)=DOIF_DetTime($block);
|
($err,$rel,$block)=DOIF_DetTime($hash,$block);
|
||||||
return ($block,$err) if ($err);
|
|
||||||
|
|
||||||
}
|
|
||||||
$cmd.=$beginning.$block;
|
|
||||||
}
|
|
||||||
$tailBlock=$cmd;
|
|
||||||
$cmd="";
|
|
||||||
while ($tailBlock ne "") {
|
|
||||||
($beginning,$block,$err,$tailBlock)=GetBlockDoIf($tailBlock,'[\{\}]');
|
|
||||||
return ($block,$err) if ($err);
|
|
||||||
if ($block ne "") {
|
|
||||||
$ret = eval $block;
|
|
||||||
return($block." ",$@) if ($@);
|
|
||||||
$block=$ret;
|
|
||||||
($err,$rel,$block)=DOIF_DetTime($block);
|
|
||||||
return ($block,$err) if ($err);
|
return ($block,$err) if ($err);
|
||||||
}
|
}
|
||||||
$cmd.=$beginning.$block;
|
$cmd.=$beginning.$block;
|
||||||
@ -1826,13 +1821,14 @@ DOIF_Set($@)
|
|||||||
my $arg = $a[1];
|
my $arg = $a[1];
|
||||||
my $value = (defined $a[2]) ? $a[2] : "";
|
my $value = (defined $a[2]) ? $a[2] : "";
|
||||||
my $ret="";
|
my $ret="";
|
||||||
if ($arg eq "disable" or $arg eq "initialize") {
|
if ($arg eq "disable" or $arg eq "initialize" or $arg eq "enable") {
|
||||||
if (AttrVal($hash->{NAME},"disable","")) {
|
if (AttrVal($hash->{NAME},"disable","")) {
|
||||||
return ("modul ist deactivated by disable attribut, delete disable attribut first");
|
return ("modul ist deactivated by disable attribut, delete disable attribut first");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($arg eq "disable") {
|
if ($arg eq "disable") {
|
||||||
readingsBeginUpdate ($hash);
|
readingsBeginUpdate ($hash);
|
||||||
|
readingsBulkUpdate($hash,"last_cmd",ReadingsVal($pn,"state",""));
|
||||||
readingsBulkUpdate($hash, "state", "disabled");
|
readingsBulkUpdate($hash, "state", "disabled");
|
||||||
readingsBulkUpdate($hash, "mode", "disabled");
|
readingsBulkUpdate($hash, "mode", "disabled");
|
||||||
readingsEndUpdate ($hash, 1);
|
readingsEndUpdate ($hash, 1);
|
||||||
@ -1841,8 +1837,13 @@ DOIF_Set($@)
|
|||||||
delete ($defs{$hash->{NAME}}{READINGS}{cmd_nr});
|
delete ($defs{$hash->{NAME}}{READINGS}{cmd_nr});
|
||||||
delete ($defs{$hash->{NAME}}{READINGS}{cmd_event});
|
delete ($defs{$hash->{NAME}}{READINGS}{cmd_event});
|
||||||
readingsSingleUpdate($hash, "state","initialize",1);
|
readingsSingleUpdate($hash, "state","initialize",1);
|
||||||
|
} elsif ($arg eq "enable" ) {
|
||||||
|
#delete ($defs{$hash->{NAME}}{READINGS}{mode});
|
||||||
|
readingsSingleUpdate ($hash,"state",ReadingsVal($pn,"last_cmd",""),0) if (ReadingsVal($pn,"last_cmd","") ne "");
|
||||||
|
delete ($defs{$hash->{NAME}}{READINGS}{last_cmd});
|
||||||
|
readingsSingleUpdate ($hash,"mode","enable",1)
|
||||||
} else {
|
} else {
|
||||||
return "$pn: unknown argument $a[1], choose one of disable initialize"
|
return "$pn: unknown argument $a[1], choose one of disable initialize enable"
|
||||||
}
|
}
|
||||||
return $ret;
|
return $ret;
|
||||||
}
|
}
|
||||||
@ -1851,6 +1852,9 @@ DOIF_Set($@)
|
|||||||
1;
|
1;
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
=item helper
|
||||||
|
=item summary universal module, it works event- and time-controlled
|
||||||
|
=item summary_DE universelles Modul, welches ereignis- und zeitgesteuert Anweisungen ausführt
|
||||||
=begin html
|
=begin html
|
||||||
|
|
||||||
<a name="DOIF"></a>
|
<a name="DOIF"></a>
|
||||||
@ -2065,7 +2069,8 @@ Das Modul wird getriggert, sobald das angegebene Device hier "remotecontrol" ein
|
|||||||
Ausgewertet wird hier der Zustand des Statuses von remotecontrol nicht das Event selbst. Die Ausführung erfolgt standardmäßig einmalig nur nach Zustandswechsel des Moduls.
|
Ausgewertet wird hier der Zustand des Statuses von remotecontrol nicht das Event selbst. Die Ausführung erfolgt standardmäßig einmalig nur nach Zustandswechsel des Moduls.
|
||||||
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.
|
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.
|
||||||
<a name="DOIF_do_always"></a>
|
<a name="DOIF_do_always"></a>
|
||||||
Wünscht man eine Ausführung des gleichen Befehls mehrfach nacheinander bei jedem Trigger, unabhängig davon welchen Zustand das DOIF-Modul hat, weil z. B. Garage nicht nur über die Fernbedienung geschaltet wird und dann muss man das per "do always"-Attribut angeben:<br>
|
Wünscht man eine Ausführung des gleichen Befehls mehrfach nacheinander bei jedem Trigger, unabhängig davon welchen Zustand das DOIF-Modul hat,
|
||||||
|
weil z. B. Garage nicht nur über die Fernbedienung geschaltet wird, dann muss man das per "do always"-Attribut angeben:<br>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
<code>attr di_garage do always</code><br>
|
<code>attr di_garage do always</code><br>
|
||||||
@ -2322,9 +2327,14 @@ Statt fester Zeitangaben können Stati, Readings oder Internals angegeben werden
|
|||||||
<br>
|
<br>
|
||||||
<code>define time dummy<br>
|
<code>define time dummy<br>
|
||||||
set time 08:00<br>
|
set time 08:00<br>
|
||||||
define di_time DOIF ([[time]])(set lamp on)</code><br>
|
define di_time DOIF ([[time]])(set lamp on)<br>
|
||||||
|
attr di_time do always</code><br>
|
||||||
<br>
|
<br>
|
||||||
Ebenfalls kann das Dummy mit einer Sekundenzahl belegt werden, oder als indirekte Zeit angegeben werden, hier z. B. schalten alle 300 Sekunden:<br>
|
Die indirekte Angabe kann ebenfalls mit einer Zeitfunktion belegt werden. Z. B. <br>
|
||||||
|
<br>
|
||||||
|
<code>set time {sunset()}</code><br>
|
||||||
|
<br>
|
||||||
|
Das Dummy kann auch mit einer Sekundenzahl belegt werden, oder als relative Zeit angegeben werden, hier z. B. schalten alle 300 Sekunden:<br>
|
||||||
<br>
|
<br>
|
||||||
<code>define time dummy<br>
|
<code>define time dummy<br>
|
||||||
set time 300<br>
|
set time 300<br>
|
||||||
@ -2340,12 +2350,18 @@ set end 10:00<br>
|
|||||||
<br>
|
<br>
|
||||||
define di_time DOIF ([[begin]-[end]]) (set radio on) DOELSE (set radio off)</code><br>
|
define di_time DOIF ([[begin]-[end]]) (set radio on) DOELSE (set radio off)</code><br>
|
||||||
<br>
|
<br>
|
||||||
|
Indirekte Zeitangaben können auch als Übergabeparameter für Zeitfunktionen, wie z. B. sunset oder sunrise übergeben werden:<br>
|
||||||
|
<br>
|
||||||
|
<code>define di_time DOIF ([{sunrise(0,"[begin]","09:00")-{sunset(0,"18:00","[end]")]) (set lamp off) DOELSE (set lamp on) </code><br>
|
||||||
|
<br>
|
||||||
Bei einer Änderung des angebenen Status oder Readings wird die geänderte Zeit sofort im Modul aktualisiert.<br>
|
Bei einer Änderung des angebenen Status oder Readings wird die geänderte Zeit sofort im Modul aktualisiert.<br>
|
||||||
<br>
|
<br>
|
||||||
Angabe eines Readings als Zeitangabe. Beispiel: Schalten anhand eines Twilight-Readings:<br>
|
Angabe eines Readings als Zeitangabe. Beispiel: Schalten anhand eines Twilight-Readings:<br>
|
||||||
<br>
|
<br>
|
||||||
<code>define di_time DOIF ([[myTwilight:ss_weather]])(set lamp on)</code><br>
|
<code>define di_time DOIF ([[myTwilight:ss_weather]])(set lamp on)</code><br>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
|
|
||||||
Dynamische Änderung einer Zeitangabe.<br>
|
Dynamische Änderung einer Zeitangabe.<br>
|
||||||
<br>
|
<br>
|
||||||
<u>Anwendungsbeispiel</u>: Die Endzeit soll abhängig von der Beginnzeit mit Hilfe einer eigenen Perl-Funktion, hier: <code>OffTime()</code>, bestimmt werden. <code>begin</code> und <code>end</code> sind Dummys, wie oben definiert:<br>
|
<u>Anwendungsbeispiel</u>: Die Endzeit soll abhängig von der Beginnzeit mit Hilfe einer eigenen Perl-Funktion, hier: <code>OffTime()</code>, bestimmt werden. <code>begin</code> und <code>end</code> sind Dummys, wie oben definiert:<br>
|
||||||
@ -2710,7 +2726,7 @@ Das ist insb. dann interessant, wenn ein Modul verschiedene Readings zu untersch
|
|||||||
<br>
|
<br>
|
||||||
<u>Beispiele</u>:<br>
|
<u>Beispiele</u>:<br>
|
||||||
<br>
|
<br>
|
||||||
<code>define di_lamp ([mytwilight:light] < 3) (set lamp on) DOELSEIF ([mytwilight:light] > 3) (set lamp off)<br>
|
<code>define di_lamp DOIF ([mytwilight:light] < 3) (set lamp on) DOELSEIF ([mytwilight:light] > 3) (set lamp off)<br>
|
||||||
attr di_lamp checkReadingEvent 1</code><br>
|
attr di_lamp checkReadingEvent 1</code><br>
|
||||||
<br>
|
<br>
|
||||||
Ebenso gilt die Einschränkung für indirekte Timer:<br>
|
Ebenso gilt die Einschränkung für indirekte Timer:<br>
|
||||||
@ -2964,7 +2980,7 @@ Hier passiert das nicht mehr, da die ursprünglichen Zustände cmd_1 und cmd_2 j
|
|||||||
<dd>verwendete Timer mit Angabe des nächsten Zeitpunktes</dd>
|
<dd>verwendete Timer mit Angabe des nächsten Zeitpunktes</dd>
|
||||||
</br>
|
</br>
|
||||||
<dt>wait_timer</dt>
|
<dt>wait_timer</dt>
|
||||||
<dd>Angabe des aktueller Wait-Timers</dd>
|
<dd>Angabe des aktuellen Wait-Timers</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</br>
|
</br>
|
||||||
</ul>
|
</ul>
|
||||||
@ -2997,8 +3013,8 @@ Hier passiert das nicht mehr, da die ursprünglichen Zustände cmd_1 und cmd_2 j
|
|||||||
<dt>$SELF</dt>
|
<dt>$SELF</dt>
|
||||||
<dd>für den Gerätenamen des DOIF</dd>
|
<dd>für den Gerätenamen des DOIF</dd>
|
||||||
</br>
|
</br>
|
||||||
<dt><globale Variable></dt>
|
<dt><Perl-Funktionen></dt>
|
||||||
<dd>Variablen für Zeit- und Datumsangaben, siehe auch <a href="#perl">PERL Besonderheiten</a></dd>
|
<dd>vorhandene und selbsterstellte Perl-Funktionen</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</br>
|
</br>
|
||||||
</ul>
|
</ul>
|
||||||
@ -3007,7 +3023,7 @@ Hier passiert das nicht mehr, da die ursprünglichen Zustände cmd_1 und cmd_2 j
|
|||||||
<ul>
|
<ul>
|
||||||
<dl>
|
<dl>
|
||||||
<dt><a href="#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events">Events</a> <code><b>[</b><devicename><b>:"</b><regex für Events>"<b>]</b></code> oder <code><b>["</b><regex für Devices><b>:</b><regex für Events><b>"]</b></code></dt>
|
<dt><a href="#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events">Events</a> <code><b>[</b><devicename><b>:"</b><regex für Events>"<b>]</b></code> oder <code><b>["</b><regex für Devices><b>:</b><regex für Events><b>"]</b></code></dt>
|
||||||
<dd>für <code><regex></code> gilt: <code><b>^</b><ist eindeutig><b>$</b></code>, <code><b>^</b><beginnt mit></code>, <code><endet mit><b>$</b></code>, <code><b>""</b></code> entspricht <code><b>".*"</b></code>, siehe auch <a target=blank href="https://wiki.selfhtml.org/wiki/Perl/Regul%C3%A4re_Ausdr%C3%BCcke">Reguläre Ausdrücke</a>
|
<dd>für <code><regex></code> gilt: <code><b>^</b><ist eindeutig><b>$</b></code>, <code><b>^</b><beginnt mit></code>, <code><endet mit><b>$</b></code>, <code><b>""</b></code> entspricht <code><b>".*"</b></code>, siehe auch <a target=blank href="https://wiki.selfhtml.org/wiki/Perl/Regul%C3%A4re_Ausdr%C3%BCcke">Reguläre Ausdrücke</a> und Events des Gerätes <a target=blank href="#global">global</a>
|
||||||
</dd>
|
</dd>
|
||||||
</br>
|
</br>
|
||||||
<dt><a href="#DOIF_Zeitsteuerung">Zeitpunkte</a> <code><b>[</b><time><b>]</b> </code></dt>
|
<dt><a href="#DOIF_Zeitsteuerung">Zeitpunkte</a> <code><b>[</b><time><b>]</b> </code></dt>
|
||||||
@ -3046,8 +3062,8 @@ Hier passiert das nicht mehr, da die ursprünglichen Zustände cmd_1 und cmd_2 j
|
|||||||
<dt>$cmd</dt>
|
<dt>$cmd</dt>
|
||||||
<dd>Perl-Variablen mit der Bedeutung [$SELF:cmd]</dd>
|
<dd>Perl-Variablen mit der Bedeutung [$SELF:cmd]</dd>
|
||||||
</br>
|
</br>
|
||||||
<dt><Perl-Funktionen></dt>
|
<dt><globale Variable></dt>
|
||||||
<dd>vorhandene und selbsterstellte Perl-Funktionen</dd>
|
<dd>Variablen für Zeit- und Datumsangaben, siehe auch <a href="#perl">PERL Besonderheiten</a></dd>
|
||||||
</dl>
|
</dl>
|
||||||
</br>
|
</br>
|
||||||
</ul>
|
</ul>
|
||||||
@ -3059,6 +3075,9 @@ Hier passiert das nicht mehr, da die ursprünglichen Zustände cmd_1 und cmd_2 j
|
|||||||
</br>
|
</br>
|
||||||
<dt><a href="#DOIF_initialize">initialize</a> <code><b> set </b><name><b> initialize</b></code></dt>
|
<dt><a href="#DOIF_initialize">initialize</a> <code><b> set </b><name><b> initialize</b></code></dt>
|
||||||
<dd>initialisiert das DOIF und aktiviert die Befehlsausführung</dd>
|
<dd>initialisiert das DOIF und aktiviert die Befehlsausführung</dd>
|
||||||
|
</br>
|
||||||
|
<dt><a href="#DOIF_initialize">enable</a> <code><b> set </b><name><b> enable</b></code></dt>
|
||||||
|
<dd>aktiviert die Befehlsausführung, im Gegensatz zur obigen Initialisierung bleibt der letzte Zustand des Moduls erhalten</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</br>
|
</br>
|
||||||
</ul>
|
</ul>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user