From 81e5e50232db26e09cf88c210a9f024651969f1b Mon Sep 17 00:00:00 2001 From: klaus-schauer <> Date: Mon, 9 Sep 2013 09:26:18 +0000 Subject: [PATCH] # TCM_ReadAnswer(): response error corrected # TCM_Read(), TCM_Write(): new commands added git-svn-id: https://svn.fhem.de/fhem/trunk@3883 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/00_TCM.pm | 273 +++++++++++++++++++++++++++++--------------- 1 file changed, 181 insertions(+), 92 deletions(-) diff --git a/fhem/FHEM/00_TCM.pm b/fhem/FHEM/00_TCM.pm index 1b89e982a..edffaa3df 100755 --- a/fhem/FHEM/00_TCM.pm +++ b/fhem/FHEM/00_TCM.pm @@ -57,7 +57,7 @@ TCM_Initialize($) $hash->{AttrList}= "do_not_notify:1,0 dummy:1,0 loglevel:0,1,2,3,4,5,6 blockSenderID:own,no"; } -##################################### +# Define sub TCM_Define($$) { @@ -95,7 +95,7 @@ TCM_Define($$) } -##################################### +# Write # Input is header and data (HEX), without CRC sub TCM_Write($$$) @@ -152,8 +152,8 @@ TCM_Write($$$) DevIo_SimpleWrite($hash, $bstring, 1); } -##################################### -# Used in the TCM120 / ESP2 +# ESP2 CRC +# Used in the TCM120 sub TCM_CSUM($) { @@ -169,8 +169,7 @@ TCM_CSUM($) return sprintf("%02X", $sum & 0xFF); } -##################################### -# Used in the TCM310 / ESP3 +# ESP3 CRC-Table my @u8CRC8Table = ( 0x00, 0x07, 0x0e, 0x09, 0x1c, 0x1b, 0x12, 0x15, 0x38, 0x3f, 0x36, 0x31, 0x24, 0x23, 0x2a, 0x2d, 0x70, 0x77, 0x7e, 0x79, 0x6c, 0x6b, 0x62, 0x65, 0x48, 0x4f, @@ -193,6 +192,8 @@ my @u8CRC8Table = ( 0x98, 0x9f, 0x8a, 0x8D, 0x84, 0x83, 0xde, 0xd9, 0xd0, 0xd7, 0xc2, 0xc5, 0xcc, 0xcb, 0xe6, 0xe1, 0xe8, 0xef, 0xfa, 0xfd, 0xf4, 0xf3 ); +# ESP3 CRC +# Used in the TCM310 sub TCM_CRC8($) { @@ -208,7 +209,7 @@ TCM_CRC8($) return sprintf("%02X", $crc); } -##################################### +# Read # called from the global loop, when the select for hash->{FD} reports data sub TCM_Read($) @@ -228,8 +229,8 @@ TCM_Read($) my $data = $hash->{PARTIAL} . uc(unpack('H*', $buf)); Log $ll5, "$name/RAW: $data"; - ############################# if($hash->{MODEL} == 120) { + # TCM 120 while($data =~ m/^A55A(.B.{20})(..)/) { my ($net, $crc) = ($1, $2); @@ -276,8 +277,8 @@ TCM_Read($) $data = "" if($data !~ m/^A55A/); } - ############################# - } else { # TCM310 / ESP3 + } else { + # TCM310 / ESP3 while($data =~ m/^55(....)(..)(..)(..)/) { my ($l1, $l2, $packetType, $crc) = (hex($1), hex($2), hex($3), $4); @@ -331,34 +332,37 @@ TCM_Read($) # packet type RESPONSE my $rc = substr($mdata, 0, 2); my %codes = ( - "00" => "RET_OK", - "01" => "RET_ERROR", - "02" => "RET_NOT_SUPPORTED", - "03" => "RET_WRONG_PARAM", - "04" => "RET_OPERATION_DENIED", + "00" => "OK", + "01" => "ERROR", + "02" => "NOT_SUPPORTED", + "03" => "WRONG_PARAM", + "04" => "OPERATION_DENIED", + "82" => "FLASH_HW_ERROR", + "90" => "BASEID_OUT_OF_RANGE", + "91" => "BASEID_MAX_REACHED", ); $rc = $codes{$rc} if($codes{$rc}); - Log (($rc eq "RET_OK") ? $ll5 : $ll2, "TCM: $name RESPONSE: $rc"); + Log (($rc eq "OK") ? $ll5 : $ll2, "TCM: $name RESPONSE: $rc"); } elsif($packetType == 3) { # packet type RADIO_SUB_TEL - Log $ll2, "TCM: $name unknown packet type $packetType: $data"; + Log $ll2, "TCM: $name packet type RADIO_SUB_TEL not supported: $data"; } elsif($packetType == 4) { # packet type EVENT - Log $ll2, "TCM: $name unknown packet type $packetType: $data"; + Log $ll2, "TCM: $name packet type EVENT not supported: $data"; } elsif($packetType == 5) { # packet type COMMON_COMMAND - Log $ll2, "TCM: $name unknown packet type $packetType: $data"; + Log $ll2, "TCM: $name packet type COMMON_COMMAND not supported: $data"; } elsif($packetType == 6) { # packet type SMART_ACK_COMMAND - Log $ll2, "TCM: $name unknown packet type $packetType: $data"; + Log $ll2, "TCM: $name packet type SMART_ACK_COMMAND not supported: $data"; } elsif($packetType == 7) { # packet type REMOTE_MAN_COMMAND - Log $ll2, "TCM: $name unknown packet type $packetType: $data"; + Log $ll2, "TCM: $name packet type REMOTE_MAN_COMMAND not supported: $data"; } else { Log $ll2, "TCM: $name unknown packet type $packetType: $data"; @@ -377,7 +381,7 @@ TCM_Read($) $hash->{PARTIAL} = $data; } -##################################### +# Parse Table TCM 120 my %parsetbl120 = ( "8B08" => { msg=>"ERR_SYNTAX_H_SEQ" }, "8B09" => { msg=>"ERR_SYNTAX_LENGTH" }, @@ -399,6 +403,7 @@ my %parsetbl120 = ( expr=>'sprintf("%s, ID:%02x%02x", $a[2]?"on":"off", $a[3], $a[4])' }, ); +# Parse TCM 120 sub TCM_Parse120($$$) { @@ -435,13 +440,19 @@ TCM_Parse120($$$) return $msg; } +# Parse Table TCM 310 my %rc310 = ( + "00" => "OK", "01" => "ERROR", "02" => "NOT_SUPPORTED", "03" => "WRONG_PARAM", "04" => "OPERATION_DENIED", + "82" => "FLASH_HW_ERROR", + "90" => "BASEID_OUT_OF_RANGE", + "91" => "BASEID_MAX_REACHED", ); +# Parse TCM 310 sub TCM_Parse310($$$) { @@ -473,7 +484,7 @@ TCM_Parse310($$$) } -##################################### +# Ready sub TCM_Ready($) { @@ -488,6 +499,7 @@ TCM_Ready($) return ($InBytes>0); } +# Get commands TCM 120 my %gets120 = ( "sensitivity" => "AB48", "idbase" => "AB58", @@ -496,24 +508,37 @@ my %gets120 = ( "sw_ver" => "AB4B", ); +# Get commands TCM 310 my %gets310 = ( - "sw_ver" => {cmd => "03", - APPVersion => "1,4", - APIVersion => "5,4", - ChipID => "9,4", - ChipVersion => "13,4", - Desc => "17,16,STR",}, - "idbase" => {cmd => "08", - BaseID => "1,4", - RemainingWriteCycles => "5,1",}, - "baseID" => {cmd => "08", - BaseID => "1,4", - RemainingWriteCycles => "5,1",}, - "repeater" => {cmd => "10", - repEnable => "1,1", - repLevel => "2,1",}, + "sw_ver" => {cmd => "03", + APPVersion => "1,4", + APIVersion => "5,4", + ChipID => "9,4", + ChipVersion => "13,4", + Desc => "17,16,STR",}, + "version" => {cmd => "03", + APPVersion => "1,4", + APIVersion => "5,4", + ChipID => "9,4", + ChipVersion => "13,4", + Desc => "17,16,STR",}, + "idbase" => {cmd => "08", + BaseID => "1,4", + RemainingWriteCycles => "5,1",}, + "baseID" => {cmd => "08", + BaseID => "1,4", + RemainingWriteCycles => "5,1",}, + "repeater" => {cmd => "0A", + repEnable => "1,1", + repLevel => "2,1",}, +# "secureDev" => {cmd => "1B01", +# SLF => "1,1", +# devID => "2,4",}, + "numSecureDev" => {cmd => "1D", + number => "1,1",}, ); +# Get sub TCM_Get($@) { @@ -524,8 +549,8 @@ TCM_Get($@) my $cmd = $a[1]; my ($err, $msg); - #################################### TCM120 if($hash->{MODEL} eq "120") { + # TCM 120 my $rawcmd = $gets120{$cmd}; return "Unknown argument $cmd, choose one of " . join(" ", sort keys %gets120) if(!defined($rawcmd)); @@ -536,8 +561,8 @@ TCM_Get($@) ($err, $msg) = TCM_ReadAnswer($hash, "get $cmd"); $msg = TCM_Parse120($hash, $msg, 1) if(!$err); - #################################### TCM310 } else { + # TCM 310 my $cmdhash = $gets310{$cmd}; return "Unknown argument $cmd, choose one of " . join(" ", sort keys %gets310) if(!defined($cmdhash)); @@ -559,7 +584,7 @@ TCM_Get($@) } -######################## +# RemovePair sub TCM_RemovePair($) { @@ -568,28 +593,33 @@ TCM_RemovePair($) CommandDeleteReading(undef, "$hash->{NAME} pair"); } +# Set commands TCM 120 my %sets120 = ( # Name, Data to send to the CUL, Regexp for the answer - "pairForSec" => { cmd=>"AB18", arg=>"\\d+" }, - "idbase" => { cmd=>"AB18", arg=>"FF[8-9A-F][0-9A-F]{5}" }, - "baseID" => { cmd=>"AB18", arg=>"FF[8-9A-F][0-9A-F]{5}" }, - "sensitivity" => { cmd=>"AB08", arg=>"0[01]" }, - "sleep" => { cmd=>"AB09" }, - "wake" => { cmd=>"" }, # Special - "reset" => { cmd=>"AB0A" }, - "modem_on" => { cmd=>"AB28", arg=>"[0-9A-F]{4}" }, - "modem_off" => { cmd=>"AB2A" }, + "pairForSec" => { cmd => "AB18", arg => "\\d+" }, + "idbase" => { cmd => "AB18", arg => "FF[8-9A-F][0-9A-F]{5}" }, + "baseID" => { cmd => "AB18", arg => "FF[8-9A-F][0-9A-F]{5}" }, + "sensitivity" => { cmd => "AB08", arg => "0[01]" }, + "sleep" => { cmd => "AB09" }, + "wake" => { cmd => "" }, # Special + "reset" => { cmd => "AB0A" }, + "modem_on" => { cmd => "AB28", arg => "[0-9A-F]{4}" }, + "modem_off" => { cmd => "AB2A" }, ); +# Set commands TCM 310 my %sets310 = ( - "pairForSec" => { cmd=>"AB18", arg=>"\\d+" }, - "idbase" => { cmd=>"07", arg=>"FF[8-9A-F][0-9A-F]{5}" }, - "baseID" => { cmd=>"07", arg=>"FF[8-9A-F][0-9A-F]{5}" }, -# The following 3 does not seem to work / dont get an answer -# "sleep" => { cmd=>"01", arg=>"00[0-9A-F]{6}" }, -# "reset" => { cmd=>"02" }, -# "bist" => { cmd=>"06", BIST_Result=>"1,1", }, + "pairForSec" => { cmd => "AB18", arg=> "\\d+" }, + "sleep" => { cmd => "01", arg => "00[0-9A-F]{6}" }, + "reset" => { cmd => "02" }, + "bist" => { cmd => "06", BIST_Result => "1,1", }, + "idbase" => { cmd => "07", arg => "FF[8-9A-F][0-9A-F]{5}" }, + "baseID" => { cmd => "07", arg => "FF[8-9A-F][0-9A-F]{5}" }, + "repeater" => { cmd => "09", arg => "0[0-1]0[0-2]" }, + "maturity" => { cmd => "10", arg => "0[0-1]" }, + "subtel" => { cmd => "11", arg => "0[0-1]" }, ); +# Set sub TCM_Set($@) { @@ -622,8 +652,8 @@ TCM_Set($@) return; } - ############################## if($hash->{MODEL} eq "120") { + # TCM 120 if($cmdHex eq "") { # wake is very special DevIo_SimpleWrite($hash, "AA", 1); return ""; @@ -635,8 +665,8 @@ TCM_Set($@) $msg = TCM_Parse120($hash, $msg, 1) if(!$err); - ############################## - } else { # TCM310 + } else { + # TCM310 TCM_Write($hash, sprintf("%04X0005", length($cmdHex)/2), $cmdHex); ($err, $msg) = TCM_ReadAnswer($hash, "set $cmd"); $msg = TCM_Parse310($hash, $msg, $cmdhash) @@ -652,6 +682,7 @@ TCM_Set($@) } +# ReadAnswer sub TCM_ReadAnswer($$) { @@ -696,6 +727,7 @@ TCM_ReadAnswer($$) Log $ll5, "TCM/RAW (ReadAnswer): $data"; if($hash->{MODEL} eq "120") { + # TCM 120 if(length($data) >= 28) { return ("$arg: Bogus answer received: $data", undef) if($data !~ m/^A55A(.B.{20})(..)/); @@ -708,13 +740,17 @@ TCM_ReadAnswer($$) return (undef, $net); } - } else { # 310 - if(length($data) >= 7) { + } else { + # TCM 310 + if(length($data) >= 14) { return ("$arg: Bogus answer received: $data", undef) if($data !~ m/^55(....)(..)(..)(..)(.*)(..)$/); my ($dlen, $olen, $ptype, $hcrc, $data, $dcrc) = ($1,$2,$3,$4,$5,$6); - next if(length($data) < hex($dlen)+hex($olen)+6); - + ### ??? + # next if(length($data) < hex($dlen)+hex($olen)+6); + # next if(length($data) < 2 * hex($dlen) + 2 * hex($olen) + 6); + next if(length($data) < 2*hex($dlen)); + my $myhcrc = TCM_CRC8("$dlen$olen$ptype"); return ("wrong header checksum: got $hcrc, computed $myhcrc", undef) if($hcrc ne $myhcrc); @@ -730,6 +766,7 @@ TCM_ReadAnswer($$) } } +# Undef sub TCM_Undef($$) { @@ -774,6 +811,10 @@ TCM_Undef($$) The address range used by your transceiver module, can be found in the parameters BaseID and LastID.

+ The transceiver moduls do not always support all commands. The supported range + of commands depends on the hardware and the firmware version. A firmware update + is usually not provided. +

Define @@ -796,42 +837,90 @@ TCM_Undef($$)
- Set -