Es kann schon nervig sein, wenn man in die Dusche steigt und dann nur kaltes Wasser rauskommt – das lässt das Wellnessgefühl gar nicht richtig aufkommen. Warum unsere Heizung ab und zu das Warmwasser abkühlen lässt hab ich noch nicht rausgefunden – ein kurzer Reset und alles läuft wieder für mehrere Wochen problemlos.
Klar, am Warmwasserbehälter ist eine Temperaturanzeige, aber ich geh ja nicht vorm Duschen in den Keller und gugg da nach. Wenn man unter der kalten Dusche steht und dann in den Keller geht sieht man auf de rAnzeige auch nur was man schon weiß. Um zumindest die Symptome in den Griff zu bekommen hab ich einen kleinen smarten Helfer gebaut, der mich über Telegram informiert wenn die Temperatur im Warmwasserspeicher unter einen definierten Grenzwert fällt. Ausserdem hat er noch eine LED-Anzeige, die mit rot „Achtung kalt“ und grün „Alles klar – kannst duschen“ signalisiert und zusätzlich noch die Sensorwerte über MQTT an meine Smarthomezentrale schickt.

Das ist auch schon der Versuchsaufbau, einfach ein Wemos D1 mini (clone) mit einem Temperatursensor, in diesem Fall ein Thermoelement. Das besteht aus zwei verschiedenen Metallen, die miteinander verbunden/verschweißt sind. Wenn man die Verbindungsstelle der beiden Metalle erhitzt oder abkühlt, erzeugt das Thermoelement eine elektrische Spannung zwischen den beiden Enden. Diese Spannung ist temperaturabhängig. Dadurch kann die anliegende Spannung einem Temperaturwert zugeordnet werden. Nach ein bisschen Programmiererei und Tests, war der Versuchsaufbau gut genug um auf eine ordentliche Platine gebaut zu werden.

Auf dem Bild nicht zu sehen ist die NeoPixel-LED, die je nach Temperatur eben grün oder rot leuchtet.
Mein Programmablauf ist recht simpel. Der Wemos D1 auf dem ein ESP8266 werkelt verbindet sich mit dem heimischen WLAN, mißt die Temperatur und sendet sie per MQTT ins Netz. Je nach eingestellter Schwelle leuchtet die LED entsprechend farbig. Dann geht der ESP für 30 Minuten in den Tiefschlaf.

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "max6675.h"
#include <Adafruit_NeoPixel.h>

int thermoDO = 14;
int thermoCS = 12;
int thermoCLK = 13;

float Temp = 0;
int TempThresh = 45;
char TempString[5] = "";
int NeoPixelPin = D8;

const char* ssid = "WLAN SSID";
const char* password =  "WLAN PASSWORT";
const char* mqttServer = "IP DES BROKERS";
const int mqttPort = PORT DES BROKERS;
const char* mqttUser = "USERNAME";
const char* mqttPassword = "PASSWORT";
const char* mqttclientID = "SENSORNAME";

MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(1, NeoPixelPin, NEO_GRB + NEO_KHZ800);

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Connecting to WiFi..");
  }
  Serial.println("Connected to the WiFi network");

pixels.begin();

  client.setServer(mqttServer, mqttPort);
  while (!client.connected()) {
    Serial.println("Connecting to MQTT...");
    if (client.connect(mqttclientID, mqttUser, mqttPassword )) {
      Serial.println("connected");
    } else {
      Serial.print("failed with state ");
      Serial.print(client.state());
      delay(2000);
    }
  }
  client.subscribe("/sensors/warmwasser");
  delay(1000); //Warte auf MAX6675
}

void loop() {
  readtemperature();
  mqtt_Out();
  PixelOut();
  startDeepSleep();
  Serial.println("this message will never be send to serial!");
}

Der Loop ruft die einzelnen Unterprogramme auf, die ich der Übersicht wegen in einer eigenen Datei programmiert habe:


void SerialOutput(void) {
  Serial.println("serialout: "); 
  Serial.print(temp_celsius);  
  Serial.println("°C  ");
}

void mqtt_Out(void) {
  Serial.println("generating message for mqtt...");
  client.loop();
  client.publish("/sensors/warmwasser", TempString);
  Serial.print("C = ");
  Serial.println(TempString);
  delay(500);
}

void readtemperature(void) {
  Serial.println("reading temperature from MAX6675...");
  delay(1000);  //wait for MAX6675
  Temp = thermocouple.readCelsius();
  dtostrf(Temp, 6, 2, TempString);
}

void startDeepSleep() {
  Serial.println("Going to deep sleep...");
  delay(500);
  ESP.deepSleep(1800000000);
  yield();
}

void PixelOut(void) {
  if (Temp <= TempThresh) {
    pixels.setPixelColor(0, pixels.Color(255, 0, 0));
    pixels.show();
    delay(1000);
  }
  else {
    pixels.setPixelColor(0, pixels.Color(0, 100, 0));
    pixels.show();
    delay(1000);
  }
}

Den Sensor ist dann einfach am Warmwasserspeicher unter einer Platte befestigt worden und nimmt fleißig die Temperaturwerte auf.

Das selbst entworfene Gehäuse mit praktischem Schnappdeckel kann auch für andere Elektronikprojekte verwendet werden. Die Dateien dafür können auf printables heruntergeladen werden. Dort sind auch meine anderen 3D-Druck-Vorlagen.

Wie kommt jetzt aber die Temperatur in mein Smartphone?
Dazu musste ich zuerst einen Telegram-Bot einrichten und mit meinem Smarthome-Server verbinden. Wie man Telegram-Bots einrichtet ist in Netz mehrfach beschrieben. Ein Bot ist eigentlich nur ein eigener Kontakt, der Nachrichten von anderen Systemen empfängt uns sie dann an die „Abonennten“ verteilt. Die Nachricht schickt bei mir ein s.g. Flow aus NodeRed an den Bot.

Die per MQTT empfangene Temperatur wir in dem gelben Funktionsblock ausgewertet und wenn der Wert über bspw. 45°C ist passiert nichts, wenn der Wert darunter liegt, Wird der blaue Telegram Sender aktiv und schickt eine Nachricht an den Bot, die ich dann auf meinem Smartphone sehe.

Auf dem Händi sieht das dann so aus:

Ähnliche Beiträge

Schreibe einen Kommentar

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

Diese Seite ist durch reCAPTCHA und Google geschützt Datenschutz-Bestimmungen und Nutzungsbedingungen anwenden.

Der Zeitraum für die reCAPTCHA-Überprüfung ist abgelaufen. Bitte laden Sie die Seite neu.