hallo martin,
bei 1-chn-devices werden bei einer kombination von registern, die aus unterschiedlichen channels sind (chn0 und chn1), teilweise falsche raw cmds erstellt. dies führt zu einem NACK.
beispiel rhs fensterkontakt:eventDlyTime aus liste1 in chn1 und transmDevTryMax aus liste0 in chn0.
der letzte channel aus dem exec cmd legt auch für alle prep cmds den channel fest.
Zitat2022.10.19 16:05:03.451 3 : CUL_HM set RHS02 regSet prep eventDlyTime 1
2022.10.19 16:05:03.453 3 : CUL_HM set RHS02 regSet exec transmDevTryMax 5
cmdStack:
++A0011ACE1F196BD800050000000000
++A0011ACE1F196BD800081405
++A0011ACE1F196BD80006
++A0011ACE1F196BD800050000000001
++A0011ACE1F196BD800082101
++A0011ACE1F196BD80006
in CUL_HM_pushConfig() müssen in der foreach schleife also die chn für jedes prep neu berechnet werden.
es gibt schon einen schnellen fix von ansgar (2 zeilen ergänzen):
Zitat von: noansi am 20 Oktober 2022, 23:02:45
Ja, nicht neu berechnen, sondern merken in einem Zusatzhelper in CUL_HM_pushConfig(), genau wie die shadowRegs.
$sdH->{helper}{shadowReg}{$regLNp} = $regs; # update shadow
$sdH->{helper}{shadowRegChn}{$regLNp} = $chn; #noansi: save chn for later use, even with prep
# Log 0,"CUL_HM_pushConfig $regs";
my @changeList;
if ($prep eq "exec"){#update complete registerset
@changeList = keys%{$sdH->{helper}{shadowReg}};
}
elsif ($prep eq "prep"){
return; #prepare shadowReg only. More data expected.
}
else{
push @changeList,$regLNp;
}
my $changed = 0;# did we write
foreach my $nrn(@changeList){
my $change;
my $nrRd = ReadingsVal($chnhash->{NAME},$regPre.$nrn,"");
foreach (sort split " ",$sdH->{helper}{shadowReg}{$nrn}){
$change .= $_." " if ($nrRd !~ m/$_/);# filter only changes
}
next if (!$change);#no changes
$change =~ s/00:00//;
$change =~ s/(\ |:)//g;
if ($nrRd){
$chnhash->{READINGS}{$regPre.$nrn}{VAL} =~ s/00:00//; #mark incomplete as we go for a change;
}
my $pN;
$changed = 1;# yes, we did
($list,$pN) = ($1,$2) if($nrn =~ m/RegL_(..)\.(.*)/);
if ($pN){($peerAddr,$peerChn) = unpack('A6A2', CUL_HM_name2Id($pN,$hash));}
else {($peerAddr,$peerChn) = ('000000','00');}
if (AttrVal($chnhash->{NAME},"peerIDs","") =~ m/${peerAddr}00/){$peerChn = "00"}# if device we are not sure about device or channel. Check peers
CUL_HM_updtRegDisp($hash,$list,$peerAddr.$peerChn);
############partition
# my @chSplit = unpack('(A28)*',$change);
$chn = $sdH->{helper}{shadowRegChn}{$nrn}; #noansi: use correct chn
my @chSplit = unpack('(A1120)*',$change);# makes max 40 lines, 280 byte
Hallo Martin,
und ein paar Zeilen tiefer in CUL_HM_pushConfig() ist $chn wohl durch $mch zu ersetzen, wie Frank auch aufgefallen ist.
for (my $l = 0; $l < $tl; $l+=28) {
my $ml = $tl-$l < 28 ? $tl-$l : 28;
CUL_HM_PushCmdStack($hash, '++A001'.$src.$dst.$mch.'08'. #Frank: must it be $mch instead of $chn? noansi: for HM-CC-RT-DN also $mch works but in both cases 00 is used for chn
substr($chSpl,$l,$ml));
}
CUL_HM_PushCmdStack($hash,'++A001'.$src.$dst.$mch.'06');
siehe auch hier https://forum.fhem.de/index.php/topic,24436.msg1240661.html#msg1240661 (https://forum.fhem.de/index.php/topic,24436.msg1240661.html#msg1240661)
Gruß, Ansgar.