Hilfe/Tipps für Modulerstellung "DeviceProxy"

Hallo zusammen,

ich würde mir gerne für meine Homematic-Geräte (und später vielleicht auch andere) gerne ein Modul mit einer Art „DeviceProxy“ Funktion erstellen. Idee ist es dabei, die physikalische Gerätehierarchie in einem Zweig und die Proxy Hiearchie in einem anderen Zweig liegen zu haben.

Bedient und auch gesteuert soll nur über die Proxies werden. In Abhängigkeit vom HM Gerät und einem „Funktionsprofil“, das ich auswählen kann, soll mir eine Instanz passende Variablen anbieten. So kann ich beispielsweise für ein Funktionsprofil „Licht“ automatisch Variablen mit Zustand (zum Schalten), aber auch Einschaltdauer, Betriebsstundenzähler usw. mit Samt der zugehörigen Funktionalität erzeugen.

So ungefähr könnte das aussehen:
2016-07-29_DeviceProxy1.jpg

Meine Fragen dazu:

[ul]
[li]Ist es möglich, innerhalb eines solchen Moduls eine eigene Vererbungshierarchie, auch mit abstrakten Klassen, aufzubauen? Es könnte ja z.b. sinnvoll sein, alles „Schaltbare“ in einer Basisklasse zu hinterlegen, und dann Steckdosen, Lampen etc. in Spezialisierungen auszuprägen. Habe keine Idee, wo und wie ich das im PHP Code unterbringen kann.[/li][li]Wie wickle ich am besten die Kommunikation mit der Homematic Instanz ab? D.h. was wäre der beste Weg, um auf Ereignisse aus den Variablen der Instanz zu reagieren und umgekehrt Variablen der Instanz zu bedienen? Vorstellbar wäre das Anlegen von Ereignissen, aber das stelle ich mir auf Dauer recht unübersichtlich vor.[/li][/ul]

Besten Dank im Voraus.

Gruß
micheljarre

Tommi, und auch ich selbst nutzen in unseren Modulen gerne mal eine Basisklasse.
Und letztens habe ich dann noch angefangen bestimmte Funktionen mit Traits anzuhängen:
PHP: Traits - Manual

IrgendwasBase extends ipsmodule

echteKlasse extends IrgendwasBase
use meineSchalterKlasse;

Und warum soll man nicht auch Abstarakte Funktionen und Mehrfachvererbung nutzen. Habe ich auch schon teilweise in Funktion.
Wie beim [Modul] DynamicVisuControl - Objekte verstecken / deaktivieren.

Entweder du nutzt den Datenaustausch und hängst dich an den IO des Homematic-Socket (so macht es mein HomematicExtended-Modul) oder du nutzt die MessageSink.
Datenfluss — IP-Symcon :: Automatisierungssoftware
MessageSink — IP-Symcon :: Automatisierungssoftware

Hat beides den Vorteil, dass es für den User unsichtbar ist und du keine Ereignisse in IPS anlegen musst.

Michael

Vielen Dank für die Hinweise! Werde sie mir in Ruhe zu Gemüte führen.

Ich hoffe, ich darf nochmal drei Fragen loswerden.

Also ich bin jetzt soweit, dass ich in einer Testinstanz meines Moduls JSON Daten vom Homematic Socket empfange und verarbeiten kann. Darin stecken die Adresse (z.B. JEQ1234:2) sowie HM-Datenpunktname und -wert.

Jetzt habe ich in meiner form.json einen Instanzselektor, der mit die entsprechende Modulproperty als Integer setzt.

Damit bin ich aber noch nicht bei der String-Adresse, die in den JSON Daten steckt. Also habe ich versucht, eine weitere Property zu registrieren, die bei ApplyChanges als String die Adresse aus der Instanz holt. Dabei fiel mir auf, dass ich den Wert dieser Property nicht setzen kann. Also habe ich stattdessen eine Instanzvariable mit dem Ident „HMAddress“ angelegt und gesetzt, das funktioniert gut. Wenn ich jetzt die JSON Daten empfange, muss ich allerdings immer einen Stringvergleich zwischen der Adresse im JSON Objekt und der eigenen Adresse durchführen, um zu wissen, dass die Daten für diese Instanz bestimmt sind.

Meine Fragen dazu sind:

[ul]
[li]Ist das Vorgehen so korrekt?[/li][li]Was ist überhaupt der Unterschied zwischen „Properties“ und „Variablen“ (RegisterPropertyX vs. RegisterVariableX)?[/li][li]Was ist bei „parentRequirements“ in der module.json der korrekte Wert für meinen Fall? Ich habe dort jetzt die ID des HM Sockets stehen, aber z.B. beim Modul IPSHomematicExtended steht dort etwas anderes ("{75B6B237-A7B0-46B9-BBCE-8DF0CFE6FA52}"), das mir nicht bekannt ist und ich auch nicht in der Modulliste finde.[/li][/ul]

Danke und Gruß
micheljarre

Hm… dann werde ich erst mal so weitermachen wie beschrieben und hoffe, dass mein Vorgehen korrekt ist.