Moin,
nachdem Onkelandy das Thema "geräteunabhängiges universelles Plugin für alle Interfaceaufgaben" (ich übertreibe etwas) angesprochen hatte, hat mir die Idee noch nicht ausreichend Ruhe gelassen, um im Homeoffice nicht doch immer wieder in Richtung SublimeText zu schielen...
Nach einigen Überlegungen, verworfenen Ideen und viel Rumkrauterei habe ich mir etwas überlegt, das ich euch - als Idee, als Anregung, als Vorschlag, als Grundlage zur weiteren Entwicklung - vorstellen möchte.
Aus meiner Sicht und - bescheidenen - Erfahrung teilt sich die Arbeit bei Interface-Plugins im Wesentlichen in zwei Teile:
a) der geräteabhängige Teil mit "hardwarenaher" Kommunikation, Datenwandlung und Auswertung
b) der geräteunabhängige Teil mit Plugin- und Itemverwaltung.
Teil a) lässt sich kaum sinnvoll generalisieren; wenn ich mir die drei Plugins
Das Viessmann-Plugin (basiert wohl auf dem Comfoair-Plugin) hat eine komplexe, aber relativ flexible Gerätekonfiguration über umfangreiche Datenfelder, die aus einer Datei eingelesen werden. Idee 1.
Das yamahayxc-Plugin habe ich (um es "ordentlicher" zu machen) mal komplett auf Papier in Ablaufdiagramme gebracht, bei denen ich mir die Datenströme im Plugin und die entsprechenden Strukturen im Code angeschaut habe. Idee 2.
Dann bin ich noch über einen Artikel zur OOP gestolpert, der mich an eine Idee erinnert hat, die ich schon fast vergessen hatte... Idee 3
Damit bin ich jetzt bei einer neuen Klasse, bzw. bei drei neuen Klassen gelandet:
Ob es sich lohnt, bestehende Plugins umzuschreiben, glaube ich erstmal nicht; der Sprung ist noch größer als von "klassischen" zu SmartPlugins. Aber wer sich mit neuen Geräte oder "von Grund auf" mit vorhandenen Plugins auseinander setzen will, kann viel Arbeit sparen, denke ich.
So, wenn ihr bis hierher folgen konntet, dann würde ich mich über Feedback, Kritik, Zuarbeit oder wasauchimmer freuen
Das Repo ist hier: https://github.com/Morg42/smartdevic...n/tree/develop
nachdem Onkelandy das Thema "geräteunabhängiges universelles Plugin für alle Interfaceaufgaben" (ich übertreibe etwas) angesprochen hatte, hat mir die Idee noch nicht ausreichend Ruhe gelassen, um im Homeoffice nicht doch immer wieder in Richtung SublimeText zu schielen...
Nach einigen Überlegungen, verworfenen Ideen und viel Rumkrauterei habe ich mir etwas überlegt, das ich euch - als Idee, als Anregung, als Vorschlag, als Grundlage zur weiteren Entwicklung - vorstellen möchte.
Aus meiner Sicht und - bescheidenen - Erfahrung teilt sich die Arbeit bei Interface-Plugins im Wesentlichen in zwei Teile:
a) der geräteabhängige Teil mit "hardwarenaher" Kommunikation, Datenwandlung und Auswertung
b) der geräteunabhängige Teil mit Plugin- und Itemverwaltung.
Teil a) lässt sich kaum sinnvoll generalisieren; wenn ich mir die drei Plugins
- yamahayxc (netzwerkbasiert, Abfrage in URL mit mehreren Komponenten, teilweise POST-Daten, Rückgabe in JSON mit verschachtelten Strukturen, Push-Notifications auf dafür notwendigen Unicast-Server),
- SMLx (binäres Protokoll über USB/seriell, nur lesen von zyklischen "Push"-Informationen) und
- Viessmann (anderes binäres Protokoll über USB/seriell, aufwändiger Handshake, sehr komplexe (und schlecht dokumentierte) Befehls- und Datenlage)
Das Viessmann-Plugin (basiert wohl auf dem Comfoair-Plugin) hat eine komplexe, aber relativ flexible Gerätekonfiguration über umfangreiche Datenfelder, die aus einer Datei eingelesen werden. Idee 1.
Das yamahayxc-Plugin habe ich (um es "ordentlicher" zu machen) mal komplett auf Papier in Ablaufdiagramme gebracht, bei denen ich mir die Datenströme im Plugin und die entsprechenden Strukturen im Code angeschaut habe. Idee 2.
Dann bin ich noch über einen Artikel zur OOP gestolpert, der mich an eine Idee erinnert hat, die ich schon fast vergessen hatte... Idee 3
Damit bin ich jetzt bei einer neuen Klasse, bzw. bei drei neuen Klassen gelandet:
- class SmartDevicePlugin(SmartPlugin)
Diese definiert den Rahmen der oben beschriebenen geräteunabhängigen Funktionen und hat von den Geräten und Befehlen keine Ahnung. Es liest die Geräte- und Befehlskonfiguration aus den Items aus. Die Instanz dieser Klasse kann MultiInstance benutzen oder ein oder mehrere Geräte in einer shng-Instanz verwalten.
Für jedes gefundene Gerät erzeugt es eine neue Instanz der Klasse - class SmartDeviceEntity()
Diese definiert ein Gerät, die "physikalisch" Verbindung mit Auf- und Abbau und den Befehlssatz. Hauptaufgabe ist die "Verwaltung" des Gerätes und der Verbindungen. Der Datenaustausch wird hier organisiert und verwaltet; aber zu jedem Gerät gehört ein sog. Protokoll. Für das Protokoll gibt es jeweils eine Instanz der Klasse - class SmartDeviceProperty()
Diese definiert Datentransformation (shng: num <-> device: int unsigned 2 byte, transformiert 1/10, oder wasauchimmer), Befehlsumsetzung von "Klartextbefehlen" in shng zu strings, URLs oder bytearrays und die tatsächliche Transformation der Daten (Bitschieberei, Checksummen usw)
- die Klasse SmartDevicePlugin ist quasi fertig, weil ich die aus den drei genannten Plugins so zusammengeschrieben habe, dass fast alle Funktionen 1:1 abgebildet werden, gleichzeitig aber abstrakt genug, dass ich mich nicht um gerätespezifischen Kleinkram kümmern musste
- die Klasse SmartDeviceEntity wird einen akzeptablen Anteil der Arbeit verursachen, weil die Routinen zur Kommunikation nach Seriell und Netzwerk getrennt modular aufgebaut sind, aber von der Klasse äußerlich unterschiedslos bedient werden. Die eigentlichen Kommunikationsroutinen können zu großen Teilen wiederverwendet werden aus anderen Plugins; aufgrund der vereinfachten Datenverarbeitung aber deutlich vereinfacht
- die Klasse SmartDeviceProtocol wird - zusammen mit der Konfigurationsdatei - wahrscheinlich in Konzept und Umsetzung die meiste Arbeit machen, ist dafür aber flexibel und erweiterbar, da jedes auf SDP basierende Plugin seine eigenen Definitionen mitbringen und einbringen kann.
Ob es sich lohnt, bestehende Plugins umzuschreiben, glaube ich erstmal nicht; der Sprung ist noch größer als von "klassischen" zu SmartPlugins. Aber wer sich mit neuen Geräte oder "von Grund auf" mit vorhandenen Plugins auseinander setzen will, kann viel Arbeit sparen, denke ich.
So, wenn ihr bis hierher folgen konntet, dann würde ich mich über Feedback, Kritik, Zuarbeit oder wasauchimmer freuen

Das Repo ist hier: https://github.com/Morg42/smartdevic...n/tree/develop
Kommentar