FHEM Forum

FHEM - Entwicklung => Wunschliste => Thema gestartet von: jw2013 am 21 Januar 2024, 21:42:38

Titel: Best Practice: FUUID vs. IODev
Beitrag von: jw2013 am 21 Januar 2024, 21:42:38
Ich hätte eine generelle Frage zu FHEM Modulen, welche über ein gemeinsames Gateway-Modul laufen, so wie bei Homematic-Wired oder Modbus-RTU.

In dem Modul für Homematic-Wired findet die Verknüpfung von Gerät zu Gateway über IODev statt, die Verknüpfung von Kanal zu Gerät hingegen über den Namen. Bei den Modbus-RTU Modulen findet die Verknüpfung ebenfalls über IODev statt.

Dann wurde irgendwann FUUID eingeführt. Sollten neue Module derartige Verknüpfungen bevorzugt über FUUIDs implementieren, oder bleibt das Attribut 'IODev' Mittel der Wahl?

Leider finde ich dazu weder im Wiki noch im Forum eine Antwort.
Die Frage gehört evtl. eher in das "FHEM Development" Board, ich darf dort aber nicht posten.
Titel: Aw: Best Practice: FUUID vs. IODev
Beitrag von: betateilchen am 21 Januar 2024, 21:50:52
Die FUUID wurde meines Wissens nach nicht für den von Dir skizzierten Zweck eingeführt.
Dafür ist die FUUID einfach auch nicht robust genug.

Verknüpfungen zwischen Geräten und Gateways sollten immer über IODev hergestellt werden, dafür stellt FHEM intern auch geeignete Funktionen bereit, die zuverlässig arbeiten und z.B. auch Reihenfolgeprobleme bei der Zuordnung lösen.
Titel: Aw: Best Practice: FUUID vs. IODev
Beitrag von: jw2013 am 22 Januar 2024, 00:49:21
Danke, genau das wollte ich wissen!

Zitat von: betateilchen am 21 Januar 2024, 21:50:52Dafür ist die FUUID einfach auch nicht robust genug.

Was genau ist mit "nicht robust genug" gemeint? Kann sich die FUUID ändern oder verloren gehen?
Titel: Aw: Best Practice: FUUID vs. IODev
Beitrag von: betateilchen am 22 Januar 2024, 14:39:45
Zitat von: jw2013 am 22 Januar 2024, 00:49:21Kann sich die FUUID ändern oder verloren gehen?

Natürlich, da kann man reinschreiben, was man will:

Internals:
   FUUID      heute_ist_ein_schoener_tag
   NAME       d1
   NR         90
   STATE      ???
   TYPE       dummy
Attributes:

Dafür gibt es sogar einen Befehl:

{$init_done = 0;; fhem('setuuid d1 blub')}

Ergebnis:

Internals:
   FUUID      blub
   NAME       d1
   NR         90
   STATE      ???
   TYPE       dummy
Attributes:
Titel: Aw: Best Practice: FUUID vs. IODev
Beitrag von: jw2013 am 22 Januar 2024, 18:05:33
Hab verstanden:

FUUID nicht als interne Referenz auf andere Geräte oder Gateways verwenden, sondern nur als anonymisierte ID zur Erfüllung externer {Verknüpfungs|Tracking}-Anforderungen.

Quasi die /etc/machine-id von FHEM Defs ;-)
Titel: Aw: Best Practice: FUUID vs. IODev
Beitrag von: Wernieman am 22 Januar 2024, 18:33:35
Ist es nicht eher, damit die FUUID gleich bleibt, wenn der Name sich ändert? Also wenigstens "eine" feste Größe zu haben?
Titel: Aw: Best Practice: FUUID vs. IODev
Beitrag von: betateilchen am 22 Januar 2024, 19:10:12
Es ist wie bei einer ganzen Reihe anderer "Relikte" in FHEM:

An sich war es vor (ziemlich genau fünf Jahren) eine gute und fortschrittliche Idee, aber halbherzig umgesetzt, unzuverlässig und deshalb nicht wirklich sinnvoll nutzbar.

Wer sich für die Geschichte interessiert:
https://forum.fhem.de/index.php?topic=95902.0
Titel: Aw: Best Practice: FUUID vs. IODev
Beitrag von: jw2013 am 22 Januar 2024, 19:25:00
Ich warte dann mal noch mit dem Umschreiben meiner Module... ;D

(Da steh' ich nun, ich armer Tor...)

Hintergrund der Frage:
Ich hatte vor längerer Zeit ein Framework für verdrahtete Messeinrichtungen geschrieben, und mich vom Aufbau an dem für Modbus orientiert. Also IODdev Attribut verweist auf das M-BUS Gateway, und irgendwie passt das so auch ganz gut.

Später kamen dann noch Module für verschiedene Wiegand-Controller (RFID/PIN Türsteuerung) dazu. Weil ich zwischenzeitlich über die Existenz von FUUIDs erfahren hatte, sind die dort notwendigen Objekte (Türen, Berechtigungen, Alarme etc.) über ebendiese mit dem Controller-Gerät verknüpft, statt über IODev.

Schaut dann z.B. so aus:

defmod DoorControlRoom AOPU_AccessController 649ca73a-f33f-62d6-ea28-df6af68686df288e door 2


'AOPU_AccessController' wäre der Modul-Name, '649ca73a-f33f-62d6-ea28-df6af68686df288e' die FUUID vom eigentlichen Controller, 'door' die Entity-Klasse, und '2' der Index der Tür im Controller.

Das sind also im eigentlichen Sinne keine weiteren Geräte an einem Gateway, sondern Kanäle(?) des Controllers selbst. Also ähnlich den Kanälen bei den Homematic-Wired Geräten.

Bevor ich jetzt weiteren Code schreibe und freigebe, würde ich gerne alles auf einen sauberen Stand bringen.
Titel: Aw: Best Practice: FUUID vs. IODev
Beitrag von: jw2013 am 23 Januar 2024, 12:35:03
Zitat von: betateilchen am 22 Januar 2024, 19:10:12An sich war es vor (ziemlich genau fünf Jahren) eine gute und fortschrittliche Idee, aber halbherzig umgesetzt, unzuverlässig und deshalb nicht wirklich sinnvoll nutzbar.

Wer sich für die Geschichte interessiert:
https://forum.fhem.de/index.php?topic=95902.0 (https://forum.fhem.de/index.php?topic=95902.0)

Den Beitrag hatte ich damals schon gelesen, für eine gute Idee gehalten, und angefangen, FUUIDs zu verwenden.
Sehe aber auch, dass die Verwendung in 'offiziellen' Modulen recht mager ausfällt...

Warum schreibst Du, die wären unzuverlässig und deshalb nicht wirklich sinnvoll nutzbar? Gehts es nur um die von Dir gezeigte Änderungsmöglichkeit über setuuid, oder gibt es weitere Probleme, bzw. Pläne FUUIDs wieder zu entfernen?

Zitat von: Wernieman am 22 Januar 2024, 18:33:35Ist es nicht eher, damit die FUUID gleich bleibt, wenn der Name sich ändert? Also wenigstens "eine" feste Größe zu haben?

Genau sowas hatte ich auch erhofft. Um beim Beispiel der Zugriffs-Verwaltung zu bleiben: Beim dem Wiegand-Controller können z.B. 30000 Benutzer (RFIDs) angelegt werden, die werden in FHEM als einzelne Defs geführt.
Bei jedem Rename vom Controller-Objekt müssten dann alle assoziierten Objekte geupdated werden (z.B. Update auf IODev Attribut). Bei der Verwendung von FUUIDs hingegen betrifft es die assoziierten Objekte erstmal nicht.

Andere Überlegung, anhand von Datenbank-Tabellen:
Meistens beginnt man ja mit "int AUTOINCREMENT" etc. als Primärschlüssel.
Je nach Anwendung ersetzt man das "int" aber gegen eine UUID, da besser für DB-Cluster und DB-Sharding, nicht fortlaufend, sinnvoll für Datenschutz etc.

Die Daten in den restlichen Spalten jeder Zeile können jederzeit geändert werden, der Primärschlüssel bleibt (idR) fix.

Selbst wenn es Spalten gibt (z.B. email_address), welche als UNIQUE deklariert sind, würde man für Referenzen immer ein anderes Feld als Primary Key bevorzugen, sofern vorgesehen ist, dass sich die Daten in der UNIQUE deklarierten Spalten ändern können.

Macht das für Euch Sinn, was ich schreibe?
Titel: Aw: Best Practice: FUUID vs. IODev
Beitrag von: M.Schulze am 24 Januar 2024, 11:33:07
Zitat von: betateilchen am 22 Januar 2024, 14:39:45Natürlich, da kann man reinschreiben, was man will:


Das wurde so nie kommuniziert. Welches Modul überschreibt denn aktuell die  FUUID mit einer UID der Hardware?

MfG
Titel: Aw: Best Practice: FUUID vs. IODev
Beitrag von: betateilchen am 24 Januar 2024, 16:47:51
Zitat von: M.Schulze am 24 Januar 2024, 11:33:07Das wurde so nie kommuniziert.

Vermutlich verwechselt hier gerade jemand "können" (im Sinne von 'es besteht die Möglichkeit') mit "sollen" oder "dürfen".

Zitat von: M.Schulze am 24 Januar 2024, 11:33:07Welches Modul überschreibt denn aktuell die  FUUID mit einer UID der Hardware?

Keines. Das wäre auch überhaupt nicht sinnvoll.
Entwickler und Module sind hier aber gar nicht das Thema.

Aber Du glaubst gar nicht, auf welche Ideen die Anwender kommen. Da gibt es tatsächlich welche, die nach jedem "save" die gespeicherten FUUID aus ihrem Konfigurationsfile per "sed" rausschmeißen. Warum auch immer. Diesbezüglich habe ich schon sehr viel Elend gesehen.
Titel: Aw: Best Practice: FUUID vs. IODev
Beitrag von: jw2013 am 24 Januar 2024, 18:14:59
Ja, es gibt halt sehr spezielle Anwendungsfälle   :))

@betateilchen, solange ich als Entwickler oder Anwender kein 'sed' oder anderes Elend auf die FUUIDs loslasse, kann ich aber davon ausgehen, dass die dauerhaft erhalten bleiben, und die insbesondere nicht 'deprecated' sind?
Titel: Aw: Best Practice: FUUID vs. IODev
Beitrag von: betateilchen am 24 Januar 2024, 18:44:41
deprecated sind die nicht.

Aber Du kannst als Entwickler halt nicht wissen, was die Anwender sich alles einfallen lassen.
Grundsätzlich ist die FUUID dafür konzipiert, dauerhaft erhalten zu bleiben, es ist aber durch nichts sichergestellt.