diff --git a/fhem/FHEM/95_Alarm.pm b/fhem/FHEM/95_Alarm.pm index 55db8bdec..f18047351 100644 --- a/fhem/FHEM/95_Alarm.pm +++ b/fhem/FHEM/95_Alarm.pm @@ -43,13 +43,15 @@ my $alarmlinkname = "Alarms"; # link text my $alarmhiddenroom = "AlarmRoom"; # hidden room my $alarmpublicroom = "Alarm"; # public room my $alarmno = 8; -my $alarmversion = "4.05"; +my $alarmversion = "5.0"; my %alarm_transtable_EN = ( "ok" => "OK", "notok" => "Not OK", + "cond" => "Condition", "start" => "Start", "end" => "End", + "autocan" => "AutoCancel", "status" => "Status", "notstarted" => "Not started", "next" => "Next", @@ -101,9 +103,11 @@ my %alarm_transtable_EN = ( my %alarm_transtable_DE = ( "ok" => "OK", - "notok" => "Nicht OK", + "notok" => "Nicht OK", + "cond" => "Bedingung", "start" => "Start", "end" => "Ende", + "autocan" => "AutoWiderruf", "status" => "Status", "notstarted" => "Nicht gestartet", "next" => "Nächste", @@ -174,7 +178,7 @@ sub Alarm_Initialize ($) { my $attst = "lockstate:locked,unlocked testbutton:0,1 statedisplay:simple,color,table,none noicons iconmap disarmcolor ". "armwaitcolor armcolor alarmcolor armdelay armwait armact disarmact cancelact"; for( my $level=0;$level<$alarmno;$level++ ){ - $attst .=" level".$level."start level".$level."end level".$level."msg level".$level."xec level".$level."onact level".$level."offact "; + $attst .=" level".$level."cond level".$level."start level".$level."end level".$level."autocan level".$level."msg level".$level."onact level".$level."offact "; } $hash->{AttrList} = $attst; @@ -198,6 +202,7 @@ sub Alarm_Initialize ($) { return undef; } + ######################################################################################### # # Alarm_Define - Implements DefFn function @@ -253,23 +258,6 @@ sub Alarm_Define ($$) { return; } -sub Alarm_transform($){ - my ($hash) = @_; - - Log 1,"[Alarm] transforming old data format into new one"; - - my $md = 0; - for( my $i=0;$i<$alarmno;$i++){ - if( defined(AttrVal($hash->{NAME},"level".$i."xec",undef)) ){ - $md = 1; - $hash->{DATA}{"armstate"}{"level".$i} = AttrVal($hash->{NAME},"level".$i."xec",""); - fhem("deleteattr ".$hash->{NAME}." level".$i."xec"); - } - } - Alarm_save($hash) - if( $md==1 ); -} - ######################################################################################### # # Alarm_Undef - Implements Undef function @@ -451,6 +439,11 @@ sub Alarm_getsettings($$$){ if( $aval[0] eq "" || $aval[1] eq "" ){ Log3 $hash, 1, "[Alarm] Settings $avl incomplete for alarmActor $dev"; } + #-- check if empty unset action + if( !defined($aval[3]) ){ + $aval[3] = $aval[2]; + $aval[2] = ""; + } #-- check delay time if( $aval[3] =~ /^\d+$/ ){ if( $aval[3] > 3559 ){ @@ -608,29 +601,51 @@ sub Alarm_Exec($$$$$){ if( $act eq "on" ){ #-- only if this level is armed and not yet active if( ($xec eq "armed") && ($xac eq "armed") ){ + #-- check for condition + my $cond = AttrVal($name, "level".$level."cond", 1); + $cond =~ s/\$NAME/$dev/g; + if( eval($cond) ne "1" ){ + Log3 $hash,1,"[Alarm $level] Cannot be executed due to condition {$cond} not equal to 1 for level".$level."cond"; + return; + } + #-- check for time - my $start = AttrVal($name, "level".$level."start", 0); + my $start = AttrVal($name, "level".$level."start", "0:00"); if( index($start, '{') != -1){ $start = eval($start); } + my @st = split(':',$start); if( (int(@st)>3) || (int(@st)<2) || ($st[0] > 23) || ($st[0] < 0) || ($st[1] > 59) || ($st[1] < 0) ){ Log3 $hash,1,"[Alarm $level] Cannot be executed due to wrong time spec $start for level".$level."start"; return; } - my $end = AttrVal($name, "level".$level."end", 0); + my $end = AttrVal($name, "level".$level."end", "23:59"); if( index($end, '{') != -1){ $end = eval($end); } + my @et = split(':',$end); if( (int(@et)>3) || (int(@et)<2) || ($et[0] > 23) || ($et[0] < 0) || ($et[1] > 59) || ($et[1] < 0) ){ Log3 $hash,1,"[Alarm $level] Cannot be executed due to wrong time spec $end for level".$level."end"; return; } + my $dur = AttrVal($name, "level".$level."autocan", "0:00"); + if( index($dur, '{') != -1){ + $dur = eval($dur); + } + + my @dt = split(':',$dur); + if( (int(@dt)>3) || (int(@dt)<2) || ($dt[0] > 23) || ($dt[0] < 0) || ($dt[1] > 59) || ($dt[1] < 0) ){ + Log3 $hash,1,"[Alarm $level] Cannot be executed due to wrong time spec $dur for level".$level."autocan"; + return; + } + my $stp = $st[0]*60+$st[1]; my $etp = $et[0]*60+$et[1]; + my $dtp = $dt[0]*60+$dt[1]; my ($sec, $min, $hour, $day, $month, $year, $wday, $yday, $isdst) = localtime(time); my $ntp = $hour*60+$min; @@ -659,6 +674,15 @@ sub Alarm_Exec($$$$$){ $msg = Alarm_getstate($hash)." ".$mga; readingsSingleUpdate( $hash, "state", $msg, 1 ); $msg = "[Alarm $level] raised from device $dev with event $evt"; + + #-- set up timer for auto cancel + if( $dur ne "0:00" ){ + my $cmd = "alarm".$level.".autocancel at +$dur {Alarm_Exec('$name',$level,'".$alarm_tt->{"autocan"}."','dummy','off')}"; + CommandDefine(undef,$cmd); + CommandAttr (undef,'alarm'.$level.'.autocancel room '.$alarmpublicroom); + CommandAttr (undef,'alarm'.$level.'.autocancel group alarmHelper'); + } + #-- calling actors AFTER state update $cmd = AttrVal($name, "level".$level."onact", 0); $cmd =~ s/\$NAME/$dev/g; @@ -686,6 +710,7 @@ sub Alarm_Exec($$$$$){ if( ($xac ne "armed")&&($xac ne "disarmed") ){ #-- TODO: ohne intAt auskommen #-- deleting all running ats + CommandDelete(undef,'alarm'.$level.'.autocancel'); $dly = sprintf("alarm%1ddly",$level); foreach my $d ( devspec2array("NAME=alarm.dly.*")) { Log3 $hash,1,"[Alarm] Killing delayed action $d"; @@ -834,9 +859,6 @@ sub Alarm_CreateNotifiers($){ return "State locked, cannot create new notifiers"; } - #-- temporary code: transferm from attributes to hash - #Alarm_transform($hash); - for( my $level=0;$level<$alarmno;$level++ ){ #-- delete old defs in any case @@ -1198,6 +1220,7 @@ sub Alarm_widget($){ } } + ######################################################################################### # # Alarm_Html - returns HTML code for the Alarm page @@ -1206,8 +1229,7 @@ sub Alarm_widget($){ # ######################################################################################### -sub Alarm_Html($) -{ +sub Alarm_Html($){ my ($name) = @_; my $ret = ""; @@ -1333,28 +1355,38 @@ sub Alarm_Html($) $ret .= "".$alarm_tt->{"cancelbutton"}." ↠ ".$alarm_tt->{"cancelaction"}." "; $ret .= sprintf("",(AttrVal($name, "cancelact","") eq "1")?"":AttrVal($name, "cancelact","")); $ret .= ""; - $ret .= "".$alarm_tt->{"level"}."".$alarm_tt->{"time"}." [hh:mm]
". - $alarm_tt->{"start"}."    ".$alarm_tt->{"end"}." ".$alarm_tt->{"messagepart"}." II". - "".$alarm_tt->{"arm"}."/".$alarm_tt->{"cancel"}."\n"; + $ret .= "". + "". + "\n"; + #-- foreach level for( my $k=0;$k<$alarmno;$k++ ){ $row++; - my $sval = AttrVal($name, "level".$k."start", 0); + my $cval = AttrVal($name, "level".$k."cond", 1); + my $sval = AttrVal($name, "level".$k."start", "0:00"); $sval = "" if( $sval eq "1"); - my $eval = AttrVal($name, "level".$k."end", 0); + my $eval = AttrVal($name, "level".$k."end", "23:59"); $eval = "" if( $eval eq "1"); - my $mval = AttrVal($name, "level".$k."msg", 0); + my $oval = AttrVal($name, "level".$k."autocan", "0:00"); + $oval = "" + if( $oval eq "1"); + my $mval = AttrVal($name, "level".$k."msg", "--"); $mval = "" if( $mval eq "1"); my $xval = $hash->{DATA}{"armstate"}{"level".$k}; $ret .= sprintf("\n", ($row&1)?"odd":"even"); - $ret .= "". + $ret .= "". ""; - $ret .= sprintf("\n"; + $ret .= sprintf("\n"; } $ret .= "
".$alarm_tt->{"time"}." [hh:mm]
".$alarm_tt->{"level"}."".$alarm_tt->{"cond"}. + "".$alarm_tt->{"start"}."".$alarm_tt->{"end"}. + "".$alarm_tt->{"autocan"}. + "".$alarm_tt->{"messagepart"}." II".$alarm_tt->{"arm"}."".$alarm_tt->{"cancel"}."
".$alarm_tt->{"alarm"}." $k   ". - "". + "". + "". + "",($xval eq "armed")?"checked=\"checked\"":""). - "{"cancel"}."\" onclick=\"javascript:alarm_cancel('$name','$k')\"/>
",($xval eq "armed")?"checked=\"checked\"":""). + "{"cancel"}."\" onclick=\"javascript:alarm_cancel('$name','$k')\"/>
"; @@ -1428,7 +1460,7 @@ sub Alarm_Html($) if( AttrVal($name,"testbutton",0) == 1); $ret .= "\n"; } - } + } $ret .= "\n"; $ret .= ""; @@ -1516,8 +1548,7 @@ sub Alarm_Html($)
  • simple = OXOOOOO
  • color = 0 1 2 3 4 5 6 7
  • -
  • table = HTML mini table with colored fields for alarms -
  • +
  • table = HTML mini table with colored fields for alarms
  • none = no state display
  • @@ -1535,14 +1566,14 @@ sub Alarm_Html($)
  • attr <name> armwait action
    FHEM action to be carried out immediately after the arm event
  • attr <name> armact action -
    FHEM action to be carried out at the arme event after the delay time
  • +
    FHEM action to be carried out at the arm event after the delay time
  • attr <name> disarmact action
    FHEM action to be carried out on the disarming of an alarm
  • attr <name> cancelact action
    FHEM action to be carried out on the canceling of an alarm
  • For each of the 8 alarm levels, several attributes hold the alarm setup. They should not be changed by hand, but through the web - interface to avoid confusion: level<level>start, level<level>end, + interface to avoid confusion: level<level>cond, level<level>start, level<level>end, level<level>autocan, level<level>msg, level<level>onact, level<level>offact
  • Standard attributes alias, comment,
  • attr <name> norepeat 0|1 +
    if set to 1, repeated executions of wakeup, sleep and other timer events from the weekly programme will be suppressed.
  • attr <name> stateDevices (<device>:<state-unsecured>:<state-secured>:<state-protected>:<state-guarded>,)*
    comma separated list of devices and their state in each of the house (security) states. Each of the listed devices will be checked in the interval given by the stateInterval attribute for its proper state, and a stateWarning function will be called if it is not in the proper state.
  • diff --git a/fhem/www/pgm2/alarm.js b/fhem/www/pgm2/alarm.js index 130ac27d7..68c694afc 100644 --- a/fhem/www/pgm2/alarm.js +++ b/fhem/www/pgm2/alarm.js @@ -1,6 +1,6 @@ //######################################################################################## // alarm.js -// Version 4.03 +// Version 5.0 // See 95_Alarm for licensing //######################################################################################## //# Prof. Dr. Peter A. Henning @@ -258,8 +258,10 @@ function alarm_set(name) { for (var i = 0; i < alarmno; i++) { + FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '=attr%20' + name + '%20level' + i + 'cond%20' + document.getElementById('l' + i + 'c').value); FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '=attr%20' + name + '%20level' + i + 'start%20' + document.getElementById('l' + i + 's').value); FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '=attr%20' + name + '%20level' + i + 'end%20' + document.getElementById('l' + i + 'e').value); + FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '=attr%20' + name + '%20level' + i + 'autocan%20' + document.getElementById('l' + i + 'o').value); FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '=attr%20' + name + '%20level' + i + 'msg%20' + document.getElementById('l' + i + 'm').value); if (document.getElementById('l' + i + 'x').checked == true) { val = "armed";