Autor Thema: Attribut-Liste instanzabhängig zur Laufzeit ändern  (Gelesen 2600 mal)

Offline Damian

  • Developer
  • Hero Member
  • ****
  • Beiträge: 6549
Attribut-Liste instanzabhängig zur Laufzeit ändern
« am: 17 März 2018, 22:21:49 »
Lässt sich die Attributliste zum Definitionszeitpunkt eines Moduls unterschiedlich vorbelegen?

Hintergrund: Das DOIF-Modul bekommt einen neuen Perl-Modus, der aufgrund der Definition erkannt wird. Für diesen sind nur bestimmte Attribute sinnvoll.
« Letzte Änderung: 17 März 2018, 22:23:40 von Damian »
Programmierte FHEM-Module: DOIF mit uiTable, DOIF-Perl, THRESHOLD, FHEM-Befehl: IF

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 20891
Antw:Attribut-Liste instanzabhängig zur Laufzeit ändern
« Antwort #1 am: 18 März 2018, 10:04:58 »
Nein, Attribute sind zZt. modulspezifisch, und nicht instanzspezifisch.

Ich vermute, dass es ohne grossen Aufwand optional instanzspezifisch gemacht werden kann, aber es wird dann alles wieder etwas komplizierter. Deswegen: erst nachdem noch ein Entwickler sich dafuer ausspricht, baue ich es ein.

Offline Damian

  • Developer
  • Hero Member
  • ****
  • Beiträge: 6549
Antw:Attribut-Liste instanzabhängig zur Laufzeit ändern
« Antwort #2 am: 18 März 2018, 10:30:31 »
Nein, Attribute sind zZt. modulspezifisch, und nicht instanzspezifisch.

Ich vermute, dass es ohne grossen Aufwand optional instanzspezifisch gemacht werden kann, aber es wird dann alles wieder etwas komplizierter. Deswegen: erst nachdem noch ein Entwickler sich dafuer ausspricht, baue ich es ein.

OK. Danke für die Info - das habe ich schon vermutet.

Dann muss ich wohl in der Doku aufnehmen, welche Attribute im neuen Perl-Modus sinnvoll anwendbar sind.
Programmierte FHEM-Module: DOIF mit uiTable, DOIF-Perl, THRESHOLD, FHEM-Befehl: IF

Offline klaus.schauer

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1052
Antw:Attribut-Liste instanzabhängig zur Laufzeit ändern
« Antwort #3 am: 18 März 2018, 11:45:43 »
Es wäre schon sinnvoll, wenn die Attributliste eines Devices typenabhängig - subtype und /oder model - individuell und zur Laufzeit angelegt und geändert werden könnte. Für EnOcean gibt es zwischenzeitlich insgesamt mehr als 100 Attribute. Welches für das jeweilige Device tatsächlich genutzt wird, versuche ich in der commandref zu beschreiben. Sicherlich nicht der beste Weg.

Zudem sind zunehmend herstellerspezifische Besonderheiten zu berücksichtigen, deren Parameter dann aus XML-Beschreibungen nachgeladen werden sollen.

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 19341
Antw:Attribut-Liste instanzabhängig zur Laufzeit ändern
« Antwort #4 am: 18 März 2018, 12:09:05 »
instanz spezifische attribute wären gut und nützlich.

aktuell kann man sich mit addToDevAttrList behelfen. eine richtige lösung wäre aber besser.

aber bitte nicht in einer hauruck aktion die nur halb gar ist und selbst mit mehrmaligem nachbessern nicht wirklich gut wird.

wenn an dem attributen etwas geändert wird dann bitte unter anderem auch die anderen punkte aus dem thread zu attribut gruppen mit berücksichtigen.
FHEM5.4,DS1512+,2xCULv3,DS9490R,HMLAN,2xRasPi
CUL_HM:HM-LC-Bl1PBU-FM,HM-LC-Sw1PBU-FM,HM-SEC-MDIR,HM-SEC-RHS
HUEBridge,HUEDevice:LCT001,LLC001,LLC006,LWL001
OWDevice:DS1420,DS18B20,DS2406,DS2423
FS20:fs20as4,fs20bs,fs20di
AKCP:THS01,WS15
CUL_WS:S300TH

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 20891
Antw:Attribut-Liste instanzabhängig zur Laufzeit ändern
« Antwort #5 am: 18 März 2018, 12:40:20 »
Zitat
aber bitte nicht in einer hauruck aktion die nur halb gar ist und selbst mit mehrmaligem nachbessern nicht wirklich gut wird.
Ich wollte getAllAttr aendern, und hier erst nach $defs{$d}{AttrList} fragen, und falls nicht gesetzt, dann (wie bisher) nach $modules{...}{AttrList}

Zitat
wenn an dem attributen etwas geändert wird dann bitte unter anderem auch die anderen punkte aus dem thread zu attribut gruppen mit berücksichtigen.
Das ist auch noch auf meiner TODO-Liste, da es aber was groesseres ist, schiebe ich es gerne nach hinten.

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 20891
Antw:Attribut-Liste instanzabhängig zur Laufzeit ändern
« Antwort #6 am: 18 März 2018, 22:54:41 »
Ich habe getAllAttr leicht angepasst, so dass (falls existiert) $defs{$d}{".AttrList"} statt $modules{...}{AttrList} genomen wird.
Ich habe die hidden Variante gewaehlt, weil ich die Anzeige nicht unnoetig aendern wollte.

Offline Damian

  • Developer
  • Hero Member
  • ****
  • Beiträge: 6549
Antw:Attribut-Liste instanzabhängig zur Laufzeit ändern
« Antwort #7 am: 19 März 2018, 19:20:17 »
Ich habe getAllAttr leicht angepasst, so dass (falls existiert) $defs{$d}{".AttrList"} statt $modules{...}{AttrList} genomen wird.
Ich habe die hidden Variante gewaehlt, weil ich die Anzeige nicht unnoetig aendern wollte.

Ich habe es eingebaut, scheint zu funktionieren. Getestet: Auswahl der Attribute im WEB-Browser (auch beim Wechseln des Zustands des Moduls zur Laufzeit).

Wäre es nicht besser solche Features über Funktionsaufrufe zu kapseln. Bisher habe ich das Patchen von $defs gemieden.
Programmierte FHEM-Module: DOIF mit uiTable, DOIF-Perl, THRESHOLD, FHEM-Befehl: IF

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 20891
Antw:Attribut-Liste instanzabhängig zur Laufzeit ändern
« Antwort #8 am: 20 März 2018, 22:15:51 »
Zitat
Wäre es nicht besser solche Features über Funktionsaufrufe zu kapseln. Bisher habe ich das Patchen von $defs gemieden.
Dein Wunsch...
fhem> attr d ?
d: unknown attribute ?, choose one of alias comment:textField-long eventMap:textField-long group room suppressReading userReadings:textField-long verbose:0,1,2,3,4,5 readingList setList useSetExtensions disable disabledForIntervals event-on-change-reading event-on-update-reading event-aggregator event-min-interval stateFormat:textField-long timestamp-on-change-reading oldreadings cmdIcon devStateIcon devStateStyle icon sortby webCmd webCmdLabel:textField-long widgetOverride userattr
fhem> { setDevAttrList("d", "a b c") }
a b c
fhem> attr d ?
d: unknown attribute ?, choose one of alias comment:textField-long eventMap:textField-long group room suppressReading userReadings:textField-long verbose:0,1,2,3,4,5 a b c cmdIcon devStateIcon devStateStyle icon sortby webCmd webCmdLabel:textField-long widgetOverride userattr
fhem> { setDevAttrList("d") }
a b c
fhem> attr d ?
d: unknown attribute ?, choose one of alias comment:textField-long eventMap:textField-long group room suppressReading userReadings:textField-long verbose:0,1,2,3,4,5 readingList setList useSetExtensions disable disabledForIntervals event-on-change-reading event-on-update-reading event-aggregator event-min-interval stateFormat:textField-long timestamp-on-change-reading oldreadings cmdIcon devStateIcon devStateStyle icon sortby webCmd webCmdLabel:textField-long widgetOverride userattr
fhem>

Offline Damian

  • Developer
  • Hero Member
  • ****
  • Beiträge: 6549
Antw:Attribut-Liste instanzabhängig zur Laufzeit ändern
« Antwort #9 am: 20 März 2018, 23:20:43 »
Dein Wunsch...
fhem> attr d ?
d: unknown attribute ?, choose one of alias comment:textField-long eventMap:textField-long group room suppressReading userReadings:textField-long verbose:0,1,2,3,4,5 readingList setList useSetExtensions disable disabledForIntervals event-on-change-reading event-on-update-reading event-aggregator event-min-interval stateFormat:textField-long timestamp-on-change-reading oldreadings cmdIcon devStateIcon devStateStyle icon sortby webCmd webCmdLabel:textField-long widgetOverride userattr
fhem> { setDevAttrList("d", "a b c") }
a b c
fhem> attr d ?
d: unknown attribute ?, choose one of alias comment:textField-long eventMap:textField-long group room suppressReading userReadings:textField-long verbose:0,1,2,3,4,5 a b c cmdIcon devStateIcon devStateStyle icon sortby webCmd webCmdLabel:textField-long widgetOverride userattr
fhem> { setDevAttrList("d") }
a b c
fhem> attr d ?
d: unknown attribute ?, choose one of alias comment:textField-long eventMap:textField-long group room suppressReading userReadings:textField-long verbose:0,1,2,3,4,5 readingList setList useSetExtensions disable disabledForIntervals event-on-change-reading event-on-update-reading event-aggregator event-min-interval stateFormat:textField-long timestamp-on-change-reading oldreadings cmdIcon devStateIcon devStateStyle icon sortby webCmd webCmdLabel:textField-long widgetOverride userattr
fhem>

OK. Ich habe es ins DOIF-Modul eingebaut.
Programmierte FHEM-Module: DOIF mit uiTable, DOIF-Perl, THRESHOLD, FHEM-Befehl: IF

Offline Phill

  • Developer
  • Full Member
  • ****
  • Beiträge: 409
  • Langsam wird'n Schuh d'raus.
    • iVDR
Antw:Attribut-Liste instanzabhängig zur Laufzeit ändern
« Antwort #10 am: 21 März 2018, 09:00:26 »
Das heißt es gibt jetzt:
Zitat
sub addToDevAttrList($$);
sub setDevAttrList($;$);

welche unterschiedliche Speicherorte verwenden.
addTo... bearbeitet das Attribut userattr des Devices.
set... setzt das Internal .AttrList
Das ist verwirrend.

Eigentlich füllt addToDevAttr in meinem Patch der Attributgruppen schon nicht mehr userattr, sondern erzeugt ein verstecktes Attribut AttrList.
Sollte man aber trotzdem nicht über einen Kamm scheren, da die Anwendung der Funktionen unterschiedlich ist.   
addTo... (aktuell userattr) wird ja von diversen Modulen (structure) dafür verwendet Attribute devicespezifisch zu setzen.
set... Soll die Attribute des Modul während der Laufzeit ändern. Das ist aber mit dem Attributgruppenpatch auch leicht umsetzbar.

Wie gesagt der Funktionsname geht m.M.n. nicht. Bitte nochmal überdenken. Vorschlag: setModAttrList ?

Sorry das ich erst hinterher damit ankomme... Habe das vorher nicht so ganz überrissen.
« Letzte Änderung: 21 März 2018, 09:03:24 von Phill »
Homebrew 1-Wire / HomeMatic Mix - Cubietruck mit FHEM als Server - Raspberry PI 3 als Informationsanzeige im MagicMirror Stil - Raspberry Pi 1 als Klingelanlage - VDR

Mein Modul: Talk2Fhem - Mein Tipp: https://forum.fhem.de/index.php/topic,82442.0.html

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 20891
Antw:Attribut-Liste instanzabhängig zur Laufzeit ändern
« Antwort #11 am: 21 März 2018, 11:02:55 »
Zitat
Wie gesagt der Funktionsname geht m.M.n. nicht. Bitte nochmal überdenken. Vorschlag: setModAttrList ?
Verstehe ich nicht: setModAttrList suggeriert, dass man damit die Liste fuer das Modul setzen kann, in diesem Fall setze ich aber die Geraetespezifische Liste.

Offline Phill

  • Developer
  • Full Member
  • ****
  • Beiträge: 409
  • Langsam wird'n Schuh d'raus.
    • iVDR
Antw:Attribut-Liste instanzabhängig zur Laufzeit ändern
« Antwort #12 am: 21 März 2018, 11:22:11 »
Ja das suggeriert es wirklich. Aber die Funktion bekommt ja als Parameter nicht den Modulhash sonder den Devicehash.

Problem ist ja, dass es jetzt 2 gerätespeziefische Attributlisten gibt. Und mit setDevAttrList überschreibt man im Endeffekt die Modulattribute des Gerätes und nicht die ursprüngliche DevAttrList (userattr) die mit addToDevAttrList bearbeitet wird.

Mir fällt da noch replaceModAttrList ein.

EDIT: Was auch nicht behandelt ist, wenn ein Attribut gesetzt wurde welche dann später vom Modul über "setDevAttrList" gelöscht wird, entsteht ein totes Attribut was nicht mehr gelöscht werden kann, aber weiterhin angezeigt wird. Gibt dann einen Fehler beim Neustart bis einmal gespeichert wird.
« Letzte Änderung: 21 März 2018, 11:38:38 von Phill »
Homebrew 1-Wire / HomeMatic Mix - Cubietruck mit FHEM als Server - Raspberry PI 3 als Informationsanzeige im MagicMirror Stil - Raspberry Pi 1 als Klingelanlage - VDR

Mein Modul: Talk2Fhem - Mein Tipp: https://forum.fhem.de/index.php/topic,82442.0.html

Offline Damian

  • Developer
  • Hero Member
  • ****
  • Beiträge: 6549
Antw:Attribut-Liste instanzabhängig zur Laufzeit ändern
« Antwort #13 am: 21 März 2018, 18:29:24 »
Da ich mein Modul mit setDevAttrList einchecke, sollte es nicht mehr geändert werden.
Programmierte FHEM-Module: DOIF mit uiTable, DOIF-Perl, THRESHOLD, FHEM-Befehl: IF

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 20891
Antw:Attribut-Liste instanzabhängig zur Laufzeit ändern
« Antwort #14 am: 22 März 2018, 10:19:34 »
Zitat
Mir fällt da noch replaceModAttrList ein.
Du hast Recht damit, dass setDevAttrList u.U. falsche Assoziationen hervorrufen kann, allerdings ist replaceModAttrList auch nicht besser (man koennte Annehmen, dass sie $modules{XXX}{AttrList} setzt), und  Funktionsnamen, die laenger als eine Zeile sind, sind auch keine Loesung. Wer diese Funktion verwenden will (und das ist eher die Ausnahme), der moege bitte nachlesen, wozu sie gut ist. setDevAttrList bleibt bis auf Weiteres.

Offline Phill

  • Developer
  • Full Member
  • ****
  • Beiträge: 409
  • Langsam wird'n Schuh d'raus.
    • iVDR
Antw:Attribut-Liste instanzabhängig zur Laufzeit ändern
« Antwort #15 am: 22 März 2018, 15:25:18 »
Ok. Vielleicht sehe ich das auch zu drastisch.

Nur soll der Entwickler darauf achten, das die ignorierten Attribute nicht bereits existieren.

Gruß
Homebrew 1-Wire / HomeMatic Mix - Cubietruck mit FHEM als Server - Raspberry PI 3 als Informationsanzeige im MagicMirror Stil - Raspberry Pi 1 als Klingelanlage - VDR

Mein Modul: Talk2Fhem - Mein Tipp: https://forum.fhem.de/index.php/topic,82442.0.html

Offline HomeAuto_User

  • Developer
  • Sr. Member
  • ****
  • Beiträge: 574
Antw:Attribut-Liste instanzabhängig zur Laufzeit ändern
« Antwort #16 am: 11 September 2019, 17:29:26 »
Hallo,

ich stieß soeben auf die Funktion

setDevAttrList
Ich habe diese mal ausprobiert und in mein Testmodul eingebaut.
Eine Frage hätte ich diesbezüglich.

Wie kann ich zur Laufzeit modifizierte Attribute, welche mit der Funktion erstellt werden und deren Wert in der fhem.cfg speichern wieder abrufen nach einem FHEM restart?
Die Werte bleiben in der cfg gespeichert aber wenn ich die Attribute erst wieder jedes mal neu erstelle, lesen diese ja nicht die Konfiguration aus der cfg aus.

Gibt es da einen Trick oder überrsehe ich dort etwas?

MfG und Danke im Vorraus.
« Letzte Änderung: 11 September 2019, 18:46:49 von HomeAuto_User »
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: 3x FHT 80b | 5x FHT 80 TF-2 | 2x S300TH | 1x WS7000-20 | 5x "Hideki" | THR128 und andere ;-)

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 19341
Antw:Attribut-Liste instanzabhängig zur Laufzeit ändern
« Antwort #17 am: 11 September 2019, 17:32:29 »
mit AttrVal. wie jedes andere attribut auch.
FHEM5.4,DS1512+,2xCULv3,DS9490R,HMLAN,2xRasPi
CUL_HM:HM-LC-Bl1PBU-FM,HM-LC-Sw1PBU-FM,HM-SEC-MDIR,HM-SEC-RHS
HUEBridge,HUEDevice:LCT001,LLC001,LLC006,LWL001
OWDevice:DS1420,DS18B20,DS2406,DS2423
FS20:fs20as4,fs20bs,fs20di
AKCP:THS01,WS15
CUL_WS:S300TH

 

decade-submarginal