Mein SmartHome-Projekt Zirkulationspumpe
Zum besseren Verständnis der Funktionsweise meiner Warmwasser-Zirkulationspumpe (Grundfos UP15-14 BA PM mit Autoadapt) erfasse ich die Vor- und Rücklauftemperatur des Warmwasser-Zirkulationskreislaufs und den Schaltzustand der Zirkulationspumpe (ein oder aus). Ich verwende hierfür einen ESP8266 mit analogen Spannungseingang, also ESP8266 ESP-12 oder ESP8266 NodeMCU. Die beiden Temperaturen werden über DS18B20-Temperatursensoren erfasst. Der Ein-Aus-Zustand der Pumpe wird über eine Stromzange erfasst.
Die elektrische Leistung der Zirkulationspumpe im Betrieb ist mit ca. 6 Watt angegeben. Der zu messende elektrische Strom liegt damit bei ca. 25mA. Ich verwende dazu die Stromzange SCT-013-005, die 5A in eine Spannung von 1V wandelt. Um den relativ niedrigen Strom richtig erfassen zu können führe ich die Phase der elektrischen Zuleitung zur Zirkulationspumpe zehn Mal durch die Stromzange. Die 25mA entsprechen damit 250mA, die demnach in 50mV umgewandelt werden. Bei Wechselstrom erhält man eine Wechselspannung. Es gilt also, maximal ca. 50mVAC am Analogeingang ADC0 des ESP8266 ESP-12 zuverlässig zu erfassen.
Der Verlauf dieses 50-Hz-AC-Spannungs-Signals bei aus- (links) und eingeschalteter (rechts) Pumpe sieht im Oszilloskop wie folgt aus. Oben (orange) ist das AC-Spannungs-Signal direkt von der Stromzange, unten (blau) die Spannung nach dem Tiefpassfilter (siehe unten):
Um diese AC-Spannung am Analogeingang ADC0 (0 bis +3,3VDC, bei 10 bit also ein Wert von 1024) des EPS8266 einlesen zu können, wird die Spannung mit einem Offset versehen. Dies geschieht über einen Spannungsteiler mit zwei gleichen Widerstands-Werten, damit der Offset bei ca. +1,6VDC liegt. Da das Spanungs-Signal ziemlich verrauscht ist, habe ich einen Tiefpassfilter über ein RC-Glied dem Analogeingang vorausgeschaltet. In einer Schleife wird der Analogeingang des ESP8266 über eine Dauer von 20ms eingelesen. Man erhält ca. 480 Einzelwerte, aus denen der minimale und maximale Messwert ermittelt wird. Aus der Differenz dieser beiden Werte wird ein Parameter erzeugt, der mein eigentlicher Messwert ist: Delta = Max - Min. Dieser Messwert (Delta) entspricht zwar nicht der Leistung des Verbrauchers (dazu müsste die Abtastrate höher sein und integriert werden), aber ein hoher Wert bedeutet "Pumpe ein", ein niedriger Wert entsprechend "Pumpe aus". Wenn der Code an einem ESP8266 NudeMCU entwickelt wird, werden die einzelnen Messwerte im seriellen Monitor dargestellt. Ist die Zirkulationspumpe aus, liegt das Spannungs-Delta bei ca. 100mV, entsprechend ist der Delta-Wert am Analogeingang bei ca. 28. Ist die Pumpe eingeschaltet, liegt das Spannungs-Delta bei ca. 500mV, entsprechend am Analogeingang ca. 160. Ich habe den Grenzwert mit 100 festgelegt, darüber ist die Pumpe eingeschaltet, darunter aus.
Der ESP8266 erfasst so also alle ca. 2 Sekunden den Schaltzustand der Zirkulationspumpe. Die aktuellen Werte (Vor- und Rücklauftemperatur, Pumpenzustand und Messparameter) werden an ein PHP-Skript geschickt, das auf einem Server liegt. Dieser Server ist bei mir ein Raspberry Pi, der die aktuellen Werte mittels PHP-Script empfängt, mit einem Zeitstempelversieht, und in eine MySQL-Datenbanktabelle einträgt. Wenn die Pumpe ausgeschaltet ist, werden die Werte ca. alle 5 Minuten übertragen. Wenn die Pumpe eingeschaltet ist ca. alle 10 Sekunden.
Die Daten der Zirkulationspumpe werden mit amcharts in einem Diagramm direkt aus der MySQL-Datenbank visualisiert. Weiter unten ist ein Beispiel dargestellt.
Das folgende Bild zeigt den Aufbau von innen. Links wird die Stromzange angeschlossen und man erkennt das RC-Glied. In der Mitte sitzt der ESP8266 ESP-12. Rechts auf der Platine werden die DS18B20-Temperatursensoren angeschlossen. Ganz rechts sitzt ein Spannungswandler AMS1117-3.3, der die Versorgungsspannung für den ESP-12 von 3.3VDC aus 5 bis 12VDC bereitstellt. In dieser ersten Version war die Ansteuerung des magnetventils noch nicht vorhanden.
Das fertige Gehäuse sieht vor außen so aus. Links ist die Stromzange angeschlossen. Die LED signalisiert durch Blinken (alle ca. 2 sec) dass der ESP8266 ESP-12 läuft und leuchtet dauerhaft, wenn die Zirkulationspumpe eingeschaltet ist. Rechts sind die DS18B20-Temperatursensoren angeklemmt. Und ganz rechts an der Seite ist noch die Spannungsversorgung (5 bis 12VDC) über eine Hohlbuchse zu erkennen:
Um die wichtigsten Parameter direkt anzeigen zu können, habe ich im Oktober 2019 eine neue Platine mit einem ESP8266 NodeMCU und OLED-Display nach folgendem Plan neu aufgebaut:
R1 und C1 bilden den Tiefpassfilter für das AC-Spannungs-Signal der Stromzange. R2 und R3 bilden den Spannungsteiler für den Offset des AC-Spannungs-Signals. Das so geglättete und mit Offset versehene AC-Spannungs-Signal wird am Analogeingang ADC0 des ESP8266 NodeMCU eingelesen. Im Schaltplan rechts oben sind die beiden Temperatursensoren DS18B20 am D2 (GPIO4) angeschlossen. Darunter dann der Transistor T1 am D4 (GPIO2) für das Solid State Relais. D4 = HIGH bedeutet "Pumpe aus", D4 = LOW entsprechend "Pumpe ein".Der Widerstand R6 (10k) sorgt dafür, dass der Eingang des Transistors T1 definiert auf VCC gezogen wird, wenn D4 = HIGH, und damit die Pumpe auch zuverlässig ausschaltet.
Damit sieht das Ganze dann so aus:
Das graue Gehäuse unter dem ESP8266 NodeMCU OLED beinhaltet das Solid State Relais zur Ansteuerung des 230VAC-Magnetventils in der Warmwasser-Zirkulationsleitung (Einbau im August 2019). Mehr dazu siehe unten.
Dieser Prototyp mit ESP8266 NodeMCU schaltet das (stromlos geschlossene) Magnetventil in der Warmwasser-Zirkulationsleitung, wenn die Zirkulationspumpe eingeschaltet ist. Außerdem werden Vor- und Rücklauftemperaturen im WW-Zirkulationskreislauf gemessen. Und ein Zähler zählt die Anzahl der täglichen Einschaltvorgänge. Der ESP8266 arbeitet als Web-Server, so dass alle aktuellen Werte über die IP des ESP8266 abgefragt werden können. Das sieht dann zum Beispiel so aus:
<MyHome>
<ESP8266_NodeMCU_OLED_CircPump>
<data name="MAC" value="a1:b2:c3:d4:e5:f6" valueunit="AA:BB:CC:DD:EE:FF"/>
<data name="Version" value="V1.01 from 2019-10-23" valueunit=""/>
<data name="SSID" value="YOURSSID" valueunit=""/>
<data name="IP" value="192.168.X.Y" valueunit="xxx.xxx.xxx.xxx"/>
<data name="StartTime" value="2019-10-23T20:12:54Z" valueunit="YYYY-MM-DDThh:mm:ssZ"/>
<data name="ActTime" value="2019-10-26T20:11:46Z" valueunit="YYYY-MM-DDThh:mm:ssZ"/>
<data name="RunTime" value="2d23:58:52" valueunit="xdhh:mm:ss"/>
<data name="WIFIConnectCounter" value="1" valueunit=""/>
<data name="UAC" value="152" valueunit=""/>
<data name="PumpState" value="1" valueunit=""/>
<data name="Counter PumpOn" value="25" valueunit=""/>
<data name="Temp0" value="40.69" valueunit="degC" address="28:ff:9a:df:63:15:02:37"/>
<data name="Temp1" value="48.63" valueunit="degC" address="28:ff:06:bd:63:15:03:68"/>
</ESP8266_NodeMCU_OLED_CircPump>
</MyHome>
Hier der Code ESP8266_NodeMCU_OLED_CircPump_V1.01.ino:
Mit diesem selbst gebauten Messgerät kann ich jetzt Diagramme wie in diesem Beispiel erstellen. Dargestellt ist die Vorlauftemperatur in rot, die Rücklauftemperatur in blau, und der Schaltzustand der Zirkulationspumpe in grün. In diesem Beispiel hat die Pumpe noch nicht richtig funtioniert (siehe unten) und daher sehr häufig eingeschaltet, etwa 60 bis 70 Mal pro Tag:
Das folgende Diagramm zeigt den Übergang von der 14-tägigen Anlernphase (nach Einschalten der Pumpe) zum geregelten Betrieb im Autoadapt-Modus. Während der 14-Tage Anlernphase schaltet die Pumpe täglich etwa 60 bis 70 Mal ein. Nach dieser Anlernphase dann weniger als 20 Mal pro Tag, entsprechend dem Warmwasserbezug. Gut zu erkennen ist die zügig fallende Rücklauftemperatur, wenn die Pumpe aus und das Magnetventil (zur Unterbinung der Schwerkraftzirkulation) geschlossen ist. WW-Bezug (während Pumpe aus ist) erkennt man an der steigenden Vorlauftemperatur und weiter fallenden Rücklauftemperatur. Pumpe ein erkennt man erstens am Schaltzustand (grüne Linie im Diagramm), abere natürlich auch an steigender Vor- UND Rücklauftemperatur. Und da zeigt sich auch gleich wieder ein Problem der Autoadapt-Funktion: Eigentlich läuft die Pumpe in Ein-Zustand immer viel zu lange, nämlich ca. 3 bis 5 Minuten! Das ist zu lange, weil dann nämlich die Rücklauftemperatur auf das Niveau der Vorlauftemperatur ansteigt. Das müsste eigentlich nicht sein. Eine Minute "Pumpe ein" würde bei meinem Zirkulationskreislauf völlig ausreichen.
Mit diesem Aufbau habe ich herausgefunden, dass die bei mir eingebaute Warmwasser-Zirkulationspumpe bei mir nicht so wie vom Hersteller beschrieben funktioniert. Die Autoadapt-Funktionsweise soll laut Herstellerangaben verbrauchsabhängig nach einem bestimmten Algorithmus die Pumpe ein- und ausschalten. Auch eine Urlaubs- oder Abwesenheitsfunktion soll eingebaut sein. In meinem Fall läuft die Pumpe allerdings Tag und Nacht nach demselben Muster durch. Auch während längeren Abwesenheiten wie Urlaub hat sich daran nichts geändert. Der Gasverbrauch war trotz ausgeschalteter Heizung (Sommerurlaub) und keinem Warmwasserbezug deutlich messbar. Aus meiner Sicht ein Ergebnis der nicht funktionierenden Abwesenheitsfunktion.
Eigentlich sollte die Pumpe über die Messung der Vorlauftemperatur laufend den tatsächlichen Bedarf ermitteln, diesen in einen "Kalender" eintragen um daraus entsprechende Vorhersagen über den zukünftigen Bedarf zu treffen. Basierend auf dieser Vorhersage sollte die Zirkulationspumpe vorgesteuert werden. Klingt gut, hat aber nicht funktioniert. Die Pumpe ging im Minutentakt an und aus, ohne jemals auf unseren WW-Bedarf zu reagieren. Das habe ich erst festgestellt, nachdem ich den tatsächlichen elektrischen Verbrauch gemessen und in einem Diagramm dargestellt hatte. Auf dreimaliges Nachfragen beim Hersteller erhielt ich immer dieselbe Antwort: Das Erstellen des Kalenders dauere 14 Tage. Innerhalb dieser Zeit sei das Regelverhalten also völlig normal. Auf meine Frage, wie denn die Pumpe meinen Bedarf ermitteln wolle, wenn sie selbst doch immer für WW-Nachschub im Vorlauf sorgt, ging der Hersteller nicht ein und meinte, ich sollte abwarten.
Die WW-Zirkulationspumpe wurde insgesamt drei mal durch die jeweils aktuelle Version getauscht, ohne Erfolg! Der Service-Techniker des Herstellers meinte bei seinem letzten Versuch, dass es Einbausituationen gäbe, bei denen die Pumpe einfach nicht so wie erwartet und beschrieben funtionieren würde. Das hat mich dann doch etwas ins Grübeln gebracht. Und ich habe mich in das Thema weiter eingelesen. Letztendlich habe ich aufgrund der vorliegenden Messdaten festgestellt, dass die Pumpe gar nicht richtig funktionieren kann! Warum? Wegen Schwerkraftzirkulation! In dem WW-Zirkulationskreislauf in unserem Haus ist die Schwerkraftzirkulation so hoch, dass es völlig egal ist ob die Pumpe ein- oder ausgeschaltet ist. Zeigen konnte ich das indem ich die Handventile vor und nach der Pumpe geschlossen und damit die Zirkulation unerbunden habe. Die Rücklauftemperatur sinkt dann auf die Raumtemperatur (in unserem Fall Kellertemperatur). Und bleibt da unverändert! Wenn die Handventile geöffnet werden, die Pumpe aber nach wie vor ausgeschaltet bleibt, steigt die Rücklauftemperatur in wenigen Sekunden an und erreicht nach wenigen Minuten in etwa die Vorlauftemperatur. Damit ist belegt, dass auch ganz ohne Pumpe der WW-Kreislauf zirkuliert! Damit kann die Pumpensteuerung natürlich nicht umgehen, meldet aber auch keinen Fehler!
Ein zirkulierender WW-Zirkulationskreislauf ist ja erst einmal nicht ganz verkehrt. An jeder Entnahmestelle ist sofort WW da! Das Problem an der Sache ist aber folgendes: Durch die ständige WW-Zirkulation sinkt die Speichertemperatur deutlich schneller ab als ohne Zirkulation. Ist logisch, es wird ja ständig WW im ganzen Haus verteilt, auch wenn es nirgends gebraucht wird. Man erkennt das sehr schön an den Daten des EMS-Busses. Der Temperaturgradient ist mit Schwerkraftzirkulation 1,5-fach steiler als ohne. Andersherum ist der Temperaturgradient 1,5-fach flacher wenn die Schwerkraftzirkulation unterbunden ist. Damit wird der Speicher seltener aufgeladen und man spart Energie (Erdgas in unserem Fall).
Die Lösung dieses Problems war der Einbau eines stromlos geschlossenen Magnetventils in der Warmwasser-Zirkulationsleitung im August 2019. Dieses Ventil wird von einem ESP8266 NodeMCU OLED dann geöffnet, wenn dieser den Anlauf der Zirkulationspumpe erkennt. Und oh Wunder, damit funktioniert nun die Regelung der Pumpe tatsächlich wie erwartet! Ganz offensichtlich war die Pumpe wegen der ständigen Zirkulation nicht in der Lage, den Warmwasser-Bezug zu erkennen. Und es dauert tatsächlich ziemlich genau 14 Tage, bis die Pumpe nach dem Einschalten anfängt zu Regeln. Nach einigen Monaten ist die Regelung aber tatsächlich so, dass z.B. Nachts die Pumpe nicht anläuft. Und morgens VOR dem ersten WW-Bezug tatsächlich das erste Mal startet. Insgesamt läuft die Pumpe bei mir über den Tag verteilt ca. 20 Mal an. Das Problem der permanenten Schwerkraftzirkulation und der daher nicht funtionierenden Regelung scheint damit gelöst!
Wie kann man ohne aufwändige Messungen erkennen, ob eine permanente Schwerkraftzirkulation stattfindet oder nicht? Ganz einfach: Der Rücklauf der Zirkulationsleitung darf bei ausgeschalteter Pumpe nie warm werden. Das war bei mir der Fall, sieht man an den Messwerten, kann aber auch händisch erfasst werden.
Um die Schwerkraftzirkulation komplett zu unterbinden, habe ich in der Zirkulationskreislauf ein Magnetventil einbauen lassen. Der ESP8266 NodeMCU mit OLED-Display wurde durch einen einfachen ESP8266 ESP-01 ersetzt. Dieser übernimmt die Steuerung und Regelung der Warmwasser-Zirkulation nun komplett eigenständig. Über ein Relais wird die Zirkulationspumpe und das Magnetventil zeitgleich ein- und ausgeschaltet. Und zwar nur so kurz, dass an der am weitesten entfernten Entnahmestelle Warmwasser ankommt, nicht aber am Rücklauf vor dem Speicher. Der ESP8266 steuert Pumpe und Ventil bei der Unterschreitung einer einstellbaren Vorlauftemperatur (z.B. 45°C) für lediglich 30 Sekunden ein. Nachts ist diese Regelung ausgeschaltet. Morgens um 6 Uhr wird die Regelung aktiviert, gleichzeitig werden Pumpe und Ventil für 60 Sekunden eingeschaltet bzw. geöffnet. Einmal in der Woche schaltet meine Heizung auf Desinfektion. Dann wird die Speichertemperatur auf 65°C hochgefahren. Genau zu diesem Zeitpunkt schaltet dann der ESP8266 Pumpe und Ventil ein, und zwar für 5 Minuten. Auf diese Weise wird auch der Rücklauf richtig heiß und der ganze Kreislauf durchgespült.
Mit dieser eigenen Steuerung und Regelung der Warmwasser-Zirkulation bin ich sehr zufrieden. Klappt zuverlässig und lässt sich beliebig frei programmieren. Und bei längerer Abwesenheit (z.B. im Urlaub) wird die Steuerung einfach deaktiviert.
<ESP8266_CircPump>
<data name="Device" value="ESP8266_CircPump"/>
<data name="MAC" value="aa:bb:cc:dd:ee:ff" valueunit="AA:BB:CC:DD:EE:FF"/>
<data name="Version" value="V1.2 from 2021-11-16" valueunit=""/>
<data name="SSID" value="FdUBshFmbsaM69uNu" valueunit=""/>
<data name="IP" value="192.168.X.Y" valueunit="xxx.xxx.xxx.xxx"/>
<data name="StartTime" value="2021-11-16 14:53:14" valueunit="YYYY-MM-DD hh:mm:ss"/>
<data name="RunTime" value="124.996" valueunit="hours"/>
<data name="WIFIConnectCounter" value="1" valueunit=""/>
<data name="help" value="use /OpenOnce?Delay=x to open valve once for x seconds" valueunit="text"/>
<data name="help" value="use /Open?Repeat=x to open valve x times" valueunit="text"/>
<data name="help" value="use /Desinfect to switch pump on for 5 min" valueunit="text"/>
<data name="help" value="use /Set?PostSec=x to set post frequency to x seconds" valueunit="text"/>
<data name="help" value="use /Set?Controls=on/off to switch controls on/off" valueunit="text"/>
<data name="help" value="use /Set?MinFeedTemp=x to set minimum feed temperatur" valueunit="text"/>
<data name="help" value="use /ResetPumpOnCnt to reset pump on counter" valueunit="text"/>
<data name="controls" value="on" valueunit=""/>
<data name="PumpOnCnt" value="8" valueunit=""/>
<data name="MinFeedTemp" value="45.00" valueunit="degC"/>
<data name="prevTemp" value="44.44" valueunit="degC"/>
<data name="Temp0" value="19.19" valueunit="degC" address="28:ff:9a:df:63:15:02:37"/>
<data name="Temp1" value="48.25" valueunit="degC" address="28:ff:06:bd:63:15:03:68"/>
</ESP8266_CircPump>
Hier nun mein aktueller Code ESP8266_CircPump_V1.2.ino für den ESP8266 ESP-01:
An dieses PHP-Script GetData_WWCircPump.php auf dem Raspberry Pi schickt der ESP8266 ESP-01 seine Daten. Dieses PHP-Script schreibt dann die Daten in die entsprechende MariaDB-Tabelle:
Nachdem die Steuerung der Zirkulationspumpe und des Magnetventils über einen ESP8266 NodeMCU mit OLED-Display über mehrere Monate super funktioniert, habe ich eine neue Platine ohne Display und lediglich mit einem ESP8266-ESP01 aufgebaut:
An der Platine wird das Relais und die DS18B20-Temperatursensoren sowie die Spannungsversorgung wie dargestellt angeschlossen. Das Relais wird über einen Opto-Koppler mit der Versorgungsspannung von 5VDC angesteuert. Auf der Platine wird mit einem AMS1117-3 die Versorgungsspannung für den ESP8266-ESP01 von 3,3VDC erzeugt. Drei Kondensatoren sorgen für eine stabile Spannungsversorgung, der Widerstand liegt zwischen dem 1-Wire-Signal der DS18B20 und VCC (3,3VDC).