From 1fb627edd89ddcadd11ba14d4b74b9a0b97fa6b1 Mon Sep 17 00:00:00 2001 From: rudolfkoenig <> Date: Wed, 1 Mar 2017 17:31:47 +0000 Subject: [PATCH] 10_ZWave.pm: add CRC16 (68111) git-svn-id: https://svn.fhem.de/fhem/trunk@13568 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/10_ZWave.pm | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/fhem/FHEM/10_ZWave.pm b/fhem/FHEM/10_ZWave.pm index 65f59b74f..c9e86c26d 100755 --- a/fhem/FHEM/10_ZWave.pm +++ b/fhem/FHEM/10_ZWave.pm @@ -637,6 +637,7 @@ ZWave_Initialize($) showtime:noArg vclasses useMultiCmd:noArg + useCRC16:noArg zwaveRoute ); use warnings 'qw'; @@ -4096,6 +4097,17 @@ ZWave_isWakeUp($) return $h->{isWakeUp}; } +sub +ZWave_addCRC16($) +{ + my ($msg) = @_; + return $msg if($msg !~ m/13(..)(..)(.*)(....)$/); + my ($tgt, $olen, $omsg, $sfx) = ($1, $2, $3, $4); + $msg = sprintf("13%s%02x5601%s%s%s", $tgt, length($omsg)/2+4, + $omsg, uc(ZWave_CRC16("5601$omsg")), $sfx); + return $msg; +} + # stack contains type:hexcode # type is: set / sentset, get / sentget / sentackget # sentset will be discarded after ack, sentget needs ack (->sentackget) then msg @@ -4168,6 +4180,8 @@ ZWave_processSendStack($$;$) $ss->[0] =~ m/^([^:]*?):(.*)$/; my ($type, $msg) = ($1, $2); + + $msg = ZWave_addCRC16($msg) if($hash->{useCRC16}); IOWrite($hash, $hash->{homeId}.($hash->{route}?",".$hash->{route}:""), "00$msg"); @@ -4584,7 +4598,7 @@ ZWave_Parse($$@) if($arg =~ /^..5601(.*)(....)/) { # CRC_16_ENCAP: Unwrap encapsulated command #Log3 $ioName, 4, "CRC FIX, MSG: ($1)"; # see Forum #23494 my $crc16 = ZWave_CRC16("5601".$1); - if ($2 eq $crc16) { + if (lc($2) eq lc($crc16)) { $arg = sprintf("%02x$1", length($1)/2); } else { Log3 $ioName, 4, "$ioName CRC_16 checksum mismatch, received $2," . @@ -4794,7 +4808,7 @@ ZWave_Attr(@) } elsif($attrName eq "useMultiCmd") { if($type eq "del") { - $hash->{".vclasses"} = {}; + delete $hash->{useMultiCmd}; return undef; } my $a = ($attr{$devName} ? $attr{$devName}{classes} : ""); @@ -4802,6 +4816,18 @@ ZWave_Attr(@) if(!$a || !($a =~ m/MULTI_CMD/ && $a =~ m/WAKE_UP/)); $hash->{useMultiCmd} = 1; return undef; + + } elsif($attrName eq "useCRC16") { + if($type eq "del") { + delete $hash->{useCRC16}; + return undef; + } + my $a = ($attr{$devName} ? $attr{$devName}{classes} : ""); + return "useCRC16: unsupported device, see help ZWave for details" + if(!$a || $a !~ m/CRC_16_ENCAP/ || + ReadingsVal($devName, "SECURITY", "") eq "ENABLED"); + $hash->{useCRC16} = 1; + return undef; } return undef; @@ -5938,6 +5964,12 @@ s2Hex($) contains the version information for each of the supported classes. +