MQTT Bridge - mdzio/ccu-jack GitHub Wiki
MQTT-Brücke (-Bridge) zu anderen Servern
Der CCU-Jack kann eine Verbindung zu anderen MQTT-Servern bzw. anderen CCUs mit installiertem CCU-Jack aufbauen. Dies ermöglicht vielfältige Anwendungsmöglichkeiten:
- Senden aller Wertänderungen von allen oder bestimmten CCU-Datenpunkte an einen externen MQTT-Server
- Empfang von Steuersignalen von einem externen MQTT-Server
- Direkte Kopplung von zwei oder mehr CCUs
- Kopplung von zwei oder mehr CCUs über einen zentralen MQTT-Server
Durch die virtuellen MQTT-Geräte des CCU-Jacks können beliebige MQTT-Nachrichten erzeugt werden und auch auf beliebige MQTT-Nachrichten reagiert werden. Die virtuellen Geräte können direkt in CCU-Programmen angesteuert und auch abgefragt werden.
Es kann nur eine Brücke zu einem anderen Server aufgebaut werden. Eine Vernetzung von mehreren MQTT-Severn kann über eine Baumstruktur oder einem zentralen Server erfolgen.
Konfiguration
Für die MQTT-Brücke müssen die Verbindung zu dem zweiten MQTT-Server, die eingehenden und die ausgehenden Topics konfiguriert werden. Zurzeit erfolgt die Konfiguration in der Datei ccu-jack.cfg (siehe dazu auch Add-On Installationsdetails und CCU-Dateitransfer und Konsolenzugriff). Die Konfigurationsdatei darf nur geändert werden, wenn der CCU-Jack gestoppt ist.
| Konfigurationsoption | Bedeutung |
|---|---|
| MQTT.Bridge.Enable | Ein- oder Ausschalten der MQTT-Brücke (true oder false) |
| MQTT.Bridge.Address | IP-Adresse oder Host-Name des entfernten MQTT-Servers |
| MQTT.Bridge.Port | Port des entfernten MQTT-Servers |
| MQTT.Bridge.BufferSize | Maximale Größe einer MQTT-Nachricht in Bytes (optional, Standardwert 262144) |
| MQTT.Bridge.UseTLS | Verwende eine gesicherte Verbindung mit Zertifikaten (true oder false, optional) |
| MQTT.Bridge.CACertFile | Stammzertifikate zur Überprüfung des entfernten MQTT-Servers (optional) |
| MQTT.Bridge.Insecure | Zertifikat des entfernten MQTT-Servers nicht prüfen. (true oder false, optional) |
| MQTT.Bridge.Username | Benutzername für den entfernten MQTT-Severs |
| MQTT.Bridge.Password | Passwort für den entfernten MQTT-Severs |
| MQTT.Bridge.ClientID | Identifizierung des lokalen MQTT-Clients |
| MQTT.Bridge.CleanSession | Sitzungsdaten löschen (s.a. MQTT-Spezifikation) |
| MQTT.Bridge.Incoming | Eingehende Topics (siehe unten) |
| MQTT.Bridge.Outgoing | Ausgehende Topics (siehe unten) |
Dies ist ein Konfigurationsbeispiel. Es sind nur Optionen aufgelistet, die für die Konfiguration der MQTT-Brücke relevant sind:
{
"MQTT": {
"Bridge": {
"Enable": true,
"Address": "192.168.0.100",
"Port": 1883,
"UseTLS": false,
"CACertFile": "",
"Insecure": false,
"Username": "Benutzername",
"Password": "Passwort",
"ClientID": "Haupt-CCU",
"CleanSession": true,
"Incoming": [],
"Outgoing": []
}
}
}
Konfiguration der eingehenden und ausgehenden Topics
Mit den Konfigurationseigenschaften MQTT.Bridge.Incoming und MQTT.Bridge.Outgoing wird festgelegt, welche lokalen Topics an den entfernten Server versendet und welche Topics vom entfernten MQTT-Server empfangen werden sollen. Jeder Eintrag in MQTT.Bridge.Incoming bzw. Outgoing muss folgende Eigenschaften besitzen:
| Eigenschaft | Bedeutung |
|---|---|
| Pattern | MQTT-Suchmuster (optional mit den Platzhaltern # und +) |
| LocalPrefix | Lokales Präfix für die Topics |
| RemotePrefix | Präfix für die Topics vom entfernten MQTT-Server |
| QoS | Quality-of-Service (0, 1, oder 2; s.a. MQTT-Spezifikation) |
Eingehende Topics werden wie folgt behandelt:
Auf dem entfernten MQTT-Server wird das Topic aus den Eigenschaften RemotePrefix und Pattern zusammengesetzt und abonniert. Bei der Übertragung wird das RemotePrefix durch das LocalPrefix ersetzt. Auf dem lokalen MQTT-Server wird nun die MQTT-Nachricht mit dem geänderten Topic publiziert.
Ausgehende Topics werden wie folgt behandelt:
Auf dem lokalen MQTT-Server wird das Topic aus den Eigenschaften LocalPrefix und Pattern zusammengesetzt und abonniert. Bei der Übertragung wird das LocalPrefix durch das RemotePrefix ersetzt. Auf dem entfernten MQTT-Server wird nun die MQTT-Nachricht mit dem geänderten Topic publiziert.
Die eingehenden und ausgehenden Topics dürfen sich nicht überlappen, da ansonsten eine MQTT-Nachricht unendlich zwischen den Servern hin und her geschickt wird.
Gesicherte Verbindung mit TLS
Für eine gesicherte Verbindung sind zusätzlich folgende Konfigurationsoptionen zu setzen:
{
...
"UseTLS": true,
"CACertFile": "/path/to/cacerts.pem",
"Insecure": false,
...
}
Für eine gesicherte Verbindung zu einer entfernten CCU mit installiertem CCU-Jack muss die Datei /etc/config/server.pem der entfernten CCU auf die lokale CCU kopiert werden (z.B. nach /usr/local/addons/ccu-jack) und mit der Option CACertFile referenziert werden.
Die Überprüfung des Server-Zertifikats kann für Testzwecke durch Setzen der Option "Insecure": true temporär deaktiviert werden.
Beispiel für die Anbindung an einem überlagerten MQTT-Server
Die CCU ist im überlagerten MQTT-Server unter dem Topic-Prefix charly/ zu finden. Die Topics mit den Mustern charly/+/set/# und charly/+/get/# können auf dem überlagerten MQTT-Server publiziert werden, die Wertaktualisierungen sind unter dem Topic charly/+/status/# abonnierbar.
...
"MQTT": {
"Port": 1883,
"PortTLS": 8883,
"BufferSize": 0,
"WebSocketPath": "/ws-mqtt",
"Bridge": {
"Enable": true,
"Address": "mein-externer-mqtt-server",
"Port": 1883,
"BufferSize": 0,
"UseTLS": false,
"CACertFile": "",
"Insecure": false,
"Username": "charly",
"Password": "geheim",
"ClientID": "charly",
"CleanSession": true,
"Incoming": [
{
"Pattern": "+/set/#",
"LocalPrefix": "",
"RemotePrefix": "charly/",
"QoS": 0
},
{
"Pattern": "+/get/#",
"LocalPrefix": "",
"RemotePrefix": "charly/",
"QoS": 0
}
],
"Outgoing": [
{
"Pattern": "+/status/#",
"LocalPrefix": "",
"RemotePrefix": "charly/",
"QoS": 0
}
]
}
},
...
Beispiel für die Anbindung einer entfernten CCU
Im folgenden Konfigurationsbeispiel werden alle Topics einer zweiten CCU abonniert und erscheinen mit dem Präfix remote-ccu/recv/ auf dem lokalen MQTT-Server. Werden auf dem lokalen Server MQTT-Nachrichten mit dem Topic-Präfix remote-ccu/send/ publiziert, so erscheinen sie auf dem entfernten Server ohne dieses Präfix.
...
"Incoming": [
{
"Pattern": "#",
"LocalPrefix": "remote-ccu/recv/",
"RemotePrefix": "",
"QoS": 0
}
],
"Outgoing": [
{
"Pattern": "#",
"LocalPrefix": "remote-ccu/send/",
"RemotePrefix": "",
"QoS": 0
}
]
...