From df95e3a84b066a6fb3741111bbe6eb4013b887fb Mon Sep 17 00:00:00 2001 From: dancer0705 Date: Sat, 4 Apr 2015 15:36:55 +0000 Subject: [PATCH] 14_CUL_TCM97001: Add support for ABS700, NC_WS, GT-WT-02 and AURIOL sensors git-svn-id: svn://svn.code.sf.net/p/fhem/code/trunk@8370 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 1 + fhem/FHEM/14_CUL_TCM97001.pm | 659 +++++++++++++++++++++++------------ 2 files changed, 444 insertions(+), 216 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index 37b83475a..4edf1c1fb 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,6 @@ # 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: Add support for ABS700, NC_WS, GT-WT-02 and AURIOL sensors - added: New modue 38_JawboneUp: Fitness and sleep statistics in FHEM - change: FB_CALLMONITOR: use cache first for reverse search - feature: 14_CUL_TCM97001: Add receiving for GT-WT-.. and Rubicson sensors diff --git a/fhem/FHEM/14_CUL_TCM97001.pm b/fhem/FHEM/14_CUL_TCM97001.pm index 25777d687..214ad0743 100755 --- a/fhem/FHEM/14_CUL_TCM97001.pm +++ b/fhem/FHEM/14_CUL_TCM97001.pm @@ -1,6 +1,18 @@ ############################################## # From dancer0705 -# Receive TCM 97xxx, TCM 21xxxx, GT-WT-xx and Rubicson like temperature sensor +# +# Receive temperature sensor +# Supported models: +# - "TCM97..." +# - "ABS700" +# - "TCM21...." +# - "Prologue" +# - "Rubicson" +# - "NC_WS" +# - "GT-WT-02" +# - "AURIOL" +# +# Unsupported models are saved in an device named CUL_TCM97001_Unknown # # Copyright (C) 2015 Bjoern Hempel # @@ -20,24 +32,29 @@ # 51 Franklin St, Fifth Floor, Boston, MA 02110, USA # ############################################## -# $Id: 14_CUL_TCM97001.pm 8286 2015-03-25 20:47:59Z dancer0705 $ package main; - use strict; use warnings; use SetExtensions; use constant { TRUE => 1, FALSE => 0 }; +# +# All suported models +# my %models = ( "TCM97..." => 'TCM97...', + "ABS700" => 'ABS700', "TCM21...." => 'TCM21....', "Prologue" => 'Prologue', "Rubicson" => 'Rubicson', - "Unknown" => 'Unknown', + "NC_WS" => 'NC_WS', + "GT-WT-02" => 'GT-WT-02', + "AURIOL" => 'AURIOL', + "Unknown" => 'Unknown', ); sub @@ -88,6 +105,9 @@ CUL_TCM97001_Undef($$) return undef; } +# +# CRC Check for TCM 21.... +# sub checkCRC { my $msg = shift; my @a = split("", $msg); @@ -110,6 +130,33 @@ sub checkCRC { return FALSE; } +# +# CRC Check for GT-WT-02 +# +sub checkCRC_GTWT02 { + my $msg = shift; + 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])) -1; + my $CRCCHECKVAL= (hex($a[7].$a[8].$a[9]) & 0x1F8) >> 3; + if ($CRC == $CRCCHECKVAL) { + return TRUE; + } + return FALSE; +} + +sub checkValues { + my $temp = shift; + my $humidy = shift; + + if ($temp < 60 && $temp > -30 + && $humidy > 0 && $humidy < 100) { + return TRUE; + } + return FALSE; +} + ################################### sub CUL_TCM97001_Parse($$) @@ -135,6 +182,8 @@ CUL_TCM97001_Parse($$) } elsif($defUnknown) { $name = $defUnknown->{NAME}; } + + my $readedModel = AttrVal($name, "model", "Unknown"); my $rssi; my $l = length($msg); @@ -143,105 +192,162 @@ CUL_TCM97001_Parse($$) Log3 $name, 4, "CUL_TCM97001 $name $id3 or $id4 ($msg) length:" . length($msg) . " RSSI: $rssi"; - my ($msgtype, $msgtypeH, $val, $valH); - + my ($msgtype, $msgtypeH); + my $packageOK = FALSE; - my $state=""; + my $batbit=undef; my $mode=undef; + my $trend=undef; my $hashumidity = FALSE; my $hasbatcheck = FALSE; + my $hastrend = FALSE; my $model="Unknown"; - + my $temp = undef; + my $humidity=undef; + if (length($msg) == 8) { # Only tmp TCM device #eg. 1000 1111 0100 0011 0110 1000 = 21.8C #eg. --> shift2 0100 0011 0110 10 - my $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; - + my $tcm97id = hex($a[0] . $a[1]); + $def = $modules{CUL_TCM97001}{defptr}{$tcm97id}; if($def) { - $def->{lastT} = $now; - } - $msgtype = "temperature"; - $val = sprintf("%2.1f", ($temp) ); - Log3 $name, 4, "CUL_TCM97001 $msgtype $name $id3 T: $val"; - - - # I think bit 3 on byte 3 is battery warning - $batbit = (hex($a[2]) >> 0) & 0x4; - - $mode = (hex($a[5]) >> 0) & 0x1; - - my $unknown = (hex($a[4]) >> 0) & 0x2; - my $t = ReadingsVal($name, "temperature", undef); - - if(defined($t)) { - $state="T: $t"; + $name = $def->{NAME}; } + $readedModel = AttrVal($name, "model", "Unknown"); - 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 $debug = "TEMP:$val°C BATT:"; - if ($batbit) { - $debug = $debug . "empty"; - } else { - $debug = $debug . "OK"; - } - $debug = $debug . " HEX:0x"; - $debug = $debug . $a[0].$a[1].$a[2].$a[3].$a[4].$a[5]; - $debug = $debug . " BIN:"; + if ($readedModel eq "Unknown" || $readedModel eq "TCM97...") { + $def = $modules{CUL_TCM97001}{defptr}{$tcm97id}; + if($def) { + $name = $def->{NAME}; + } - my @list = unpack("(A4)*", unpack ('B*', pack ('H*',$a[0].$a[1].$a[2].$a[3].$a[4].$a[5]))); - my $string = join(" ", @list); - $debug = $debug . $string; - Log3 $name, 5, "CUL_TCM97001 DEBUG: $debug"; + $temp = (hex($a[3].$a[4].$a[5]) >> 2) & 0xFFFF; + my $negative = (hex($a[2]) >> 0) & 0x3; - $packageOK = TRUE; - $hasbatcheck = TRUE; - $model="TCM97..."; + if ($negative == 0x3) { + $temp = (~$temp & 0x03FF) + 1; + $temp = -$temp; + } + + $temp = $temp / 10; + + # I think bit 3 on byte 3 is battery warning + $batbit = (hex($a[2]) >> 0) & 0x4; + + $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"; + } + + if (checkValues($temp, 50)) { + if(!$def) { + Log3 $name, 2, "CUL_TCM97001 Unknown device $tcm97id, please define it"; + return "UNDEFINED CUL_TCM97001_$tcm97id CUL_TCM97001 $tcm97id" if(!$def); + } + $packageOK = TRUE; + $hasbatcheck = TRUE; + $model="TCM97..."; + $readedModel=$model; + } + } + if ($readedModel eq "Unknown" || $readedModel eq "ABS700") { + $def = $modules{CUL_TCM97001}{defptr}{$tcm97id}; + if($def) { + $name = $def->{NAME}; + } + + + $temp = (hex($a[2].$a[3]) & 0x7F)+(hex($a[5])/10); + if ((hex($a[2]) & 0x8) == 0x8) { + $temp = -$temp; + } + $batbit = ((hex($a[4]) & 0x8) != 0x8); + + if (checkValues($temp, 50)) { + if(!$def) { + Log3 $name, 2, "CUL_TCM97001 Unknown device $tcm97id, please define it"; + return "UNDEFINED CUL_TCM97001_$tcm97id CUL_TCM97001 $tcm97id" if(!$def); + } + $hasbatcheck = TRUE; + $packageOK = TRUE; + $model="ABS700"; + $readedModel=$model; + } + } } elsif (length($msg) == 12) { - # Long with tmp - # All nibbles must be reversed - # e.g. 154E800480 0001 0101 0100 1110 1000 0000 0000 0100 1000 0000 - # A B C D E F G H I - # A+B = Addess - # C Bit 1 Battery - # D+E+F Temp - # G+H Hum my $bin = undef; - $hashumidity = TRUE; - my $readedModel = AttrVal($name, "model", undef); + my $idType1 = hex($a[0] . $a[1]); + my $idType2 = hex($a[0] . $a[1] . $a[2]); + my $idType3 = hex($a[0] . $a[1] . $a[2] . (hex($a[3]) & 0x3)); + + $def = $modules{CUL_TCM97001}{defptr}{$idType1}; + my $def2 = $modules{CUL_TCM97001}{defptr}{$idType2}; + my $def3 = $modules{CUL_TCM97001}{defptr}{$idType3}; + if($def) { + $name = $def->{NAME}; + } elsif($def2) { + $def = $def2; + $name = $def->{NAME}; + } elsif($def3) { + $def = $def3; + $name = $def->{NAME}; + } + $readedModel = AttrVal($name, "model", "Unknown"); + Log3 $name, 4, "CUL_TCM97001 Define Name: $name Model defined: $readedModel"; + + if (checkCRC($msg) == TRUE && ($readedModel eq "Unknown" || $readedModel eq "TCM21....")) { + # Long with tmp + # All nibbles must be reversed + # e.g. 154E800480 0001 0101 0100 1110 1000 0000 0000 0100 1000 0000 + # A B C D E F G H I + # A+B = Addess + # C Bit 1 Battery + # D+E+F Temp + # G+H Hum + $def = $modules{CUL_TCM97001}{defptr}{$idType1}; + if($def) { + $name = $def->{NAME}; + } + my $bin = undef; + my $bin1= undef; + $bin1=sprintf("%024b",hex(substr($msg,0,length($msg)-8))); + while (length($bin1) < (length($msg)-8)*4) { + # suffix 0 + $bin1 = '0'.$bin1; + } + $bin1=substr($bin1,((length($msg)-8)*8)); + my $bin2=sprintf("%024b",hex(substr($msg,length($msg)-8,length($msg)-1))); + while (length($bin2) < 32) { + # suffix 0 + $bin2 = '0'.$bin2; + } + $bin = $bin1 . $bin2; - if (checkCRC($msg) == TRUE && (!$readedModel || $readedModel eq "TCM21....")) { - Log3 $name, 5, "CUL_TCM97001: CRC OK"; my @a = split("", $msg); my $bitReverse = undef; my $x = undef; foreach $x (@a) { - my $bin3=sprintf("%04b",hex($x)); - $bitReverse = $bitReverse . reverse($bin3); + my $bin3=sprintf("%024b",hex($x)); + $bitReverse = $bitReverse . substr(reverse($bin3),0,4); } my $hexReverse = unpack("H*", pack ("B*", $bitReverse)); #Split reversed a again my @aReverse = split("", $hexReverse); - my $temp = undef; + + 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; + if (hex($aReverse[5]) > 3) { # negative temp $temp = ((-hex($aReverse[3]) + -hex($aReverse[4]) * 16 + -hex($aReverse[5]) * 256)+1+4096)/10; @@ -250,157 +356,278 @@ CUL_TCM97001_Parse($$) $temp = (hex($aReverse[3]) + hex($aReverse[4]) * 16 + hex($aReverse[5]) * 256)/10; } - if($def) { - $def->{lastT} = $now; - } - my $humidity = hex($aReverse[7]).hex($aReverse[6]); + $humidity = hex($aReverse[7]).hex($aReverse[6]); - $msgtypeH = "humidity"; - $valH = $humidity; + $batbit = (hex($a[2]) & 0x8) >> 3; - $msgtype = "temperature"; - $val = sprintf("%2.1f", ($temp) ); - - Log3 $name, 4, "CUL_TCM97001 $msgtype $name $id3 T: $val H: $humidity"; - - my $t = ReadingsVal($name, "temperature", undef); - my $h = ReadingsVal($name, "humidity", undef); - if(defined($t) && defined($h)) { - $state="T: $t H: $h"; - - } elsif(defined($t)) { - $state="T: $t"; - } elsif(defined($h)) { - $state="H: $h"; - } - - $batbit = hex($aReverse[2]) & 1; - $mode = (hex($aReverse[2]) & 8) >> 3; - - if ($mode) { - Log3 $name, 5, "CUL_TCM97001 Mode: manual triggert"; - } else { - Log3 $name, 5, "CUL_TCM97001 Mode: auto triggert"; - } - my $debug = "TEMP:$val°C HUM:$humidity :BATT:"; - if ($batbit) { - $debug = $debug . "empty"; - } else { - $debug = $debug . "OK"; - } - $debug = $debug . " HEX:0x"; - $debug = $debug . $hexReverse; - $debug = $debug . " BIN:$bitReverse"; - Log3 $name, 5, "CUL_TCM97001 DEBUG: $debug"; - - $packageOK = TRUE; - $hasbatcheck = TRUE; - $model="TCM21...."; - } else { - Log3 $name, 4, "CUL_TCM97001: CRC for TCM21.... Failed, checking other protocolls"; - # Check for Prologue - if (hex($a[0]) == 0x9) { - $model="Prologue"; - # Protocol prologue start everytime with 1001 - # e.g. 91080F614C 1001 0001 0000 1000 0000 1111 0110 0001 0100 1100 - # A B C D E F G H I - # A = Startbit 1001 - # B+C = Random Address - # D Bit 4 Battery, 3 Manual, 2+1 Channel - # E+F+G Bit 15+16 negativ temp, 14-0 temp - # H+I Hum - - my $temp = (hex($a[4].$a[5].$a[6])) & 0x3FFF; - my $negative = (hex($a[4])) & 0xC; - - if ($negative == 0xC) { - $temp = (~$temp & 0x03FF) + 1; - $temp = -$temp; + if (checkValues($temp, $humidity)) { + if(!$def) { + Log3 $name, 2, "CUL_TCM97001 Unknown device $idType1, please define it"; + return "UNDEFINED CUL_TCM97001_$idType1 CUL_TCM97001 $idType1" if(!$def); } - $temp = $temp / 10; - - if($def2) { - $def2->{lastT} = $now; - } - $msgtype = "temperature"; - $val = sprintf("%2.1f", ($temp) ); - - my $humidity=undef; - if (hex($a[7]) != 0xC && hex($a[8]) != 0xC) { - $hashumidity = TRUE; - $humidity = hex($a[7].$a[8]); - - $msgtypeH = "humidity"; - $valH = $humidity; - } - - Log3 $name, 4, "CUL_TCM97001 $msgtype $name $id4 T: $val H: $humidity"; - - my $t = ReadingsVal($name, "temperature", undef); - my $h = ReadingsVal($name, "humidity", undef); - if(defined($t) && defined($h)) { - $state="T: $t H: $h"; - } elsif(defined($t)) { - $state="T: $t"; - } elsif(defined($h)) { - $state="H: $h"; - } - - $batbit = (hex($a[3]) & 0x8) >> 3; - $mode = (hex($a[2]) & 0x4) >> 2; + $hashumidity = TRUE; + $packageOK = TRUE; $hasbatcheck = TRUE; - $packageOK = TRUE; - } elsif (hex($a[2]) == 0x8) { - $model="Rubicson"; - # Protocol Rubicson has as nibble C every time 1000 - # e.g. F4806B8E14 1111 0100 1000 0000 0110 1011 1000 1110 0001 0100 - # A B C D E F G H I - # A+B = Random Address - # C = Rubicson = 1000 - # D+E+F 12 bit temp - # G+H+I Unknown - my $temp = (hex($a[3].$a[4].$a[5])) & 0x3FFF; - my $negative = (hex($a[3])) & 0xC; + $model="TCM21...."; + $readedModel=$model; + } else { + $def = undef; + $name = "Unknown"; + } + } - if ($negative == 0xC) { - $temp = (~$temp & 0x03FF) + 1; - $temp = -$temp; - } - $temp = $temp / 10; + if (checkCRC_GTWT02($msg) == TRUE && ($readedModel eq "GT-WT-02" || $readedModel eq "Unknown")) { + # F F 0 0 F 9 5 5 F + # 1111 1111 0000 0000 1111 1001 0101 0101 1111 + # A B C D E F G H I + # A+B = Zufällige Code wechelt beim Batteriewechsel + # C Bit 4 Battery, 3 Manual, 2+1 Channel + # D+E+F Temperatur, wenn es negativ wird muss man negieren und dann 1 addieren, wie im ersten Post beschrieben. + # G+H Hum - bit 0-7 + # I CRC? + $def = $modules{CUL_TCM97001}{defptr}{$idType3}; + if($def) { + $name = $def->{NAME}; + } + $temp = (hex($a[3].$a[4].$a[5])) & 0x3FF; + my $negative = (hex($a[3])) & 0xC; + if ($negative == 0xC) { + $temp = (~$temp & 0x03FF) + 1; + $temp = -$temp; + } + $temp = $temp / 10; + $humidity = (hex($a[6].$a[7]) & 0x0FE) >> 1; # only the first 7 bits are the humidity - if($def) { - $def->{lastT} = $now; - } - $msgtype = "temperature"; - $val = sprintf("%2.1f", ($temp) ); - - Log3 $name, 4, "CUL_TCM97001 $msgtype $name $id3 T: $val"; - my $t = ReadingsVal($name, "temperature", undef); - - if(defined($t)) { - $state="T: $t"; - } - $packageOK = TRUE; + if (checkValues($temp, $humidity)) { + if(!$def) { + Log3 $name, 2, "CUL_TCM97001 Unknown device $idType3, please define it"; + return "UNDEFINED CUL_TCM97001_$idType3 CUL_TCM97001 $idType3" if(!$def); + } + $hashumidity = TRUE; + $hasbatcheck = TRUE; + $packageOK = TRUE; + $model="GT-WT-02"; + $readedModel=$model; + } else { + $def = undef; + $name = "Unknown"; } } + #Log3 $name, 4, "CUL_TCM97001: CRC for TCM21.... Failed, checking other protocolls"; + # Check for Prologue + if ($readedModel eq "Prologue" || (hex($a[0]) == 0x9 && $readedModel eq "Unknown")) { + # Log3 $name, 2, "ccccccccccccccccccccccccccccc"; + # Protocol prologue start everytime with 1001 + # e.g. 91080F614C 1001 0001 0000 1000 0000 1111 0110 0001 0100 1100 + # A B C D E F G H I + # A = Startbit 1001 + # B+C = Random Address + # D Bit 4 Battery, 3 Manual, 2+1 Channel + # E+F+G Bit 15+16 negativ temp, 14-0 temp + # H+I Hum + $def = $modules{CUL_TCM97001}{defptr}{$idType3}; + if($def) { + $name = $def->{NAME}; + } + $temp = (hex($a[4].$a[5].$a[6])) & 0x3FFF; + my $negative = (hex($a[4])) & 0xC; + + if ($negative == 0xC) { + $temp = (~$temp & 0x03FF) + 1; + $temp = -$temp; + } + $temp = $temp / 10; + + if (hex($a[7]) != 0xC && hex($a[8]) != 0xC) { + $hashumidity = TRUE; + $humidity = hex($a[7].$a[8]); + } + + + $batbit = (hex($a[3]) & 0x8) >> 3; + $mode = (hex($a[3]) & 0x4) >> 2; + if (checkValues($temp, $humidity)) { + if(!$def) { + Log3 $name, 2, "CUL_TCM97001 Unknown device $idType3, please define it"; + return "UNDEFINED CUL_TCM97001_$idType3 CUL_TCM97001 $idType3" if(!$def); + } + $hashumidity = TRUE; + $hasbatcheck = TRUE; + $packageOK = TRUE; + $model="Prologue"; + $readedModel=$model; + } else { + $def = undef; + $name = "Unknown"; + } + } + + if ($readedModel eq "NC_WS" || (hex($a[0]) == 0x5 && $readedModel eq "Unknown")) { + # Implementation from Femduino + # PEARL NC7159, LogiLink WS0002 + # /--------------------------------- Sensdortype + # / / ---------------------------- ID, changes after every battery change + # / / /--------------------- Battery state 0 == Ok + # / / / / ------------------ forced send + # / / / / / ---------------- Channel (0..2) + # / / / / / / -------------- neg Temp: if 1 then temp = temp - 2048 + # / / / / / / / ----------- Temp + # / / / / / / / /-- unknown + # / / / / / / / / / Humidity + # 0101 0010 1001 0 0 00 0 010 0011 0000 1 101 1101 + # Bit 0 4 12 13 14 16 17 28 29 36 + $def = $modules{CUL_TCM97001}{defptr}{$idType3}; + if($def) { + $name = $def->{NAME}; + } + $temp = (hex($a[4].$a[5].$a[6])) & 0x7FFF; + my $negative = (hex($a[4])) & 0x8; + + if ($negative == 0x8) { + $temp = (~$temp & 0x07FF) + 1; + $temp = -$temp; + } + $temp = $temp / 10; + + $hashumidity = TRUE; + $humidity = hex($a[7].$a[8]) & 0x7F; + + $batbit = (hex($a[3]) & 0x8) >> 3; + $batbit = ~$batbit & 0x1; # Bat bit umdrehen + $mode = (hex($a[3]) & 0x4) >> 2; + if (checkValues($temp, $humidity)) { + if(!$def) { + Log3 $name, 2, "CUL_TCM97001 Unknown device $idType3, please define it"; + return "UNDEFINED CUL_TCM97001_$idType3 CUL_TCM97001 $idType3" if(!$def); + } + $hashumidity = TRUE; + $hasbatcheck = TRUE; + $packageOK = TRUE; + $model="NC_WS"; + $readedModel=$model; + } else { + $def = undef; + $name = "Unknown"; + } + } + + if ($readedModel eq "Rubicson" || (hex($a[2]) == 0x8 && $readedModel eq "Unknown")) { + # Protocol Rubicson has as nibble C every time 1000 + # e.g. F4806B8E14 1111 0100 1000 0000 0110 1011 1000 1110 0001 0100 + # A B C D E F G H I + # A+B = Random Address + # C = Rubicson = 1000 + # D+E+F 12 bit temp + # G+H+I Unknown + $def = $modules{CUL_TCM97001}{defptr}{$idType1}; + if($def) { + $name = $def->{NAME}; + } + $temp = (hex($a[3].$a[4].$a[5])) & 0x3FF; + my $negative = (hex($a[3])) & 0xC; + + if ($negative == 0xC) { + $temp = (~$temp & 0x03FF) + 1; + $temp = -$temp; + } + $temp = $temp / 10; + + if (checkValues($temp, $humidity)) { + if(!$def) { + Log3 $name, 2, "CUL_TCM97001 Unknown device $idType1, please define it"; + return "UNDEFINED CUL_TCM97001_$idType1 CUL_TCM97001 $idType1" if(!$def); + } + $packageOK = TRUE; + $model="Rubicson"; + $readedModel=$model; + } else { + $def = undef; + $name = "Unknown"; + } + } + + if (($readedModel eq "AURIOL" || $readedModel eq "Unknown")) { + # Implementation from Femduino + # AURIOL (Lidl Version: 09/2013) + # /--------------------------------- Channel, changes after every battery change + # / / ------------------------ Battery state 1 == Ok + # / / /------------------------ Battery changed, Sync startet + # / / / ----------------------- Unknown + # / / / / /--------------------- neg Temp: if 1 then temp = temp - 4096 + # / / / / /---------------------- 12 Bit Temperature + # / / / / / /---------- ??? CRC + # / / / / / / /---- Trend 10 == rising, 01 == falling + # 0101 0101 1 0 00 0001 0000 1011 1100 01 00 + # Bit 0 8 9 10 12 24 30 + $def = $modules{CUL_TCM97001}{defptr}{$idType1}; + if($def) { + $name = $def->{NAME}; + } + $temp = (hex($a[3].$a[4].$a[5])) & 0x7FF; + my $negative = (hex($a[3])) & 0x8; + if ($negative == 0x8) { + $temp = (~$temp & 0x07FF) + 1; + $temp = -$temp; + } + $temp = $temp / 10; + + $batbit = (hex($a[3]) & 0x8) >> 3; + $batbit = ~$batbit & 0x1; # Bat bit umdrehen + + $trend = (hex($a[7]) & 0x3); + if (checkValues($temp, 50)) { + if(!$def) { + Log3 $name, 2, "CUL_TCM97001 Unknown device $idType1, please define it"; + return "UNDEFINED CUL_TCM97001_$idType1 CUL_TCM97001 $idType1" if(!$def); + } + $hasbatcheck = TRUE; + $hastrend = TRUE; + $packageOK = TRUE; + $model="AURIOL"; + $readedModel=$model; + } else { + $def = undef; + $name = "Unknown"; + } + } + } if ($packageOK == TRUE) { - if(!$def && !$def2) { - if ($model eq "Prologue") { - Log3 $name, 2, "CUL_TCM97001 Unknown device $id4, please define it"; - return "UNDEFINED CUL_TCM97001_$id4 CUL_TCM97001 $id4" if(!$def2); - } else { - Log3 $name, 2, "CUL_TCM97001 Unknown device $id3, please define it"; - return "UNDEFINED CUL_TCM97001_$id3 CUL_TCM97001 $id3" if(!$def); - } + if($def) { + $def->{lastT} = $now; + } + my ($val, $valH, $state); + $msgtype = "temperature"; + $val = sprintf("%2.1f", ($temp) ); + if ($hashumidity == TRUE) { + $msgtypeH = "humidity"; + $valH = $humidity; + Log3 $name, 4, "CUL_TCM97001 $msgtype $name $id4 T: $val H: $valH"; + } else { + Log3 $name, 4, "CUL_TCM97001 $msgtype $name $id3 T: $val"; } - if ($model eq "Prologue") { - $def = $def2; + #Log3 $name, 2, "xxxxxxxx $model ......... $name .......... $val .... $valH ... $def"; + my $t = ReadingsVal($name, "temperature", undef); + my $h = ReadingsVal($name, "humidity", undef); + if(defined($t) && defined($h)) { + $state="T: $t H: $h"; + } elsif(defined($t)) { + $state="T: $t"; + } elsif(defined($h)) { + $state="H: $h"; } + readingsBeginUpdate($def); readingsBulkUpdate($def, "state", $state); - $attr{$name}{model} = $model; + + if($hastrend) { + if ($trend == 1) { + readingsBulkUpdate($def, "trend", "falling"); + } else { + readingsBulkUpdate($def, "trend", "rising"); + } + } if ($hasbatcheck) { if ($batbit) { readingsBulkUpdate($def, "battery", "low"); @@ -415,17 +642,17 @@ CUL_TCM97001_Parse($$) readingsEndUpdate($def, 1); if(defined($rssi)) { $def->{RSSI} = $rssi; - #$addvals{RSSI} = $rssi; } + $attr{$name}{model} = $model; return $name; } else { Log3 $name, 4, "CUL_TCM97001 Device not interplmeted yet name $name msg $msg"; if (!$defUnknown) { - Log3 $name, 2, "CUL_TCM97001 Unknown device $name, please define it"; - return "UNDEFINED CUL_TCM97001_$name CUL_TCM97001 $name" if(!$defUnknown); + Log3 "Unknown", 2, "CUL_TCM97001 Unknown device Unknown, please define it"; + return "UNDEFINED CUL_TCM97001_Unknown CUL_TCM97001 Unknown" if(!$defUnknown); } - $state="Code: $msg"; + my $state="Code: $msg"; if ($defUnknown) { $defUnknown->{lastT} = $now;