HomeKit Thermometer DIY mit dem ESP8266 D1 Mini & GET-Request - Tutorial

D1 Mini Juni 12, 2020
makesmart.shop - ESP8266 D1 Mini
ESP8266 D1 Mini Entwicklerboard für Arduino IDE. Integrierte USB-Schnittstelle zum Programmieren und eingebaute WLAN-Funktion onBoard. Perfekt für Io…
https://my.makesmart.net/topic/74/homekit-thermometer-diy-mit-dem-esp8266-d1-mini-get-request-tutorial

In diesem Beitrag werden wir ein Smarthome-Thermometer basteln. Als Temperaturfühler dient ein DS18B20. Das Gehirn des Projektes ist ein ESP8266 D1 Mini. Inspiriert wurde ich durch den Beitrag von @Gauweiler42 in der Community. RE: Problem mit OneWire DS18B20

Funktionbeschreibung

Die Temperatur wird in einem beliebig einstellbaren Intervall abgefragt. Und im seriellen Monitor ausgegeben. Danach findet die Übergabe der Temperatur an die eigene Smarthome-Umgebung statt. Das kann einerseits über MQTT geschehen, über eine GET-Request oder jede beliebige andere Art von Datenübertragung. In diesem Tutorial behandle ich nur die Übertragung via GET-Request.

Verdrahtung

Die erste Hürde ist das Auslesen der Temperatur am D1 Mini. Hierzu nutze ich wie bereits erwähnt einen DS18B20 Temperaturfühler. Den Fühler gibt es in verschiedenen Ausführungen. Mit Kabel, ohne Kabel, als Stab, als Knopf, … es gibt unterschiedliche Bauformen - dabei wird aber jedes Mal auf den OneWire-Bus zurückgegriffen. Der DS18B20 hat drei Adern. VCC - GND und DQ - wobei DQ die Datenleitung darstellt.

BeschreibungWert
Stromversorgungsbereich3,0V bis 5,5V
Messbereich-10°C bis +85°C

Die Verdrahtung für dieses Projekt sieht wie folgt aus:

D1 MiniDS18B20
5VVCC
GGND
D4DQ

d1_mini_ds18b20.png

Die Farben der Drähte entsprechen den Farben der Drähte in der Realität. Bei einem DS18B20 in Form eines Fühlers ist die Verdrahtung identisch.

Basic-Code

Folgender Code gibt die Temperatur jede Sekunde über den seriellen Monitor aus:

#include <OneWire.h>#include <DallasTemperature.h>#define ONE_WIRE_BUS 2OneWire oneWire(ONE_WIRE_BUS);DallasTemperature sensors(&oneWire);//Messintervall in Sekundenint wait = 5;//Temperaturfloat temperature;void push(){  //Hier soll der Wert an die Smarthome-Umgebung übertragen werden}void setup(){    Serial.begin(115200);  wait = wait * 1000;  sensors.begin();}void loop(){  sensors.requestTemperatures();  Serial.print(sensors.getTempCByIndex(0));  Serial.println(" °C");  temperature = sensors.getTempCByIndex(0);  push();  delay(wait);}

Quelle: makesmart.net @dieterh

Die Ausgabe sieht folgendermaßen aus:

22.75 °C22.75 °C22.75 °C22.75 °C

Mit der Variable wait kann der Messintervall in Sekunden eingestelt werden. Der Sensor gibt den Messwert alle 5 Sekunden im seriellen Monitor zurück.

//Messintervall in Sekundenint wait = 5;

Dieser Code kann bereits für das eigene Projekt verwendet werden.


Einbidung in das Smarthome - Homebridge

Folgenden Codeschnipsel dient als Ausgangslage zur Einbindung in das eigene Smarthome-System. Ich habe mich für die Variante via GET-Request entschieden. Als Smarthome-Plattform nutze ich Homebridge.

GET-Request

Als Plugin für Homebridge könnte das Plugin homebridge-http-webhooks verwendet werden. Die Konfiguration für das Plugin sieht wie folgt aus:

{	"platform": "HttpWebHooks", 	"webhook_port": "51828", 	"sensors": [  	{   		"id": "temperatur",    	"name": "Sensor name 5",   		"type": "temperature"  		} 	]}

Der Code auf dem D1 Mini muss dementsprechend mit einer GET-Request ausgestattet werden:

/*    WLAN TERMOMETER GET-Request    GET-Request an einen HTTP-Server    Created by cooper, 2020    makesmart.net*/#include <ESP8266WiFi.h>#include <ESP8266HTTPClient.h>#include <OneWire.h>#include <DallasTemperature.h>#define ONE_WIRE_BUS 2OneWire oneWire(ONE_WIRE_BUS);DallasTemperature sensors(&oneWire);HTTPClient sender;// WLAN-Datenconst char* ssid = "WLAN_SSID";const char* password = "WLAN_PASSWD";//Messintervall in Sekundenint wait = 5;//Temperaturfloat temperature;void push(){  //Hier wird der Wert an die Smarthome-Umgebung übertragen    if (sender.begin("http://makesmart-server:51828/?accessoryId=temperatur&value=" + String(temperature))){    // HTTP-Code der Response speichern    int httpCode = sender.GET();       if (httpCode > 0) {            // Anfrage wurde gesendet und Server hat geantwortet      // Info: Der HTTP-Code für 'OK' ist 200      if (httpCode == HTTP_CODE_OK) {        // Hier wurden die Daten vom Server empfangen        // String vom Webseiteninhalt speichern        String payload = sender.getString();        // Hier kann mit dem Wert weitergearbeitet werden       	// ist aber nicht unbedingt notwendig        Serial.println(payload);                              }          }else{      // Falls HTTP-Error      Serial.printf("HTTP-Error: ", sender.errorToString(httpCode).c_str());    }    // Wenn alles abgeschlossen ist, wird die Verbindung wieder beendet    sender.end();      }else {    Serial.printf("HTTP-Verbindung konnte nicht hergestellt werden!");  }}void setup() {  Serial.begin(115200);    WiFi.begin(ssid, password);  while (WiFi.status() != WL_CONNECTED) {    delay(200);    Serial.print(".");  }  Serial.println("Verbunden!");  wait = wait * 1000;  sensors.begin();  }void loop() {    sensors.requestTemperatures();  Serial.print(sensors.getTempCByIndex(0));  Serial.println(" °C");    temperature = sensors.getTempCByIndex(0);  push();  delay(wait);}

Und schon hat man die aktuelle Temperatur in HomeKit eingebunden und kann sie für Automationen oder Benachrichtigungen verwenden. Have Fun!

76299308-0FFE-4D5C-804D-4EE2A9AFA138.jpeg

Bildschirmfoto 2020-06-12 um 10.49.04.png

Community

Die makesmart Community ist der Ort, an dem du deine Ideen mitteilen und deine Erfahrungen austauschen kannst.

Großartig! Das Abonnement wurde erfolgreich abgeschlossen.
Großartig! Schließe als Nächstes die Kaufabwicklung ab, um vollen Zugriff zu erhalten.
Willkommen zurück! Du hast dich erfolgreich angemeldet.
Erfolg! Dein Konto ist vollständig aktiviert, du hast jetzt Zugang zu allen Inhalten.