From 74bc61e7ae8d2b428610a873bfe8fd5698401097 Mon Sep 17 00:00:00 2001 From: martinp876 <> Date: Thu, 26 Sep 2013 20:57:19 +0000 Subject: [PATCH] OT2 add level, add AES key to HMLAN git-svn-id: https://svn.fhem.de/fhem/trunk@3965 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/00_HMLAN.pm | 30 +++++++++++++++++++++++++++++- fhem/FHEM/10_CUL_HM.pm | 31 ++++++++++++++++++++++++------- fhem/FHEM/98_HMinfo.pm | 8 ++++---- fhem/FHEM/HMConfig.pm | 4 ++-- 4 files changed, 59 insertions(+), 14 deletions(-) diff --git a/fhem/FHEM/00_HMLAN.pm b/fhem/FHEM/00_HMLAN.pm index bd20f45c6..6fa3ebaac 100755 --- a/fhem/FHEM/00_HMLAN.pm +++ b/fhem/FHEM/00_HMLAN.pm @@ -6,6 +6,7 @@ package main; use strict; use warnings; use Time::HiRes qw(gettimeofday time); +use Digest::MD5 qw(md5); sub HMLAN_Initialize($); sub HMLAN_Define($$); @@ -61,7 +62,7 @@ sub HMLAN_Initialize($) { $hash->{UndefFn} = "HMLAN_Undef"; $hash->{AttrList}= "do_not_notify:1,0 dummy:1,0 " . "loglevel:0,1,2,3,4,5,6 addvaltrigger " . - "hmId hmKey " . + "hmId hmKey hmKey2 hmKey3 " . "respTime wdStrokeTime:5,10,15,20,25 " . "hmProtocolEvents:0_off,1_dump,2_dumpFull,3_dumpTrigger ". "hmLanQlen:1_min,2_low,3_normal,4_high,5_critical ". @@ -144,6 +145,26 @@ sub HMLAN_Attr(@) {################################# $defs{$name}{helper}{q}{hmLanQlen} = 1; } } + elsif($attrName =~ m /^hmKey/){ + my $retVal= ""; + if ($cmd eq "set"){ + $attr{$name}{$attrName} = ($aVal =~ m /^[0-9A-Fa-f]{32}$/ )? + $aVal: + unpack('H*', md5($aVal)); + $retVal = "$attrName set to $attr{$name}{$attrName}"; + } + else{ + delete $attr{$name}{$attrName}; + } + my ($k1,$k2,$k3) =( AttrVal($name,"hmKey","") + ,AttrVal($name,"hmKey2","") + ,AttrVal($name,"hmKey3","") + ); + HMLAN_SimpleWrite($defs{$name}, "Y01,".($k1?"01,$k1":"00,")); + HMLAN_SimpleWrite($defs{$name}, "Y02,".($k2?"02,$k2":"00,")); + HMLAN_SimpleWrite($defs{$name}, "Y03,".($k3?"03,$k3":"00,")); + return $retVal; + } return; } @@ -747,6 +768,13 @@ sub HMLAN_condUpdate($$) {#####################################################
  • loglevel

  • addvaltrigger

  • hmId

  • +
  • hmKey

  • +
  • hmKey2

  • +
  • hmKey3
    + AES keys for the HMLAN adapter.
    + The key is converted to a hash. If a hash is given directly it is not converted but taken directly. + Therefore the original key cannot be converted back
    +
  • hmProtocolEvents

  • respTime
    Define max response time of the HMLAN adapter in seconds. Default is 1 sec.
    diff --git a/fhem/FHEM/10_CUL_HM.pm b/fhem/FHEM/10_CUL_HM.pm index a840621e2..af636e6fc 100755 --- a/fhem/FHEM/10_CUL_HM.pm +++ b/fhem/FHEM/10_CUL_HM.pm @@ -898,7 +898,7 @@ sub CUL_HM_Parse($$) {############################## push @event, "battery:".($err&0x80?"low":"ok") if (defined $err); } } - elsif($st eq "KFM100" && $md eq "KFM-Sensor") { ########################### + elsif($md eq "KFM-Sensor") { ################################################ if ($mTp eq "53"){ if($p =~ m/.14(.)0200(..)(..)(..)/) { my ($seq, $k_v1, $k_v2, $k_v3) = (hex($1),$2,hex($3),hex($4)); @@ -961,14 +961,16 @@ sub CUL_HM_Parse($$) {############################## my ($a,$d) = unpack 'A2A4',$_; $d = hex($d); $d -= 0x10000 if($d & 0xC000); - $d = sprintf("T: %0.1f",$d/10); + $d = sprintf("%0.1f",$d/10); my $chId = sprintf("%02X",hex($a) & 0x3f); - if($modules{CUL_HM}{defptr}{$src.$chId}){ - push @entities,CUL_HM_UpdtReadSingle($modules{CUL_HM}{defptr}{$src.$chId} - ,'state',$d,1); + my $chnHash = $modules{CUL_HM}{defptr}{$src.$chId}; + if ($chnHash){ + push @entities,CUL_HM_UpdtReadBulk($chnHash,1 + ,"state:T: $d" + ,"temperature:$d"); } else{ - push @event, "Chan_$chId:$d"; + push @event, "Chan_$chId:T: $d"; } } } @@ -2410,7 +2412,7 @@ sub CUL_HM_Set($@) { .(($reg->{l} == 3)?" peer required":"")." : ".$reg->{t}."\n" if ($data eq "?"); return "value:".$data." out of range for Reg \"".$regName."\"" - if (!($reg->{c} eq 'lit'||$reg->{c} eq 'hex')&& + if (!($reg->{c} =~ m/^(lit|hex|min2time)$/)&& ($data < $reg->{min} ||$data > $reg->{max})); # none number return"invalid value. use:". join(",",keys%{$reg->{lit}}) if ($reg->{c} eq 'lit' && !defined($reg->{lit}{$data})); @@ -2420,6 +2422,7 @@ sub CUL_HM_Set($@) { if (!$conversion){;# do nothing }elsif($conversion eq "fltCvT" ){$data = CUL_HM_fltCvT($data); }elsif($conversion eq "fltCvT60"){$data = CUL_HM_fltCvT60($data); + }elsif($conversion eq "min2time"){$data = CUL_HM_time2min($data); }elsif($conversion eq "m10s3") {$data = $data*10-3; }elsif($conversion eq "hex") {$data = hex($data); }elsif($conversion eq "lit") {$data = $reg->{lit}{$data}; @@ -3959,6 +3962,7 @@ sub CUL_HM_getRegFromStore($$$$@) {#read a register from backup data } elsif($conversion eq "lit" ){$data = $reg->{litInv}{$data}?$reg->{litInv}{$data}:"undef lit"; } elsif($conversion eq "fltCvT" ){$data = CUL_HM_CvTflt($data); } elsif($conversion eq "fltCvT60"){$data = CUL_HM_CvTflt60($data); + } elsif($conversion eq "min2time"){$data = CUL_HM_min2time($data); } elsif($conversion eq "m10s3" ){$data = ($data+3)/10; } elsif($conversion eq "hex" ){$data = sprintf("0x%X",$data); } else { return " conversion undefined - please contact admin"; @@ -4175,6 +4179,19 @@ sub CUL_HM_CvTflt($) { # config time -> float my ($inValue) = @_; return ($inValue & 0x1f)*((sort {$a <=> $b} keys(%fltCvT))[$inValue >> 5]); } +sub CUL_HM_min2time($) { # minutes -> time + my $min = shift; + $min = $min * 30; + return sprintf("%02d:%02d",int($min/60),$min%60); +} +sub CUL_HM_time2min($) { # minutes -> time + my $time = shift; + my ($h,$m) = split ":",$time; + $m = ($h*60 + $m)/30; + $m = 0 if($m < 0); + $m = 47 if($m > 47); + return $m; +} sub CUL_HM_4DisText($) {# convert text for 4dis #text1: start at 54 (0x36) length 12 (0x0c) diff --git a/fhem/FHEM/98_HMinfo.pm b/fhem/FHEM/98_HMinfo.pm index 597481c93..85b8d0315 100644 --- a/fhem/FHEM/98_HMinfo.pm +++ b/fhem/FHEM/98_HMinfo.pm @@ -329,11 +329,11 @@ sub HMinfo_SetFn($@) {######################################################### my $dispDest = $dest; if ($dest =~ m/^at_(.*)/){ $dispName = $1; - $dispName =~ s/^rpt_//; +# $dispName =~ s/^rpt_//; $dispDest = (($dest =~ m/^to_rpt_/)?"rep_":"").$dName; } - push @rssiList,sprintf("%-15s %-15s %6.1f %6.1f %6.1f<%6.1f %3s" - ,$dispName,$dispDest + push @rssiList,sprintf("%-15s:%-15s %-15s %6.1f %6.1f %6.1f<%6.1f %5s" + ,$dName,$dispName,$dispDest ,$defs{$dName}{helper}{rssi}{$dest}{lst} ,$defs{$dName}{helper}{rssi}{$dest}{avg} ,$defs{$dName}{helper}{rssi}{$dest}{min} @@ -342,7 +342,7 @@ sub HMinfo_SetFn($@) {######################################################### ); } } - $ret = $cmd." done:"."\n "."receive from last avg min{a=> 4 ,s=>0.6,l=>7,min=>15 ,max=>30.5 ,c=>'' ,f=>'2' ,u=>'' ,d=>1,t=>"maximum temperatur"}, tempFallWinOpen =>{a=> 5 ,s=>0.6,l=>7,min=>5 ,max=>30 ,c=>'' ,f=>'2' ,u=>'' ,d=>1,t=>"lowering temp whenWindow is opened"}, tempFallWinPerio=>{a=> 6 ,s=>0.4,l=>7,min=>0 ,max=>60 ,c=>'' ,f=>'0.2' ,u=>'min' ,d=>1,t=>"period lowering when window is open"}, - decalcWeekday =>{a=> 7 ,s=>0.3,l=>7,min=>0 ,max=>7 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"decalc day" ,lit=>{Sat=>0,Sun=>1,Mon=>2,Tue=>3,Wed=>4,Thu=>5,Fri=>6}}, - decalcTime =>{a=> 8 ,s=>0.6,l=>7,min=>0 ,max=>1410 ,c=>'' ,f=>'0.0333',u=>'min' ,d=>1,t=>"decalc hour"}, + decalcWeekday =>{a=> 7 ,s=>0.3,l=>7,min=>0 ,max=>7 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"decalc at day" ,lit=>{Sat=>0,Sun=>1,Mon=>2,Tue=>3,Wed=>4,Thu=>5,Fri=>6}}, + decalcTime =>{a=> 8 ,s=>0.6,l=>7,min=>0 ,max=>1410 ,c=>'min2time' ,f=>'' ,u=>'' ,d=>1,t=>"decalc at hour"}, tempOffset =>{a=> 9 ,s=>0.4,l=>7,min=>0 ,max=>15 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"temperature offset",lit=>{"-3.5K"=>0,"-3.0K"=>1,"-2.5K"=>2,"-2.0K"=>3,"-1.5K"=>4,"-1.0K"=>5,"-0.5K"=>6, "0.0K"=>7, "0.5K"=>8, "1.0K"=>10, "1.5K"=>11, "2.0K"=>12, "2.5K"=>13, "3.0K"=>14, "3.5K"=>15}}, btnNoBckLight =>{a=> 9.4,s=>0.1,l=>7,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"button response without backlight",lit=>{off=>0,on=>1}},