2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-10 03:06:37 +00:00

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
This commit is contained in:
deespe 2021-02-13 13:14:19 +00:00
parent 0fc902367d
commit 571f1502a5

View File

@ -16,7 +16,7 @@ use Time::HiRes qw(gettimeofday);
use HttpUtils; use HttpUtils;
use vars qw{%attr %defs %modules $FW_CSRF}; 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_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_Seasons = "03.01|spring 06.01|summer 09.01|autumn 12.01|winter";
my $HOMEMODE_UserModes = "gotosleep,awoken,asleep"; my $HOMEMODE_UserModes = "gotosleep,awoken,asleep";
@ -60,7 +60,7 @@ sub HOMEMODE_Define($$)
if (!$resdev) if (!$resdev)
{ {
my @resdevs; my @resdevs;
foreach (devspec2array("TYPE=RESIDENTS")) for (devspec2array("TYPE=RESIDENTS"))
{ {
push @resdevs,$_; push @resdevs,$_;
} }
@ -160,7 +160,7 @@ sub HOMEMODE_Notify($$)
} }
elsif (grep /^DEFINED/,@{$events}) elsif (grep /^DEFINED/,@{$events})
{ {
foreach (@{$events}) for (@{$events})
{ {
next unless ($_ =~ /^DEFINED\s(.+)$/); next unless ($_ =~ /^DEFINED\s(.+)$/);
my $dev = $1; my $dev = $1;
@ -200,7 +200,7 @@ sub HOMEMODE_Notify($$)
(AttrVal($name,"HomeEventsCalendarDevices",undef) (AttrVal($name,"HomeEventsCalendarDevices",undef)
&& grep(/^$devname$/,devspec2array(AttrVal($name,"HomeEventsCalendarDevices",""))))) && 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(.+)$/)); next unless ((HOMEMODE_ID($devname,"Calendar") && $evt =~ /^(start|end):\s(.+)$/) || (HOMEMODE_ID($devname,"holiday") && $evt =~ /^(state):\s(.+)$/));
HOMEMODE_EventCommands($hash,$devname,$1,$2); HOMEMODE_EventCommands($hash,$devname,$1,$2);
@ -258,7 +258,7 @@ sub HOMEMODE_Notify($$)
{ {
my $read = AttrVal($name,"HomeSensorsPowerEnergyReadings","power energy"); my $read = AttrVal($name,"HomeSensorsPowerEnergyReadings","power energy");
$read =~ s/ /\|/g; $read =~ s/ /\|/g;
foreach my $evt (@{$events}) for my $evt (@{$events})
{ {
next unless ($evt =~ /^($read):\s(.+)$/); next unless ($evt =~ /^($read):\s(.+)$/);
HOMEMODE_PowerEnergy($hash,$devname,$1,(split " ",$2)[0]); HOMEMODE_PowerEnergy($hash,$devname,$1,(split " ",$2)[0]);
@ -268,7 +268,7 @@ sub HOMEMODE_Notify($$)
elsif ($hash->{SENSORSSMOKE} && grep(/^$devname$/,split /,/,$hash->{SENSORSSMOKE})) elsif ($hash->{SENSORSSMOKE} && grep(/^$devname$/,split /,/,$hash->{SENSORSSMOKE}))
{ {
my $read = AttrVal($name,"HomeSensorsSmokeReading","state"); my $read = AttrVal($name,"HomeSensorsSmokeReading","state");
foreach my $evt (@{$events}) for my $evt (@{$events})
{ {
next unless ($evt =~ /^$read:\s(.+)$/); next unless ($evt =~ /^$read:\s(.+)$/);
HOMEMODE_Smoke($hash,$devname,$1); HOMEMODE_Smoke($hash,$devname,$1);
@ -292,7 +292,7 @@ sub HOMEMODE_Notify($$)
my $read = AttrVal($name,"HomeSensorsLuminanceReading","luminance"); my $read = AttrVal($name,"HomeSensorsLuminanceReading","luminance");
if (grep /^$read:\s.+$/,@{$events}) if (grep /^$read:\s.+$/,@{$events})
{ {
foreach my $evt (@{$events}) for my $evt (@{$events})
{ {
next unless ($evt =~ /^$read:\s(.+)$/); next unless ($evt =~ /^$read:\s(.+)$/);
HOMEMODE_Luminance($hash,$devname,(split " ",$1)[0]); HOMEMODE_Luminance($hash,$devname,(split " ",$1)[0]);
@ -304,7 +304,7 @@ sub HOMEMODE_Notify($$)
{ {
my $temp; my $temp;
my $humi; my $humi;
foreach my $evt (@{$events}) for my $evt (@{$events})
{ {
next unless ($evt =~ /^(humidity|temperature):\s(.+)$/); next unless ($evt =~ /^(humidity|temperature):\s(.+)$/);
$temp = (split " ",$2)[0] if ($1 eq "temperature"); $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}) if (AttrVal($name,"HomeSensorHumidityOutside",undef) && $devname eq AttrVal($name,"HomeSensorHumidityOutside","") && grep /^humidity:\s/,@{$events})
{ {
$hash->{helper}{externalHumidity} = 1; $hash->{helper}{externalHumidity} = 1;
foreach my $evt (@{$events}) for my $evt (@{$events})
{ {
next unless ($evt =~ /^humidity:\s(.+)$/); next unless ($evt =~ /^humidity:\s(.+)$/);
my $val = (split " ",$1)[0]; my $val = (split " ",$1)[0];
@ -343,7 +343,7 @@ sub HOMEMODE_Notify($$)
my $read = (split /:/,AttrVal($name,"HomeSensorWindspeed",""))[1]; my $read = (split /:/,AttrVal($name,"HomeSensorWindspeed",""))[1];
if (grep /^$read:\s(.+)$/,@{$events}) if (grep /^$read:\s(.+)$/,@{$events})
{ {
foreach my $evt (@{$events}) for my $evt (@{$events})
{ {
next unless ($evt =~ /^$read:\s(.+)$/); next unless ($evt =~ /^$read:\s(.+)$/);
my $val = (split " ",$1)[0]; my $val = (split " ",$1)[0];
@ -358,7 +358,7 @@ sub HOMEMODE_Notify($$)
my $read = (split /:/,AttrVal($name,"HomeSensorAirpressure",""))[1]; my $read = (split /:/,AttrVal($name,"HomeSensorAirpressure",""))[1];
if (grep /^$read:\s(.+)$/,@{$events}) if (grep /^$read:\s(.+)$/,@{$events})
{ {
foreach my $evt (@{$events}) for my $evt (@{$events})
{ {
next unless ($evt =~ /^$read:\s(.+)$/); next unless ($evt =~ /^$read:\s(.+)$/);
my $val = (split " ",$1)[0]; my $val = (split " ",$1)[0];
@ -372,7 +372,7 @@ sub HOMEMODE_Notify($$)
{ {
my $resident; my $resident;
my $residentregex; my $residentregex;
foreach (split /,/,$hash->{RESIDENTS}) for (split /,/,$hash->{RESIDENTS})
{ {
my $regex = lc($_); my $regex = lc($_);
$regex =~ s/^(rr_|rg_|rp_)//; $regex =~ s/^(rr_|rg_|rp_)//;
@ -388,7 +388,7 @@ sub HOMEMODE_Notify($$)
if (ReadingsVal($devname,"presence","") !~ /^maybe/) if (ReadingsVal($devname,"presence","") !~ /^maybe/)
{ {
my @presentdevicespresent; 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/); next unless (lc($device) =~ /$residentregex/);
push @presentdevicespresent,$device if (ReadingsVal($device,"presence","") =~ /^(present|appeared|maybe.absent)$/); 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 @lowOld = split /,/,ReadingsVal($name,"batteryLow","");
my @low; my @low;
@low = @lowOld if (@lowOld); @low = @lowOld if (@lowOld);
foreach my $evt (@{$events}) for my $evt (@{$events})
{ {
next unless ($evt =~ /^$read:\s(.+)$/); next unless ($evt =~ /^$read:\s(.+)$/);
my $val = $1; my $val = $1;
@ -449,7 +449,7 @@ sub HOMEMODE_Notify($$)
elsif (grep /^$devname$/,@low) elsif (grep /^$devname$/,@low)
{ {
my @lown; my @lown;
foreach (@low) for (@low)
{ {
push @lown,$_ if ($_ ne $devname); 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 @presdevs = devspec2array("TYPE=$presencetype:FILTER=presence=^(maybe.)?(absent|present|appeared|disappeared)");
my @residentsshort; my @residentsshort;
my @logtexte; my @logtexte;
foreach my $resident (split /,/,$hash->{RESIDENTS}) for my $resident (split /,/,$hash->{RESIDENTS})
{ {
push @allMonitoredDevices,$resident; push @allMonitoredDevices,$resident;
my $short = lc($resident); my $short = lc($resident);
@ -551,7 +551,7 @@ sub HOMEMODE_updateInternals($;$$)
if ($autopresence) if ($autopresence)
{ {
my @residentspresdevs; my @residentspresdevs;
foreach my $p (@presdevs) for my $p (@presdevs)
{ {
next unless (lc($p) =~ /$short/); next unless (lc($p) =~ /$short/);
push @residentspresdevs,$p; push @residentspresdevs,$p;
@ -592,7 +592,7 @@ sub HOMEMODE_updateInternals($;$$)
if ($contacts) if ($contacts)
{ {
my @sensors; my @sensors;
foreach my $s (devspec2array($contacts)) for my $s (devspec2array($contacts))
{ {
push @sensors,$s; push @sensors,$s;
push @allMonitoredDevices,$s if (!grep /^$s$/,@allMonitoredDevices); push @allMonitoredDevices,$s if (!grep /^$s$/,@allMonitoredDevices);
@ -609,7 +609,7 @@ sub HOMEMODE_updateInternals($;$$)
if ($motion) if ($motion)
{ {
my @sensors; my @sensors;
foreach my $s (devspec2array($motion)) for my $s (devspec2array($motion))
{ {
push @sensors,$s; push @sensors,$s;
push @allMonitoredDevices,$s if (!grep /^$s$/,@allMonitoredDevices); push @allMonitoredDevices,$s if (!grep /^$s$/,@allMonitoredDevices);
@ -627,7 +627,7 @@ sub HOMEMODE_updateInternals($;$$)
{ {
my @sensors; my @sensors;
my ($p,$e) = split " ",AttrVal($name,"HomeSensorsPowerEnergyReadings","power energy"); 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)); next unless (HOMEMODE_ID($s,undef,$p) && HOMEMODE_ID($s,undef,$e));
push @sensors,$s; push @sensors,$s;
@ -640,7 +640,7 @@ sub HOMEMODE_updateInternals($;$$)
{ {
my @sensors; my @sensors;
my $r = AttrVal($name,"HomeSensorsSmokeReading","state"); my $r = AttrVal($name,"HomeSensorsSmokeReading","state");
foreach my $s (devspec2array($smoke)) for my $s (devspec2array($smoke))
{ {
next unless (HOMEMODE_ID($s,undef,$r)); next unless (HOMEMODE_ID($s,undef,$r));
push @sensors,$s; push @sensors,$s;
@ -652,7 +652,7 @@ sub HOMEMODE_updateInternals($;$$)
if ($battery) if ($battery)
{ {
my @sensors; my @sensors;
foreach my $s (devspec2array($battery)) for my $s (devspec2array($battery))
{ {
my $read = AttrVal($name,"HomeSensorsBatteryReading","battery"); my $read = AttrVal($name,"HomeSensorsBatteryReading","battery");
my $val = ReadingsVal($s,$read,undef); my $val = ReadingsVal($s,$read,undef);
@ -662,7 +662,10 @@ sub HOMEMODE_updateInternals($;$$)
$hash->{SENSORSBATTERY} = join(",",sort @sensors) if (@sensors); $hash->{SENSORSBATTERY} = join(",",sort @sensors) if (@sensors);
if (!grep(/^$s$/,split(/,/,ReadingsVal($name,"batteryLow","")))) 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"); CommandTrigger(undef,"$s $read: $val");
} }
} }
@ -682,19 +685,19 @@ sub HOMEMODE_updateInternals($;$$)
CommandDeleteReading(undef,"$name event-.+"); CommandDeleteReading(undef,"$name event-.+");
if (HOMEMODE_AttrCheck($hash,"HomeEventsHolidayDevices")) 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); push @cals,$c if (!grep /^$c$/,@cals);
} }
} }
if (HOMEMODE_AttrCheck($hash,"HomeEventsCalendarDevices")) 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); push @cals,$c if (!grep /^$c$/,@cals);
} }
} }
foreach my $c (@cals) for my $c (@cals)
{ {
push @allMonitoredDevices,$c if (!grep /^$c$/,@allMonitoredDevices); push @allMonitoredDevices,$c if (!grep /^$c$/,@allMonitoredDevices);
if (HOMEMODE_ID($c,"Calendar")) if (HOMEMODE_ID($c,"Calendar"))
@ -713,7 +716,7 @@ sub HOMEMODE_updateInternals($;$$)
{ {
my $read = AttrVal($name,"HomeSensorsLuminanceReading","luminance"); my $read = AttrVal($name,"HomeSensorsLuminanceReading","luminance");
my @sensors; my @sensors;
foreach my $s (devspec2array($luminance)) for my $s (devspec2array($luminance))
{ {
next unless (HOMEMODE_ID($s,undef,AttrVal($name,"HomeSensorsLuminanceReading","luminance"))); next unless (HOMEMODE_ID($s,undef,AttrVal($name,"HomeSensorsLuminanceReading","luminance")));
push @sensors,$s; push @sensors,$s;
@ -819,8 +822,7 @@ sub HOMEMODE_Get($@)
"$cmd benötigt ein Argument, entweder long oder short!": "$cmd benötigt ein Argument, entweder long oder short!":
"$cmd needs one argument of long or short!"; "$cmd needs one argument of long or short!";
return $trans if (!$value || $value !~ /^(long|short)$/); return $trans if (!$value || $value !~ /^(long|short)$/);
my $m = "Long"; my $m = $value eq "short"?"Short":"Long";
$m = "Short" if ($value eq "short");
HOMEMODE_WeatherTXT($hash,AttrVal($name,"HomeTextWeather$m","")); HOMEMODE_WeatherTXT($hash,AttrVal($name,"HomeTextWeather$m",""));
} }
elsif ($cmd eq "weatherForecast") elsif ($cmd eq "weatherForecast")
@ -861,7 +863,7 @@ sub HOMEMODE_Set($@)
my $slocations = HOMEMODE_AttrCheck($hash,"HomeSpecialLocations"); my $slocations = HOMEMODE_AttrCheck($hash,"HomeSpecialLocations");
if ($slocations) if ($slocations)
{ {
foreach (split /,/,$slocations) for (split /,/,$slocations)
{ {
push @locations,$_; push @locations,$_;
} }
@ -870,7 +872,7 @@ sub HOMEMODE_Set($@)
my $smodes = HOMEMODE_AttrCheck($hash,"HomeSpecialModes"); my $smodes = HOMEMODE_AttrCheck($hash,"HomeSpecialModes");
if ($smodes) if ($smodes)
{ {
foreach (split /,/,$smodes) for (split /,/,$smodes)
{ {
push @modeparams,$_; push @modeparams,$_;
} }
@ -1135,7 +1137,7 @@ sub HOMEMODE_makeHR($$@)
my @aliases; my @aliases;
my $and = (split /\|/,AttrVal($name,"HomeTextAndAreIs","and|are|is"))[0]; my $and = (split /\|/,AttrVal($name,"HomeTextAndAreIs","and|are|is"))[0];
my $text; my $text;
foreach (@names) for (@names)
{ {
my $alias = $noart ? HOMEMODE_name2alias($_) : HOMEMODE_name2alias($_,1); my $alias = $noart ? HOMEMODE_name2alias($_) : HOMEMODE_name2alias($_,1);
push @aliases,$alias; push @aliases,$alias;
@ -1191,7 +1193,7 @@ sub HOMEMODE_RESIDENTS($;$)
my $emp = ReplaceEventMap($dev,"present",1); my $emp = ReplaceEventMap($dev,"present",1);
if (grep /^state:\s/,@{$events}) if (grep /^state:\s/,@{$events})
{ {
foreach (@{$events}) for (@{$events})
{ {
next unless ($_ =~ /^state:\s(.+)$/ && grep /^$1$/,split /,/,$HOMEMODE_UserModesAll); next unless ($_ =~ /^state:\s(.+)$/ && grep /^$1$/,split /,/,$HOMEMODE_UserModesAll);
$mode = $1; $mode = $1;
@ -1239,7 +1241,7 @@ sub HOMEMODE_RESIDENTS($;$)
if (grep /^location:\s/,@{$events}) if (grep /^location:\s/,@{$events})
{ {
my $loc; my $loc;
foreach (@{$events}) for (@{$events})
{ {
next unless ($_ =~ /^location:\s(.+)$/); next unless ($_ =~ /^location:\s(.+)$/);
$loc = $1; $loc = $1;
@ -1359,20 +1361,20 @@ sub HOMEMODE_Attributes($)
push @attribs,"HomeCMDicewarning-on:textField-long"; push @attribs,"HomeCMDicewarning-on:textField-long";
push @attribs,"HomeCMDicewarning-off:textField-long"; push @attribs,"HomeCMDicewarning-off:textField-long";
push @attribs,"HomeCMDlocation:textField-long"; push @attribs,"HomeCMDlocation:textField-long";
foreach (split /,/,$HOMEMODE_Locations) for (split /,/,$HOMEMODE_Locations)
{ {
push @attribs,"HomeCMDlocation-$_:textField-long"; push @attribs,"HomeCMDlocation-$_:textField-long";
} }
push @attribs,"HomeCMDlocation-resident:textField-long"; push @attribs,"HomeCMDlocation-resident:textField-long";
push @attribs,"HomeCMDmode:textField-long"; push @attribs,"HomeCMDmode:textField-long";
push @attribs,"HomeCMDmode-absent-belated: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-$_:textField-long";
push @attribs,"HomeCMDmode-$_-resident:textField-long"; push @attribs,"HomeCMDmode-$_-resident:textField-long";
} }
push @attribs,"HomeCMDmodeAlarm:textField-long"; push @attribs,"HomeCMDmodeAlarm:textField-long";
foreach (split /,/,$HOMEMODE_AlarmModes) for (split /,/,$HOMEMODE_AlarmModes)
{ {
push @attribs,"HomeCMDmodeAlarm-$_:textField-long"; push @attribs,"HomeCMDmodeAlarm-$_:textField-long";
} }
@ -1469,7 +1471,7 @@ sub HOMEMODE_userattr($)
my @userattrAll; my @userattrAll;
my @homeattr; my @homeattr;
my @stayattr; my @stayattr;
foreach (split " ",AttrVal($name,"userattr","")) for (split " ",AttrVal($name,"userattr",""))
{ {
if ($_ =~ /^Home/) if ($_ =~ /^Home/)
{ {
@ -1480,23 +1482,23 @@ sub HOMEMODE_userattr($)
push @stayattr,$_; push @stayattr,$_;
} }
} }
foreach (split /,/,HOMEMODE_AttrCheck($hash,"HomeSpecialModes")) for (split /,/,HOMEMODE_AttrCheck($hash,"HomeSpecialModes"))
{ {
push @userattrAll,"HomeCMDmode-$_"; push @userattrAll,"HomeCMDmode-$_";
} }
foreach (split /,/,HOMEMODE_AttrCheck($hash,"HomeSpecialLocations")) for (split /,/,HOMEMODE_AttrCheck($hash,"HomeSpecialLocations"))
{ {
push @userattrAll,"HomeCMDlocation-$_"; push @userattrAll,"HomeCMDlocation-$_";
} }
if (HOMEMODE_AttrCheck($hash,"HomeEventsHolidayDevices")) 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); my $events = HOMEMODE_CalendarEvents($name,$cal);
push @userattrAll,"HomeCMDevent-$cal-each"; push @userattrAll,"HomeCMDevent-$cal-each";
if ($adv) if ($adv)
{ {
foreach my $evt (@{$events}) for my $evt (@{$events})
{ {
push @userattrAll,"HomeCMDevent-$cal-$evt-begin"; push @userattrAll,"HomeCMDevent-$cal-$evt-begin";
push @userattrAll,"HomeCMDevent-$cal-$evt-end"; push @userattrAll,"HomeCMDevent-$cal-$evt-end";
@ -1506,13 +1508,13 @@ sub HOMEMODE_userattr($)
} }
if (HOMEMODE_AttrCheck($hash,"HomeEventsCalendarDevices")) 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); my $events = HOMEMODE_CalendarEvents($name,$cal);
push @userattrAll,"HomeCMDevent-$cal-each"; push @userattrAll,"HomeCMDevent-$cal-each";
if ($adv) if ($adv)
{ {
foreach my $evt (@{$events}) for my $evt (@{$events})
{ {
push @userattrAll,"HomeCMDevent-$cal-$evt-begin"; push @userattrAll,"HomeCMDevent-$cal-$evt-begin";
push @userattrAll,"HomeCMDevent-$cal-$evt-end"; 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} : ""; my $devtype = HOMEMODE_ID($resident,"ROOMMATE|GUEST|PET") ? $defs{$resident}->{TYPE} : "";
next unless ($devtype); next unless ($devtype);
@ -1529,14 +1531,14 @@ sub HOMEMODE_userattr($)
my $states = "absent"; my $states = "absent";
$states .= ",$HOMEMODE_UserModesAll" if ($devtype =~ /^ROOMMATE|PET$/); $states .= ",$HOMEMODE_UserModesAll" if ($devtype =~ /^ROOMMATE|PET$/);
$states .= ",home,$HOMEMODE_UserModes" if ($devtype eq "GUEST"); $states .= ",home,$HOMEMODE_UserModes" if ($devtype eq "GUEST");
foreach (split /,/,$states) for (split /,/,$states)
{ {
push @userattrAll,"HomeCMDmode-$_-$resident"; push @userattrAll,"HomeCMDmode-$_-$resident";
} }
push @userattrAll,"HomeCMDpresence-absent-$resident"; push @userattrAll,"HomeCMDpresence-absent-$resident";
push @userattrAll,"HomeCMDpresence-present-$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",""); 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";
push @userattrAll,"HomeCMDlocation-$_-resident" if (!grep(/^HomeCMDlocation-$_-resident$/,@userattrAll)); push @userattrAll,"HomeCMDlocation-$_-resident" if (!grep(/^HomeCMDlocation-$_-resident$/,@userattrAll));
@ -1547,7 +1549,7 @@ sub HOMEMODE_userattr($)
{ {
my $count; my $count;
my $numbers; my $numbers;
foreach (@presdevs) for (@presdevs)
{ {
$count++; $count++;
$numbers .= "," if ($numbers); $numbers .= "," if ($numbers);
@ -1557,7 +1559,7 @@ sub HOMEMODE_userattr($)
push @userattrAll,"HomePresenceDevicePresentCount-$resident:$numbers"; push @userattrAll,"HomePresenceDevicePresentCount-$resident:$numbers";
if ($adv) if ($adv)
{ {
foreach (@presdevs) for (@presdevs)
{ {
push @userattrAll,"HomeCMDpresence-absent-$resident-device"; push @userattrAll,"HomeCMDpresence-absent-$resident-device";
push @userattrAll,"HomeCMDpresence-present-$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 $text = (split /\|/)[1];
my $d = "HomeCMDdaytime-$text"; my $d = "HomeCMDdaytime-$text";
@ -1575,14 +1577,14 @@ sub HOMEMODE_userattr($)
push @userattrAll,$d if (!grep /^$d$/,@userattrAll); push @userattrAll,$d if (!grep /^$d$/,@userattrAll);
push @userattrAll,$m if (!grep /^$m$/,@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 $text = (split /\|/)[1];
my $s = "HomeCMDseason-$text"; my $s = "HomeCMDseason-$text";
push @userattrAll,$s if (!grep /^$s$/,@userattrAll); push @userattrAll,$s if (!grep /^$s$/,@userattrAll);
} }
my @list; my @list;
foreach my $attrib (@userattrAll) for my $attrib (@userattrAll)
{ {
$attrib = $attrib =~ /^.+:.+$/ ? $attrib : "$attrib:textField-long"; $attrib = $attrib =~ /^.+:.+$/ ? $attrib : "$attrib:textField-long";
push @list,$attrib if (!grep /^$attrib$/,@list); push @list,$attrib if (!grep /^$attrib$/,@list);
@ -1590,7 +1592,7 @@ sub HOMEMODE_userattr($)
my $lo = join " ",sort @homeattr; my $lo = join " ",sort @homeattr;
my $ln = join " ",sort @list; my $ln = join " ",sort @list;
return if ($lo eq $ln); return if ($lo eq $ln);
foreach (@stayattr) for (@stayattr)
{ {
push @list,$_; push @list,$_;
} }
@ -1605,13 +1607,13 @@ sub HOMEMODE_cleanUserattr($$;$)
my @devspec = devspec2array($devs); my @devspec = devspec2array($devs);
return if (!@devspec); return if (!@devspec);
my @newdevspec = devspec2array($newdevs) if ($newdevs); my @newdevspec = devspec2array($newdevs) if ($newdevs);
foreach my $dev (@devspec) for my $dev (@devspec)
{ {
my $userattr = AttrVal($dev,"userattr",""); my $userattr = AttrVal($dev,"userattr","");
if ($userattr) if ($userattr)
{ {
my @stayattr; my @stayattr;
foreach (split " ",$userattr) for (split " ",$userattr)
{ {
if ($_ =~ /^Home/) if ($_ =~ /^Home/)
{ {
@ -1707,7 +1709,7 @@ sub HOMEMODE_Attr(@)
elsif ($attr_name =~ /^HomeEvents(Holiday|Calendar)Devices$/ && $init_done) elsif ($attr_name =~ /^HomeEvents(Holiday|Calendar)Devices$/ && $init_done)
{ {
my @wd; my @wd;
foreach (devspec2array($attr_value)) for (devspec2array($attr_value))
{ {
next unless (!HOMEMODE_ID($_,"holiday|Calendar")); next unless (!HOMEMODE_ID($_,"holiday|Calendar"));
push @wd,$_ ; 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!": "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!"; "Number of $attr_name values ($t) not matching the number of available seasons ($s) in attribute HomeSeasons!";
return $trans if ($s != $t); return $trans if ($s != $t);
foreach (@times) for (@times)
{ {
$trans = $HOMEMODE_de? $trans = $HOMEMODE_de?
"Teiler dürfen nicht 0 sein, denn Division durch 0 ist nicht definiert!": "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": "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"; "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,}$/); 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? $trans = $HOMEMODE_de?
"Teiler dürfen nicht 0 sein, denn Division durch 0 ist nicht definiert!": "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) if ($attr_value_old ne $attr_value)
{ {
my @ts; my @ts;
foreach (split " ",$attr_value) for (split " ",$attr_value)
{ {
my $time = (split /\|/)[0]; my $time = (split /\|/)[0];
my ($h,$m) = split /:/,$time; my ($h,$m) = split /:/,$time;
@ -1936,7 +1938,7 @@ sub HOMEMODE_Attr(@)
if ($attr_value_old ne $attr_value) if ($attr_value_old ne $attr_value)
{ {
my @ds; my @ds;
foreach (split " ",$attr_value) for (split " ",$attr_value)
{ {
my $time = (split /\|/)[0]; my $time = (split /\|/)[0];
my ($m,$d) = split /\./,$time; my ($m,$d) = split /\./,$time;
@ -2233,31 +2235,31 @@ sub HOMEMODE_replacePlaceholders($$;$)
$cmd =~ s/%DEVICEP%/$ppdevice/g; $cmd =~ s/%DEVICEP%/$ppdevice/g;
$cmd =~ s/%DISABLED%/$disabled/g; $cmd =~ s/%DISABLED%/$disabled/g;
$cmd =~ s/%DND%/$dnd/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; my @cals;
if (AttrVal($name,"HomeEventsHolidayDevices","")) 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); push @cals,$c if (!grep /^$c$/,@cals);
} }
} }
else else
{ {
foreach my $c (devspec2array(AttrVal($name,"HomeEventsCalendarDevices",""))) for my $c (devspec2array(AttrVal($name,"HomeEventsCalendarDevices","")))
{ {
push @cals,$c if (!grep /^$c$/,@cals); 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","") : ""; my $state = ReadingsVal($name,"event-$cal","none") ne "none" ? ReadingsVal($name,"event-$cal","") : "";
$cmd =~ s/%$cal%/$state/g; $cmd =~ s/%$cal%/$state/g;
my $events = HOMEMODE_CalendarEvents($name,$cal); my $events = HOMEMODE_CalendarEvents($name,$cal);
if (HOMEMODE_ID($cal,"holiday")) if (HOMEMODE_ID($cal,"holiday"))
{ {
foreach my $evt (@{$events}) for my $evt (@{$events})
{ {
my $val = $state eq $evt ? 1 : ""; my $val = $state eq $evt ? 1 : "";
$cmd =~ s/%$cal-$evt%/$val/g; $cmd =~ s/%$cal-$evt%/$val/g;
@ -2265,9 +2267,9 @@ sub HOMEMODE_replacePlaceholders($$;$)
} }
else 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 : ""; my $val = $e eq $evt ? 1 : "";
$cmd =~ s/%$cal-$evt%/$val/g; $cmd =~ s/%$cal-$evt%/$val/g;
@ -2343,11 +2345,11 @@ sub HOMEMODE_serializeCMD($@)
my ($hash,@cmds) = @_; my ($hash,@cmds) = @_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
my @newcmds; my @newcmds;
foreach my $cmd (@cmds) for my $cmd (@cmds)
{ {
$cmd =~ s/\r\n/\n/gm; $cmd =~ s/\r\n/\n/gm;
my @newcmd; my @newcmd;
foreach (split /\n+/,$cmd) for (split /\n+/,$cmd)
{ {
next unless ($_ !~ /^\s*(#|$)/); next unless ($_ !~ /^\s*(#|$)/);
$_ =~ s/\s{2,}/ /g; $_ =~ s/\s{2,}/ /g;
@ -2479,7 +2481,7 @@ sub HOMEMODE_CheckIfIsValidDevspec($;$)
{ {
my ($spec,$read) = @_; my ($spec,$read) = @_;
my @names; my @names;
foreach (devspec2array($spec)) for (devspec2array($spec))
{ {
next unless (HOMEMODE_ID($_,undef,$read)); next unless (HOMEMODE_ID($_,undef,$read));
push @names,$_; push @names,$_;
@ -2540,7 +2542,7 @@ sub HOMEMODE_DayTime($)
my $loctime = $hour * 60 + $min; my $loctime = $hour * 60 + $min;
my @texts; my @texts;
my @times; my @times;
foreach (split " ",$daytimes) for (split " ",$daytimes)
{ {
my ($dt,$text) = split /\|/; my ($dt,$text) = split /\|/;
my ($h,$m) = split /:/,$dt; my ($h,$m) = split /:/,$dt;
@ -2551,8 +2553,7 @@ sub HOMEMODE_DayTime($)
my $daytime = $texts[scalar @texts - 1]; my $daytime = $texts[scalar @texts - 1];
for (my $x = 0; $x < scalar @times; $x++) for (my $x = 0; $x < scalar @times; $x++)
{ {
my $y = $x + 1; my $y = $x==scalar(@times)-1?0:$x+1;
$y = 0 if ($x == scalar @times - 1);
$daytime = $texts[$x] if ($y > $x && $loctime >= $times[$x] && $loctime < $times[$y]); $daytime = $texts[$x] if ($y > $x && $loctime >= $times[$x] && $loctime < $times[$y]);
} }
return $daytime; return $daytime;
@ -2582,7 +2583,7 @@ sub HOMEMODE_SetSeason($)
my $locdays = ($month + 1) * 31 + $mday; my $locdays = ($month + 1) * 31 + $mday;
my @texts; my @texts;
my @dates; my @dates;
foreach (split " ",$seasons) for (split " ",$seasons)
{ {
my ($date,$text) = split /\|/; my ($date,$text) = split /\|/;
my ($m,$d) = split /\./,$date; my ($m,$d) = split /\./,$date;
@ -2590,11 +2591,10 @@ sub HOMEMODE_SetSeason($)
push @dates,$days; push @dates,$days;
push @texts,$text; push @texts,$text;
} }
my $season = $texts[scalar @texts - 1]; my $season = $texts[scalar(@texts)-1];
for (my $x = 0; $x < scalar @dates; $x++) for (my $x = 0; $x < scalar @dates; $x++)
{ {
my $y = $x + 1; my $y = $x==scalar(@dates)-1?0:$x+1;
$y = 0 if ($x == scalar @dates - 1);
$season = $texts[$x] if ($y > $x && $locdays >= $dates[$x] && $locdays < $dates[$y]); $season = $texts[$x] if ($y > $x && $locdays >= $dates[$x] && $locdays < $dates[$y]);
} }
if (ReadingsVal($name,"season","") ne $season) if (ReadingsVal($name,"season","") ne $season)
@ -2631,7 +2631,7 @@ sub HOMEMODE_addSensorsuserattr($$;$)
my @devspec = devspec2array($devs); my @devspec = devspec2array($devs);
my @olddevspec = devspec2array($olddevs) if ($olddevs); my @olddevspec = devspec2array($olddevs) if ($olddevs);
HOMEMODE_cleanUserattr($hash,$olddevs,$devs) if (@olddevspec); HOMEMODE_cleanUserattr($hash,$olddevs,$devs) if (@olddevspec);
foreach my $sensor (@devspec) for my $sensor (@devspec)
{ {
my $inolddevspec = @olddevspec && grep /^$sensor$/,@olddevspec ? 1 : 0; my $inolddevspec = @olddevspec && grep /^$sensor$/,@olddevspec ? 1 : 0;
my $alias = AttrVal($sensor,"alias",""); my $alias = AttrVal($sensor,"alias","");
@ -2691,7 +2691,7 @@ sub HOMEMODE_Luminance($;$$)
my $read = AttrVal($name,"HomeSensorsLuminanceReading","luminance"); my $read = AttrVal($name,"HomeSensorsLuminanceReading","luminance");
$lum = 0 if (!$lum); $lum = 0 if (!$lum);
my @sensorsa; my @sensorsa;
foreach (@sensors) for (@sensors)
{ {
next unless (!HOMEMODE_IsDisabled($hash,$_)); next unless (!HOMEMODE_IsDisabled($hash,$_));
push @sensorsa,$_; push @sensorsa,$_;
@ -2735,7 +2735,7 @@ sub HOMEMODE_TriggerState($;$$$)
my $amode = ReadingsVal($name,"modeAlarm",""); my $amode = ReadingsVal($name,"modeAlarm","");
if ($contacts) if ($contacts)
{ {
foreach my $sensor (devspec2array($contacts)) for my $sensor (devspec2array($contacts))
{ {
next if (HOMEMODE_IsDisabled($hash,$sensor)); next if (HOMEMODE_IsDisabled($hash,$sensor));
my ($oread,$tread) = split " ",AttrVal($sensor,"HomeReadings",AttrVal($name,"HomeSensorsContactReadings","state sabotageError")),2; my ($oread,$tread) = split " ",AttrVal($sensor,"HomeReadings",AttrVal($name,"HomeSensorsContactReadings","state sabotageError")),2;
@ -2788,7 +2788,7 @@ sub HOMEMODE_TriggerState($;$$$)
} }
if ($motions) if ($motions)
{ {
foreach my $sensor (devspec2array($motions)) for my $sensor (devspec2array($motions))
{ {
next if (HOMEMODE_IsDisabled($hash,$sensor)); next if (HOMEMODE_IsDisabled($hash,$sensor));
my ($oread,$tread) = split " ",AttrVal($sensor,"HomeReadings",AttrVal($name,"HomeSensorsMotionReadings","state sabotageError")),2; my ($oread,$tread) = split " ",AttrVal($sensor,"HomeReadings",AttrVal($name,"HomeSensorsMotionReadings","state sabotageError")),2;
@ -2911,9 +2911,10 @@ sub HOMEMODE_name2alias($;$)
my ($name,$witharticle) = @_; my ($name,$witharticle) = @_;
my $alias = AttrVal($name,"alias",$name); my $alias = AttrVal($name,"alias",$name);
my $art; my $art;
$art = "der" if ($alias =~ /sensor|dete[ck]tor|melder/i);
$art = "die" if ($alias =~ /t(ü|ue)r/i); $art = "die" if ($alias =~ /t(ü|ue)r/i);
$art = "das" if ($alias =~ /fenster/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; my $ret = $witharticle && $art ? "$art $alias" : $alias;
return $ret; return $ret;
} }
@ -2932,7 +2933,7 @@ sub HOMEMODE_ContactOpenCheck($$;$$)
$donttrigger = 1 if ($dtmode && $mode =~ /^($dtmode)$/); $donttrigger = 1 if ($dtmode && $mode =~ /^($dtmode)$/);
if (!$donttrigger && $dtmode && $dtres) if (!$donttrigger && $dtmode && $dtres)
{ {
foreach (devspec2array($dtres)) for (devspec2array($dtres))
{ {
next if (HOMEMODE_IsDisabled(undef,$_)); next if (HOMEMODE_IsDisabled(undef,$_));
$donttrigger = 1 if (ReadingsVal($_,"state","") =~ /^($dtmode)$/); $donttrigger = 1 if (ReadingsVal($_,"state","") =~ /^($dtmode)$/);
@ -2956,7 +2957,7 @@ sub HOMEMODE_ContactOpenCheck($$;$$)
my @divs = split " ",$dividers; my @divs = split " ",$dividers;
my $divider; my $divider;
my $count = 0; my $count = 0;
foreach (split " ",$seasons) for (split " ",$seasons)
{ {
my ($date,$text) = split /\|/; my ($date,$text) = split /\|/;
$divider = $divs[$count] if ($season eq $text); $divider = $divs[$count] if ($season eq $text);
@ -3012,7 +3013,7 @@ sub HOMEMODE_ContactOpenCheckAfterModeChange($$$;$)
my $pstate = ReadingsVal($resident,"lastState","") if ($resident); my $pstate = ReadingsVal($resident,"lastState","") if ($resident);
if ($contacts) if ($contacts)
{ {
foreach (split /,/,$contacts) for (split /,/,$contacts)
{ {
my $m = AttrVal($_,"HomeOpenDontTriggerModes",""); my $m = AttrVal($_,"HomeOpenDontTriggerModes","");
my $r = AttrVal($_,"HomeOpenDontTriggerModesResidents",""); 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"); push @cmds,AttrVal($name,"HomeCMDcontactDoormainClosed","") if (AttrVal($name,"HomeCMDcontactDoormainClosed",undef) && $kind eq "doormain" && $state eq "closed");
if (@cmds) if (@cmds)
{ {
foreach (@cmds) for (@cmds)
{ {
my ($c,$o) = split /\|/,AttrVal($name,"HomeTextClosedOpen","closed|open"); my ($c,$o) = split /\|/,AttrVal($name,"HomeTextClosedOpen","closed|open");
my $sta = $state eq "open" ? $o : $c; 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"); push @cmds,AttrVal($name,"HomeCMDmotion-off","") if (AttrVal($name,"HomeCMDmotion-off",undef) && $state eq "closed");
if (@cmds) if (@cmds)
{ {
foreach (@cmds) for (@cmds)
{ {
my ($c,$o) = split /\|/,AttrVal($name,"HomeTextClosedOpen","closed|open"); my ($c,$o) = split /\|/,AttrVal($name,"HomeTextClosedOpen","closed|open");
$state = $state eq "open" ? $o : $c; $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-$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)); push @cmds,AttrVal($name,"HomeCMDevent-$cal-$evt-begin","") if (AttrVal($name,"HomeCMDevent-$cal-$evt-begin",undef));
readingsSingleUpdate($hash,"event-$cal",$event,1); readingsSingleUpdate($hash,"event-$cal",$event,1);
foreach (@cmds) for (@cmds)
{ {
$_ =~ s/%EVENT%/$event/gm; $_ =~ s/%EVENT%/$event/gm;
$_ =~ s/%PREVEVENT%/$prevevent/gm; $_ =~ s/%PREVEVENT%/$prevevent/gm;
@ -3112,14 +3113,14 @@ sub HOMEMODE_EventCommands($$$$)
{ {
my @prevevents; my @prevevents;
@prevevents = split /,/,$prevevent if ($prevevent ne "none"); @prevevents = split /,/,$prevevent if ($prevevent ne "none");
foreach (split /;/,$event) for (split /;/,$event)
{ {
$event =~ s/[\s ]//g; $event =~ s/[\s ]//g;
my $summary; my $summary;
my $description = ""; my $description = "";
my $t = time(); my $t = time();
my @filters = ( { ref => \&filter_true, param => undef } ); 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); next unless ($_->{uid} eq $event);
$summary = $_->{summary}; $summary = $_->{summary};
@ -3142,7 +3143,7 @@ sub HOMEMODE_EventCommands($$$$)
if (grep /^$summary$/,@prevevents) if (grep /^$summary$/,@prevevents)
{ {
my @sevents; my @sevents;
foreach (@prevevents) for (@prevevents)
{ {
push @sevents,$_ if ($_ ne $summary); push @sevents,$_ if ($_ ne $summary);
} }
@ -3153,7 +3154,7 @@ sub HOMEMODE_EventCommands($$$$)
{ {
push @prevevents,$summary if (!grep /^$summary$/,@prevevents); push @prevevents,$summary if (!grep /^$summary$/,@prevevents);
} }
foreach (@cmds) for (@cmds)
{ {
if ($read eq "start") if ($read eq "start")
{ {
@ -3173,7 +3174,7 @@ sub HOMEMODE_EventCommands($$$$)
$update = join ",",@prevevents if (@prevevents); $update = join ",",@prevevents if (@prevevents);
readingsSingleUpdate($hash,"event-$cal",$update,1); readingsSingleUpdate($hash,"event-$cal",$update,1);
} }
foreach (@cmds) for (@cmds)
{ {
$_ =~ s/%CALENDAR%/$cal/gm; $_ =~ s/%CALENDAR%/$cal/gm;
} }
@ -3188,7 +3189,7 @@ sub HOMEMODE_UWZCommands($$)
my $uwz = AttrVal($name,"HomeUWZ",""); my $uwz = AttrVal($name,"HomeUWZ","");
my $count; my $count;
my $warning; my $warning;
foreach my $evt (@{$events}) for my $evt (@{$events})
{ {
next unless (grep /^WarnCount:\s[0-9]$/,$evt); next unless (grep /^WarnCount:\s[0-9]$/,$evt);
$count = $evt; $count = $evt;
@ -3241,7 +3242,7 @@ sub HOMEMODE_PowerEnergy($;$$$)
my @spec = devspec2array($hash->{SENSORSENERGY}); my @spec = devspec2array($hash->{SENSORSENERGY});
if (@spec > 1) if (@spec > 1)
{ {
foreach (split /,/,$hash->{SENSORSENERGY}) for (split /,/,$hash->{SENSORSENERGY})
{ {
next unless ($_ ne $trigger); next unless ($_ ne $trigger);
my $v = ReadingsNum($_,$read,0); my $v = ReadingsNum($_,$read,0);
@ -3258,7 +3259,7 @@ sub HOMEMODE_PowerEnergy($;$$$)
my $power = 0; my $power = 0;
my $energy = 0; my $energy = 0;
my ($pr,$er) = split " ",AttrVal($name,"HomeSensorsPowerEnergyReadings","power energy"); my ($pr,$er) = split " ",AttrVal($name,"HomeSensorsPowerEnergyReadings","power energy");
foreach (split /,/,$hash->{SENSORSENERGY}) for (split /,/,$hash->{SENSORSENERGY})
{ {
my $p = ReadingsNum($_,$pr,0); my $p = ReadingsNum($_,$pr,0);
my $e = ReadingsNum($_,$er,0); my $e = ReadingsNum($_,$er,0);
@ -3281,7 +3282,7 @@ sub HOMEMODE_Smoke($;$$)
my $r = AttrVal($name,"HomeSensorsSmokeReading","state"); my $r = AttrVal($name,"HomeSensorsSmokeReading","state");
my $v = AttrVal($name,"HomeSensorsSmokeValue","on"); my $v = AttrVal($name,"HomeSensorsSmokeValue","on");
my @sensors; my @sensors;
foreach (split /,/,$hash->{SENSORSSMOKE}) for (split /,/,$hash->{SENSORSSMOKE})
{ {
push @sensors,$_ if (ReadingsVal($_,$r,"") =~ /^$v$/); push @sensors,$_ if (ReadingsVal($_,$r,"") =~ /^$v$/);
} }
@ -3299,7 +3300,7 @@ sub HOMEMODE_Smoke($;$$)
} }
if (@cmds) if (@cmds)
{ {
foreach (@cmds) for (@cmds)
{ {
my ($n,$s) = split /\|/,AttrVal($name,"HomeTextNosmokeSmoke","no smoke|smoke"); my ($n,$s) = split /\|/,AttrVal($name,"HomeTextNosmokeSmoke","no smoke|smoke");
my $sta = $state eq $v ? $s : $n; my $sta = $state eq $v ? $s : $n;
@ -3353,7 +3354,7 @@ sub HOMEMODE_Twilight($$;$)
else else
{ {
my $pevent = ReadingsVal($name,"twilightEvent",""); my $pevent = ReadingsVal($name,"twilightEvent","");
foreach my $event (@{$events}) for my $event (@{$events})
{ {
my $val = (split " ",$event)[1]; my $val = (split " ",$event)[1];
readingsBeginUpdate($hash); readingsBeginUpdate($hash);
@ -3406,7 +3407,7 @@ sub HOMEMODE_CalendarEvents($$)
{ {
my $fname = AttrVal("global","modpath",".")."/FHEM/".$cal.".holiday"; my $fname = AttrVal("global","modpath",".")."/FHEM/".$cal.".holiday";
my (undef,@holidayfile) = FileRead($fname); my (undef,@holidayfile) = FileRead($fname);
foreach (@holidayfile) for (@holidayfile)
{ {
next unless ($_ !~ /^\s*(#|$)/); next unless ($_ !~ /^\s*(#|$)/);
my @parts = split; my @parts = split;
@ -3423,7 +3424,7 @@ sub HOMEMODE_CalendarEvents($$)
{ {
my $t = time(); my $t = time();
my @filters = ( { ref => \&filter_true, param => undef } ); my @filters = ( { ref => \&filter_true, param => undef } );
foreach (Calendar_GetEvents($defs{$cal},$t,@filters)) for (Calendar_GetEvents($defs{$cal},$t,@filters))
{ {
my $evt = $_->{summary}; my $evt = $_->{summary};
Log3 $name,5,"Calendar_GetEvents event: $evt"; Log3 $name,5,"Calendar_GetEvents event: $evt";
@ -3498,7 +3499,7 @@ sub HOMEMODE_ToggleDevice($$)
{ {
push @cmds,AttrVal($name,"HomeCMDdeviceEnable","") if (AttrVal($name,"HomeCMDdeviceEnable","")); push @cmds,AttrVal($name,"HomeCMDdeviceEnable","") if (AttrVal($name,"HomeCMDdeviceEnable",""));
my @new; my @new;
foreach (@disabled) for (@disabled)
{ {
push @new,$_ if ($_ ne $devname); push @new,$_ if ($_ ne $devname);
} }
@ -3509,12 +3510,11 @@ sub HOMEMODE_ToggleDevice($$)
push @cmds,AttrVal($name,"HomeCMDdeviceDisable","") if (AttrVal($name,"HomeCMDdeviceDisable","")); push @cmds,AttrVal($name,"HomeCMDdeviceDisable","") if (AttrVal($name,"HomeCMDdeviceDisable",""));
push @disabled,$devname; push @disabled,$devname;
} }
my $dis = ""; my $dis = @disabled?join(",",@disabled):"";
$dis = join(",",@disabled) if (@disabled);
readingsSingleUpdate($hash,"devicesDisabled",$dis,1); readingsSingleUpdate($hash,"devicesDisabled",$dis,1);
if (@cmds) if (@cmds)
{ {
foreach (@cmds) for (@cmds)
{ {
my $a = HOMEMODE_name2alias($devname); my $a = HOMEMODE_name2alias($devname);
$_ =~ s/%ALIAS%/$a/gm; $_ =~ s/%ALIAS%/$a/gm;
@ -3524,12 +3524,12 @@ sub HOMEMODE_ToggleDevice($$)
} }
} }
my @list; my @list;
foreach my $d (split /,/,$hash->{NOTIFYDEV}) for my $d (split /,/,$hash->{NOTIFYDEV})
{ {
push @list,$d if (!grep /^$d$/,@disabled); push @list,$d if (!grep /^$d$/,@disabled);
} }
$hash->{helper}{enabledDevices} = join ",",@list; $hash->{helper}{enabledDevices} = join ",",@list;
return undef; return;
} }
sub HOMEMODE_IsDisabled($$) sub HOMEMODE_IsDisabled($$)