diff --git a/fhem/FHEM/98_DOIF.pm b/fhem/FHEM/98_DOIF.pm index e2d66d1f5..ce75cc53e 100644 --- a/fhem/FHEM/98_DOIF.pm +++ b/fhem/FHEM/98_DOIF.pm @@ -74,7 +74,7 @@ DOIF_Initialize($) $hash->{UndefFn} = "DOIF_Undef"; $hash->{AttrFn} = "DOIF_Attr"; $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 repeatcmd waitsame waitdel cmdpause timerWithWait:1,0 notexist selftrigger:wait,all timerevent:1,0 checkReadingEvent:1,0 addStateEvent:1,0 checkall:1,0 setList readingList ".$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:1,0 notexist selftrigger:wait,all timerevent:1,0 checkReadingEvent:1,0 addStateEvent:1,0 checkall:event,timer,all setList:textField-long readingList ".$readingFnAttributes; } @@ -676,7 +676,7 @@ sub ReplaceAllReadingsDoIf($$$$) } $cmd.=$beginning.$block; } - return ($definition,"no trigger in condition") if ($condition >=0 and $event == 0); + #return ($definition,"no trigger in condition") if ($condition >=0 and $event == 0); return ($cmd,""); } @@ -866,6 +866,7 @@ DOIF_time my $begin=$hash->{realtime}{$b}; my $end=$hash->{realtime}{$e}; my $err; + return 0 if ($begin eq $end); ($days,$err)=ReplaceAllReadingsDoIf($hash,$days,-1,1); if ($err) { my $errmsg="error in days: $err"; @@ -1273,24 +1274,33 @@ DOIF_Trigger ($$) my $ret; my $err; my $doelse=0; - my $event; + my $event="$device"; my $pn=$hash->{NAME}; my $max_cond=keys %{$hash->{condition}}; my $last_cond=ReadingsVal($pn,"cmd_nr",0)-1; my $j; my @triggerEvents; + if (AttrVal($pn, "checkall", 0) =~ "1|all|timer" and $device eq "") { + for ($j=0; $j<$hash->{helper}{last_timer};$j++) { + if ($hash->{timer}{$j}==1) { + $timerNr=$j; #first timer + last; + } + } + } for (my $i=0; $i<$max_cond;$i++) { if ($device eq "") {# timer - next if (!defined ($hash->{timers}{$i})); my $found=0; - foreach $j (split(" ",$hash->{timers}{$i})) { - if ($hash->{timer}{$j} == 1) { - $found=1; - $timerNr=$j; - last; - } + if (defined ($hash->{timers}{$i})) { + foreach $j (split(" ",$hash->{timers}{$i})) { + if ($hash->{timer}{$j} == 1) { + $found=1; + $timerNr=$j; + last; + } + } } - next if (!$found); + next if (!$found and AttrVal($pn, "checkall", 0) !~ "1|all|timer"); $event="timer_".($timerNr+1); @triggerEvents=($event); $hash->{helper}{triggerEvents}=\@triggerEvents; @@ -1298,7 +1308,7 @@ DOIF_Trigger ($$) $hash->{helper}{event}=$event; } else { #event if (!CheckRegexpDoIf($hash, $device, $hash->{helper}{triggerEvents}, $i)) { - if (!AttrVal($pn, "checkall", 0)) { + if (AttrVal($pn, "checkall", 0) !~ "1|all|event") { next if (!defined ($hash->{devices}{$i})); next if ($hash->{devices}{$i} !~ / $device /); next if (AttrVal($pn, "checkReadingEvent", 0) and !CheckReadingDoIf ($hash->{readings}{$i},$hash->{helper}{triggerEventsState}) and (defined $hash->{internals}{$i} ? $hash->{internals}{$i} !~ / $device:.+ /:1)) @@ -1372,9 +1382,16 @@ DOIF_Notify($$) { DOIF_SetTimer($hash,"DOIF_TimerTrigger",$j); } + } + if (AttrVal($pn,"initialize",0) and !AttrVal($pn,"disable",0)) { + readingsBeginUpdate($hash); + readingsBulkUpdate ($hash,"state",AttrVal($pn,"initialize",0)); + readingsBulkUpdate ($hash,"cmd_nr","0"); + readingsBulkUpdate ($hash,"cmd",0); + readingsEndUpdate($hash, 0); } } - + if (($hash->{itimer}{all}) and $hash->{itimer}{all} =~ / $dev->{NAME} /) { for (my $j=0; $j<$hash->{helper}{last_timer};$j++) { if (AttrVal($pn, "checkReadingEvent", 0) and CheckiTimerDoIf ($dev->{NAME},$hash->{time}{$j},$eventas) @@ -1441,16 +1458,29 @@ DOIF_TimerTrigger ($) my $localtime=${$timer}->{localtime}; delete $hash->{triggertime}{$localtime}; my $ret; + my ($now, $microseconds) = gettimeofday(); + my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($now); $hash->{helper}{cur_cmd_nr}="timer $localtime" if (AttrVal($hash->{NAME},"selftrigger","") ne "all"); #$hash->{helper}{cur_cmd_nr}="timer $localtime"; for (my $j=0; $j<$hash->{helper}{last_timer};$j++) { if ($hash->{localtime}{$j} == $localtime) { + if (defined ($hash->{interval}{$j})) { + if ($hash->{interval}{$j} != -1) { + if ($hash->{realtime}{$j} eq $hash->{realtime}{$hash->{interval}{$j}}) { + $hash->{timer}{$hash->{interval}{$j}}=0; + next; + } + } + } $hash->{timer}{$j}=1; + if (!DOIF_time_once($hash,$j,$wday,$hash->{days}{$j})) {#check days + $hash->{timer}{$j}=0; + } } } $ret=DOIF_Trigger ($hash,"") if (ReadingsVal($pn,"mode","") ne "disabled"); for (my $j=0; $j<$hash->{helper}{last_timer};$j++) { - if ($hash->{timer}{$j} == 1) { + if ($hash->{localtime}{$j} == $localtime) { $hash->{timer}{$j}=0; if (!AttrVal($hash->{NAME},"disable","")) { if (defined ($hash->{interval}{$j})) { @@ -1927,12 +1957,6 @@ DOIF_Attr(@) #delete ($defs{$hash->{NAME}}{READINGS}{wait_timer}); readingsSingleUpdate ($hash, "wait_timer", "no timer",1); $hash->{helper}{sleeptimer}=-1; - } elsif($a[0] eq "set" && $a[2] eq "initialize") { - readingsBeginUpdate($hash); - readingsBulkUpdate ($hash,"state",$a[3]); - readingsBulkUpdate ($hash,"cmd_nr","0"); - readingsBulkUpdate ($hash,"cmd",0); - readingsEndUpdate($hash, 1); } elsif($a[0] eq "del" && $a[2] eq "repeatsame") { delete ($defs{$hash->{NAME}}{READINGS}{cmd_count}); } elsif($a[0] eq "del" && $a[2] eq "waitsame") { @@ -1987,7 +2011,7 @@ DOIF_Set($@) my $setList = AttrVal($pn, "setList", " "); $setList =~ s/\n/ /g; - return "unknown argument ? for $pn, choose one of disable initialize enable $setList" if($arg eq "?"); + return "unknown argument ? for $pn, choose one of disable:noArg initialize:noArg enable:noArg $setList" if($arg eq "?"); my @rl = split(" ", AttrVal($pn, "readingList", "")); my $doRet; eval { @@ -2001,7 +2025,7 @@ DOIF_Set($@) return if($doRet); - return "unknown argument $arg for $pn, choose one of disable initialize enable $setList"; + return "unknown argument $arg for $pn, choose one of disable:noArg initialize:noArg enable:noArg $setList"; } return $ret; @@ -2150,6 +2174,8 @@ Kombinierte Ereignis- und Zeitsteuerung: define di_lamp DOIF ([06:00-09:00 Initialisieren des Moduls
Weitere Anwendungsbeispiele
Zu beachten
+ DOIF im FHEM-Wiki
+ DOIF im FHEM-Forum
Kurzreferenz

@@ -2158,7 +2184,7 @@ Kombinierte Ereignis- und Zeitsteuerung: define di_lamp DOIF ([06:00-09:00 - Attribute
+ Attribute
+ Attribute
    @@ -3387,8 +3451,12 @@ Hier passiert das nicht mehr, da die ursprünglichen Zustände cmd_1 und cmd_2 j
    Gerät vollständig deaktivieren attr <name> disable <0|1>
    1 deaktiviert das Modul vollständig, 0 aktiviert es.

    -
    Alle Bedingungen prüfen attr <name> checkall <0|1>
    -
    1 Alle Bedingungen werden geprüft und die Befehle der ersten wahren Bedingung ausgeführt, 0 Standartverhalten
    +
    Alle Bedingungen prüfen attr <name> checkall <event|timer|all>
    +
    event Alle Bedingungen werden geprüft, wenn ein Event-Trigger (Ereignisauslöser) auslöst.
    + timer Alle Bedingungen werden geprüft, wenn ein Timer-Trigger (Zeitauslöser) auslöst.
    + all   Alle Bedingungen werden geprüft.
    + Die Befehle nach der ersten wahren Bedingung werden ausgeführt. +

    Eindeutige Statuserkennung attr <name> addStateEvent <0|ungleich Null>
    fügt einem Gerätestatus-Event "state:" hinzu. ungleich Null aktiviert, 0 deaktiviert, siehe auch addStateEvent