AllgemeinBastelprojekteBodenfeuchtesensorESP8266ESP8266 - SmartHome ProjekteioBrokerioBroker Tutorials

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.

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

  • Manfred Brömmelhaus

    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
    • Matthias Korte

      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
  • Manfred Brömmelhaus

    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

  • Dominik

    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
    • Dominique Krüger

      Hallo Dominik,

      könntest du mir deinen Source code zusenden?

      Viele Grüße

      Antwort
      • Meik

        Ich habe die gleichen Fehler,

        was ist denn des Rätsels Lösung?

        Gruß,
        Meik

        Antwort
    • Marc

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

      Antwort
  • Philipp

    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
  • Michael

    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
  • Cenk

    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
  • LordDuplo

    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
  • LordDuplo

    Habe die Lösung gefunden:

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

    Antwort
    • Matthias Korte

      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
  • 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
    • Matthias Korte

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

      Antwort
  • Senger

    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
  • 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
    • Matthias Korte

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

      Antwort
  • 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
  • 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
    • Raimund Stoll

      Die gleichen Fehlermeldungen laufen auch bei mir auf.
      Gibt es keine Lösung?
      MfG Raimund

      Antwort
  • 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

    Antwort
    • Stephan

      Hallo Gerald,
      könntest du den vollständigen Code veröffentlichen?
      Bekomme deine Anpassungen für den DHT22 nicht übernommen ohne Fehler.
      Danke
      Stephan

      Antwort
  • Gerhard Weixelbaumer

    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);
    }
    }

    Antwort
    • Marco Landwehr

      Hallo Gerhard,
      Hast du das Problem beheben können?
      Mir stellt sich aktuell das selbe Problem.
      Viele Grüße
      Marco

      Antwort
  • Nick

    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.

    Antwort
    • Nick

      Desweitern ist das Wifi des ESP noch sichtbar.

      Antwort
  • Welche Bibliotheken wurden da installiert?
    Ich bekomme leider nur Fehlermeldungen mit den mir bekannten .h

    Antwort
  • Hermann-Josef Stark

    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?

    Antwort
    • Matthias Korte

      Moin,

      was steht denn in den Logs zum MQTT-Adapter? Da sollte dann ein Fehler bzw. Hinweis zu finden sein.

      LG Matthias

      Antwort
      • Hermann-Josef Stark

        Fehler gefunden!! Hatte einen Schreibfehler im Password, und das der MQTT-Adapter auf gelb geht liegt daran wenn keine MQTT-Verbindung besteht

        Antwort
        • Matthias Korte

          Alles klar, danke für die Rückmeldung 🙂

          Antwort
  • Hacker Claus

    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

    Antwort
  • Raphael

    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

    Antwort
  • 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)

    Antwort

Schreibe einen Kommentar

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