[Prototyp] KNXExtension

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.

2 „Gefällt mir“

Moin,
das hört sich ja schon sehr interessant an.

Was mir aber noch nicht klar ist, wenn ich die Projektdatei lade, werden dann alle Variablen sofort angelegt wie die GA’s in der ETS oder kann ich sie wie im Konfigurator auch erst mal auswählen?
Was ist mit den schon in IPS genutzten GA’s?

VG,
Doc

Es wird gar nichts angelegt, man erstellt ein KNXExtendedDevice (zum Bespiel Badezimmer Licht) und legt dann eigene Variablen auf der Instanz mit den passenden ControlGA und StatusGA an.

Die vorhanden KNX Instanzen funktionieren weiter und laufen unabhängig zu meiner Erweiterung.

Es gibt noch eine Optimierung. Für den Aktormodus wird nun ein Script benötigt. Es gibt aber noch 1-2 nötige Anpassungen bis das wirklich sauber funktioniert.

Hast du das mit diesem Aktionsskript ausprobiert?
Weil du hast dann eine Endlosschleife, da RequestAction das Actionsskript startet und nicht die Standardaktion der Variable.
Warum überhaupt ein Aktionsskript, wenn du eine Standardaktion bei der Variable hinterlegt hast, dann braucht man doch gar keins :confused:
Michael

Morgen,

hört sich sehr interessant an, hatte erst vorgestern den Fall das ich was geschalten hatte und davon ausgegangen bin das es klappte weil der Status im WebFront „Ein“ war, in der Realität war dem nicht so.

Wenn ich das jetzt richtig verstanden habe muss ich mit diesem Modul z.B. für TW Downlights auch keine 3 Instanzen mehr anlegen ?
Somit hätte ich eine Instanz mit Variablen Ein/Aus, Helligkeit und Farbtemperatur?

Gruß,
Adrian

Du hast den Sinn den Aktorscript missverstanden. Es geht darum weitere Funktionen auszulösen. z.B. Fernseher und Receiver einschalten. Und wenn du z.B. keinen Fernseher einschalten kannst, dann darf der Aktor auch nicht sagen dass er nun „An“. Halt eine saubere Trennung zwischen Aktion und Status.

Die Standardaktion muss übrigens auch dieses Aktorscript aufrufen. Das ist aber noch nicht fertig.

Genau das ist die Idee. In meinem Beispiel siehst du eine Beleuchtungsinstanz mit Status, Helligkeit und Zwangsführung.

Ich glaube er meinte das genau anders herum, das du einen Aktor der nicht KNX ist damit ansteuern kannst/willst und dann diese Rückmeldung an KNX verarbeiten kannst.
Da steht ja auch Aktorscript und nicht Aktionsscript …

Oh ja, zu schnell gelesen. Sorry. Brauche noch einen Kaffee :coffee:
Ist aber irgendwie missverständlich, da es ja Symcon Standard ist Aktionen mit RequestAction auszulösen; der Hinweis verwirrt dann doch mehr als das er etwas erklärt.
Michael

1 „Gefällt mir“

Das soll es auch weiterhin. Sprich du löst ein RequestAction aus (z.B. durch WF) Dieses ruft dann das Aktorscript auf. Diese macht was gemacht werden soll und ruft dann wieder RequestAction auf. Um später einen Loop zu vermeiden muss ich entweder schauen, dass ich den Sender sauber erkennen kann oder aber mit eine zusätzlichen Variable übergebe. Das ist aber wie gesagt noch nicht fertig.

Ich überlege im Moment auch, welchen Mehrwert das für mich jetzt haben könnte.
In meinen Scripten werte ich ja sowieso die Control und die Status GA aus, das es da nicht zu falschen Informationen kommt.
Wenn ich das richtig vertstanden habe, geschieht das jetzt in einer eigenen Instanz?

VG Doc

Klar man kann jeweils 2 Instanzen bauen und diese dauernd abgleichen. Das mach ich auch häufig. Aber bei einfachen Steuerelementen, macht man sich idR den Aufwand nicht und nutzt eine Instanz mit zwei GAs. Und wenn ich dann ein An an einen gesperrten KNX Aktorkanal schickt, ist der Zustand im Symcon falsch.

ahh, du spielst hier verm. mehr auf die Anzeige im Webfront an, oder?
Das nutzte ich gar nicht, deshalb ist das dann für viele eher ein Problem mit dem „falschen“ Status der Control-GA.
Meinst du das?

Genau, wenn per ControlGA ein An kommt übernimmt Symcon diesen standardmäßig. Oder wenn du im WF ein An schickst, bleibt dieser auf An auch wenn halt das Licht aus verschiedenen Gründen nicht eingeschaltet wurde. Und das hat KNX sauber beachtet, aber dafür muss man es auch korrekt umsetzen/nutzen.

Warum? Vielleicht verstehe ich es einfach nicht oder bin zu blöd?
Aber der Sinn war doch, das sich die Instanz wie ein Aktor verhält.
Also über den Bus geschaltet werden kann und seinen Status auf den Bus sendet.
Wenn jetzt aus Symcon dieser virtuelle Aktor geschaltet wird, dann landet es doch sowieso im Modul im RequestAction und kann den neuen Wert auf den Bus senden.
Warum sollte man jetzt ein Aktorskript benötigen?
Michael

Hier geht es um zwei verschiedene Sachen. Beim letzten Beispiel ging es nicht um dem virtuellen Aktor. Vielleicht nochmal anders geschrieben.

Beispiel mit einem echten KNX Schaltaktor und schalten per WF:
Du sendest also per WF ein „Ein“. Der Aktor empfängt über die ControlGA die Anforderung und ignoriert diese, weil der Kanal gerade gesperrt ist. In Symcon ist nun der Status aber aktiv.

Beispiel mit einem echten KNX Schaltaktor und schalten per KNX Taster:
Jetzt sendet ein KNX Sensor ein „Ein“. Der Aktor empfängt über die ControlGA die Anforderung und ignoriert diese, weil der Kanal gerade gesperrt ist. Symcon empfängt ebenfalls der ControlGA das „Ein“ und übernimmt diesen Wert. Somit ist der Status schon wieder falsch.

Problem Symcon unterscheidet nicht zwischen Status und Control.

Jetzt ein Beispiel mit meinem virtuellen Aktor und einem KNX Taster.
Der KNX Taster sendet ein „Ein“. Mein Modul empfängt diesen Wert über die ControlGA, übernimmt den Wert aber noch nicht, sondern sendet das „Ein“ an das Aktorscript. Dieses versucht nun irgendwas Einzuschalten. Wenn das klappt, soll das Script den Wert auf Ein umstellen und den Status auf die Status GA senden. Sollte das einschalten nicht klappen, so soll der Wert weiterhin Aus sein.

Aktuell überlege ich wie ich den letzten Teil am besten umsetze um keinen Loop zu bekommen.

Besser wäre es, deine Instanz kennt ihren eigenen gesperrt Status, schaltet intern entsprechend und setzt ihre Statusvariablen entsprechend (und führt selber keine Aktionen in Symcon durch).
Weitere Aktionen in Symcon werden über Ereignisse bei Veränderungen dieser Statusvariable gestartet.
Umgekehrt kann dann auch ein Ereignis diese Statusvariable schalten und den neuen Wert auf den Bus senden.

Michael

Der virtuelle Aktor wird doch garnicht gesperrt. Der virtuelle Aktor muss versuchen bei einer Statusänderung zu schauen, ob er das durchführen kann und dann muss der Status entsprechend gesetzt werden. Und was der Aktor repräsentiert, ist ja sehr unterschiedlich.

So neue Version ist online. Das Aktorscript ruft jetzt das SetValue selber auf und muss auch selber das Senden auf den Bus auslösen. Denn ggf ist überhaupt kein senden nötigt oder wird ggf sogar von einem anderen Instanz auslöst.