From 495784ede01eac6e45f8ee1946b930b712d8eea5 Mon Sep 17 00:00:00 2001 From: pahenning <> Date: Tue, 3 Mar 2015 18:44:55 +0000 Subject: [PATCH] Alarm.pm: New version 2.5 git-svn-id: https://svn.fhem.de/fhem/trunk@8146 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/95_Alarm.pm | 67 +++++++++++++++++++++++++++++++------------ 1 file changed, 48 insertions(+), 19 deletions(-) diff --git a/fhem/FHEM/95_Alarm.pm b/fhem/FHEM/95_Alarm.pm index 70349adf2..19875c625 100644 --- a/fhem/FHEM/95_Alarm.pm +++ b/fhem/FHEM/95_Alarm.pm @@ -40,7 +40,7 @@ my $alarmname = "Alarms"; # link text my $alarmhiddenroom = "AlarmRoom"; # hidden room my $alarmpublicroom = "Alarm"; # public room my $alarmno = 8; -my $alarmversion = "2.4"; +my $alarmversion = "2.5"; ######################################################################################### # @@ -289,20 +289,38 @@ sub Alarm_Exec($$$$$){ return if ($dev eq 'global'); - #-- raising the alarm + #-- raising the alarmy if( $act eq "on" ){ #-- only if this level is armed and not yet active if( ($xec eq "armed") && ($xac eq "off") ){ - #-- check for time (attribute values have been controlled in CreateNotifiers) - my @st = split(':',AttrVal($name, "level".$level."start", 0)); - my @et = split(':',AttrVal($name, "level".$level."end", 0)); + #-- check for time + my $start = AttrVal($name, "level".$level."start", 0); + 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); + 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 $stp = $st[0]*60+$st[1]; my $etp = $et[0]*60+$et[1]; my ($sec, $min, $hour, $day, $month, $year, $wday, $yday, $isdst) = localtime(time); my $ntp = $hour*60+$min; - if( ($ntp <= $etp) && ($ntp >= $stp) ){ + if( (($stp < $etp) && ($ntp <= $etp) && ($ntp >= $stp)) || (($stp > $etp) && (($ntp <= $etp) || ($ntp >= $stp))) ){ #-- raised by sensor (attribute values have been controlled in CreateNotifiers) @sta = split('\|', AttrVal($dev, "alarmSettings", 0)); if( $sta[2] ){ @@ -476,18 +494,29 @@ sub Alarm_CreateNotifiers($){ fhem('delete alarm'.$level.'.disarm.N' ) if( defined $defs{'alarm'.$level.'.disarm.N'}); + my $start = AttrVal($name, "level".$level."start", 0); + my @st; + if( index($start,'{')!=-1 ){ + Log3 $hash,1,"[Alarm $level] perl function $start detected for level".$level."start, currently the function gives ".eval($start); + }else{ + @st = split(':',($start ne '') ? $start :'0:00'); + if( (int(@st)!=2) || ($st[0] > 23) || ($st[0] < 0) || ($st[1] > 59) || ($st[1] < 0) ){ + Log3 $hash,1,"[Alarm $level] Will not be executed due to wrong time spec $start for level".$level."start"; + next; + } + } - my @st = split(':',(AttrVal($name, "level".$level."start", 0) ne '')?AttrVal($name, "level".$level."start", 0):'0:00'); - my @et = split(':',(AttrVal($name, "level".$level."end", 0) ne '')?AttrVal($name, "level".$level."end", 0):'23:59'); - - if( (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 ".AttrVal($name, "level".$level."start", 0)." for level".$level."start"; - next; - } - if( (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 ".AttrVal($name, "level".$level."end", 0)." for level".$level."end"; - next; - } + my $end = AttrVal($name, "level".$level."end", 0); + my @et; + if( index($end,'{')!=-1 ){ + Log3 $hash,1,"[Alarm $level] perl function $end detected for level".$level."end, currently the function gives ".eval($end); + }else{ + @et = split(':',($end ne '') ? $end :'23:59'); + if( (int(@et)!=2) || ($et[0] > 23) || ($et[0] < 0) || ($et[1] > 59) || ($et[1] < 0) ){ + Log3 $hash,1,"[Alarm $level] Will not be executed due to wrong time spec $end for level".$level."end"; + next; + } + } #-- now set up the command for cancel alarm, and contained in this loop all other notifiers as well my $cmd = ''; @@ -701,8 +730,8 @@ sub Alarm_Html($) my $xval = AttrVal($name, "level".$k."xec", 0); $ret .= sprintf("Alarm $k\n", ($row&1)?"odd":"even"); - $ret .= "Start  ". - "End ". + $ret .= "Start  ". + "End ". ""; $ret .= sprintf("",($xval eq "armed")?"checked=\"checked\"":""). "\n";