mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-03-03 16:56:54 +00:00
22_HOMEMODE: v1.4.0 - add set deviceDisable/deviceEnable, add get mode/modeAlarm/devicesDisabled, add attributes HomeCMDdeviceDisable and HomeCMDdeviceEnable
git-svn-id: https://svn.fhem.de/fhem/trunk@15806 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
afcf38cc5b
commit
6bb72bd4da
@ -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.3.0";
|
my $HOMEMODE_version = "1.4.0";
|
||||||
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";
|
||||||
@ -59,7 +59,7 @@ sub HOMEMODE_Define($$)
|
|||||||
if (!$resdev)
|
if (!$resdev)
|
||||||
{
|
{
|
||||||
my @resdevs;
|
my @resdevs;
|
||||||
foreach (devspec2array("TYPE=RESIDENTS:FILTER=disable!=1"))
|
foreach (devspec2array("TYPE=RESIDENTS"))
|
||||||
{
|
{
|
||||||
push @resdevs,$_;
|
push @resdevs,$_;
|
||||||
}
|
}
|
||||||
@ -119,7 +119,7 @@ sub HOMEMODE_Undef($$)
|
|||||||
my ($hash,$arg) = @_;
|
my ($hash,$arg) = @_;
|
||||||
RemoveInternalTimer($hash);
|
RemoveInternalTimer($hash);
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
if (devspec2array("TYPE=HOMEMODE:FILTER=disable!=1") == 1)
|
if (devspec2array("TYPE=HOMEMODE") == 1)
|
||||||
{
|
{
|
||||||
HOMEMODE_cleanUserattr($hash,AttrVal($name,"HomeSensorsContact","")) if (AttrVal($name,"HomeSensorsContact",undef));
|
HOMEMODE_cleanUserattr($hash,AttrVal($name,"HomeSensorsContact","")) if (AttrVal($name,"HomeSensorsContact",undef));
|
||||||
HOMEMODE_cleanUserattr($hash,AttrVal($name,"HomeSensorsMotion","")) if (AttrVal($name,"HomeSensorsMotion",undef));
|
HOMEMODE_cleanUserattr($hash,AttrVal($name,"HomeSensorsMotion","")) if (AttrVal($name,"HomeSensorsMotion",undef));
|
||||||
@ -132,7 +132,7 @@ sub HOMEMODE_Notify($$)
|
|||||||
my ($hash,$dev) = @_;
|
my ($hash,$dev) = @_;
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
my $devname = $dev->{NAME};
|
my $devname = $dev->{NAME};
|
||||||
return if (IsDisabled($name) || IsDisabled($devname));
|
return if (IsDisabled($name) || HOMEMODE_IsDisabled($hash,$devname));
|
||||||
my $devtype = $dev->{TYPE};
|
my $devtype = $dev->{TYPE};
|
||||||
my $events = deviceEvents($dev,1);
|
my $events = deviceEvents($dev,1);
|
||||||
return if (!$events);
|
return if (!$events);
|
||||||
@ -377,7 +377,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=disable!=1:FILTER=presence=^(maybe.)?(absent|present|appeared|disappeared)"))
|
foreach my $device (devspec2array("TYPE=$prestype:FILTER=presence=^(maybe.)?(absent|present|appeared|disappeared)"))
|
||||||
{
|
{
|
||||||
next if (lc($device) !~ /$residentregex/);
|
next if (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)$/);
|
||||||
@ -522,7 +522,7 @@ sub HOMEMODE_updateInternals($;$$)
|
|||||||
push @allMonitoredDevices,$resdev;
|
push @allMonitoredDevices,$resdev;
|
||||||
my $autopresence = HOMEMODE_AttrCheck($hash,"HomeAutoPresence",0);
|
my $autopresence = HOMEMODE_AttrCheck($hash,"HomeAutoPresence",0);
|
||||||
my $presencetype = HOMEMODE_AttrCheck($hash,"HomePresenceDeviceType","PRESENCE");
|
my $presencetype = HOMEMODE_AttrCheck($hash,"HomePresenceDeviceType","PRESENCE");
|
||||||
my @presdevs = devspec2array("TYPE=$presencetype:FILTER=disable!=1: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})
|
foreach my $resident (split /,/,$hash->{RESIDENTS})
|
||||||
@ -536,13 +536,13 @@ sub HOMEMODE_updateInternals($;$$)
|
|||||||
my @residentspresdevs;
|
my @residentspresdevs;
|
||||||
foreach my $p (@presdevs)
|
foreach my $p (@presdevs)
|
||||||
{
|
{
|
||||||
next if (lc($p) !~ /($short)/);
|
next if (lc($p) !~ /$short/);
|
||||||
push @residentspresdevs,$p;
|
push @residentspresdevs,$p;
|
||||||
push @allMonitoredDevices,$p if (!grep /^($p)$/,@allMonitoredDevices);
|
push @allMonitoredDevices,$p if (!grep /^$p$/,@allMonitoredDevices);
|
||||||
}
|
}
|
||||||
my $c = scalar @residentspresdevs;
|
if (@residentspresdevs)
|
||||||
if ($c)
|
|
||||||
{
|
{
|
||||||
|
my $c = scalar @residentspresdevs;
|
||||||
my $devlist = join(",",@residentspresdevs);
|
my $devlist = join(",",@residentspresdevs);
|
||||||
$trans = $HOMEMODE_de?
|
$trans = $HOMEMODE_de?
|
||||||
"Gefunden wurden $c übereinstimmende(s) Anwesenheits Gerät(e) vom Devspec \"TYPE=$presencetype\" für Bewohner \"$resident\"! Übereinstimmende Geräte: \"$devlist\"":
|
"Gefunden wurden $c übereinstimmende(s) Anwesenheits Gerät(e) vom Devspec \"TYPE=$presencetype\" für Bewohner \"$resident\"! Übereinstimmende Geräte: \"$devlist\"":
|
||||||
@ -577,7 +577,6 @@ sub HOMEMODE_updateInternals($;$$)
|
|||||||
my @sensors;
|
my @sensors;
|
||||||
foreach my $s (devspec2array($contacts))
|
foreach my $s (devspec2array($contacts))
|
||||||
{
|
{
|
||||||
next if (IsDisabled($s));
|
|
||||||
push @sensors,$s;
|
push @sensors,$s;
|
||||||
push @allMonitoredDevices,$s if (!grep /^$s$/,@allMonitoredDevices);
|
push @allMonitoredDevices,$s if (!grep /^$s$/,@allMonitoredDevices);
|
||||||
}
|
}
|
||||||
@ -595,7 +594,6 @@ sub HOMEMODE_updateInternals($;$$)
|
|||||||
my @sensors;
|
my @sensors;
|
||||||
foreach my $s (devspec2array($motion))
|
foreach my $s (devspec2array($motion))
|
||||||
{
|
{
|
||||||
next if (IsDisabled($s));
|
|
||||||
push @sensors,$s;
|
push @sensors,$s;
|
||||||
push @allMonitoredDevices,$s if (!grep /^$s$/,@allMonitoredDevices);
|
push @allMonitoredDevices,$s if (!grep /^$s$/,@allMonitoredDevices);
|
||||||
}
|
}
|
||||||
@ -614,7 +612,7 @@ sub HOMEMODE_updateInternals($;$$)
|
|||||||
my ($p,$e) = split " ",AttrVal($name,"HomeSensorsPowerEnergyReadings","power energy");
|
my ($p,$e) = split " ",AttrVal($name,"HomeSensorsPowerEnergyReadings","power energy");
|
||||||
foreach my $s (devspec2array($power))
|
foreach my $s (devspec2array($power))
|
||||||
{
|
{
|
||||||
next unless (!IsDisabled($s) && defined ReadingsVal($s,$p,undef) && defined ReadingsVal($s,$e,undef));
|
next unless (HOMEMODE_ID($s,undef,$p) && HOMEMODE_ID($s,undef,$e));
|
||||||
push @sensors,$s;
|
push @sensors,$s;
|
||||||
push @allMonitoredDevices,$s if (!grep /^$s$/,@allMonitoredDevices);
|
push @allMonitoredDevices,$s if (!grep /^$s$/,@allMonitoredDevices);
|
||||||
}
|
}
|
||||||
@ -627,7 +625,7 @@ sub HOMEMODE_updateInternals($;$$)
|
|||||||
my $r = AttrVal($name,"HomeSensorsSmokeReading","state");
|
my $r = AttrVal($name,"HomeSensorsSmokeReading","state");
|
||||||
foreach my $s (devspec2array($smoke))
|
foreach my $s (devspec2array($smoke))
|
||||||
{
|
{
|
||||||
next unless (!IsDisabled($s) && defined ReadingsVal($s,$r,undef));
|
next unless (HOMEMODE_ID($s,undef,$r));
|
||||||
push @sensors,$s;
|
push @sensors,$s;
|
||||||
push @allMonitoredDevices,$s if (!grep /^$s$/,@allMonitoredDevices);
|
push @allMonitoredDevices,$s if (!grep /^$s$/,@allMonitoredDevices);
|
||||||
}
|
}
|
||||||
@ -639,7 +637,6 @@ sub HOMEMODE_updateInternals($;$$)
|
|||||||
my @sensors;
|
my @sensors;
|
||||||
foreach my $s (devspec2array($battery))
|
foreach my $s (devspec2array($battery))
|
||||||
{
|
{
|
||||||
next if (IsDisabled($s));
|
|
||||||
my $read = AttrVal($name,"HomeSensorsBatteryReading","battery");
|
my $read = AttrVal($name,"HomeSensorsBatteryReading","battery");
|
||||||
my $val = ReadingsVal($s,$read,undef);
|
my $val = ReadingsVal($s,$read,undef);
|
||||||
next unless (defined $val && $val =~ /^(ok|low|nok|\d{1,3})(%|\s%)?$/);
|
next unless (defined $val && $val =~ /^(ok|low|nok|\d{1,3})(%|\s%)?$/);
|
||||||
@ -665,14 +662,14 @@ sub HOMEMODE_updateInternals($;$$)
|
|||||||
{
|
{
|
||||||
foreach my $c (devspec2array(HOMEMODE_AttrCheck($hash,"HomeEventsHolidayDevices")))
|
foreach my $c (devspec2array(HOMEMODE_AttrCheck($hash,"HomeEventsHolidayDevices")))
|
||||||
{
|
{
|
||||||
push @cals,$c if (!IsDisabled($c) && !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")))
|
foreach my $c (devspec2array(HOMEMODE_AttrCheck($hash,"HomeEventsCalendarDevices")))
|
||||||
{
|
{
|
||||||
push @cals,$c if (!IsDisabled($c) && !grep /^$c$/,@cals);
|
push @cals,$c if (!grep /^$c$/,@cals);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
foreach my $c (@cals)
|
foreach my $c (@cals)
|
||||||
@ -696,12 +693,9 @@ sub HOMEMODE_updateInternals($;$$)
|
|||||||
my @sensors;
|
my @sensors;
|
||||||
foreach my $s (devspec2array($luminance))
|
foreach my $s (devspec2array($luminance))
|
||||||
{
|
{
|
||||||
next if (IsDisabled($s));
|
next unless (HOMEMODE_ID($s,undef,AttrVal($name,"HomeSensorsLuminanceReading","luminance")));
|
||||||
if (defined ReadingsVal($s,AttrVal($name,"HomeSensorsLuminanceReading","luminance"),undef))
|
push @sensors,$s;
|
||||||
{
|
push @allMonitoredDevices,$s if (!grep /^$s$/,@allMonitoredDevices);
|
||||||
push @sensors,$s;
|
|
||||||
push @allMonitoredDevices,$s if (!grep /^$s$/,@allMonitoredDevices);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
$hash->{SENSORSLUMINANCE} = join(",",sort @sensors) if (@sensors);
|
$hash->{SENSORSLUMINANCE} = join(",",sort @sensors) if (@sensors);
|
||||||
}
|
}
|
||||||
@ -726,6 +720,7 @@ sub HOMEMODE_updateInternals($;$$)
|
|||||||
HOMEMODE_Smoke($hash) if ($hash->{SENSORSSMOKE});
|
HOMEMODE_Smoke($hash) if ($hash->{SENSORSSMOKE});
|
||||||
HOMEMODE_Weather($hash,$weather) if ($weather);
|
HOMEMODE_Weather($hash,$weather) if ($weather);
|
||||||
HOMEMODE_Twilight($hash,$twilight,1) if ($twilight);
|
HOMEMODE_Twilight($hash,$twilight,1) if ($twilight);
|
||||||
|
HOMEMODE_ToggleDevice($hash,undef);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -752,29 +747,35 @@ sub HOMEMODE_Get($@)
|
|||||||
my ($hash,$name,@aa) = @_;
|
my ($hash,$name,@aa) = @_;
|
||||||
my ($cmd,@args) = @aa;
|
my ($cmd,@args) = @aa;
|
||||||
return if (IsDisabled($name) && $cmd ne "?");
|
return if (IsDisabled($name) && $cmd ne "?");
|
||||||
my $params;
|
my $params = "mode:noArg modeAlarm:noArg publicIP:noArg devicesDisabled:noArg";
|
||||||
$params .= "contactsOpen:all,doorsinside,doorsoutside,doorsmain,outside,windows" if ($hash->{SENSORSCONTACT});
|
$params .= " contactsOpen:all,doorsinside,doorsoutside,doorsmain,outside,windows" if ($hash->{SENSORSCONTACT});
|
||||||
$params .= " " if ($params);
|
$params .= " sensorsTampered:noArg" if ($hash->{SENSORSCONTACT} || $hash->{SENSORSMOTION});
|
||||||
$params .= "sensorsTampered:noArg" if ($hash->{SENSORSCONTACT} || $hash->{SENSORSMOTION});
|
|
||||||
$params .= " " if ($params);
|
|
||||||
$params .= "publicIP:noArg";
|
|
||||||
my $trans;
|
|
||||||
if (AttrVal($name,"HomeYahooWeatherDevice",undef))
|
if (AttrVal($name,"HomeYahooWeatherDevice",undef))
|
||||||
{
|
{
|
||||||
$params .= " " if ($params);
|
if (AttrVal($name,"HomeTextWeatherLong",undef) || AttrVal($name,"HomeTextWeatherShort",undef))
|
||||||
$params .= "weather:" if (AttrVal($name,"HomeTextWeatherLong",undef) || AttrVal($name,"HomeTextWeatherShort",undef));
|
|
||||||
$params .= "long" if (AttrVal($name,"HomeTextWeatherLong",undef));
|
|
||||||
if (AttrVal($name,"HomeTextWeatherShort",undef))
|
|
||||||
{
|
{
|
||||||
$params .= ",";
|
$params .= " weather:";
|
||||||
$params .= "short";
|
$params .= "long" if (AttrVal($name,"HomeTextWeatherLong",undef));
|
||||||
|
$params .= "," if (AttrVal($name,"HomeTextWeatherLong",undef) && AttrVal($name,"HomeTextWeatherShort",undef));
|
||||||
|
$params .= "short" if (AttrVal($name,"HomeTextWeatherShort",undef))
|
||||||
}
|
}
|
||||||
$params .= " " if ($params);
|
$params .= " weatherForecast" if (AttrVal($name,"HomeTextWeatherLong",undef));
|
||||||
$params .= "weatherForecast";
|
|
||||||
}
|
}
|
||||||
return if (!$params);
|
|
||||||
my $value = $args[0];
|
my $value = $args[0];
|
||||||
if ($cmd =~ /^contactsOpen$/)
|
my $trans;
|
||||||
|
if ($cmd eq "devicesDisabled")
|
||||||
|
{
|
||||||
|
return join "\n",split /,/,ReadingsVal($name,"devicesDisabled","");
|
||||||
|
}
|
||||||
|
elsif ($cmd eq "mode")
|
||||||
|
{
|
||||||
|
return ReadingsVal($name,"mode","no mode available");
|
||||||
|
}
|
||||||
|
elsif ($cmd eq "modeAlarm")
|
||||||
|
{
|
||||||
|
return ReadingsVal($name,"modeAlarm","no modeAlarm available");
|
||||||
|
}
|
||||||
|
elsif ($cmd =~ /^contactsOpen$/)
|
||||||
{
|
{
|
||||||
$trans = $HOMEMODE_de?
|
$trans = $HOMEMODE_de?
|
||||||
"$cmd benötigt ein Argument":
|
"$cmd benötigt ein Argument":
|
||||||
@ -854,11 +855,15 @@ sub HOMEMODE_Set($@)
|
|||||||
}
|
}
|
||||||
my $para;
|
my $para;
|
||||||
$para .= "mode:".join(",",sort @modeparams)." " if (!AttrNum($name,"HomeAutoDaytime",1));
|
$para .= "mode:".join(",",sort @modeparams)." " if (!AttrNum($name,"HomeAutoDaytime",1));
|
||||||
$para .= "modeAlarm:$HOMEMODE_AlarmModes";
|
$para .= "anyoneElseAtHome:on,off";
|
||||||
$para .= " modeAlarm-for-minutes";
|
$para .= " deviceDisable:";
|
||||||
|
$para .= $hash->{helper}{enabledDevices} ? $hash->{helper}{enabledDevices} : "noArg";
|
||||||
|
$para .= " deviceEnable:";
|
||||||
|
$para .= ReadingsVal($name,"devicesDisabled","") ? ReadingsVal($name,"devicesDisabled","") : "noArg";
|
||||||
$para .= " dnd:on,off";
|
$para .= " dnd:on,off";
|
||||||
$para .= " dnd-for-minutes";
|
$para .= " dnd-for-minutes";
|
||||||
$para .= " anyoneElseAtHome:on,off";
|
$para .= " modeAlarm:$HOMEMODE_AlarmModes";
|
||||||
|
$para .= " modeAlarm-for-minutes";
|
||||||
$para .= " panic:on,off";
|
$para .= " panic:on,off";
|
||||||
$para .= " location:".join(",", sort @locations);
|
$para .= " location:".join(",", sort @locations);
|
||||||
$para .= " updateInternalsForce:noArg";
|
$para .= " updateInternalsForce:noArg";
|
||||||
@ -1019,6 +1024,12 @@ sub HOMEMODE_Set($@)
|
|||||||
push @commands,AttrVal($name,"HomeCMDpanic-$option","") if (AttrVal($name,"HomeCMDpanic-$option",undef));
|
push @commands,AttrVal($name,"HomeCMDpanic-$option","") if (AttrVal($name,"HomeCMDpanic-$option",undef));
|
||||||
readingsSingleUpdate($hash,"panic",$option,1);
|
readingsSingleUpdate($hash,"panic",$option,1);
|
||||||
}
|
}
|
||||||
|
elsif ($cmd =~ /^device(Dis|En)able$/)
|
||||||
|
{
|
||||||
|
HOMEMODE_ToggleDevice($hash,$option)
|
||||||
|
if (($1 eq "En" && grep /^$option$/,split /,/,ReadingsVal($name,"devicesDisabled",""))
|
||||||
|
|| ($1 eq "Dis" && grep /^$option$/,split /,/,$hash->{helper}{enabledDevices}));
|
||||||
|
}
|
||||||
elsif ($cmd eq "updateInternalsForce")
|
elsif ($cmd eq "updateInternalsForce")
|
||||||
{
|
{
|
||||||
HOMEMODE_updateInternals($hash,1,1);
|
HOMEMODE_updateInternals($hash,1,1);
|
||||||
@ -1284,6 +1295,8 @@ sub HOMEMODE_Attributes($)
|
|||||||
push @attribs,"HomeCMDcontactOpenWarning2:textField-long";
|
push @attribs,"HomeCMDcontactOpenWarning2:textField-long";
|
||||||
push @attribs,"HomeCMDcontactOpenWarningLast:textField-long";
|
push @attribs,"HomeCMDcontactOpenWarningLast:textField-long";
|
||||||
push @attribs,"HomeCMDdaytime:textField-long";
|
push @attribs,"HomeCMDdaytime:textField-long";
|
||||||
|
push @attribs,"HomeCMDdeviceDisable:textField-long";
|
||||||
|
push @attribs,"HomeCMDdeviceEnable:textField-long";
|
||||||
push @attribs,"HomeCMDdnd:textField-long";
|
push @attribs,"HomeCMDdnd:textField-long";
|
||||||
push @attribs,"HomeCMDdnd-off:textField-long";
|
push @attribs,"HomeCMDdnd-off:textField-long";
|
||||||
push @attribs,"HomeCMDdnd-on:textField-long";
|
push @attribs,"HomeCMDdnd-on:textField-long";
|
||||||
@ -1428,7 +1441,6 @@ sub HOMEMODE_userattr($)
|
|||||||
{
|
{
|
||||||
foreach my $cal (devspec2array(HOMEMODE_AttrCheck($hash,"HomeEventsHolidayDevices")))
|
foreach my $cal (devspec2array(HOMEMODE_AttrCheck($hash,"HomeEventsHolidayDevices")))
|
||||||
{
|
{
|
||||||
next if (IsDisabled($cal));
|
|
||||||
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)
|
||||||
@ -1445,7 +1457,6 @@ sub HOMEMODE_userattr($)
|
|||||||
{
|
{
|
||||||
foreach my $cal (devspec2array(HOMEMODE_AttrCheck($hash,"HomeEventsCalendarDevices")))
|
foreach my $cal (devspec2array(HOMEMODE_AttrCheck($hash,"HomeEventsCalendarDevices")))
|
||||||
{
|
{
|
||||||
next if (IsDisabled($cal));
|
|
||||||
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)
|
||||||
@ -2122,6 +2133,7 @@ sub HOMEMODE_replacePlaceholders($$;$)
|
|||||||
my $lowBat = HOMEMODE_name2alias(ReadingsVal($name,"lastBatteryLow",""));
|
my $lowBat = HOMEMODE_name2alias(ReadingsVal($name,"lastBatteryLow",""));
|
||||||
my $lowBatAll = ReadingsVal($name,"batteryLow_hr","");
|
my $lowBatAll = ReadingsVal($name,"batteryLow_hr","");
|
||||||
my $lowBatCount = ReadingsVal($name,"batteryLow_ct",0);
|
my $lowBatCount = ReadingsVal($name,"batteryLow_ct",0);
|
||||||
|
my $disabled = ReadingsVal($name,"devicesDisabled","");
|
||||||
my $sensorsbattery = $hash->{SENSORSBATTERY};
|
my $sensorsbattery = $hash->{SENSORSBATTERY};
|
||||||
my $sensorscontact = $hash->{SENSORSCONTACT};
|
my $sensorscontact = $hash->{SENSORSCONTACT};
|
||||||
my $sensorsenergy = $hash->{SENSORSENERGY};
|
my $sensorsenergy = $hash->{SENSORSENERGY};
|
||||||
@ -2148,22 +2160,23 @@ sub HOMEMODE_replacePlaceholders($$;$)
|
|||||||
$cmd =~ s/%DEVICE%/$pdevice/g;
|
$cmd =~ s/%DEVICE%/$pdevice/g;
|
||||||
$cmd =~ s/%DEVICEA%/$apdevice/g;
|
$cmd =~ s/%DEVICEA%/$apdevice/g;
|
||||||
$cmd =~ s/%DEVICEP%/$ppdevice/g;
|
$cmd =~ s/%DEVICEP%/$ppdevice/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,"HomeEventsHolidayDevices",undef))
|
||||||
{
|
{
|
||||||
my @cals;
|
my @cals;
|
||||||
if (AttrVal($name,"HomeEventsHolidayDevices",""))
|
if (AttrVal($name,"HomeEventsHolidayDevices",""))
|
||||||
{
|
{
|
||||||
foreach (devspec2array(AttrVal($name,"HomeEventsHolidayDevices","")))
|
foreach my $c (devspec2array(AttrVal($name,"HomeEventsHolidayDevices","")))
|
||||||
{
|
{
|
||||||
push @cals,$_ if (!IsDisabled($_));
|
push @cals,$c if (!grep /^$c$/,@cals);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
foreach (devspec2array(AttrVal($name,"HomeEventsCalendarDevices","")))
|
foreach my $c (devspec2array(AttrVal($name,"HomeEventsCalendarDevices","")))
|
||||||
{
|
{
|
||||||
push @cals,$_ if (!IsDisabled($_));
|
push @cals,$c if (!grep /^$c$/,@cals);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
foreach my $cal (@cals)
|
foreach my $cal (@cals)
|
||||||
@ -2210,6 +2223,7 @@ sub HOMEMODE_replacePlaceholders($$;$)
|
|||||||
$cmd =~ s/%LUMINANCE%/$luminance/g;
|
$cmd =~ s/%LUMINANCE%/$luminance/g;
|
||||||
$cmd =~ s/%LUMINANCETREND%/$luminancetrend/g;
|
$cmd =~ s/%LUMINANCETREND%/$luminancetrend/g;
|
||||||
$cmd =~ s/%MODE%/$mode/g;
|
$cmd =~ s/%MODE%/$mode/g;
|
||||||
|
$cmd =~ s/%MODEALARM%/$amode/g;
|
||||||
$cmd =~ s/%MOTION%/$motion/g;
|
$cmd =~ s/%MOTION%/$motion/g;
|
||||||
$cmd =~ s/%NAME%/$name/g;
|
$cmd =~ s/%NAME%/$name/g;
|
||||||
$cmd =~ s/%OPEN%/$contactsOpen/g;
|
$cmd =~ s/%OPEN%/$contactsOpen/g;
|
||||||
@ -2422,7 +2436,7 @@ sub HOMEMODE_execCMDs($$;$)
|
|||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
my $cmd = HOMEMODE_replacePlaceholders($hash,$cmds,$resident);
|
my $cmd = HOMEMODE_replacePlaceholders($hash,$cmds,$resident);
|
||||||
my $err = AnalyzeCommandChain(undef,$cmd);
|
my $err = AnalyzeCommandChain(undef,$cmd);
|
||||||
if ($err && $err !~ /^Deleted.reading/)
|
if ($err && $err !~ /^Deleted.reading|Wrote.configuration/)
|
||||||
{
|
{
|
||||||
Log3 $name,3,"$name: error: $err";
|
Log3 $name,3,"$name: error: $err";
|
||||||
Log3 $name,3,"$name: error in command: $cmd";
|
Log3 $name,3,"$name: error in command: $cmd";
|
||||||
@ -2608,13 +2622,16 @@ sub HOMEMODE_Luminance($;$$)
|
|||||||
my @sensors = split /,/,$hash->{SENSORSLUMINANCE};
|
my @sensors = split /,/,$hash->{SENSORSLUMINANCE};
|
||||||
my $read = AttrVal($name,"HomeSensorsLuminanceReading","luminance");
|
my $read = AttrVal($name,"HomeSensorsLuminanceReading","luminance");
|
||||||
$lum = 0 if (!$lum);
|
$lum = 0 if (!$lum);
|
||||||
|
my @sensorsa;
|
||||||
foreach (@sensors)
|
foreach (@sensors)
|
||||||
{
|
{
|
||||||
|
next if (HOMEMODE_IsDisabled($hash,$_));
|
||||||
|
push @sensorsa,$_;
|
||||||
my $val = ReadingsNum($_,$read,0);
|
my $val = ReadingsNum($_,$read,0);
|
||||||
next if ($val < 0);
|
next if ($val < 0);
|
||||||
$lum += $val if (!$dev || $dev ne $_);
|
$lum += $val if (!$dev || $dev ne $_);
|
||||||
}
|
}
|
||||||
my $lumval = defined $lum ? int ($lum / scalar @sensors) : undef;
|
my $lumval = defined $lum ? int ($lum / scalar @sensorsa) : undef;
|
||||||
if (defined $lumval && $lumval >= 0)
|
if (defined $lumval && $lumval >= 0)
|
||||||
{
|
{
|
||||||
readingsSingleUpdate($hash,"luminance",$lumval,1);
|
readingsSingleUpdate($hash,"luminance",$lumval,1);
|
||||||
@ -2650,7 +2667,7 @@ sub HOMEMODE_TriggerState($;$$$)
|
|||||||
{
|
{
|
||||||
foreach my $sensor (devspec2array($contacts))
|
foreach my $sensor (devspec2array($contacts))
|
||||||
{
|
{
|
||||||
next if (IsDisabled($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;
|
||||||
my $otcmd = AttrVal($sensor,"HomeValues",AttrVal($name,"HomeSensorsContactValues","open|tilted|on"));
|
my $otcmd = AttrVal($sensor,"HomeValues",AttrVal($name,"HomeSensorsContactValues","open|tilted|on"));
|
||||||
my $amodea = AttrVal($sensor,"HomeModeAlarmActive","-");
|
my $amodea = AttrVal($sensor,"HomeModeAlarmActive","-");
|
||||||
@ -2703,7 +2720,7 @@ sub HOMEMODE_TriggerState($;$$$)
|
|||||||
{
|
{
|
||||||
foreach my $sensor (devspec2array($motions))
|
foreach my $sensor (devspec2array($motions))
|
||||||
{
|
{
|
||||||
next if (IsDisabled($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;
|
||||||
my $otcmd = AttrVal($sensor,"HomeValues",AttrVal($name,"HomeSensorsMotionValues","open|on"));
|
my $otcmd = AttrVal($sensor,"HomeValues",AttrVal($name,"HomeSensorsMotionValues","open|on"));
|
||||||
my $amodea = AttrVal($sensor,"HomeModeAlarmActive","-");
|
my $amodea = AttrVal($sensor,"HomeModeAlarmActive","-");
|
||||||
@ -2847,7 +2864,7 @@ sub HOMEMODE_ContactOpenCheck($$;$$)
|
|||||||
{
|
{
|
||||||
foreach (devspec2array($dtres))
|
foreach (devspec2array($dtres))
|
||||||
{
|
{
|
||||||
next if (IsDisabled($_));
|
next if (HOMEMODE_IsDisabled(undef,$_));
|
||||||
$donttrigger = 1 if (ReadingsVal($_,"state","") =~ /^($dtmode)$/);
|
$donttrigger = 1 if (ReadingsVal($_,"state","") =~ /^($dtmode)$/);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3125,12 +3142,12 @@ sub HOMEMODE_HomebridgeMapping($)
|
|||||||
$mapping .= "\nOccupancyDetected=presence,values=present:1;absent:0";
|
$mapping .= "\nOccupancyDetected=presence,values=present:1;absent:0";
|
||||||
$mapping .= "\nMute=dnd,valueOn=on,cmdOn=dnd+on,cmdOff=dnd+off";
|
$mapping .= "\nMute=dnd,valueOn=on,cmdOn=dnd+on,cmdOff=dnd+off";
|
||||||
$mapping .= "\nOn=anyoneElseAtHome,valueOn=on,cmdOn=anyoneElseAtHome+on,cmdOff=anyoneElseAtHome+off";
|
$mapping .= "\nOn=anyoneElseAtHome,valueOn=on,cmdOn=anyoneElseAtHome+on,cmdOff=anyoneElseAtHome+off";
|
||||||
$mapping .= "\nContactSensorState=contactsOutsideOpen_ct,values=0:0;/.*/:1" if (defined ReadingsVal($name,"contactsOutsideOpen_ct",undef));
|
$mapping .= "\nContactSensorState=contactsOutsideOpen_ct,values=0:0;/.*/:1" if (HOMEMODE_ID($name,undef,"contactsOutsideOpen_ct"));
|
||||||
$mapping .= "\nStatusTampered=sensorsTampered_ct,values=0:0;/.*/:1" if (defined ReadingsVal($name,"sensorsTampered_ct",undef));
|
$mapping .= "\nStatusTampered=sensorsTampered_ct,values=0:0;/.*/:1" if (HOMEMODE_ID($name,undef,"sensorsTampered_ct"));
|
||||||
$mapping .= "\nMotionDetected=motionsInside_ct,values=0:0;/.*/:1" if (defined ReadingsVal($name,"motionsInside_ct",undef));
|
$mapping .= "\nMotionDetected=motionsInside_ct,values=0:0;/.*/:1" if (HOMEMODE_ID($name,undef,"motionsInside_ct"));
|
||||||
$mapping .= "\nStatusLowBattery=batteryLow_ct,values=0:0;/.*/:1" if (defined ReadingsVal($name,"batteryLow_ct",undef));
|
$mapping .= "\nStatusLowBattery=batteryLow_ct,values=0:0;/.*/:1" if (HOMEMODE_ID($name,undef,"batteryLow_ct"));
|
||||||
$mapping .= "\nSmokeDetected=alarmSmoke_ct,values=0:0;/.*/:1" if (defined ReadingsVal($name,"alarmSmoke_ct",undef));
|
$mapping .= "\nSmokeDetected=alarmSmoke_ct,values=0:0;/.*/:1" if (HOMEMODE_ID($name,undef,"alarmSmoke_ct"));
|
||||||
$mapping .= "\nE863F10F-079E-48FF-8F27-9C2605A29F52=pressure,name=AirPressure,format=UINT16" if (defined ReadingsVal($name,"wind",undef));
|
$mapping .= "\nE863F10F-079E-48FF-8F27-9C2605A29F52=pressure,name=AirPressure,format=UINT16" if (HOMEMODE_ID($name,undef,"wind"));
|
||||||
addToDevAttrList($name,"genericDeviceType") if (!grep /^genericDeviceType/,split(" ",AttrVal("global","userattr","")));
|
addToDevAttrList($name,"genericDeviceType") if (!grep /^genericDeviceType/,split(" ",AttrVal("global","userattr","")));
|
||||||
addToDevAttrList($name,"homebridgeMapping:textField-long") if (!grep /^homebridgeMapping/,split(" ",AttrVal("global","userattr","")));
|
addToDevAttrList($name,"homebridgeMapping:textField-long") if (!grep /^homebridgeMapping/,split(" ",AttrVal("global","userattr","")));
|
||||||
CommandAttr(undef,"$name genericDeviceType security");
|
CommandAttr(undef,"$name genericDeviceType security");
|
||||||
@ -3361,6 +3378,61 @@ sub HOMEMODE_checkIP($;$)
|
|||||||
return $r ? $ip : undef;
|
return $r ? $ip : undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub HOMEMODE_ToggleDevice($$)
|
||||||
|
{
|
||||||
|
my ($hash,$devname) = @_;
|
||||||
|
my $name = $hash->{NAME};
|
||||||
|
my @disabled;
|
||||||
|
@disabled = split /,/,ReadingsVal($name,"devicesDisabled","") if (ReadingsVal($name,"devicesDisabled",""));
|
||||||
|
if ($devname)
|
||||||
|
{
|
||||||
|
my @cmds;
|
||||||
|
if (grep /^$devname$/,@disabled)
|
||||||
|
{
|
||||||
|
push @cmds,AttrVal($name,"HomeCMDdeviceEnable","") if (AttrVal($name,"HomeCMDdeviceEnable",""));
|
||||||
|
my @new;
|
||||||
|
foreach (@disabled)
|
||||||
|
{
|
||||||
|
push @new,$_ if ($_ ne $devname);
|
||||||
|
}
|
||||||
|
@disabled = @new;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
push @cmds,AttrVal($name,"HomeCMDdeviceDisable","") if (AttrVal($name,"HomeCMDdeviceDisable",""));
|
||||||
|
push @disabled,$devname;
|
||||||
|
}
|
||||||
|
my $dis = "";
|
||||||
|
$dis = join(",",@disabled) if (@disabled);
|
||||||
|
readingsSingleUpdate($hash,"devicesDisabled",$dis,1);
|
||||||
|
if (@cmds)
|
||||||
|
{
|
||||||
|
foreach (@cmds)
|
||||||
|
{
|
||||||
|
my $a = HOMEMODE_name2alias($devname);
|
||||||
|
$_ =~ s/%ALIAS%/$a/gm;
|
||||||
|
$_ =~ s/%DEVICE%/$devname/gm;
|
||||||
|
}
|
||||||
|
HOMEMODE_execCMDs($hash,HOMEMODE_serializeCMD($hash,@cmds));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
my @list;
|
||||||
|
foreach my $d (split /,/,$hash->{NOTIFYDEV})
|
||||||
|
{
|
||||||
|
push @list,$d if (!grep /^$d$/,@disabled);
|
||||||
|
}
|
||||||
|
$hash->{helper}{enabledDevices} = join ",",@list;
|
||||||
|
return undef;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub HOMEMODE_IsDisabled($$)
|
||||||
|
{
|
||||||
|
my ($hash,$devname) = @_;
|
||||||
|
return 1 if (IsDisabled($devname));
|
||||||
|
return 1 if ($hash && grep /^$devname$/,split /,/,ReadingsVal($hash->{NAME},"devicesDisabled",""));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
sub HOMEMODE_Details($$$)
|
sub HOMEMODE_Details($$$)
|
||||||
{
|
{
|
||||||
my ($FW_name,$name,$room) = @_;
|
my ($FW_name,$name,$room) = @_;
|
||||||
@ -3494,6 +3566,18 @@ sub HOMEMODE_Details($$$)
|
|||||||
if turned on the alarm mode will be set to armhome instead of armaway while leaving, if turned on after leaving the alarm mode will change from armaway to armhome, e.g. to disable motion sensors alerts<br>
|
if turned on the alarm mode will be set to armhome instead of armaway while leaving, if turned on after leaving the alarm mode will change from armaway to armhome, e.g. to disable motion sensors alerts<br>
|
||||||
placeholder %AEAH% is available in all HomeCMD attributes
|
placeholder %AEAH% is available in all HomeCMD attributes
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<b><i>deviceDisable <DEVICE></i></b><br>
|
||||||
|
disable HOMEMODE integration for given device<br>
|
||||||
|
placeholder %DISABLED% is available in all HomeCMD attributes<br>
|
||||||
|
placeholders %DEVICE% and %ALIAS% are available in HomeCMDdeviceDisable attribute
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<b><i>deviceEnable <DEVICE></i></b><br>
|
||||||
|
enable HOMEMODE integration for given device<br>
|
||||||
|
placeholder %DISABLED% is available in all HomeCMD attributes<br>
|
||||||
|
placeholders %DEVICE% and %ALIAS% are available in HomeCMDdeviceEnable attribute
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<b><i>dnd <on/off></i></b><br>
|
<b><i>dnd <on/off></i></b><br>
|
||||||
turn "do not disturb" mode on or off<br>
|
turn "do not disturb" mode on or off<br>
|
||||||
@ -3518,7 +3602,7 @@ sub HOMEMODE_Details($$$)
|
|||||||
<li>
|
<li>
|
||||||
<b><i>modeAlarm <armaway/armhome/armnight/confirm/disarm></i></b><br>
|
<b><i>modeAlarm <armaway/armhome/armnight/confirm/disarm></i></b><br>
|
||||||
switch to given alarm mode manually<br>
|
switch to given alarm mode manually<br>
|
||||||
placeholder %AMODE% is available in all HomeCMD attributes
|
placeholder %MODEALARM% is available in all HomeCMD attributes
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<b><i>modeAlarm-for-minutes <armaway/armhome/armnight/disarm> <MINUTES></i></b><br>
|
<b><i>modeAlarm-for-minutes <armaway/armhome/armnight/disarm> <MINUTES></i></b><br>
|
||||||
@ -3549,6 +3633,21 @@ sub HOMEMODE_Details($$$)
|
|||||||
get a list of all/doorsinside/doorsoutside/doorsmain/outside/windows open contacts<br>
|
get a list of all/doorsinside/doorsoutside/doorsmain/outside/windows open contacts<br>
|
||||||
placeholders %OPEN% (open contacts outside) and %OPENCT% (open contacts outside count) are available in all HomeCMD attributes
|
placeholders %OPEN% (open contacts outside) and %OPENCT% (open contacts outside count) are available in all HomeCMD attributes
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<b><i>devicesDisabled</i></b><br>
|
||||||
|
get new line separated list of currently disabled devices<br>
|
||||||
|
placeholder %DISABLED% is available in all HomeCMD attributes
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<b><i>mode</i></b><br>
|
||||||
|
get current mode<br>
|
||||||
|
placeholder %MODE% is available in all HomeCMD attributes
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<b><i>modeAlarm</i></b><br>
|
||||||
|
get current modeAlarm<br>
|
||||||
|
placeholder %MODEALARM% is available in all HomeCMD attributes
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<b><i>publicIP</i></b><br>
|
<b><i>publicIP</i></b><br>
|
||||||
get the public IP address<br>
|
get the public IP address<br>
|
||||||
@ -4373,6 +4472,10 @@ sub HOMEMODE_Details($$$)
|
|||||||
<b><i>dnd</i></b><br>
|
<b><i>dnd</i></b><br>
|
||||||
dnd (do not disturb) on or off
|
dnd (do not disturb) on or off
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<b><i>devicesDisabled</i></b><br>
|
||||||
|
comma separated list of disabled devices
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<b><i>energy</i></b><br>
|
<b><i>energy</i></b><br>
|
||||||
calculated total energy
|
calculated total energy
|
||||||
@ -4719,6 +4822,10 @@ sub HOMEMODE_Details($$$)
|
|||||||
<b><i>%DEVICEP%</i></b><br>
|
<b><i>%DEVICEP%</i></b><br>
|
||||||
name of the last triggered present presence device
|
name of the last triggered present presence device
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<b><i>%DISABLED%</i></b><br>
|
||||||
|
comma separated list of disabled devices
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<b><i>%DND%</i></b><br>
|
<b><i>%DND%</i></b><br>
|
||||||
state of dnd, will return 1 if on and 0 if off
|
state of dnd, will return 1 if on and 0 if off
|
||||||
@ -4812,6 +4919,10 @@ sub HOMEMODE_Details($$$)
|
|||||||
<b><i>%MODE%</i></b><br>
|
<b><i>%MODE%</i></b><br>
|
||||||
current mode of the HOMEMODE device
|
current mode of the HOMEMODE device
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<b><i>%MODEALARM%</i></b><br>
|
||||||
|
current alarm mode
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<b><i>%MOTION%</i></b><br>
|
<b><i>%MOTION%</i></b><br>
|
||||||
value of the lastMotion reading (last opened sensor)
|
value of the lastMotion reading (last opened sensor)
|
||||||
@ -5044,6 +5155,17 @@ sub HOMEMODE_Details($$$)
|
|||||||
previous event of the calendar
|
previous event of the calendar
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
<p>These placeholders can only be used within HomeCMDdeviceDisable and HomeCMDdeviceEnable attributes</p>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<b><i>%DEVICE%</i></b><br>
|
||||||
|
name of the disabled/enabled device
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<b><i>%ALIAS%</i></b><br>
|
||||||
|
alias of the disabled/enabled device
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
=end html
|
=end html
|
||||||
|
Loading…
x
Reference in New Issue
Block a user