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".

- -
  • Dimmer
    - [Eltako FUD12, FUD14, FUD61, FUD70, tested with Eltako devices only]
    -
    - Set attr subType to eltakoDimmer manually.
    - Use the sensor type "PC/FVS" for Eltako devices. -
  • -

    - -
  • Dimmer for fluorescent lamps
    - [Eltako FSG70, tested with Eltako FSG70 only]
    -
    - Set attr eventMap to B0:on BI:off, attr model to FSG70, attr - subType to eltakoDimmer and attr switchMode to pushbutton manually.
    - Use the sensor type "Richtungstaster" for Eltako devices. -
  • -

  • Battery Powered Actuator (EEP A5-20-01)
    [Kieback&Peter MD15-FTL-xx]
    @@ -1761,7 +1983,7 @@ EnOcean_Undef($$)
  • valveOpen
    Maintenance Mode (service on): Valve open
  • valveClosed
    - DMaintenance Mode (service on): Valve closed
  • + Maintenance Mode (service on): Valve closed
  • unattended
    Do not regulate the actuator.

  • @@ -1773,6 +1995,27 @@ EnOcean_Undef($$)

    +
  • PHC Gateway (EEP A5-38-08)
    + The PHC Gateway profile include 6 different commands (Switching, Dimming, + Setpoint Shift, Basic Setpoint, Control variable, Fan stage. The commands + can be selected by the attribute phcCmd or command line. The attribute + entry has priority.
    +
    + The attr subType must be phcGateway. Attribute phcCmd can also be set to + switching|dimming|setpointShift|setpointBasic|ControlVar|fanStage.
    + This is done if the device was created by autocreate.
    + For Eltako devices attributes must be set manually. +
  • +

    +
  • PHC Gateway (EEP A5-38-08)
    Switching
    [Eltako FLC61, FSR14]
    @@ -1807,11 +2050,11 @@ EnOcean_Undef($$) issue switch on command
  • off [lock|unlock]
    issue switch off command
  • -
  • dim dim/% [rampTime/s lock|unlock]
    +
  • dim dim/% [rampTime/s [lock|unlock]]
    issue dim command
  • -
  • dimup dim/% [rampTime/s lock|unlock]
    +
  • dimup dim/% [rampTime/s [lock|unlock]]
    issue dim command
  • -
  • dimdown dim/% [rampTime/s lock|unlock]
    +
  • dimdown dim/% [rampTime/s [lock|unlock]]
    issue dim command
  • set extensions are supported.

  • @@ -1823,6 +2066,171 @@ EnOcean_Undef($$)

    +
  • PHC Gateway (EEP A5-38-08)
    + Dimming of fluorescent lamps
    + [Eltako FSG70, tested with Eltako FSG70 only]
    +
    + The attr subType must be phcGateway and phcCmd must be dimming. Set attr eventMap to B0:on BI:off, + attr model to FSG70 and attr switchMode to pushbutton manually.
    + Use the sensor type "Richtungstaster" for Eltako devices. +
  • +

    + +
  • PHC Gateway (EEP A5-38-08)
    + Setpoint shift
    + [untested]
    +
    + Setpoint Range: T = -12.7 K ... 12.8 K
    + The attr subType must be phcGateway and phcCmd must be setpointShift. + This is done if the device was created by autocreate.
    +
  • +

    + +
  • PHC Gateway (EEP A5-38-08)
    + Basic Setpoint
    + [untested]
    +
    + Setpoint Range: t = 0 °C ... 51.2 °C
    + The attr subType must be phcGateway and phcCmd must be setpointBasic. + This is done if the device was created by autocreate.
    +
  • +

    + +
  • PHC Gateway (EEP A5-38-08)
    + Control variable
    + [untested]
    +
    + Override Range: cvov = 0 % ... 100 %
    + The attr subType must be phcGateway and phcCmd must be controlVar. + This is done if the device was created by autocreate.
    +
  • +

    + +
  • PHC Gateway (EEP A5-38-08)
    + Fan stage
    + [untested]
    +
    + The attr subType must be phcGateway and phcCmd must be fanStage. + This is done if the device was created by autocreate.
    +
  • +

    + +
  • Manufacturer Specific Applications (EEP A5-3F-7F)
    + Shutter
    + [Eltako FSB12, FSB14, FSB61, FSB70, tested with Eltako devices only]
    +
    + Set attr subType to manufProfile, manufID to 00D and attr model to + FSB12|FSB14|FSB61|FSB70 manually.
    + Use the sensor type "Szenentaster/PC" for Eltako devices. +
  • +

    + +
  • Dimmer
    + [Eltako FUD12, FUD14, FUD61, FUD70, tested with Eltako devices only]
    +
    + Old profile, use PHC Gateway alternative.
    + Set attr subType to eltakoDimmer manually.
    + Use the sensor type "PC/FVS" for Eltako devices. +
  • +

    + +
  • Dimmer for fluorescent lamps
    + [Eltako FSG70, tested with Eltako FSG70 only]
    +
    + Old profile, use PHC Gateway alternative.
    + Set attr eventMap to B0:on BI:off, attr model to FSG70, attr + subType to eltakoDimmer and attr switchMode to pushbutton manually.
    + Use the sensor type "Richtungstaster" for Eltako devices. +
  • +

    +
  • Shutter (EEP F6-02-01 ... F6-02-02 and A5-3F-7F)
    [Eltako FSB12, FSB14, FSB61, FSB70, tested with Eltako devices only]

    + Old profile, use Manufacturer Specific Applications + alternative.
    Set attr subType to eltakoShutter and attr model to FSB12|FSB14|FSB61|FSB70 manually.
    Use the sensor type "Szenentaster/PC" for Eltako devices. @@ -1886,7 +2296,7 @@ EnOcean_Undef($$)
  • readingFnAttributes
  • showtime
  • -
  • shutTime t/s
    +
  • shutTime t/s, [shutTime] = 1 ... 255, 255 is default.
    Use the attr shutTime to set the time delay to the position "Halt" in seconds. Select a delay time that is at least as long as the shading element or roller shutter needs to move from its end position to the other position.
    @@ -1994,6 +2404,19 @@ EnOcean_Undef($$)


  • +
  • Smoke Detector (EEP F6-02-01 ... F6-02-02)
    + [Eltako FRW, untested]
    +
    + Set attr subType to FRW. +
  • +

    +
  • Key Card Activated Switch (EEP F6-04-01)
    [Eltako FKC, FKF, FZS, untested]


  • Temperature Sensors with with different ranges (EEP A5-02-01 ... A5-02-30)
    @@ -2109,19 +2463,138 @@ EnOcean_Undef($$) created by autocreate.


  • + +
  • Temperatur and Humidity Sensor (EEP A5-04-02)
    + [Eltako FAFT60, FIFT63AP]
    +
    + The attr subType must be tempHumiSensor.02 and attr + manufID must be 00D for Eltako Devices. This is done if the device was + created by autocreate. +
  • +

    + +
  • Light Sensor (EEP A5-06-01)
    + [Eltako FAH60, FAH63, FIH63, Thermokon SR65 LI]
    +
    + Eltako devices only support Brightness.
    + The attr subType must be lightSensor.01 and attr manufID must be 00D + for Eltako Devices. This is done if the device was created by + autocreate. +
  • +

    + +
  • Light Sensor (EEP A5-06-02)
    + [untested]
    +
    + The attr subType must be lightSensor.02. This is done if the device was + created by autocreate. +
  • +

    + +
  • Light Sensor (EEP A5-06-03)
    + [untested]
    +
    + The attr subType must be lightSensor.03. This is done if the device was + created by autocreate. +
  • +

    + +
  • Occupancy Sensor (EEP A5-07-01, A5-07-02)
    + [untested]
    +
    + The attr subType must be occupSensor.<01|02>. This is done if the device was + created by autocreate. +
  • +

    + +
  • Occupancy Sensor (EEP A5-07-03)
    + [untested]
    +
    + The attr subType must be occupSensor.03. This is done if the device was + created by autocreate. +
  • +

    + +
  • Light, Temperatur and Occupancy Sensor (EEP A5-08-01 ... A5-08-03)
    + [Eltako FABH63, FBH55, FBH63, FIBH63, Thermokon SR-MDS, PEHA 482 FU-BM DE]
    +
    + Eltako and PEHA devices only support Brightness and Motion.
    + The attr subType must be lightTempOccupSensor.<01|02|03> and attr + manufID must be 00D for Eltako Devices. This is done if the device was + created by autocreate. +
  • +

  • Gas Sensor, CO Sensor (EEP A5-09-01)
    [untested]

    The attr subType must be COSensor.01. This is done if the device was created by autocreate.


  • +
  • Gas Sensor, CO Sensor (EEP A5-09-02)
    + [untested]
    +
    + The attr subType must be COSensor.02. This is done if the device was + created by autocreate. +
  • +

    +
  • Gas Sensor, CO2 Sensor (EEP A5-09-04)
    [Thermokon SR04 CO2 *, untested]