IODev Handling durch device

Begonnen von noansi, 20 April 2021, 21:11:14

Vorheriges Thema - Nächstes Thema

noansi

Das Thema ist  hier https://forum.fhem.de/index.php/topic,120603.msg1151486.html#msg1151486 neu eröffnet.

Hallo Rudolf,

ich hoffe, Du schaust hier mal rein.

Das Attribut IODev erfährt in fhem.pl in CommandAttr($$) (ab derzeit Zeile 3099) eine Sondernachbehandlung, um die Initialisierungsphase mit ungünsiger Definitionsreihenfolge "zu überstehen".

Wenn man das aber sebst handlen möchte/muss, dann stört diese Sonderbehandlung.
Ausweg ist derzeit nur, in der Attribut Funktion eine falsche Fehlermeldung zurück zu liefern, so dass Zeile 3096 mit next dafür sorgt, dass die Sonderbehandlung nicht durchgeführt wird.
    $ret = CallFn($sdev, "AttrFn", "set", $sdev, $attrName, $attrVal);
    delete($defs{$sdev}->{CL});
    if($ret) {
      push @rets, $ret;
      next;
    }

Leider wird dabei die falsche Fehlermeldung auch an den Aufrufer zurück geliefert, was unerwünscht ist. Sowohl beim FHEM Start, als auch beim händischen Setzen den Attributs.

Kannst Du damit leben, einen bestimmten Rückgabestring in der Zeile davor nicht auf das @rets array zu pushen und damit zu unterdrücken? Z.B. "IODev handled" oder "attr handled". Also so z.B.:
    $ret = CallFn($sdev, "AttrFn", "set", $sdev, $attrName, $attrVal);
    delete($defs{$sdev}->{CL});
    if($ret) {
      push @rets, $ret if ($ret ne "attr handled");
      next;
    }

Damit wird die falsche Fehlermeldung wird unterdrückt und das Handlen des attr Kommandos muss durch das jeweilige Modul erfolgen.

Natürlich gerne auch eine andere Alternative.

Grund ist ein Änderungsvorschlag für 10_CUL_HM.pm mit Bezug auf IODev und den Konflikten mit automatischer Zuweisung des IODev:
  elsif($attrName eq "IODev") {
    if ($cmd eq "set"){
      if ($attrVal) {
        if ($init_done) {
          return 'CUL_HM '.$name.': unknown IODev '.$attrVal.' specified'
              if (!defined($defs{$attrVal})); # noansi: resonable for a defined IO device only, real error to be reported
          $hash->{helper}{io}{restoredIO} = $attrVal; # noansi: first choice on next CUL_HM_assignIO
          CUL_HM_assignIO($hash);                     # noansi: try an assign
          delete($hash->{IODev}{'.clientArray'}) if (defined($hash->{IODev})); # Force a recompute
        }
        else {
          if (!$hash->{helper}{io}{restoredIO}) {                # noansi: do not overwrite restored data from IO, e.g. TSCUL
            $hash->{helper}{io}{restoredIO} = $attrVal;          # noansi: first choice on next CUL_HM_assignIO with vccu set till $init_done==1
            if (defined($defs{$attrVal})) {                        # noansi: resonable for a defined IO device only
              $attr{$name}{IODev}                     = $attrVal;  # noansi: first choice on next CUL_HM_assignIO with vccu not set
              @{$hash->{helper}{mRssi}{io}{$attrVal}} = (100,100); # noansi: set IO high rssi for first autoassign
              CUL_HM_assignIO($hash);                              # noansi: try an assign
              delete($hash->{IODev}{'.clientArray'}) if (defined($hash->{IODev})); # Force a recompute
            }
          }
        }
        if (defined($hash->{IODev}) && $hash->{IODev}{NAME} ne $attrVal) {
          DoTrigger('global', 'ATTR '.$name.' IODev '.$hash->{IODev}{NAME}, 1) if ($init_done);
          return 'attr handled'; # noansi: we return something to avoid fhem.pl to set $hash->{IODev} by it's own
                                 #         fhem.pl needs an adaption, not log/report it as "error"
                                 #         discussion started here https://forum.fhem.de/index.php/topic,120603.msg1151486.html#msg1151486
        }
      }
      else {
        return 'CUL_HM '.$name.': no IODev specified' if ($init_done); # noansi: real error to be reported
      }
    }
  }

Dabei stört die Nachbehandlung inklusive Setzen des Attributwertes durch CommandAttr($$).

Darf ich bitte Schreibrechte im FHEM Development Forumsbereich bekommen? Dann würde ich diesen Beitrag gerne dort platzieren und diskutieren.

Sollte es weitere Anwendungsfälle geben, dann wäre es eventuell noch nötig, sich Gedanken um die Nachbehandlung am Ende zu machen
    addStructChange("attr", $sdev, "$sdev $attrName $attrVal")
        if(!$opt{silent} && (!defined($oVal) || $oVal ne $attrVal));
    DoTrigger("global", "ATTR $sdev $attrName $attrVal", 1) if($init_done);

die mit dem Mini Patch von oben mangels $opt{silent} Information nicht vollständig im Modul umgesetzt werden kann.

Gruß und Danke,

Ansgar.

CoolTux

Hallo Ansgar,

Schreibrechte im Developer Bereich bekommst Du durch dir Gruppenmitgliedschaft Development.
Gehe zu Deinem Profil und dann auf Profileinstellungen -> Gruppenmitgliedschaft

Sobald Du Developer bist empfehle ich den Text noch mal im Developmentforum zu schreiben. Nicht verschieben, da bekommen wir keine Infomail.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

noansi

#2
Hallo CoolTux,

danke für den Hinweis und werde ich machen.

Edit: Danke und erledigt https://forum.fhem.de/index.php/topic,120603.msg1151486.html#msg1151486.

Gruß, Ansgar.