home
erste Version am 15.09.2017
letzte Änderung am 30.10.2017

Zirkulationspumpen-Steuerung


Neulich hatten wir einen Klempner im Haus. Zwei der drei beauftragten Arbeiten konnte er direkt fertigstellen. Die dritte blieb über eine Woche lang halbfertig liegen und das hat dazu geführt, dass wir in dieser Zeit viel Wasser in den Ausguss laufen lassen mussten, bevor irgendwann endlich mal warmes Wasser kam. Und.... ja....ich bin bekennender Warmduscher!
Die Dusche befindet sich jedoch zwei Etagen über dem Heizungsraum - also viel Wasser für die Pütz.
Das Problem lag zwar nicht ursächlich an der Zirkulationspumpe, hat aber dazu geführt, dass ich mich (erstmalig nach fast 18 Jahren) mit dem Ding hier befasst habe: Foto der
              Zirkulationspumpe


Inhalt

Vorüberlegungen
erster Ansatz
gibts ja alles schon
Überlegungen zur Testphase
Überlegungen zum Programmablauf
erste Tests (trocken)
erste Messwerte von den Rohren
Steuerung der Pumpe (v1, simpel)
Bau der Basis-Einheit
Firmware V1
   EEPROM
   mehrere SSIDs
Firmware V1 - Fortsetzung
   RTC-Modul
   Schalt-Zeiten-Bitmap
Firmware V1 - Fortsetzung
die ersten neun Stunden produktiv
sonderbare Dinge geschehen
Denkfehler, Tippfehler und Hardware-Fehler
eine Woche lang korrekte Funktion
Überlegungen zur automatischen Pump-Zeiten-Anpassung


Vorüberlegungen

Die "Grundfos UP 15-13 B"-Zirkulationspumpe läuft 24x7. Dank Schuko-Stecker-Anschluß ließ sich ihr Stromverbrauch leicht ermitteln.
Ergebnis: knapp 25W.
Rund um die Uhr.
Also 219 kWh oder auch 60€ Stromkosten pro Jahr.
Alleine für den Strom. Dazu kommt dann noch das Heizöl für die Erwärmung des Brauchwassers.

Daraufhin habe ich mir (von einem anderen Klempner) ein Angebot zum Austausch der Pumpe erstellen lassen - schließlich soll es ja bereits Modelle geben, die mit weniger als 5W auskommen.
Alles in Allem sollte das dann 417€ kosten.....ähh....nö.....das würde ja weit über 10 Jahre dauern, bis sich der Austausch der hervorragend funktionierenden Pumpe amortisiert hätte. Abgesehen davon habe ich in die Haltbarkeit neuer Geräte weit weniger Vertrauen, als in die, von Geräten, die schon seit zig Jahren zuverlässig Dienst tun.

Im Angebot waren zwei Pumpen (alternativ) aufgeführt. Eine mit einfacher Zeit- und Temperatursteuerung (228€), die andere mit Temperatursteuerung und AutoAdapt-Funktion alias Nutzungserkennung (225€).
Für eine der beiden Pumpen habe ich eine Angabe zur Leistungsaufnahme der Pumpe gefunden: 22W
Trotzdem wird das Ding an anderer Stelle als "besonders moderne und stromsparende Lösung" beworben.
Lächerliche drei Watt Unterschied zu meiner jetzigen Pumpe. Ein Witz....!?
Das kann dann ja wohl nur so zu deuten sein, dass die Stromeinsparung nur durch die vorgeschaltete Elektronik und somit über die Zeit erreicht wird - die Pumpen an sich aber unverändert mit dem Strom rumaasen.

Na denn...eine Zeitsteuerung lässt sich auch mit einer 20€-Wochen-Zeitschaltuhr erreichen. Damit hat man dann jedoch mindestens 2x pro Jahr die Freude der Zeitumstellung - vielleicht ist gelegentlich auch noch die Uhrzeit zu korrigieren. Echt grauenvoll. Sowas will ich nicht. Eine DCF77-Funkuhr ist im Keller auch keine Option, weil das Signal dort nicht zuverlässig ankommt. Also selber bauen. Und dann kann auch gleich noch die Wasser-Temperatur in den Rohren berücksichtigt werden. Somit bietet sich eine Lösung mit einem ESP8266-12E (statt ATmega328) an, weil der WLAN onboard hat.

Für beide Chips (ATmega328 und ESP8266-12E) habe ich bereits fertigen Programmcode, mit dem Temperatur-Sensoren abgefragt werden können. Ebenfalls ist schon alles für die regelmäßige WLAN-Kommunikation mit einem Linux-System vorhanden und stabil (zwecks Zeitsync und Nutzungszeiten-Korrektur).
Es bräuchte also nur noch die Ansteuerung eines Relais - was wohl als maximal triviales Problem betrachtet werden kann.
Und natürlich etwas Programm-Logik.


erster Ansatz

Zur Einstimmung erstmal ein Video zum Thema (zwischen Minute 1 bis 4 reicht). Darin wird u.a. erklärt, wie die Warm-Wasser-Zirkulation erreicht wird.

Es braucht also einen ESP8266-12E, der drei Temperatur-Sensoren DS18B20 und ein Relais bedient.
Ein Temperatur-Sensor soll die Temperatur im Heizungsraum messen, ein weiterer die Rohrtemperatur vor oder hinter der Pumpe und der dritte die Temperatur am Warmwasser-Rohr.
Weil die Relais immer mit mindestens 5V angesteuert werden wollen, braucht es noch einen 3,3V-Regler für den ESP8266-12E.
Die 5V Gleichspannung soll aus einem Schaltnetzteil entnommen werden.
Eigentlich könnte ich dann auch gleich einen WeMos-D1-mini nehmen. Davon habe ich noch mindestens zwei Stück ungenutzt rumliegen.

Für ein Gehäuse, das sowohl Schuko-Stecker wie auch Schuko-Buchse integriert hat, will Reichelt über 20€ sehen.
Mal schauen...wäre zwar hübscher, aber ein simples Standard-Gehäuse in passender Größe sollte es auch tun.
Da kämen dann eben zwei 230V-Leitungen raus - einmal mit Stecker (ggf. abgewinkelt), einmal mit Kupplung am anderen Ende.
Das hätte auch den Vorteil, dass ich garantiert genug Platz im Gehäuse haben werde.
Weiterhin sollten zwei LEDs im Gehäuse sein. Einmal für "Pumpe eingeschaltet" und einmal für "WLAN-Sync aktiv".

Wie schon bei der Rollladen-Steuerung und den Loggern wird das WLAN mehrmals pro Tag jeweils nur kurz eingeschaltet. Dabei wird dann die aktuelle Uhrzeit von einem Python-Script empfangen. Danach werden die seit der letzten WLAN-Kommunikation protokollierten Rohr-Temperatur-Werte samt jeweiligem Zeitstempel gesendet, diese auf Python-Seite verarbeitet und das Ergebnis als Liste von Ein/Aus-Zeiten empfangen.
Auf diese Weise bekomme ich einerseits eine Warmwasser-Entnahme-Zeiten-Statistik, andererseits kann ich auch schnell mal komplexere Schaltregeln implementieren, ohne den ESP8266-12E dafür immer wieder neu flashen zu müssen.

Die Mindest-Einschaltdauer der Pumpe sollte so lang sein, um einen vollen Umlauf sicherzustellen.
In der Doku zur Heizung heißt es:

"Zur Entkeimung des Brauchwassers erfolgt wöchentlich einmal durch die Legionellenfunktion eine Aufheizung auf 65°C, um mögliche Legionellen-Erreger abzutöten."

Dieser Zeitpunkt muss erkannt werden und dazu führen, dass die Zirkulationspumpe die Rohre hinreichend lange durchspühlt.
Um das erkennen zu können, auch wenn zu dieser Zeit gerade kein Wasser entnommen wird, braucht es wahrscheinlich noch einen weiteren Temperatur-Sensor am Rohr zwischen Heizung und "Aqua Unit WAU 200".
Das Teil hat fünf Anschlüsse (von oben nach unten):

  1. Warmwasseranschluß
  2. Heizungsrücklauf
  3. Zirkulationsanschluß
  4. Kaltwasseranschluß
  5. Heizungsvorlauf

Als diesbezüglich relevant würde ich mal 2. und 5. annehmen.
Weil der obere Rücklauf (2.) weitaus leichter erreichbar ist und nach meinem Verständnis dieses Wikipedia-Artikels der vorherrschenden Temperatur in der Aqua Unit entspricht, werde ich es wohl erstmal mit dem Rohr 2 probieren. Früher erkennen würde man die 65°C wohl am Vorlauf (Rohr 5) - finge dann jedoch schon mit dem Pumpen an, wenn die 200 Liter in der Aqua Unit diese Temperatur noch gar nicht erreicht haben. Außerdem wird das Rohr 5 wahrscheinlich auch bei jedem normalen Heizvorgang deutlich über 65°C heiß werden.

Somit sind es nun vier Temperatur-Sensoren:
Rohr
Sensor-
Name

Funktion
Information, die durch den Sensor gewonnen wird
1
E
Warmwasser-Entnahme
zu welcher Uhrzeit wird warmes Wasser entnommen - obwohl die Zirkulationspumpe nicht läuft.
2
L
Legionellenfunktion wann wird das Wasser auf 65°C erwärmt und muss zwecks Entkeimung durch die Rohre 1 und 3 gepumpt werden.
3
Z
Zirkulation
ab wann kommt das Wasser hier mit [fast] der selben Temperatur an, mit der es Rohr 1 verlassen hat - steht also direkt warmes Wasser an den Hähnen zur Verfügung.
---
R
Raumtemperatur
nur zur Info bzw. "für spätere Verwendung".

Die DS18B20-Sensoren werden über einen sog. OneWire-Bus angesprochen.
Es wäre also möglich, alle vier Sensoren zusammenzuschalten und über einen einzelnen IO-Pin des ESP8266-12E abzufragen.
Die Adressen mehrerer Sensoren lassen sich mit dem Arduino 1-Wire Address Finder auslesen.
Wobei sich dabei jedoch die Frage stellt, wie ich den einzelnen Sensor identifizieren soll, um einer Sensor-Adresse eine Sensor-Funktion zuordnen zu können. Sicherlich könnte man die vier Sensor-Adressen fest in die Firmware einprogrammieren und von Hand festlegen, mit welcher Adresse was gemessen wird. Wenn dann aber ein Sensor nachträglich getauscht werden müsste, bräuchte es eine Anpassung der Firmware.
Gerade habe ich mir LoggerV1 diesbezüglich angesehen und kann das auf die Schnelle nur so deuten, dass ich dort scheinbar ziemlich gepfuscht bzw. hard coded habe.....und mich zusätzlich noch darauf verlasse, dass der discoverOneWireDevices() die Adressen der DS18B20 immer in der selben Reihenfolge erkennt und in ROMcode_g[] ablegt. Jedoch....trotz mehrerer Restarts in den vergangenen neun Monaten hat LoggerV1 noch nie Innen- und Außen-Sensor verwechselt. Eine solche Verwechslung wäre in LoggerView wohl kaum zu übersehen gewesen.
Es wäre denkbar, die Relation "Adresse zu Sensor-Funktion" auf Python-Seite zu verwalten. Damit müsste die Firmware für einen neuen Sensor nicht neu geflashed werden.
Alternativ könnte jeder DB18B20 seinen eigenen Data-Pin bekommen. Pins dafür hätte der ESP8266-12E schließlich genug. Das böte die Möglichkeit, vier Buchsen am Gehäuse anbringen und gemäß Funktion (E / L / Z / R) beschriften zu können. Die Adresse des DS18B20 wäre damit unwichtig. Die Relation wäre hier "Pin zu Sensor-Funktion" und könnte folglich guten Gewissens hard coded werden.
Bei nur einem Data-Pin wären es vier parallel geschaltete Buchsen. Alle gleichwertig. Es bräuchte eine Tabelle mit der Relation "Adresse zu Sensor-Funktion" im EEPROM des ESP8266-12E samt Abgleich-Funktionen mit dem Python-Script. Das erscheint mir viel zu kompliziert beim Betrieb der Schaltung zu werden.
Also vier IO-Pins für die Temperatur-Sensoren, ein IO-Pin für das Relais und zwei IO-Pins für die LEDs. Macht sieben Pins. Das passt. Die Pins 0, 2, 4, 5, 12, 13, 14 sind problemlos nutzbar. Notfalls gäbe es noch die Pins 15 und 16, falls sich die Notwendigkeit zur Abfrage eines Tasters ergeben sollte.

Trotzdem gefällt mir das nicht wirklich. Ließe sich per Software anhand der jeweils gemessenen Temperaturen erkennen, welcher Sensor wo angebracht sein muss, wäre das natürlich die Lösung erster Wahl.
Also...ist die Pumpe bereits längere Zeit abgeschaltet, müssten die Sensoren R und Z ähnliche Werte liefern.
Sensor E liefert eine erhöhte Temperatur bei jeder Wasserentnahme und immer dann, wenn die Pumpe an ist. In diesem Fall meldet Sensor E früher eine erhöhte Temperatur, als Sensor Z. Sensor L sollte immer derjenige mit der höchsten Temperatur sein. Und immer der erste, bei dem höhere Temperaturen [zuerst] gemeldet werden.
Eine automatische Erkennung des Sensor-Installationsortes könnte also klappen. Es wird sich zeigen.....


gibts ja alles schon

Ganz offensichtlich bin ich nicht der Erste, der so ein Gerät bauen will. Google liefert diverse (63.300) Treffer auf den Suchbegriff Zirkulationspumpen Steuerung.
Dieses Gerät etwa macht fast genau das, was ich vorhabe. Eine Webseite des Herstellers mit ein paar weiterführenden Infos gibt es dazu auch.
Interessanterweise kommt das Ding mit zwei Temperatur-Sensoren (an den Rohren 1 und 3) aus und bietet trotzdem das Feature "integrierte Legionellen-Überwachung".
Weiterhin soll der Umstand "längerer Abwesenheit, z.B. Urlaub" erkannt werden können.
Wie das gehen soll, kann ich noch nicht ganz deuten... Wie soll denn eine [ausbleibende] Wasserentnahme ohne Durchfluss-Sensor im Kaltwasser-Rohr erkannt werden, wenn die Zirkulationspumpe regelmäßig läuft?
Denkbar wäre, das anhand der Zeit zu erkennen, die vergeht, bis das warme Wasser in Rohr 1 in Rohr 3 ankommt. Also dem zeitlichen Unterschied, ob die Zirkulationspumpe Rohr 1 und Rohr 3 auf Temperatur bringen muss - oder nur Rohr 3, weil Rohr 1 wegen Wasserentnahme bereits auf Temperatur war.
Bleibt noch die Legionellen-Überwachung. Wie soll erkannt werden, dass das Wasser zwecks Entkeimung gerade auf 65°C erhitzt wird, wenn nicht zufällig gleichzeitig jemand Wasser entnimmt.
Mal überlegen....
In Rohr 1 steigt die Temperatur bei
a) laufender Zirkulationspumpe
b) Wasserentnahme (nur warmes Wasser zählt hier natürlich)
In Rohr 3 steigt die Temperatur bei
c) laufender Zirkulationspumpe
Wenn also weder warmes Wasser entnommen wird noch die Zirkulationspumpe zufällig gerade eingeschaltet ist, kann das Zeitfenster der Legionellenfunktion nicht anhand der Rohr-Temperaturen erkannt werden.
Vielleicht ist die erhöhte Temperatur aber trotzdem am Rohr 1 erkennbar, sofern der Sensor hinreichend nah an der Aqua Unit angebracht ist. Laut Doku zu obigem Gerät soll der Sensor mit einer Entfernung von "ca. 20 ... 40 cm zum Pufferspeicher" angebracht werden. So nach dem Prinzip: warmes Wasser steigt nach oben....!?

Weiterhin liefert Google sogar zum Suchbegriff Zirkulationspumpen Steuerung ESP8266 noch 230 Treffer....und ein kleiner Teil davon befasst sich auch tatsächlich mit dem Thema "Bau bzw. Vorstellung einer solchen Steuerung".
Beim Querlesen einiger dieser Seiten bin ich auf den Präsenz-Ansatz gestoßen. Zwar war das eher für die Raumtemperatur gedacht, lässt sich aber natürlich auch für die Entnahme von warmem Brauchwasser einsetzen. So nach dem Prinzip eines Dash-Buttons, mit dem eine Warmwasser-Anforderung auf den Weg gebracht wird. Das hieße dann allerdings, dass die Zirkulationspumpen-Steuerung dauerhaft mit dem WLAN verbunden sein müsste, um auf solche ad-hoc-Anforderungen reagieren zu können.

Unter dieser URL wird etwas vorgestellt, bei dem eine Pumpe, die bereits mit Zeitsteuerung läuft, gepimpt wird. Das ist zwar begrenzt spannend für mich, aber zur Befestigung des Temperatur-Sensors am Rohr wird statt eines Plastik-Kabelbinders sowas hier verwendet. Und es wird einem Temperatur-Sensor sicher zugute kommen, wenn (wegen der Wärmeleitfähigkeit der Befestigungs-Materials) die Wärme von allen Seiten am Sensor ankommt.

Und der hier hat sich mit einem ESP8266-12E eine reine Mess-Schaltung gebaut und damit festgestellt, dass die AutoAdapt-Funktion seiner "Grundfos UP15-14 BA PM" offenbar praktisch nix bewirkt. Sein Diagramm mit den Messwerten ist für mich insofern nicht uninteressant, als darauf ein sehr deutlicher Temperatur-Unterschied zwischen Vorlauf und Rücklauf (also wohl E und Z gemäß meiner Benennung) sichtbar wird. Da bin ich ja mal gespannt, wie sich das bei mir darstellt....und hoffe mal, dass seine Rohre vielleicht einfach nur sehr lang oder sehr schlecht isoliert sind.


Überlegungen zur Testphase

Es stellt sich noch die Frage, wie die Schaltung betrieben werden soll, bevor die Firmware für den ESP8266-12E ihren finalen Stand erreicht hat. Ich will dringend vermeiden, dass ich ständig im Heizungsraum rumwerkeln muss. Da ist es eng, stinkig und (abgesehen von der kuscheligen Temperatur) einfach nur ungemütlich.
Dementsprechend braucht es eine einfache Firmware im ESP8266-12E, die sich weitestgehend von Ferne bzw. über WLAN steuern lässt. Ideal wäre eine rudimentäre Programmiersprache, die sowas kennt wie:
- Schleifen
- bedingte Ausführung
- Sensor-Abfrage und Relais-Ansteuerung
- Wochentags- und Uhrzeit-Abfragen

Andererseits würde das viel zu komplex werden und somit den produktiven Betrieb maximal hinauszögern.
Schließlich haben wir nur die eine Heizung. Sobald die Zirkulationspumpe über das Relais der Schaltung gesteuert wird, würde die ganze Familie (und die Wasser-Rechnung) unter einer zu selten laufenden Pumpe leiden.
Leitungs-Auskühl-Tests sollten nur zwischen 22:00 und 05:00 Uhr erfolgen. Die restliche Zeit über sollte die Schaltung vielleicht erstmal dafür sorgen, dass die Sensoren E und Z allzeit ähnliche Werte aufweisen - also stets warmes Wasser in den Rohren steht.
Die Heizung ist auf 52°C Brauchwasser-Temperatur eingestellt. Solange der Sensor E eine Temperatur von mehr als etwa 45°C meldet, würde das zum Duschen voraussichtlich auch reichen. Das noch wärmere Wasser wird nur gelegtlich in der Küche benötigt.

Aber natürlich sind diese Werte bisher reine Theorie. Erstmal brauchts die Sensoren an den Rohren. In dieser Phase sollten wahrscheinlich zunächst primär Daten gesammelt werden, um damit Abhängigkeiten prüfen bzw. überhaupt erstmal erkennen zu können. Dazu könnte es nützlich sein, wenn die Schaltung per WLAN dauerhaft mit dem Python-Script verbunden bliebe, um darüber minütlich alle vier Temperatur-Werte sowie den Einschalt-Zustand der Pumpe zu melden.

Die Systemzeit des ESP8266-12E sollte (abweichend zu LoggerV2) mit Ortszeit laufen. Aber weil ich wohl eh lieber einen eigenen Socket-Server (selbe VM, anderer Port) für diese Schaltung baue, stellt das kein Problem dar. Um auch nach der Zeitumstellung im März/Oktober morgens um 06:00 Uhr direkt warmes Wasser in der Dusche zu haben, ist täglich irgendwann zwischen 03:15  und 05:30 Uhr ein Zeitsync via WLAN erforderlich. Andererseits erfolgt die Zeitumstellung grundsätzlich an einem Sonntag. Somit bliebe auch Zeit bis 07:00 Uhr ;-)

Übermorgen sollen fünf Temperatur-Sensoren und fünf Relais-Module kommen.
Die Bestellung bei Reichelt hat noch kein Lieferdatum, sollte aber hoffentlich auch irgendwann im Laufe der nächsten Woche eintrudeln. Von da kommt das oben bereits verlinkte Schaltnetzteil, Schuko-Stecker/Kupplung sowie 10 dreipolige Stecker samt zugehöriger Kupplung für den Anschluss der Temperatur-Sensoren. Zur Sicherheit auch noch zehn dieser einfachen Anreihklemmen.

Auf das es dann nächstes Wochenende mit ersten Tests losgehen kann.