Hallo Leute,
heute möchte ich euch meinen Prototyp einer KNX Erweiterung vorstellen.
Hinterund war die unglückliche Umsetzung der systemseitigen KNX Integration.
Folgende Punkte störten mich
- Es wird immer eine Adresse pro Instanz abgebildet. Man muss also um Geräte zu Gruppieren mit Dummies und Links arbeiten. Für kleine Lizenzen besonders doof.
- Keine saubere Trennung von ControlGA und StatusGA. Aktuell reagiert Symcon auf beide Adressen gleich, was meiner Meinung nach falsch ist. Korrekt wäre es nur auf die StatusGA zu hören, da ein Aktor ja gesperrt sein könnte.
- Dadurch auch keine saubere Abbildung eines virtuellen Aktors möglich.
- Auftrennung mancher DPT (z.B. DPT-2 Zwangsführung) in mehrere Variablen. Dadurch müssen immer zwei Telegramme verschickt werden. Also erst das eine Bit dann das andere Bit. Eine Anpassung beider gleichzeit ist nicht möglich.
- Die Pflege der Adresse in 3 einzelne NumberField ist sehr läßtig (keine Copy’n’Paste möglich).
Was macht jetzt mein Modul anders?
KNXExtendedSplitter
Zuerst habe ich eine eigene Splitter Instanz gebaut, welche auf dem systemseitigen KNX Gateway aufbaut. Dadurch keine doppelte Tunnelnutzung auf dem KNX Interface. Auch spare ich mir einen haufen Implementierungsaufwand.
Auf dem Splitter wird außerdem ein XML-Datei mit den Gruppenadressen hochgeladen (wie im systemseitigen Konfigurator). Alternativ kann man auch die P-xxxx/0.xml aus dem .knxproj hochladen (automatische Erkennung). Dazu muss man die .knxproj entpacken (zip). Das sollte auch die bevorzugte Variante sein, da hier immer die ausgewählten DPTs der GAs exportiert werden. Das ist beim reinen GA-Export leider nicht der Fall (Ich weis auch warum).
Auf Basis der importierten GAs werden alle KNX Telegramme bereits im Splitter decodiert und erst dann an die Childrens weitergeleitet. Das hat den Vorteil, dass man theoretisch z.B. eine MQTT Bridge bauen könnten, welche die Daten ohne Aufwand (ohne selber decodieren) in MQTT oder einer InfluxDB schieben könnte.
Aktuell ist der Import pflicht. Eine manuelle Anlage der GAs könnte man ggf. später noch einbauen. Ich brauche es nicht, da ich immer die ETS Datei nutze. Wäre aber bereit daüber nachzudenken.
KNXExtendedMonitor
Diese Instanz macht nichts besonderes und diente primär für Tests. Es kann aber super als Gruppenmonitor genutzt werden. Dazu einfach den Debugmodus öffnen. Die GAs werden wie in der ETS mit Namen dargestellt. Unbekannte GAs oder nicht untersützte DPTs werden nicht dargestellt. Dazu kann man auf dem Splitter den Debugmodus öffen.
KNXExtendedDevice
Das sind meine Geräte, welche mehrere Variablen haben können. Jede Variable besitzt eine eigene Control- und Status-GA. Das bedeutet, dass wenn man eine Änderung im Symcon macht, diese auf der ControlGA gesendet wird. Empfangen wird auf der ControlGA aber nicht, nur die StatusGA empfängt Änderungen. Sprich wenn jemand an einem KNX Taster (ControlGA) das Licht einschaltet, wird der Status in Symcon nicht geändert. Erst wenn auf der StatusGA vom Aktor die Bestätigung kommt, das Licht ist an, wird dieser Wert übernommen.
Hintergrund: Theoretisch könnte der Aktor gesperrt sein und Symcon denkt das Licht ist an, obwohl es das garnicht ist. Damit verhält sich das System endlich wie in KNX vorgesehen. Sollte man Adressen haben, die keine separate ControlGA und StatusGA haben, so kann man die GA für Beide übernehmen. Das ist z.B. häufig bei Sperren und Zwangsführungen der Fall.
Eine weitere Funktion ist der Aktormodus. Hierbei verhält sich die Variable wie ein Aktor. Dadruch ist die Logik von ControlGA und StatusGA vertauscht. Sprich Symcon lauscht nun auf der ControlGA damit z.B. ein KNX Taster eine Zustandänderung mitteilen kann. Leseanfragen auf der StatusGA werden mit dem aktuellen Zustand beantwortet. Um den Aktormodus zu aktivieren wird ein Aktorscript benötigt. In diesem Script können die nötigen Aufgaben (anderes Gerät einschalten) abgebildet werden. Wichtig ist, dass dieses Script auf den Status ändert. Hier ein Beispielscript.
<?php
if (isset($_IPS['IDENT']) && isset($_IPS['VALUE'])) {
KNXE_SetActuatorValue($_IPS['INSTANCE'], $_IPS['IDENT'], $_IPS['VALUE']);
}
Wichtig
Das Ganze ist, auch wenn ich schon sehr weit bin, noch ein Prototyp. Sprich es könnte sein, dass sich das Eine oder Andere noch ändert oder vielleicht nicht nicht richtig funktioniert.
Aktuell fehlen auch noch einige DPTs sowie die passenden Profile. Allerdings ist es auch nicht mein Ziel alle DPTs zu unterstützt. Ich bin der Meinung, dass es keinen Sinn ergibt, DPT einzubauen die Symcon prinzipbedingt garnicht darstellen kann (z.B. DPT-3). Also wofür es keine brauchen UI Elemente gibt. Sollte man allerdings auf DPT-3 reagieren möchten (mit Logik) so kann natürlich weiterhin die systemseitige DPT3 Instanz genutzt werden.
Die Erweiterung soll eine Ergänzung und kein Ersatz sein.
Sollte jemand eine GA löschen oder den Typ verändern, so muss manuell die Variable gelöscht werden. Nur dann wird die Variable korrekt neu angelgt. So möchte ich ggf Datenverluste in einem möglichen Archiv vermeiden.
So nun Vielspaß beim testen.
Hier eine kleine Demo
Hinweis: Meine Aussage im Video zu Thema „Links werde in der Lizenz beachtet“ ist natürlich quatsch. Das hatte ich mit meinen vielen Konvertierungsvariablen gleich gesetzt.