2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-03 23:06:37 +00:00

10_EnOcean: GP teach-in modified

git-svn-id: https://svn.fhem.de/fhem/trunk@19651 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
klaus.schauer 2019-06-19 18:08:12 +00:00
parent 32424a97a7
commit c3a133a9bc

View File

@ -6417,11 +6417,11 @@ sub EnOcean_Set($@)
if ($setChannelName eq "?") { if ($setChannelName eq "?") {
$channelName = "none"; $channelName = "none";
if ($channelType == 1 && defined $EnO_gpValueData{$signalType}{name}) { if ($channelType == 1 && defined $EnO_gpValueData{$signalType}{name}) {
$channelName = $EnO_gpValueData{$signalType}{name}; $channelName = $EnO_gpValueData{$signalType}{name};
} elsif ($channelType == 2 && defined $EnO_gpValueFlag{$signalType}{name}) { } elsif ($channelType == 2 && defined $EnO_gpValueFlag{$signalType}{name}) {
$channelName = $EnO_gpValueFlag{$signalType}{name}; $channelName = $EnO_gpValueFlag{$signalType}{name};
} elsif ($channelType == 3 && defined $EnO_gpValueEnum{$signalType}{name}) { } elsif ($channelType == 3 && defined $EnO_gpValueEnum{$signalType}{name}) {
$channelName = $EnO_gpValueEnum{$signalType}{name}; $channelName = $EnO_gpValueEnum{$signalType}{name};
} }
} else { } else {
$channelName = $setChannelName; $channelName = $setChannelName;
@ -12150,7 +12150,7 @@ sub EnOcean_Parse($$)
my $channelName; my $channelName;
my $channelType; my $channelType;
my $cntr = 0; my $cntr = 0;
my $dataOutboundDefLen = 0; my $teachInDataLen = 0;
my @gpDef; my @gpDef;
my $signalType; my $signalType;
#Log3 $name, 2, "EnOcean $name parse GPTI header: $header data: $data start"; #Log3 $name, 2, "EnOcean $name parse GPTI header: $header data: $data start";
@ -12173,23 +12173,42 @@ sub EnOcean_Parse($$)
} }
#Log3 $name, 2, "EnOcean $name parse GPTI channel: $channel channelType: $channelType signalType: $signalType data: $data"; #Log3 $name, 2, "EnOcean $name parse GPTI channel: $channel channelType: $channelType signalType: $signalType data: $data";
######
if ($channelType == 0) { if ($channelType == 0) {
# teach-in information # teach-in information
$data =~ m/^(.{8})(.*)$/;
$teachInDataLen = unpack('C', pack('B8', $1)) * 8;
$data = $2;
if ($signalType == 1) { if ($signalType == 1) {
# outbound channel description # outbound channels description following
$channelDir = "O"; $channelDir = "O";
$data =~ m/^(.{8})(.*)$/;
$dataOutboundDefLen = unpack('C', pack('B8', $1));
$data = $2;
} elsif ($signalType == 2) { } elsif ($signalType == 2) {
# produkt ID # produkt ID
$data =~ m/^(.{32})(.*)$/; $data =~ m/^(.{$teachInDataLen})(.*)$/;
$attr{$name}{productID} = EnOcean_convBitToHex($1); $attr{$name}{productID} = EnOcean_convBitToHex($1);
$data = $2; $data = $2;
} elsif ($signalType == 3) {
######
# Connected GSI Sensor IDs
my $gsiIdDataLen = $teachInDataLen - 16;
$data =~ m/^(.{8})(.{8})(.{$gsiIdDataLen})(.*)$/;
$attr{$name}{gsiSocket} = unpack('C', pack('B8', $1));
my ($sensors, $gsiIdData) = (unpack('C', pack('B8', $2)), $3);
$data = $4;
my $gsiSensorName;
for (my $i = 0; $i <= $sensors; $i++) {
$gsiIdData =~ m/^(.{8})(.{16})(.{24})(.*)$/;
$gsiSensorName = sprintf "gsiSensor-%03d", $i;
$attr{$name}{$gsiSensorName} = sprintf "%02s:%04s:%06s", EnOcean_convBitToHex($1), EnOcean_convBitToHex($2), EnOcean_convBitToHex($3);
$gsiIdData = $4;
}
} else { } else {
if ($teachInDataLen == 0) {
Log3 $name, 2, "EnOcean $name parse GPTI teach-in info signalType: $signalType not supported";
} else {
$data =~ m/^(.{$teachInDataLen})(.*)$/;
Log3 $name, 2, "EnOcean $name parse GPTI teach-in info signalType: $signalType data: " . EnOcean_convBitToHex($1) . " not supported";
$data = $2;
}
} }
} elsif ($channelType == 1) { } elsif ($channelType == 1) {
@ -12848,7 +12867,7 @@ sub EnOcean_Parse($$)
my $channelDef; my $channelDef;
my $channelName; my $channelName;
my $channelType; my $channelType;
my $dataOutboundDefLen = 0; my $teachInDataLen = 0;
my $gpData; my $gpData;
my @gpDef; my @gpDef;
my $gpIdx; my $gpIdx;
@ -16584,6 +16603,9 @@ sub EnOcean_gpConvDataToValue($$$$$) {
if ($channelType == 3) { if ($channelType == 3) {
# enumeration # enumeration
if (defined $EnO_gpValueEnum{$signalType}{unit}) {
$readingUnit = $EnO_gpValueEnum{$signalType}{unit};
}
if (defined $EnO_gpValueEnum{$signalType}{enum}{$data}) { if (defined $EnO_gpValueEnum{$signalType}{enum}{$data}) {
$readingValue = $EnO_gpValueEnum{$signalType}{enum}{$data}; $readingValue = $EnO_gpValueEnum{$signalType}{enum}{$data};
$readingFormat = '%s'; $readingFormat = '%s';