Standardisierung FHEM, wo wollen wir hin

Begonnen von eiten, 18 Februar 2021, 17:24:10

Vorheriges Thema - Nächstes Thema

eiten

Hallo zusammen,

aufgrund von Beta-Testers Thread https://forum.fhem.de/index.php/topic,117933.0.html im Entwicklerforum und eigenen schmerzlichen Erfahrungen eröffne ich den Thread auch hier, da Beta-Tester (und auch ich) denken, dass diese Diskussion wohl alle interessieren dürfte und nicht nur die Entwickler. Mir ist kein besseres Sub-Forum eingefallen, sollte ich hier falsch sein, so bitte ich darum, mich zu verschieben.

Um's gleich vorauszuschicken: mir geht's nicht darum, FHEM sofort komplett umzubauen. Rolläden, Lichter, Garagentor, die komplette Heizung, Boilersteuerung, Abwesenheitssteuerung, TV etc. etc. funktionieren gut bei mir. Ab und zu dauert's einfach etwas länger als nötig, bis ich was geschafft habe, und daher folgende Denkanstösse für die Zukunft/zukünftige Modulentwicklung. Das ist absolut nicht Weisheit letzter Schluss, ich bin sicher, es tauchen noch viel bessere Ideen von euch auf.

Problemstellung
Das geniale an FHEM ist, dass wir ja Systeme verschiedenster Hersteller Kombinieren können. Ein selbst gebastelter MySensors Taster schaltet ein YeeLight, ein BLE-Doppeltaster schaltet ein ZigBee-Rolladenaktor. Das Problem dabei ist, dass die Readings und die Set- und Get- Befehle von Modul zu Modul unterschiedlich sind. Ein Auslöser für diesen Beitrag war unter anderem, dass ich eine Rolladensteuerung mit einem Shelly 2.5 auf eine zigbee2mqtt kopiert habe und stundenlang nach dem Fehler gesucht, bis ich bemerkt habe, dass zwar das eventMap die Gross/Kleinschreibung im event geändert hat, dies aber dem DOIF ziemlich egal war, da es wohl auf das Reading direkt zugreift, was nicht geändert wurde. Die Lösung dafür wäre natürlich eine Standardisierung. Allerdings können wir nicht einfach so alle Module ändern, und das auch ncoh zu unterschiedlichen Zeitpunkten, da würden wir ja unsere Zeit nur noch mit der Fehlersuche nach Updates verbringen.

(Diskutable) Lösungsideen
Ich habe mir dazu ein paar Gedanken gemacht. Allerdings tendiert man im stillen Kämmerchen dazu, nicht alle Aspekte zu sehen. Beta-Testers Beitrag (und PM) hat dann dazu geführt, dass ich nun an euch trete und mit euch bereden will, ob das Problem so überhaupt besteht und ob und was wir da machen könnten.

Zum Problemkreis Update: Wie geschrieben, können wir nicht einfach die Funktionalität der Module komplett und ohne Vorwarnung ändern. Mir fallen dazu zwei mögliche Lösungen ein.
Wir definieren ein Attribut, welches pro Device festlegt, ob wir uns in der neuen oder der alten Welt befinden. Enstprechen müssen die Modulentwickler natürlich in den X_set und X_get Funktionen eine Unterscheidung vorsehen. Nachteil dabei ist, dass die Ausführungszeit durch die zusätzliche Unterscheidung leiden kann. Zudem kann das Attribut global gesetzt werden, um bei neuen Installationen oder wenn wir alles umgestellt haben und neue Devices dazu kommen, nicht immer das Attribut setzen müssen.
Alternativ könnten wir einen Mechanismus implementieren, der ein Modul vom Update sperrt, wenn dieses auf den Standard umgebaut wurde. Dem User wird, zum Beispiel via motd angezeigt, dass das Modul nicht geupdated wurde, am besten zusammen mit einem Link auf einen Forenbeitrag wo steht, was genau geändert hat. Ein solcher Mechanismus wäre auch aktuell wünschenswert, wenn inkompatible Updates kommen. Lösen können wir das zum Beispiel über einen CompatibilityLevel in der controls.txt der jedes Mal erhöht wird, wenn eine inkompatible Änderung gemacht wurde. Vorteile sind eine schneller Ausführung und mehr Sicherheit auch in Zukunft, dass Updates unsere Automatisierung nicht zerschiessen. Nachteil ist unter anderem, das wir dann gezwungen sind unsere Programmierung anzupassen, wenn wir up-to-date bleiben wollen.

Wie soll nun aber die Standardisierung aussehen? Meine Idee dazu lehnt sich an Google an (ich bin sicher, andere Firmen haben ähnliche Konzepte, dies ist halt das, was ich kenne https://developers.google.com/assistant/smarthome/concepts/devices-traits): das Konzept von Geräten und Merkmalen (obwohl ich mir nicht sicher bin, ob wir die Geräte brauchen, macht aber wahrscheinlich die Integration von Alexa, Google Home, Siri und co. einfacher).

Merkmale, Attribute und Einheiten
Um die Steuerung zu vereinheitlichen, definieren wir Merkmale, die ein Device haben kann, wie zum Beispiel OnOff und Volume, die ein Lautsprecher haben kann, oder OnOff und LightTemperature und LightColor, die eine Leuchte haben kann. Damit konnen wir zum Beispiel die Lichttemperatur aller Lampen (egal, mit welchem Modul sie bedient werden) in einem Raum mit einem Befehl wie set room=Wohnzimmer,trait=LightTemperature colortemp 4200 die Farbtemperatur aller Leuchten im Wohnzimmer, die das unterstützen, setzen.

Diese Merkmale enthalten Attribute, die den Readings entsprechen. So kann zum Beispiel das Merkmal LightColor die Attribute hsv, rgb und xyY enthalten oder Brightness die Attribute pct und brightness. Ich halte es für wichtig, dass die Einheit jedes Attributes eindeutig definiert ist. Also zum Beispiel ist definiert, dass pct eine Helligkeit von 0 bis 100 ist oder brightness eine Helligkeit von 0 bis 255. Allerdings sollte ein Gerät, dass nur rgb und pct verarbeiten kann auch ein set hsv verarbeiten können. Dazu ist wohl eine Vorverarbeitung der set-Befehle notwendig. Ich finde es auch wünschenswert, dass zum Beispiel ein ReadingsVal oder eine Abfrage in einem DOIF von brightness auf ein Gerät, dass nur ptc als reading anbietet, automatisch umgewandelt wird.

Bei normalen Modulen dürfte das Einigermassen gehen. Etwas komplizierter stelle ich mir das zum Beispiel bei MQTT2_DEVICES vor. Da können wir zwar per perl in der setList und dem jsonMap schon viel erreichen. Was allerdings bisher nur Mühsam über jsonMap und einem userReading geht ist zum Beispiel, wenn ein Gerät eine Temperatur in Fahrenheit meldet, der Standard aber °C vorsieht. Noch schwieriger wird's mit eventMap, das funktioniert zwar auf die Events, aber nicht auf die Readings (welche zum Beispiel im DOIF verwendet werden).

Dokumentation
Sehr wichtig dabei ist wohl die Dokumentation der ganzen Geräte, Merkmale der Attribute und deren Einheiten. Ich schlage dazu das FHEM-Wiki vor, falls wir uns zu einer Standardisierung entscheiden.

Ich bin sicher, ich habe noch 1000 Dinge vergessen, darum will ich das hier mit euch besprechen. Zudem gibt es Probleme wie herstellerspezifische Konfigurationsbefehle etc, die noch überlegt werden müssen.

Liebe Grüsse, Edi

rudolfkoenig

Diese Diskussion waere in Development besser aufgehoben.

Die Idee von FHEM Interfaces ist alt, es gab schon viele Anlaeufe, und ausser ermuedende Diskussionen haben wir bisher nicht wirklich was erreicht. Der letzte Versuch war was (mAn) Einfaches: Batteriewerte zu standardisieren, siehe https://forum.fhem.de/index.php/topic,87575.html. Das Ergebnis nach 137 Beitraegen sind 3 optionale Reading Namen mit spezifizierten Wertebereichen, dokumentiert in der Wiki. Manche Modulautoren (mich inklusive) haben es umgesetzt, Andere waren selbst zum Schluss dagegen.

Meine Sicht der Dinge: eine Standardisierung aller Readings waere fuer FHEM unmoeglich, da bei der Definition man nicht alle Faelle kennt, und die Standards und deren Implementierung kontinuierlich anzupassen unsere Energie uebersteigt. Weiterhin ermoeglicht das Fehlen der Standards einem Entwickler, schnell was zu bauen. Im Wesentlichen  geht es darum, wer die Arbeit machen soll: der Entwickler oder der Anwender. Ich bin z.Zt. der Meinung: der Anwender.

Abgesehen von dieser Meinung: fuer meine Module bin ich sehr wohl bereit Standards zu uebernehmen.
Ich will aber nicht den Hut aufhaben, einen Konsens zu erstreiten, und die Entwickler zur Mitarbeit zu zwingen.

eiten

Hallo Rudolf,

danke für Deine Antwort, und vielen Dank an dieser Stelle für Deine riesige Arbeit an FHEM!
Ich verstehe Deinen Punkt, dass die Diskussion besser in Developement aufgehoben wäre, leider bin ich aus der Schweiz und deshalb basisdemokratisch orientiert  :). Nein Scherz bei Seite, ich denke halt einfach, dass dazu auch die Meinung der Anwender interessant ist, vielleicht sehe ich ja Probleme, wo bei der grossen Mehrheit keine sind.

Natürlich will ich keine FHEM Gesetze aufstellen, sondern eher Richtlinien, wie Jack Sparrow so schön gesagt hat. Ich habe für mich ein Modul entwickelt und dachte, ich mach das gleich richtig, um dann vielleicht auch Anderen damit dienen zu können. Leider habe ich nichts gefunden, was in Richtung so sollten die Readings und die Befehle heissen, damit ein alter FHEM-Hase das auch gleich verwenden kann. Ich dachte, dann schaust Du halt bei ähnlichen Modulen und hab da einen ziemlichen Wildwuchs vorgefunden.

OK, ich hab zwischenzeitlich den Batterie-Thread gelesen. Klingt so, dass viele eine Vereinheitlichung wollen aber damit abtun, dass sie eh keine Chance hat. Wie schon gesagt, ich habe Ideen und Gedanken gepostet, wenn kein Bedarf da ist, ist das auch absolut ok für mich. Ausser vielleicht der Wunsch, das bei Updates mit breaking changes ein Warn-/Sperrmechanisums eingeführt werden könnte.

Gute Nacht, Edi

Per

Meine Meinung als Anwender? Ich finde Standardisierung gut. Ob man 100% erreicht, wage ich aber zu bezweifeln.
Aber am Beispiel der Batterie: die notwendigen DOIF, notify, Gruppen oder was auch immer, wurden vereinfacht (dank HomeMatic). Und für den noch nicht standardisierten Rest (z.B. WinConnect) nutze ich UserReadings, welche auf den Standard umbiegen. Ich könnte das zwar auch im Quelltext direkt ändern, aber dann fange ich nach einem Update wieder an. Nö.

Also ein gewisses Grundgerüst vorgeben, neuere Entwicklungen im Auge behalten und ab und zu den Standard anpassen. Also genau wie in der realen Welt.
Und wenn man erstmal den ersten Schritt getan hat, gehen die anderen meist leichter.

sven.scherf

Hallo,

Standards sind gut und wichtig.
Standards erleichtern auch das automatische Testen Modul übergreifend.


Aber, man muss damit irgendwo anfangen und es dann langsam aufbauen sonst wird dies nichts.

Da ich mich mit der Modulprogrammierung noch nicht beschäftigt habe.

Gibt es hier keine Templates oder Programmierrichtlinien ?
Macht es vielleicht Sinn hier ein Grid mit vorhandenen Readings und den neuen Readings zu erstellen ?
Hier könnten dann Überganszeiten eingetragen werden bis wann man das Reading in seinem erstellen Modul angepasst haben sollte damit es nicht im updaten weiterhin berücksichtigt wird.

Ohne Standards besteht ja die Gefahr, dass alle weiter auseinander läuft und nur noch komplexer wird.



Viele Grüße

Sven

Raspi 3 mit CUL Stick 433/868MHZ, Homematic

rudolfkoenig

ZitatGibt es hier keine Templates oder Programmierrichtlinien ?
Es gibt unvollstaendige Varianten in der Wiki, an dem sich manche halten.

ZitatMacht es vielleicht Sinn hier ein Grid mit vorhandenen Readings und den neuen Readings zu erstellen ?
Es wuerde sich schon lohnen, existierende Namen und Werte (fuer Readings, Attribute, etc) zu sammeln, mit kurzer(!) Bemerkung, wofuer sie gedacht sind. Dann koennen Neuentwicklungen sich an irgendwas orientieren, ob alte Module angepasst werden, darf der Maintainer zunaechst selbst entscheiden.

Das Beste daran: man muss weder programmieren, noch ist eine Diskussion noetig.

xenos1984

Generell finde ich (als Anwender, aber vielleicht in Zukunft auch Entwickler) ein gewisses Maß ein Standardisierung positiv, weil es ermöglicht, Komponenten gegeneinander auszutauschen. Es gibt ja doch eine ganze Menge Module, die teilweise ähnliche Funktionen bereitstellen, und bei denen man überlegen könnte, ob sich gemeinsame Funktionen nicht auch durch eine gemeinsame API zugänglich machen lassen.

Um mal ein einfaches, fiktives Beispiel zu nennen: Angenommen, es gibt mehrere Module, die jeweils eine Lampe steuern und deren Zustand anzeigen können, und die als gemeinsame Funktionen an / aus, Helligkeit (Dimmer) und Farbtemperatur implementieren. Dann wäre es mMn praktisch, wenn bei diesen Modulen die gleichen set-Befehle und die gleichen Einheiten / Wertebereiche für Helligkeit und Farbtemperatur verwendet würden (und nicht z.B. bei einem Modul set pct 100, bei einem anderen set brightness 255 die maximale Helligkeit schaltet).

Wenn ich nun eine Lampe durch eine andere ersetze, die von einem anderen Modul gesteuert wird, muss ich mir nicht erst Gedanken machen, wie ich alle DOIF / notify / at etc. anpasse, damit sie mit der API des anderen Moduls arbeiten. Wenn beide Module eine kompatible API anbieten, kann ich einfach eins durch das andere ersetzen.

Zitat von: rudolfkoenig am 23 Februar 2021, 12:11:03
Es wuerde sich schon lohnen, existierende Namen und Werte (fuer Readings, Attribute, etc) zu sammeln, mit kurzer(!) Bemerkung, wofuer sie gedacht sind. Dann koennen Neuentwicklungen sich an irgendwas orientieren, ob alte Module angepasst werden, darf der Maintainer zunaechst selbst entscheiden.

Ich denke, sich zunächst einen Überblick über den Stand der Dinge zu verschaffen, wäre ein guter Anfang. Dann könnte man besser sehen, wie weit entfernt so eine gemeinsame API für manche Module ist, und dann schauen, ob man diese Schritt für Schritt implementieren könnte, bzw. eine Orientierung für neue Module geben, damit diese ebenfalls möglichst kompatibel gestaltet werden. Mir persönlich fehlt so ein Überblick noch etwas, da es ja doch viele Module sind, aber vielleicht kann man den ja auch (teil-)automatisch aus den Modulen generieren, die ja ihre Attribute, Readings etc. "bekanntgeben".

Beta-User

Vorab mal ein Dankeschön an @eiten für's Aufgreifen des Themas!

Es wäre echt toll, wenn sich eine Truppe finden würde, die sich dazu mal auf den Weg macht, es ist wie Rudi schreibt:
Zitat von: rudolfkoenig am 23 Februar 2021, 12:11:03
Es wuerde sich schon lohnen, existierende Namen und Werte (fuer Readings, Attribute, etc) zu sammeln, mit kurzer(!) Bemerkung, wofuer sie gedacht sind. Dann koennen Neuentwicklungen sich an irgendwas orientieren, ob alte Module angepasst werden, darf der Maintainer zunaechst selbst entscheiden.

Das Beste daran: man muss weder programmieren, noch ist eine Diskussion noetig.
Das "Problem" ist, dass keiner alles kennt, sondern jeder kennt (mehr oder weniger) eben das, das er nutzt.

Als ich die ersten jsonMap-Attribute in den attrTemplate zu MQTT2_DEVICE verteilt habe, stand ich genau vor dem Problem, dass es (bis auf "battery") nicht wirklich was zum Orientieren gab, @eiten hatte jetzt an einer etwas anderen Stelle ein ähnliches Problem, und es gibt noch eine Gruppe von usern, die sich mit ähnlichen Themen bei Solaranlagen beschäftigt.
Irritierend fand ich, dass es zunächst mal gewisse Widerstände gab, als ich das Thema bei sonos2mqtt (mit den AV-Readings, bei denen es guidlines gibt: https://wiki.fhem.de/wiki/DevelopmentGuidelinesAV) angesprochen hatte, an und für sich sollte es eine Selbstverständlichkeit sein, dass man derartige Standards dann einfach übernimmt, wo es möglich ist.

Von daher wäre in der Tat schon einiges gewonnen, wenn man für alles, was man "ab sofort" macht, sowas wie eine geordnete Zusammenfassung hätte (oder zumindest einen Anfang in diese Richtung). Wenn es irgendwo Haken gibt, meldet sich erfahrungsgemäß dann schon jemand...

Was die Erwartungshaltung mancher angeht:
Meine eigene Haltung zu einigen Fragen ist die:
- Verordnete breaking changes sind Mist! (Nicht nur für Entwickler, auch für die User! Tendenziell haben ja alle User heute Systeme, die mit diesen ganzen Eigenheiten irgendwie klarkommen, und auch das umzustellen, ist (mind.) Aufwand!)
- Wer neu einsteigt, sollte die Chance haben, "Sonderlocken" möglichst zu minimieren (Attribut-/featurelevel-gesteuert?)
- Doppelungen sind Mist! Lieber "entweder oder"
- Ganz wird das nicht gelingen. Neben der "Kleinigkeit", dass jeder Entwickler das halten darf, wie er es für richtig hält, gibt es auch technische Gründe, warum manche Module eben keine "100%" können (bzw. kennen). Wer ZWave nutzt, hat vielleicht eine Idee, was gemeint ist... Da zu rechnen, um zwangsweise aus dim 99 100% zu machen ist m.E. keine gute Idee.
- "Attribute" ist m.E. ein gutes Stichwort, aber - abgesehen von gewissen Standard-Attributen wie "disable" - reichlich tricky. Also löblich, falls sich da jemand dranwagt, aber m.E. deutlich weniger dringlich.

Jedenfalls freut es mich, dass es durchaus Interessenten gibt für das Thema!

Zitat von: rudolfkoenig am 23 Februar 2021, 12:11:03
Das Beste daran: man muss weder programmieren, noch ist eine Diskussion noetig.
Wer auch immer sich dieses Themas (koordinierend) annimmt: Wer es macht, entscheidet über die Tools :P .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Per

Vllt könnte man als zweiten Schritt (der erste mit den bisher "vorgegeben" Werten) pro Modul eine Auflistung der verwendeten Attribute, Befehle und Readings anlegen. Dazu ein Feld mit der Erklärung und eins, ob man an den Namen gebunden ist. Im Gegensatz zur Hilfe ohne Erläuterung der Auswirkungen, dafür in Tabellenform. Das kann man dann in einer Tabellenkalkulation statistisch auswerten, um die Vorgaben zu erweitern.
Für neue Module ist das zumindest praktikabel, wie man Maintainer und Anwender zum Umstieg beweg, ohne sie zu verärgern, weiß ich aber auch nicht.

frank

ZitatUm mal ein einfaches, fiktives Beispiel zu nennen: Angenommen, es gibt mehrere Module, die jeweils eine Lampe steuern und deren Zustand anzeigen können, und die als gemeinsame Funktionen an / aus, Helligkeit (Dimmer) und Farbtemperatur implementieren. Dann wäre es mMn praktisch, wenn bei diesen Modulen die gleichen set-Befehle und die gleichen Einheiten / Wertebereiche für Helligkeit und Farbtemperatur verwendet würden (und nicht z.B. bei einem Modul set pct 100, bei einem anderen set brightness 255 die maximale Helligkeit schaltet).
was ist daran einfach?

standardisierung bedeutet doch hier:
entweder "beschneide" ich die möglichkeiten, wenn nur noch 100 werte zulässig sind.
oder umgekehrt wird die bedienung "unmöglich" oder nicht mehr intuitiv, wenn ich zb 50% einstellen will. ausserdem müsste ich alles umstellen, was bereits seit 10 jahren möglich war.

demnächst kommt dann ein hersteller mit brightness 768. was dann?


da sollte doch eher das "übergeordnete" modul die standardisierung/das mapping vornehmen, um möglichst viele "zulieferer" bedienen zu können, denke ich. wenn dieses modul dann quasi zum standard wird, weil jeder es haben möchte, werden eventuell auch die "zulieferer" mehr und mehr von sich aus ihr modul anpassen/erweitern.


ich bin jedenfalls gegen jede "standardisierung", wenn diese zu beschneidungen an anderer stelle führt.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

pwlr

Moin,

ich möchte zunächst allen, die in irgendeiner Form an diesem FHEM gearbeitet haben, ganz herzlich danken !
Ich gehöre zum Kreis der Anwender (bzw. Anwendungsentwickler) und kann mich leider mangels Linux Know How an dieser Arbeit nicht beteiligen.
Aber vielleicht, so im Laufe der Zeit ....

Mein FHEM ist inzwischen auf 960 defined entities gewachsen (inklusive "altem Kram" aus der Startzeit und auch "Leichen"), aber immerhin nicht ganz klein. Für einen möglichst störungsfreien täglichen Betrieb setze ich auf HM-Devices und arbeite zur Risikominimierung sehr viel mit peering. Für den Rest nutze ich Perl-Subroutinen, die primär durch userReadings angesteuert werden.

Ich sehe trotz der bisher sehr guten Funktionalität des FHEM schon im Sinne einer Standardisierung einige Verbesserungsmöglichkeiten - als Richlinien für die Entwickler, nicht als Gesetz! Man sollte damit nicht die Kreativität der Entwickler einschränken und eventuelle neue Lösungen erschweren.

Einige Beispiele, keine Kritik:
1. Standard-Readings (state, pct, level, powerOn, battery, contact, etc) sollten in allen Devices vorhanden und die gleiche Bedeutung haben, natürlich nur soweit sinnvoll.

2. Standard-Steuerungsbefehle (set on|off, pct, active|inactive, etc) sollten für alle Devices gleich sein (soweit sinnvoll)
(aktuell kann man z.B. einen Dimmer (HM-LC-SW1PBU-FM) mit set <device> pct 100 einschalten, einen Switch (HM-LC-SW1PBU-FM) aber nicht (mehr).

3. Bei gepeerten Sensoren liefert FHEM Infos über den Wert und und das Ziel. Diese Infos sollten auch in den einzelnen Devices gleich implementiert sein.
HM-MOD-EM-8 => closed (to Lampe_Schuppen_Device) vs. HM-MOD-EM-8BIT => unknown:28 (to myVCCU)
Bei der korrespondierenden Registerprogrammierung der Devices wird für xxCtValHi bzw, xxCtValLo der Dezimlwert benötigt. Wäre schön, wenn man nicht erst "closed" oder den Hex_Wert umrechnen müsste. Und die Bedeutung von "unknown:" ist mir bis heute unklar.
   
4.Alle Readings sollten mit gleichem Namen sowohl in der GUI und auch in Perl-Subroutinen verfügbar sein und die Steuerung via expert sollte keine Auswirkungen auf den Namen eines Readings auf der Perl-Ebene haben.
(R-self02-lgActionType vs .R-self02-lgActionType)

Das sollen nur einige Beispiele zur Verdeutlichung sein, kein Gemecker - aber mehr Standards wären gut. Man könnte leichter Devices unterschiedlicher Typen austauschen bzw. Routinen umfänglicher nutzen.

Für die eventuelle Umstellung eines Modul gibt es aktuell meines Erachtens ein sehr gutes Beispiel:


2021.02.23 11:14:23.031 3: tempOFF is deprecated and will be removed in a next version. Please use tempMap and\or widgetTempRange
2021.02.23 11:14:23.033 3: tempON is deprecated and will be removed in a next version. Please use tempMap and\or widgetTempRange


Moin
Bernd

xenos1984

#11
Zitat von: frank am 23 Februar 2021, 14:55:09
was ist daran einfach?

Das Beispiel beschreibt ein Gerät mit 3 Funktionen (binärer An/Aus-Zustand, Helligkeit, Farbtemperatur) und keine 20.

Zitat
standardisierung bedeutet doch hier:
entweder "beschneide" ich die möglichkeiten, wenn nur noch 100 werte zulässig sind.
oder umgekehrt wird die bedienung "unmöglich" oder nicht mehr intuitiv, wenn ich zb 50% einstellen will. ausserdem müsste ich alles umstellen, was bereits seit 10 jahren möglich war.

Nein. Es will niemand etwas "beschneiden" oder unmöglich machen, was vorher möglich war. Das habe auch weder ich geschrieben, noch irgendjemand anders. Es geht darum, gemeinsame Eigenschaften auf eine gemeinsame Art und Weise über ein passendes Modul zu steuern. Wenn die eine Lampe mehr diskrete Stufen kann als die andere, ist das eben gerade keine Gemeinsamkeit, sondern ein Unterschied, und dann muss man eben diesen Unterschied abbilden.

Wenn ich 3 verschiedene Lampen habe, die diskrete Werte im Bereich 0-99, 0-100 und 0-255 verstehen, dann muss ich mich eben fragen, wie ich das abbilde. In dem Fall wäre dann z.B. meine Idee, es auf einer der beiden folgenden Weisen - oder sogar beide - abzubilden:


  • Die erste Idee ist, dass der Anwender eine Möglichkeit bekommt, das Modul zu fragen, welches der minimale und maximale Wert sind und welche Zwischenschritte erlaubt sind. Dann kann der Anwender in seinem DOIF oder notify o.ä. bildlich gesprochen sagen: "set lamp brightness [lamp:maxBrightness]" und hat volle Helligkeit, und muss sich nicht erst fragen, ob er dafür 99, 100 oder 255 übergeben soll.
  • Die zweite Idee wäre ein Zusatz zu der ersten, nämlich dass der Anwender zusätzlich zum Hersteller-definierten Bereich von diskreten Werten die Möglichkeit bekommt, einen beliebigen Gleitkommawert von 0 bis 1 anzugeben, und dann steuert die Lampe auf den diskreten Wert, der diesem am nächsten liegt. Wenn sich also der Anwender nur dafür interessiert, in 10 Stufen dimmen zu können, egal wie viele die Lampe kann, stellt er eben sowas wie "set lamp relativeBrightness 0.3" bei sich ein, und muss nicht erst rechnen, welchen Wert die Lampe dafür gerne hätte. Das wäre aber nur eine Zusatzfunktion - alle diskreten Level sollen nach wie vor ansprechbar sein.

Zitat
demnächst kommt dann ein hersteller mit brightness 768. was dann?

Eben genau deshalb ja dieses Beispiel. Wenn alle meine DOIF sagen: "set lamp brightness 255" und ich auf einmal eine Lampe habe, die bei dem Befehl nur noch 1/3 Helligkeit liefert, ärgere ich mich, weil ich selektiv ändern muss, überall da, wo ich nun diese neue Lampe ändere.

Trotzdem beschneide ich nichts - ich kann ja nach wie vor jede der 768 Stufen einzeln ansprechen. Die API sagt mir nur, wie viele es sind. Und wenn ich eine Funktion haben will, die "gleitend" dimmt, indem sie die einzelnen Zwischenschritte macht, kann ich die so auch leichter implementieren.

Zitat
da sollte doch eher das "übergeordnete" modul die standardisierung/das mapping vornehmen, um möglichst viele "zulieferer" bedienen zu können, denke ich. wenn dieses modul dann quasi zum standard wird, weil jeder es haben möchte, werden eventuell auch die "zulieferer" mehr und mehr von sich aus ihr modul anpassen/erweitern.

Was soll denn in dem Beispiel das "übergeordnete Modul" sein und was der "Zulieferer"? Hier würde doch so ein Mapping von z.B. 0-100 auf 100 Stufen der 768-Stufen-Lampe genau zu einer Beschneidung führen, und die ist ja gerade nicht das Ziel.

Zitat
ich bin jedenfalls gegen jede "standardisierung", wenn diese zu beschneidungen an anderer stelle führt.

Da sind wir einer Meinung.

Frank_Huber

Zitat von: frank am 23 Februar 2021, 14:55:09
demnächst kommt dann ein hersteller mit brightness 768. was dann?
der ESP RGBWW Controller z.B. im RAW Befehl 0 bis 1023
*duckundweg*

Beta-User

Zitat von: frank am 23 Februar 2021, 14:55:09
demnächst kommt dann ein hersteller mit brightness 768. was dann?
Sowas ähnliches hatte ich schon: Da kam ein zigbee/mqtt-Gerät, das mV statt der üblichen V-Angabe lieferte.

Das Ergebnis in mqtt2.template sieht jetzt so aus, dass "alles irgendwie im Kreis" gemappt wird, um am Ende dann (auch) zwei standarkonforme Readings vorhanden sein sollten mit batteryVoltage und batteryPercent. Die "ursprünglichen" Reading-Namen sind verschwunden bzw. geändert zu "batterymV". Wenn ich (ohne Klimmzge) gekonnt hätte, hätte ich "batterymV" gelöscht, das hat gg. der (umgerechneten) batteryVoltage mAn. keinen Mehrwert.
Kann nicht erkennen, dass das "falsch" wäre oder ein Verstoß gegen Herstellervorgaben.

Dass ein Hersteller den Reading-Namen wirklich "hart" vorgibt, dürfte kaum vorkommen, er nennt ihn bestenfalls "in seiner App" anders. In FHEM sollte man es sich in der Regel (als Maintainer) aussuchen können, nach welchem Schema man was benennt.

Aber ein Dogma würde ich nicht draus machen, für mich sind "dim 99" noch verständlich, und ich gebe das dann auch via mqtt als "$base/$device/pct 99" ohne schlechtes Gewissen weiter...

Imo ist es gerade bei "schrägem Zeug" wie "brightness 768" die Frage, ob es Sinn macht, das auf der Userseite zu lösen. Was wir erleben, ist doch eher, dass dann allzuoft Unsinn (und Frust bzgl. FHEM) rauskommt...

Wenn es wirklich eine diskrete Angabe ist, muss es ja nicht unbedingt brightness heißen (ich übersetze brightness zwischenzeitlich immer mit: "hat 255 als Maximalwert"), sondern der Name könnte auch "lightLevel" (?) sein...?

Zitat von: pwlr am 23 Februar 2021, 15:27:03
Für die eventuelle Umstellung eines Modul gibt es aktuell meines Erachtens ein sehr gutes Beispiel:


2021.02.23 11:14:23.031 3: tempOFF is deprecated and will be removed in a next version. Please use tempMap and\or widgetTempRange
2021.02.23 11:14:23.033 3: tempON is deprecated and will be removed in a next version. Please use tempMap and\or widgetTempRange

Meine Erfahrung:
Hinweise nur im Log lesen die wenigsten, und nicht einmal CHANGED wird wahrgenommen, selbst wenn jemand massive Probleme hat (habe das jüngst mit Heating_Control erlebt: > 1 Jahr Ankündigung (u.A. im Log beim Starten), und trotzdem hat es mind. einer verpaßt...

Von daher: Jeder User sollte die Wahl haben, "alte Welt" zu bekommen.

Was HM angeht: das ist sehr fein aufgegliedert, aber gerade da kommen "Herstellerspezifika" besonders stark zur Geltung. Das ist in anderen Modulfamilien/Technologien nach meiner Erfahrung deutlich weniger stark ausgeprägt (auch wenn es da teils massive (funktionale) Unterschiede zwischen Geräte- und Protokoll-Generationen gibt).

Zitat von: Frank_Huber am 23 Februar 2021, 15:40:56
der ESP RGBWW Controller z.B. im RAW Befehl 0 bis 1023
*duckundweg*
Auch hier ist die Grenze und das Wording a) menschengemacht und b) gewissen technischen Gepflogenheiten folgend. Ad a) hatte ich schon was geschrieben, und ad b) ist anzumerken, dass da die Zahl der üblichen Varianten auch relativ überschaubar ist...

(Ansonsten: dim 50% kann bei unterschiedlichen Leuchtmitteltypen auch unterschiedliche Ergebnisse zeitigen, je nachdem, ob der Hersteller eher in Lux denkt oder in Leistungsaufnahme, oder in ...)
Ein weites Feld also...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

frank

ZitatWas soll denn in dem Beispiel das "übergeordnete Modul" sein und was der "Zulieferer"? Hier würde doch so ein Mapping von z.B. 0-100 auf 100 Stufen der 768-Stufen-Lampe genau zu einer Beschneidung führen, und die ist ja gerade nicht das Ziel.
zb ein zusatzmodul, das dir deine gewünschte standardisierte schreibweise ermöglicht. quasi ein "setCmdProxy"-modul

set lamp lightLevel [min|night|kuschel|eco|max|...]

da kann sich dann ein developer "austoben", ohne dass irgendwer etwas zu ändern braucht.
keine diskussionen sind nötig, zu jedem device können spezielle mappings erstellt werden, ... .
zb kann man auch berücksichtigen, dass nicht jeder dimmer mit jedem leuchtmittel bei der selben einstellung die selbe "helligkeit" erzeugt.

zulieferer wären dann alle module, die eine lampe schalten können.

das könnte man sogar noch weiter "verallgemeinern", so dass nicht nur ein übergeordnetes "lightLevel" cmd existiert, sondern allgemeiner zb ein "cmdLevel" bereitgestellt wird, dass gleichzeitig zb auch diverse laustärken mappen kann, oder was auch immer... .
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

xenos1984

Zitat von: frank am 23 Februar 2021, 17:11:20
zb ein zusatzmodul, das dir deine gewünschte standardisierte schreibweise ermöglicht. quasi ein "setCmdProxy"-modul

set lamp lightLevel [min|night|kuschel|eco|max|...]

da kann sich dann ein developer "austoben", ohne dass irgendwer etwas zu ändern braucht.
keine diskussionen sind nötig, zu jedem device können spezielle mappings erstellt werden, ... .

Diesen Ansatz halte ich eher unrealistisch. So ein "Super-Übersetzer-Modul" müsste nicht nur an alle vorhandenen Geräte angepasst werden, und damit wissen, welche Lampe welche Helligkeiten unterstützt etc., sondern auch noch an die Wünsche der Anwender. Wie soll man denn z.B. "night" standardisieren, wenn ein Anwender sein Nachtlicht gerne etwas heller hätte, ein anderer etwas dunkler, und wieder ein anderer den roten U-Boot-Modus bevorzugt?

Zitat
zb kann man auch berücksichtigen, dass nicht jeder dimmer mit jedem leuchtmittel bei der selben einstellung die selbe "helligkeit" erzeugt.

Auch dafür sehe ich an dieser Stelle und auch generell schwarz. Wenn ich z.B. eine Deckenleuchte und einen Dimmaktor habe, dann hängt die Helligkeit nicht nur von der Einstellung des Dimmaktors ab, sondern auch davon, welches Leuchtmittel ich in der Leuchte einsetze. Davon weiß aber weder der Dimmaktor etwas, noch hat die Software / der Programmierer eine Ahnung davon, wie viel Lux meine Lampen maximal liefern, geschweige denn, welche Einstellung ein für mich angenehmes Nachtlicht realisiert.

Zitat
das könnte man sogar noch weiter "verallgemeinern", so dass nicht nur ein übergeordnetes "lightLevel" cmd existiert, sondern allgemeiner zb ein "cmdLevel" bereitgestellt wird, dass gleichzeitig zb auch diverse laustärken mappen kann, oder was auch immer... .

Ich denke aus o.g. Gründen, das ist der falsche Ansatz einer Standardisierung, weil sie eben nicht darauf abzielt, gemeinsame Eigenschaften auf ein gemeinsames Interface abzubilden, sondern verschiedene Dinge in einen Topf wirft, die so nicht vereinbar sind. Man kann weder die Präferenzen der Anwender standardisieren, noch physikalische Eigenschaften, die gar nicht durch die Software abgebildet werden, wie den Zusammenhang zwischen Dimmer-Stellwert und tatsächlicher Helligkeit. An der Stelle muss einem Anwender die Möglichkeit gegeben sein, diesen Zusammenhang selbst zu konfigurieren. Ein Standard kann ihm nur helfen, dass die Art und Weise, wie er diese Konfiguration vornimmt, unabhängig davon ist, von welchem Hersteller er seine Hardware bezieht und wie sie eingebunden ist, bzw. welches Modul sie ansteuert.

Per

Wobei gar nicht gesagt ist, dass ich von meiner alten Lampe die 50% übernehmen will, wahrscheinlich muss ich da die Werte eh anpassen, weil die Neue viel heller ist...

frank

ZitatDiesen Ansatz halte ich eher unrealistisch. So ein "Super-Übersetzer-Modul" müsste nicht nur an alle vorhandenen Geräte angepasst werden, und damit wissen, welche Lampe welche Helligkeiten unterstützt etc., sondern auch noch an die Wünsche der Anwender. Wie soll man denn z.B. "night" standardisieren, wenn ein Anwender sein Nachtlicht gerne etwas heller hätte, ein anderer etwas dunkler, und wieder ein anderer den roten U-Boot-Modus bevorzugt?
immerhin schon mal ein anfang, aber etwas mehr fantasie bitte.  ;)

meine idee war ja, dass der "markt" nun eine art standardisierung einleitet.

es gibt ja ein paar zusatzmodule, die ihre clienten/devices automatisch identifizieren und sich daran "andocken".
für den anfang würde es ja genügen, dass der entwickler dieses moduls seine bedürfnisse befriedigt, indem er seine speziellen devices/devicetypen integriert.
über attribute kann man auch devices markieren, wenn sie nicht so schon über devicehash infos zu identifizieren sind.
über eine anpassung der attribute durch den user sind auch persönliche einstellungen einfach möglich.
entwickler, die an dieser standardisierung interessiert sind, werden sicherlich fehlende infos bereitstellen.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

xenos1984

Zitat von: frank am 24 Februar 2021, 11:02:16
immerhin schon mal ein anfang, aber etwas mehr fantasie bitte.  ;)

Ich fürchte, ich gehe solche Dinge lieber mit Realismus und Pragmatismus an. Die Methode hat sich bewährt.

Mir klingt dieses Super-Übersetzer-Modul-Konzept zu abstrakt. Konkrete Punkte zu suchen wo man Dinge vereinheitlichen kann halte ich für zielführender.

frank

Zitat von: xenos1984 am 24 Februar 2021, 12:01:30
Ich fürchte, ich gehe solche Dinge lieber mit Realismus und Pragmatismus an. Die Methode hat sich bewährt.
ich bin gespannt auf die ergebnisse.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

xenos1984

Zitat von: frank am 24 Februar 2021, 13:10:11
ich bin gespannt auf die ergebnisse.

Ich auch. Meinen Ansatz habe ich ja oben erläutert.

sven.scherf

Hi,


wie ich hier sehe gibt es viele Bedenken und geht nicht, kann man nicht, sind Einschränkungen.

Mhh irgendwie seltsam diese Aussagen. Wir machen doch hier Software dies habe ich so verstanden.

Viel besser ist es doch sich Gedanken zu machen wie löse ich diese Herausforderung einen Standard einzuhalten oder wie kann ich diese Herausforderung umsetzen.
In meinem Berufsleben habe ich viel gehört von geht nicht und kann man nicht.
Wenn man dies dann aber hinterfragt hat kamen dann doch Lösungen heraus die tragbar waren, denn ein geht nicht gibt es nicht.
In Software geht alles zu lösen :)

Wenn man ein neues Device von 0 - 768 oder 0 - 65535 einstellen kann kann dies über fhem doch in 0 - 100% umgesetzt werden.
Sollte der Modulentwickler dann hier der Auffassung sein es ist zu gering, na dann bitte schön kann dies in RAW Commands implementiert werden.

Bitte hier nicht falsch verstehen wir nutzen und entwickeln hier fhem doch alle(so denke ich) in unserer Freizeit und es ist unser Hobby :)Es ist keine Kritik, ich bin selber froh und dankbar hier Lösungen und Module zu finden die meine Aufgabenstellung lösen.

In meinen eigenen Softwareentwicklungen ist es oft so, dass man sich nach Jahren fragt warum habe ich dies so gelöst ??
Gerade wenn ein Projekt wir hier fhem mit der Zeit wächst und immer mächtiger wird macht es Sinn Lösungen zu hinterfragen und eventuell umzustellen.

Wer fängt nun wo an mit Standardempfehlungen und Umsetzungen ?

:D ;) :)

Viele Grüße

Sven


Raspi 3 mit CUL Stick 433/868MHZ, Homematic