[cul_hm] bugfix: falsche raw cmds bei "set regset" mit prep/exec erzeugen NACK

Begonnen von frank, 20 Oktober 2022, 10:51:25

Vorheriges Thema - Nächstes Thema

frank

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.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

frank

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
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

noansi

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

Gruß, Ansgar.