diff --git a/fhem/FHEM/10_CUL_HM.pm b/fhem/FHEM/10_CUL_HM.pm index d29fbfcb5..ecc7a899f 100755 --- a/fhem/FHEM/10_CUL_HM.pm +++ b/fhem/FHEM/10_CUL_HM.pm @@ -1388,16 +1388,22 @@ sub CUL_HM_Parse($$) {############################## push @event,"timedOn:".(($err&0x40)?"running":"off"); } elsif ($mTp eq "5E" ||$mTp eq "5F" ) { # POWER_EVENT_CYCLIC + my $devHash = $shash; $shash = $modules{CUL_HM}{defptr}{$src."02"} if($modules{CUL_HM}{defptr}{$src."02"}); - my ($eCnt,$P,$I,$U,$F) = unpack 'A6A6A4A4A2',$p; - push @event, "energy:" .(hex($eCnt)&0x7fffff)/10;# 0.0 ..838860.7 Wh - push @event, "power:" . hex($P )/100; # 0.0 ..167772.15 W - push @event, "current:" . hex($I )/1; # 0.0 ..65535.0 mA - push @event, "voltage:" . hex($U )/10; # 0.0 ..6553.5 mV + my ($eCnt,$P,$I,$U,$F) = map{hex($_)} unpack 'A6A6A4A4A2',$p; + push @event, "energy:" .($eCnt&0x7fffff)/10;# 0.0 ..838860.7 Wh + push @event, "power:" . $P /100; # 0.0 ..167772.15 W + push @event, "current:" . $I /1; # 0.0 ..65535.0 mA + push @event, "voltage:" . $U /10; # 0.0 ..6553.5 mV $F = hex($F);$F -= 256 if ($F > 127); push @event, "frequency:".($F/100+50); # 48.72..51.27 Hz - push @event, "boot:" .((hex($eCnt)&0x800000)?"on":"off"); + push @event, "boot:" .(($eCnt&0x800000)?"on":"off"); + if($eCnt == 0 && $mTp eq "5E" && hex($mNo) < 3 ){ + push @entities,CUL_HM_UpdtReadSingle($devHash,'powerOn',"-",1); + push @event, "energyOffset:".ReadingsVal($shash->{NAME},"energy",0)+ + ReadingsVal($shash->{NAME},"energyOffset",0); + } } } elsif($st eq "repeater"){ ################################################### @@ -2307,6 +2313,7 @@ sub CUL_HM_Get($@) { my $roleC = $hash->{helper}{role}{chn}?1:0; #entity may act in multiple roles my $roleD = $hash->{helper}{role}{dev}?1:0; my $roleV = $hash->{helper}{role}{vrt}?1:0; + my $fkt = $hash->{helper}{fkt}?$hash->{helper}{fkt}:""; my $h = $culHmGlobalGets->{$cmd}; $h = $culHmSubTypeGets->{$st}{$cmd} if(!defined($h) && $culHmSubTypeGets->{$st}); @@ -2321,10 +2328,12 @@ sub CUL_HM_Get($@) { my $usg = "Unknown argument $cmd, choose one of ".join(" ",sort @arr); return $usg; - }elsif($h eq "" && @a != 2) { + } + elsif($h eq "" && @a != 2) { return "$cmd requires no parameters"; - } elsif($h !~ m/\.\.\./ && @h != @a-2) { + } + elsif($h !~ m/\.\.\./ && @h != @a-2) { return "$cmd requires parameter: $h"; } my $devHash = CUL_HM_getDeviceHash($hash); @@ -2414,6 +2423,29 @@ sub CUL_HM_Get($@) { foreach(sort(@rI)){$info .= $_;} return $info; } + elsif($cmd eq "cmdList") { ################################################# + my @arr; + push @arr,"$_ $culHmGlobalGets->{$_}" foreach (keys %{$culHmGlobalGets}); + push @arr,"$_ $culHmSubTypeGets->{$st}{$_}" foreach (keys %{$culHmSubTypeGets->{$st}}); + push @arr,"$_ $culHmModelGets->{$md}{$_}" foreach (keys %{$culHmModelGets->{$md}}); + my @arr1; + if( $st ne "virtual") {foreach(keys %{$culHmGlobalSets} ){push @arr1,"$_ ".$culHmGlobalSets->{$_} }}; + if(($st eq "virtual"||!$st) && $roleD){foreach(keys %{$culHmGlobalSetsVrtDev} ){push @arr1,"$_ ".$culHmGlobalSetsVrtDev->{$_} }}; + if( $st ne "virtual" && $roleD){foreach(keys %{$culHmGlobalSetsDevice} ){push @arr1,"$_ ".$culHmGlobalSetsDevice->{$_} }}; + if( $st ne "virtual" && $roleD){foreach(keys %{$culHmSubTypeDevSets->{$st}}){push @arr1,"$_ ".${$culHmSubTypeDevSets->{$st}}{$_}}}; + if( $st ne "virtual" && $roleC){foreach(keys %{$culHmGlobalSetsChn} ){push @arr1,"$_ ".$culHmGlobalSetsChn->{$_} }}; + if( $culHmSubTypeSets->{$st} && $roleC){foreach(keys %{$culHmSubTypeSets->{$st}} ){push @arr1,"$_ ".${$culHmSubTypeSets->{$st}}{$_} }}; + if( $culHmModelSets->{$md}) {foreach(keys %{$culHmModelSets->{$md}} ){push @arr1,"$_ ".${$culHmModelSets->{$md}}{$_} }}; + if( $culHmChanSets->{$md."00"} && $roleD){foreach(keys %{$culHmChanSets->{$md."00"}} ){push @arr1,"$_ ".${$culHmChanSets->{$md."00"}}{$_} }}; + if( $culHmChanSets->{$md.$chn} && $roleC){foreach(keys %{$culHmChanSets->{$md.$chn}} ){push @arr1,"$_ ".${$culHmChanSets->{$md.$chn}}{$_} }}; + if( $culHmFunctSets->{$fkt} && $roleC){foreach(keys %{$culHmFunctSets->{$fkt}} ){push @arr1,"$_ ".${$culHmFunctSets->{$fkt}}{$_} }}; + + my $info .= " Gets ------\n"; + $info .= join("\n",sort @arr); + $info .= "\n\n Sets ------\n"; + $info .= join("\n",sort @arr1); + return $info; + } elsif($cmd eq "saveConfig"){ ############################################### return "no filename given" if (!$a[2]); my $fName = $a[2]; @@ -3264,7 +3296,7 @@ sub CUL_HM_Set($@) { $prep = $a[2]; splice @a,2,1;#remove prep } - if ($md =~ m/HM-TC-IT-WM-W-EU/ && $a[2] =~ m/^p([1..3])$/){ + if ($md =~ m/HM-TC-IT-WM-W-EU/ && $a[2] =~ m/^p([123])$/){ $list += $1 - 1; splice @a,2,1;#remove list } @@ -5302,47 +5334,38 @@ sub CUL_HM_TCITtempReadings($) {# parse RT temperature readings my @days = ("Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri"); - $tempRegs =~ s/.* 14://; #remove register up to addr 20 from list - $tempRegs =~ s/ 00:00/ /g; #remove regline termination - $tempRegs =~ s/ ..://g; #remove addr Info - $tempRegs =~ s/ //g; #blank - - $stmpRegs =~ s/.* 14://; - $stmpRegs =~ s/ 00:00/ /g; - $stmpRegs =~ s/ ..://g; - $stmpRegs =~ s/ //g; - + my @r1; + foreach(split " ",$tempRegs){ + my ($a,$d) = split ":",$_; + $r1[hex($a)] = $d; + } + foreach(split " ",$stmpRegs){ + my ($a,$d) = split ":",$_; + $r1[hex($a)] = $d; + } + + $tempRegs = join("",@r1[20..scalar@r1-1]); push (@changedRead,"tempList$idxN{$lst}_State:". ($hash->{helper}{shadowReg}{"RegL_0$lst:"} ?"set":"verified")); for (my $day = 0;$day<7;$day++){ my $dayRead = ""; - my $pre =""; my @time; my @temp; - my $str; - if (substr($stmpRegs,$day *13*4,13*4) eq - substr($tempRegs,$day *13*4,13*4) ){ - $str = substr($tempRegs,$day *13*4,13*4); - } - else{ - $str = substr($stmpRegs,$day *13*4,13*4); - $pre = "set_"; - } - foreach (unpack '(A4)*',$str){ + + foreach (unpack '(A4)*',substr($tempRegs,$day *13*4,13*4)){ my $h = hex($_); push @temp,($h >> 9)/2; $h = ($h & 0x1ff) * 5; $h = sprintf("%02d:%02d",int($h / 60),($h%60)); push @time,$h; } - for (my $idx = 0;$idx<13;$idx++){ my $entry = sprintf(" %s %3.01f",$time[$idx],$temp[$idx]); $setting .= "Temp set: ".$days[$day].$entry." C\n"; $dayRead .= $entry; last if ($time[$idx] eq "24:00"); } - push (@changedRead,"tempList$idxN{$lst}".$days[$day].":".$pre." ".$dayRead); + push (@changedRead,"tempList$idxN{$lst}".$days[$day].": ".$dayRead); } } CUL_HM_UpdtReadBulk($hash,1,@changedRead) if (@changedRead); diff --git a/fhem/FHEM/HMConfig.pm b/fhem/FHEM/HMConfig.pm index f22dea0b9..fd0d7ff98 100644 --- a/fhem/FHEM/HMConfig.pm +++ b/fhem/FHEM/HMConfig.pm @@ -1059,6 +1059,7 @@ $culHmRegChan{"ROTO_ZEL-STG-RM-FWT03"}= $culHmRegChan{"HM-CC-TC03"}; param => "", reg => " ... ", regList => "", + cmdList => "", saveConfig => " ...", ); %culHmSubTypeGets = (