From 571f1502a51019f970277ccec012e54d473b3e64 Mon Sep 17 00:00:00 2001 From: deespe Date: Sat, 13 Feb 2021 13:14:19 +0000 Subject: [PATCH] 22_HOMEMODE: fix calendar placeholders not being replaced, improved empty battery handling while adding to HOMEMODE, improved function HOMEMODE_name2alias for better alias handling, other minor improvements git-svn-id: https://svn.fhem.de/fhem/trunk@23732 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/22_HOMEMODE.pm | 214 +++++++++++++++++++-------------------- 1 file changed, 107 insertions(+), 107 deletions(-) diff --git a/fhem/FHEM/22_HOMEMODE.pm b/fhem/FHEM/22_HOMEMODE.pm index f54e59900..2467aa9f1 100644 --- a/fhem/FHEM/22_HOMEMODE.pm +++ b/fhem/FHEM/22_HOMEMODE.pm @@ -16,7 +16,7 @@ use Time::HiRes qw(gettimeofday); use HttpUtils; use vars qw{%attr %defs %modules $FW_CSRF}; -my $HOMEMODE_version = "1.5.3"; +my $HOMEMODE_version = "1.5.4"; my $HOMEMODE_Daytimes = "05:00|morning 10:00|day 14:00|afternoon 18:00|evening 23:00|night"; my $HOMEMODE_Seasons = "03.01|spring 06.01|summer 09.01|autumn 12.01|winter"; my $HOMEMODE_UserModes = "gotosleep,awoken,asleep"; @@ -60,7 +60,7 @@ sub HOMEMODE_Define($$) if (!$resdev) { my @resdevs; - foreach (devspec2array("TYPE=RESIDENTS")) + for (devspec2array("TYPE=RESIDENTS")) { push @resdevs,$_; } @@ -160,7 +160,7 @@ sub HOMEMODE_Notify($$) } elsif (grep /^DEFINED/,@{$events}) { - foreach (@{$events}) + for (@{$events}) { next unless ($_ =~ /^DEFINED\s(.+)$/); my $dev = $1; @@ -200,7 +200,7 @@ sub HOMEMODE_Notify($$) (AttrVal($name,"HomeEventsCalendarDevices",undef) && grep(/^$devname$/,devspec2array(AttrVal($name,"HomeEventsCalendarDevices",""))))) { - foreach my $evt (@{$events}) + for my $evt (@{$events}) { next unless ((HOMEMODE_ID($devname,"Calendar") && $evt =~ /^(start|end):\s(.+)$/) || (HOMEMODE_ID($devname,"holiday") && $evt =~ /^(state):\s(.+)$/)); HOMEMODE_EventCommands($hash,$devname,$1,$2); @@ -258,7 +258,7 @@ sub HOMEMODE_Notify($$) { my $read = AttrVal($name,"HomeSensorsPowerEnergyReadings","power energy"); $read =~ s/ /\|/g; - foreach my $evt (@{$events}) + for my $evt (@{$events}) { next unless ($evt =~ /^($read):\s(.+)$/); HOMEMODE_PowerEnergy($hash,$devname,$1,(split " ",$2)[0]); @@ -268,7 +268,7 @@ sub HOMEMODE_Notify($$) elsif ($hash->{SENSORSSMOKE} && grep(/^$devname$/,split /,/,$hash->{SENSORSSMOKE})) { my $read = AttrVal($name,"HomeSensorsSmokeReading","state"); - foreach my $evt (@{$events}) + for my $evt (@{$events}) { next unless ($evt =~ /^$read:\s(.+)$/); HOMEMODE_Smoke($hash,$devname,$1); @@ -292,7 +292,7 @@ sub HOMEMODE_Notify($$) my $read = AttrVal($name,"HomeSensorsLuminanceReading","luminance"); if (grep /^$read:\s.+$/,@{$events}) { - foreach my $evt (@{$events}) + for my $evt (@{$events}) { next unless ($evt =~ /^$read:\s(.+)$/); HOMEMODE_Luminance($hash,$devname,(split " ",$1)[0]); @@ -304,7 +304,7 @@ sub HOMEMODE_Notify($$) { my $temp; my $humi; - foreach my $evt (@{$events}) + for my $evt (@{$events}) { next unless ($evt =~ /^(humidity|temperature):\s(.+)$/); $temp = (split " ",$2)[0] if ($1 eq "temperature"); @@ -329,7 +329,7 @@ sub HOMEMODE_Notify($$) if (AttrVal($name,"HomeSensorHumidityOutside",undef) && $devname eq AttrVal($name,"HomeSensorHumidityOutside","") && grep /^humidity:\s/,@{$events}) { $hash->{helper}{externalHumidity} = 1; - foreach my $evt (@{$events}) + for my $evt (@{$events}) { next unless ($evt =~ /^humidity:\s(.+)$/); my $val = (split " ",$1)[0]; @@ -343,7 +343,7 @@ sub HOMEMODE_Notify($$) my $read = (split /:/,AttrVal($name,"HomeSensorWindspeed",""))[1]; if (grep /^$read:\s(.+)$/,@{$events}) { - foreach my $evt (@{$events}) + for my $evt (@{$events}) { next unless ($evt =~ /^$read:\s(.+)$/); my $val = (split " ",$1)[0]; @@ -358,7 +358,7 @@ sub HOMEMODE_Notify($$) my $read = (split /:/,AttrVal($name,"HomeSensorAirpressure",""))[1]; if (grep /^$read:\s(.+)$/,@{$events}) { - foreach my $evt (@{$events}) + for my $evt (@{$events}) { next unless ($evt =~ /^$read:\s(.+)$/); my $val = (split " ",$1)[0]; @@ -372,7 +372,7 @@ sub HOMEMODE_Notify($$) { my $resident; my $residentregex; - foreach (split /,/,$hash->{RESIDENTS}) + for (split /,/,$hash->{RESIDENTS}) { my $regex = lc($_); $regex =~ s/^(rr_|rg_|rp_)//; @@ -388,7 +388,7 @@ sub HOMEMODE_Notify($$) if (ReadingsVal($devname,"presence","") !~ /^maybe/) { my @presentdevicespresent; - foreach my $device (devspec2array("TYPE=$prestype:FILTER=presence=^(maybe.)?(absent|present|appeared|disappeared)")) + for my $device (devspec2array("TYPE=$prestype:FILTER=presence=^(maybe.)?(absent|present|appeared|disappeared)")) { next unless (lc($device) =~ /$residentregex/); push @presentdevicespresent,$device if (ReadingsVal($device,"presence","") =~ /^(present|appeared|maybe.absent)$/); @@ -438,7 +438,7 @@ sub HOMEMODE_Notify($$) my @lowOld = split /,/,ReadingsVal($name,"batteryLow",""); my @low; @low = @lowOld if (@lowOld); - foreach my $evt (@{$events}) + for my $evt (@{$events}) { next unless ($evt =~ /^$read:\s(.+)$/); my $val = $1; @@ -449,7 +449,7 @@ sub HOMEMODE_Notify($$) elsif (grep /^$devname$/,@low) { my @lown; - foreach (@low) + for (@low) { push @lown,$_ if ($_ ne $devname); } @@ -542,7 +542,7 @@ sub HOMEMODE_updateInternals($;$$) my @presdevs = devspec2array("TYPE=$presencetype:FILTER=presence=^(maybe.)?(absent|present|appeared|disappeared)"); my @residentsshort; my @logtexte; - foreach my $resident (split /,/,$hash->{RESIDENTS}) + for my $resident (split /,/,$hash->{RESIDENTS}) { push @allMonitoredDevices,$resident; my $short = lc($resident); @@ -551,7 +551,7 @@ sub HOMEMODE_updateInternals($;$$) if ($autopresence) { my @residentspresdevs; - foreach my $p (@presdevs) + for my $p (@presdevs) { next unless (lc($p) =~ /$short/); push @residentspresdevs,$p; @@ -592,7 +592,7 @@ sub HOMEMODE_updateInternals($;$$) if ($contacts) { my @sensors; - foreach my $s (devspec2array($contacts)) + for my $s (devspec2array($contacts)) { push @sensors,$s; push @allMonitoredDevices,$s if (!grep /^$s$/,@allMonitoredDevices); @@ -609,7 +609,7 @@ sub HOMEMODE_updateInternals($;$$) if ($motion) { my @sensors; - foreach my $s (devspec2array($motion)) + for my $s (devspec2array($motion)) { push @sensors,$s; push @allMonitoredDevices,$s if (!grep /^$s$/,@allMonitoredDevices); @@ -627,7 +627,7 @@ sub HOMEMODE_updateInternals($;$$) { my @sensors; my ($p,$e) = split " ",AttrVal($name,"HomeSensorsPowerEnergyReadings","power energy"); - foreach my $s (devspec2array($power)) + for my $s (devspec2array($power)) { next unless (HOMEMODE_ID($s,undef,$p) && HOMEMODE_ID($s,undef,$e)); push @sensors,$s; @@ -640,7 +640,7 @@ sub HOMEMODE_updateInternals($;$$) { my @sensors; my $r = AttrVal($name,"HomeSensorsSmokeReading","state"); - foreach my $s (devspec2array($smoke)) + for my $s (devspec2array($smoke)) { next unless (HOMEMODE_ID($s,undef,$r)); push @sensors,$s; @@ -652,7 +652,7 @@ sub HOMEMODE_updateInternals($;$$) if ($battery) { my @sensors; - foreach my $s (devspec2array($battery)) + for my $s (devspec2array($battery)) { my $read = AttrVal($name,"HomeSensorsBatteryReading","battery"); my $val = ReadingsVal($s,$read,undef); @@ -662,7 +662,10 @@ sub HOMEMODE_updateInternals($;$$) $hash->{SENSORSBATTERY} = join(",",sort @sensors) if (@sensors); if (!grep(/^$s$/,split(/,/,ReadingsVal($name,"batteryLow","")))) { - CommandTrigger(undef,"$s $read: ok"); + CommandTrigger(undef,"$s $read: ok") if ($val =~ /^(low|nok)$/); + CommandTrigger(undef,"$s $read: 100") if ($val =~ /^\d{1,3}$/); + CommandTrigger(undef,"$s $read: 100%") if ($val =~ /^\d{1,3}%$/); + CommandTrigger(undef,"$s $read: 100 %") if ($val =~ /^\d{1,3}\s%$/); CommandTrigger(undef,"$s $read: $val"); } } @@ -682,19 +685,19 @@ sub HOMEMODE_updateInternals($;$$) CommandDeleteReading(undef,"$name event-.+"); if (HOMEMODE_AttrCheck($hash,"HomeEventsHolidayDevices")) { - foreach my $c (devspec2array(HOMEMODE_AttrCheck($hash,"HomeEventsHolidayDevices"))) + for my $c (devspec2array(HOMEMODE_AttrCheck($hash,"HomeEventsHolidayDevices"))) { push @cals,$c if (!grep /^$c$/,@cals); } } if (HOMEMODE_AttrCheck($hash,"HomeEventsCalendarDevices")) { - foreach my $c (devspec2array(HOMEMODE_AttrCheck($hash,"HomeEventsCalendarDevices"))) + for my $c (devspec2array(HOMEMODE_AttrCheck($hash,"HomeEventsCalendarDevices"))) { push @cals,$c if (!grep /^$c$/,@cals); } } - foreach my $c (@cals) + for my $c (@cals) { push @allMonitoredDevices,$c if (!grep /^$c$/,@allMonitoredDevices); if (HOMEMODE_ID($c,"Calendar")) @@ -713,7 +716,7 @@ sub HOMEMODE_updateInternals($;$$) { my $read = AttrVal($name,"HomeSensorsLuminanceReading","luminance"); my @sensors; - foreach my $s (devspec2array($luminance)) + for my $s (devspec2array($luminance)) { next unless (HOMEMODE_ID($s,undef,AttrVal($name,"HomeSensorsLuminanceReading","luminance"))); push @sensors,$s; @@ -819,8 +822,7 @@ sub HOMEMODE_Get($@) "$cmd benötigt ein Argument, entweder long oder short!": "$cmd needs one argument of long or short!"; return $trans if (!$value || $value !~ /^(long|short)$/); - my $m = "Long"; - $m = "Short" if ($value eq "short"); + my $m = $value eq "short"?"Short":"Long"; HOMEMODE_WeatherTXT($hash,AttrVal($name,"HomeTextWeather$m","")); } elsif ($cmd eq "weatherForecast") @@ -861,7 +863,7 @@ sub HOMEMODE_Set($@) my $slocations = HOMEMODE_AttrCheck($hash,"HomeSpecialLocations"); if ($slocations) { - foreach (split /,/,$slocations) + for (split /,/,$slocations) { push @locations,$_; } @@ -870,7 +872,7 @@ sub HOMEMODE_Set($@) my $smodes = HOMEMODE_AttrCheck($hash,"HomeSpecialModes"); if ($smodes) { - foreach (split /,/,$smodes) + for (split /,/,$smodes) { push @modeparams,$_; } @@ -1135,7 +1137,7 @@ sub HOMEMODE_makeHR($$@) my @aliases; my $and = (split /\|/,AttrVal($name,"HomeTextAndAreIs","and|are|is"))[0]; my $text; - foreach (@names) + for (@names) { my $alias = $noart ? HOMEMODE_name2alias($_) : HOMEMODE_name2alias($_,1); push @aliases,$alias; @@ -1191,7 +1193,7 @@ sub HOMEMODE_RESIDENTS($;$) my $emp = ReplaceEventMap($dev,"present",1); if (grep /^state:\s/,@{$events}) { - foreach (@{$events}) + for (@{$events}) { next unless ($_ =~ /^state:\s(.+)$/ && grep /^$1$/,split /,/,$HOMEMODE_UserModesAll); $mode = $1; @@ -1239,7 +1241,7 @@ sub HOMEMODE_RESIDENTS($;$) if (grep /^location:\s/,@{$events}) { my $loc; - foreach (@{$events}) + for (@{$events}) { next unless ($_ =~ /^location:\s(.+)$/); $loc = $1; @@ -1359,20 +1361,20 @@ sub HOMEMODE_Attributes($) push @attribs,"HomeCMDicewarning-on:textField-long"; push @attribs,"HomeCMDicewarning-off:textField-long"; push @attribs,"HomeCMDlocation:textField-long"; - foreach (split /,/,$HOMEMODE_Locations) + for (split /,/,$HOMEMODE_Locations) { push @attribs,"HomeCMDlocation-$_:textField-long"; } push @attribs,"HomeCMDlocation-resident:textField-long"; push @attribs,"HomeCMDmode:textField-long"; push @attribs,"HomeCMDmode-absent-belated:textField-long"; - foreach (split /,/,$HOMEMODE_UserModesAll) + for (split /,/,$HOMEMODE_UserModesAll) { push @attribs,"HomeCMDmode-$_:textField-long"; push @attribs,"HomeCMDmode-$_-resident:textField-long"; } push @attribs,"HomeCMDmodeAlarm:textField-long"; - foreach (split /,/,$HOMEMODE_AlarmModes) + for (split /,/,$HOMEMODE_AlarmModes) { push @attribs,"HomeCMDmodeAlarm-$_:textField-long"; } @@ -1469,7 +1471,7 @@ sub HOMEMODE_userattr($) my @userattrAll; my @homeattr; my @stayattr; - foreach (split " ",AttrVal($name,"userattr","")) + for (split " ",AttrVal($name,"userattr","")) { if ($_ =~ /^Home/) { @@ -1480,23 +1482,23 @@ sub HOMEMODE_userattr($) push @stayattr,$_; } } - foreach (split /,/,HOMEMODE_AttrCheck($hash,"HomeSpecialModes")) + for (split /,/,HOMEMODE_AttrCheck($hash,"HomeSpecialModes")) { push @userattrAll,"HomeCMDmode-$_"; } - foreach (split /,/,HOMEMODE_AttrCheck($hash,"HomeSpecialLocations")) + for (split /,/,HOMEMODE_AttrCheck($hash,"HomeSpecialLocations")) { push @userattrAll,"HomeCMDlocation-$_"; } if (HOMEMODE_AttrCheck($hash,"HomeEventsHolidayDevices")) { - foreach my $cal (devspec2array(HOMEMODE_AttrCheck($hash,"HomeEventsHolidayDevices"))) + for my $cal (devspec2array(HOMEMODE_AttrCheck($hash,"HomeEventsHolidayDevices"))) { my $events = HOMEMODE_CalendarEvents($name,$cal); push @userattrAll,"HomeCMDevent-$cal-each"; if ($adv) { - foreach my $evt (@{$events}) + for my $evt (@{$events}) { push @userattrAll,"HomeCMDevent-$cal-$evt-begin"; push @userattrAll,"HomeCMDevent-$cal-$evt-end"; @@ -1506,13 +1508,13 @@ sub HOMEMODE_userattr($) } if (HOMEMODE_AttrCheck($hash,"HomeEventsCalendarDevices")) { - foreach my $cal (devspec2array(HOMEMODE_AttrCheck($hash,"HomeEventsCalendarDevices"))) + for my $cal (devspec2array(HOMEMODE_AttrCheck($hash,"HomeEventsCalendarDevices"))) { my $events = HOMEMODE_CalendarEvents($name,$cal); push @userattrAll,"HomeCMDevent-$cal-each"; if ($adv) { - foreach my $evt (@{$events}) + for my $evt (@{$events}) { push @userattrAll,"HomeCMDevent-$cal-$evt-begin"; push @userattrAll,"HomeCMDevent-$cal-$evt-end"; @@ -1520,7 +1522,7 @@ sub HOMEMODE_userattr($) } } } - foreach my $resident (split /,/,$hash->{RESIDENTS}) + for my $resident (split /,/,$hash->{RESIDENTS}) { my $devtype = HOMEMODE_ID($resident,"ROOMMATE|GUEST|PET") ? $defs{$resident}->{TYPE} : ""; next unless ($devtype); @@ -1529,14 +1531,14 @@ sub HOMEMODE_userattr($) my $states = "absent"; $states .= ",$HOMEMODE_UserModesAll" if ($devtype =~ /^ROOMMATE|PET$/); $states .= ",home,$HOMEMODE_UserModes" if ($devtype eq "GUEST"); - foreach (split /,/,$states) + for (split /,/,$states) { push @userattrAll,"HomeCMDmode-$_-$resident"; } push @userattrAll,"HomeCMDpresence-absent-$resident"; push @userattrAll,"HomeCMDpresence-present-$resident"; my $locs = $devtype eq "ROOMMATE" ? AttrVal($resident,"rr_locations","") : $devtype eq "GUEST" ? AttrVal($resident,"rg_locations","") : AttrVal($resident,"rp_locations",""); - foreach (split/,/,$locs) + for (split/,/,$locs) { push @userattrAll,"HomeCMDlocation-$_-$resident"; push @userattrAll,"HomeCMDlocation-$_-resident" if (!grep(/^HomeCMDlocation-$_-resident$/,@userattrAll)); @@ -1547,7 +1549,7 @@ sub HOMEMODE_userattr($) { my $count; my $numbers; - foreach (@presdevs) + for (@presdevs) { $count++; $numbers .= "," if ($numbers); @@ -1557,7 +1559,7 @@ sub HOMEMODE_userattr($) push @userattrAll,"HomePresenceDevicePresentCount-$resident:$numbers"; if ($adv) { - foreach (@presdevs) + for (@presdevs) { push @userattrAll,"HomeCMDpresence-absent-$resident-device"; push @userattrAll,"HomeCMDpresence-present-$resident-device"; @@ -1567,7 +1569,7 @@ sub HOMEMODE_userattr($) } } } - foreach (split " ",HOMEMODE_AttrCheck($hash,"HomeDaytimes",$HOMEMODE_Daytimes)) + for (split " ",HOMEMODE_AttrCheck($hash,"HomeDaytimes",$HOMEMODE_Daytimes)) { my $text = (split /\|/)[1]; my $d = "HomeCMDdaytime-$text"; @@ -1575,14 +1577,14 @@ sub HOMEMODE_userattr($) push @userattrAll,$d if (!grep /^$d$/,@userattrAll); push @userattrAll,$m if (!grep /^$m$/,@userattrAll); } - foreach (split " ",HOMEMODE_AttrCheck($hash,"HomeSeasons",$HOMEMODE_Seasons)) + for (split " ",HOMEMODE_AttrCheck($hash,"HomeSeasons",$HOMEMODE_Seasons)) { my $text = (split /\|/)[1]; my $s = "HomeCMDseason-$text"; push @userattrAll,$s if (!grep /^$s$/,@userattrAll); } my @list; - foreach my $attrib (@userattrAll) + for my $attrib (@userattrAll) { $attrib = $attrib =~ /^.+:.+$/ ? $attrib : "$attrib:textField-long"; push @list,$attrib if (!grep /^$attrib$/,@list); @@ -1590,7 +1592,7 @@ sub HOMEMODE_userattr($) my $lo = join " ",sort @homeattr; my $ln = join " ",sort @list; return if ($lo eq $ln); - foreach (@stayattr) + for (@stayattr) { push @list,$_; } @@ -1605,13 +1607,13 @@ sub HOMEMODE_cleanUserattr($$;$) my @devspec = devspec2array($devs); return if (!@devspec); my @newdevspec = devspec2array($newdevs) if ($newdevs); - foreach my $dev (@devspec) + for my $dev (@devspec) { my $userattr = AttrVal($dev,"userattr",""); if ($userattr) { my @stayattr; - foreach (split " ",$userattr) + for (split " ",$userattr) { if ($_ =~ /^Home/) { @@ -1707,7 +1709,7 @@ sub HOMEMODE_Attr(@) elsif ($attr_name =~ /^HomeEvents(Holiday|Calendar)Devices$/ && $init_done) { my @wd; - foreach (devspec2array($attr_value)) + for (devspec2array($attr_value)) { next unless (!HOMEMODE_ID($_,"holiday|Calendar")); push @wd,$_ ; @@ -1773,7 +1775,7 @@ sub HOMEMODE_Attr(@) "Anzahl von $attr_name Werten ($t) ungleich zu den verfügbaren Jahreszeiten ($s) im Attribut HomeSeasons!": "Number of $attr_name values ($t) not matching the number of available seasons ($s) in attribute HomeSeasons!"; return $trans if ($s != $t); - foreach (@times) + for (@times) { $trans = $HOMEMODE_de? "Teiler dürfen nicht 0 sein, denn Division durch 0 ist nicht definiert!": @@ -1794,7 +1796,7 @@ sub HOMEMODE_Attr(@) "Ungültiger Wert $attr_value für Attribut $attr_name. Es werden Leerzeichen separierte Zahlen benötigt, z.B. 5 10 15 17.5": "Invalid value $attr_value for attribute $attr_name. You have to provide space separated numbers, e.g. 5 10 15 17.5"; return $trans if ($attr_value !~ /^\d{1,4}(\.\d)?((\s\d{1,4}(\.\d)?)?){0,}$/); - foreach (split " ",$attr_value) + for (split " ",$attr_value) { $trans = $HOMEMODE_de? "Teiler dürfen nicht 0 sein, denn Division durch 0 ist nicht definiert!": @@ -1906,7 +1908,7 @@ sub HOMEMODE_Attr(@) if ($attr_value_old ne $attr_value) { my @ts; - foreach (split " ",$attr_value) + for (split " ",$attr_value) { my $time = (split /\|/)[0]; my ($h,$m) = split /:/,$time; @@ -1936,7 +1938,7 @@ sub HOMEMODE_Attr(@) if ($attr_value_old ne $attr_value) { my @ds; - foreach (split " ",$attr_value) + for (split " ",$attr_value) { my $time = (split /\|/)[0]; my ($m,$d) = split /\./,$time; @@ -2233,31 +2235,31 @@ sub HOMEMODE_replacePlaceholders($$;$) $cmd =~ s/%DEVICEP%/$ppdevice/g; $cmd =~ s/%DISABLED%/$disabled/g; $cmd =~ s/%DND%/$dnd/g; - if (AttrVal($name,"HomeEventsHolidayDevices",undef) || AttrVal($name,"HomeEventsHolidayDevices",undef)) + if (AttrVal($name,"HomeEventsHolidayDevices",undef) || AttrVal($name,"HomeEventsCalendarDevices",undef)) { my @cals; if (AttrVal($name,"HomeEventsHolidayDevices","")) { - foreach my $c (devspec2array(AttrVal($name,"HomeEventsHolidayDevices",""))) + for my $c (devspec2array(AttrVal($name,"HomeEventsHolidayDevices",""))) { push @cals,$c if (!grep /^$c$/,@cals); } } else { - foreach my $c (devspec2array(AttrVal($name,"HomeEventsCalendarDevices",""))) + for my $c (devspec2array(AttrVal($name,"HomeEventsCalendarDevices",""))) { push @cals,$c if (!grep /^$c$/,@cals); } } - foreach my $cal (@cals) + for my $cal (@cals) { my $state = ReadingsVal($name,"event-$cal","none") ne "none" ? ReadingsVal($name,"event-$cal","") : ""; $cmd =~ s/%$cal%/$state/g; my $events = HOMEMODE_CalendarEvents($name,$cal); if (HOMEMODE_ID($cal,"holiday")) { - foreach my $evt (@{$events}) + for my $evt (@{$events}) { my $val = $state eq $evt ? 1 : ""; $cmd =~ s/%$cal-$evt%/$val/g; @@ -2265,9 +2267,9 @@ sub HOMEMODE_replacePlaceholders($$;$) } else { - foreach my $evt (@{$events}) + for my $evt (@{$events}) { - foreach my $e (split /,/,$state) + for my $e (split /,/,$state) { my $val = $e eq $evt ? 1 : ""; $cmd =~ s/%$cal-$evt%/$val/g; @@ -2343,11 +2345,11 @@ sub HOMEMODE_serializeCMD($@) my ($hash,@cmds) = @_; my $name = $hash->{NAME}; my @newcmds; - foreach my $cmd (@cmds) + for my $cmd (@cmds) { $cmd =~ s/\r\n/\n/gm; my @newcmd; - foreach (split /\n+/,$cmd) + for (split /\n+/,$cmd) { next unless ($_ !~ /^\s*(#|$)/); $_ =~ s/\s{2,}/ /g; @@ -2479,7 +2481,7 @@ sub HOMEMODE_CheckIfIsValidDevspec($;$) { my ($spec,$read) = @_; my @names; - foreach (devspec2array($spec)) + for (devspec2array($spec)) { next unless (HOMEMODE_ID($_,undef,$read)); push @names,$_; @@ -2540,7 +2542,7 @@ sub HOMEMODE_DayTime($) my $loctime = $hour * 60 + $min; my @texts; my @times; - foreach (split " ",$daytimes) + for (split " ",$daytimes) { my ($dt,$text) = split /\|/; my ($h,$m) = split /:/,$dt; @@ -2551,8 +2553,7 @@ sub HOMEMODE_DayTime($) my $daytime = $texts[scalar @texts - 1]; for (my $x = 0; $x < scalar @times; $x++) { - my $y = $x + 1; - $y = 0 if ($x == scalar @times - 1); + my $y = $x==scalar(@times)-1?0:$x+1; $daytime = $texts[$x] if ($y > $x && $loctime >= $times[$x] && $loctime < $times[$y]); } return $daytime; @@ -2582,7 +2583,7 @@ sub HOMEMODE_SetSeason($) my $locdays = ($month + 1) * 31 + $mday; my @texts; my @dates; - foreach (split " ",$seasons) + for (split " ",$seasons) { my ($date,$text) = split /\|/; my ($m,$d) = split /\./,$date; @@ -2590,11 +2591,10 @@ sub HOMEMODE_SetSeason($) push @dates,$days; push @texts,$text; } - my $season = $texts[scalar @texts - 1]; + my $season = $texts[scalar(@texts)-1]; for (my $x = 0; $x < scalar @dates; $x++) { - my $y = $x + 1; - $y = 0 if ($x == scalar @dates - 1); + my $y = $x==scalar(@dates)-1?0:$x+1; $season = $texts[$x] if ($y > $x && $locdays >= $dates[$x] && $locdays < $dates[$y]); } if (ReadingsVal($name,"season","") ne $season) @@ -2631,7 +2631,7 @@ sub HOMEMODE_addSensorsuserattr($$;$) my @devspec = devspec2array($devs); my @olddevspec = devspec2array($olddevs) if ($olddevs); HOMEMODE_cleanUserattr($hash,$olddevs,$devs) if (@olddevspec); - foreach my $sensor (@devspec) + for my $sensor (@devspec) { my $inolddevspec = @olddevspec && grep /^$sensor$/,@olddevspec ? 1 : 0; my $alias = AttrVal($sensor,"alias",""); @@ -2691,7 +2691,7 @@ sub HOMEMODE_Luminance($;$$) my $read = AttrVal($name,"HomeSensorsLuminanceReading","luminance"); $lum = 0 if (!$lum); my @sensorsa; - foreach (@sensors) + for (@sensors) { next unless (!HOMEMODE_IsDisabled($hash,$_)); push @sensorsa,$_; @@ -2735,7 +2735,7 @@ sub HOMEMODE_TriggerState($;$$$) my $amode = ReadingsVal($name,"modeAlarm",""); if ($contacts) { - foreach my $sensor (devspec2array($contacts)) + for my $sensor (devspec2array($contacts)) { next if (HOMEMODE_IsDisabled($hash,$sensor)); my ($oread,$tread) = split " ",AttrVal($sensor,"HomeReadings",AttrVal($name,"HomeSensorsContactReadings","state sabotageError")),2; @@ -2788,7 +2788,7 @@ sub HOMEMODE_TriggerState($;$$$) } if ($motions) { - foreach my $sensor (devspec2array($motions)) + for my $sensor (devspec2array($motions)) { next if (HOMEMODE_IsDisabled($hash,$sensor)); my ($oread,$tread) = split " ",AttrVal($sensor,"HomeReadings",AttrVal($name,"HomeSensorsMotionReadings","state sabotageError")),2; @@ -2911,9 +2911,10 @@ sub HOMEMODE_name2alias($;$) my ($name,$witharticle) = @_; my $alias = AttrVal($name,"alias",$name); my $art; - $art = "der" if ($alias =~ /sensor|dete[ck]tor|melder/i); $art = "die" if ($alias =~ /t(ü|ue)r/i); $art = "das" if ($alias =~ /fenster/i); + $art = "der" if ($alias =~ /(sensor|dete[ck]tor|melder|kontakt)$/i); + $art = "der" if ($alias =~ /^(sensor|dete[ck]tor|melder|kontakt)\s.+/i); my $ret = $witharticle && $art ? "$art $alias" : $alias; return $ret; } @@ -2932,7 +2933,7 @@ sub HOMEMODE_ContactOpenCheck($$;$$) $donttrigger = 1 if ($dtmode && $mode =~ /^($dtmode)$/); if (!$donttrigger && $dtmode && $dtres) { - foreach (devspec2array($dtres)) + for (devspec2array($dtres)) { next if (HOMEMODE_IsDisabled(undef,$_)); $donttrigger = 1 if (ReadingsVal($_,"state","") =~ /^($dtmode)$/); @@ -2956,7 +2957,7 @@ sub HOMEMODE_ContactOpenCheck($$;$$) my @divs = split " ",$dividers; my $divider; my $count = 0; - foreach (split " ",$seasons) + for (split " ",$seasons) { my ($date,$text) = split /\|/; $divider = $divs[$count] if ($season eq $text); @@ -3012,7 +3013,7 @@ sub HOMEMODE_ContactOpenCheckAfterModeChange($$$;$) my $pstate = ReadingsVal($resident,"lastState","") if ($resident); if ($contacts) { - foreach (split /,/,$contacts) + for (split /,/,$contacts) { my $m = AttrVal($_,"HomeOpenDontTriggerModes",""); my $r = AttrVal($_,"HomeOpenDontTriggerModesResidents",""); @@ -3043,7 +3044,7 @@ sub HOMEMODE_ContactCommands($$$$) push @cmds,AttrVal($name,"HomeCMDcontactDoormainClosed","") if (AttrVal($name,"HomeCMDcontactDoormainClosed",undef) && $kind eq "doormain" && $state eq "closed"); if (@cmds) { - foreach (@cmds) + for (@cmds) { my ($c,$o) = split /\|/,AttrVal($name,"HomeTextClosedOpen","closed|open"); my $sta = $state eq "open" ? $o : $c; @@ -3066,7 +3067,7 @@ sub HOMEMODE_MotionCommands($$$) push @cmds,AttrVal($name,"HomeCMDmotion-off","") if (AttrVal($name,"HomeCMDmotion-off",undef) && $state eq "closed"); if (@cmds) { - foreach (@cmds) + for (@cmds) { my ($c,$o) = split /\|/,AttrVal($name,"HomeTextClosedOpen","closed|open"); $state = $state eq "open" ? $o : $c; @@ -3101,7 +3102,7 @@ sub HOMEMODE_EventCommands($$$$) push @cmds,AttrVal($name,"HomeCMDevent-$cal-$pevt-end","") if (AttrVal($name,"HomeCMDevent-$cal-$pevt-end",undef)); push @cmds,AttrVal($name,"HomeCMDevent-$cal-$evt-begin","") if (AttrVal($name,"HomeCMDevent-$cal-$evt-begin",undef)); readingsSingleUpdate($hash,"event-$cal",$event,1); - foreach (@cmds) + for (@cmds) { $_ =~ s/%EVENT%/$event/gm; $_ =~ s/%PREVEVENT%/$prevevent/gm; @@ -3112,14 +3113,14 @@ sub HOMEMODE_EventCommands($$$$) { my @prevevents; @prevevents = split /,/,$prevevent if ($prevevent ne "none"); - foreach (split /;/,$event) + for (split /;/,$event) { $event =~ s/[\s ]//g; my $summary; my $description = ""; my $t = time(); my @filters = ( { ref => \&filter_true, param => undef } ); - foreach (Calendar_GetEvents($defs{$cal},$t,@filters)) + for (Calendar_GetEvents($defs{$cal},$t,@filters)) { next unless ($_->{uid} eq $event); $summary = $_->{summary}; @@ -3142,7 +3143,7 @@ sub HOMEMODE_EventCommands($$$$) if (grep /^$summary$/,@prevevents) { my @sevents; - foreach (@prevevents) + for (@prevevents) { push @sevents,$_ if ($_ ne $summary); } @@ -3153,7 +3154,7 @@ sub HOMEMODE_EventCommands($$$$) { push @prevevents,$summary if (!grep /^$summary$/,@prevevents); } - foreach (@cmds) + for (@cmds) { if ($read eq "start") { @@ -3173,7 +3174,7 @@ sub HOMEMODE_EventCommands($$$$) $update = join ",",@prevevents if (@prevevents); readingsSingleUpdate($hash,"event-$cal",$update,1); } - foreach (@cmds) + for (@cmds) { $_ =~ s/%CALENDAR%/$cal/gm; } @@ -3188,7 +3189,7 @@ sub HOMEMODE_UWZCommands($$) my $uwz = AttrVal($name,"HomeUWZ",""); my $count; my $warning; - foreach my $evt (@{$events}) + for my $evt (@{$events}) { next unless (grep /^WarnCount:\s[0-9]$/,$evt); $count = $evt; @@ -3241,7 +3242,7 @@ sub HOMEMODE_PowerEnergy($;$$$) my @spec = devspec2array($hash->{SENSORSENERGY}); if (@spec > 1) { - foreach (split /,/,$hash->{SENSORSENERGY}) + for (split /,/,$hash->{SENSORSENERGY}) { next unless ($_ ne $trigger); my $v = ReadingsNum($_,$read,0); @@ -3258,7 +3259,7 @@ sub HOMEMODE_PowerEnergy($;$$$) my $power = 0; my $energy = 0; my ($pr,$er) = split " ",AttrVal($name,"HomeSensorsPowerEnergyReadings","power energy"); - foreach (split /,/,$hash->{SENSORSENERGY}) + for (split /,/,$hash->{SENSORSENERGY}) { my $p = ReadingsNum($_,$pr,0); my $e = ReadingsNum($_,$er,0); @@ -3281,7 +3282,7 @@ sub HOMEMODE_Smoke($;$$) my $r = AttrVal($name,"HomeSensorsSmokeReading","state"); my $v = AttrVal($name,"HomeSensorsSmokeValue","on"); my @sensors; - foreach (split /,/,$hash->{SENSORSSMOKE}) + for (split /,/,$hash->{SENSORSSMOKE}) { push @sensors,$_ if (ReadingsVal($_,$r,"") =~ /^$v$/); } @@ -3299,7 +3300,7 @@ sub HOMEMODE_Smoke($;$$) } if (@cmds) { - foreach (@cmds) + for (@cmds) { my ($n,$s) = split /\|/,AttrVal($name,"HomeTextNosmokeSmoke","no smoke|smoke"); my $sta = $state eq $v ? $s : $n; @@ -3353,7 +3354,7 @@ sub HOMEMODE_Twilight($$;$) else { my $pevent = ReadingsVal($name,"twilightEvent",""); - foreach my $event (@{$events}) + for my $event (@{$events}) { my $val = (split " ",$event)[1]; readingsBeginUpdate($hash); @@ -3406,7 +3407,7 @@ sub HOMEMODE_CalendarEvents($$) { my $fname = AttrVal("global","modpath",".")."/FHEM/".$cal.".holiday"; my (undef,@holidayfile) = FileRead($fname); - foreach (@holidayfile) + for (@holidayfile) { next unless ($_ !~ /^\s*(#|$)/); my @parts = split; @@ -3423,7 +3424,7 @@ sub HOMEMODE_CalendarEvents($$) { my $t = time(); my @filters = ( { ref => \&filter_true, param => undef } ); - foreach (Calendar_GetEvents($defs{$cal},$t,@filters)) + for (Calendar_GetEvents($defs{$cal},$t,@filters)) { my $evt = $_->{summary}; Log3 $name,5,"Calendar_GetEvents event: $evt"; @@ -3498,7 +3499,7 @@ sub HOMEMODE_ToggleDevice($$) { push @cmds,AttrVal($name,"HomeCMDdeviceEnable","") if (AttrVal($name,"HomeCMDdeviceEnable","")); my @new; - foreach (@disabled) + for (@disabled) { push @new,$_ if ($_ ne $devname); } @@ -3509,12 +3510,11 @@ sub HOMEMODE_ToggleDevice($$) push @cmds,AttrVal($name,"HomeCMDdeviceDisable","") if (AttrVal($name,"HomeCMDdeviceDisable","")); push @disabled,$devname; } - my $dis = ""; - $dis = join(",",@disabled) if (@disabled); + my $dis = @disabled?join(",",@disabled):""; readingsSingleUpdate($hash,"devicesDisabled",$dis,1); if (@cmds) { - foreach (@cmds) + for (@cmds) { my $a = HOMEMODE_name2alias($devname); $_ =~ s/%ALIAS%/$a/gm; @@ -3524,12 +3524,12 @@ sub HOMEMODE_ToggleDevice($$) } } my @list; - foreach my $d (split /,/,$hash->{NOTIFYDEV}) + for my $d (split /,/,$hash->{NOTIFYDEV}) { push @list,$d if (!grep /^$d$/,@disabled); } $hash->{helper}{enabledDevices} = join ",",@list; - return undef; + return; } sub HOMEMODE_IsDisabled($$)