From 6b47caa429f4ce4f580a69a1ed89ff5e68b0837a Mon Sep 17 00:00:00 2001 From: rudolfkoenig <> Date: Sat, 11 Jul 2009 08:41:23 +0000 Subject: [PATCH] CUL/HMS changes git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@411 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- CHANGED | 1 + FHEM/00_CUL.pm | 28 +++++++++----- FHEM/12_HMS.pm | 100 ++++++++++++++++++++++--------------------------- 3 files changed, 64 insertions(+), 65 deletions(-) diff --git a/CHANGED b/CHANGED index ccdccabc6..8d01e8c0a 100644 --- a/CHANGED +++ b/CHANGED @@ -514,3 +514,4 @@ - =DATE= (4.7) - bugfix: Reattached corrupted CUL device caused uninitialized message + - bugfix: CUL/HMS changes, HMS cleanup diff --git a/FHEM/00_CUL.pm b/FHEM/00_CUL.pm index 2839c9ec8..ad5dc4764 100755 --- a/FHEM/00_CUL.pm +++ b/FHEM/00_CUL.pm @@ -167,10 +167,17 @@ sub CUL_Shutdown($) { my ($hash) = @_; - CUL_SimpleWrite($hash, "X00") if($hash->{VERSION} !~ m/CUR/); + CUL_SimpleWrite($hash, "X00") if(!CUL_isCUR($hash)); return undef; } +sub +CUL_isCUR($) +{ + my ($hash) = @_; + return ($hash->{VERSION} && $hash->{VERSION} =~ m/CUR/); +} + ##################################### sub @@ -258,8 +265,7 @@ GOTBW: } elsif($type eq "file") { - return "Only supported for CUR devices (see VERSION)" - if($hash->{VERSION} !~ m/CUR/); + return "Only supported for CUR devices (see VERSION)" if(!CUL_isCUR($hash)); return "$name: Need 2 further arguments: source destination" if(@a != 2); @@ -294,8 +300,7 @@ WRITEEND: } elsif($type eq "time") { - return "Only supported for CUR devices (see VERSION)" - if($hash->{VERSION} !~ m/CUR/); + return "Only supported for CUR devices (see VERSION)" if(!CUL_isCUR($hash)); my @a = localtime; my $msg = sprintf("c%02d%02d%02d", $a[2],$a[1],$a[0]); CUL_SimpleWrite($hash, $msg); @@ -347,8 +352,7 @@ CUL_Get($@) } elsif($a[1] eq "file") { - return "Only supported for CUR devices (see VERSION)" - if($hash->{VERSION} !~ m/CUR/); + return "Only supported for CUR devices (see VERSION)" if(!CUL_isCUR($hash)); CUL_Clear($hash); CUL_SimpleWrite($hash, "X00"); @@ -749,8 +753,14 @@ CUL_Read($) } elsif($fn eq "H" && $len >= 13) { # Reformat for 12_HMS.pm - $dmsg = sprintf("81%02x04xxxx5%sa001%s0000%s", - $len/2+8, substr($dmsg,6,1), substr($dmsg,1,4), substr($dmsg,5)); + my $type = hex(substr($dmsg,6,1)); + my $prf = $type > 1 ? "02" : "05"; + my $bat = $type > 1 ? hex(substr($dmsg,5,1))+1 : 1; + $dmsg = sprintf("81%02x04xx%s%x%xa001%s0000%s", + $len/2+8, # Packet-Length + $prf, $bat, $type, + substr($dmsg,1,4), # House-Code + substr($dmsg,5)); # Values $dmsg = lc($dmsg); } elsif($fn eq "K" && $len >= 5) { diff --git a/FHEM/12_HMS.pm b/FHEM/12_HMS.pm index f6eb9e7c9..b8c4f30ba 100755 --- a/FHEM/12_HMS.pm +++ b/FHEM/12_HMS.pm @@ -108,108 +108,98 @@ HMS_Parse($$) my $def = $defptr{$dev}; return "" if($def->{IODev} && $def->{IODev}{NAME} ne $hash->{NAME}); - my (@v, @txt, @sfx); + my (@v, @txt); + + # Used for HMS100TF & HMS100T + my $batstr1 = "ok"; + my $status1 = hex(substr($val, 0, 1)); + $batstr1 = "empty" if( $status1 & 2 ); + $batstr1 = "replaced" if( $status1 & 4 ); + + # Used for the other devices + my $batstr2 = "ok"; + my $status = hex(substr($val, 1, 1)); + my $status2 = hex(substr($msg, 10, 1)); + $batstr2 = "empty" if( $status2 & 4 ); + $batstr2 = "replaced" if( $status2 & 8 ); if($type eq "HMS100TF") { @txt = ( "temperature", "humidity", "battery"); - @sfx = ( "(Celsius)", "(%)", ""); # Codierung - my $status = hex(substr($val, 0, 1)); $v[0] = int(substr($val, 5, 1) . substr($val, 2, 2))/10; + $v[0] = -$v[0] if($status1 & 8); $v[1] = int(substr($val, 6, 2) . substr($val, 4, 1))/10; - $v[2] = "ok"; - if ( $status & 2 ) { $v[2] = "empty"; } - if ( $status & 4 ) { $v[2] = "replaced"; } - if ( $status & 8 ) { $v[0] = -$v[0]; } + $v[2] = $batstr1; $val = "T: $v[0] H: $v[1] Bat: $v[2]"; + $v[0] = "$v[0] (Celsius)"; + $v[1] = "$v[1] (%)"; } elsif ($type eq "HMS100T") { @txt = ( "temperature", "battery"); - @sfx = ( "(Celsius)", ""); - my $status = hex(substr($val, 0, 1)); $v[0] = int(substr($val, 5, 1) . substr($val, 2, 2))/10; - $v[1] = "ok"; - if ( $status & 2 ) { $v[1] = "empty"; } - if ( $status & 4 ) { $v[1] = "replaced"; } - if ( $status & 8 ) { $v[0] = -$v[0]; } + $v[0] = -$v[0] if($status1 & 8); + $v[1] = $batstr1; $val = "T: $v[0] Bat: $v[1]"; + $v[0] = "$v[0] (Celsius)"; } elsif ($type eq "HMS100WD") { @txt = ( "water_detect", "battery"); - @sfx = ( "", ""); - my $status = hex(substr($val, 1, 1)); - $v[0] = "off"; - if ( $status & 1 ) { $v[0] = "on"; } + + $v[0] = ($status ? "on" : "off"); + $v[1] = $batstr2; + $val = "Water Detect: $v[0]"; - $status = hex(substr($msg, 10, 1)); #Battery low condition - $v[1] = (($status & 4) ? "empty" : "ok"); # bit is set if Voltage < 2.5 V. } elsif ($type eq "HMS100TFK") { # By Peter P. @txt = ( "switch_detect", "battery"); - @sfx = ( "", ""); - my $status = hex(substr($val, 1, 1)); + $v[0] = ($status ? "on" : "off"); + $v[1] = $batstr2; + $val = "Switch Detect: $v[0]"; - $status = hex(substr($msg, 10, 1)); #Battery low condition - $v[1] = (($status & 4) ? "empty" : "ok"); # bit is set if Voltage < 2.5 V. } elsif($type eq "RM100-2") { @txt = ( "smoke_detect", "battery"); - @sfx = ( "", ""); - $v[0] = ( hex(substr($val, 1, 1)) != "0" ) ? "on" : "off"; - $v[1] = "ok"; - my $status = hex(substr($msg, 10, 1)); - if( $status & 4 ) { $v[1] = "empty"; } - if( $status & 8 ) { $v[1] = "replaced"; } + $v[0] = ($status ? "on" : "off"); + $v[1] = $batstr2; + $val = "smoke_detect: $v[0]"; } elsif ($type eq "HMS100MG") { # By Peter Stark @txt = ( "gas_detect", "battery"); - @sfx = ( "", ""); - # Battery-low condition detect is not yet properly - # implemented. - my $status = hex(substr($val, 1, 1)); - $v[0] = ($status != "0") ? "on" : "off"; - $v[1] = "off"; - if ($status & 1) { $v[0] = "on"; } + $v[0] = ($status ? "on" : "off"); + $v[1] = $batstr2; # Battery conditions not yet verified + $val = "Gas Detect: $v[0]"; } elsif ($type eq "HMS100CO") { # By PAN @txt = ( "gas_detect", "battery"); - @sfx = ( "", ""); - # Battery-low condition detect is not yet properly - # implemented. - my $status = hex(substr($val, 1, 1)); - $v[0] = ($status != "0") ? "on" : "off"; - $v[1] = "off"; - if ($status & 1) { $v[0] = "on"; } + $v[0] = ($status ? "on" : "off"); + $v[1] = $batstr2; # Battery conditions not yet verified + $val = "CO Detect: $v[0]"; } elsif ($type eq "HMS100FIT") { # By PAN @txt = ( "fi_triggered", "battery"); - @sfx = ( "", ""); - # Battery-low condition detect is not yet properly - # implemented. - my $status = hex(substr($val, 1, 1)); - $v[0] = ($status != "0") ? "on" : "off"; - $v[1] = "off"; - if ($status & 1) { $v[0] = "on"; } + $v[0] = ($status ? "on" : "off"); + $v[1] = $batstr2; # Battery conditions not yet verified + $val = "FI triggered: $v[0]"; } else { @@ -225,17 +215,15 @@ HMS_Parse($$) my $max = int(@txt); for( my $i = 0; $i < $max; $i++) { $def->{READINGS}{$txt[$i]}{TIME} = $now; - my $v = "$v[$i] $sfx[$i]"; - $def->{READINGS}{$txt[$i]}{VAL} = $v; - $def->{CHANGED}[$i] = "$txt[$i]: $v"; + $def->{READINGS}{$txt[$i]}{VAL} = $v[$i]; + $def->{CHANGED}[$i] = "$txt[$i]: $v[$i]"; } $def->{READINGS}{type}{TIME} = $now; $def->{READINGS}{type}{VAL} = $type; $def->{STATE} = $val; - $def->{CHANGED}[$max] = $val; - - $def->{CHANGED}[$max+1] = "ExactId: $odev" if($odev ne $dev); + $def->{CHANGED}[$max++] = $val; + $def->{CHANGED}[$max++] = "ExactId: $odev" if($odev ne $dev); return $def->{NAME}; }