37_SHC.pm: Avoid experimental given/when Perl feature and use if-elsif instead.
git-svn-id: https://svn.fhem.de/fhem/trunk@26457 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
@@ -2,7 +2,7 @@
|
|||||||
# This file is part of the smarthomatic module for FHEM.
|
# This file is part of the smarthomatic module for FHEM.
|
||||||
#
|
#
|
||||||
# Copyright (c) 2014 Stefan Baumann
|
# Copyright (c) 2014 Stefan Baumann
|
||||||
# 2014, 2015, 2019 Uwe Freese
|
# 2014, 2015, 2019, 2022 Uwe Freese
|
||||||
#
|
#
|
||||||
# You can find smarthomatic at www.smarthomatic.org.
|
# You can find smarthomatic at www.smarthomatic.org.
|
||||||
# You can find FHEM at www.fhem.de.
|
# You can find FHEM at www.fhem.de.
|
||||||
@@ -227,18 +227,15 @@ sub SHCdev_Parse($$)
|
|||||||
# remember PacketCounter (which every message provides)
|
# remember PacketCounter (which every message provides)
|
||||||
readingsBulkUpdate($rhash, "packetCounter", $packetcounter);
|
readingsBulkUpdate($rhash, "packetCounter", $packetcounter);
|
||||||
|
|
||||||
given ($msggroupname) {
|
if ($msggroupname eq "Generic") {
|
||||||
when ('Generic') {
|
if ($msgname eq "Version") {
|
||||||
given ($msgname) {
|
|
||||||
when ('Version') {
|
|
||||||
my $major = $parser->getField("Major");
|
my $major = $parser->getField("Major");
|
||||||
my $minor = $parser->getField("Minor");
|
my $minor = $parser->getField("Minor");
|
||||||
my $patch = $parser->getField("Patch");
|
my $patch = $parser->getField("Patch");
|
||||||
my $vhash = $parser->getField("Hash");
|
my $vhash = $parser->getField("Hash");
|
||||||
|
|
||||||
readingsBulkUpdate($rhash, "version", "$major.$minor.$patch-$vhash");
|
readingsBulkUpdate($rhash, "version", "$major.$minor.$patch-$vhash");
|
||||||
}
|
} elsif ($msgname eq "DeviceInfo") {
|
||||||
when ('DeviceInfo') {
|
|
||||||
my $devtype = $parser->getField("DeviceType");
|
my $devtype = $parser->getField("DeviceType");
|
||||||
my $major = $parser->getField("VersionMajor");
|
my $major = $parser->getField("VersionMajor");
|
||||||
my $minor = $parser->getField("VersionMinor");
|
my $minor = $parser->getField("VersionMinor");
|
||||||
@@ -253,25 +250,19 @@ sub SHCdev_Parse($$)
|
|||||||
}
|
}
|
||||||
|
|
||||||
readingsBulkUpdate($rhash, "version", "$major.$minor.$patch-$vhash");
|
readingsBulkUpdate($rhash, "version", "$major.$minor.$patch-$vhash");
|
||||||
}
|
} elsif ($msgname eq "HardwareError") {
|
||||||
when ('HardwareError') {
|
|
||||||
readingsBulkUpdate($rhash, "hardwareErrorCode", $parser->getField("ErrorCode"));
|
readingsBulkUpdate($rhash, "hardwareErrorCode", $parser->getField("ErrorCode"));
|
||||||
}
|
} elsif ($msgname eq "BatteryStatus") {
|
||||||
when ('BatteryStatus') {
|
|
||||||
readingsBulkUpdate($rhash, "battery", $parser->getField("Percentage"));
|
readingsBulkUpdate($rhash, "battery", $parser->getField("Percentage"));
|
||||||
}
|
}
|
||||||
}
|
} elsif ($msggroupname eq "GPIO") {
|
||||||
}
|
if ($msgname eq "DigitalPortTimeout") {
|
||||||
when ('GPIO') {
|
|
||||||
given ($msgname) {
|
|
||||||
when ('DigitalPortTimeout') {
|
|
||||||
my $pins = "";
|
my $pins = "";
|
||||||
for (my $i = 0 ; $i < 8 ; $i++) {
|
for (my $i = 0 ; $i < 8 ; $i++) {
|
||||||
my $pinx = $parser->getField("On", $i);
|
my $pinx = $parser->getField("On", $i);
|
||||||
my $timeoutx = $parser->getField("TimeoutSec", $i);
|
my $timeoutx = $parser->getField("TimeoutSec", $i);
|
||||||
my $channel = $i + 1;
|
my $channel = $i + 1;
|
||||||
if ($channel == 1)
|
if ($channel == 1) {
|
||||||
{
|
|
||||||
readingsBulkUpdate($rhash, "on", $pinx);
|
readingsBulkUpdate($rhash, "on", $pinx);
|
||||||
}
|
}
|
||||||
readingsBulkUpdate($rhash, "pin" . $channel, $pinx);
|
readingsBulkUpdate($rhash, "pin" . $channel, $pinx);
|
||||||
@@ -279,22 +270,19 @@ sub SHCdev_Parse($$)
|
|||||||
$pins .= $pinx;
|
$pins .= $pinx;
|
||||||
}
|
}
|
||||||
readingsBulkUpdate($rhash, "port", $pins);
|
readingsBulkUpdate($rhash, "port", $pins);
|
||||||
}
|
} elsif ($msgname eq "DigitalPort") {
|
||||||
when ('DigitalPort') {
|
|
||||||
my $pins = "";
|
my $pins = "";
|
||||||
for (my $i = 0 ; $i < 8 ; $i++) {
|
for (my $i = 0 ; $i < 8 ; $i++) {
|
||||||
my $pinx = $parser->getField("On", $i);
|
my $pinx = $parser->getField("On", $i);
|
||||||
my $channel = $i + 1;
|
my $channel = $i + 1;
|
||||||
if ($channel == 1)
|
if ($channel == 1) {
|
||||||
{
|
|
||||||
readingsBulkUpdate($rhash, "on", $pinx);
|
readingsBulkUpdate($rhash, "on", $pinx);
|
||||||
}
|
}
|
||||||
readingsBulkUpdate($rhash, "pin" . $channel, $pinx);
|
readingsBulkUpdate($rhash, "pin" . $channel, $pinx);
|
||||||
$pins .= $pinx;
|
$pins .= $pinx;
|
||||||
}
|
}
|
||||||
readingsBulkUpdate($rhash, "port", $pins);
|
readingsBulkUpdate($rhash, "port", $pins);
|
||||||
}
|
} elsif ($msgname eq "AnalogPort") {
|
||||||
when ('AnalogPort') {
|
|
||||||
my $pins = "";
|
my $pins = "";
|
||||||
for (my $i = 0 ; $i < 5 ; $i++) {
|
for (my $i = 0 ; $i < 5 ; $i++) {
|
||||||
my $pinx_on = $parser->getField("On", $i);
|
my $pinx_on = $parser->getField("On", $i);
|
||||||
@@ -306,91 +294,71 @@ sub SHCdev_Parse($$)
|
|||||||
}
|
}
|
||||||
readingsBulkUpdate($rhash, "ains", $pins);
|
readingsBulkUpdate($rhash, "ains", $pins);
|
||||||
}
|
}
|
||||||
}
|
} elsif ($msggroupname eq "Weather") {
|
||||||
}
|
if ($msgname eq "Temperature") {
|
||||||
when ('Weather') {
|
|
||||||
given ($msgname) {
|
|
||||||
when ('Temperature') {
|
|
||||||
my $tmp = $parser->getField("Temperature") / 100; # parser returns centigrade
|
my $tmp = $parser->getField("Temperature") / 100; # parser returns centigrade
|
||||||
|
|
||||||
readingsBulkUpdate($rhash, "temperature", $tmp);
|
readingsBulkUpdate($rhash, "temperature", $tmp);
|
||||||
}
|
} elsif ($msgname eq "HumidityTemperature") {
|
||||||
when ('HumidityTemperature') {
|
|
||||||
my $hum = $parser->getField("Humidity") / 10; # parser returns 1/10 percent
|
my $hum = $parser->getField("Humidity") / 10; # parser returns 1/10 percent
|
||||||
my $tmp = $parser->getField("Temperature") / 100; # parser returns centigrade
|
my $tmp = $parser->getField("Temperature") / 100; # parser returns centigrade
|
||||||
|
|
||||||
readingsBulkUpdate($rhash, "humidity", $hum);
|
readingsBulkUpdate($rhash, "humidity", $hum);
|
||||||
readingsBulkUpdate($rhash, "temperature", $tmp);
|
readingsBulkUpdate($rhash, "temperature", $tmp);
|
||||||
}
|
} elsif ($msgname eq "BarometricPressureTemperature") {
|
||||||
when ('BarometricPressureTemperature') {
|
|
||||||
my $bar = $parser->getField("BarometricPressure") / 100; # parser returns pascal, use hPa
|
my $bar = $parser->getField("BarometricPressure") / 100; # parser returns pascal, use hPa
|
||||||
my $tmp = $parser->getField("Temperature") / 100; # parser returns centigrade
|
my $tmp = $parser->getField("Temperature") / 100; # parser returns centigrade
|
||||||
|
|
||||||
readingsBulkUpdate($rhash, "barometric_pressure", $bar);
|
readingsBulkUpdate($rhash, "barometric_pressure", $bar);
|
||||||
readingsBulkUpdate($rhash, "temperature", $tmp);
|
readingsBulkUpdate($rhash, "temperature", $tmp);
|
||||||
}
|
} elsif ($msgname eq "Humidity") {
|
||||||
when ('Humidity') {
|
|
||||||
my $hum = $parser->getField("Humidity") / 10; # parser returns 1/10 percent
|
my $hum = $parser->getField("Humidity") / 10; # parser returns 1/10 percent
|
||||||
|
|
||||||
readingsBulkUpdate($rhash, "humidity", $hum);
|
readingsBulkUpdate($rhash, "humidity", $hum);
|
||||||
}
|
}
|
||||||
}
|
} elsif ($msggroupname eq "Environment") {
|
||||||
}
|
if ($msgname eq "Brightness") {
|
||||||
when ('Environment') {
|
|
||||||
given ($msgname) {
|
|
||||||
when ('Brightness') {
|
|
||||||
my $brt = $parser->getField("Brightness");
|
my $brt = $parser->getField("Brightness");
|
||||||
readingsBulkUpdate($rhash, "brightness", $brt);
|
readingsBulkUpdate($rhash, "brightness", $brt);
|
||||||
}
|
} elsif ($msgname eq "Distance") {
|
||||||
when ('Distance') {
|
|
||||||
my $brt = $parser->getField("Distance");
|
my $brt = $parser->getField("Distance");
|
||||||
readingsBulkUpdate($rhash, "distance", $brt);
|
readingsBulkUpdate($rhash, "distance", $brt);
|
||||||
}
|
} elsif ($msgname eq "ParticulateMatter") {
|
||||||
when ('ParticulateMatter') {
|
|
||||||
my $size = $parser->getField("TypicalParticleSize");
|
my $size = $parser->getField("TypicalParticleSize");
|
||||||
|
|
||||||
if ($size != 1023) # 1023 means invalid
|
if ($size != 1023) { # 1023 means invalid
|
||||||
{
|
|
||||||
readingsBulkUpdate($rhash, "typicalParticleSize", $size / 100); # value was in 1/100 µm
|
readingsBulkUpdate($rhash, "typicalParticleSize", $size / 100); # value was in 1/100 µm
|
||||||
}
|
}
|
||||||
|
|
||||||
for (my $i = 0 ; $i < 5 ; $i++) {
|
for (my $i = 0 ; $i < 5 ; $i++) {
|
||||||
$size = $parser->getField("Size", $i);
|
$size = $parser->getField("Size", $i);
|
||||||
|
|
||||||
if ($size) # 0 means array element not used
|
if ($size) { # 0 means array element not used
|
||||||
{
|
|
||||||
my $pmStr = int($size / 10) . "." . ($size % 10);
|
my $pmStr = int($size / 10) . "." . ($size % 10);
|
||||||
my $massConcentration = $parser->getField("MassConcentration", $i);
|
my $massConcentration = $parser->getField("MassConcentration", $i);
|
||||||
my $numberConcentration = $parser->getField("NumberConcentration", $i);
|
my $numberConcentration = $parser->getField("NumberConcentration", $i);
|
||||||
|
|
||||||
if ($massConcentration != 1023) # 1023 means invalid
|
if ($massConcentration != 1023) { # 1023 means invalid
|
||||||
{
|
|
||||||
readingsBulkUpdate($rhash, "massConcentration_PM" . $pmStr, $massConcentration / 10); # value was in 1/10 µm
|
readingsBulkUpdate($rhash, "massConcentration_PM" . $pmStr, $massConcentration / 10); # value was in 1/10 µm
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($numberConcentration != 4095) # 4095 means invalid
|
if ($numberConcentration != 4095) { # 4095 means invalid
|
||||||
{
|
|
||||||
readingsBulkUpdate($rhash, "numberConcentration_PM" . $pmStr, $numberConcentration / 10); # value was in 1/10 µm
|
readingsBulkUpdate($rhash, "numberConcentration_PM" . $pmStr, $numberConcentration / 10); # value was in 1/10 µm
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} elsif ($msggroupname eq "Dimmer") {
|
||||||
}
|
if ($msgname eq "Brightness") {
|
||||||
when ('Dimmer') {
|
|
||||||
given ($msgname) {
|
|
||||||
when ('Brightness') {
|
|
||||||
my $brightness = $parser->getField("Brightness");
|
my $brightness = $parser->getField("Brightness");
|
||||||
my $on = $brightness == 0 ? 0 : 1;
|
my $on = $brightness == 0 ? 0 : 1;
|
||||||
|
|
||||||
readingsBulkUpdate($rhash, "on", $on);
|
readingsBulkUpdate($rhash, "on", $on);
|
||||||
readingsBulkUpdate($rhash, "brightness", $brightness);
|
readingsBulkUpdate($rhash, "brightness", $brightness);
|
||||||
}
|
} elsif ($msgname eq "Color") {
|
||||||
when ('Color') {
|
|
||||||
my $color = $parser->getField("Color");
|
my $color = $parser->getField("Color");
|
||||||
readingsBulkUpdate($rhash, "color", $color);
|
readingsBulkUpdate($rhash, "color", $color);
|
||||||
}
|
} elsif ($msgname eq "ColorAnimation") {
|
||||||
when ('ColorAnimation') {
|
|
||||||
my $repeat = $parser->getField("Repeat");
|
my $repeat = $parser->getField("Repeat");
|
||||||
my $autoreverse = $parser->getField("AutoReverse");
|
my $autoreverse = $parser->getField("AutoReverse");
|
||||||
readingsBulkUpdate($rhash, "repeat", $repeat);
|
readingsBulkUpdate($rhash, "repeat", $repeat);
|
||||||
@@ -403,8 +371,6 @@ sub SHCdev_Parse($$)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# If the devtype is defined add, if not already done, the according webCmds and devStateIcons
|
# If the devtype is defined add, if not already done, the according webCmds and devStateIcons
|
||||||
my $devtype2 = AttrVal( $rname, "devtype", undef );
|
my $devtype2 = AttrVal( $rname, "devtype", undef );
|
||||||
@@ -490,8 +456,7 @@ sub SHCdev_Set($@)
|
|||||||
|
|
||||||
my $readonly = AttrVal($name, "readonly", "0");
|
my $readonly = AttrVal($name, "readonly", "0");
|
||||||
|
|
||||||
given ($devtype) {
|
if ($devtype eq "PowerSwitch") {
|
||||||
when ('PowerSwitch') {
|
|
||||||
|
|
||||||
# Timeout functionality for SHCdev is not implemented, because FHEMs internal notification system
|
# Timeout functionality for SHCdev is not implemented, because FHEMs internal notification system
|
||||||
# is able to do this as well. Even more it supports intervals, off-for-timer, off-till ...
|
# is able to do this as well. Even more it supports intervals, off-for-timer, off-till ...
|
||||||
@@ -551,8 +516,7 @@ sub SHCdev_Set($@)
|
|||||||
} else {
|
} else {
|
||||||
return SetExtensions($hash, "", $name, @aa);
|
return SetExtensions($hash, "", $name, @aa);
|
||||||
}
|
}
|
||||||
}
|
} elsif ($devtype eq "Dimmer") {
|
||||||
when ('Dimmer') {
|
|
||||||
|
|
||||||
# Timeout functionality for SHCdev is not implemented, because FHEMs internal notification system
|
# Timeout functionality for SHCdev is not implemented, because FHEMs internal notification system
|
||||||
# is able to do this as well. Even more it supports intervals, off-for-timer, off-till ...
|
# is able to do this as well. Even more it supports intervals, off-for-timer, off-till ...
|
||||||
@@ -602,8 +566,7 @@ sub SHCdev_Set($@)
|
|||||||
} else {
|
} else {
|
||||||
return SetExtensions($hash, "", $name, @aa);
|
return SetExtensions($hash, "", $name, @aa);
|
||||||
}
|
}
|
||||||
}
|
} elsif ($devtype eq "RGBDimmer") {
|
||||||
when ('RGBDimmer') {
|
|
||||||
if ($cmd eq 'Color') {
|
if ($cmd eq 'Color') {
|
||||||
#TODO Verify argument values
|
#TODO Verify argument values
|
||||||
my $color = $arg;
|
my $color = $arg;
|
||||||
@@ -660,7 +623,6 @@ sub SHCdev_Set($@)
|
|||||||
return SetExtensions($hash, "", $name, @aa);
|
return SetExtensions($hash, "", $name, @aa);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
@@ -685,8 +647,7 @@ sub SHCdev_Get($@)
|
|||||||
return "No get commands for " . $devtype . " device type supported ";
|
return "No get commands for " . $devtype . " device type supported ";
|
||||||
}
|
}
|
||||||
|
|
||||||
given ($devtype) {
|
if ($devtype eq "EnvSensor") {
|
||||||
when ('EnvSensor') {
|
|
||||||
if ($cmd eq 'din') {
|
if ($cmd eq 'din') {
|
||||||
if ($arg =~ /[1-8]/) {
|
if ($arg =~ /[1-8]/) {
|
||||||
my $channel = "din" . $arg;
|
my $channel = "din" . $arg;
|
||||||
@@ -742,7 +703,6 @@ sub SHCdev_Get($@)
|
|||||||
# This return is required to provide the get commands in the web interface
|
# This return is required to provide the get commands in the web interface
|
||||||
return "Unknown argument $cmd, choose one of " . $gets{$devtype};
|
return "Unknown argument $cmd, choose one of " . $gets{$devtype};
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -101,8 +101,7 @@ sub init_datafield_positions_noarray($$$$$)
|
|||||||
{
|
{
|
||||||
my ($messageGroupID, $messageID, $field, $arrayLength, $arrayElementBits) = @_;
|
my ($messageGroupID, $messageID, $field, $arrayLength, $arrayElementBits) = @_;
|
||||||
|
|
||||||
given ($field->nodeName) {
|
if ($field->nodeName eq "UIntValue") {
|
||||||
when ('UIntValue') {
|
|
||||||
my $id = ($field->findnodes("ID"))[0]->textContent;
|
my $id = ($field->findnodes("ID"))[0]->textContent;
|
||||||
my $bits = ($field->findnodes("Bits"))[0]->textContent;
|
my $bits = ($field->findnodes("Bits"))[0]->textContent;
|
||||||
|
|
||||||
@@ -112,9 +111,7 @@ sub init_datafield_positions_noarray($$$$$)
|
|||||||
new UIntValue($id, $offset, $bits, $arrayLength, $arrayElementBits);
|
new UIntValue($id, $offset, $bits, $arrayLength, $arrayElementBits);
|
||||||
|
|
||||||
$offset += $bits;
|
$offset += $bits;
|
||||||
}
|
} elsif ($field->nodeName eq "IntValue") {
|
||||||
|
|
||||||
when ('IntValue') {
|
|
||||||
my $id = ($field->findnodes("ID"))[0]->textContent;
|
my $id = ($field->findnodes("ID"))[0]->textContent;
|
||||||
my $bits = ($field->findnodes("Bits"))[0]->textContent;
|
my $bits = ($field->findnodes("Bits"))[0]->textContent;
|
||||||
|
|
||||||
@@ -124,9 +121,7 @@ sub init_datafield_positions_noarray($$$$$)
|
|||||||
new IntValue($id, $offset, $bits, $arrayLength, $arrayElementBits);
|
new IntValue($id, $offset, $bits, $arrayLength, $arrayElementBits);
|
||||||
|
|
||||||
$offset += $bits;
|
$offset += $bits;
|
||||||
}
|
} elsif ($field->nodeName eq "FloatValue") {
|
||||||
|
|
||||||
when ('FloatValue') {
|
|
||||||
my $id = ($field->findnodes("ID"))[0]->textContent;
|
my $id = ($field->findnodes("ID"))[0]->textContent;
|
||||||
my $bits = 32;
|
my $bits = 32;
|
||||||
|
|
||||||
@@ -136,9 +131,7 @@ sub init_datafield_positions_noarray($$$$$)
|
|||||||
new FloatValue($id, $offset, $arrayLength, $arrayElementBits);
|
new FloatValue($id, $offset, $arrayLength, $arrayElementBits);
|
||||||
|
|
||||||
$offset += $bits;
|
$offset += $bits;
|
||||||
}
|
} elsif ($field->nodeName eq "BoolValue") {
|
||||||
|
|
||||||
when ('BoolValue') {
|
|
||||||
my $id = ($field->findnodes("ID"))[0]->textContent;
|
my $id = ($field->findnodes("ID"))[0]->textContent;
|
||||||
my $bits = 1;
|
my $bits = 1;
|
||||||
|
|
||||||
@@ -148,9 +141,7 @@ sub init_datafield_positions_noarray($$$$$)
|
|||||||
new BoolValue($id, $offset, $arrayLength, $arrayElementBits);
|
new BoolValue($id, $offset, $arrayLength, $arrayElementBits);
|
||||||
|
|
||||||
$offset += $bits;
|
$offset += $bits;
|
||||||
}
|
} elsif ($field->nodeName eq "EnumValue") {
|
||||||
|
|
||||||
when ('EnumValue') {
|
|
||||||
my $id = ($field->findnodes("ID"))[0]->textContent;
|
my $id = ($field->findnodes("ID"))[0]->textContent;
|
||||||
my $bits = ($field->findnodes("Bits"))[0]->textContent;
|
my $bits = ($field->findnodes("Bits"))[0]->textContent;
|
||||||
|
|
||||||
@@ -171,7 +162,6 @@ sub init_datafield_positions_noarray($$$$$)
|
|||||||
$offset += $bits;
|
$offset += $bits;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
sub init_datafield_positions_array($$$)
|
sub init_datafield_positions_array($$$)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user