Software KNX Router: KNXD

Bei der Planung meiner KNX Smart Home Anlage habe ich mich damals dafür entschieden, einen KNX Tunnel für die Programmierung zu nutzen. Dies schien mir als eine einfache und kosteneffiziente Lösung, mit der ich nach der Programmierung auch einen Smart Home Server mit OpenHAB verbinden konnte. Alles funktionierte soweit reibungslos.

Kürzlich wollte ich jedoch einige Tasmota-basierte Smart Home Geräte über KNX IP in das KNX Netz integrieren. Dabei habe ich endlich den Unterschied zwischen einem Router und einem Tunnel verstanden. Ein Router kann als Brücke zwischen KNX IP und KNX TP arbeiten, ähnlich einem Linienkoppler. Leider gilt das nicht für den Tunnel.

Da ich keine weiteren 250 Euro für einen KNX Router ausgeben wollte, begab ich mich auf die Suche nach Softwarelösungen und stieß dabei auf KNXD. Diese schien eine einfache Lösung für mein Problem zu sein. Man konfiguriert zwei Schnittstellen, zum Beispiel ein Netzwerkinterface für KNX IP und einen Adapter für KNX TP (in meinem Fall das Tunnelgerät), und die Software routet die KNX-Pakete zwischen beiden Schnittstellen hin und her.

Es klang einfach – und war es irgendwie auch – aber die Konfiguration erwies sich als Graus. Irgendwann wurde die Konfiguration von Kommandozeilenargumenten auf eine Konfigurationsdatei umgestellt. In Foren findet man hauptsächlich Informationen zu den alten Einstellungen. Es gibt sogar ein Programm, das die Argumente in eine Konfigurationsdatei umwandelt, jedoch erstellt es keine korrekten Konfigurationsdateien, mit denen das Programm startet. Lustigerweise ist auf GitHub genau dieser Fehler beschrieben, aber die Entwickler sind anderer Meinung und haben das Problem geschlossen. Ich denke, sie haben es nie ausprobiert.

Wie auch immer, nach viel Recherche habe ich es geschafft, eine Konfiguration zu erstellen, die funktioniert. Für meinen einfachen Fall benötigt man folgende Argumente: -e 0.1.203 -E 0.1.6:9 -b ipt:192.168.178.12:3671 -DRS -n "KNXD", wobei -e die Adresse des Routers, -E freie Adressen im Netz zum Routen externer Geräte, -b die Schnittstelle ins KNX-Netz (in meinem Fall das Tunnelgerät) und weitere Optionen für das Ausführen als Daemon, Router-Modus, Name usw. sind.

Als Konfigurationsdatei sieht das ganze so aus:

[A.ipt]
dest-port = 3671
driver = ipt
ip-address = 192.168.178.12
[debug-server]
name = mcast:knxd
[main]
addr = 0.1.203
client-addrs = 0.1.6:9
connections = A.ipt,server
name = KNXD
systemd = systemd
[server]
debug = debug-server
discover = true
router = router
server = ets_router

Man bemerke, dies ist die Konfiguration für ein Debian-System. Für andere Linux-Varianten sieht es wieder anders aus. Ich empfehle, das Ganze in einem Docker-Container laufen zu lassen, sodass man sich darum keine Sorgen machen muss. Glücklicherweise sehen das auch andere Menschen so, die ebenfalls ein fertiges Image bereitstellen. Hier ist eine funktionierende Docker-Compose-Datei, die die oben stehende Konfiguration als „config.ini“ bereitstellt:

version: '3.4'
services:
  knxd:
    image: tekn0ir/knxd
    container_name: knxd
    volumes:
      - ./config.ini:/config.ini
    ports:
      - 6720:6720
      - 3671:3671
    restart: always
    network_mode: host