From b6753d7a09d55330f4f2ddfffd03ec30977b65df Mon Sep 17 00:00:00 2001 From: borisneubert Date: Sun, 20 Sep 2009 17:08:33 +0000 Subject: [PATCH] - feature: Module 09_BS.pm for brightness sensor added (Boris 2009-09-20) git-svn-id: https://svn.fhem.de/fhem/trunk@439 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 1 + fhem/FHEM/00_FHZ.pm | 19 +++---- fhem/FHEM/09_BS.pm | 121 ++++++++++++++++++++++++++++++++++++++++++++ fhem/HISTORY | 3 ++ fhem/docs/BS.txt | 22 ++++++++ 5 files changed, 157 insertions(+), 9 deletions(-) create mode 100644 fhem/FHEM/09_BS.pm create mode 100644 fhem/docs/BS.txt diff --git a/fhem/CHANGED b/fhem/CHANGED index 19dcd1ab0..5f8699507 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -530,3 +530,4 @@ - feature: Pachube module from Axel - feature: dumpdef module from Axel in contrib - feature: javascripting support in FHEMWEB (Klaus/Axel) + - feature: Module 09_BS.pm for brightness sensor added (Boris 2009-09-20) diff --git a/fhem/FHEM/00_FHZ.pm b/fhem/FHEM/00_FHZ.pm index 0678b2e39..893a33c84 100755 --- a/fhem/FHEM/00_FHZ.pm +++ b/fhem/FHEM/00_FHZ.pm @@ -57,13 +57,14 @@ FHZ_Initialize($) # Provider $hash->{ReadFn} = "FHZ_Read"; $hash->{WriteFn} = "FHZ_Write"; - $hash->{Clients} = ":FHZ:FS20:FHT:HMS:KS300:USF1000:"; + $hash->{Clients} = ":FHZ:FS20:FHT:HMS:KS300:USF1000:BS:"; my %mc = ( - "1:USF1000" => "^810c04..0101a001a5ceaa00....", - "2:FS20" => "^81..(04|0c)..0101a001", - "3:FHT" => "^81..(04|09|0d)..(0909a001|83098301|c409c401)..", - "4:HMS" => "^810e04....(1|5|9).a001", - "5:KS300" => "^810d04..4027a001", + "1:USF1000" => "^81..(04|0c)..0101a001a5ceaa00....", + "2:BS" => "^81..(04|0c)..0101a001a5cf......", + "3:FS20" => "^81..(04|0c)..0101a001", + "4:FHT" => "^81..(04|09|0d)..(0909a001|83098301|c409c401)..", + "5:HMS" => "^810e04....(1|5|9).a001", + "6:KS300" => "^810d04..4027a001", ); $hash->{MatchList} = \%mc; $hash->{ReadyFn} = "FHZ_Ready"; @@ -449,7 +450,7 @@ FHZ_ReadAnswer($$$) if($^O =~ m/Win/) { $hash->{PortObj}->read_const_time($to*1000); # set timeout (ms) # Read anstatt input sonst funzt read_const_time nicht. - $buf = $hash->{PortObj}->read(999); + $buf = $hash->{PortObj}->read(999); return "Timeout reading answer for get $arg" if(length($buf) == 0); @@ -466,7 +467,7 @@ FHZ_ReadAnswer($$$) } - Log 5, "FHZ/RAW: " . unpack('H*',$buf); + Log 4, "FHZ/RAW: " . unpack('H*',$buf); $mfhzdata .= $buf; next if(length($mfhzdata) < 2); @@ -644,7 +645,7 @@ FHZ_Read($) my $fhzdata = $hash->{PARTIAL}; - Log 5, "FHZ/RAW: " . unpack('H*',$buf) . + Log 4, "FHZ/RAW: " . unpack('H*',$buf) . " (Unparsed: " . unpack('H*', $fhzdata) . ")"; $fhzdata .= $buf; diff --git a/fhem/FHEM/09_BS.pm b/fhem/FHEM/09_BS.pm new file mode 100644 index 000000000..a6c5b2372 --- /dev/null +++ b/fhem/FHEM/09_BS.pm @@ -0,0 +1,121 @@ +# +# +# 09_BS.pm +# written by Dr. Boris Neubert 2009-06-20 +# e-mail: omega at online dot de +# +############################################## +package main; + +use strict; +use warnings; + +my $PI= 3.141592653589793238; + +my %defptr; + +############################# +sub +BS_Initialize($) +{ + my ($hash) = @_; + + $hash->{Match} = "^81..(04|0c)..0101a001a5cf......"; + $hash->{DefFn} = "BS_Define"; + $hash->{UndefFn} = "BS_Undef"; + $hash->{ParseFn} = "BS_Parse"; + $hash->{AttrList} = "IODev do_not_notify:1,0 showtime:0,1 dummy:1,0 model:BSs loglevel:0,1,2,3,4,5,6"; + +} + + +############################# +sub +BS_Define($$) +{ + my ($hash, $def) = @_; + my @a = split("[ \t][ \t]*", $def); + + my $u= "wrong syntax: define BS [factor]"; + return $u if((int(@a)< 3) || (int(@a)>4)); + + my $name = $a[0]; + my $sensor = $a[2]; + if($sensor !~ /[1..9]/) { + return "erroneous sensor specification $sensor, use one of 1..9"; + } + $sensor= "0$sensor"; + + my $factor = 1.0; + $factor= $a[3] if(int(@a)==4); + $hash->{SENSOR}= "$sensor"; + $hash->{FACTOR}= $factor; + + my $dev= "a5cf $sensor"; + $hash->{DEF}= $dev; + + $defptr{$dev} = $hash; + AssignIoPort($hash); +} + +############################# +sub +BS_Undef($$) +{ + my ($hash, $name) = @_; + delete($defptr{$hash->{DEF}}); + return undef; +} + +############################# +sub +BS_Parse($$) +{ + my ($hash, $msg) = @_; # hash points to the FHZ, not to the BS + + + # Msg format: + # 01 23 45 67 8901 2345 6789 01 23 45 67 + # 81 0c 04 .. 0101 a001 a5cf xx 00 zz zz + + my $sensor= substr($msg, 20, 2); + my $dev= "a5cf $sensor"; + + my $def= $defptr{$dev}; + if(!defined($def)) { + Log 3, sprintf("BS Unknown device %s, please define it", $sensor); + return "UNDEFINED BS"; + } + + my $name= $def->{NAME}; + + return "" if($def->{IODev} && $def->{IODev}{NAME} ne $hash->{NAME}); + + my $t= TimeNow(); + + my $flags= hex(substr($msg, 24, 1)) & 0xdc; + my $value= hex(substr($msg, 25, 3)) & 0x3ff; + + my $factor= $def->{FACTOR}; + my $brightness= $value/10.24*$factor; + + my $state= sprintf("brightness: %.2f flags: %d", $brightness, $flags); + + $def->{CHANGED}[0] = $state; + $def->{STATE} = $state; + $def->{READINGS}{state}{TIME} = $t; + $def->{READINGS}{state}{VAL} = $state; + Log GetLogLevel($name, 4), "BS $name: $state"; + + $def->{READINGS}{brightness}{TIME} = $t; + $def->{READINGS}{brightness}{VAL} = $brightness; + $def->{READINGS}{flags}{TIME} = $t; + $def->{READINGS}{flags}{VAL} = $flags; + + return $name; + +} + +############################# + +1; diff --git a/fhem/HISTORY b/fhem/HISTORY index f304a1f95..12b16175f 100644 --- a/fhem/HISTORY +++ b/fhem/HISTORY @@ -423,3 +423,6 @@ - Sat Sep 12 2009 (Boris) - 00_CM11.pm: feature: get time, fwrev, set reopen for CM11 (Boris 2009-09-12) + +- Sun Sep 20 2009 (Boris) + - Module 09_BS.pm for brightness sensor added (Boris 2009-09-20) \ No newline at end of file diff --git a/fhem/docs/BS.txt b/fhem/docs/BS.txt new file mode 100644 index 000000000..3f42959ec --- /dev/null +++ b/fhem/docs/BS.txt @@ -0,0 +1,22 @@ +2009-09-12bn + +This document describes the protocol for the brightness sensor BS. + +Datagram is of FS20 sensor message type: +81 0c 04 ?? 01 01 a0 01 a5 cf xx 00 yy zz + +81: begin of FS20/FHT communication +0c: remaining length of datagram (12 bytes) +04: type of datagram +??: checksum +01 01 a0 01: FS20 fix sequence, always 01 01 a0 01 +a5 cf: FS20 housecode, always a5cf for brightness sensor BS +xx: sensor # +00: always 00 +yy zz: code, see below + +yy zz +76543210 76543210 + | ++ ++++++++----- 10 bit resolution brightness value (0..1023) + | + +------------------- 0x20 always 1 (= value byte follows)