From 22c39b8671d669bb92c43e18697d16e696a21845 Mon Sep 17 00:00:00 2001 From: justme-1968 Date: Fri, 14 Nov 2014 17:58:41 +0000 Subject: [PATCH] 10_IT.pm: parse received it messages by bjoernh. forum: http://forum.fhem.de/index.php/topic,14348 git-svn-id: https://svn.fhem.de/fhem/trunk@6969 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 1 + fhem/FHEM/10_IT.pm | 59 +++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 57 insertions(+), 3 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index 2a054d8fb..a71e315ea 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. + - feature: 10_IT empfang (by bjoernh) - bugfix: PRESENCE: fix race condition, when delete disabled attribute and PRESENCE does not start to scan. - added: OPENWEATHER: captures weather forecast from API of www.wetter.com diff --git a/fhem/FHEM/10_IT.pm b/fhem/FHEM/10_IT.pm index d7125254c..cf2a5375f 100644 --- a/fhem/FHEM/10_IT.pm +++ b/fhem/FHEM/10_IT.pm @@ -32,7 +32,11 @@ my %models = ( itswitch => 'simple', itdimmer => 'dimmer', ); - +my %bintotristate=( + "00" => "0", + "01" => "F", + "11" => "1" +); sub IT_Initialize($) { @@ -42,12 +46,12 @@ IT_Initialize($) $it_c2b{$codes{$k}} = $k; } -# $hash->{Match} = ""; + $hash->{Match} = "^i......\$"; $hash->{SetFn} = "IT_Set"; $hash->{StateFn} = "IT_SetState"; $hash->{DefFn} = "IT_Define"; $hash->{UndefFn} = "IT_Undef"; -# $hash->{ParseFn} = "IT_Parse"; + $hash->{ParseFn} = "IT_Parse"; $hash->{AttrList} = "IODev ITfrequency ITrepetition switch_rfmode:1,0 do_not_notify:1,0 ignore:0,1 dummy:1,0 model:itremote,itswitch,itdimmer loglevel:0,1,2,3,4,5,6"; } @@ -58,6 +62,8 @@ IT_SetState($$$$) { my ($hash, $tim, $vt, $val) = @_; + $val = $1 if($val =~ m/^(.*) \d+$/); + return "Undefined value $val" if(!defined($it_c2b{$val})); return undef; } @@ -296,7 +302,54 @@ IT_Undef($$) sub IT_Parse($$) { + my ($hash, $msg) = @_; + my $housecode; + my $onoffcode; + my $def; + my $newstate; + my @list; + if (length($msg) != 7) { + Log3 undef,3,"message \"$msg\" to short!"; + return "message \"$msg\" to short!"; + } + my $bin=sprintf("%024b",hex(substr($msg,1,length($msg)-1))); + my $msgcode=""; + while (length($bin)>=2) { + if (substr($bin,0,2) != "10") { + $msgcode=$msgcode.$bintotristate{substr($bin,0,2)}; + } else { + Log3 undef,4,"unknown tristate in \"$bin\""; + return "unknown tristate in \"$bin\"" + } + $bin=substr($bin,2,length($bin)-2); + } + + $housecode=substr($msgcode,0,length($msgcode)-2); + $onoffcode=substr($msgcode,length($msgcode)-2,2); + + #Log3 $hash,3,$msg."->".$msgcode."->".$housecode." ".$onoffcode; + if(!defined($modules{IT}{defptr}{lc($housecode)})) { + Log3 undef,3,"$housecode not defined (Switch code: $onoffcode)"; + return "$housecode not defined (Switch code: $onoffcode)!"; + } + $def=$modules{IT}{defptr}{lc($housecode)}; + + foreach my $name (keys %{$def}) { + if ($def->{$name}->{$it_c2b{"on"}} eq lc($onoffcode)) { + $newstate="on"; + } elsif ($def->{$name}->{$it_c2b{"off"}} eq lc($onoffcode)) { + $newstate="off"; + } else { + Log3 $def->{$name}{NAME},3,"Code $onoffcode not supported by $def->{$name}{NAME}."; + next; + } + Log3 $def->{$name}{NAME},3,"$def->{$name}{NAME} ".$def->{$name}->{STATE}."->".$newstate; + push(@list,$def->{$name}{NAME}); + readingsSingleUpdate($def->{$name},"state",$newstate,1); + + } + return @list; } 1;