KNX Gateway mit KNX Geräteadressen

Hallo,

gibt es eine einfache Möglichkeit über das KNX Gateway-Modul auf den KNX zu hören und beispielsweise eine bestimmte Gruppenadresse von einem bestimmten Gerät die Daten abzugreifen? Ich möchte meine Module dahingehend verfeinern, dass ich erkennen kann, wenn ein bestimmter Schalter manuel gedrückt wurde, dass dann eine Automatikfunktion meines Moduls für eine Zeit x die Füße still hält. Dazu muss ich aber wissen bzw. erkennen welche Geräte Nummer die Gruppenadresse auf den Bus geschickt hat. Mit den KNX EIB Modulen in Symcon bekomme ich das nicht hin. Ich sehe aber im Debugmodus des KNX Gateway-Modul, dass genau die angesprochenen Daten im Gateway vorliegen. Nur, wie kann ich die Nutzen? Das KNX Gateway-Modul wird in der Dokumentation auch nicht weiter besprieben…

Bevor du jetzt viel Zeit auf diesen Weg mit der Absenderadresse verwendest:
ist dir der Workaround bewusst, das mit mehreren bedeutungsgleichen GA zu lösen? Dann müsste einfach nur der „bestimmte Schalter“ auf eine separate GA sendet und die anderen Geräte müssten auf beide (also alle bedeutungsgleichen) GA hören.

@Ian Ist das jetzt eine Frage zu einem vorhandenen PHP-Modul? Oder eine Frage zum SDK für PHP-Module? Oder eine Grundsätzliche Frage zu KNX in Symcon?

Hast du eventuell schon ein eigenen PHP-Modul welches per Datenfluss am KNX-Splitter hängt? Dann erhältst du doch immer alle Daten…
Michael

So ganz weiß ich das auch noch nicht. Ich taste mich ran. Ich habe schon einige Module erstellt, jedoch noch keines mit Datenfluss zu einem KNX Gateway. Die Dokumentation ist da sehr dünn. Wenn ich einen Anpack hätte. Ein paar Codeschnippsel…
Ich benötige im Grunde nur eine Art Request aus dem Datenstrom (mit Gerätequelladresse Gruppenadresse, sowie dem eigentlichen Dateninhalt des Telegramms), den ich dann weiter auswerten kann mit den üblichen PHP Mitteln.

Das wenige was ich in der Suche gefunden habe hilft mit nicht oder sehr bedingt weiter:
https://community.symcon.de/search?q=GroupAddress1

Du hast das doch letztes Jahr schon gefragt…

Michael

Ja, das stimmt, hat mir aber nicht weitergeholfen. Meine Module sind fertig, bis auf diese Sache. Mir wäre es am liebsten, wenn ich den Datenstrom filtern kann. Habe da noch andere Dinge im Hinterkopf für später. Anscheinend gibt es da so kein einfachen Lösungsansatz, muss ich wohl vernehmen. Hätte fast erwartet, dass man irgendwie auch in einem Smarthomesystem erkennen kann von welchem KNX Gerät Nachrichten kommen. Nur die Gruppenadresse zu sehen ist etwas wenig. Im Symcon Ökosystem kann ich ja auch immer erkennen oder ermitteln von wem eine Nachricht generiert wurde. Über die Grenze zum Bus sehe ich so nun nicht im Symcon welches Gerät zuhaus gerade Nachrichten schickt.

Um mich ein letztes Mal zu wiederholen: was du versuchst ist gegen die innere Logik von KNX, das wird dir böse um die Ohren fliegen. Auch wenn die Daten zwecks Debugging vorhanden sind ist es nicht KNX-Style, sie zu diesem Zweck zu verwenden. Was für dich nach einer Limitierung von IPS aussieht hat einfach den Grund, dass man es so niemals macht in KNX. Absenderadressen (oder ganz allgemein physikalische Adressen) werden vom Benutzer nicht ausgewertet, niemals.

Nach KNX-Methodik wird es NUR über die GA gelöst und wenn das in deinem Fall nicht ausreicht, dann solltest du dein GA-Schema überdenken. Den nach KNX-Methodik gängigen Ansatz hatte ich oben genannt.

2 „Gefällt mir“

Ich möchte mich nicht weiter über das für und wieder unterhalten. Ich möchte einfach die Daten am Bus auswerten und habe eine Frage zu dessen Umsetzung gestellt. Es gibt viele Wege nach Rom. Ich habe mich für meinen Weg entschieden. Ich habe keine Frage gestellt, ob ein anderer Weg der richtigere wäre. Es geht um die Umsetzung und nicht darum welchen Weg ich gehen soll. Wem mein Weg nicht gefällt - kann ich akzeptieren, dann bitte einfach nicht mehr drauf antworten. Ich danke dir dennoch, einen anderen Weg aufzuzeigen - aber bei dem einmaligen Aufzeigen reicht es auch.
Mit der Bitte das zu akzeptieren.

Ja, geht doch alles schon.
Musst dir halt das SDK anschauen, oder die Beispiel dazu auf GitHub, oder die Videos auf YT.
Filter:
SetReceiveDataFilter

Michael

Danke für den Beitrag. Ich froste schon intensiv durch die Dokuementation.
Ist der folgende Weg richtig?
In der „public function Create() " des eigenen Moduls zum KNX Gateway oder zur I/O Instanz via „$this->ConnectParent(“{…}“);" Kontakt aufnehmen. Nur welche GUID ist da die richtige?
Um dann erstmal zu testen ein Befehl auf den Bus zu bringen habe ich hier im Forum ein Schnippsel gefunden:
$json = json_encode( Array( "DataID" => "{42DFD4E4-5831-4A27-91B9-6FF1B2960260}", "GroupAddress1" => 1, "GroupAddress2" => 1, "GroupAddress3" => 16, "Data" => "1" ) ); $result = $this->SendDataToParent($json);

Ich bekomme nach Neuladen des Moduls und anschließenden Einbinden der Instanz eine Fehlermeldung, dass der Datenfluss inkopatibel wäre. In der Modul.json habe ich die GUIDs bei parentRequirements und implemented jedoch eingetragen.

Eine Idee was ich falsch mache?

Welcher I/O? TCP, UDP, USB? Die haben alle andere GUIDs? Welche GUIDs hast du verwendet und woher hast du diese Info genommen?

Ich nutze noch einen UDP Socket. Habe die GUID ausgelesen {82347F20-F541-41E1-AC5B-A636FD3AE2D8}. Ist das richtig?

Der UDP Socket passt nicht zu deinem Beispiel oben.
Du musst schon die GUIDs vom KNX Gateway nutzen.
Die kannst du einmalig mit IPS_GetModule auslesen.
In deiner module.json muss bei implemented die GUID von ChildRequirements rein und in parentRequirements kommt die GUID aus Implemented rein.
Erst dann wäre der Datenfluss kompatibel.
Wie gesagt: hier wird der Datenfluss und das mit den guids erklärt.
https://www.youtube.com/live/6dcsSfqIlnA
So ca ab Minute 50
Michael

Vielen Dank für den Hinweis. Das Video war sehr hilfreich.
Ich habe mich nun im Datenstrom dazwischen hängen können.
Im Debug des KNX Gateways ist immer in der Spalte INCOMING und in der nächsten Zeile die Gruppenadresse in Klammern dahinter die Geräteadresse. In der Spalte Daten der Hexcode der Daten. Demach liefert das Gateway als Splitter ja entsprechende Daten.
Genauso sehe ich es aber im Statusprotokoll nicht, wenn ich mir den Datenstrom via
IPS_LogMessage(‚Splitter RECV‘, print_r($data, true));
im Statusprotokoll ausgeben lasse.
Da finde ich Daten vor wie
(
[Data] => €Gá
[DataID] => {8A4D3B17-F8D7-4905-877F-9E69CEC3D579}
[GroupAddress1] => 7
[GroupAddress2] => 2
[GroupAddress3] => 1
)
Die Gruppenadresse ist da. Sind die Daten und die Geräteadresse irgendwie unter Data kryptisch versteckt? Kann ich das irgendwie sichtbar auslesen? Welche Format haben die Daten eigentlich?

Benutze die korrekte Debug Ausgabe (SendDebug) und du siehst die Daten sowohl als Text oder Hex, je nach Typ.

Rohdaten, steht auch in dem von dir selber verlinkten Beitrag #10.
Michael

So richtig werde ich aus den übertragenen Daten nicht schlau.
Im Debug am KNX Gateway kommt beispielsweise
INCOMING | 29 00 BC D0 11 14 3A 01 03 00 80 1C 53
In der Folgezeile wird die Adresse
7/2/1 (1.1.20) | 80 1C 53

Demnach ist in INCOMING am Ende der Teil der Folgeadresse enthalten. Soweit so gut.

Im Debug des eigenen Splitters habe ich nun SendDebug eingebaut. Unter
$this->SendDebug(„DEBUGsend Data“, $data->Data, 1);
habe ich nun folgenden Inhalt:
DEBUGsend Data | C2 80 1C 53

Die 80 1C 53 finde ich darin wieder.
Wenn ich 801C53 von Hex in Dec umwandle, dann da 8395859 raus.

Dann muss 29 00 BC D0 11 14 3A 01 03 00 ja anscheinend bei Incoming der erste Teil die Gruppenadresse mit Geräteadresse sein. Die wird aber wohl nicht durch den Splitter komplett zun den Modul-Clients durchgereicht, sondern nur die Gruppenadresse, die dann in
$this->SendDebug(„DEBUGsend Data A1“, $data->GroupAddress1, 1);
$this->SendDebug(„DEBUGsend Data A2“, $data->GroupAddress2, 1);
$this->SendDebug(„DEBUGsend Data A3“, $data->GroupAddress3, 1);
zu finden ist.
Um auch die Geräteaddresse zu extraieren müsste ich vermutlich direkt auf die I/O Instanz zugreifen?

Mal unabhängig von der Geräteadresse finde ich wie vor benannt den übertragenen reinen Datenteil ohne Adresse:
DEBUGsend Data | C2 80 1C 53
Ich werde aus den Hex-Daten nicht schlau. Ist das irgendwo dokumentiert?

Rohdaten musst du nach dem json_decode noch mit utf8_decode bearbeiten.
Die Daten selber sind bei Symcon nicht dokumentiert, sind ja gemäß KNX Specs. Es sollte sich ja, nach dem oben verlinken Beitrag, um die jeweiligen Daten eines DPT dieser GA handeln.
Ob da nun das enthalten ist was du suchst… :man_shrugging:
Michael

Du meinst damit die physikalische/individuelle Adresse vom KNX Gerät? Also z.B. Die 1.1.20?

Diese Information wird aktuell nicht von Splitter weitergeleitet. In Data ist nur der cEMI Teil des Datenpakets. Also nur die nutzdaten ohne das drumrum. Du bekommst das C2 übrigens weg wenn du ein utf8_decode nutzt.

paresy

Ja, richtig, ich meine die Adresse des KNX Gerätes wie beispielsweise 1.1.20. Aktuell hat man keine Möglichkeit irgendwie auf dem Absender zu schließen. Das in der ETS über Gruppenadressen zu realisieren wäre mehr als aufwendig.
Ich werde nochmal ein wenig mit utf8_decode rumprobieren. Dann kann ich wenigstens die Daten über die Gruppenadresse in meinen Modulen verwerten ohne das alles mit zig Ereignissen auf Userebene lösen zu müssen.
Kann ich davon ausgehen, dass ich die Geräteadresse über das I/O Modul extraieren könnte? Ist das aufwendig? Bei den Modulen habe ich ja mittlerweile eine gewisse Routine. Aber was den Datenfluss angeht ist für mich absolutes Neuland.

Eine spätere Ergänzung:
paresy, danke für den Tipp mit cEMI.
Sehr schön dargestellt habe ich das folgende Blatt gefunden:

Spricht eigentlich etwas dagegen, wenn Ihr im KNX Gateway in einem nächsten Update neben der GroupAddress1, GroupAddress2 und GroupAddress3 auch die Geräteadresse mit überträgt? Dann bäuchte man da nicht unnötig etwas Neues drumherum bauen.