Netzwerk API| Mit diesem Funktionsbaustein stellt die Steuerung eine
einfache, offene Schnittstelle für Fremdgeräte und Fremdprogramme
bereit – etwa ein Energiemanagement, Home Assistant, Node-RED, eine
eigene Anwendung oder ein Skript. Über eine TCP-Verbindung können
die Werte aller Variablen der Adressliste gelesen und geschrieben
werden, wahlweise über ein einfaches Textprotokoll oder über HTTP.
Die Netzwerk API ist die dokumentierte Schnittstelle für Fremdgeräte. Der Port 10001, über dem Studio und APP mit der Steuerung sprechen, ist dafür nicht vorgesehen: dessen Protokoll ist verschlüsselt, nicht offengelegt und kann sich mit jeder Version ändern. Der Baustein wird wie jeder andere Funktionsbaustein auf einer Programmseite angelegt, Port und Protokoll eingestellt und das Projekt in die Steuerung übertragen. Mehrere Netzwerk API Bausteine mit unterschiedlichen Ports sind möglich, z.B. einer für das Textprotokoll und einer für HTTP. |
Ausgänge |
||
| AC |
Anzahl Clients |
Anzahl der aktuell verbundenen Clients, im
Sekundentakt aktualisiert. Es sind höchstens 32 Verbindungen
gleichzeitig möglich. Beim Protokoll HTTP ist eine Verbindung nur
für die Dauer einer Anfrage offen, der Wert steht deshalb meist
auf 0. |
Parameter |
||
| Port |
TCP-Port, auf dem die Steuerung Verbindungen
annimmt (1 bis 65535, Vorgabe 9090). Der Port darf nicht von einem
anderen Dienst der Steuerung belegt sein, z.B. 10001 (Studio/APP),
80/443 (Weboberfläche) oder 502 (Modbus Slave). |
|
| Protokoll |
|
|
Befehle |
||||||||||||
Jeder Befehl besteht aus einer Adresse der
Adressliste, einem Gleichheitszeichen und einem Wert bzw. einem
Fragezeichen.
Adressen: Es gelten die Adressen der Adressliste im Studio, dreistufig in der Form Hauptgruppe/Mittelgruppe/Untergruppe, z.B. 3/1/0. Als Trennzeichen wird auch der Punkt angenommen
(3.1.0), eine zweistufige Adresse (3/256)
wird wie in der ETS umgerechnet. Die Steuerung antwortet immer
dreistufig mit Schrägstrich. Es sind KNX-Gruppenadressen ebenso
erreichbar wie interne Variablen. Eine Adresse, die in der
Adressliste nicht angelegt ist, wird ignoriert und im Protokoll der
Steuerung vermerkt – es gibt keine Fehlerantwort.Werte: Zahlen werden mit Punkt als Dezimaltrennzeichen übertragen. In Antworten stehen sie immer mit sechs Nachkommastellen, z.B. 1.000000 für Ein und
0.000000 für Aus. Beim Schreiben genügt 1
oder 21.5. Text-Variablen (EIS 15 Zeichenkette) werden
als Klartext übertragen, der Text darf selbst ein Gleichheitszeichen
enthalten. Alle übrigen Werte werden als Zahl übergeben, die
Umrechnung in das KNX-Format (z.B. 2-Byte-Gleitkomma)
übernimmt die Steuerung. Uhrzeit, Datum und Farbwerte werden über
die Netzwerk API nicht unterstützt.Zeilenende: Im Textprotokoll muss jeder Befehl mit LF (\n) abgeschlossen werden, ein zusätzliches CR (\r) wird ignoriert. Jede Antwortzeile endet mit LF. Eine Zeile darf höchstens 1023 Zeichen lang sein. |
||||||||||||
Lesen |
||||||||||||
| Ein Lesebefehl liefert den Wert, den die Steuerung
aktuell für diese Variable kennt. Es wird dabei kein
Telegramm auf den KNX-Bus gesendet und am Projekt nichts verändert.
Der Wert ist der zuletzt empfangene bzw. gesendete Wert – bei einer
KNX-Adresse also der Wert des letzten Telegramms, das die Steuerung
auf dem Bus gesehen hat. Wer ausschließlich liest, sendet nur Befehle mit ?. Die
Schnittstelle selbst kennt keinen Nur-Lese-Modus, siehe
„Sicherheit“. |
||||||||||||
Schreiben |
||||||||||||
| Ein Schreibbefehl wirkt genauso, als würde der Wert
in der APP bedient: Die Steuerung übernimmt den Wert in die
Variable, verknüpfte Funktionsbausteine reagieren darauf, und ist
die Adresse eine KNX-Gruppenadresse, wird ein Schreibtelegramm auf
den KNX-Bus gesendet. Bei einer internen Variable bleibt der Wert in
der Steuerung. Die Steuerung meldet nicht zurück, ob ein Aktor den Befehl ausgeführt hat. Dafür die Rückmeldeadresse des Aktors abfragen bzw. im Textprotokoll deren Änderungsmeldung abwarten. |
||||||||||||
Änderungsmeldungen (nur Textprotokoll) |
||||||||||||
Im Textprotokoll muss nicht zyklisch abgefragt
werden. Solange die Verbindung besteht, sendet die Steuerung jede
Wertänderung einer Variable unaufgefordert an alle verbundenen
Clients, im selben Format wie eine Antwort, z.B.
3/0/0=21.400000. Das gilt für Telegramme vom KNX-Bus
ebenso wie für Werte aus Funktionsbausteinen, der APP oder anderen
Schnittstellen. Werte, die ein Client selbst über die Netzwerk API
geschrieben hat, werden nicht an die Clients zurückgemeldet.Es gibt keine Auswahl einzelner Adressen – der Client erhält alle Änderungen und filtert selbst. Üblich ist: nach dem Verbinden einmal ? senden, um den Anfangsstand zu erhalten, danach nur
noch die Änderungsmeldungen auswerten.Beim Protokoll HTTP werden keine Änderungen gemeldet, hier muss zyklisch abgefragt werden. |
||||||||||||
Beispiele |
||||||||||||
Textprotokoll, z.B. mit netcat (Eingaben mit Enter
abschließen):
nc 192.168.1.90 9090 3/0/0=? 3/0/0=21.340000 3/1/1=? 3/1/1=1.000000 3/0/0=21.400000 <- Änderungsmeldung, unaufgefordertHTTP, z.B. mit curl oder im Browser: curl "http://192.168.1.90:9090/?3/0/0=?" 3/0/0=21.340000 curl "http://192.168.1.90:9090/??" 1/1/0=0.000000 ... ?=FINISHED curl "http://192.168.1.90:9090/?3/0/3=21.5"Im HTTP-Aufruf müssen Leerzeichen und Sonderzeichen wie üblich codiert werden ( %20 für ein Leerzeichen). Mehrere
Befehle in einem Aufruf werden durch %0A getrennt, z.B.
/?3/0/0=?%0A3/0/4=?. Die Antwort ist reiner Text
(text/plain, UTF-8).Python, Textprotokoll mit Änderungsmeldungen: import socket
s = socket.create_connection(("192.168.1.90", 9090))
s.sendall(b"?\n") # Anfangsstand
buf = b""
while True:
buf += s.recv(4096)
while b"\n" in buf:
line, buf = buf.split(b"\n", 1)
addr, value = line.decode().split("=", 1)
print(addr, value)
|
||||||||||||
Sicherheit |
||||||||||||
Die Netzwerk API hat keine Anmeldung und keine
Verschlüsselung. Jedes Gerät, das den eingestellten Port
erreicht, kann alle Variablen lesen und schreiben – und damit über
KNX-Adressen auch Heizung, Warmwasser, Beschattung oder Türöffner
schalten. Deshalb:
|
||||||||||||
Grenzen |
||||||||||||
|
Häufige Fragen zur Anbindung von Fremdsystemen |
||||||||||||||||||
Welche Schnittstelle ist für ein Fremdsystem vorgesehen?Für das Lesen und Schreiben von Variablen ist diese Netzwerk API die offene, dokumentierte Schnittstelle. Daneben gibt es MQTT Adressen I/O (Variablen als MQTT-Topics, z.B. für Home Assistant, ioBroker oder Node-RED) und den Modbus TCP Slave. Port 10001 gehört Studio und APP; dessen Protokoll ist nicht offengelegt und für Fremdsysteme nicht freigegeben.Alle diese Schnittstellen sind Funktionsbausteine. Sie sind erst aktiv, wenn sie im Projekt angelegt und das Projekt in die Steuerung übertragen wurde – ohne Übertragung lässt sich keine davon einschalten. Deshalb immer vom Projektstand ausgehen, der aktuell in der Steuerung läuft (siehe unten „Projekt mit älterem Studio“). Braucht die Netzwerk API eine Lizenz oder Freischaltung?Nein. Die Netzwerk API benötigt keine eigene Lizenzoption, sie steht auf jeder Steuerung zur Verfügung, die ein Programm ausführt.Wie meldet sich ein Fremdsystem an?Gar nicht – es gibt weder Benutzer noch Passwort noch Verschlüsselung. Wer den Port erreicht, hat Zugriff. Der Schutz muss über das Netzwerk erfolgen, siehe „Sicherheit“.Kann ausschließlich gelesen werden?Lesebefehle (…=? und ?) ändern nichts und
senden kein KNX-Telegramm. Einen gesperrten Schreibzugriff gibt es
jedoch nicht: ob nur gelesen wird, bestimmt das Fremdsystem. Erst ein
Befehl mit Wert (3/1/0=1) schreibt.
Gibt es Push-Meldungen bei Wertänderungen?Ja, im Textprotokoll werden alle Änderungen selbsttätig gesendet, siehe „Änderungsmeldungen“. Bei HTTP muss zyklisch abgefragt werden.Gibt es Testwerkzeuge oder Beispiele?Zum Testen genügen netcat, curl oder ein Browser, siehe „Beispiele“. Um ein Fremdsystem gefahrlos zu erproben, zunächst nur lesen. Ungültige Befehle und Adressen, die in der Adressliste fehlen, werden im Protokoll der Steuerung vermerkt.Welcher KNX-Datentyp gilt für eine Variable?Die Datentypen im Studio sind nach der alten EIS-Zählung benannt, nicht nach der KNX-DPT-Nummer. Die Zahl im Namen ist daher nicht die DPT-Hauptnummer:
Über die Netzwerk API spielt die Byte-Kodierung keine Rolle: Werte werden als Klartext-Zahl übertragen ( 21.500000), die
Steuerung rechnet in das KNX-Format um. Die DPT-Angabe wird nur
gebraucht, wenn ein Fremdsystem direkt am KNX-Bus mitliest.
Lassen sich Adressen und Datentypen exportieren?Ja, im Studio über „Bearbeiten – Adressen ODBC Export“, wahlweise alle oder nur die markierten Adressen. Zur Wahl stehen das XML-Format des ETS-Gruppenadressexports (Name, Adresse, DPT) und das ESF-Format (Textdatei mit Gruppennamen, Adresse, Kommentar und Datentyp). Die Verknüpfungen mit Funktionsbausteinen und Bedienelementen werden nicht exportiert.Kann die KNX-Schnittstelle der Steuerung als KNXnet/IP-Schnittstelle genutzt werden?Steuerungen mit eingebauter KNX-Schnittstelle bringen ein internes KNX IP Gateway mit. Solange es ausgeschaltet ist, ist UDP-Port 3671 nicht erreichbar. Eingeschaltet wird es im Studio unter „Steuerung – Dienste“ oder im Webinterface eingeschaltet. Im Baustein KNX Schnittstelle muss dafür der Typ „KNX-IP Gateway onboard“ eingestellt sein.
Kann der Modbus-TCP-Slave für ein Fremdsystem genutzt werden?Ja. Dafür wird ein Baustein Modbus TCP Slave angelegt, an dessen Eingängen die Variablen verknüpft werden, die als Register bereitstehen sollen. Port 502 ist erst offen, wenn ein solcher Baustein im Projekt ist. Registerbelegung und Funktionscodes stehen in der Hilfe des Bausteins.Projekt mit älterem Studio: „Unbekannter Funktionsbaustein“Zeigt das Studio beim Öffnen „Unbekannter Funktionsbaustein“, ist das Studio älter als das Projekt und kennt diesen Baustein noch nicht. Es handelt sich nicht um kundenspezifische Bausteine.
|