MQTT - Broker : Docker Setup
MQTT (Message Queuing Telemetry Transport) ist ein offenes Netzwerkprotokoll für das Übertragen von Nachrichten zwischen Geräten. Ein MQTT-Broker, wie der Open Source Mosquitto-Server, ist eine einfache Lösung um Daten von SmartHome-Geräten zu empfangen oder diese zu steuern. Als Beispiel setze ich MQTT mit einem ESP32-Microcontroller ein, damit dieser Werte an den MQTT-Broker sendet, welche über die MQTT-Integration in HomeAssistant abgerufen werden können. Zudem verwende ich den MQTT-Broker für die Kommunikation meiner Zigbee-Geräte über Zigbee2MQTT, siehe: Home-Assistant Docker Conbee 2 und Zigbee2MQTT / deCONZ.
Docker Basics
Ein Container ist eine vom Betriebssystem (OS) unabhängige isolierte Umgebung:
Beim ersten Start eines Containers, lädt Docker selbstständig alle notwendigen Quellen
aus dem Internet.
Docker kann unter Windows, macOS oder einer Linux-Distribution installiert werden,
siehe auch: Docker
Wer Docker und Docker-Compose auf seinem System installiert hat, kann nach Anlage der folgenden Datei den MQTT-Broker Mosquitto starten, fürs Erste ohne den Ordner config damit wir für MQTT ein Passwort vergeben können:
Um MQTT mittels docker compose zu starten, kann das Docker-Image mit einer simplen docker-compose.yml Datei heruntergeladen, erstellt und gestartet werden. Die Datei kann mit einem beliebigen Texteditor wie folgt befüllt und dann angepasst werden:
Dateiname: docker-compose.yml, Inhalt:
version: "2"
services:
mosquitto:
image: eclipse-mosquitto
container_name: mqtt
restart: always
volumes:
- ./mosquitto/data:/mosquitto/data
- ./mosquitto/log:/mosquitto/log
ports:
- "1883:1883"
- "9001:9001"
Das Beispiel verwendet Bind-Mounts und keine Docker Volumes für das permanente Speichern der Daten. Siehe: Docker Daten speichern: Docker Volumes vs. Host-Ordner
docker compose up startet den Container:
docker compose up
Achtung der Ordner /mosquitto/config und somit die Konfig-Datei: mosquitto.conf fehlt in dem docker-compose-File fürs Erste noch. Diese wird beim Starten initial erzeugt und befindet sich nur innerhalb des Containers, alle Einstellungen würden somit beim Neustart des Containers verloren gehen. Der Container funktioniert an dieser Stelle mit den Standardeinstellungen bereits, lässt aber sämtliche Geräte ohne Passwort mit dem Broker kommunizieren:
c:\temp\mosquitto>docker compose up
Recreating mqtt ... done
Attaching to mqtt
mqtt | 1642331896: mosquitto version 2.0.14 starting
mqtt | 1642331896: Config loaded from /mosquitto/config/mosquitto.conf.
mqtt | 1642331896: Starting in local only mode. Connections will only be possible from clients running on this machine.
mqtt | 1642331896: Create a configuration file which defines a listener to allow remote access.
mqtt | 1642331896: For more details see https://mosquitto.org/documentation/authentication-methods/
mqtt | 1642331896: Opening ipv4 listen socket on port 1883.
mqtt | 1642331896: Opening ipv6 listen socket on port 1883.
mqtt | 1642331896: Error: Address not available
mqtt | 1642331896: mosquitto version 2.0.14 running
Damit ich für MQTT ein Passwort vergeben kann und die Einstellungen nach dem Neustart des Containers vorhanden bleiben, habe ich mich in den Container verbunden und darin eine Passwort-Datei erzeugt:
c:\temp\mosquitto> docker exec -it mqtt sh
/ # mosquitto_passwd -b -c passwd mqttUser myMQTTPassword
/ # cat passwd
mqttuser:???x
Der Inhalt der Ausgabe mqttuser:???, kann dann im Ordner /config in die Datei passwd gegeben werden:
Dann sollte noch eine neue Datei "mosquitto.conf" für dir Konfiguration mit folgendem Inhalt angelegt werden:
port 1883
listener 9001
protocol websockets
persistence true
persistence_location /mosquitto/data
allow_anonymous false
password_file /mosquitto/config/passwd
Im Anschluss kann der Docker-Container gestoppt, der Ordner /mosquitto/config hinzugefügt und wieder gestartet werden:
Anpassungen an der docker-compose.yml-Datei: Hinzufügen von /config:
version: "2"
services:
mosquitto:
image: eclipse-mosquitto
container_name: mqtt
restart: always
volumes:
- ./mosquitto/config:/mosquitto/config
- ./mosquitto/data:/mosquitto/data
- ./mosquitto/log:/mosquitto/log
ports:
- "1883:1883"
- "9001:9001"
Ein erneuter Start des Containers verwendet die erstellte Konfiguration und das vergebene Passwort:
Ein Blick in die Ausgabe des Containers (docker logs) zeigt uns den erfolgreichen Start:
c:\temp\mosquitto>docker logs mqtt -f
1642333000: mosquitto version 2.0.14 starting
1642333000: Config loaded from /mosquitto/config/mosquitto.conf.
1642333000: Opening websockets listen socket on port 9001.
1642333000: Opening ipv4 listen socket on port 1883.
1642333000: Opening ipv6 listen socket on port 1883.
1642333000: mosquitto version 2.0.14 running
Für eine Integration in Home Assistant, siehe: Home Assistant Integrationen
Anzeige der Verbindungen: Logs
In den Docker-Logs kann die Verbindung einzelner Geräte beobachtet werden:
docker logs mqtt -f
1641494340: New connection from 172.22.0.4:44135 on port 1883.
1641494340: New client connected from 172.22.0.4:44135 as ?????? (p2, c1, k60, u'mqtt').
1641494608: Client ??? closed its connection.
1641496053: Saving in-memory database to /mosquitto/data/mosquitto.db.
Dienste, die den MQTT-Broker verwenden
ESP32 MQTT - Daten senden
Um Daten von einem ESP32 empfangen zu können, habe ich einen MQTT-Broker als Docker-Container vorbereitet. Der Container kann mittels Integration in Home-Assistant eingebunden werden und somit die Daten vom ESP32 über MQTT an Home-Assistant weiterleiten. Seitens ESP32 habe ich das Senden mit folgendem Sketch in der Arduino IDE getestet und später die relevanten Teile in einen weiteren Sketch integriert. ... weiterlesen
{{percentage}} % positiv
DANKE für deine Bewertung!
Fragen / Kommentare
(sortiert nach Bewertung / Datum) [alle Kommentare(neueste zuerst)]
Guten Abend, ich bin bislang noch nicht angemeldet auf Ihrer Seite, möchte aber trotzdem mal (zuerst) meinen Dank aussprechen für diese Anleitung. Ich bin soweit, dass Portainer das mqtt-image als "running" ausweisst... ;) Meine Frage ist folgende: In Homeassistant werde ich nei der MQTT-Integration nach "server" und nach "Benutzernamen" und seinem Passwort gefragt. Letzteres habe ich (wobei ich "mosquitto_passwd -b -c passwd mqtt myMQTTPassword" so interpretiert habe, dass myMQTTPassword durch mein eigenes ersetzt werden musste). Wie aber ist der Name des Servers, und wie heisst der Benutzer? Besten Dank vorab von einem Einsteiger, Klaus
Hallo Klaus, der Benutzer im Beispiel oben heißt "mqtt". Ist ein bisschen unglücklich im Kontext :-) Liebe Grüße, Manuel
Beitrag erstellt von anonym
Stimmt, vielen Dank: habe den Usernamen auf mqttuser geändert.
Beitrag erstellt von Bernhard