NodeMCU ESP8266 Sensoren an ioBroker über MQTT – #1 Prototyp
In diesem Artikel zeige ich, wie Du deinen eigenen Sensor auf NodeMCU ESP8266 Basis in ioBroker integrieren kannst.Vor wenigen Tagen kam mein NodeMCU ESP8266 Starter Kit. In diesem Paket liegt ein NodeMCU ESP8266 Board mit viel Zubehör und einer CD mit vielen Erklärungen und Beispielen. Mein Ziel war es einen einfachen Temperatur und Luftfeuchtigkeitssensor mittels diesem Board zu implementieren, welches die Daten über das integriere WIFI-Board und MQTT an den ioBroker überträgt. Bevor wir nun loslegen, hier der Amazon-Link zum Starter Kit, welches ich verwendet habe:
1. Benötigte Produkte
Wer nicht alle Sensoren und Komponenten des Start-Kits benötigt, kann sich die NodeMCU, den DHT11 Sensor und die Jumper-Kabel natürlich auch einzeln kaufen. Als Einsteiger empfehle ich aber auf jeden Fall das Starter-Kit, da hier auch die Konfiguration und Installation der Entwicklungsumgebung erklärt wird.
2. Installation und Konfiguration der Entwicklungsumgebung
Die Einstellungen und Konfoguration von Arduino lasse ich hier mal aus, da es sonst zu umfangreich wird. Alle erforderlichen Schritte sind ausführlich im Starter-Kit beschrieben und sollten mittels den Beispielen auch einmal exemplarisch durchgeführt werden.
3. Aufbau der Schaltung (Prototyp)
Für die Schaltung benötigen wir nun folgende Produkte (alle im Starter-Kit enthalten)
– NodeMCU Board
– DHT11 Temperatur- und Luftfeuchtigkeitssensor
– Jumper Kabel
Im ersten Schritt bauen wir nun auf unserem Prototyp-Board folgende Schaltung auf:
Nach dem die wirklich sehr einfache Schaltung aufgebaut wurde, schreiben wir nun unseren Sketch um die Sensordaten auszulesen und mittels MQTT an den ioBroker zu senden.
#include <ESP8266WiFi.h> #include <PubSubClient.h> #include<dht.h> dht DHT; // Define NodeMCU D3 pin to as temperature data pin of DHT11 #define DHT11_PIN D3 // Update these with values suitable for your network. const char* ssid = "WLAN-SSID; const char* password = "WLAN-PWD"; const char* mqtt_server = "192.168.2.90"; WiFiClient espClient; PubSubClient client(espClient); long lastMsg = 0; char msg[50]; int value = 0; void setup_wifi() { delay(100); // We start by connecting to a WiFi network Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } randomSeed(micros()); Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Create a random client ID String clientId = "ESP8266Client-"; clientId += String(random(0xffff), HEX); // Attempt to connect //if you MQTT broker has clientID,username and password //please change following line to if (client.connect(clientId,userName,passWord)) if (client.connect(clientId.c_str())) { Serial.println("connected"); //once connected to MQTT broker, subscribe command if any client.subscribe("OsoyooCommand"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 6 seconds before retrying delay(6000); } } } void setup() { Serial.begin(115200); setup_wifi(); client.setServer(mqtt_server, 1883); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); long now = millis(); // read DHT11 sensor every 6 seconds if (now - lastMsg > 10000) { lastMsg = now; int chk = DHT.read11(DHT11_PIN); String msg=""; char MsgTemp[25]; char MsgFeutigkeit[25]; msg= DHT.temperature; msg.toCharArray(MsgTemp,25); msg=DHT.humidity; msg=msg+"%"; msg.toCharArray(MsgFeutigkeit,25); client.publish("Temp", MsgTemp); client.publish("Feuchtigkeit", MsgFeutigkeit); } }
Hinweis: Im Sketch muss die SSID, das Kennwort sowie die IP-Adresse des ioBrokers angepasst werden.
Diesen Sketch müssen wir nun per Arduino IDE auf die NodeMCU hochladen.
4. Konfiguration des ioBroker MQTT Adapters
Im ersten Schritt der Konfiguration wechseln wir nun in die Administrationsoberfläche und installieren den Adapter „MQTT Broker/Client“.
Nach der Installation des Adapters wird die Konfiguration geöffnet.
Hier wählen wir bei Typ „Server/broker“ und speichern und schließen die Einstellungen.
Nach der Konfiguration können wir nun den Adapter starten und auch die NodeMCU mit Strom versorgen und damit den Sketch starten.
Nach dem der Adapter und die NodeMCU gestartet wurden, dauert es ca. 10 Sekunden, bis die ersten Informationen in den Objekten des ioBroker sichtbar sind 🙂
So einfach lassen sich eigene Sensoren mittels MQTT und dem NodeMCU Board in ioBroker integrieren. Das war erst der Anfang, ich werde mit diesem genialen Projekt definitiv noch weitere Sensoren oder Aktoren realisieren. Im nächsten Artikel werde ich das ganze in ein Gehäuse einbauen und evtl. noch mit einem Display versehen. Fragen wie immer in die Kommentare oder üer E-Mail 🙂
Hallo Matthias,
tolles Projekt. Genau das habe ich gesucht.
Ich habe alles so nachgebaut wie oben beschrieben und dargestellt und es funktionierte auf Anhieb perfekt.
Kommen wir jetzt zu meinem Problem.
Ich habe eine Wetterstation (Wind, Windrichtung, Temperatur, Solar, Regen, etc.) mit einem Arduino Mega realisiert. Jetzt möchte ich dein Projekt dazu nutzen die Daten der Wetterstation über das nodemcu 8266 zum iobroker zu senden.
Ich habe versucht die Daten vom Mega zum nodemcu 8266 über die serielle Schnittstelle zu senden, auch mit Erfolg, aber dann komme ich nicht weiter, da leider sind meine Programmierkenntnisse sehr begrenzt sind.
Gibt es hier eine einfache Lösung?
Über eine Rückmeldung würde ich mich sehr freuen.
Gruß
Manfred
Hallo Manfred, danke, das freut mich 🙂
Ich würde vielleicht einen anderen Weg gehen, ich würde die Daten der Wetterstation direkt über MQTT an den ioBroker senden, ich denke das ist einfacher.
Viele Grüße,
Matthias
Hallo Matthias,
vielen Dank für die schnelle Rückantwort.
Die Daten direkt über MQTT an den iobroker zu senden finde ich gut.
Dennoch möchte ich die Daten wifi übertragen, da der Arduino Mega sich im Aussenbereich befindet.
Wie könnte die Lösung denn aussehen?
Gruß
Manfred
Pingback: ESP8266 Sensoren an ioBroker über MQTT – Finaler Sensor mit Solarmodul und Sensoren – smarthome-tricks.de
Hallo,
ich habe diverse Problemchen beim Kompilieren des oberen Sketches, vielleicht kannst du mir helfen?
1. fatal error: dht.h: No such file or directory
den Fehler habe ich beseitigt in dem ich die Library groß geschrieben habe da diese so installiert wird (DHT.h)
2. DHTtester:4: error: ‚dht‘ does not name a type
dht DHT;
^
DHTtester.ino: In function ‚void loop()‘:
DHTtester:82: error: expected primary-expression before ‚.‘ token
int chk = DHT.read11(DHT11_PIN);
^
DHTtester:87: error: expected primary-expression before ‚.‘ token
msg= DHT.temperature;
^
DHTtester:90: error: expected primary-expression before ‚.‘ token
msg=DHT.humidity;
^
exit status 1
‚dht‘ does not name a type
Sinngemäß müsste der Eintrag doch eigentlich „DHT dht;“ heißen, allerdings kommen dann ganz andere Fehler.
Ich habe ein frisches Arduino IDE mit aktuellen Bibliotheken installiert (ESP8266 + Adafruit + DHT + PubSubClient)
Gruß,
Dominik
Hallo Dominik,
könntest du mir deinen Source code zusenden?
Viele Grüße
Ich habe die gleichen Fehler,
was ist denn des Rätsels Lösung?
Gruß,
Meik
Hi,
ich erhalte die gleichen Fehler wie Du.
Wie lautet denn nun der richtige Code?
HI Matthias,
danke für deine Beiträge hier, mittlerweile läuft auch der erste 8266 mit dem Temp Sensor 🙂
Hast du schonmal überlegt den Batteriezustand mitzuloggen bzw. kommt man an die Daten dran? Ich betreibe den sensor derzeit noch ohne solarpanele und da wäre es natürlich gut zu wissen wenn der akku leer geht…
LG
Philipp
Hallo Matthias,
ich habe dein Sketch so in Arduino IDE eingefügt, aber bekomme wie hier auch einige andere immer wieder Fehler. Kannst du da nochmal helfen…..DANKE
Hallo Matthias
Deine Sketch ist super der hat mich um einiges weiter gebracht.
Mein Problem ist das ich einen anderen Sensor habe (MAX6675 Thermocouple).
Ich kann mich auch schon erfolgreich über MQTT verbinden, aber die Werte werden nicht übertragen.
Kannst du mir da vielleicht helfen.
Hallo,
super Anleitung zur MQTT Übertragung.
Ich sehe wie du nun die Werte Temperatur und Luftfeuchte.
Kann man es auch so einrichten, wie bei Sonoff Geräten, das ein extra „Ordner“ mit dem Namen des Geräts erstellt wird und darin dann die Werte sind?
So ist es ja blöd, wenn ich z.B. einen zweiten Temperatursensor mit einbinden möchte.
Habe die Lösung gefunden:
client.publish(„Wetterstation1/Temp“, MsgTemp);
client.publish(„Wetterstation1/Feuchtigkeit“, MsgFeutigkeit);
Moin,
super, genau. Du kannst einfach vor den Topic-Name noch eine Ordner-Struktur setzen. Gerade bei mehreren Geräten geht es nicht ohne. Evtl. noch das Gewerk dazu, dann sollte es für die Zukunft ausreichen 🙂
Danke für Deine Rückmeldung hier! 🙂
Hallo,
in deinem Tutorial wird die „NodeMCU Lua Amica Modul V2“ abgebildet, in StarterSet scheint es aber die „NodeMCU Lua Lolin V3“ zu sein.
Macht das einen Unterschied?
Moin,
nein, es ist einfach die neueste NodeMCU-Komponenten. Da gibt es keine großen Unterschiede.
Hallo,
ich habe mir jetzt einen DHT22 zugelegt, da dort die Genauigkeit besser ist und der Messbereich, der Temperatur größer ist.
Wenn ich im Skech jetzt DHT11, durch DHT22 umändere, bekomme ich die Daten aber leider nicht angezeigt.
Könntest du da behilflich sein?
Hallo,
vergleiche mal bitte den Code mit diesem hier, nicht dass sich hier ein Fehler eingeschlichen hat.
https://www.smarthome-tricks.de/esp8266/anleitung-temperatur-und-luftfeuchtigkeit-messen/
Viele Grüße,
Matthias
Hallo,
ein sehr schönes Tutorial hast du da gebastelt. Vor allem sehr verständlich!
Iich habe mich an dieses gehalten und bin schnell zum Ergebnis gekommen.
Mein Problem ist nun, dass ich mir jetzt ein Paar Sonoff mit Tasmota in den IOBroker eingebunden habe, welche auch über MQTT Protokoll sprechen. Jetzt habe ich 2 Adapter welche MQTT Protokolle verarbeiten und anscheinend einander stören. Wenn der Sonoff Adapter zuerst online war, hatte er Glück und kann mit den Geräten kommunizieren und Node MCU tauchen nicht in der Liste auf.
Weißt du vielleicht wie man dieses Problem lösen kann?
Bitte prüfe mal die Ports, nicht dass hier beide MQTT-Adapter den selben Port verwenden.
Hallo Matthias,
Ich bekomme die gleichen Fehlermeldungen wie Dominik oben beschrieben hat.
Was kann ich da machen das es bei mir auch funktioniert.
Sg. Gerald
Hallo,
Wollte mal nachfragen ob es schon eine Lösung für das Problem von Dominik (siehe Beitrag vom 13. Juli 2018 ).
Ich habe die gleichen Fehlermeldungen bei meinem NodeMcu.
Kann mir da jemand weiterhelfen.
Sg. Gerald
Die gleichen Fehlermeldungen laufen auch bei mir auf.
Gibt es keine Lösung?
MfG Raimund
Hallo,
Bei mir läuft es jetzt mit folgenden Änderungen mit einem DHT22:
#include
#define DHTPIN D12
DHT dht (DHTPIN, DHT22);
In „void setup()“ zusätzlich eingefügt:
dht.begin();
In „void loop ()“ geändert:
int chk = dht.read();
msg= dht.readTemperature();
msg= dht.readHumidity();
Sg. Gerald
Hallo Gerald,
könntest du den vollständigen Code veröffentlichen?
Bekomme deine Anpassungen für den DHT22 nicht übernommen ohne Fehler.
Danke
Stephan
Sollte heissen:
#include
Hallo,
bei mir funktioniert die Verbindung zum ioBroker und die Objekte Feuchtigkeit und Temperatur werden angezeigt. Ich bekomme aber keine Werte sondern nan im ioBroker angezeigt.
Kann mir da jemand helfen?
Danke und Grüße, Gerhard
Hier mein loop code:
void loop()
{
if (!client.connected()) {
reconnect();
}
client.loop();
long now = millis();
// read DHT22 sensor every 6 seconds
if (now – lastMsg > 10000) {
lastMsg = now;
int chk = dht.read();
String msg = „“;
char MsgTemp[25];
char MsgFeutigkeit[25];
msg = dht.readTemperature();
msg.toCharArray(MsgTemp, 25);
msg = dht.readHumidity();
msg = msg + “ % „;
msg.toCharArray(MsgFeutigkeit, 25);
client.publish(„Temp“, MsgTemp);
client.publish(„Feuchtigkeit“, MsgFeutigkeit);
}
}
Hallo Gerhard,
Hast du das Problem beheben können?
Mir stellt sich aktuell das selbe Problem.
Viele Grüße
Marco
Hey,
habe diesen Sketch jetzt via Platform IO genutzt.
Habe mein SSID eingetragen, das Passwort dazu und die IP des Iobroker. Alles in “ wobei bei der SSID in deinem Sketch das jintere “ fehlt. Oder müssen die “ raus?
Desweiteren habe ich bei client.setServer(mqtt_server, 1884);
die1884 eingetragen, da meine Sonof Instanz schon die 1883 nutzt.
Aber ich bekomme keine Daten.
Desweitern ist das Wifi des ESP noch sichtbar.
Welche Bibliotheken wurden da installiert?
Ich bekomme leider nur Fehlermeldungen mit den mir bekannten .h
Hallo, ich habe den IO-Broker auf einem raspberry pi 3 laufen. Zusätzlich eine Homatic auf einem weiterem PI. Auf dem PI des IO-Broker ist auch ein Conbee installiert. Der MQTT-Broker/Server zeigt nach der Installation und Start nur einen gelben Punkt in der Instanz. Das ESP-Bordt wird auch nicht in den Objekten angezeigt. Woran kann das liegen?
Moin,
was steht denn in den Logs zum MQTT-Adapter? Da sollte dann ein Fehler bzw. Hinweis zu finden sein.
LG Matthias
Fehler gefunden!! Hatte einen Schreibfehler im Password, und das der MQTT-Adapter auf gelb geht liegt daran wenn keine MQTT-Verbindung besteht
Alles klar, danke für die Rückmeldung 🙂
Hallo Matthias,
vorab, finde Deine Projekte sehr gut.
Du könntest mir bestimmt bei meinen Problem helfen.
Ich habe ein Arduino Projekt „Wortuhr“.
In dem sind die Farbwerte wie folgt einzustellen.
//Farbwert ROT
const unsigned int RGBValueRed = 50;
//Farbwert GRÜN
const unsigned int RGBValueGreen = 50;
//Farbwert BLAU
const unsigned int RGBValueBlue = 30;
Ich würde gerne diese Werte über ioBroker mit Datenpunkte verstellen.
Würde mich freuen, wenn Du mir helfen könntest.
Bin mit dem Arduino nicht so vertraut.
Im voraus vielen Dank.
Gruss
Claus
Hallo Matthias,
Hut ab, vor dem, was du immer wieder auf die Beine stellst.
Ich stehe gerade vor der Herausforderung einen mqtt clienten mit dem iobroker zu verbinden.
Die Grundlage ist bei mir Zuhause ein arduino mega an dem u.a. Ultraschallsensor zur Zisternenfüllmenge berechnen, 2xds18b20, 6 dht Sensoren, 1 Windmesser, 1 Spannungsmesser, 1 Strommesser und noch mehrere variablen in Abhängigkeit berechnet werden (chillfaktor usw.) Alles in allem ein Recht komplexer Sketch.
Mein ursprünglicher Gedanke war den arduino selbst die Daten per Ethernet shield an den iobroker zu schicken, das geht aber nicht.
Lässt es sich irgendwie einrichten dass der arduino per serieller Schnittstelle die Daten an ein nodemcu übergibt und der dann die Daten per mqtt an den iobroker sendet?
Über einen Hilfeansatz wäre ich echt dankbar.
Grüße
Raphael
Hi.
Danke für den Code. Das ist für meine ersten Gehversuche sehr hilfreich.
Ich hatte mich gefragt, ob es statt einer zufälligen ID auch mit einer statischen ClientID geht. Hätte den Vorteil, dass man die Sender eindeutig identifizieren kann. Wichtig, wenn es mehrere Sensoren gibt.
Dazu habe ich ein Beispiel gefunden. Die Methode ESP.getChipId() liefert eine eindeutige Kennung. Damit bekommt jeder ESP8266 eine eindeutige Kennung. Codebeispiel gibt es in GitHub (https://gist.github.com/kd8bxp/3af6508b72b2db83c2fe93228e2b6fa2)