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.
Beschreibung | Wert |
---|---|
Stromversorgungsbereich | 3,0V bis 5,5V |
Messbereich | -10°C bis +85°C |
Die Verdrahtung für dieses Projekt sieht wie folgt aus:
D1 Mini | DS18B20 |
---|---|
5V | VCC |
G | GND |
D4 | DQ |
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!