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 🙂

 

Matthias Korte

Hauptberuflich Software-Entwickler und seit einigen Jahren Smart-Home Fan. Angefangen hat alles mit einem RaspberryMatic und einer schaltbaren Steckdose. Mittlerweile habe ich einige Steckdosen, Sensoren, und Thermostate sowie ioBroker zur Visualisierung im Einsatz.

22 Gedanken zu „NodeMCU ESP8266 Sensoren an ioBroker über MQTT – #1 Prototyp

  • 13. Mai 2018 um 19:40
    Permalink

    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

    Antwort
    • 13. Mai 2018 um 19:42
      Permalink

      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

      Antwort
  • 13. Mai 2018 um 20:08
    Permalink

    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

    Antwort
  • Pingback:ESP8266 Sensoren an ioBroker über MQTT – Finaler Sensor mit Solarmodul und Sensoren – smarthome-tricks.de

  • 13. Juli 2018 um 18:08
    Permalink

    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

    Antwort
    • 8. August 2018 um 16:04
      Permalink

      Hallo Dominik,

      könntest du mir deinen Source code zusenden?

      Viele Grüße

      Antwort
      • 9. Oktober 2018 um 14:55
        Permalink

        Ich habe die gleichen Fehler,

        was ist denn des Rätsels Lösung?

        Gruß,
        Meik

        Antwort
    • 24. Januar 2019 um 20:16
      Permalink

      Hi,
      ich erhalte die gleichen Fehler wie Du.
      Wie lautet denn nun der richtige Code?

      Antwort
  • 22. Juli 2018 um 12:00
    Permalink

    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

    Antwort
  • 2. August 2018 um 12:33
    Permalink

    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

    Antwort
  • 27. September 2018 um 19:39
    Permalink

    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.

    Antwort
  • 13. Januar 2019 um 11:44
    Permalink

    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.

    Antwort
  • 13. Januar 2019 um 12:41
    Permalink

    Habe die Lösung gefunden:

    client.publish(„Wetterstation1/Temp“, MsgTemp);
    client.publish(„Wetterstation1/Feuchtigkeit“, MsgFeutigkeit);

    Antwort
    • 13. Januar 2019 um 13:18
      Permalink

      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! 🙂

      Antwort
  • 3. März 2019 um 0:57
    Permalink

    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?

    Antwort
    • 4. März 2019 um 6:40
      Permalink

      Moin,
      nein, es ist einfach die neueste NodeMCU-Komponenten. Da gibt es keine großen Unterschiede.

      Antwort
  • 11. März 2019 um 13:37
    Permalink

    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?

    Antwort
  • 2. Mai 2019 um 12:36
    Permalink

    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?

    Antwort
    • 6. Mai 2019 um 6:43
      Permalink

      Bitte prüfe mal die Ports, nicht dass hier beide MQTT-Adapter den selben Port verwenden.

      Antwort
  • 4. Juni 2019 um 22:07
    Permalink

    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

    Antwort
  • 5. Juni 2019 um 9:13
    Permalink

    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

    Antwort

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

* Die Checkbox für die Zustimmung zur Speicherung ist nach DSGVO zwingend.

Ich akzeptiere