🕸️ MQTT - Wie verwandle ich meinen ESP32 in einen MQTT-Client?
Ich beschäftige mich schon seit einiger Zeit (siehe hier) mit dem ESP32 Microcontroller und wollte diesmal der Frage nachgehen, wie man den ESP32 mit Micropython in einen MQTT-Client verwandeln kann. MQTT ist ein Netzwerkprotokoll, welches unter anderem im Internet-of-Things (IoT) Umfeld die Kommunikation zwischen Geräten ermöglicht.
Wie in diesem Diagramm zu sehen ist, gibt es eine zentrale Anlaufstelle, den MQTT-Broker und einen oder mehrere MQTT-Clients, die Nachrichten senden (publish) und/oder empfangen (subscribe) können.
Im ersten Teil der Anleitung erkläre ich euch wie ihr einen MQTT-Broker einrichten könnt und werde dann im zweiten Teil darauf auf eingehen, wie ihr den MQTT-Client auf einem ESP32 einrichten könnt.
MQTT-Broker
Einer der bekanntesten MQTT-Broker ist mosquitto. Mosquitto lässt sich auf einem Debian-basierenden System wie folgt installieren.
sudo apt update
sudo apt install mosquitto -y
Wenn ihr jetzt sudo systemctl status mosquitto
eingebt, sollte der MQTT-Broker bereits lokal gestartet worden sein. Dabei wird standardmäßig der MQTT-Broker so eingerichtet, dass er nur lokal unter dem Port 1883 erreichbar ist. Kommunikation von einem Client außerhalb des MQTT-Brokers ist damit noch nicht möglich.
● mosquitto.service - Mosquitto MQTT Broker
Loaded: loaded (/lib/systemd/system/mosquitto.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2025-02-16 14:44:44 CET; 6 days ago
Um den MQTT-Broker im Netzwerk erreichbar zu machen, können wir die Konfiguration von mosquitto anpassen. Wir erstellen dafür ein Verzeichnis für die mosquitto-Konfiguration und öffnen eine Konfigurationsdatei.
sudo mkdir -p /etc/mosquitto/conf.d
sudo nano /etc/mosquitto/conf.d/mqtt.lookslikematrix.conf
Diese Datei füllen wir mit folgendem Inhalt.
listener 1883 0.0.0.0
allow_anonymous true
Speichern können wir jetzt mit Strg + X, Y und Enter und anschließend müssen wir den MQTT-Broker noch neu starten.
sudo systemctl restart mosquitto
Wenn ihr jetzt erneut sudo systemctl status mosquitto
eingebt, solltet ihr sehen, dass die neue Konfigurations-Datei geladen wurde.
Loading config file /etc/mosquitto/conf.d/mqtt.lookslikematrix.conf
Damit ist der MQTT-Broker von allen im Netzwerk unter der IP-Adresse (ip addr
) und dem Port 1883 erreichbar und kann ohne Authentifizierung verwendet werden. Solltet ihr nicht allen Teilnehmern in eurem Netzwerk vertrauen können, müsst ihr diese Einstellung zwingend anpassen (siehe die offizielle Dokumentation). Für jetzt lassen wir es allerdings so und kümmern uns um die Einrichtung des MQTT-Clients auf dem ESP32.
MQTT-Client
Wir betreiben den MQTT-Client auf dem ESP32 mit der micropython-mqtt Bibliothek von peterhinch. Dazu muss man erst mal micropython auf den ESP32 kopieren.
wget https://micropython.org/resources/firmware/ESP32_GENERIC-20241129-v1.24.1.bin
python -m venv .venv
source ./.venv/bin/activate
pip install esptool
esptool.py --chip esp32 --port /dev/ttyUSB0 erase_flash
esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 460800 write_flash -z 0x1000 ESP32_GENERIC-20241129-v1.24.1.bin
Danach installieren wir die micropython-mqtt
Bibliothek mit mpremote
auf dem ESP32.
pip install mpremote
mpremote mip install github:peterhinch/micropython-mqtt
Als Nächstes speichert ihr den folgenden Inhalt in eine main.py
-Datei, passt die Einstellungen des WLAN an und setzt die server
Adresse auf die IP-Adresse des eingerichteten MQTT-Brokers.
from mqtt_as import MQTTClient, config
import asyncio
config['ssid'] = 'WLAN_NAME'
config['wifi_pw'] = 'WLAN_PASSWORD'
config['server'] = 'MQTT_BROKER_IP_ADDRESS'
config['port'] = 1883
config["queue_len"] = 1
async def messages(client):
async for topic, msg, _ in client.queue:
mqtt_topic = topic.decode()
mqtt_msg = msg.decode()
print("[ %s | %s ] got value from topic." % (mqtt_msg, mqtt_topic))
async def up(client):
while True:
await client.up.wait()
client.up.clear()
await client.subscribe('lookslikematrix/#', 1)
async def main(client):
await client.connect()
for coroutine in (up, messages):
asyncio.create_task(coroutine(client))
n = 0
while True:
await asyncio.sleep(5)
print("[ %s | %s ]" % ("health", n ))
# If WiFi is down the following will pause for the duration.
await client.publish('health', '{}'.format(n), qos = 1)
n += 1
MQTTClient.DEBUG = True
client = MQTTClient(config)
try:
print("[ start ] Start MQTT client.")
asyncio.run(main(client))
finally:
client.close()
Und jetzt könnt ihr den MQTT-Client wie folgt starten. Es wird dabei der MQTT-Client gestartet, der alle 5 Sekunden ein Lebenszeichen unter dem Topic health
veröffentlicht, was ihr in der Konsolenausgabe sehen solltet.
mpremote run main.py
Ihr könnt dieses Lebenszeichen auf einem anderen MQTT-Client im Netzwerk dieses health
-Topic konsumieren. Mit Strg + C könnt ihr den Client dann beenden. Das könnt ihr auch auf dem gleichen PC machen, wo ihr schon den Broker betreibt.
sudo apt install mosquitto-clients
mosquitto_sub -h MQTT_BROKER_IP_ADDRESS -t health/#
Ihr könnt aber auch Nachrichten an das lookslikematrix
-Topic schicken, weil der ESP32-MQTT-Client darauf lauscht. Wenn ihr eine Nachricht schickt, sollte diese in der Konsolenausgabe des ESP32 auftauchen.
mosquitto_pub -h MQTT_BROKER_IP_ADDRESS -p 1883 -t lookslikematrix/lookslikematrix -m "Is so cool!"
Und an dieser Stelle im Code könnt ihr dann entscheiden, was ihr mit einer eingehenden Nachricht passieren soll. Ihr könntet beispielsweise eine LED an- und ausschalten. Es ist natürlich auch möglich, einen Sensor anzuschließen und diese Daten auszulesen und über ein Topic zu veröffentlichen, damit dann andere Teilnehmer im Netzwerk diese Informationen verarbeiten können. Die Möglichkeiten sind sehr vielseitig. Ich hoffe, ich konnte euch ein wenig weiterhelfen und freue mich natürlich über einen virtuellen Kaffee ☕ und eure Fragen und Anregungen unten im Kommentarfeld.
[1]: https://lookslikematrix.de/microcontroller/2019/09/12/micropython.html
[2]: https://de.wikipedia.org/wiki/MQTT