mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-05-04 22:19:38 +00:00
10_EnOcean: # EEP D2-50-xx reading scale changed
# attr model changed and expanded (Eltako_*, OEM >> Holter_OEM), # changed sub EnOcean_Define($$); # Remote Management: ReComm functions added git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@16011 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
1aa38065e0
commit
c63915678b
@ -1,10 +1,14 @@
|
|||||||
##############################################
|
##############################################
|
||||||
# $Id$
|
# $Id$
|
||||||
|
|
||||||
package main;
|
package main;
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
my $cryptFunc;
|
my $cryptFunc;
|
||||||
|
my $xmlFunc;
|
||||||
|
my $xml;
|
||||||
|
|
||||||
eval "use Crypt::Rijndael";
|
eval "use Crypt::Rijndael";
|
||||||
if ($@) {
|
if ($@) {
|
||||||
$cryptFunc = 0;
|
$cryptFunc = 0;
|
||||||
@ -18,6 +22,21 @@ if ($@) {
|
|||||||
$cryptFunc = $cryptFunc == 1 ? 1 : 0;
|
$cryptFunc = $cryptFunc == 1 ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
eval "use XML::Simple";
|
||||||
|
if ($@) {
|
||||||
|
$xmlFunc = 0;
|
||||||
|
} else {
|
||||||
|
$xmlFunc = 1;
|
||||||
|
$xml = new XML::Simple;
|
||||||
|
}
|
||||||
|
|
||||||
|
eval "use Data::Dumper";
|
||||||
|
if ($@) {
|
||||||
|
$xmlFunc = 0;
|
||||||
|
} else {
|
||||||
|
$xmlFunc = $xmlFunc == 1 ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
use SetExtensions;
|
use SetExtensions;
|
||||||
|
|
||||||
sub EnOcean_Define($$);
|
sub EnOcean_Define($$);
|
||||||
@ -366,11 +385,11 @@ my %EnO_eepConfig = (
|
|||||||
"G5.07.01" => {attr => {subType => "occupSensor.01", eep => "A5-07-01", manufID => "00D", model => 'tracker'}, GPLOT => "EnO_motion:Motion,EnO_voltage4current4:Voltage/Current,"},
|
"G5.07.01" => {attr => {subType => "occupSensor.01", eep => "A5-07-01", manufID => "00D", model => 'tracker'}, GPLOT => "EnO_motion:Motion,EnO_voltage4current4:Voltage/Current,"},
|
||||||
"G5.10.12" => {attr => {subType => "roomSensorControl.01", eep => "A5-10-12", manufID => "00D", scaleMax => 40, scaleMin => 0, scaleDecimals => 1}, GPLOT => "EnO_temp4humi6:Temp/Humi,"},
|
"G5.10.12" => {attr => {subType => "roomSensorControl.01", eep => "A5-10-12", manufID => "00D", scaleMax => 40, scaleMin => 0, scaleDecimals => 1}, GPLOT => "EnO_temp4humi6:Temp/Humi,"},
|
||||||
"G5.38.08" => {attr => {subType => "gateway", eep => "A5-38-08", gwCmd => "dimming", manufID => "00D", webCmd => "on:off:dim"}, GPLOT => "EnO_dim4:Dim,"},
|
"G5.38.08" => {attr => {subType => "gateway", eep => "A5-38-08", gwCmd => "dimming", manufID => "00D", webCmd => "on:off:dim"}, GPLOT => "EnO_dim4:Dim,"},
|
||||||
"H5.38.08" => {attr => {subType => "gateway", comMode => "confirm", eep => "A5-38-08", gwCmd => "dimming", manufID => "00D", model => "TF", teachMethod => "confirm", webCmd => "on:off:dim"}, GPLOT => "EnO_dim4:Dim,"},
|
"H5.38.08" => {attr => {subType => "gateway", comMode => "confirm", eep => "A5-38-08", gwCmd => "dimming", manufID => "00D", model => "Eltako_TF", teachMethod => "confirm", webCmd => "on:off:dim"}, GPLOT => "EnO_dim4:Dim,"},
|
||||||
"G5.3F.7F" => {attr => {subType => "manufProfile", eep => "A5-3F-7F", manufID => "00D", webCmd => "opens:stop:closes"}},
|
"G5.3F.7F" => {attr => {subType => "manufProfile", eep => "A5-3F-7F", manufID => "00D", webCmd => "opens:stop:closes"}},
|
||||||
"H5.3F.7F" => {attr => {subType => "manufProfile", comMode => "confirm", eep => "A5-3F-7F", manufID => "00D", model => "TF", sensorMode => 'pushbutton', settingAccuracy => "high", teachMethod => "confirm", webCmd => "opens:stop:closes"}},
|
"H5.3F.7F" => {attr => {subType => "manufProfile", comMode => "confirm", eep => "A5-3F-7F", manufID => "00D", model => "Eltako_TF", sensorMode => 'pushbutton', settingAccuracy => "high", teachMethod => "confirm", webCmd => "opens:stop:closes"}},
|
||||||
"M5.38.08" => {attr => {subType => "gateway", eep => "A5-38-08", gwCmd => "switching", manufID => "00D", webCmd => "on:off"}},
|
"M5.38.08" => {attr => {subType => "gateway", eep => "A5-38-08", gwCmd => "switching", manufID => "00D", webCmd => "on:off"}},
|
||||||
"N5.38.08" => {attr => {subType => "gateway", comMode => "confirm", eep => "A5-38-08", gwCmd => "switching", manufID => "00D", model => "TF", teachMethod => "confirm", webCmd => "on:off"}},
|
"N5.38.08" => {attr => {subType => "gateway", comMode => "confirm", eep => "A5-38-08", gwCmd => "switching", manufID => "00D", model => "Eltako_TF", teachMethod => "confirm", webCmd => "on:off"}},
|
||||||
"G5.ZZ.ZZ" => {attr => {subType => "PM101", manufID => "005"}, GPLOT => "EnO_motion:Motion,EnO_brightness4:Brightness,"},
|
"G5.ZZ.ZZ" => {attr => {subType => "PM101", manufID => "005"}, GPLOT => "EnO_motion:Motion,EnO_brightness4:Brightness,"},
|
||||||
"L6.02.01" => {attr => {subType => "smokeDetector.02", eep => "F6-05-02", manufID => "00D"}},
|
"L6.02.01" => {attr => {subType => "smokeDetector.02", eep => "F6-05-02", manufID => "00D"}},
|
||||||
"ZZ.ZZ.ZZ" => {attr => {subType => "raw"}},
|
"ZZ.ZZ.ZZ" => {attr => {subType => "raw"}},
|
||||||
@ -398,16 +417,23 @@ my %EnO_extendedRemoteFunctionCode = (
|
|||||||
0x252 => "remoteRepeaterFilter" # set
|
0x252 => "remoteRepeaterFilter" # set
|
||||||
);
|
);
|
||||||
|
|
||||||
my @EnO_models = qw (
|
my %EnO_models = (
|
||||||
other
|
"Eltako_FAE14" => {attr => {manufID => "00D"}},
|
||||||
FAE14 FHK14 FHK61
|
"Eltako_FHK14" => {attr => {manufID => "00D"}},
|
||||||
FSA12 FSB14 FSB61 FSB70
|
"Eltako_FHK61" => {attr => {manufID => "00D"}},
|
||||||
FSM12 FSM61
|
"Eltako_FSA12" => {attr => {manufID => "00D"}},
|
||||||
FT55
|
"Eltako_FSB14" => {attr => {manufID => "00D"}},
|
||||||
FTS12
|
"Eltako_FSB61" => {attr => {manufID => "00D"}},
|
||||||
TF
|
"Eltako_FSB70" => {attr => {manufID => "00D"}},
|
||||||
OEM
|
"Eltako_FSM12" => {attr => {manufID => "00D"}},
|
||||||
tracker
|
"Eltako_FSM61" => {attr => {manufID => "00D"}},
|
||||||
|
"Eltako_FT55" => {attr => {manufID => "00D"}},
|
||||||
|
"Eltako_FTS12" => {attr => {manufID => "00D"}},
|
||||||
|
"Eltako_TF"=> {attr => {manufID => "00D"}},
|
||||||
|
"Holter_OEM" => {attr => {pidCtrl => "off"}},
|
||||||
|
"Micropelt_MVA004" => {attr => {remoteCode => "FFFFFFFE", remoteEEP => "A5-20-01", remoteID => "getNextID", remoteManagement => "manager"}, xml => {productID => "0x004900000000", xmlDescrLocation => "/FHEM/lib/EnO_ReCom_Device_Descr.xml"}},
|
||||||
|
other => {},
|
||||||
|
tracker => {}
|
||||||
);
|
);
|
||||||
|
|
||||||
my @EnO_defaultChannel = ("all", "input", 0..29);
|
my @EnO_defaultChannel = ("all", "input", 0..29);
|
||||||
@ -670,7 +696,7 @@ EnOcean_Initialize($)
|
|||||||
"eep gpDef gwCmd:" . join(",", sort @EnO_gwCmd) . " humitity humidityRefDev " .
|
"eep gpDef gwCmd:" . join(",", sort @EnO_gwCmd) . " humitity humidityRefDev " .
|
||||||
"keyRcv keySnd macAlgo:no,3,4 measurementCtrl:disable,enable " .
|
"keyRcv keySnd macAlgo:no,3,4 measurementCtrl:disable,enable " .
|
||||||
"manufID:" . join(",", sort keys %EnO_manuf) . " " .
|
"manufID:" . join(",", sort keys %EnO_manuf) . " " .
|
||||||
"model:" . join(",", @EnO_models) . " " .
|
"model:" . join(",", sort keys %EnO_models) . " " .
|
||||||
"observe:on,off observeCmdRepetition:1,2,3,4,5 observeErrorAction observeInterval observeLogic:and,or " .
|
"observe:on,off observeCmdRepetition:1,2,3,4,5 observeErrorAction observeInterval observeLogic:and,or " .
|
||||||
#observeCmds observeExeptions
|
#observeCmds observeExeptions
|
||||||
"observeRefDev pidActorErrorAction:errorPos,freeze pidActorCallBeforeSetting pidActorErrorPos " .
|
"observeRefDev pidActorErrorAction:errorPos,freeze pidActorCallBeforeSetting pidActorErrorPos " .
|
||||||
@ -704,6 +730,11 @@ EnOcean_Initialize($)
|
|||||||
} else {
|
} else {
|
||||||
Log3 undef, 2, "EnOcean Cryptographic functions are not available.";
|
Log3 undef, 2, "EnOcean Cryptographic functions are not available.";
|
||||||
}
|
}
|
||||||
|
if ($xmlFunc == 1){
|
||||||
|
Log3 undef, 2, "EnOcean XML functions available.";
|
||||||
|
} else {
|
||||||
|
Log3 undef, 2, "EnOcean XML functions are not available.";
|
||||||
|
}
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -722,7 +753,7 @@ sub EnOcean_Define($$) {
|
|||||||
while (($autocreateName, $autocreateHash) = each(%defs)) {
|
while (($autocreateName, $autocreateHash) = each(%defs)) {
|
||||||
last if ($defs{$autocreateName}{TYPE} eq "autocreate");
|
last if ($defs{$autocreateName}{TYPE} eq "autocreate");
|
||||||
}
|
}
|
||||||
$autocreateDeviceRoom = AttrVal($autocreateName, "device_room", $autocreateDeviceRoom);
|
$autocreateDeviceRoom = AttrVal($autocreateName, "device_room", $autocreateDeviceRoom) if (defined $autocreateName);
|
||||||
$autocreateDeviceRoom = 'EnOcean' if ($autocreateDeviceRoom eq '%TYPE');
|
$autocreateDeviceRoom = 'EnOcean' if ($autocreateDeviceRoom eq '%TYPE');
|
||||||
$autocreateDeviceRoom = $name if ($autocreateDeviceRoom eq '%NAME');
|
$autocreateDeviceRoom = $name if ($autocreateDeviceRoom eq '%NAME');
|
||||||
$autocreateDeviceRoom = AttrVal($name, "room", $autocreateDeviceRoom);
|
$autocreateDeviceRoom = AttrVal($name, "room", $autocreateDeviceRoom);
|
||||||
@ -1004,6 +1035,7 @@ sub EnOcean_Define($$) {
|
|||||||
$hash->{helper}{stopped} = 0;
|
$hash->{helper}{stopped} = 0;
|
||||||
#$hash->{helper}{adjust} = '';
|
#$hash->{helper}{adjust} = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
# all notifys needed
|
# all notifys needed
|
||||||
#$hash->{NOTIFYDEV} = "global";
|
#$hash->{NOTIFYDEV} = "global";
|
||||||
Log3 $name, 5, "EnOcean_define for device $name executed.";
|
Log3 $name, 5, "EnOcean_define for device $name executed.";
|
||||||
@ -2741,8 +2773,8 @@ sub EnOcean_Set($@)
|
|||||||
$updateState = 2;
|
$updateState = 2;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
$cmdList .= "setpointTemp:slider,10,1,30 " if (AttrVal($name, "pidCtrl", 'on') eq 'on' || AttrVal($name, "model", '') eq 'OEM');
|
$cmdList .= "setpointTemp:slider,10,1,30 " if (AttrVal($name, "pidCtrl", 'on') eq 'on' || AttrVal($name, "model", '') eq 'Holter_OEM');
|
||||||
$cmdList .= "setpoint:slider,0,5,100 " if (AttrVal($name, "pidCtrl", 'on') eq 'off' && AttrVal($name, "model", '') ne 'OEM');
|
$cmdList .= "setpoint:slider,0,5,100 " if (AttrVal($name, "pidCtrl", 'on') eq 'off' && AttrVal($name, "model", '') ne 'Holter_OEM');
|
||||||
$cmdList .= "runInit:noArg valveCloses:noArg valveOpens:noArg";
|
$cmdList .= "runInit:noArg valveCloses:noArg valveOpens:noArg";
|
||||||
return "Unknown command " . $cmd . ", choose one of " . $cmdList;
|
return "Unknown command " . $cmd . ", choose one of " . $cmdList;
|
||||||
}
|
}
|
||||||
@ -3018,7 +3050,7 @@ sub EnOcean_Set($@)
|
|||||||
if($cmd eq "teach") {
|
if($cmd eq "teach") {
|
||||||
# teach-in EEP A5-38-08, Manufacturer "Multi user Manufacturer ID"
|
# teach-in EEP A5-38-08, Manufacturer "Multi user Manufacturer ID"
|
||||||
#$data = sprintf "%02X000000", $gwCmdID;
|
#$data = sprintf "%02X000000", $gwCmdID;
|
||||||
if ($model eq 'TF') {
|
if ($model =~ m/TF$/) {
|
||||||
$data = "E0400D80";
|
$data = "E0400D80";
|
||||||
} else {
|
} else {
|
||||||
$data = "E047FF80";
|
$data = "E047FF80";
|
||||||
@ -3045,7 +3077,7 @@ sub EnOcean_Set($@)
|
|||||||
SetExtensionsCancel($hash);
|
SetExtensionsCancel($hash);
|
||||||
$data = sprintf "%02X%04X%02X", $gwCmdID, $time, $setCmd;
|
$data = sprintf "%02X%04X%02X", $gwCmdID, $time, $setCmd;
|
||||||
} elsif ($cmd eq "off") {
|
} elsif ($cmd eq "off") {
|
||||||
if ($model eq "FSA12") {
|
if ($model =~ m/FSA12$/) {
|
||||||
$setCmd = 0x0E;
|
$setCmd = 0x0E;
|
||||||
} else {
|
} else {
|
||||||
$setCmd = 8;
|
$setCmd = 8;
|
||||||
@ -3103,7 +3135,7 @@ sub EnOcean_Set($@)
|
|||||||
# teach-in EEP A5-38-08, Manufacturer "Multi user Manufacturer ID"
|
# teach-in EEP A5-38-08, Manufacturer "Multi user Manufacturer ID"
|
||||||
#$data = "E047FF80";
|
#$data = "E047FF80";
|
||||||
# teach-in Eltako
|
# teach-in Eltako
|
||||||
if ($model eq 'TF') {
|
if ($model =~ m/TF$/) {
|
||||||
$data = "E0400D80";
|
$data = "E0400D80";
|
||||||
} else {
|
} else {
|
||||||
$data = "02000000";
|
$data = "02000000";
|
||||||
@ -5883,8 +5915,8 @@ sub EnOcean_Set($@)
|
|||||||
my $humidityThreshold = ReadingsVal($name, "humidityThreshold", 'default');
|
my $humidityThreshold = ReadingsVal($name, "humidityThreshold", 'default');
|
||||||
$humidityThreshold = $humidityThreshold eq 'default' ? 127 : $humidityThreshold;
|
$humidityThreshold = $humidityThreshold eq 'default' ? 127 : $humidityThreshold;
|
||||||
my $startTimerMode = 0;
|
my $startTimerMode = 0;
|
||||||
my $tempThreshold = ReadingsVal($name, "roomTempSet", 'default');;
|
my $tempThreshold = ReadingsVal($name, "roomTempSet", 'default');
|
||||||
$tempThreshold = $tempThreshold eq 'default' ? 127 : $tempThreshold;
|
$tempThreshold = $tempThreshold eq 'default' ? 0 : $tempThreshold;
|
||||||
my $ventilation = 15;
|
my $ventilation = 15;
|
||||||
if ($cmd eq "ventilation") {
|
if ($cmd eq "ventilation") {
|
||||||
$ventilation = $a[1];
|
$ventilation = $a[1];
|
||||||
@ -5973,11 +6005,12 @@ sub EnOcean_Set($@)
|
|||||||
$tempThreshold = $a[1];
|
$tempThreshold = $a[1];
|
||||||
if (defined $tempThreshold) {
|
if (defined $tempThreshold) {
|
||||||
if ($tempThreshold eq 'default') {
|
if ($tempThreshold eq 'default') {
|
||||||
$tempThreshold = 127;
|
$tempThreshold = 0;
|
||||||
readingsSingleUpdate($hash, "roomTempSet", 'default', 1);
|
readingsSingleUpdate($hash, "roomTempSet", 'default', 1);
|
||||||
} elsif ($tempThreshold =~ m/^[+-]?\d+$/ && $tempThreshold >= - 63 && $tempThreshold <= 63) {
|
} elsif ($tempThreshold =~ m/^[+-]?\d+$/ && $tempThreshold >= - 63 && $tempThreshold <= 63) {
|
||||||
readingsSingleUpdate($hash, "roomTempSet", $tempThreshold, 1);
|
readingsSingleUpdate($hash, "roomTempSet", $tempThreshold, 1);
|
||||||
$tempThreshold = abs($tempThreshold) | 0x40 if ($tempThreshold < 0);
|
$tempThreshold += 64;
|
||||||
|
#$tempThreshold = abs($tempThreshold) | 0x40 if ($tempThreshold < 0);
|
||||||
} else {
|
} else {
|
||||||
return "Usage: $cmd variable is wrong, choose default|-63 ... 63." ;
|
return "Usage: $cmd variable is wrong, choose default|-63 ... 63." ;
|
||||||
}
|
}
|
||||||
@ -7075,7 +7108,7 @@ sub EnOcean_Parse($$)
|
|||||||
RemoveInternalTimer($hash->{helper}{alarmTimer});
|
RemoveInternalTimer($hash->{helper}{alarmTimer});
|
||||||
InternalTimer(gettimeofday() + 1320, 'EnOcean_readingsSingleUpdate', $hash->{helper}{alarmTimer}, 0);
|
InternalTimer(gettimeofday() + 1320, 'EnOcean_readingsSingleUpdate', $hash->{helper}{alarmTimer}, 0);
|
||||||
|
|
||||||
} elsif ($model eq "FAE14" || $model eq "FHK14" || $model eq "FHK61") {
|
} elsif ($model =~ m/FAE14|FHK14|FHK61$/) {
|
||||||
# heating/cooling relay FAE14, FHK14, untested
|
# heating/cooling relay FAE14, FHK14, untested
|
||||||
$event = "controllerMode";
|
$event = "controllerMode";
|
||||||
if ($db[0] == 0x30) {
|
if ($db[0] == 0x30) {
|
||||||
@ -7200,13 +7233,10 @@ sub EnOcean_Parse($$)
|
|||||||
}
|
}
|
||||||
# released events are disturbing when using a remote, since it overwrites
|
# released events are disturbing when using a remote, since it overwrites
|
||||||
# the "real" state immediately. In the case of an Eltako FSB14, FSB61 ...
|
# the "real" state immediately. In the case of an Eltako FSB14, FSB61 ...
|
||||||
# the state should remain released. (by Thomas)
|
# the state should remain released.
|
||||||
if ($msg =~ m/released$/ &&
|
if ($msg =~ m/released$/ &&
|
||||||
AttrVal($name, "sensorMode", "switch") ne "pushbutton" &&
|
AttrVal($name, "sensorMode", "switch") ne "pushbutton" &&
|
||||||
$model ne "FT55" && $model ne "FSB14" &&
|
$model !~ m/(FT55|FSB14|FSB61|FSB70|FSM12|FSM61|FTS12)$/) {
|
||||||
$model ne "FSB61" && $model ne "FSB70" &&
|
|
||||||
$model ne "FSM12" && $model ne "FSM61" &&
|
|
||||||
$model ne "FTS12") {
|
|
||||||
$event = "buttons";
|
$event = "buttons";
|
||||||
$msg = "released";
|
$msg = "released";
|
||||||
} else {
|
} else {
|
||||||
@ -10978,16 +11008,20 @@ sub EnOcean_Parse($$)
|
|||||||
CommandDeleteReading(undef, "$name airQuality2");
|
CommandDeleteReading(undef, "$name airQuality2");
|
||||||
}
|
}
|
||||||
my $outdoorTemp = ($db[8] & 0xFE) >> 1;
|
my $outdoorTemp = ($db[8] & 0xFE) >> 1;
|
||||||
$outdoorTemp -= $outdoorTemp if ($outdoorTemp & 0x40);
|
#$outdoorTemp -= $outdoorTemp if ($outdoorTemp & 0x40);
|
||||||
|
$outdoorTemp -= 64;
|
||||||
push @event, "3:outdoorTemp:$outdoorTemp";
|
push @event, "3:outdoorTemp:$outdoorTemp";
|
||||||
my $supplyTemp = ($db[8] & 1) << 6 | ($db[7] & 0xFC) >> 2;
|
my $supplyTemp = ($db[8] & 1) << 6 | ($db[7] & 0xFC) >> 2;
|
||||||
$supplyTemp -= $supplyTemp if ($supplyTemp & 0x40);
|
#$supplyTemp -= $supplyTemp if ($supplyTemp & 0x40);
|
||||||
|
$supplyTemp -= 64;
|
||||||
push @event, "3:supplyTemp:$supplyTemp";
|
push @event, "3:supplyTemp:$supplyTemp";
|
||||||
my $roomTemp = ($db[7] & 3) << 5 | ($db[6] & 0xF8) >> 3;
|
my $roomTemp = ($db[7] & 3) << 5 | ($db[6] & 0xF8) >> 3;
|
||||||
$roomTemp -= $roomTemp if ($roomTemp & 0x40);
|
#$roomTemp -= $roomTemp if ($roomTemp & 0x40);
|
||||||
|
$roomTemp -= 64;
|
||||||
push @event, "3:roomTemp:$roomTemp";
|
push @event, "3:roomTemp:$roomTemp";
|
||||||
my $exhaustTemp = ($db[6] & 7) << 4 | ($db[5] & 0xF0) >> 4;
|
my $exhaustTemp = ($db[6] & 7) << 4 | ($db[5] & 0xF0) >> 4;
|
||||||
$exhaustTemp -= $exhaustTemp if ($exhaustTemp & 0x40);
|
#$exhaustTemp -= $exhaustTemp if ($exhaustTemp & 0x40);
|
||||||
|
$exhaustTemp -= 64;
|
||||||
push @event, "3:exhaustTemp:$exhaustTemp";
|
push @event, "3:exhaustTemp:$exhaustTemp";
|
||||||
push @event, "3:supplyAirFlow:". (($db[5] & 0x0F) << 2 | ($db[4] & 0xFC) >> 2);
|
push @event, "3:supplyAirFlow:". (($db[5] & 0x0F) << 2 | ($db[4] & 0xFC) >> 2);
|
||||||
push @event, "3:exhaustAirFlow:" . (($db[4] & 3) << 8 | $db[3]);
|
push @event, "3:exhaustAirFlow:" . (($db[4] & 3) << 8 | $db[3]);
|
||||||
@ -12304,6 +12338,42 @@ sub EnOcean_Attr(@)
|
|||||||
$err = "attribute-value [$attrName] = $attrVal wrong";
|
$err = "attribute-value [$attrName] = $attrVal wrong";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} elsif ($attrName eq "model") {
|
||||||
|
if (!defined $attrVal){
|
||||||
|
|
||||||
|
} else {
|
||||||
|
# set model specific attributes
|
||||||
|
foreach my $attrCntr (keys %{$EnO_models{$attrVal}{attr}}) {
|
||||||
|
if ($attrCntr eq "remoteID") {
|
||||||
|
if (exists $hash->{DEF}) {
|
||||||
|
$attr{$name}{$attrCntr} = $hash->{DEF};
|
||||||
|
} else {
|
||||||
|
$attr{$name}{$attrCntr} = EnOcean_CheckSenderID($EnO_models{$attrVal}{attr}{$attrCntr}, $hash->{IODev}{NAME}, "00000000");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$attr{$name}{$attrCntr} = $EnO_models{$attrVal}{attr}{$attrCntr};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (exists $EnO_models{$attrVal}{xml}) {
|
||||||
|
# read xml device description to $hash->{helper}
|
||||||
|
if ($xmlFunc == 1) {
|
||||||
|
my $xmlFile = $attr{global}{modpath} . $EnO_models{$attrVal}{xml}{xmlDescrLocation};
|
||||||
|
if (-e -f -r $xmlFile) {
|
||||||
|
$hash->{helper} = $xml->XMLin($xmlFile);
|
||||||
|
if (exists $hash->{helper}{Device}) {
|
||||||
|
|
||||||
|
} else {
|
||||||
|
Log3 $name, 2, "EnOcean $name <attr> Device Description not defined";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Log3 $name, 2, "EnOcean $name <attr> Device Description file $xmlFile not exists";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Log3 $name, 2, "EnOcean $name <attr> XML functions are not available";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} elsif ($attrName eq "gpDef") {
|
} elsif ($attrName eq "gpDef") {
|
||||||
if (!defined $attrVal){
|
if (!defined $attrVal){
|
||||||
|
|
||||||
@ -12955,7 +13025,7 @@ sub EnOcean_Notify(@)
|
|||||||
}
|
}
|
||||||
# teach-in response actions
|
# teach-in response actions
|
||||||
# delete temporary teach-in response device, see V9333_02
|
# delete temporary teach-in response device, see V9333_02
|
||||||
#Log3($name, 2, "EnOcean $name <notify> DEFINED $definedName");
|
Log3($name, 2, "EnOcean $name <notify> DEFINED $definedName");
|
||||||
|
|
||||||
} elsif ($devName eq "global" && $s =~ m/^INITIALIZED$/) {
|
} elsif ($devName eq "global" && $s =~ m/^INITIALIZED$/) {
|
||||||
# assign remote management defptr
|
# assign remote management defptr
|
||||||
@ -12977,6 +13047,7 @@ sub EnOcean_Notify(@)
|
|||||||
my @getCmd = ($name, 'state');
|
my @getCmd = ($name, 'state');
|
||||||
EnOcean_Get($hash, @getCmd);
|
EnOcean_Get($hash, @getCmd);
|
||||||
}
|
}
|
||||||
|
EnOcean_ReadDevDesc(undef, $hash);
|
||||||
#Log3($name, 2, "EnOcean $name <notify> INITIALIZED");
|
#Log3($name, 2, "EnOcean $name <notify> INITIALIZED");
|
||||||
|
|
||||||
} elsif ($devName eq "global" && $s =~ m/^REREADCFG$/) {
|
} elsif ($devName eq "global" && $s =~ m/^REREADCFG$/) {
|
||||||
@ -12996,6 +13067,7 @@ sub EnOcean_Notify(@)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EnOcean_ReadDevDesc(undef, $hash);
|
||||||
#Log3($name, 2, "EnOcean $name <notify> REREADCFG");
|
#Log3($name, 2, "EnOcean $name <notify> REREADCFG");
|
||||||
|
|
||||||
} elsif ($devName eq "global" && $s =~ m/^ATTR ([^ ]*) ([^ ]*) ([^ ]*)$/) {
|
} elsif ($devName eq "global" && $s =~ m/^ATTR ([^ ]*) ([^ ]*) ([^ ]*)$/) {
|
||||||
@ -15161,6 +15233,40 @@ sub EnOcean_setTeachConfirmWaitHash($) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
sub EnOcean_ReadDevDesc($$) {
|
||||||
|
# read xml device description to $hash->{helper}
|
||||||
|
my ($ctrl, $hash) = @_;
|
||||||
|
my $name = $hash->{NAME};
|
||||||
|
if ($xmlFunc == 0) {
|
||||||
|
Log3 $name, 2, "EnOcean $name XML functions are not available";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (exists($hash->{TYPE}) && $hash->{TYPE} eq 'EnOcean' && exists($attr{$name}{model})) {
|
||||||
|
if (exists $EnO_models{$attr{$name}{model}}) {
|
||||||
|
if (exists $EnO_models{$attr{$name}{model}}{xml}{xmlDescrLocation}) {
|
||||||
|
my $xmlFile = $attr{global}{modpath} . $EnO_models{$attr{$name}{model}}{xml}{xmlDescrLocation};
|
||||||
|
if (-e -f -r $xmlFile) {
|
||||||
|
my $xmlData = $xml->XMLin($xmlFile);
|
||||||
|
$hash->{helper} = $xmlData;
|
||||||
|
if (exists $xmlData->{Device}) {
|
||||||
|
Log3 $name, 5, "EnOcean $name Beginn Device Description";
|
||||||
|
Log3 $name, 5, "###";
|
||||||
|
Log3 $name, 5, Dumper($xmlData);
|
||||||
|
Log3 $name, 5, "###";
|
||||||
|
Log3 $name, 5, "EnOcean $name End Device Description";
|
||||||
|
} else {
|
||||||
|
Log3 $name, 2, "EnOcean $name Device Description not defined";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Log3 $name, 2, "EnOcean $name Device Description file $xmlFile not exists";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
sub EnOcean_helperClear($) {
|
sub EnOcean_helperClear($) {
|
||||||
my ($functionHash) = @_;
|
my ($functionHash) = @_;
|
||||||
@ -17006,7 +17112,7 @@ EnOcean_Delete($$)
|
|||||||
created by autocreate. To control the device, it must be bidirectional paired,
|
created by autocreate. To control the device, it must be bidirectional paired,
|
||||||
see <a href="#EnOcean_teach-in">Teach-In / Teach-Out</a>.<br>
|
see <a href="#EnOcean_teach-in">Teach-In / Teach-Out</a>.<br>
|
||||||
The OEM version of the Holter SmartDrive MX has an internal PID controller. This function is activated by
|
The OEM version of the Holter SmartDrive MX has an internal PID controller. This function is activated by
|
||||||
attr <device> model OEM and attr <device> pidCtrl off.<br>
|
attr <device> model Holter_OEM and attr <device> pidCtrl off.<br>
|
||||||
The command is not sent until the device wakes up and sends a message, usually
|
The command is not sent until the device wakes up and sends a message, usually
|
||||||
every 5 minutes.
|
every 5 minutes.
|
||||||
</li>
|
</li>
|
||||||
@ -17129,7 +17235,7 @@ EnOcean_Delete($$)
|
|||||||
The attr subType must be gateway and gwCmd must be switching. This is done if the device was
|
The attr subType must be gateway and gwCmd must be switching. This is done if the device was
|
||||||
created by autocreate.<br>
|
created by autocreate.<br>
|
||||||
For Eltako devices attributes must be set manually. For Eltako FSA12 attribute model must be set
|
For Eltako devices attributes must be set manually. For Eltako FSA12 attribute model must be set
|
||||||
to FSA12.
|
to Eltako_FSA12.
|
||||||
</li>
|
</li>
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
@ -17392,7 +17498,7 @@ EnOcean_Delete($$)
|
|||||||
<a href="#shutTime">shutTime</a> and <a href="#shutTimeCloses">shutTimeCloses</a>,
|
<a href="#shutTime">shutTime</a> and <a href="#shutTimeCloses">shutTimeCloses</a>,
|
||||||
are set correctly.
|
are set correctly.
|
||||||
If <a href="#EnOcean_settingAccuracy">settingAccuracy</a> is set to high, the run-time is sent in 1/10 increments.<br>
|
If <a href="#EnOcean_settingAccuracy">settingAccuracy</a> is set to high, the run-time is sent in 1/10 increments.<br>
|
||||||
Set attr subType to manufProfile, manufID to 00D and attr model to FSB14|FSB61|FSB70|TF manually.<br>
|
Set attr subType to manufProfile, manufID to 00D and attr model to Eltako_FSB14|FSB61|FSB70|TF manually.<br>
|
||||||
Use the sensor type "Szenentaster/PC" for Eltako devices.
|
Use the sensor type "Szenentaster/PC" for Eltako devices.
|
||||||
</li>
|
</li>
|
||||||
<br><br>
|
<br><br>
|
||||||
@ -18647,7 +18753,7 @@ EnOcean_Delete($$)
|
|||||||
<li>state: <BtnX>[,<BtnY>] [released]</li>
|
<li>state: <BtnX>[,<BtnY>] [released]</li>
|
||||||
</ul><br>
|
</ul><br>
|
||||||
The status of the device may become "released", this is not the case for a normal switch.<br>
|
The status of the device may become "released", this is not the case for a normal switch.<br>
|
||||||
Set attr model to FT55|FSM12|FSM61|FTS12 or attr sensorMode to pushbutton manually.
|
Set attr model to Eltako_FT55|FSM12|FSM61|FTS12 or attr sensorMode to pushbutton manually.
|
||||||
</li>
|
</li>
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
@ -18701,7 +18807,7 @@ EnOcean_Delete($$)
|
|||||||
<li>energyHoldOff: normal|holdoff</li>
|
<li>energyHoldOff: normal|holdoff</li>
|
||||||
<li>buttons: pressed|released</li>
|
<li>buttons: pressed|released</li>
|
||||||
</ul><br>
|
</ul><br>
|
||||||
Set attr subType to switch and model to FAE14|FHK14 manually. In addition
|
Set attr subType to switch and model to Eltako_FAE14|FHK14 manually. In addition
|
||||||
every telegram received from a teached-in temperature sensor (e.g. FTR55H)
|
every telegram received from a teached-in temperature sensor (e.g. FTR55H)
|
||||||
is repeated as a confirmation telegram from the Heating/Cooling Relay
|
is repeated as a confirmation telegram from the Heating/Cooling Relay
|
||||||
FAE14, FHK14. In this case set attr subType to e. g. roomSensorControl.05
|
FAE14, FHK14. In this case set attr subType to e. g. roomSensorControl.05
|
||||||
@ -20030,7 +20136,7 @@ EnOcean_Delete($$)
|
|||||||
if the command position is sent or the reading state was changed
|
if the command position is sent or the reading state was changed
|
||||||
manually to open or closed.<br>
|
manually to open or closed.<br>
|
||||||
Set attr subType file, attr manufID to 00D and attr model to
|
Set attr subType file, attr manufID to 00D and attr model to
|
||||||
FSB14|FSB61|FSB70 manually.
|
Eltako_FSB14|FSB61|FSB70 manually.
|
||||||
</li>
|
</li>
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user