diff --git a/fhem/FHEM/10_EnOcean.pm b/fhem/FHEM/10_EnOcean.pm
index d34f731b9..65b0a0e37 100755
--- a/fhem/FHEM/10_EnOcean.pm
+++ b/fhem/FHEM/10_EnOcean.pm
@@ -20,9 +20,17 @@ my %EnO_rorgname = ("F6"=>"switch", # org 05, RPS
my @EnO_ptm200btn = ("AI", "A0", "BI", "B0", "CI", "C0", "DI", "D0");
my %EnO_ptm200btn;
-# Peha House Control System (PHC)
+# Peha House Control System (PHC System)
# PHC Gateway Commands
my @EnO_phcCmd = ("switching", "dimming", "setpointShift", "setpointBasic", "controlVar", "fanStage");
+my %EnO_phcCmd = (
+ "switching" => 1,
+ "dimming" => 2,
+ "setpointShift" => 3,
+ "setpointBasic" => 4,
+ "controlVar" => 5,
+ "fanStage" => 6,
+);
# Some Manufacturers (e.g. Jaeger Direkt) also sell EnOcean products without an
# entry in the table below. This table is only needed for A5 category devices.
@@ -88,11 +96,15 @@ my %EnO_subType = (
"A5.04.02" => "tempHumiSensor.02",
"A5.06.01" => "lightSensor.01",
"A5.06.02" => "lightSensor.02",
+ "A5.06.03" => "lightSensor.03",
"A5.07.01" => "occupSensor.01",
+ "A5.07.02" => "occupSensor.02",
+ "A5.07.03" => "occupSensor.03",
"A5.08.01" => "lightTempOccupSensor.01",
"A5.08.02" => "lightTempOccupSensor.02",
"A5.08.03" => "lightTempOccupSensor.03",
"A5.09.01" => "COSensor.01",
+ "A5.09.02" => "COSensor.02",
"A5.09.04" => "tempHumiCO2Sensor.01",
"A5.10.01" => "roomSensorControl.05",
"A5.10.02" => "roomSensorControl.05",
@@ -125,6 +137,12 @@ my %EnO_subType = (
"A5.13.04" => "weatherStation",
"A5.13.05" => "weatherStation",
"A5.13.06" => "weatherStation",
+ "A5.14.01" => "multiFuncSensor",
+ "A5.14.02" => "multiFuncSensor",
+ "A5.14.03" => "multiFuncSensor",
+ "A5.14.04" => "multiFuncSensor",
+ "A5.14.05" => "multiFuncSensor",
+ "A5.14.06" => "multiFuncSensor",
"A5.20.01" => "MD15",
"A5.30.01" => "digitalInput.01",
"A5.30.02" => "digitalInput.02",
@@ -404,11 +422,27 @@ EnOcean_Set($@)
Log $ll2, "EnOcean: set $name $cmd";
}
- } elsif ($st eq "phcGateway") {
+ } elsif ($st eq "phcGateway" && $model ne "FSG70") {
# PHC Gateway (EEP A5-38-08)
+ # select PHC Command from attribute phcCmd or command line
my $data;
- my $phcCmd = AttrVal($name, "phcCmd", "");
- my $phcCmdID;
+ my $phcCmd = AttrVal($name, "phcCmd", undef);
+ if ($phcCmd && $EnO_phcCmd{$phcCmd}) {
+ # PHC Command from attribute phcCmd
+ if ($EnO_phcCmd{$cmd}) {
+ # shift $cmd
+ $cmd = $a[1];
+ shift(@a);
+ }
+ } elsif ($EnO_phcCmd{$cmd}) {
+ # PHC Command from command line
+ $phcCmd = $cmd;
+ $cmd = $a[1];
+ shift(@a);
+ } else {
+ return "Unknown PHC Gateway Command " . $cmd . ", choose one of " . join(" ", sort keys %EnO_phcCmd);
+ }
+ my $phcCmdID;
my $setCmd = 0;
my $subDef = AttrVal($name, "subDef", "$hash->{DEF}");
my $time = 0;
@@ -451,6 +485,7 @@ EnOcean_Set($@)
$setCmd = 9;
my $subDef = AttrVal($name, "subDef", "$hash->{DEF}");
if ($cmd eq "teach") {
+ $setCmd = 0;
$data = sprintf "A5%02X000000%s00", $phcCmdID, $subDef;
} elsif ($cmd eq "dim") {
@@ -549,43 +584,197 @@ EnOcean_Set($@)
if ($rampTime > 255) { $rampTime = 255; }
if ($rampTime < 0) { $rampTime = 0; }
$updateState = 0;
- $data = sprintf "A502%02X%02X%02X%s00", $dimVal, $rampTime, $setCmd, $subDef;
+ $data = sprintf "A5%02X%02X%02X%02X%s00", $phcCmdID, $dimVal, $rampTime, $setCmd, $subDef;
}
} elsif ($phcCmd eq "setpointShift") {
$phcCmdID = 3;
if($cmd eq "teach") { $data = sprintf "A5%02X000000%s00", $phcCmdID, $subDef;
} else {
-
+ if (($cmd =~ m/^[+-]?\d+(\.\d+)?$/) && ($cmd >= -12.7) && ($cmd <= 12.8)) {
+ $data = sprintf "A5%02X00%02X08%s00", $phcCmdID, ($cmd + 12.7) * 10, $subDef;
+ } else {
+ return "Usage: $cmd is not numeric or out of range";
+ }
}
} elsif ($phcCmd eq "setpointBasic") {
$phcCmdID = 4;
if($cmd eq "teach") { $data = sprintf "A5%02X000000%s00", $phcCmdID, $subDef;
} else {
-
+ if (($cmd =~ m/^[+-]?\d+(\.\d+)?$/) && ($cmd >= 0) && ($cmd <= 51.2)) {
+ $data = sprintf "A5%02X00%02X08%s00", $phcCmdID, $cmd * 5, $subDef;
+ } else {
+ return "Usage: $cmd is not numeric or out of range.";
+ }
}
} elsif ($phcCmd eq "controlVar") {
$phcCmdID = 5;
- if($cmd eq "teach") { $data = printf "A5%02X000000%s00", $phcCmdID, $subDef;
+ my $controlVar = ReadingsVal($name, "controlVar", 0);
+ if($cmd eq "teach") {
+ $data = printf "A5%02X000000%s00", $phcCmdID, $subDef;
+ } elsif ($cmd eq "presence") {
+ if ($a[1] eq "standby") {
+ $setCmd = 0x0A;
+ } elsif ($a[1] eq "absent") {
+ $setCmd = 9;
+ } elsif ($a[1] eq "present") {
+ $setCmd = 8;
+ } else {
+ return "Usage: $cmd $a[1] unknown.";
+ }
+ shift(@a);
+ $data = sprintf "A5%02X00%02X%02X%s00", $phcCmdID, $controlVar, $setCmd, $subDef;
+ } elsif ($cmd eq "energyHoldOff") {
+ if ($a[1] eq "normal") {
+ $setCmd = 8;
+ } elsif ($a[1] eq "holdoff") {
+ $setCmd = 0x0C;
+ } else {
+ return "Usage: $cmd $a[1] unknown.";
+ }
+ shift(@a);
+ $data = sprintf "A5%02X00%02X%02X%s00", $phcCmdID, $controlVar, $setCmd, $subDef;
+ } elsif ($cmd eq "controllerMode") {
+ if ($a[1] eq "auto") {
+ $setCmd = 8;
+ } elsif ($a[1] eq "heating") {
+ $setCmd = 0x28;
+ } elsif ($a[1] eq "cooling") {
+ $setCmd = 0x48;
+ } elsif ($a[1] eq "off" or $a[1] eq "BI") {
+ $setCmd = 0x68;
+ } else {
+ return "Usage: $cmd $a[1] unknown.";
+ }
+ shift(@a);
+ $data = sprintf "A5%02X00%02X%02X%s00", $phcCmdID, $controlVar, $setCmd, $subDef;
+ } elsif ($cmd eq "controllerState") {
+ if ($a[1] eq "auto") {
+ $setCmd = 8;
+ } elsif ($a[1] eq "override") {
+ $setCmd = 0x18;
+ if (defined($a[2]) && ($a[2] =~ m/^[+-]?\d+$/) && ($a[2] >= 0) && ($a[2] <= 100) ) {
+ $controlVar = $a[2] * 255;
+ shift(@a);
+ } else {
+ return "Usage: Control Variable Override is not numeric or out of range.";
+ }
+ } else {
+ return "Usage: $cmd $a[1] unknown.";
+ }
+ shift(@a);
+ $data = sprintf "A5%02X00%02X%02X%s00", $phcCmdID, $controlVar, $setCmd, $subDef;
} else {
-
+ return "Usage: Controller State unknown or not defined.";
}
} elsif ($phcCmd eq "fanStage") {
$phcCmdID = 6;
- if($cmd eq "teach") { $data = sprintf "A5%02X000000%s00", $phcCmdID, $subDef;
+ if($cmd eq "teach") {
+ $data = sprintf "A5%02X000000%s00", $phcCmdID, $subDef;
} else {
-
+ if ($cmd eq "auto") {
+ $data = sprintf "A5%02X00%02X08%s00", $phcCmdID, 255, $subDef;
+ } elsif (($cmd =~ m/^[+-]?\d+$/) && ($cmd >= 0) && ($cmd <= 3)) {
+ $data = sprintf "A5%02X00%02X08%s00", $phcCmdID, $cmd, $subDef;
+ } else {
+ return "Usage: $cmd is not numeric or out of range"
+ }
}
-
+ } else {
+ return "Unknown PHC Gateway Command " . $cmd . ", choose one of ". join(" ", sort keys %EnO_phcCmd);
}
# write phcGateway command
# len: 0x000A optlen: 0x00 pakettype: 0x01(radio)
IOWrite($hash, "000A0001", $data);
- Log $ll2, "EnOcean: set $name $cmd";
+ Log $ll2, "EnOcean: set $name $cmd $setCmd";
+ } elsif ($st eq "manufProfile") {
+ if ($manufID eq "00D") {
+ # Eltako Shutter
+ my $position = ReadingsVal($name, "position", undef);
+ my $shutTime = AttrVal($name, "shutTime", 255);
+ my $subDef = AttrVal($name, "subDef", "$hash->{DEF}");
+ my $shutCmd = 0;
+ $shutTime = 255 if ($shutTime !~ m/^[+-]?\d+$/);
+ $shutTime = 255 if ($shutTime > 255);
+ $shutTime = 1 if ($shutTime < 1);
+ if ($cmd eq "teach") {
+ my $data=sprintf("A5FFF80D80%s00", $subDef);
+ Log $ll2, "EnOcean: set $name $cmd";
+ # len:000a optlen:00 pakettype:1(radio)
+ IOWrite($hash, "000A0001", $data);
+ } elsif ($cmd eq "stop") {
+ $shutCmd = 0;
+ } elsif ($cmd eq "up" || $cmd eq "B0") {
+ if(defined $a[1]) {
+ if ($a[1] =~ m/^[+-]?\d+$/ && $a[1] > 0 && $a[1] <= 100) {
+ $shutTime = $shutTime / 100 * $a[1];
+ $position -= $a[1];
+ if($position <= 0) { $position = 0; }
+ shift(@a);
+ } else {
+ return "Usage: $a[1] is not numeric or out of range";
+ }
+ } else {
+ $position = 0;
+ }
+ readingsSingleUpdate($hash,"position",$position,1);
+ $shutCmd = 1;
+ } elsif ($cmd eq "down" || $cmd eq "BI") {
+ if(defined $a[1]) {
+ if ($a[1] =~ m/^[+-]?\d+$/ && $a[1] >= 0 && $a[1] < 100) {
+ $shutTime = $shutTime / 100 * $a[1];
+ $position += $a[1];
+ if($position > 100) { $position = 100; }
+ shift(@a);
+ } else {
+ return "Usage: $a[1] is not numeric or out of range";
+ }
+ } else {
+ $position = 100;
+ }
+ readingsSingleUpdate($hash,"position",$position,1);
+ $shutCmd = 2;
+ } elsif ($cmd eq "position") {
+ if (!defined $position) {
+ return "Position unknown, please first open the blinds completely."
+ } else {
+ if (defined $a[1] && $a[1] =~ m/^[+-]?\d+$/ && $a[1] >= 0 && $a[1] <= 100) {
+ if ($position < $a[1]) {
+ # down
+ $shutTime = $shutTime / 100 * ($a[1] - $position);
+ $shutCmd = 2;
+ } elsif ($position > $a[1]) {
+ # up
+ $shutTime = $shutTime / 100 * ($position - $a[1]);
+ $shutCmd = 1;
+ } else {
+ # position ok
+ $shutCmd = 0;
+ }
+ readingsSingleUpdate($hash,"position",$a[1],1);
+ shift(@a);
+ } else {
+ return "Usage: $a[1] is not numeric or out of range";
+ }
+ }
+ } else {
+ return "Unknown argument " . $cmd . ", choose one of up stop down position teach"
+ }
+ if($shutCmd || $cmd eq "stop") {
+ $updateState = 0;
+ my $data = sprintf("A5%02X%02X%02X%02X%s00",
+ 0x00, $shutTime, $shutCmd, 8, $subDef);
+ IOWrite($hash, "000A0001", $data);
+ Log $ll2, "EnOcean: set $name $cmd";
+ }
+ } else {
+ return "Manufacturer Specific Application unknown. Set correct attr manufID.";
+ }
+
} else {
# Rocker Switch, simulate a PTM200 switch module
# separate first and second action
@@ -960,22 +1149,32 @@ EnOcean_Parse($$)
# Gas Sensor, CO Sensor (EEP A5-09-01)
# [untested]
# $db_3 is the CO concentration where 0x00 = 0 ppm ... 0xFF = 255 ppm
- # $db_2 is the CO concentration where 0x00 = 0 ppm ... 0xFF = 255 ppm
# $db_1 is the temperature where 0x00 = 0 °C ... 0xFF = 255 °C
# $db_0 bit D1 temperature sensor available 0 = no, 1 = yes
my $coChannel1 = $db_3;
- my $coChannel2 = $db_2;
- push @event, "3:Channel1:$coChannel1";
- push @event, "3:Channel2:$coChannel2";
- if ($coChannel1 == $coChannel2) {
- push @event, "3:state:$coChannel1";
- } else {
- push @event, "3:state:measuring error";
- }
+ push @event, "3:CO:$coChannel1";
if ($db_0 & 2) {
my $temp = $db_1;
push @event, "3:temperature:$temp";
}
+ push @event, "3:state:$coChannel1";
+
+ } elsif($st eq "COSensor.02") {
+ # Gas Sensor, CO Sensor (EEP A5-09-02)
+ # [untested]
+ # $db_3 is the voltage where 0x00 = 0 V ... 0xFF = 5.1 V
+ # $db_2 is the CO concentration where 0x00 = 0 ppm ... 0xFF = 1020 ppm
+ # $db_1 is the temperature where 0x00 = 0 °C ... 0xFF = 51 °C
+ # $db_0_bit_1 temperature sensor available 0 = no, 1 = yes
+ my $coChannel1 = $db_2 << 2;
+ my $voltage = sprintf "0.1f", $db_3 * 0.02;
+ push @event, "3:CO:$coChannel1";
+ if ($db_0 & 2) {
+ my $temp = sprintf "%0.1f", $db_1 * 0.2;
+ push @event, "3:temperature:$temp";
+ }
+ push @event, "3:voltage:$voltage";
+ push @event, "3:state:$coChannel1";
} elsif($st eq "tempHumiCO2Sensor.01") {
# Gas Sensor, CO2 Sensor (EEP A5-09-04)
@@ -1128,7 +1327,7 @@ EnOcean_Parse($$)
$lux = sprintf "%d", $db_2 * 116.48 + 300;
}
} else {
- $voltage = sprintf "%d", $db_3 * 0.02;
+ $voltage = sprintf "0.1f", $db_3 * 0.02;
if($db_0 & 1) {
$lux = sprintf "%d", $db_2 * 116.48 + 300;
} else {
@@ -1146,7 +1345,7 @@ EnOcean_Parse($$)
# $db_1 is the illuminance (ILL1) where min 0x00 = 0 lx, max 0xFF = 1020 lx
# $db_0_bit_0 is Range select where 0 = ILL1, 1 = ILL2
my $lux;
- my $voltage = sprintf "%d", $db_3 * 0.02;
+ my $voltage = sprintf "0.1f", $db_3 * 0.02;
if($db_0 & 1) {
$lux = $db_2 << 1;
} else {
@@ -1156,14 +1355,58 @@ EnOcean_Parse($$)
push @event, "3:brightness:$lux";
push @event, "3:state:$lux";
+ } elsif ($st eq "lightSensor.03") {
+ # Light Sensor (EEP A5-06-03)
+ # $db_3 is the voltage where 0x00 = 0 V ... 0xFA = 5.0 V
+ # $db_3 > 0xFA is error code
+ # $db_2_bit_7 ... $db_1_bit_6 is the illuminance where min 0x000 = 0 lx, max 0x3E8 = 1000 lx
+ my $lux = $db_2 << 2 | $db_1 >> 6;
+ if ($lux == 1001) {$lux = "over range";}
+ my $voltage = sprintf "0.1f", $db_3 * 0.02;
+ if ($db_3 > 250) {push @event, "3:errorCode:$db_3";}
+ push @event, "3:voltage:$voltage";
+ push @event, "3:brightness:$lux";
+ push @event, "3:state:$lux";
+
} elsif ($st eq "occupSensor.01") {
# Occupancy Sensor (EEP A5-07-01)
+ # $db_3 is the voltage where 0x00 = 0 V ... 0xFA = 5.0 V
+ # $db_3 > 0xFA is error code
# $db_1 is PIR Status (motion) where 0 ... 127 = off, 128 ... 255 = on
my $motion = "off";
if ($db_1 >= 128) {$motion = "on";}
+ if ($db_0 & 1) {push @event, "3:voltage:" . sprintf "0.1f", $db_3 * 0.02;}
+ if ($db_3 > 250) {push @event, "3:errorCode:$db_3";}
push @event, "3:motion:$motion";
push @event, "3:state:$motion";
+ } elsif ($st eq "occupSensor.02") {
+ # Occupancy Sensor (EEP A5-07-02)
+ # $db_3 is the voltage where 0x00 = 0 V ... 0xFA = 5.0 V
+ # $db_3 > 0xFA is error code
+ # $db_0_bit_7 is PIR Status (motion) where 0 = off, 1 = on
+ my $motion = $db_0 >> 7 ? "on" : "off";
+ if ($db_3 > 250) {push @event, "3:errorCode:$db_3";}
+ push @event, "3:motion:$motion";
+ push @event, "3:voltage:" . sprintf "0.1f", $db_3 * 0.02;
+ push @event, "3:state:$motion";
+
+ } elsif ($st eq "occupSensor.03") {
+ # Occupancy Sensor (EEP A5-07-03)
+ # $db_3 is the voltage where 0x00 = 0 V ... 0xFA = 5.0 V
+ # $db_3 > 0xFA is error code
+ # $db_2_bit_7 ... $db_1_bit_6 is the illuminance where min 0x000 = 0 lx, max 0x3E8 = 1000 lx
+ # $db_0_bit_7 is PIR Status (motion) where 0 = off, 1 = on
+ my $motion = $db_0 >> 7 ? "on" : "off";
+ my $lux = $db_2 << 2 | $db_1 >> 6;
+ if ($lux == 1001) {$lux = "over range";}
+ my $voltage = sprintf "0.1f", $db_3 * 0.02;
+ if ($db_3 > 250) {push @event, "3:errorCode:$db_3";}
+ push @event, "3:brightness:$lux";
+ push @event, "3:motion:$motion";
+ push @event, "3:voltage:$voltage";
+ push @event, "3:state:M: $motion E: $lux U: $voltage";
+
} elsif ($st =~ m/^lightTempOccupSensor/) {
# Light, Temperatur and Occupancy Sensor (EEP A5-08-01 ... A5-08-03)
# $db_3 is the voltage where 0x00 = 0 V ... 0xFF = 5.1 V
@@ -1286,7 +1529,7 @@ EnOcean_Parse($$)
}
} elsif ($st eq "weatherStation") {
- # Weather Station (EEP A5-13-01 ... EEP A5-13-06)
+ # Weather Station (EEP A5-13-01 ... EEP A5-13-06, EEP A5-13-10)
# [Eltako FWS61, untested]
# $db_0_bit_7 ... $db_0_bit_4 is the Identifier
my $identifier = $db_0 >> 4;
@@ -1313,16 +1556,38 @@ EnOcean_Parse($$)
# $db_3 is the sun exposure west where 0x00 = 1 lx ... 0xFF = 150 klx
# $db_2 is the sun exposure south where 0x00 = 1 lx ... 0xFF = 150 klx
# $db_1 is the sun exposure east where 0x00 = 1 lx ... 0xFF = 150 klx
+ # $db_0_bit_2 is hemisphere where 0 = north, 1 = south
+ my $hemisphere = $db_0 & 4 ? "south" : "north";
my $sunWest = sprintf "%d", 1 + $db_3 * 149999 / 255;
my $sunSouth = sprintf "%d", 1 + $db_2 * 149999 / 255;
my $sunEast = sprintf "%d", 1 + $db_1 * 149999 / 255;
+ push @event, "3:hemisphere:$hemisphere";
push @event, "3:sunWest:$sunWest";
push @event, "3:sunSouth:$sunSouth";
push @event, "3:sunEast:$sunEast";
} else {
- # EEP A5-13-03 ... EEP A5-13-06 not implemented
+ # EEP A5-13-03 ... EEP A5-13-06, EEP A5-13-10 not implemented
}
+ } elsif ($st eq "multiFuncSensor") {
+ # Multi-Func Sensor (EEP A5-14-01 ... A5-14-06)
+ # $db_3 is the voltage where 0x00 = 0 V ... 0xFA = 5.0 V
+ # $db_3 > 0xFA is error code
+ # $db_2 is the illuminance where min 0x00 = 0 lx, max 0xFA = 1000 lx
+ # $db_0_bit_1 is Vibration where 0 = off, 1 = on
+ # $db_0_bit_0 is Contact where 0 = closed, 1 = open
+ my $lux = $db_2;
+ if ($lux == 251) {$lux = "over range";}
+ my $voltage = sprintf "0.1f", $db_3 * 0.02;
+ if ($db_3 > 250) {push @event, "3:errorCode:$db_3";}
+ my $vibration = $db_0 & 2 ? "on" : "off";
+ my $contact = $db_0 & 1 ? "open" : "closed";
+ push @event, "3:brightness:$lux";
+ push @event, "3:contact:$contact";
+ push @event, "3:vibration:$vibration";
+ push @event, "3:voltage:$voltage";
+ push @event, "3:state:C: $contact V: $vibration E: $lux U: $voltage";
+
} elsif ($st =~ m/^digitalInput/) {
# Digital Input (EEP A5-30-01, A5-30-02)
my $contact;
@@ -1350,7 +1615,7 @@ EnOcean_Parse($$)
# teach-in, identify and store command type in attr phcCmd
my $phcCmd = AttrVal($name, "phcCmd", undef);
if (!$phcCmd) {
- $phcCmd = $EnO_phcCmd[$db_3];
+ $phcCmd = $EnO_phcCmd[$db_3 - 1];
$attr{$name}{phcCmd} = $phcCmd;
}
}
@@ -1358,9 +1623,9 @@ EnOcean_Parse($$)
# Switching
# Eltako devices not send A5 telegrams
push @event, "3:executeTime:" . sprintf "%0.1f", (($db_2 << 8) | $db_1) / 10;
- push @event, "3:lock:" . $db_0 & 4 ? "lock" : "unlock";
- push @event, "3:executeType" . $db_0 & 2 ? "delay" : "duration";
- push @event, "3:state:" . $db_0 & 1 ? "on" : "off";
+ push @event, "3:lock:" . ($db_0 & 4 ? "lock" : "unlock");
+ push @event, "3:executeType" . ($db_0 & 2 ? "delay" : "duration");
+ push @event, "3:state:" . ($db_0 & 1 ? "on" : "off");
} elsif ($db_3 == 2) {
# Dimming
# $db_0_bit_2 is store final value, not used, because
@@ -1398,14 +1663,14 @@ EnOcean_Parse($$)
push @event, "3:controllerMode:heating";
push @event, "3:state:heating";
} elsif ($controllerMode == 2){
- push @event, "3:controllerMode:colling";
- push @event, "3:state:colling";
+ push @event, "3:controllerMode:cooling";
+ push @event, "3:state:cooling";
} elsif ($controllerMode == 3){
push @event, "3:controllerMode:off";
push @event, "3:state:off";
}
- push @event, "3:controllerState:" . $db_0 & 0x10 ? "override" : "auto";
- push @event, "3:energyHoldOff:" . $db_0 & 4 ? "holdoff" : "normal";
+ push @event, "3:controllerState:" . ($db_0 & 0x10 ? "override" : "auto");
+ push @event, "3:energyHoldOff:" . ($db_0 & 4 ? "holdoff" : "normal");
my $occupancy = $db_0 & 3;
if ($occupancy == 0) {
push @event, "3:presence:present";
@@ -1698,49 +1963,6 @@ EnOcean_Undef($$)
the attr switchMode is set to "pushbutton".
-
-
set <name> <value>
- value
is
- set <name> <value>
- value
is
- set <name> <value>
+ value
is
+ set <name> <value>
+ value
is
+ set <name> <value>
+ value
is
+ set <name> <value>
+ value
is
+ set <name> <value>
+ value
is
+ set <name> <value>
+ value
is
+ set <name> <value>
+ value
is
+ set <name> <value>
+ value
is
+ set <name> <value>
+ value
is
+ set <name> dim <value>
.set <name> dim <value>
.