Guten Morgen,
Ich habe in meinem Modul ein Attribut stehen, welches viele User sicherlich verwenden. Nun möchte ich bei einem Modulupdate und neustart von FHEM vom User dieses zugewiesene Attribut nachhaltig löschen ohne das es Meldungen beim User gibt, oder er noch mal SAVE drücken muss.
Ich habe hierfür einfach mal zu testzwecken innerhalb meiner DefFn ein deleteattr gemacht. Das funktioniert auch, aber bleibt nicht nachhaltig da die Attribut Zuweisung in der cfg erhalten bleibt, solange der User nicht ein SAVE macht.
Ein weiterer Versuch mit CommandDeleteAttr brachte gar kein löschen des Attributes nach einem neustart.
CommandDeleteAttr( undef, "$name setScreenBrightness");
setScreenBrightness ist der name des Attributes.
Wo liegt mein Fehler
Danke Euch
Grüße
Einfache Regel: Attribute gehören dem Benutzer, nicht dem Entwickler!
Du müsstest nach dem Löschen eines Attributes ein automatisches SAVE ausführen, um das persistent zu machen. Davon rate ich dringend ab!
Besserer Weg: Entferne das Attribut aus der Attributliste in der Initialize() dann gibt es spätestens beim nächsten Neustart eine Fehlermeldung und der User weiss Bescheid. Durch die Fehlermeldung passiert nix schlimmes und nach einem save ist das Attribut in der Konfiguration nicht mehr vorhanden.
Oder Du baust in die AttrFn() eine Logausgabe ein, dass dieses Attribut nicht mehr unterstützt wird und ignorierst das Attribut einfach. Das wäre der Lösungsweg, den ich in so einem Fall gehen würde. Und in einer späteren Version wird dann das Attribut aus der Attributliste gelöscht.
Zitat von: betateilchen am 04 Februar 2016, 08:58:38
Einfache Regel: Attribute gehören dem Benutzer, nicht dem Entwickler!
Besserer Weg: Entferne das Attribut aus der Attributliste in der Initialize() dann gibt es spätestens beim nächsten Neustart eine Fehlermeldung und der User weiss Bescheid. Durch die Fehlermeldung passiert nix schlimmes und nach einem save ist das Attribut in der Konfiguration nicht mehr vorhanden.
Oder Du baust in die AttrFn() eine Logausgabe ein, dass dieses Attribut nicht mehr unterstützt wird und ignorierst das Attribut einfach. Das wäre der Lösungsweg, den ich in so einem Fall gehen würde. Und in einer späteren Version wird dann das Attribut aus der Attributliste gelöscht.
Die einfache Regel gefällt mir. Werde ich mir merken.
Zitat
Besserer Weg: .... und nach einem save ist das Attribut in der Konfiguration nicht mehr vorhanden...
Ich habe auf meinem eigenen System genau so einen Fall. Für das Gerät selber gibt es ein Attribut nicht mehr. Ich bekomme jedesmal eine Meldung nach einem Neustart das das attribut nicht existiert. Aber selbst ein save hilft hier nicht. Interessanter Weise steht keinerlei Zuweisung für das Attribut im define des Devices.
Das nur kurz zu meiner Erfahrung
So nun zu Deinem AttrFn() Weg. Das scheint mit in der Tat der sauberste Weg zu sein. Aber ich verstehe nicht ganz wie das funktionieren soll. Die AttrFn() wird doch nur aufgerufen wenn ich veränderungen am Attribut vornehme. Aber das mache ich ja nicht. Oder wird die AttrFn auch bei einem Neustart aufgerufen weil ich da ja das Attribut auch setze?
Also so in etwa
sub AMAD_Attr(@) {
my ( $cmd, $name, $attrName, $attrVal ) = @_;
my $hash = $defs{$name};
my $orig = $attrVal;
if( $attrName eq "setScreenBrightness" ) {
if( $cmd eq "set" ) {
Log3 $name, 3, "AMAD ($name) - !!! Attention, the Attribut setScreenBrightness is absolete and will delete in the future";
}
}
Meinst Du damit so? Aber was meinst Du mit ignorieren? Meinst damit das ich innerhalb meines Codes im Modul nicht mehr auf das Attribut verweise oder Abfragen darauf mache?
Danke Dir für Deine Hilfe.
Grüße
ZitatEinfache Regel: Attribute gehören dem Benutzer, nicht dem Entwickler!
Die Formulierung gefaellt mir.
ZitatIch bekomme jedesmal eine Meldung nach einem Neustart das das attribut nicht existiert.
Das muesste man mit "attr global verbose 5" ud Neustart debuggen lassen.
Evtl. wird es von einem Modul angelegt, dann sollte der Maintainer benachrichtigt werden.
ZitatDie AttrFn() wird doch nur aufgerufen wenn ich veränderungen am Attribut vornehme
Ja, und Neustart ist equivalent mit manuelles Anlegen der Geraetes per define, und danach manuell alle Attribute einzeln setzen. Keine Magie also.
ZitatAber was meinst Du mit ignorieren?
Z.Bsp. Attribut aus AttrList nehmen. Dann gibt es eine Fehlermeldung, der (geneigte) Benutzer sucht danach per Google, und erfaehrt es hier irgendwo, dass das Attribut aus Grund XY entfernt wurde. Am besten steht das auch noch im CHANGED.
Zitat von: CoolTux am 04 Februar 2016, 09:13:58
Ich habe auf meinem eigenen System genau so einen Fall. Für das Gerät selber gibt es ein Attribut nicht mehr. Ich bekomme jedesmal eine Meldung nach einem Neustart das das attribut nicht existiert. Aber selbst ein save hilft hier nicht.
Dann setzt doch mal motd auf none :) Da steht die Fehlermeldung drin und bleibt dort solange, bis Du sie löscht.
Zu AttrFn()
Die Funktion wird immer ausgeführt, wenn irgendwann irgendwo der Befehl "attr ..." ausgeführt wird. Also auch beim Neustart, denn da werden ja zu sämtlichen Geräten die zugehörigen Attribute gesetzt, die in der Konfiguration gespeichert sind. Das gilt für setzen, löschen und auch bei verändern der Attributwerte.
Zitat von: CoolTux am 04 Februar 2016, 09:13:58
Meinst Du damit so? Aber was meinst Du mit ignorieren?
Ja, sowas meine ich. Wobei ich einen anderen Text wählen würde, so in der Art: "Hinweis: das Attribut <name> ist nicht mehr unterstützt. Bitte aus der Konfiguration löschen, um diesen Hinweis zu vermeiden."
Ignorieren: Es liegt doch an Dir als Entwickler, ob Du auf den Attributwert innerhalb Deines Modul-Codes überhaupt noch zugreifst.
Vielen Dank Euch beiden. Habe es nun so umgesetzt und werde im entsprechenden Forenthread eine Bemerkung dazu schreiben.
Am liebsten hätte ich ja was ROT Blinkendes. Man kennt ja seine Pappenheimer ;D
@ betateilchen. Soll ich wirklich auf Deutsch schreiben oder war das jetzt nur ein Beispiel in Deutsch was ich in englisch nehmen sollte. Laut Markus ist ja englisch die Verkehrssprache in FHEM. Deswegen soll ja englisch commandref sein aber deutsch muß nicht.
Zitat von: betateilchen am 04 Februar 2016, 11:15:33
Dann setzt doch mal motd auf none :) Da steht die Fehlermeldung drin und bleibt dort solange, bis Du sie löscht.
Du wirst lachen, aber da steht schon none drin bei mir.
Das attribute kommt vom Modul structure. Ich werde mir das noch mal in Ruhe anschauen mit intensiver Suche in der cfg.
Grüße
Zitat von: CoolTux am 04 Februar 2016, 11:25:40
@ betateilchen. Soll ich wirklich auf Deutsch schreiben
gerade weil man seine Pappenheimer kennt, würde ich das ausnahmsweise in Deutsch schreiben.
Sonst kommen die Pappenheimer wieder angerannt und beschweren sich über eine FEHLERmeldung...
Aber letztendlich ist die Auswahl der Sprache Dir überlassen. Vielleicht ja auch mehrsprachig in deutsch, englisch, arabisch
BTW: ist bei einem arabisch konfigurierten fhem die Navigationsleiste automatisch auf der rechten Seite? *duck-und-weg*
Zitat von: CoolTux am 04 Februar 2016, 11:25:40
Das attribute kommt vom Modul structure. Ich werde mir das noch mal in Ruhe anschauen mit intensiver Suche in der cfg.
ja, structure ist bezüglich Attributen "speziell" :) schau mal nach den globalen User-Attributen, da gibts Vererbungen, speziell bei structure
Zitat von: betateilchen am 04 Februar 2016, 11:58:49
ja, structure ist bezüglich Attributen "speziell" :) schau mal nach den globalen User-Attributen, da gibts Vererbungen, speziell bei structure
Danke Dir. Das schaue ich mir an. Eventuell finde ich da schon was.
Ich habe ja schon mit Englisch Probleme, da werde ich nicht noch auf den Kopf stehende Sprachen lernen. ;D
Zitatist bei einem arabisch konfigurierten fhem die Navigationsleiste automatisch auf der rechten Seite?
Nein, waere aber mit einem passenden .css einfach realisierbar.
Zitatist bei einem arabisch konfigurierten fhem die Navigationsleiste automatisch auf der rechten Seite?
Doch, doch. Gleichzeitig muss die Konfiguration des Monitors (ltr auf rtl) durch mechanische Drehung um 180°! geändert werden. Das wird mMn nach auch von vielen modulen unterstützt (Buchstaben fallen in diesem Fall nicht)
vg
joerg
Zitat von: herrmannj am 04 Februar 2016, 12:16:03
(Buchstaben fallen in diesem Fall nicht)
natürlich nicht... im Arabischen gibt es ja keine Buchstaben, dort werden die Schriftzeichen gemalt :)
Zitat von: betateilchen am 04 Februar 2016, 12:29:29
natürlich nicht... im Arabischen gibt es ja keine Buchstaben, dort werden die Schriftzeichen gemalt :)
zelebriert
Zitat von: CoolTux am 04 Februar 2016, 11:25:40Soll ich wirklich auf Deutsch schreiben oder war das jetzt nur ein Beispiel in Deutsch was ich in englisch nehmen sollte. Laut Markus ist ja englisch die Verkehrssprache in FHEM. Deswegen soll ja englisch commandref sein aber deutsch muß nicht.
Jetzt hast du den zweiten Markus der entschieden dieser Meinung ist ;)
Wenn du die Meldung ausgibst, solltest du das mindestens auf Englisch tun.
Wichtiger ist aber eigentlich, dass du im Forum einen Hinweis platzierst der den genauen Wortlaut enthält, so dass man über Google oder die Suche sofort zum richtigen Thema gelangt.
VG Markus
Hallo zweiter Markus,
Du bist Schuld ;D, wieso auc immer. Lach.
Eintrag im Forum habe ich gemacht. Den genauen Wortlaut werde ich noch hinzufügen. Zumindest wurden die User informiert. Englisch und Deutsch.
Ich danke allen für das Konstruktive Gespräch und Eure Hilfe.
Grüße
Marko