Das Thema ist hier https://forum.fhem.de/index.php/topic,120603.msg1151486.html#msg1151486 (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.
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
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 (https://forum.fhem.de/index.php/topic,120603.msg1151486.html#msg1151486).
Gruß, Ansgar.