1
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-05-04 22:19:38 +00:00

introduce expert attribute

git-svn-id: https://svn.fhem.de/fhem/trunk@2590 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
martinp876 2013-01-28 21:39:19 +00:00
parent 39577ce18f
commit 5dfde9ffab

View File

@ -224,12 +224,14 @@ CUL_HM_Initialize($)
$hash->{SetFn} = "CUL_HM_Set"; $hash->{SetFn} = "CUL_HM_Set";
$hash->{GetFn} = "CUL_HM_Get"; $hash->{GetFn} = "CUL_HM_Get";
$hash->{RenameFn} = "CUL_HM_Rename"; $hash->{RenameFn} = "CUL_HM_Rename";
$hash->{AttrFn} = "CUL_HM_Attr";
$hash->{AttrList} = "IODev do_not_notify:1,0 ignore:1,0 dummy:1,0 ". $hash->{AttrList} = "IODev do_not_notify:1,0 ignore:1,0 dummy:1,0 ".
"showtime:1,0 loglevel:0,1,2,3,4,5,6 ". "showtime:1,0 loglevel:0,1,2,3,4,5,6 ".
"hmClass:receiver,sender serialNr firmware devInfo ". "hmClass:receiver,sender serialNr firmware devInfo ".
"rawToReadable unit ". "rawToReadable unit ".
"peerIDs ". "peerIDs ".
"actCycle actStatus autoReadReg:1,0 ". "actCycle actStatus autoReadReg:1,0 ".
"expert:0_off,1_on,2_full ".
$readingFnAttributes; $readingFnAttributes;
my @modellist; my @modellist;
foreach my $model (keys %culHmModel){ foreach my $model (keys %culHmModel){
@ -327,7 +329,6 @@ CUL_HM_Undef($$)
sub sub
CUL_HM_Rename($$$) CUL_HM_Rename($$$)
{ {
#my ($hash, $name,$newName) = @_;
my ($name, $oldName) = @_; my ($name, $oldName) = @_;
my $HMid = CUL_HM_name2Id($name); my $HMid = CUL_HM_name2Id($name);
my $hash = CUL_HM_name2Hash($name); my $hash = CUL_HM_name2Hash($name);
@ -1184,7 +1185,7 @@ my %culHmRegDefShLg = (# register that are available for short AND long button p
OffTime =>{a=> 9.0,s=>1.0,l=>3,min=>0 ,max=>111600 ,c=>'fltCvT' ,f=>'' ,u=>'s' ,d=>0,t=>"off time"}, OffTime =>{a=> 9.0,s=>1.0,l=>3,min=>0 ,max=>111600 ,c=>'fltCvT' ,f=>'' ,u=>'s' ,d=>0,t=>"off time"},
ActionTypeDim =>{a=> 10.0,s=>0.2,l=>3,min=>0 ,max=>8 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"" ,lit=>{off=>0,jmpToTarget=>1,toggleToCnt=>2,toggleToCntInv=>3,upDim=>4,downDim=>5,toggelDim=>6,toggelDimToCnt=>7,toggelDimToCntInv=>8}}, ActionTypeDim =>{a=> 10.0,s=>0.2,l=>3,min=>0 ,max=>8 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"" ,lit=>{off=>0,jmpToTarget=>1,toggleToCnt=>2,toggleToCntInv=>3,upDim=>4,downDim=>5,toggelDim=>6,toggelDimToCnt=>7,toggelDimToCntInv=>8}},
OffLevel =>{a=> 15.0,s=>1.0,l=>3,min=>0 ,max=>100 ,c=>'factor' ,f=>2 ,u=>'%' ,d=>1,t=>"PowerLevel Off"}, OffLevel =>{a=> 15.0,s=>1.0,l=>3,min=>0 ,max=>100 ,c=>'factor' ,f=>2 ,u=>'%' ,d=>0,t=>"PowerLevel Off"},
OnMinLevel =>{a=> 16.0,s=>1.0,l=>3,min=>0 ,max=>100 ,c=>'factor' ,f=>2 ,u=>'%' ,d=>0,t=>"minimum PowerLevel"}, OnMinLevel =>{a=> 16.0,s=>1.0,l=>3,min=>0 ,max=>100 ,c=>'factor' ,f=>2 ,u=>'%' ,d=>0,t=>"minimum PowerLevel"},
OnLevel =>{a=> 17.0,s=>1.0,l=>3,min=>0 ,max=>100 ,c=>'factor' ,f=>2 ,u=>'%' ,d=>1,t=>"PowerLevel on"}, OnLevel =>{a=> 17.0,s=>1.0,l=>3,min=>0 ,max=>100 ,c=>'factor' ,f=>2 ,u=>'%' ,d=>1,t=>"PowerLevel on"},
@ -1367,8 +1368,8 @@ my %culHmRegGeneral = (
my %culHmRegType = ( my %culHmRegType = (
remote=> {expectAES=>1,peerNeedsBurst=>1,dblPress=>1,longPress=>1}, remote=> {expectAES=>1,peerNeedsBurst=>1,dblPress=>1,longPress=>1},
blindActuator=> {driveUp =>1,driveDown =>1,driveTurn =>1,refRunCounter =>1, blindActuator=> {driveUp =>1,driveDown =>1,driveTurn =>1,refRunCounter =>1,
TransmitTryMax =>1,statusInfoMinDly=>1,statusInfoRandom=>1, transmitTryMax =>1,statusInfoMinDly=>1,statusInfoRandom=>1, # nt present in all files
maxTimeF =>1, MaxTimeF =>1,
OnDly =>1,OnTime =>1,OffDly =>1,OffTime =>1, OnDly =>1,OnTime =>1,OffDly =>1,OffTime =>1,
OffLevel =>1,OnLevel =>1, OffLevel =>1,OnLevel =>1,
ActionType =>1,OnTimeMode =>1,OffTimeMode =>1,DriveMode =>1, ActionType =>1,OnTimeMode =>1,OffTimeMode =>1,DriveMode =>1,
@ -1379,7 +1380,7 @@ my %culHmRegType = (
CtOff =>1,CtDlyOff =>1,CtRampOff =>1,CtRefOff =>1, CtOff =>1,CtDlyOff =>1,CtRampOff =>1,CtRefOff =>1,
lgMultiExec =>1, lgMultiExec =>1,
}, },
dimmer=> {TransmitTryMax =>1,statusInfoMinDly=>1,statusInfoRandom=>1,powerUpAction =>1, dimmer=> {transmitTryMax =>1,statusInfoMinDly=>1,statusInfoRandom=>1,powerUpAction =>1,
ovrTempLvl =>1,redTempLvl =>1,redLvl =>1,fuseDelay =>1,#not dim.L ovrTempLvl =>1,redTempLvl =>1,redLvl =>1,fuseDelay =>1,#not dim.L
OnDly =>1,OnTime =>1,OffDly =>1,OffTime =>1, OnDly =>1,OnTime =>1,OffDly =>1,OffTime =>1,
ActionTypeDim =>1,OnTimeMode =>1,OffTimeMode =>1, ActionTypeDim =>1,OnTimeMode =>1,OffTimeMode =>1,
@ -1490,6 +1491,66 @@ my %culHmRegChan = (# if channelspecific then enter them here
##--------------- Conversion routines for register settings ##--------------- Conversion routines for register settings
my %fltCvT = (0.1=>3.1,1=>31,5=>155,10=>310,60=>1860,300=>9300, my %fltCvT = (0.1=>3.1,1=>31,5=>155,10=>310,60=>1860,300=>9300,
600=>18600,3600=>111600); 600=>18600,3600=>111600);
#############################
sub
CUL_HM_Attr($$$)
{
my ($cmd,$name, $attrName,$attrVal) = @_;
my @hashL;
if ($attrName eq "expert"){
$attr{$name}{expert} = $attrVal;
my $eHash = CUL_HM_name2Hash($name);
foreach my $chId (CUL_HM_getAssChnIds($name)){
my $cHash = CUL_HM_id2Hash($chId);
push(@hashL,$cHash) if ($eHash ne $cHash);
}
push(@hashL,$eHash);
foreach my $hash (@hashL){
my $exLvl = CUL_HM_getExpertMode($hash);
if ($exLvl eq "0"){# off
foreach my $rdEntry (keys %{$hash->{READINGS}}){
my $rdEntryNew;
$rdEntryNew = ".".$rdEntry if ($rdEntry =~m /^RegL_/);
if ($rdEntry =~m /^R-/){
my $reg = $rdEntry;
$reg =~ s/.*-//;
$rdEntryNew = ".".$rdEntry if($culHmRegDefine{$reg}{d} eq '0' );
}
next if (!defined($rdEntryNew)); # no change necessary
delete $hash->{READINGS}{$rdEntryNew};
$hash->{READINGS}{$rdEntryNew} = $hash->{READINGS}{$rdEntry};
delete $hash->{READINGS}{$rdEntry};
}
}
elsif ($exLvl eq "1"){# on: Only register values, no raw data
# move register to visible if available
foreach my $rdEntry (keys %{$hash->{READINGS}}){
my $rdEntryNew;
$rdEntryNew = substr($rdEntry,1) if ($rdEntry =~m /^\.R-/);
$rdEntryNew = ".".$rdEntry if ($rdEntry =~m /^RegL_/);
next if (!$rdEntryNew); # no change necessary
delete $hash->{READINGS}{$rdEntryNew};
$hash->{READINGS}{$rdEntryNew} = $hash->{READINGS}{$rdEntry};
delete $hash->{READINGS}{$rdEntry};
}
}
elsif ($exLvl eq "2"){# full - incl raw data
foreach my $rdEntry (keys %{$hash->{READINGS}}){
my $rdEntryNew;
$rdEntryNew = substr($rdEntry,1) if (($rdEntry =~m /^\.RegL_/) ||
($rdEntry =~m /^\.R-/));
next if (!$rdEntryNew); # no change necessary
delete $hash->{READINGS}{$rdEntryNew};
$hash->{READINGS}{$rdEntryNew} = $hash->{READINGS}{$rdEntry};
delete $hash->{READINGS}{$rdEntry};
}
}
else{;
}
}
}
return;
}
sub sub
CUL_HM_initRegHash() CUL_HM_initRegHash()
@ -1570,8 +1631,9 @@ CUL_HM_TCtempReadings($)
{ {
my ($hash)=@_; my ($hash)=@_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
my $reg5 = ReadingsVal($name,"RegL_05:",""); my $regLN = ((CUL_HM_getExpertMode($hash) eq "2")?"":".")."RegL_";
my $reg6 = ReadingsVal($name,"RegL_06:",""); my $reg5 = ReadingsVal($name,$regLN."05:" ,"");
my $reg6 = ReadingsVal($name,$regLN."06:" ,"");
my @days = ("Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri"); my @days = ("Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri");
$reg5 =~ s/.* 0B://; #remove register up to addr 11 from list 5 $reg5 =~ s/.* 0B://; #remove register up to addr 11 from list 5
my $tempRegs = $reg5.$reg6; #one row my $tempRegs = $reg5.$reg6; #one row
@ -1587,7 +1649,8 @@ CUL_HM_TCtempReadings($)
my $setting; my $setting;
my @changedRead; my @changedRead;
push (@changedRead,"tempList_State:". push (@changedRead,"tempList_State:".
($hash->{helper}{shadowReg}{"RegL_05:"}?"set":"verified")); (($hash->{helper}{shadowReg}{$regLN."05:"} ||
$hash->{helper}{shadowReg}{$regLN."06:"} )?"set":"verified"));
for (my $day = 0;$day<7;$day++){ for (my $day = 0;$day<7;$day++){
my $tSpan = 0; my $tSpan = 0;
my $dayRead = ""; my $dayRead = "";
@ -1653,15 +1716,15 @@ CUL_HM_Get($@)
if($cmd eq "param") { ###################################################### if($cmd eq "param") { ######################################################
my $val; my $val;
$val = AttrVal($name, $a[2], ""); $val = AttrVal($name, $a[2], "");
$val = $hash->{READINGS}{$a[2]}{VAL} if (!$val && $hash->{READINGS}{$a[2]}); $val = $hash->{READINGS}{$a[2]}{VAL} if (!defined($val) && $hash->{READINGS}{$a[2]});
$val = AttrVal($devName, $a[2], "") if (!$val); $val = AttrVal($devName, $a[2], "") if (!defined($val));
$val = $devHash->{READINGS}{$a[2]}{VAL} if (!$val && $devHash->{READINGS}{$a[2]}); $val = $devHash->{READINGS}{$a[2]}{VAL} if (!defined($val) && $devHash->{READINGS}{$a[2]});
$val = $hash->{$a[2]} if (!$val && $hash->{$a[2]}); $val = $hash->{$a[2]} if (!defined($val) && $hash->{$a[2]});
$val = $devHash->{$a[2]} if (!$val && $devHash->{$a[2]}); $val = $devHash->{$a[2]} if (!defined($val) && $devHash->{$a[2]});
$val = $hash->{helper}{$a[2]} if((!$val)&& (ref($hash->{helper}{$a[2]}) ne "HASH")); $val = $hash->{helper}{$a[2]} if((!defined($val))&& (ref($hash->{helper}{$a[2]}) ne "HASH"));
$val = $devHash->{helper}{$a[2]} if (!$val); $val = $devHash->{helper}{$a[2]} if (!defined($val));
return (defined ($val))?$val:"undefined"; return (defined ($val))?"$val":"undefined";
} }
elsif($cmd eq "reg") { ##################################################### elsif($cmd eq "reg") { #####################################################
my (undef,undef,$regReq,$list,$peerId) = @a; my (undef,undef,$regReq,$list,$peerId) = @a;
@ -1674,15 +1737,13 @@ CUL_HM_Get($@)
my @peers; # get all peers we have a reglist my @peers; # get all peers we have a reglist
my @listWp; # list that require peers my @listWp; # list that require peers
foreach my $readEntry (keys %{$hash->{READINGS}}){ foreach my $readEntry (keys %{$hash->{READINGS}}){
my $regs = ReadingsVal($hash->{NAME},$readEntry,""); if ($readEntry =~m /^[\.]?RegL_(.*)/){ #reg Reading "RegL_<list>:peerN
if ($readEntry =~m /^RegL_/){ #this is a reg Reading "RegL_<list>:peerN my $peer = substr($1,3);
my $peer = substr($readEntry,8); next if (!$peer);
my $listP = substr($readEntry,6,1); push(@peers,$peer);
push(@peers,$peer) if ($peer); push(@listWp,substr($1,1,1));
push(@listWp,$listP) if ($peer);
} }
} }
my @regValList; #storage of results my @regValList; #storage of results
my $regHeader = "list:peer\tregister :value\n"; my $regHeader = "list:peer\tregister :value\n";
foreach my $regName (@regArr){ foreach my $regName (@regArr){
@ -1690,7 +1751,7 @@ CUL_HM_Get($@)
my @peerExe = (grep (/$regL/,@listWp))?@peers:("00000000"); my @peerExe = (grep (/$regL/,@listWp))?@peers:("00000000");
foreach my $peer(@peerExe){ foreach my $peer(@peerExe){
next if($peer eq ""); next if($peer eq "");
my $regVal = CUL_HM_getRegFromStore($name,$regName,0,$peer); #determine my $regVal= CUL_HM_getRegFromStore($name,$regName,0,$peer);#determine
my $peerN = CUL_HM_id2Name($peer); my $peerN = CUL_HM_id2Name($peer);
$peerN = " " if ($peer eq "00000000"); $peerN = " " if ($peer eq "00000000");
push @regValList,sprintf(" %d:%s\t%-16s :%s\n", push @regValList,sprintf(" %d:%s\t%-16s :%s\n",
@ -1737,14 +1798,16 @@ CUL_HM_Get($@)
$help .= " options:".join(",",keys%{$reg->{lit}}); $help .= " options:".join(",",keys%{$reg->{lit}});
$min =$max ="-"; $min =$max ="-";
} }
push @rI,sprintf("%4d: %-16s | %3s to %-11s | %8s | %s\n", push @rI,sprintf("%4d: %-16s | %3s to %-11s | %8s |%-3s| %s\n",
$reg->{l},$regName,$min,$max.$reg->{u}, $reg->{l},$regName,$min,$max.$reg->{u},
((($reg->{l} == 3)||($reg->{l} == 4))?"required":""),$help) ((($reg->{l} == 3)||($reg->{l} == 4))?"required":""),
(($reg->{d} != 1)?"exp":""),
$help)
if (!($isChannel && $reg->{l} == 0)); if (!($isChannel && $reg->{l} == 0));
} }
my $info = sprintf("list: %16s | %-20s | %-8s | %s\n", my $info = sprintf("list: %16s | %-18s | %-8s |%-3s| %s\n",
"register","range","peer","description"); "register","range","peer","exp","description");
foreach(sort(@rI)){$info .= $_;} foreach(sort(@rI)){$info .= $_;}
return $info; return $info;
} }
@ -1771,7 +1834,7 @@ CUL_HM_Get($@)
} }
my $ehash = CUL_HM_name2Hash($eName); my $ehash = CUL_HM_name2Hash($eName);
foreach my $read (sort keys %{$ehash->{READINGS}}){ foreach my $read (sort keys %{$ehash->{READINGS}}){
next if ($read !~ m/^RegL_/); next if ($read !~ m/^[\.]?RegL_/);
print aSave "\nset ".$eName." regBulk ".$read." ".ReadingsVal($eName,$read,""); print aSave "\nset ".$eName." regBulk ".$read." ".ReadingsVal($eName,$read,"");
$timestamps .= "\n# ".ReadingsTimestamp($eName,$read,"")." :".$read; $timestamps .= "\n# ".ReadingsTimestamp($eName,$read,"")." :".$read;
} }
@ -2120,7 +2183,7 @@ CUL_HM_Set($@)
if ($cmd eq "regRaw"); if ($cmd eq "regRaw");
if ($cmd eq "regBulk"){ if ($cmd eq "regBulk"){
($list) = ($a[2]); ($list) = ($a[2]);
$list =~ s/RegL_//; $list =~ s/[\.]?RegL_//;
($list,$peerID) = split(":",$list); ($list,$peerID) = split(":",$list);
return "unknown list Number:".$list if(hex($list)>6); return "unknown list Number:".$list if(hex($list)>6);
} }
@ -2849,7 +2912,7 @@ CUL_HM_getConfig($$$$$){
my $flag = CUL_HM_getFlag($hash); my $flag = CUL_HM_getFlag($hash);
foreach my $readEntry (keys %{$chnhash->{READINGS}}){ foreach my $readEntry (keys %{$chnhash->{READINGS}}){
delete $chnhash->{READINGS}{$readEntry} if ($readEntry =~ m/^RegL_/); delete $chnhash->{READINGS}{$readEntry} if ($readEntry =~ m/^[\.]?RegL_/);
} }
#get Peer-list in any case - it is part of config #get Peer-list in any case - it is part of config
CUL_HM_PushCmdStack($hash,sprintf("++%s01%s%s%s03",$flag,$id,$dst,$chn)); CUL_HM_PushCmdStack($hash,sprintf("++%s01%s%s%s03",$flag,$id,$dst,$chn));
@ -2954,8 +3017,9 @@ CUL_HM_responseSetup($$)
$peer ="" if($list !~ m/^0[34]$/); $peer ="" if($list !~ m/^0[34]$/);
#empty val since reading will be cumulative #empty val since reading will be cumulative
$chnhash->{READINGS}{"RegL_".$list.":".$peer}{VAL}=""; my $rlName = ((CUL_HM_getExpertMode($hash) eq "2")?"":".")."RegL_".$list.":".$peer;
delete ($chnhash->{READINGS}{"RegL_".$list.":".$peer}{TIME}); $chnhash->{READINGS}{$rlName}{VAL}="";
delete ($chnhash->{READINGS}{$rlName}{TIME});
return; return;
} }
# elsif($subType eq "0A"){ #Pair Serial---------- # elsif($subType eq "0A"){ #Pair Serial----------
@ -3166,6 +3230,16 @@ CUL_HM_ID2PeerList ($$$)
} }
################### Conversions ################ ################### Conversions ################
sub #--------------------------------- sub #---------------------------------
CUL_HM_getExpertMode($)
{ # get expert level for the entity.
# if expert level is not set try to get it for device
my ($hash) = @_;
my $expLvl = AttrVal($hash->{NAME},"expert","");
$expLvl = AttrVal({CUL_HM_getDeviceHash($hash)}->{NAME},"expert","0")
if ($expLvl eq "");
return substr($expLvl,0,1);
}
sub #---------------------------------
CUL_HM_getAssChnIds($) CUL_HM_getAssChnIds($)
{ # will return the list of assotiated channel of a device { # will return the list of assotiated channel of a device
# if it is a channel only return itself # if it is a channel only return itself
@ -3597,8 +3671,8 @@ CUL_HM_parseCommon(@){
$data = join(" ",@dataList); $data = join(" ",@dataList);
} }
} }
my $peerName = $shash->{helper}{respWait}{forPeer}; my $peer = $shash->{helper}{respWait}{forPeer};
my $regLN = "RegL_".$list.":".$peerName; my $regLN = ((CUL_HM_getExpertMode($chnHash) eq "2")?"":".")."RegL_".$list.":".$peer;
readingsSingleUpdate($chnHash,$regLN, readingsSingleUpdate($chnHash,$regLN,
ReadingsVal($chnName,$regLN,"")." ".$data,0); ReadingsVal($chnName,$regLN,"")." ".$data,0);
if ($data =~m/00:00$/){ # this was the last message in the block if ($data =~m/00:00$/){ # this was the last message in the block
@ -3611,7 +3685,7 @@ CUL_HM_parseCommon(@){
delete $chnHash->{helper}{shadowReg}{$regLN};#remove shadowhash delete $chnHash->{helper}{shadowReg}{$regLN};#remove shadowhash
# peer Channel name from/for user entry. <IDorName> <deviceID> <ioID> # peer Channel name from/for user entry. <IDorName> <deviceID> <ioID>
CUL_HM_updtRegDisp($chnHash,$list, CUL_HM_updtRegDisp($chnHash,$list,
CUL_HM_peerChId($peerName, CUL_HM_peerChId($peer,
substr(CUL_HM_hash2Id($chnHash),0,6),"00000000")); substr(CUL_HM_hash2Id($chnHash),0,6),"00000000"));
} }
else{ else{
@ -3624,7 +3698,7 @@ CUL_HM_parseCommon(@){
my($chn,$peerID,$list,$data) = ($1,$2,$3,$4) if($p =~ m/^04(..)(........)(..)(.*)/); my($chn,$peerID,$list,$data) = ($1,$2,$3,$4) if($p =~ m/^04(..)(........)(..)(.*)/);
my $chnHash = $modules{CUL_HM}{defptr}{$src.$chn}; my $chnHash = $modules{CUL_HM}{defptr}{$src.$chn};
$chnHash = $shash if(!$chnHash); # will add param to dev if no chan $chnHash = $shash if(!$chnHash); # will add param to dev if no chan
my $regLN = "RegL_".$list.":".CUL_HM_id2Name($peerID); my $regLN = ((CUL_HM_getExpertMode($chnHash) eq "2")?"":".")."RegL_".$list.":".CUL_HM_id2Name($peerID);
$regLN =~ s/broadcast//; $regLN =~ s/broadcast//;
$regLN =~ s/ /_/g; #remove blanks $regLN =~ s/ /_/g; #remove blanks
@ -3694,7 +3768,8 @@ CUL_HM_getRegFromStore($$$$)
} }
$peerId = CUL_HM_peerChId(($peerId?$peerId:"00000000"),$dId,$iId); $peerId = CUL_HM_peerChId(($peerId?$peerId:"00000000"),$dId,$iId);
my $regLN = "RegL_".sprintf("%02X",$list).":".CUL_HM_peerChName($peerId,$dId,$iId); my $regLN = ((CUL_HM_getExpertMode($hash) eq "2")?"":".").
"RegL_".sprintf("%02X",$list).":".CUL_HM_peerChName($peerId,$dId,$iId);
$regLN =~ s/broadcast//; $regLN =~ s/broadcast//;
my $data=0; my $data=0;
@ -3712,8 +3787,8 @@ CUL_HM_getRegFromStore($$$$)
} }
$convFlg = "set_" if ($dReadS && $dReadR ne $dReadS); $convFlg = "set_" if ($dReadS && $dReadR ne $dReadS);
my $dRead = $dReadS?$dReadS:$dReadR; my $dRead = $dReadS?$dReadS:$dReadR;
return "invalid" if (!defined($dRead)); return "invalid" if (!defined($dRead) || $dRead eq "");
$data = ($data<< 8)+hex($dRead); $data = ($data<< 8)+hex($dRead);
$addr++; $addr++;
} }
@ -3754,12 +3829,13 @@ CUL_HM_updtRegDisp($$$)
push @regArr, keys %{$culHmRegModel{$md}} if($culHmRegModel{$md}); push @regArr, keys %{$culHmRegModel{$md}} if($culHmRegModel{$md});
push @regArr, keys %{$culHmRegChan{$md.$chn}} if($culHmRegChan{$md.$chn}); push @regArr, keys %{$culHmRegChan{$md.$chn}} if($culHmRegChan{$md.$chn});
my @changedRead; my @changedRead;
my $expLvl = (CUL_HM_getExpertMode($hash) ne "0")?1:0;
foreach my $regName (@regArr){ foreach my $regName (@regArr){
next if (!$culHmRegDefine{$regName}->{d} || next if ($culHmRegDefine{$regName}->{l} ne $listNo);
($culHmRegDefine{$regName}->{l} != $listNo));
my $rgVal = CUL_HM_getRegFromStore($name,$regName,$list,$peerId); my $rgVal = CUL_HM_getRegFromStore($name,$regName,$list,$peerId);
next if (!$rgVal || $rgVal eq "invalid"); next if (!$rgVal || $rgVal eq "invalid");
my $readName = "R-".$peer.$regName; my $readName = "R-".$peer.$regName;
$readName = ($culHmRegDefine{$regName}->{d}?"":".").$readName if (!$expLvl); #expert?
push (@changedRead,$readName.":".$rgVal) push (@changedRead,$readName.":".$rgVal)
if (ReadingsVal($name,$readName,"") ne $rgVal); if (ReadingsVal($name,$readName,"") ne $rgVal);
} }
@ -3861,7 +3937,8 @@ CUL_HM_pushConfig($$$$$$$$)
my $peerN = ($peerAddr ne "000000")?CUL_HM_id2Name($peerAddr.$peerChn):""; my $peerN = ($peerAddr ne "000000")?CUL_HM_id2Name($peerAddr.$peerChn):"";
$peerN =~ s/broadcast//; $peerN =~ s/broadcast//;
$peerN =~ s/ /_/g;#remote blanks $peerN =~ s/ /_/g;#remote blanks
my $regLN = "RegL_".$list.":".$peerN; my $regLN = ((CUL_HM_getExpertMode($hash) eq "2")?"":".").
"RegL_".$list.":".$peerN;
#--- copy data from readings to shadow #--- copy data from readings to shadow
my $chnhash = $modules{CUL_HM}{defptr}{$dst.$chn}; my $chnhash = $modules{CUL_HM}{defptr}{$dst.$chn};
$chnhash = $hash if (!$chnhash); $chnhash = $hash if (!$chnhash);
@ -4769,6 +4846,21 @@ CUL_HM_setAttrIfCh($$$$)
<li><a href="#showtime">showtime</a></li> <li><a href="#showtime">showtime</a></li>
<li><a href="#loglevel">loglevel</a></li> <li><a href="#loglevel">loglevel</a></li>
<li><a href="#readingFnAttributes">readingFnAttributes</a></li> <li><a href="#readingFnAttributes">readingFnAttributes</a></li>
<li><a name="expert">expert</a><br>
This attribut controls the visibility of the readings. This attibute controlls
the presentation of device parameter in the readings.<br>
3 level can be choosen:<br>
<ul>
0_off: standart level. Display commonly used parameter<br>
1_on: enhanced level. Display all decoded device parameter<br>
2_full: display all parameter plus raw register information as well. <br>
</ul>
If expert is applied a device it is used for assotiated channels.
It can be overruled if expert attibute is also applied to the channel device.<br>
Make sure to check out attribut showInternalValues in the global values as well.
extert takes benefit of the implementation.
Nevertheless - by definition - showInternalValues overrules expert.
</li>
<li><a name="hmClass">hmClass</a>, <li><a name="hmClass">hmClass</a>,
<a name="model">model</a>, <a name="model">model</a>,
<a name="subType">subType</a><br> <a name="subType">subType</a><br>