From 374d330d7b2720dd28c90a4979bd008120958928 Mon Sep 17 00:00:00 2001 From: bjoernh <> Date: Tue, 2 Jan 2018 18:57:03 +0000 Subject: [PATCH] 14_CUL_TCM97001: Fix Logoutput, Fix device output with multiple sensors git-svn-id: https://svn.fhem.de/fhem/trunk@15756 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 2 + fhem/FHEM/14_CUL_TCM97001.pm | 352 +++++++++++++++++++---------------- 2 files changed, 197 insertions(+), 157 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index 97eeacd92..e6c46db4e 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,7 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - change: 14_CUL_TCM97001: Fix Logoutput, Fix device output with + multiple sensors - change: 74_AMADDevice: change DEF and add Attribut IODev, add Reading incommingSmsText - change: 74_XiaomiFlowerSens: fix Problems with sshHost Methode diff --git a/fhem/FHEM/14_CUL_TCM97001.pm b/fhem/FHEM/14_CUL_TCM97001.pm index 5c2752e27..d39965e7d 100755 --- a/fhem/FHEM/14_CUL_TCM97001.pm +++ b/fhem/FHEM/14_CUL_TCM97001.pm @@ -82,6 +82,7 @@ CUL_TCM97001_Initialize($) $hash->{ParseFn} = "CUL_TCM97001_Parse"; $hash->{AttrList} = "IODev do_not_notify:1,0 ignore:0,1 showtime:1,0 " . "$readingFnAttributes " . + "max-deviation-temp:1,2,3,4,5,6,7,8,9,10,15,20,25,30,35,40,45,50 ". "model:".join(",", sort keys %models); $hash->{AutoCreate}= @@ -143,7 +144,7 @@ CUL_TCM97001_Undef($$) # n8 = ( 0x7 + n0 + n1 + n2 + n3 + n4 + n5 + n6 + n7 ) & 0xf sub checksum_W174 { my $msg = shift; - Log3 "CUL_TCM97001: ", 4 , "CUL_TCM97001: W174 checksum calc for: $msg"; + Log3 "CUL_TCM97001 ", 4 , "CUL_TCM97001 W174 checksum calc for: $msg"; my @a = split("", $msg); my $bitReverse = undef; my $x = undef; @@ -155,7 +156,7 @@ sub checksum_W174 { my @aReverse = split("", $hexReverse); # Split reversed a again my $CRC = (7 + hex($aReverse[0])+hex($aReverse[1])+hex($aReverse[2])+hex($aReverse[3])+hex($aReverse[4])+hex($aReverse[5])+hex($aReverse[6])+hex($aReverse[7])) & 15; if ($CRC == hex($aReverse[8])) { - Log3 "CUL_TCM97001: ", 4 , "CUL_TCM97001: W174 checksum ok $CRC == ".hex($aReverse[8]); + Log3 "CUL_TCM97001 ", 4 , "CUL_TCM97001 W174 checksum ok $CRC == ".hex($aReverse[8]); return TRUE; } else { return FALSE; @@ -194,17 +195,17 @@ sub checkCRC4 { my $msg = shift; my @a = split("", $msg); if(scalar(@a)<9){ - Log3 "checkCRC4", 5, "CUL_TCM97001 failed for msg=($msg) length<9"; + Log3 "checkCRC4", 5, "CUL_TCM97001 checkCRC4 failed for msg=($msg) length<9"; return FALSE; } # xor nibbles 0 to 7 and compare to n8, if more nibble they might have been added to fill gap my $CRC = ( (hex($a[0])) ^ (hex($a[1])) ^ (hex($a[2])) ^ (hex($a[3])) ^ (hex($a[4])) ^ (hex($a[5])) ^ (hex($a[6])) ^ (hex($a[7])) ); if ($CRC == (hex($a[8]))) { - Log3 "checkCRC4", 5, "CUL_TCM97001 OK for msg=($msg)"; + Log3 "checkCRC4", 5, "CUL_TCM97001 checkCRC4 OK for msg=($msg)"; return TRUE; } - Log3 "checkCRC4", 5, "CUL_TCM97001 FAILED for msg=($msg)"; + Log3 "checkCRC4", 5, "CUL_TCM97001 checkCRC4 FAILED for msg=($msg)"; return FALSE; } # @@ -216,16 +217,16 @@ sub isRain { my $msg = shift; my @a = split("", $msg); if(scalar(@a)<9){ - Log3 "isRain", 5, "isRain: CUL_TCM97001 failed for msg=($msg) length<9"; + Log3 "isRain", 5, "CUL_TCM97001 isRain failed for msg=($msg) length<9"; return FALSE; } # if bit 0 of nibble 2 is 1 then this is no rain data my $isRainData = ( (hex($a[2]) & 1) ); if ($isRainData == 1) { - Log3 "isRain", 5, "isRain: CUL_TCM97001 for msg=($msg) = FALSE"; + Log3 "isRain", 5, "CUL_TCM97001 isRain for msg=($msg) = FALSE"; return FALSE; } - Log3 "isRain", 5, "isRain: CUL_TCM97001 for msg=($msg) = TRUE"; + Log3 "isRain", 5, "CUL_TCM97001 isRain for msg=($msg) = TRUE"; return TRUE; } @@ -234,7 +235,7 @@ sub isRain { # sub checkCRCKW9010 { my $msg = shift; - Log3 "CUL_TCM97001", 5 , "crc calc for: $msg"; + Log3 "CUL_TCM97001", 5 , "CUL_TCM97001 checkCRCKW9010 crc calc for: $msg"; my @a = split("", $msg); my $bitReverse = undef; my $x = undef; @@ -249,8 +250,8 @@ sub checkCRCKW9010 { my $CRC = (hex($aReverse[0])+hex($aReverse[1])+hex($aReverse[2])+hex($aReverse[3]) +hex($aReverse[4])+hex($aReverse[5])+hex($aReverse[6])+hex($aReverse[7])) & 15; - Log3 "CUL_TCM97001", 5 , "calc crc is: $CRC"; - Log3 "CUL_TCM97001", 5 , "ref crc is :".hex($aReverse[8]); + Log3 "CUL_TCM97001", 5 , "CUL_TCM97001 checkCRCKW9010 calc crc is: $CRC"; + Log3 "CUL_TCM97001", 5 , "CUL_TCM97001 checkCRCKW9010 ref crc is :".hex($aReverse[8]); if ($CRC == hex($aReverse[8])) { return TRUE; } @@ -282,8 +283,6 @@ sub checkCRC_GTWT02 { my @a = split("", $msg); my $CRC = (hex($a[0])+hex($a[1])+hex($a[2])+hex($a[3]) +hex($a[4])+hex($a[5])+hex($a[6])+(hex($a[7]) & 0xE)); -# my $CRC = (hex($a[0])+hex($a[1])+hex($a[2])+hex($a[3]) -# +hex($a[4])+hex($a[5])+hex($a[6])+hex($a[7])) -1; my $CRCCHECKVAL= (hex($a[7].$a[8].$a[9]) & 0x1F8) >> 3; if ($CRC % 64 == $CRCCHECKVAL) { return TRUE; @@ -324,11 +323,11 @@ sub checkValues { sub CUL_TCM97001_Parse($$) { - my $enableLongIDs = TRUE; # Disable short ID support, enable longIDs my ($hash, $msg) = @_; $msg = substr($msg, 1); my @a = split("", $msg); + my $iodev = $hash->{NAME}; my $id3 = hex($a[0] . $a[1]); #my $id4 = hex($a[0] . $a[1] . $a[2] . (hex($a[3]) & 0x3)); @@ -368,9 +367,9 @@ CUL_TCM97001_Parse($$) { $rssi = hex($rssi); $rssi = ($rssi>=128 ? (($rssi-256)/2-74) : ($rssi/2-74)) if defined($rssi); - Log3 $name, 4, "CUL_TCM97001 $name $id3 ($msg) length: $l RSSI: $rssi"; + Log3 $name, 4, "$iodev: CUL_TCM97001 $name $id3 ($msg) length: $l RSSI: $rssi"; } else { - Log3 $name, 4, "CUL_TCM97001 $name $id3 ($msg) length: $l"; + Log3 $name, 4, "$iodev: CUL_TCM97001 $name $id3 ($msg) length: $l"; } my ($msgtype, $msgtypeH); @@ -405,7 +404,7 @@ CUL_TCM97001_Parse($$) - my $longids = AttrVal($hash->{NAME},'longids',1); + my $longids = AttrVal($iodev,'longids',1); if (length($msg) == 8) { # Only tmp TCM device @@ -418,66 +417,6 @@ CUL_TCM97001_Parse($$) } $readedModel = AttrVal($name, "model", "Unknown"); - if ($readedModel eq "Unknown" || $readedModel eq "TCM97...") { - - $temp = (hex($a[3].$a[4].$a[5]) >> 2) & 0xFFFF; - my $negative = (hex($a[2]) >> 0) & 0x3; - - if ($negative == 0x3) { - $temp = (~$temp & 0x03FF) + 1; - $temp = -$temp; - } - - $temp = $temp / 10; - - - if (checkValues($temp, 50)) { - $model="TCM97..."; - # I think bit 3 on byte 3 is battery warning - $batbit = (hex($a[2]) >> 0) & 0x4; - $batbit = ~$batbit & 0x1; # Bat bit umdrehen - $mode = (hex($a[5]) >> 0) & 0x1; - my $unknown = (hex($a[4]) >> 0) & 0x2; - if ($mode) { - Log3 $name, 5, "CUL_TCM97001 Mode: manual triggert"; - } else { - Log3 $name, 5, "CUL_TCM97001 Mode: auto triggert"; - } - if ($unknown) { - Log3 $name, 5, "CUL_TCM97001 Unknown Bit: $unknown"; - } - - my $deviceCode; - - if (!defined($modules{CUL_TCM97001}{defptr}{$tcm97id})) - { - if ( $enableLongIDs == TRUE || (($longids != "0") && ($longids eq "1" || $longids eq "ALL" || (",$longids," =~ m/,$model,/)))) - { - $deviceCode="CUL_TCM97001_".$tcm97id; - Log3 $hash,4, "CUL_TCM97001 using longid: $longids model: $model"; - } else { - $deviceCode="CUL_TCM97001_" . $model; - } - } else { - $deviceCode=$tcm97id; - } - $def = $modules{CUL_TCM97001}{defptr}{$deviceCode}; - if($def) { - $name = $def->{NAME}; - } - - - - if(!$def) { - Log3 $name, 2, "CUL_TCM97001 Unknown device $deviceCode, please define it"; - return "UNDEFINED $model" . substr($deviceCode, rindex($deviceCode,"_")) . " CUL_TCM97001 $deviceCode"; - } - $packageOK = TRUE; - $hasbatcheck = TRUE; - $hasmode = TRUE; - $readedModel=$model; - } - } if ($readedModel eq "Unknown" || $readedModel eq "ABS700") { $temp = (hex($a[2].$a[3]) & 0x7F)+(hex($a[5])/10); @@ -485,6 +424,32 @@ CUL_TCM97001_Parse($$) $temp = -$temp; } + # Sanity check temperature + if($def) { + my $timeSinceLastUpdate = ReadingsAge($iodev, "state", 0); + if ($timeSinceLastUpdate < 0) { + $timeSinceLastUpdate *= -1; + } + if (defined($hash->{READINGS}{temperature}{VAL})) { + my $diffTemp = 0; + my $oldTemp = $hash->{READINGS}{temperature}{VAL}; + my $maxdeviation = AttrVal($name, "max-deviation-temp", 1); # default 1 K + if ($temp > $oldTemp) { + $diffTemp = ($temp - $oldTemp); + } else { + $diffTemp = ($oldTemp - $temp); + } + $diffTemp = sprintf("%.1f", $diffTemp); + Log3 $name, 4, "$iodev: $name old temp $oldTemp, age $timeSinceLastUpdate, new temp $temp, diff temp $diffTemp"; + my $maxDiffTemp = $timeSinceLastUpdate / 60 + $maxdeviation; # maxdeviation + 1.0 Kelvin/Minute + $maxDiffTemp = sprintf("%.1f", $maxDiffTemp + 0.05); # round 0.1 + Log3 $name, 4, "$iodev: $name max difference temperature $maxDiffTemp K"; + if ($diffTemp > $maxDiffTemp) { + Log3 $name, 3, "$iodev: $name ERROR - Temp diff too large (old $oldTemp, new $temp, diff $diffTemp)"; + return ""; + } + } + } if (checkValues($temp, 50)) { $model="ABS700"; $batbit = ((hex($a[4]) & 0x8) != 0x8); @@ -496,9 +461,9 @@ CUL_TCM97001_Parse($$) if ( $enableLongIDs == TRUE || (($longids != "0") && ($longids eq "1" || $longids eq "ALL" || (",$longids," =~ m/,$model,/)))) { $deviceCode="CUL_TCM97001_".$tcm97id; - Log3 $hash,4, "CUL_TCM97001 using longid: $longids model: $model"; + Log3 $hash,4, "$iodev: CUL_TCM97001 using longid: $longids model: $model"; } else { - $deviceCode="CUL_TCM97001_" . $model; + $deviceCode="$iodev: CUL_TCM97001_" . $model; } } else { $deviceCode=$tcm97id; @@ -508,7 +473,7 @@ CUL_TCM97001_Parse($$) $name = $def->{NAME}; } if(!$def) { - Log3 $name, 2, "CUL_TCM97001 Unknown device $deviceCode, please define it"; + Log3 $name, 2, "$iodev: CUL_TCM97001 Unknown device $deviceCode, please define it"; return "UNDEFINED $model" . substr($deviceCode, rindex($deviceCode,"_")) . " CUL_TCM97001 $deviceCode"; } $hasbatcheck = TRUE; @@ -517,7 +482,67 @@ CUL_TCM97001_Parse($$) $readedModel=$model; } - } + } + + if ($readedModel eq "Unknown" || $readedModel eq "TCM97...") { + + $temp = (hex($a[3].$a[4].$a[5]) >> 2) & 0xFFFF; + my $negative = (hex($a[2]) >> 0) & 0x3; + + if ($negative == 0x3) { + $temp = (~$temp & 0x03FF) + 1; + $temp = -$temp; + } + + $temp = $temp / 10; + + if (checkValues($temp, 50)) { + $model="TCM97..."; + # I think bit 3 on byte 3 is battery warning + $batbit = (hex($a[2]) >> 0) & 0x4; + $batbit = ~$batbit & 0x1; # Bat bit umdrehen + $mode = (hex($a[5]) >> 0) & 0x1; + my $unknown = (hex($a[4]) >> 0) & 0x2; + if ($mode) { + Log3 $name, 5, "$iodev: CUL_TCM97001 Mode: manual triggert"; + } else { + Log3 $name, 5, "$iodev: CUL_TCM97001 Mode: auto triggert"; + } + if ($unknown) { + Log3 $name, 5, "$iodev: CUL_TCM97001 Unknown Bit: $unknown"; + } + + my $deviceCode; + + if (!defined($modules{CUL_TCM97001}{defptr}{$tcm97id})) + { + if ( $enableLongIDs == TRUE || (($longids != "0") && ($longids eq "1" || $longids eq "ALL" || (",$longids," =~ m/,$model,/)))) + { + $deviceCode="CUL_TCM97001_".$tcm97id; + Log3 $hash,4, "$iodev: CUL_TCM97001 using longid: $longids model: $model"; + } else { + $deviceCode="$iodev: CUL_TCM97001_" . $model; + } + } else { + $deviceCode=$tcm97id; + } + $def = $modules{CUL_TCM97001}{defptr}{$deviceCode}; + if($def) { + $name = $def->{NAME}; + } + + + + if(!$def) { + Log3 $name, 2, "$iodev: CUL_TCM97001 Unknown device $deviceCode, please define it"; + return "UNDEFINED $model" . substr($deviceCode, rindex($deviceCode,"_")) . " CUL_TCM97001 $deviceCode"; + } + $packageOK = TRUE; + $hasbatcheck = TRUE; + $hasmode = TRUE; + $readedModel=$model; + } + } } elsif (length($msg) == 10) { #Log3 $name, 2, "CUL_TCM97001 10er msg: " . $msg; my $idType2 = hex($a[1] . $a[2]); @@ -566,7 +591,7 @@ CUL_TCM97001_Parse($$) if ( $enableLongIDs == TRUE || (($longids != "0") && ($longids eq "1" || $longids eq "ALL" || (",$longids," =~ m/,$model,/)))) { $deviceCode="CUL_TCM97001_".$idType2; - Log3 $hash,4, "CUL_TCM97001 using longid: $longids model: $model"; + Log3 $hash,4, "$iodev: CUL_TCM97001 using longid: $longids model: $model"; } else { $deviceCode="CUL_TCM97001_" . $model . "_" . $channel; } @@ -579,7 +604,7 @@ CUL_TCM97001_Parse($$) $name = $def->{NAME}; } if(!$def) { - Log3 $name, 2, "CUL_TCM97001 Unknown device $deviceCode, please define it"; + Log3 $name, 2, "$iodev: CUL_TCM97001 Unknown device $deviceCode, please define it"; return "UNDEFINED $model" . substr($deviceCode, rindex($deviceCode,"_")) . " CUL_TCM97001 $deviceCode"; } $packageOK = TRUE; @@ -666,7 +691,7 @@ CUL_TCM97001_Parse($$) } if(!$def) { - Log3 $name, 2, "CUL_TCM97001 Unknown device $deviceCode, please define it"; + Log3 $name, 2, "$iodev: CUL_TCM97001 Unknown device $deviceCode, please define it"; return "UNDEFINED $model" . substr($deviceCode, rindex($deviceCode,"_")) . " CUL_TCM97001 $deviceCode"; } @@ -707,7 +732,7 @@ CUL_TCM97001_Parse($$) # $name = $def->{NAME}; } $readedModel = AttrVal($name, "model", "Unknown"); - Log3 $name, 4, "CUL_TCM97001 Parse Name: $name , devicecode: $deviceCode , Model defined: $readedModel"; + Log3 $name, 4, "$iodev: CUL_TCM97001 Parse Name: $name , devicecode: $deviceCode , Model defined: $readedModel"; if (($readedModel eq "Eurochron" || (hex($a[6]) == 0xF && $readedModel eq "Unknown") && $syncBit[1] < 5000)) { # EAS 800 @@ -736,7 +761,7 @@ CUL_TCM97001_Parse($$) my $dmsg = "P7#" . substr($msg, 0, $l-2, 2); $hash->{RAWMSG} = $msg; my %addvals = (RAWMSG => $msg, DMSG => $dmsg); - Log3 $name, 5, "CUL_TCM97001 Dispatch $dmsg to other modul"; + Log3 $name, 5, "$iodev: CUL_TCM97001 Dispatch $dmsg to other modul"; Dispatch($hash, $dmsg, \%addvals); ## Dispatch to other Modules return ""; } @@ -763,7 +788,7 @@ CUL_TCM97001_Parse($$) { if ( $enableLongIDs == TRUE || (($longids != "0") && ($longids eq "1" || $longids eq "ALL" || (",$longids," =~ m/,$model,/)))) { - Log3 $hash,4, "CUL_TCM97001 using longid: $longids model: $model"; + Log3 $hash,4, "$iodev: CUL_TCM97001 using longid: $longids model: $model"; } else { $deviceCode="CUL_TCM97001_" . $model . "_" . $channel; } @@ -774,7 +799,7 @@ CUL_TCM97001_Parse($$) $name = $def->{NAME}; } if(!$def) { - Log3 $name, 2, "CUL_TCM97001 Unknown device $deviceCode, please define it"; + Log3 $name, 2, "$iodev: CUL_TCM97001 Unknown device $deviceCode, please define it"; return "UNDEFINED $model" . substr($deviceCode, rindex($deviceCode,"_")) . " CUL_TCM97001 $deviceCode"; } if (defined($humidity)) { @@ -821,18 +846,18 @@ CUL_TCM97001_Parse($$) } my $hexReverse = unpack("H*", pack ("B*", $bitReverse)); my @aReverse = split("", $hexReverse); # Split reversed a again - Log3 $hash,5, "CUL_TCM97001: $name original-msg: $msg , reversed nibbles: $hexReverse"; - Log3 $hash,5, "CUL_TCM97001: $name nibble 2: $aReverse[2] , nibble 3: $aReverse[3]"; + Log3 $hash,5, "$iodev: CUL_TCM97001 $name original-msg: $msg , reversed nibbles: $hexReverse"; + Log3 $hash,5, "$iodev: CUL_TCM97001 $name nibble 2: $aReverse[2] , nibble 3: $aReverse[3]"; # Nibble 2 must be x110 for rain gauge # Nibble 3 must be 0x03 for rain gauge if ((hex($aReverse[2]) >> 1) == 3 && $aReverse[3] == 0x03) { - Log3 $hash,4, "CUL_TCM97001: $name detected rain gauge message ok"; + Log3 $hash,4, "$iodev: CUL_TCM97001 $name detected rain gauge message ok"; $batbit = $aReverse[2] & 0b0001; # Bat bit normal=0, low=1 - Log3 $hash,4, "CUL_TCM97001: $name battery bit: $batbit"; + Log3 $hash,4, "$iodev: CUL_TCM97001 $name battery bit: $batbit"; $batbit = ~$batbit & 0x1; # Bat bit negation $hasbatcheck = TRUE; my $rainticks = hex($aReverse[4]) + hex($aReverse[5]) * 16 + hex($aReverse[6]) * 256 + hex($aReverse[7]) * 4096; - Log3 $hash,5, "CUL_TCM97001: $name rain gauge swing count: $rainticks"; + Log3 $hash,5, "$iodev: CUL_TCM97001 $name rain gauge swing count: $rainticks"; $rain = ($rainticks + ($rainticks & 1)) / 4; # 1 tick = 0,5 l/qm $model="W174"; $hasrain = TRUE; @@ -840,7 +865,10 @@ CUL_TCM97001_Parse($$) if($def) { $def = $modules{CUL_TCM97001}{defptr}{$deviceCode}; my $hash = $def; - my $timeSinceLastUpdate = ReadingsAge($hash->{NAME}, "state", 0); + my $timeSinceLastUpdate = ReadingsAge($iodev, "state", 0); + if ($timeSinceLastUpdate < 0) { + $timeSinceLastUpdate *= -1; + } $name = $def->{NAME}; if (defined($hash->{READINGS}{rain}{VAL})) { my $diffRain = 0; @@ -851,20 +879,20 @@ CUL_TCM97001_Parse($$) $diffRain = ($oldRain - $rain); } $diffRain = sprintf("%.1f", $diffRain); - Log3 $hash, 4, "CUL_TCM97001: $name old rain $oldRain, age $timeSinceLastUpdate, new rain $rain, diff rain $diffRain"; + Log3 $hash, 4, "$iodev: CUL_TCM97001 $name old rain $oldRain, age $timeSinceLastUpdate, new rain $rain, diff rain $diffRain"; my $maxDiffRain = $timeSinceLastUpdate / 60 + 1; # 1.0 Liter/Minute + 1.0 $maxDiffRain = sprintf("%.1f", $maxDiffRain + 0.05); # round 0.1 - Log3 $hash, 4, "CUL_TCM97001: $name max difference rain $maxDiffRain l"; + Log3 $hash, 4, "$iodev: CUL_TCM97001 $name max difference rain $maxDiffRain l"; if ($diffRain > $maxDiffRain) { - Log3 $hash, 3, "CUL_TCM97001: $name ERROR - Rain diff too large (old $oldRain, new $rain, diff $diffRain)"; + Log3 $hash, 3, "$iodev: CUL_TCM97001 $name ERROR - Rain diff too large (old $oldRain, new $rain, diff $diffRain)"; return ""; } } } else { - Log3 $name, 2, "CUL_TCM97001 Unknown device $deviceCode, please define it"; + Log3 $name, 2, "$iodev: CUL_TCM97001 Unknown device $deviceCode, please define it"; return "UNDEFINED $model" . substr($deviceCode, rindex($deviceCode,"_")) . " CUL_TCM97001 $deviceCode"; } - Log3 $hash,4, "CUL_TCM97001: $name rain total: $rain l/qm"; + Log3 $hash,4, "$iodev: CUL_TCM97001 $name rain total: $rain l/qm"; $readedModel=$model; $packageOK = TRUE; } @@ -941,19 +969,19 @@ CUL_TCM97001_Parse($$) #Split reversed a again my @aReverse = split("", $hexReverse); - Log3 $hash,4, "CUL_TCM97001 hex:$hexReverse msg:$msg aR:@aReverse "; + Log3 $hash,4, "$iodev: CUL_TCM97001 hex:$hexReverse msg:$msg aR:@aReverse "; # Message type (xyyz = temp/humidity if yy <> '11') else wind/rain sensor # Message type (xyyx = NON temp/humidity data if yy = '11') $msgtype = substr(sprintf( "%04b", hex( substr( $msg,2,1))),1,2); - Log3 $hash,4, "CUL_TCM97001 nib2:$msgtype aRev: $aReverse[2]"; + Log3 $hash,4, "$iodev: CUL_TCM97001 nib2:$msgtype aRev: $aReverse[2]"; $msgtype = substr(sprintf( "%04b", hex( $aReverse[2])),1,2); - Log3 $hash,4, "CUL_TCM97001 nib2R:$msgtype hexR: $hexReverse"; + Log3 $hash,4, "$iodev: CUL_TCM97001 nib2R:$msgtype hexR: $hexReverse"; if ( $msgtype ne "11") { - Log3 $hash,4, "CUL_TCM97001 Temp/Hum Msgype: $msgtype nib3:$aReverse[3] "; + Log3 $hash,4, "$iodev: CUL_TCM97001 Temp/Hum Msgype: $msgtype nib3:$aReverse[3] "; if (hex($aReverse[5]) > 3) { # negative temp @@ -970,12 +998,12 @@ CUL_TCM97001_Parse($$) } else { # Wind/Rain/Guest - Log3 $hash,4, "CUL_TCM97001 Wind/Rain/Guest Msgype: $msgtype nib3:$aReverse[3] "; + Log3 $hash,4, "$iodev: CUL_TCM97001 Wind/Rain/Guest Msgype: $msgtype nib3:$aReverse[3] "; # C = Fixed to 1000 0000 0000 Reverse 0001 0000 0000 if ((hex($aReverse[3])== 0x1) && (hex($aReverse[4])== 0x0)) { # Windspeed $windSpeed = hex($aReverse[6]) + hex($aReverse[7]); $haswindspeed = TRUE; - Log3 $hash,4, "CUL_TCM97001 windSpeed: $windSpeed "; + Log3 $hash,4, "$iodev: CUL_TCM97001 windSpeed: $windSpeed "; } if ((hex($aReverse[3])== 0xF)) { # Windguest Reverse @@ -983,18 +1011,18 @@ CUL_TCM97001_Parse($$) $windDirection = hex($aReverse[4]) + hex($aReverse[5]) ; $windDirectionText = $winddir_name[$windDirection]; $haswind = TRUE; - Log3 $hash,4, "CUL_TCM97001 windGuest: $windGuest "; + Log3 $hash,4, "$iodev: CUL_TCM97001 windGuest: $windGuest "; } if ((hex($aReverse[3])== 0x3)) { # Rain $rain = (hex($aReverse[4]) + hex($aReverse[5]) + hex($aReverse[6]) + hex($aReverse[7])) * 0.25; $hasrain = TRUE; - Log3 $hash,4, "CUL_TCM97001 rain: $rain "; + Log3 $hash,4, "$iodev: CUL_TCM97001 rain: $rain "; } } - #if (checkValues($temp, $humidity)) { - if (1) { + ### edited by @HomeAutoUser + if (checkValues($temp, $humidity) == TRUE) { # unplausibel Werte sonst teilweise $batbit = (hex($a[2]) & 0x8) >> 3; #$mode = (hex($a[2]) & 0x4) >> 2; $model="TCM21...."; @@ -1002,9 +1030,9 @@ CUL_TCM97001_Parse($$) { if ( $enableLongIDs == TRUE || (($longids != "0") && ($longids eq "1" || $longids eq "ALL" || (",$longids," =~ m/,$model,/)))) { - Log3 $hash,4, "CUL_TCM97001 using longid: $longids model: $model"; + Log3 $hash,4, "$iodev: CUL_TCM97001 using longid: $longids model: $model"; } else { - $deviceCode="CUL_TCM97001_" . $model . "_" . $channel; + $deviceCode="$iodev: CUL_TCM97001_" . $model . "_" . $channel; } } @@ -1013,7 +1041,7 @@ CUL_TCM97001_Parse($$) $name = $def->{NAME}; } if(!$def) { - Log3 $name, 2, "CUL_TCM97001 Unknown device $deviceCode, please define it"; + Log3 $name, 2, "$iodev: CUL_TCM97001 Unknown device $deviceCode, please define it"; return "UNDEFINED $model" . substr($deviceCode, rindex($deviceCode,"_")) . " CUL_TCM97001 $deviceCode"; } $packageOK = TRUE; @@ -1074,9 +1102,9 @@ CUL_TCM97001_Parse($$) { if ( $enableLongIDs == TRUE || (($longids != "0") && ($longids eq "1" || $longids eq "ALL" || (",$longids," =~ m/,$model,/)))) { - Log3 $hash,4, "CUL_TCM97001 using longid: $longids model: $model"; + Log3 $hash,4, "$iodev: CUL_TCM97001 using longid: $longids model: $model"; } else { - $deviceCode="CUL_TCM97001_" . $model . "_" . $channel; + $deviceCode="$iodev: CUL_TCM97001_" . $model . "_" . $channel; } } @@ -1085,7 +1113,7 @@ CUL_TCM97001_Parse($$) $name = $def->{NAME}; } if(!$def) { - Log3 $name, 2, "CUL_TCM97001 Unknown device $deviceCode, please define it"; + Log3 $name, 2, "$iodev: CUL_TCM97001 Unknown device $deviceCode, please define it"; return "UNDEFINED $model" . substr($deviceCode, rindex($deviceCode,"_")) . " CUL_TCM97001 $deviceCode"; } $hashumidity = TRUE; @@ -1142,7 +1170,7 @@ CUL_TCM97001_Parse($$) { if ( $enableLongIDs == TRUE || (($longids != "0") && ($longids eq "1" || $longids eq "ALL" || (",$longids," =~ m/,$model,/)))) { - Log3 $hash,4, "CUL_TCM97001 using longid: $longids model: $model"; + Log3 $hash,4, "$iodev: CUL_TCM97001 using longid: $longids model: $model"; } else { $deviceCode="CUL_TCM97001_" . $model . "_" . $channel; } @@ -1153,7 +1181,7 @@ CUL_TCM97001_Parse($$) $name = $def->{NAME}; } if(!$def) { - Log3 $name, 2, "CUL_TCM97001 Unknown device $deviceCode, please define it"; + Log3 $name, 2, "$iodev: CUL_TCM97001 Unknown device $deviceCode, please define it"; return "UNDEFINED $model" . substr($deviceCode, rindex($deviceCode,"_")) . " CUL_TCM97001 $deviceCode"; } if (defined($humidity)) { @@ -1210,7 +1238,7 @@ CUL_TCM97001_Parse($$) { if ( $enableLongIDs == TRUE || (($longids != "0") && ($longids eq "1" || $longids eq "ALL" || (",$longids," =~ m/,$model,/)))) { - Log3 $hash,4, "CUL_TCM97001 using longid: $longids model: $model"; + Log3 $hash,4, "$iodev: CUL_TCM97001 using longid: $longids model: $model"; } else { $deviceCode="CUL_TCM97001_" . $model . "_" . $channel; } @@ -1222,7 +1250,7 @@ CUL_TCM97001_Parse($$) } if(!$def) { - Log3 $name, 2, "CUL_TCM97001 Unknown device $deviceCode, please define it"; + Log3 $name, 2, "$iodev: CUL_TCM97001 Unknown device $deviceCode, please define it"; return "UNDEFINED $model" . substr($deviceCode, rindex($deviceCode,"_")) . " CUL_TCM97001 $deviceCode"; } $hashumidity = TRUE; @@ -1264,7 +1292,7 @@ CUL_TCM97001_Parse($$) { if ( $enableLongIDs == TRUE || (($longids != "0") && ($longids eq "1" || $longids eq "ALL" || (",$longids," =~ m/,$model,/)))) { - Log3 $hash,4, "CUL_TCM97001 using longid: $longids model: $model"; + Log3 $hash,4, "$iodev: CUL_TCM97001 using longid: $longids model: $model"; } else { $deviceCode="CUL_TCM97001_" . $model . "_" . $channel; } @@ -1276,7 +1304,7 @@ CUL_TCM97001_Parse($$) } if(!$def) { - Log3 $name, 2, "CUL_TCM97001 Unknown device $deviceCode, please define it"; + Log3 $name, 2, "$iodev: CUL_TCM97001 Unknown device $deviceCode, please define it"; return "UNDEFINED $model" . substr($deviceCode, rindex($deviceCode,"_")) . " CUL_TCM97001 $deviceCode"; } @@ -1313,13 +1341,13 @@ CUL_TCM97001_Parse($$) $temp = -$temp; } $temp = $temp / 10; - Log3 $name, 5, "CUL_TCM97001: PFR_130 Temp=$temp"; + Log3 $name, 5, "$iodev: CUL_TCM97001 PFR_130 Temp=$temp"; # rain values Pollin PFR_130 $rainticks = (hex($a[2].$a[6].$a[7])) & 0x3FF; #mask n2 n6 n7 for rain ticks - Log3 $name, 5, "CUL_TCM97001: PFR_130 rainticks=$rainticks"; + Log3 $name, 5, "$iodev: CUL_TCM97001 PFR_130 rainticks=$rainticks"; $rainMM = $rainticks / 25 * .5; # rain height in mm/qm, verified against sensor receiver display - Log3 $name, 5, "CUL_TCM97001: PFR_130 rain mm=$rainMM"; + Log3 $name, 5, "$iodev: CUL_TCM97001 PFR_130 rain mm=$rainMM"; if (checkValues($temp, 50)) { $batbit = (hex($a[2]) & 0x8) >> 3; # in auriol_protocol_v20.pdf bat bit is n2 & 0x08, same @@ -1335,7 +1363,7 @@ CUL_TCM97001_Parse($$) if ( $enableLongIDs == TRUE || (($longids != "0") && ($longids eq "1" || $longids eq "ALL" || (",$longids," =~ m/,$model,/)))) { $deviceCode="CUL_TCM97001_".$idType1; - Log3 $hash,4, "CUL_TCM97001 using longid: $longids model: $model"; + Log3 $hash,4, "$iodev: CUL_TCM97001 using longid: $longids model: $model"; } else { $deviceCode="CUL_TCM97001_" . $model . "_" . $channel; } @@ -1349,7 +1377,7 @@ CUL_TCM97001_Parse($$) } if(!$def) { - Log3 $name, 2, "CUL_TCM97001 Unknown device $deviceCode, please define it"; + Log3 $name, 2, "$iodev: CUL_TCM97001 Unknown device $deviceCode, please define it"; return "UNDEFINED $model" . substr($deviceCode, rindex($deviceCode,"_")) . " CUL_TCM97001 $deviceCode"; } @@ -1403,7 +1431,7 @@ CUL_TCM97001_Parse($$) if ( $enableLongIDs == TRUE || (($longids != "0") && ($longids eq "1" || $longids eq "ALL" || (",$longids," =~ m/,$model,/)))) { $deviceCode="CUL_TCM97001_".$idType1; - Log3 $hash,4, "CUL_TCM97001 using longid: $longids model: $model"; + Log3 $hash,4, "$iodev: CUL_TCM97001 using longid: $longids model: $model"; } else { $deviceCode="CUL_TCM97001_" . $model . "_" . $channel; } @@ -1417,7 +1445,7 @@ CUL_TCM97001_Parse($$) } if(!$def) { - Log3 $name, 2, "CUL_TCM97001 Unknown device $deviceCode, please define it"; + Log3 $name, 2, "$iodev: CUL_TCM97001 Unknown device $deviceCode, please define it"; return "UNDEFINED $model" . substr($deviceCode, rindex($deviceCode,"_")) . " CUL_TCM97001 $deviceCode"; } @@ -1461,10 +1489,10 @@ CUL_TCM97001_Parse($$) foreach $x (@a) { $bitReverse = $bitReverse . reverse(sprintf("%04b",hex($x))); } - Log3 $hash, 5 , "KW9010 CRC Matched: ($bitReverse)"; + Log3 $hash, 5 , "$iodev: KW9010 CRC Matched: ($bitReverse)"; my $hexReverse = unpack("H*", pack ("B*", $bitReverse)); - Log3 $hash, 5 , "KW9010 CRC Hex Matched: $hexReverse"; + Log3 $hash, 5 , "$iodev: KW9010 CRC Hex Matched: $hexReverse"; #Split reversed a again my @aReverse = split("", $hexReverse); @@ -1480,10 +1508,10 @@ CUL_TCM97001_Parse($$) } $humidity = hex($aReverse[7].$aReverse[6]) - 156; + ### edited by @HomeAutoUser + if (checkValues($temp, $humidity) == 1) { # unplausibel Werte sonst teilweise - #if (checkValues($temp, $humidity)) { - if (1) { - Log3 $hash, 5 , "KW9010 values are matching"; + Log3 $hash, 5 , "$iodev: KW9010 values are matching"; $batbit = (hex($a[2]) & 0x8) >> 3; #$mode = (hex($a[2]) & 0x4) >> 2; @@ -1497,7 +1525,7 @@ CUL_TCM97001_Parse($$) { if ( $enableLongIDs == TRUE || (($longids != "0") && ($longids eq "1" || $longids eq "ALL" || (",$longids," =~ m/,$model,/)))) { - Log3 $hash,4, "CUL_TCM97001 using longid: $longids model: $model"; + Log3 $hash,4, "$iodev: CUL_TCM97001 using longid: $longids model: $model"; } else { $deviceCode="CUL_TCM97001_" . $model . "_" . $channel; } @@ -1508,7 +1536,7 @@ CUL_TCM97001_Parse($$) $name = $def->{NAME}; } if(!$def) { - Log3 $name, 2, "CUL_TCM97001 Unknown device $deviceCode, please define it"; + Log3 $name, 2, "$iodev: CUL_TCM97001 Unknown device $deviceCode, please define it"; return "UNDEFINED $model" . substr($deviceCode, rindex($deviceCode,"_")) . " CUL_TCM97001 $deviceCode"; } $hashumidity = TRUE; @@ -1519,7 +1547,7 @@ CUL_TCM97001_Parse($$) $readedModel=$model; } else { - Log3 $hash, 5 , "KW9010 t:$temp / h:$humidity mismatch"; + Log3 $hash, 5 , "$iodev: KW9010 t:$temp / h:$humidity mismatch"; $name = "Unknown"; } @@ -1527,6 +1555,10 @@ CUL_TCM97001_Parse($$) } + # Ignoriere dieses Gerät. Das Gerät wird keine FileLogs/notifys triggern, empfangene Befehle + # werden stillschweigend ignoriert. Das Gerät wird weder in der Device-List angezeigt, + # noch wird es in Befehlen mit "Wildcard"-Namenspezifikation (siehe devspec) erscheinen. + return "" if(IsIgnored($name)); # wenn Attribut "ignore" gesetzt ist, werden alle Ausgaben ignoriert if ($packageOK == TRUE) { # save lastT, calc rainMM sum for day and hour @@ -1567,7 +1599,7 @@ CUL_TCM97001_Parse($$) $msgtype = "temperature"; $val = sprintf("%2.1f", ($temp) ); $state="T: $val"; - Log3 $name, 5, "CUL_TCM97001 1. $lastDay : $lastHour : $rainSumDay : $rainSumHour"; + Log3 $name, 5, "$iodev: CUL_TCM97001 1. $lastDay : $lastHour : $rainSumDay : $rainSumHour"; #rain Pollin PFR-130 if($mday==$lastDay){ #same day add rainMM @@ -1587,9 +1619,9 @@ CUL_TCM97001_Parse($$) readingsBulkUpdate($def, "RainD", $rainSumDay ); readingsBulkUpdate($def, "RainH", $rainSumHour ); - Log3 $name, 5, "CUL_TCM97001 2. $lastDay : $lastHour : $rainSumDay : $rainSumHour"; + Log3 $name, 5, "$iodev: CUL_TCM97001 2. $lastDay : $lastHour : $rainSumDay : $rainSumHour"; $state="$state RainH: $rainSumHour RainD: $rainSumDay R: $rainticks Rmm: $rainMM"; - Log3 $name, 5, "CUL_TCM97001 $msgtype $name $id3 state: $state"; + Log3 $name, 5, "$iodev: CUL_TCM97001 $msgtype $name $id3 state: $state"; } else { ### edited by elektron-bbs @@ -1649,10 +1681,10 @@ CUL_TCM97001_Parse($$) $msgtypeH = "humidity"; $valH = $humidity; $state="$state H: $valH"; - Log3 $name, 4, "CUL_TCM97001 $msgtype $name $id3 T: $val H: $valH"; + Log3 $name, 4, "$iodev: CUL_TCM97001 $msgtype $name $id3 T: $val H: $valH"; } else { $msgtype = "other"; - Log3 $name, 4, "CUL_TCM97001 $msgtype $name $id3"; + Log3 $name, 4, "$iodev: CUL_TCM97001 $msgtype $name $id3"; #Log3 $name, 4, "CUL_TCM97001 $msgtype $name $id3 "; } @@ -1719,11 +1751,11 @@ CUL_TCM97001_Parse($$) my $defUnknown = $modules{CUL_TCM97001}{defptr}{"CUL_TCM97001_Unknown"}; if (!$defUnknown) { - Log3 "Unknown", 2, "CUL_TCM97001 Unknown device Unknown, please define it"; + Log3 "Unknown", 2, "$iodev: CUL_TCM97001 Unknown device Unknown, please define it"; return "UNDEFINED Unknown CUL_TCM97001 CUL_TCM97001_Unknown"; } $name = $defUnknown->{NAME}; - Log3 $name, 4, "CUL_TCM97001 Device not implemented yet name Unknown msg $msg"; + Log3 $name, 4, "$iodev: CUL_TCM97001 Device not implemented yet name Unknown msg $msg"; my $rawlen = length($msg); my $rawVal = substr($msg, 0, $rawlen-2); @@ -1773,16 +1805,19 @@ CUL_TCM97001_Parse($$)
Supported models:
New received device packages are add in fhem category CUL_TCM97001 with autocreate. @@ -1814,7 +1849,8 @@ CUL_TCM97001_Parse($$)
  • do_not_notify
  • ignore
  • -
  • model (TCM97..., ABS700, TCM21...., Prologue, Rubicson, NC_WS, GT_WT_02, AURIOL, KW9010, Unknown)
  • +
  • model (ABS700, AURIOL, GT_WT_02, KW9010, NC_WS, PFR-130, Prologue, Rubicson, TCM21...., TCM97…, Unknown, W174)
  • +
  • max-deviation-temp: (default:1, allowed values: 1,2,3,4,5,6,7,8,9,10,15,20,25,30,35,40,45,50)
  • showtime
  • readingFnAttributes
  • @@ -1833,18 +1869,18 @@ CUL_TCM97001_Parse($$)
    Unterstütze Modelle:
    @@ -1878,6 +1914,8 @@ CUL_TCM97001_Parse($$)
  • do_not_notify
  • ignore
  • model (ABS700, AURIOL, GT_WT_02, KW9010, NC_WS, PFR-130, Prologue, Rubicson, TCM21...., TCM97…, Unknown, W174)
  • +
  • max-deviation-temp: (Default:1, erlaubte Werte: 1,2,3,4,5,6,7,8,9,10,15,20,25,30,35,40,45,50)
    + Maximal erlaubte Abweichung der gemessenen Temperatur zum vorhergehenden Wert in Kelvin.
  • showtime
  • readingFnAttributes