ESP8266 MQTT Tutorial


17.06.2018  |  Tutorial, ESP8266 Projekte

Der Mini-Bastelcomputer ESP8266 eignet sich bestens für Projekte mit geringem Budget, bei dem verschiedenste Geräte smart gemacht werden sollen. In diesem Tutorial möchte ich dir deshalb zeigen, wie du mit dem ESP8266 MQTT-Daten versenden kannst. Da der ESP8266 nur über wenig Rechenleistung verfügt, liegt es nahe, die gesammelten Daten an ein leistungsfähigeres Gerät, wie beispielsweise einen Raspberry Pi zu senden, der sie auswertet und die nötigen Befehle an den ESP8266 senden kann.

Mit ein bisschen Code beherrscht auch der NodeMCU ESP8266 MQTT.
In diesem Tutorial verwende ich einen Raspberry Pi, auf dem ein MQTT-Broker eingerichtet ist und der mit einem Python Skript auf Daten vom ESP8266 wartet und quasi als Server agiert. Wie du deinen Raspberry Pi als MQTT-Broker einsetzen kannst und wie du das Skript anlegst, habe ich bereits im Beitrag MQTT Raspberry Pi Einführung erklärt. Wie du den ESP8266 mit der Arduino IDE programmieren kannst, habe ich schon einmal in meinem ESP8266 Einführungstutorial erklärt. Falls du mit der Arduino IDE noch nicht so ganz fit bist, solltest du dir den Beitrag zuerst ansehen.

Die MQTT Bibliothek in die Arduino IDE importieren

Der ESP8266 kann von Haus aus noch kein MQTT. Deshalb muss zuerst die entsprechende Bibliothek eingebunden werden. Klicke dazu in der Arduino IDE oben in der Leiste auf Sketch und dort auf Bibliothek einbinden. Hier klickst du nun auf Bibliotheken verwalten und der Bibliotheken-Manager öffnet sich.
Im Menüpunkt
In der Bibliotheks-Verwaltung gibst du oben rechts in die Suchleiste "PubSubClient" ein. Bei den jetzt erschienenen Bibliotheken klickst du bei "PubSubClient" auf Installieren.
Hier muss die Bibliothek

ESP8266 MQTT-Daten an Python Skript auf dem Raspberry senden

In diesem Beispiel wird die Zeit, die der ESP8266 bereits läuft in Millisekunden per MQTT an den Pi gesendet. Der folgende Code verbindet sich mit deinem WLAN-Netzwerk und deinem MQTT-Broker und sendet dann alle 5 Sekunden die aktuelle Betriebszeit an den Pi. Dazu fügst du den folgenden Code in die Arduino IDE ein und änderst die Variablen SSIDPSK und MQTT_BROKER und setzt dort den Namen deines WLAN-Netzwerkes, das Passwort des Netzwerkes und die IP-Adresse deines Raspberry Pi ein. Anschließend kannst du den Code auf deinen ESP8266 flashen.
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char* SSID = "NETZWERKNAME";
const char* PSK = "NETZWERKSCHL&Uuml;SSEL";
const char* MQTT_BROKER = "BROKER_IP";

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;

void setup() {
	Serial.begin(115200);
	setup_wifi();
	client.setServer(MQTT_BROKER, 1883);
}

void setup_wifi() {
	delay(10);
	Serial.println();
	Serial.print("Connecting to ");
	Serial.println(SSID);

	WiFi.begin(SSID, PSK);

	while (WiFi.status() != WL_CONNECTED) {
		delay(500);
		Serial.print(".");
	}

	Serial.println("");
	Serial.println("WiFi connected");
	Serial.println("IP address: ");
	Serial.println(WiFi.localIP());
}

void reconnect() {
	while (!client.connected()) {
		Serial.print("Reconnecting...");
		if (!client.connect("ESP8266Client")) {
			Serial.print("failed, rc=");
			Serial.print(client.state());
			Serial.println(" retrying in 5 seconds");
			delay(5000);
		}
	}
}
void loop() {

	if (!client.connected()) {
		reconnect();
	}
	client.loop();

	snprintf (msg, 50, "Alive since %ld milliseconds", millis());
	Serial.print("Publish message: ");
	Serial.println(msg);
	client.publish("/home/data", "Hello World");
	delay(5000);
}
Um die Daten mit dem Python-Skript des Raspberry Pi zu empfangen startest du außerdem auf dem Pi das Skript mit dem folgenden Befehl:
sudo python mqtt_test.py
Jetz wird alle 5 Sekunden die aktuelle Betriebszeit des ESP8266 ausgegeben.

Daten empfangen und LED schalten

Im nächsten Beispiel wird eine LED an den ESP8266 angeschlossen und ein- bzw. ausgeschalten, wenn eine Nachricht, die der ESP8266 per MQTT erhalten hat, an bzw. off lautet.

Schaltung der LED-Steuerung

Als erstes musst du eine LED mit dem ESP8266 verbinden. Dazu schließt du den langen Pin der LED D7 und den kurzen Pin an GND an.
So sieht die Schaltung der WLAN-Fernbedienung aus.

Code der LED-Steuerung

Jetzt fügst du den folgenden Code in die Arduino IDE ein, setzt wieder die entsprechenden Daten für die Variablen SSIDPSK und MQTT_BROKER ein und flasht den Code auf den ESP.
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char* SSID = "NETZWERKNAME";
const char* PSK = "NETZWERKSCHL&Uuml;SSEL";
const char* MQTT_BROKER = "BROKER_IP";

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;

void setup() {
	pinMode(13, OUTPUT);
	Serial.begin(115200);
	setup_wifi();
	client.setServer(MQTT_BROKER, 1883);
	client.setCallback(callback);
}

void setup_wifi() {
	delay(10);
	Serial.println();
	Serial.print("Connecting to ");
	Serial.println(SSID);

	WiFi.begin(SSID, PSK);

	while (WiFi.status() != WL_CONNECTED) {
		delay(500);
		Serial.print(".");
	}

	Serial.println("");
	Serial.println("WiFi connected");
	Serial.println("IP address: ");
	Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) {
	Serial.print("Received message [");
	Serial.print(topic);
	Serial.print("] ");
	char msg[length+1];
	for (int i = 0; i < length; i++) {
		Serial.print((char)payload[i]);
		msg[i] = (char)payload[i];
	}
	Serial.println();

	msg[length] = '&#92;&#48;';
	Serial.println(msg);

	if(strcmp(msg,"on")==0){
		digitalWrite(13, HIGH);
	}
	else if(strcmp(msg,"off")==0){
		digitalWrite(13, LOW);
	}
}

void reconnect() {
	while (!client.connected()) {
		Serial.println("Reconnecting MQTT...");
		if (!client.connect("ESP8266Client")) {
			Serial.print("failed, rc=");
			Serial.print(client.state());
			Serial.println(" retrying in 5 seconds");
			delay(5000);
		}
	}
	client.subscribe("/home/data");
	Serial.println("MQTT Connected...");
}

void loop() {
	if (!client.connected()) {
		reconnect();
	}
	client.loop();
}
Um die LED nun schalten zu können, gibst du auf deinem Pi im Terminal die folgenden Befehle ein: Zum Einschalten der LED:
mosquitto_pub -d -t /home/data -m "on"
Zum Ausschalten der LED:
mosquitto_pub -d -t /home/data -m "off"
Der ESP8266 gibt die erhaltene Nachricht aus und schaltet die LED entsprechend.

Über den Autor


Sascha Huber

Hallo, ich bin Sascha, der Gründer von Smarthome Blogger.

Mit einer Leidenschaft für Technologie und einem Hintergrund als Software Engineer habe ich 2016 Smarthome Blogger gegründet. Mein Ziel war es schon immer, innovative Lösungen zu entdecken, die unser Leben einfacher und intelligenter gestalten können. In meinem beruflichen Leben arbeite ich täglich mit Software und Technik, aber auch in meiner Freizeit bin ich stets auf der Suche nach neuen technischen Spielereien und Möglichkeiten, mein Zuhause zu automatisieren und zu verbessern.

Auf Smarthome Blogger teile ich mein Wissen, meine Erfahrungen und meine Begeisterung für alles rund um das Thema Smarthome.



Dieser Beitrag hat dir gefallen?

Dann abonniere doch unseren Newsletter!