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

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:

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:

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

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

positive Bewertung({{pro_count}})
Beitrag bewerten:
{{percentage}} % positiv
negative Bewertung({{con_count}})

DANKE fĂŒr deine Bewertung!

Aktualisiert: 11.12.2022 von Bernhard | Translation English |🔔 | Kommentare:3
ESP32 MQTT - Daten senden

ESP32 MQTT - Daten senden

erstellt: 13.07.2023 von Bernhard

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


➚ Steuern des Automowers mittels Steckdose - Regensensor? | ➊ Smart Home | Grafana: Docker - Daten visualisieren und Alarme definieren ➚
➩ Container | sichere https Verbindung: Traefik Reverse Proxy + Let®s Encrypt ➹

Top-Artikel in diesem Bereich


WasserzĂ€hler ĂŒberwachen, Verbrauch aufzeichnen: ESP32-Cam

Vorab schon mal ein herzliches Dankeschön an die Macher des "AI-on-the-edge-device" Digitizer. Das Projekt ermöglicht das Digitalisieren des Wasserverbrauchs einer analogen Wasseruhr mit einer 10 € billigen ESP32-Cam. Wie das genau funktioniert, beschreibe ich in diesem Artikel.


Smart-Home-Plattform - Systeme: ioBroker vs. Home-Assistant

Meine Empfehlung, mĂŒsste ich mich zwischen ioBroker und Home Assistant entscheiden, wĂŒrde zugunsten von Home Assistant fallen. Mit Home Assistant fĂ€llt der Start wesentlich leichter und dank der zahlreichen Plugins kann Home Assistent allen BedĂŒrfnissen angepasst werden


ioBroker installieren - Docker

Mit ioBroker können verschiedene Automatisierungslösungen oder GerÀte in einem System zusammengefasst werden. Um bestimmte Gateways oder GerÀte ansprechen zu können, werden in ioBroker verschiedene Adapter verwendet.

Fragen / Kommentare


(sortiert nach Bewertung / Datum) [alle Kommentare(neueste zuerst)]

✍anonym
02.12.2022 22:20
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
↳
✍anonym
gepostet am 11.12.2022 11:57
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
↳
✍Bernhard
gepostet am 11.12.2022 14:20
Stimmt, vielen Dank: habe den Usernamen auf mqttuser geÀndert.

Beitrag erstellt von Bernhard

Durch die weitere Nutzung der Seite stimmst du der Verwendung von Cookies zu Mehr Details