mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-04-21 07:56:03 +00:00
98_DOIF.pm: new Attribute: repeatcmd, fixed: time interval next day
git-svn-id: https://svn.fhem.de/fhem/trunk@9913 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
b73fecf208
commit
e4525a74ab
@ -68,7 +68,7 @@ DOIF_Initialize($)
|
|||||||
$hash->{UndefFn} = "DOIF_Undef";
|
$hash->{UndefFn} = "DOIF_Undef";
|
||||||
$hash->{AttrFn} = "DOIF_Attr";
|
$hash->{AttrFn} = "DOIF_Attr";
|
||||||
$hash->{NotifyFn} = "DOIF_Notify";
|
$hash->{NotifyFn} = "DOIF_Notify";
|
||||||
$hash->{AttrList} = "disable:0,1 loglevel:0,1,2,3,4,5,6 wait do:always,resetwait cmdState state initialize repeatsame waitsame waitdel cmdpause timerWithWait ".$readingFnAttributes;
|
$hash->{AttrList} = "disable:0,1 loglevel:0,1,2,3,4,5,6 wait do:always,resetwait cmdState state initialize repeatsame repeatcmd waitsame waitdel cmdpause timerWithWait ".$readingFnAttributes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -523,7 +523,7 @@ DOIF_time($$$$$$)
|
|||||||
if ($hms ge $begin) {
|
if ($hms ge $begin) {
|
||||||
$ret=1;
|
$ret=1;
|
||||||
} elsif ($hms lt $end) {
|
} elsif ($hms lt $end) {
|
||||||
$wday=1 if ($wday-- == -1);
|
$wday=6 if ($wday-- == 0);
|
||||||
$we=DOIF_we($wday);
|
$we=DOIF_we($wday);
|
||||||
$ret=1;
|
$ret=1;
|
||||||
}
|
}
|
||||||
@ -678,6 +678,7 @@ DOIF_cmd ($$$$)
|
|||||||
my @repeatsame=split(/:/,AttrVal($pn,"repeatsame",""));
|
my @repeatsame=split(/:/,AttrVal($pn,"repeatsame",""));
|
||||||
my @cmdpause=split(/:/,AttrVal($pn,"cmdpause",""));
|
my @cmdpause=split(/:/,AttrVal($pn,"cmdpause",""));
|
||||||
my @waitsame=split(/:/,AttrVal($pn,"waitsame",""));
|
my @waitsame=split(/:/,AttrVal($pn,"waitsame",""));
|
||||||
|
my @sleeptimer=split(/:/,AttrVal($pn,"repeatcmd",""));
|
||||||
my ($seconds, $microseconds) = gettimeofday();
|
my ($seconds, $microseconds) = gettimeofday();
|
||||||
if ($cmdpause[$nr] and $subnr==0) {
|
if ($cmdpause[$nr] and $subnr==0) {
|
||||||
return undef if ($seconds - time_str2num(ReadingsTimestamp($pn, "state", "1970-01-01 01:00:00")) < $cmdpause[$nr]);
|
return undef if ($seconds - time_str2num(ReadingsTimestamp($pn, "state", "1970-01-01 01:00:00")) < $cmdpause[$nr]);
|
||||||
@ -690,6 +691,7 @@ DOIF_cmd ($$$$)
|
|||||||
if ($repeatnr < $repeatsame[$nr]) {
|
if ($repeatnr < $repeatsame[$nr]) {
|
||||||
$repeatnr++;
|
$repeatnr++;
|
||||||
} else {
|
} else {
|
||||||
|
delete ($defs{$hash->{NAME}}{READINGS}{cmd_count}) if (defined ($sleeptimer[$nr]) and (AttrVal($pn,"do","") eq "always" or AttrVal($pn,"do","") eq "resetwait"));
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -727,9 +729,16 @@ DOIF_cmd ($$$$)
|
|||||||
delete $hash->{helper}{cur_cmd_nr};
|
delete $hash->{helper}{cur_cmd_nr};
|
||||||
if (defined $hash->{do}{$nr}{++$subnr}) {
|
if (defined $hash->{do}{$nr}{++$subnr}) {
|
||||||
my $last_cond=ReadingsVal($pn,"cmd_nr",0)-1;
|
my $last_cond=ReadingsVal($pn,"cmd_nr",0)-1;
|
||||||
if (DOIF_SetSleepTimer($hash,$last_cond,$nr,$subnr,$event,-1)) {
|
if (DOIF_SetSleepTimer($hash,$last_cond,$nr,$subnr,$event,-1,undef)) {
|
||||||
DOIF_cmd ($hash,$nr,$subnr,$event);
|
DOIF_cmd ($hash,$nr,$subnr,$event);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if (defined ($sleeptimer[$nr])) {
|
||||||
|
my $last_cond=ReadingsVal($pn,"cmd_nr",0)-1;
|
||||||
|
if (DOIF_SetSleepTimer($hash,$last_cond,$nr,0,$event,-1,$sleeptimer[$nr])) {
|
||||||
|
DOIF_cmd ($hash,$nr,$subnr,$event);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
@ -763,7 +772,7 @@ DOIF_Trigger ($$$)
|
|||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
if ($ret) {
|
if ($ret) {
|
||||||
if (DOIF_SetSleepTimer($hash,$last_cond,$i,0,$device,$timerNr)) {
|
if (DOIF_SetSleepTimer($hash,$last_cond,$i,0,$device,$timerNr,undef)) {
|
||||||
DOIF_cmd ($hash,$i,0,$event);
|
DOIF_cmd ($hash,$i,0,$event);
|
||||||
return 1;
|
return 1;
|
||||||
} else {
|
} else {
|
||||||
@ -776,7 +785,7 @@ DOIF_Trigger ($$$)
|
|||||||
}
|
}
|
||||||
if ($doelse) { #DOELSE
|
if ($doelse) { #DOELSE
|
||||||
if (defined ($hash->{do}{$max_cond}{0}) or ($max_cond == 1 and !(AttrVal($pn,"do","") or AttrVal($pn,"repeatsame","")))) { #DOELSE
|
if (defined ($hash->{do}{$max_cond}{0}) or ($max_cond == 1 and !(AttrVal($pn,"do","") or AttrVal($pn,"repeatsame","")))) { #DOELSE
|
||||||
if (DOIF_SetSleepTimer($hash,$last_cond,$max_cond,0,$device,$timerNr)) {
|
if (DOIF_SetSleepTimer($hash,$last_cond,$max_cond,0,$device,$timerNr,undef)) {
|
||||||
DOIF_cmd ($hash,$max_cond,0,$event) ;
|
DOIF_cmd ($hash,$max_cond,0,$event) ;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1070,9 +1079,9 @@ DOIF_SetTimer($$)
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub
|
sub
|
||||||
DOIF_SetSleepTimer($$$$$$)
|
DOIF_SetSleepTimer($$$$$$$)
|
||||||
{
|
{
|
||||||
my ($hash,$last_cond,$nr,$subnr,$device,$timerNr)=@_;
|
my ($hash,$last_cond,$nr,$subnr,$device,$timerNr,$repeatcmd)=@_;
|
||||||
my $pn = $hash->{NAME};
|
my $pn = $hash->{NAME};
|
||||||
if (defined $hash->{helper}{cur_cmd_nr}) {
|
if (defined $hash->{helper}{cur_cmd_nr}) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -1098,16 +1107,23 @@ DOIF_SetSleepTimer($$$$$$)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if ($hash->{helper}{sleeptimer} == -1 and ($last_cond != $nr or $subnr > 0
|
||||||
if ($hash->{helper}{sleeptimer} == -1 and ($last_cond != $nr or $subnr > 0 or AttrVal($pn,"do","") eq "always" or AttrVal($pn,"do","") eq "resetwait" or AttrVal($pn,"repeatsame",""))) {
|
or AttrVal($pn,"do","") eq "always"
|
||||||
my @sleeptimer=split(/:/,AttrVal($pn,"wait",""));
|
or AttrVal($pn,"do","") eq "resetwait"
|
||||||
|
or AttrVal($pn,"repeatsame","")
|
||||||
|
or defined($repeatcmd))) {
|
||||||
my $sleeptime=0;
|
my $sleeptime=0;
|
||||||
if ($waitdelsubnr[$subnr]) {
|
if (defined ($repeatcmd)) {
|
||||||
$sleeptime = $waitdelsubnr[$subnr];
|
$sleeptime=$repeatcmd;
|
||||||
} else {
|
} else {
|
||||||
my @sleepsubtimer=split(/,/,defined $sleeptimer[$nr]? $sleeptimer[$nr]: "");
|
my @sleeptimer=split(/:/,AttrVal($pn,"wait",""));
|
||||||
if ($sleepsubtimer[$subnr]) {
|
if ($waitdelsubnr[$subnr]) {
|
||||||
$sleeptime=$sleepsubtimer[$subnr];
|
$sleeptime = $waitdelsubnr[$subnr];
|
||||||
|
} else {
|
||||||
|
my @sleepsubtimer=split(/,/,defined $sleeptimer[$nr]? $sleeptimer[$nr]: "");
|
||||||
|
if ($sleepsubtimer[$subnr]) {
|
||||||
|
$sleeptime=$sleepsubtimer[$subnr];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
($sleeptime,$err)=ReplaceAllReadingsDoIf($hash,$sleeptime,-1,1);
|
($sleeptime,$err)=ReplaceAllReadingsDoIf($hash,$sleeptime,-1,1);
|
||||||
@ -1139,6 +1155,8 @@ DOIF_SetSleepTimer($$$$$$)
|
|||||||
}
|
}
|
||||||
InternalTimer($next_time, "DOIF_SleepTrigger",$hash, 0);
|
InternalTimer($next_time, "DOIF_SleepTrigger",$hash, 0);
|
||||||
return 0;
|
return 0;
|
||||||
|
} elsif (defined($repeatcmd)){
|
||||||
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1158,7 +1176,7 @@ DOIF_SleepTrigger ($)
|
|||||||
my $pn = $hash->{NAME};
|
my $pn = $hash->{NAME};
|
||||||
readingsSingleUpdate ($hash, "wait_timer", "no timer",1);
|
readingsSingleUpdate ($hash, "wait_timer", "no timer",1);
|
||||||
# if (!AttrVal($hash->{NAME},"disable","")) {
|
# if (!AttrVal($hash->{NAME},"disable","")) {
|
||||||
if (ReadingsVal($pn,"mode","") ne "disable") {
|
if (ReadingsVal($pn,"mode","") ne "disabled") {
|
||||||
DOIF_cmd ($hash,$sleeptimer,$sleepsubtimer,$hash->{helper}{sleepdevice});
|
DOIF_cmd ($hash,$sleeptimer,$sleepsubtimer,$hash->{helper}{sleepdevice});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1840,7 +1858,7 @@ Verzögerungen können mit Hilfe des Attributs <code>timerWithWait</code> auf Ti
|
|||||||
<br>
|
<br>
|
||||||
<u>Anwendungsbeispiel</u>: Lampe soll zufällig nach Sonnenuntergang verzögert werden.<br>
|
<u>Anwendungsbeispiel</u>: Lampe soll zufällig nach Sonnenuntergang verzögert werden.<br>
|
||||||
<br>
|
<br>
|
||||||
<code>define di_rand_sunset([{sunset()}])(set lamp on)<br>
|
<code>define di_rand_sunset DOIF ([{sunset()}])(set lamp on)<br>
|
||||||
attr di_rand_sunset wait rand(1200)<br>
|
attr di_rand_sunset wait rand(1200)<br>
|
||||||
attr di_rand_sunset timerWithWait<br>
|
attr di_rand_sunset timerWithWait<br>
|
||||||
attr di_rand_sunset do always</code><br>
|
attr di_rand_sunset do always</code><br>
|
||||||
@ -1890,6 +1908,41 @@ Das Attribut <code>do resetwait</code> impliziert eine beliebige Wiederholung wi
|
|||||||
attr di_push wait 1800<br>
|
attr di_push wait 1800<br>
|
||||||
attr di_push do resetwait</code><br>
|
attr di_push do resetwait</code><br>
|
||||||
<br>
|
<br>
|
||||||
|
<b>Wiederholung von Befehlsausführung</b><br>
|
||||||
|
<br>
|
||||||
|
Wiederholungen der Ausführung von Kommandos werden pro Befehlsfolge über das Attribut "repeatcmd" definiert. Syntax:<br>
|
||||||
|
<br>
|
||||||
|
<code>attr <DOIF-modul> repeatcmd <Sekunden für Befehlsfolge des ersten DO-Falls>:<Sekunden für Befehlsfolge des zweiten DO-Falls>:...<br></code>
|
||||||
|
<br>
|
||||||
|
Statt Sekundenangaben können ebenfalls Stati in eckigen Klammen oder Perlbefehle angegeben werden.<br>
|
||||||
|
<br>
|
||||||
|
Die Wiederholung findet so lange statt, bis der Zustand des Moduls durch einen anderen DO-Fall wechselt.<br>
|
||||||
|
<br>
|
||||||
|
<u>Anwendungsbeispiel</u>: Nach dem Eintreffen des Ereignisses wird die push-Meldung stündlich wiederholt, bis Frost ungleich "on" ist.<br>
|
||||||
|
<br>
|
||||||
|
<code>define di_push DOIF ([frost] eq "on")(set pushmsg "danger of frost")<br>
|
||||||
|
attr di_push repeatcmd 3600</code><br>
|
||||||
|
<br>
|
||||||
|
Eine Begrenzung der Wiederholungen kann mit dem Attribut repeatsame vorgenommen werden<br>
|
||||||
|
<code>attr di_push repeatsame 3</code><br>
|
||||||
|
<br>
|
||||||
|
Ebenso lässt sich das repeatcmd-Attribut mit Zeitangaben kombinieren.<br>
|
||||||
|
<br>
|
||||||
|
<u>Anwendungsbeispiel</u>: Wiederholung ab einem Zeitpunkt<br>
|
||||||
|
<br>
|
||||||
|
<code>define di_alarm_clock DOIF ([08:00])(set alarm_clock on)<br>
|
||||||
|
attr di_alarm_clock repeatcmd 300<br>
|
||||||
|
attr di_alarm_clock repeatsame 10<br>
|
||||||
|
attr di_alarm_clock do always</code><br>
|
||||||
|
<br>
|
||||||
|
Ab 8:00 Uhr wird 10 mal Weckton alle 5 Minuten wiederholt.<br>
|
||||||
|
<br>
|
||||||
|
<u>Anwendungsbeispiel</u>: Anwesenheitssimulation<br>
|
||||||
|
<br>
|
||||||
|
<code>define di_presence_simulation DOIF ([19:00-00:00])(set lamp on-for-timer {(int(rand(1800)+300))}) DOELSE <br>
|
||||||
|
attr di_presence_simulation repeatcmd rand(3600)+2100<br>
|
||||||
|
attr di_presence_simulation do always</code><br>
|
||||||
|
<br>
|
||||||
<b>Zwangspause für das Ausführen eines Kommandos seit der letzten Zustandsänderung</b><br>
|
<b>Zwangspause für das Ausführen eines Kommandos seit der letzten Zustandsänderung</b><br>
|
||||||
<br>
|
<br>
|
||||||
Mit dem Attribut <code>cmdpause <Sekunden für cmd_1>:<Sekunden für cmd_2>:...</code> wird die Zeitspanne in Sekunden angegeben für eine Zwangspause seit der letzten Zustandsänderung.
|
Mit dem Attribut <code>cmdpause <Sekunden für cmd_1>:<Sekunden für cmd_2>:...</code> wird die Zeitspanne in Sekunden angegeben für eine Zwangspause seit der letzten Zustandsänderung.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user