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
Docker ermöglicht es, Services oder Applikationen per Befehl in einem sogenannten Container zu starten.
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:
Achtung der Ordner /mosquitto/configund 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 inlocal 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:
Ein erneuter Start des Containers verwendet die erstellte Konfiguration und das vergebene Passwort:
docker compose up -d
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
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.
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
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
A
anonym
Hallo Klaus,
der Benutzer im Beispiel oben heißt "mqtt". Ist ein bisschen unglücklich im Kontext :-)
Liebe Grüße,
Manuel
B
Bernhard
Stimmt, vielen Dank: habe den Usernamen auf mqttuser geändert.
Fragen / Kommentare