CommandDeleteAttr und Change History bei nicht gesetzten Attributen

Begonnen von noansi, 09 März 2024, 20:51:48

Vorheriges Thema - Nächstes Thema

noansi

Hallo Rudolf,

in der fhem.pl in CommandDeleteAttr($$) wird mit
    if(@a == 1) { # Delete all attributes of a device
      delete($attr{$sdev});

    } else { # delete specified attribute(s)
      if(defined($attr{$sdev})) {
        map { delete($attr{$sdev}{$_}) if($_ =~ m/^$a[1]$/) }
            keys %{$attr{$sdev}};
      }

    }
    addStructChange("deleteAttr", $sdev, join(" ", @a)) if(!$opt{silent});
    DoTrigger("global", "DELETEATTR ".join(" ",@a), 1) if($init_done);

die Change History geändert, auch wenn das Attribut/die Atrribute zuvor gar nicht gesetzt ist/sind.

Mit z.B.
    my $attrdeleted = 0;
    if(@a == 1) { # Delete all attributes of a device
      $attrdeleted |= int(keys %{$attr{$sdev}});
      delete($attr{$sdev});
    }
    else { # delete specified attribute(s)
      map { if($_ =~ m/^$a[1]$/) {$attrdeleted |= 1; delete($attr{$sdev}{$_});} }
        keys %{$attr{$sdev}};
    }
    if($attrdeleted) { #noansi: on delete of existing attribute(s) only
      addStructChange('deleteAttr', $sdev, join(' ', @a)) if(!$opt{silent});
      DoTrigger('global', 'DELETEATTR '.join(' ',@a), 1) if($init_done);
    }
liesse sich das mit wenig Aufwand verhindern und auch die damit verbundenen unnötigen Trigger.

Kommt vor, wenn man sich vertippt oder auch wenn man eine User config hat, in der auch Sammel-Aufräumcode für Attribute vorhanden ist, die gelöscht werden sollen, sofern sie vorhanden sind.
Deswegen hatte ich bisher nach jedem fhem Start direkt und unnötig das rote Fragezeichen.

Gruß, Ansgar.

rudolfkoenig

Mit der vorgeschlagenen Variante waere ich wiederum verwirrt, weil das was ich eingetippt habe, nicht in der Liste auftaucht.

Das rote Fragezeichen ist mit -silent einfach zu vermeiden, und ein Event ist mAn zu verschmerzen.

betateilchen

Zitat von: rudolfkoenig am 11 März 2024, 11:49:20Mit der vorgeschlagenen Variante waere ich wiederum verwirrt, weil das was ich eingetippt habe, nicht in der Liste auftaucht.

Das würde mich auch verwirren, weil es unlogisch wäre.

Auch das Anlegen eines vorher nicht vorhandenen Attributes ist schließlich eine Änderung an der Konfiguration.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

noansi

ZitatMit der vorgeschlagenen Variante waere ich wiederum verwirrt, weil das was ich eingetippt habe, nicht in der Liste auftaucht.
Verstehe ich.

Andererseits verstehe ich aus dem Wiki das rote Fragezeichen weniger als History der eingegebenen Befehle, sondern als Hinweis auf Änderungen an der config, die noch zu speichern wären.

Würde Dir noch eine zusätzliche Warnrückgabe "attribute xxx not set, delete not possible" fehlen? (kein Feature Request, weil es in einer Fehlermeldungsinterpretation statt Warnung enden und vermutlich zu zugemüllten Logs führen würde)
Ebenso wäre denkbar, dass das Fragezeichen rot oder grün werden könnte, je nachdem ob speichernswerte Änderungen stattgefunden haben oder nur nicht ändernde "Änderungsbefehle" abgesetzt wurden. Der nötige Aufwand wäre mir so eine Kennzeichnung jetzt nicht wert, also kein Feature Request.

ZitatAuch das Anlegen eines vorher nicht vorhandenen Attributes ist schließlich eine Änderung an der Konfiguration.
Es geht um das Löschen zuvor nicht gesetzter Attribute -> keine Änderung, da kein Löschvorgang stattfindet

Gruß, Ansgar.