[cul_hm] patch: $hash{helper}{prt}{try} mechanismus macht probleme

Begonnen von frank, 10 Februar 2022, 13:26:36

Vorheriges Thema - Nächstes Thema

frank

hallo martin,

in CUL_HM_parseCommon() wird $hash{helper}{prt}{try} nach dem schreiben von registern gesetzt:
    if (   $devHlpr->{prt}{mmcS}
        && $devHlpr->{prt}{mmcS} == 3){
      # after write device might need a break
      # allow for wake types only - and if commands are pending
      $devHlpr->{prt}{try} = 1 if(CUL_HM_getRxType($mhp->{devH}) & 0x08 #wakeup
                                         && $mhp->{devH}{cmdStack});
      if ($success eq 'yes'){
        delete $devHlpr->{prt}{mmcA};
        delete $devHlpr->{prt}{mmcS};
      }
    };


ausgewertet wird der key nur in CUL_HM_respPendTout(), also bei einem "fehler":
    elsif ($pHash->{try}){         #send try failed - revert, wait for wakeup
      # device might still be busy with writing flash or similar
      # we have to wait for next wakeup
      unshift (@{$hash->{cmdStack}}, "++".substr($pHash->{rspWait}{cmd},6));
      delete $pHash->{try};
      CUL_HM_respPendRm($hash);# do not count problems with wakeup try, just wait
      CUL_HM_protState($hash,"CMDs_pending");
    }


dadurch bleibt der key weiterhin gesetzt, auch wenn der "try" erfolgreich ist.
irgendwann beim nächsten timeout, eventuell tage später, "stört" dann dieser code das "reguläre" timeout-handling.

ein erfolgreiches regset plus automatischem getconfig bei einem hm-cc-vd/virtueller-tc führt dann zb beim nächsten miss zum einschlafen des vd.


Zitat# after write device might need a break
ich habe jetzt versucht diesen kommentar umzusetzen, so dass der nächste erfolgreiche cmd ebenfalls den key {helper}{prt}{try} löscht. dazu habe ich 2 zusätzliche zeilen in CUL_HM_Parse eingefügt:

1. vor dem aufruf von CUL_HM_parseCommon:
  #----------start valid messages parsing ---------
  my $oldTry = ($mh{devH}->{helper}{prt}{try})? 1: 0;# frank: save old setting
  my $parse = CUL_HM_parseCommon($iohash,\%mh);


2. beim auswerten des returnwertes von CUL_HM_parseCommon:
  if   ($parse eq "ACK" ||
        $parse eq "done"   ){# remember - ACKinfo will be passed on
    delete $mh{devH}->{helper}{prt}{try} if($oldTry && $mh{devH}->{helper}{prt}{try});# frank: delete if the try cmd is successful
    push @evtEt,[$mh{devH},1,""];
  }



edit: eine hiermit gepatchte 10_cul_hm.pm befindet sich hier:
https://forum.fhem.de/index.php/topic,125667.msg1207217.html#msg1207217
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