FHEM Forum

FHEM - Hausautomations-Systeme => Homematic => Thema gestartet von: frank am 10 Februar 2022, 13:26:36

Titel: [cul_hm] patch: $hash{helper}{prt}{try} mechanismus macht probleme
Beitrag von: frank am 10 Februar 2022, 13:26:36
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 (https://forum.fhem.de/index.php/topic,125667.msg1207217.html#msg1207217)