Heizungssteuerung mit Homematic und Raspberrymatic

Der Grund, mich mit dem Thema Heizungssteuerung näher zu befassen, ist unser sanierter Altbau (Baujahr 1957), den wir kernsaniert haben und seit 2014 bewohnen. Das Dach ist komplett neu aufgestellt worden und innen und außen isoliert. Ansonsten haben wir das Haus nicht isoliert. Die für mich zentrale Frage ist: Lohnt sich die Isolierung der Außenwände?

Um dieser Frage auf den Grund zu gehen kann man Energieberater fragen und deren Antwort glauben oder nicht. Fakt ist, dass besonders bei Altbauten eine Bewertung relativ schwierig ist und auf vielen Annahmen beruht. Das war mir zu unsicher!

Um unsere Heizung und den Wärmebedarf besser zu verstehen wollte ich eigentlich mit Arduinos die Temperatur und relative Feuchte in mehreren Räumen messen und loggen. Meine Idee, dazu ein ESP8266 zu verwenden, hat leider nicht geklappt. (Inzwischen weiß ich dass die Programmierung des ESP8266 mit der Arduino IDE wegen einem offensichtlich inkompatiblen FTDI USB to Serial Adapter FT232RL nicht funktioniert hat!).

Nachdem ich bereits zwei Heizkreisläufe meiner Fußbodenheizung mit Homematic-Wandthermostaten geregelt hatte, ist mir aufgefallen, dass diese ja bereits Temperatur UND relative Feuchte messen. Also habe ich das ELV-Funkmodul für Raspberry Pi ausprobiert. Ich hatte zuvor nie die Homematic-CCU2 im Einsatz. Einen Raspberry Pi 2 B habe ich nach folgender Anleitung zum RaspberryMatic gemacht. Und oh Wunder: Es hat auf Anhieb geklappt! Ich konnte alle Wandthermostaten anlernen. Und das Anlernen der Aktoren über die Seriennummer ist echt einfacher als nach der Anleitung (Kontakte auf Phase legen!).

Die Homematic-Steuerung mit dem Raspberry Pi ist aus meiner Sicht echt genial. Einziges Mako aus meiner Sicht: Die Datenerfassung. Zwar gibt es beim Homematic-Web-Interface die ganz ordentliche Diagrammfunktion mit Möglichkeiten zum Export nach CVS, allerdings wird die Schaltposition der Aktoren nicht mit aufgezeichnet. Ich suchte daher nach einer anderen Lösung.

Dank des Zusatz-Programms XML-API (wird auf dem RaspberryMatic als Programm installiert) ist es möglich, ALLE Daten des Homematic-Systems abzufragen. Also habe ich einen zweiten Raspberry Pi (hier lediglich einen B+) so installiert, dass diese alle zwei Minuten via http://[ip]/statelist.cgi den RaspberryMatic abfragt und alle Parameter in eine MySQL-Datenbank scheibt. Alle Parameter, also auch die Schaltzustände der Aktoren.

Mit dieser sehr günstigen Lösung kann ich jetzt die aktuelle Temperatur, die Soll-Temperatur sowie die relative Feuchte aller Homematic-Wandthermostate erfassen und speichern. Dazu habe ich noch einen Homematic-Außensensor eingebunden. Außerdem werden die Schaltzustände aller Aktoren meiner Heizkreisläufe mit aufgezeichnet. Nach und nach wurden in unserem renovierten Altbau alle kabelgebundenen Wand-Thermostaten für die Regelung der Fußbodenheizung durch Funkthermostaten zu ersetzen. Inzwischen sind weitere Homematic-Sensoren und -Aktoren hinzugekommen, unter anderem ein Außentemperaturfühler, Zwischensteckdosen mit und ohne Leistungs-Messung sowie Taster.

Folgende Homematic-Komponenten sind derzeit im Einsatz:

  • sieben Funk-Wandthermostate, Aufputzmontage (Hersteller-Link)
  • zwei Funk-Schaltaktor 2-fach, Unterputzmontage für Ansteuerung Heizkreis-Ventile (Hersteller-Link)
  • Funk-Schaltaktor 4fach, Hutschienenmontage für Ansteuerung Heizkreis-Ventile (Hersteller-Link)
  • Funk-Temperatur-/ Luftfeuchtesensor, außen (Hersteller-Link)
  • Funkmodul für Raspberry Pi, Steckplatine HM-MOD-RPl-PCB, Komplett-Bausatz (Hersteller-Link)
  • Funk-Schaltaktor 1-fach mit Leistungsmessung, Zwischenstecker Typ F (Hersteller-Link)
  • Funk-Tasterschnittstelle 4-fach, Unterputzmontage (Hersteller-Link)
  • Funk-Schaltaktor 1-fach, Zwischenstecker Typ F, ARR-Bausatz (Hersteller-Link)
  • Temperaturdisplay, ein kleines selbst gebasteltes Gerät zum Anzeigen der Außentemperatur, relativen Feuchte und Luftdruck

Gehäuse Temperaturdisplay


POE für Raspberry Pi im Eigenbau

Nachdem mein Raspberry Pi 2 B nun als RaspberryMatic meine Heizung steuert, musste ein geeigneter Platz gesucht werden, damit die Kommunikation mit allen Einzelkomponenten (Wandthermostaten, Aktoren, etc.) fehlerfrei klappt. Die probeweise Installation unterm Dach und im Keller führte zu sehr vielen Fehlermeldungen und lückenhafter Datererfassung! Ein Platz in der Mitte des Hauses ist bei mir das Treppenhaus. Der WLAN-AP ist dort auch gut aufgehoben. Vom Keller aus konnte ich relativ einfach zwei Netzwerk-Kabel dort hin legen, allerdings fehlte eine Steckdose. Daher habe ich mein POE für den Raspberry Pi selbst gebaut. Der WLAN-AP lief ohnehin schon über POE.

Meine erste Idee war, die 5 VDC für den Raspi über einen POE-fähigem Switch und mit POE-Splitter bereit zu stellen erschien mit relativ teuer. Also habe ich zwei Cat6-Verbindungsmodule gekauft (je ca. 3,50 Euro), die mit einem LSA-Werkzeug belegt werden. Da der Raspi ohnehin lediglich 100MBit-Ethernet kann, sind vier der acht Kabel im Cat-Kabel unbelegt. Also habe ich nur die vier relevanten Leitungen aufgelegt und 5 VDC nach dem Router an der Cat6-Dose eingespeist. Die 5 VDC kamen zwar am Raspi an, allerdings war der Spannungsabfall über das Netzwerk-Kabel (ca. 15m) offensichtlich unter "Last" zu groß. Jedenfalls konnte der Raspi so nicht betrieben werden.

Damit die 5 VDC auch stabil am Raspi ankommen, habe ich einen DC/DC-Step-down-Wandler (z.B. SMD-Step-down-Wandler SDW 1, Komplettbausatz von ELV, 8 Euro) und ein Universal-Steckernetzteil (3 bis 12 VDC, 0,6 Watt, auch ELV ca. 7 Euro) gekauft. Der kleine Spannungswandler ist schnell aufgebaut und kann 500 mA bereitstellen (absolut genug für Raspi). Getestet mit einem 10 Ω-Widerstand (1 Watt!) ist die Ausgangsspannung (über Poti einstellbar!) bei eingestellten 5 VDC und 500 mA absolut stabil, sogar runter bis ca. 5,5 VDC Eingangsspannung! Nach dem Router speise ich jetzt 12 VDC aus dem Steckernetzteil in der Cat6-Dose über zwei der vier freien Adern des Netzwerk-Kabels ein. Am Raspi stellt dann der DC/DC-Wandler die Spannungsversorgung für den Raspi bereit. Klappt prima, kostet nicht viel und spart eine Steckdose am Raspi!

Projekt Gaszähler/Gasuhr

Gehäuse Gaszähler-Erfassung innen

hier entlang


Projekt Warmwasser-Zirkulationspumpe

Messgerät Warmwasser-Zirkulationspumpe

hier entlang


Stromzähler mit Raspberry Pi auslesen

Das Auslesen meines Stromzählers EasyMeter Q3B war leider eine etwas zähe Geschichte. Eigentlich sollte dieses SmartMeter über die D0-Schnittstelle alle relevanten Daten bereitstellen. Als ersten Versuch habe ich nach Anleitung von Sven Jordan einen Optokoppler nachgebaut. Leider hat das so nicht funktioniert. Ich habe zwar über die serielle Schnittstelle Daten einlesen können, allerdings ohne erkennbare Struktur, schon gar nicht wie in dieser Anleitung dargestellt. Da ich nun nicht wusste, ob es an meinem selbst gebastelten Optokoppler lag, habe ich mir den von EasyMeter empfohlenen optischen Tastkopf OD400 TTL (D0) der Firma Propertools für ca. 50 € gekauft. Leider ist dieser nicht mehr verfügbar. Es gibt aber von EasyMeter neue Empfehlungen. Diese Investition lohnt sich aus meiner Sicht schon deshalb, weil diese OptoKoppler sich mit dem Magneten ganz einfach am EasyMeter in Position bringen lassen:

SmartMeter

Mein zweiter Versuch mit dem OD400 TTL war leider auch nicht auf Anhieb erfolgreich. Ich habe die serielle Schnittstelle über ein Pyton-Script ausgelesen und dabei die Schnittstellen-Parameter wie oben angegeben verwendet (9600/7/even/1). Damit konnte ich jetzt immerhin ASCII-Daten einlesen, die zumindest hin und wieder sinnvolle Informationen zu enthalten schienen. Zum einen kam in unregelmäßigen Abständen ein ESY, an einer Stelle sogar ESY Q3B, und die Zählernummer wurde als Klartext übertragen. Die restlichen Zeichen waren mir aber erst einmal Rätsel.

Laut Betriebanleitung des Q3B wird für die Übertragung über die optischen Datenschnittstelle das SML-Protokoll verwendet wird. Der Datenstrom in hexadezimaler Darstellung ist durch Escape-Merkmale 0x1b1b1b1b gekennzeichnet. Der Beginn der Nachricht wird durch ein solches Escape-Markmal gefolgt von einem Beginn-der-Nachricht-Merkmal 0x01010101 definiert. Am Ende einer Nachricht folgt 0x1a auf ein Escape-Merkmal, also 0x1b1b1b1b1a. Laut Hersteller ist die Einstellung der seriellen Kommunikation 9600/7/even/1 für die Geräte der xxD und xxS-Reihe. Die SML-Zähler (xxB und xxC) senden mit 9600/8/none/1. Also habe ich für meinen Q3B die serielle Schrittstelle entsprechend konfiguriert, und jetzt klappt die Abfrage!

Den Datenstrom der seriellen Schnittstelle interpretiere ich mit einem Python-Script nach folgendem Programmablauf:

  • Serielle Schnittstelle initialisieren
  • Zeichen in einer Schleife einlesen und zu einer hexadezimalen Zeichenfolge zusammensetzen
  • Sobald Beginn-der-Nachricht-Merkmal 1b1b1b1b01010101 einging, alle vorhergehenden Zeichen abschneiden und auf Ende-der-Nachricht-Merkmal 1b1b1b1b1a warten. Damit ist dannn eine Nachricht komplett.
  • Die vollständige erhaltene Nachricht nach OBIS-Kennungen durchsuchen und auswerten.

Im Beispiel meines EasyMeter Q3B kommen über die D0-Schnittstelle fogende Daten nach der jeweiligen Kennzahl:

  • Herstellerkennung (Kennzahl 0x81 81 c7 82 03 ff): 0x45 53 59 = ESY
  • Eigentumsnummer (0x01 00 00 00 00 ff): 0x33 31 33 34 31 32 36 31 33 = 313 412 613 (steht auf dem Zähler, aber nicht auf meinem!)
  • Summenregister Bezug (0x01 00 01 08 00 ff): 0x00 00 00 00 67 54 6f 34 = 1733586740 * 10^-4 Wh = 173358,6740 Wh = 173,3586740 kWh
  • Momentanleistung über alle Phasen (0x01 00 01 07 00 ff): 0x00 00 28 2e = 10286 * 10^-2 W = 102.86 W

Zum Auslesen der D0-Schnittstelle mit einem Raspberry Pi A+ verwende ich folgendes Python-Skript MyHomePower.py, das beim Booten des Raspberry Pi automatisch gestartet wid sudo ./MyHomePower.py &). Das Python-Skript liest jeden Datensatz des SmartMeters aus. Im Falle des EasyMeter Q3B bekomme ich damit alle zwei Sekunden die aktuellen Werte für Bezug (Wh) und Momentanleistung (W). Zusammen mit dem aktuellen Zeitstempel werden diese beiden aktuellen Werte einerseits in eine XML-Datei /var/www/html/SmartMeter.xml geschrieben (um via HTTP-Anfrage von einem beliebigen Computer im Netzwerk ausgelesen werden zu können). Andererseits werden alle 2-Sekunden-Werte in die Datei output.csv geschrieben, um daraus eine 15-Minuten-Statistik zu berechnen. Das macht aus meiner Sicht Sinn, da der tatsächliche Leistungsbezug auf Basis der 2-Sekunden-Werte sehr stark schwankt und damit wenig aussagekräftig ist.

Über Crontab wird daher alle 15 Minuten das bash-Script analyze.sh aufgerufen, das die Datei output.csv bis auf die letzten 450 Werte (entspricht hier 15 Minuten) abschneidet und dann das Python-Script analyze.py ausführt. Dieses Python-Script ermittelt über den Zeitraum der letzten 15 Minuten den minimalen, mittleren und maximalen Leistungswert sowie die Standardabweichung. Zusammen mit dem aktuellen Zeitstempel werden diese Werte in die XML-Datei /var/www/html/SmartMeter_15minutes.xml geschrieben. Mit diesen Daten lassen sich dann schöne Diagramme erstellen, wie zum Beispiel der Leistungsverlauf der vergangenen 24 Stunden:

Diagramm Stromzähler

Die Spannungsversorgung des Raspberry Pi im Schaltschrank erfolgt bei mir über ein Hutschienennetzteil DR-1 5-5, 5V MEAN WELL. Dieses liefert direkt die für den Raspberry Pi benötigten 5 VDC und kostet ca. 14 €.


Temperatur, Luftdruck, etc.

Die Vor- und Rücklauftemperatur der Heizkreisläufe der Fußbodenheizung sowie der Warmwasser-Zirkulationsleitung werden über wasserdichte gekapselte 1-wire-Temperatursensoren DS18B20 erfasst (10 Stück ca.20 €)). Diese sind mit Wärmeleitpaste und Kabelbinder direkt von außen auf die jeweilige Wasserleitung gepresst und dann nach Umgebung isoliert. Ein Vorteil der 1-wire-Sensoren ist der, dass alle Sensoren über ein dreiadriges Kabel auch über eine längere Strecke (mehrere Meter) an den Raspberry Pi angeschlossen werden können.

Der Luftdruck wird über ein Temperatur-Druck-Modul BMP180 an einem Raspberry Pi gemessen. Außerdem hängen an manchen der installierten Raspberry Pi noch digitale Temperatur-Feuchte-Sensoren DHT22/AM2302, um zum Beispiel im Keller Temperatur und Feuchte zu messen.

Über mein selbst gebasteltes Temperaturdisplay können dann Außentemperatur, relativen Feuchte und Luftdruck angezeigt werden.


ESP8266

Ein ESP8266 ist ein kleiner µC mit integriertem WLAN, der sich mit C über das Arduino-Programm mit eigenen Programmen flashen lässt. Vom ESP8266 gibt es viele verschiedene Ausführungen, die sich durch Größe und herausgeführte Pins unterscheiden. Der ESP6288 ESP-01 ist eine der kleinsten Versionen mit wenig herausgeführten Pins. Zum Flashen verwende ich einen ESP8266-Flascher, auf den der ESP8266 ESP-01 direkt ausgesteckt werden kann. Zur Entwicklung neuer Programme eignet sich aus meiner der ESP8266 NodeMCU, da dort erstens sämtliche Pins zugänglich sind und zweitens eine USB-Schnittstelle vorhanden ist. Damit lässt sich der ESP8266 NodeMCU direkt flashen, und alle Sensoren können währenddessen angeschlossen bleiben. Das Debuggen während der Entwicklung ist damit deutlich einfacher als beim ESP-01.

Das interessante am ESP8266 ist der DeepSleep-Modus, während dem der Stromverbrauch so reduziert wird, dass batteriebetriebene Anwendungen ermöglicht werden. Damit der µC nach einem definiert langen Tiefschlaf (z.B. 15 Minuten) wieder selbst aufwacht muss allerdings GPIO16 mit RST verbunden werden. Leider ist dieser GPIO16 nicht bei allen ESP8266-Versionen als Pin zugänglich. Zum Beispiel gerade bei ESP-01 ist dieser Pin gar nicht auf dem Board kontaktiert, sondern nur verklebt. Im Netz findet man vielen Anleitungen, um diesen Pin auf RST zu legen. Mit etwas Übung ist das auch tatsächlich zu schaffen. Man muss lediglich aufpassen dass das GPIO16-Füßchen vom IC nicht abreißt, weil das wie gesagt nur verklebt und nicht auf dem PCB verlötet ist. Ich habe allerdings bei einigen (aber nicht allen!?!) ESP-01 festgestellt, dass ein flashen nur OHNE die Verbindung zwischen GPIO16 und RST funktioniert. Also erst nach dem Aufspielen des Programms die Verbindung herstellen!

Im Moment bin ich noch am Experimentieren, wie lange ein Feuchte-Temperaur-Sensor DHT22 im Batteriebetrieb am ESP-01 tatsächlich läuft. Der ESP-01 läuft zwar mit 2x1,5 Volt (laut Datenblatt 3,3 VDC), also zum Beispiel zwei Mignon-(AA)-Zellen. Allerdings benötigt der DHT22 eine höhere Spannung. Ist die Spannung zu gering, dann geht die Feuchte-Messung langsam mit sinkender Spannungsversorgung gegen 100%. Laut Datenblatt benötigt der DHT22 mehr als 3,3 VDC. Er misst aber auch mit weniger Spannung zuerst noch vernünftige Werte, aber eben nicht besonders lange. Also habe ich mir einige kleine 3,3 VDC-Spannungswandler gekauft. Nun versorgen drei Mignon-Zellen den DHT22, und die Spannung für den ESP-01 wird auf 3,3 VDC runtergesetzt. Das funktioniert im Moment ganz gut, mal sehen wie lange.

Mit diesem Aufbau lassen sich vergleichsweise günstige WLAN-Sensoren herstellen.

Da der ESP8266 für batteriebetriebene Anwendungen die meiste Zeit im Tiefschlaf ist, kann er nicht als WLAN-Server arbeiten (meine Raspberry Pi laufen als WLAN-Server). Der ESP8266 muss also als WLAN-Client betrieben werden. Nach dem Aufwecken verbindet er sich mit dem WLAN und sendet die Sensordaten an eine PHP-Seite auf einem WLAN-Server (z.B. Raspberry Pi). Das PHP-Skript wiederum schreibt die Daten zum Beispiel in eine MySQL-Tabelle. Code-Beispiele dazu findet man im Netz.


Erfasste Parameter

Mit dieser Ausstattung werden folgende Parameter erfasst und in einer MySQL-Datenbank abgelegt:

  • Soll- und Ist-Temperatur und relative Feuchte in jedem Raum und Zimmer, inklusive Keller
  • Außentemperatur und -Feuchte, Luftdruck (kPaabs)
  • Vor- und Rücklauftemperatur sämtlicher Fußboden-Heizkreise
  • Schaltzustand der Heizkreis-Ventile (an/aus)
  • Vor- und Rücklauftemperatur der Warmwasser-Zirkulationsleitung
  • Ein-Aus-Zustand der Warmwasser-Zirkulationspumpe
  • Netzspannung und Netzfrequenz, bei Bedarf elektrischer Verbrauch eines speziellen Verbrauchers (z.B. Waschmaschine, Trockner, Warmwasser-Zirkluationspumpe etc.)
  • Gaszählerstand (m^3)
  • Stromverbrauch (kWh) und aktuelle Leistung (in Watt als 15-Minuten-Statistik)

Für die Visualisierung verwende ich amCharts, das die Daten direkt aus der jeweiligen MySQL-Tabelle bezieht. Das klappt über das amCharts-Pluging dataloader hervorragend, wenn man mal das Grundprinzip verstanden hat. Auf diese Weise kann man dann über HTML-Buttons auf verschiedene Daten zugreifen, indem dem PHP-Script im dataloader ein Parameter mit übergeben wird. Das sieht dann zum Beispiel so aus:


Was bringt das Ganze?

Das ist eine gute Frage! Zuerst einmal Spass und Freude am Basteln und Programmieren, vor allem wenn am Ende alles klappt (was bei mir nicht auf Anhieb der Fall war). Und dann ist es ganz einfach sehr beeindruckend zu sehen, was ein so kleiner Ein-Platinen-Comupter mit einem Leistungsbedarf von unter zwei Watt zu leisten vermag. Die im Vergleich zu kommerziellen Lösungen überschaubaren Kosten waren ein weiterer Anreiz.

Ich bin neugierig und wollte schon immer Mal wissen, wie denn die Heizung tatsächlich funktioniert. Wie träge ist die Regelung einer Fußbodenheizung? Wie lange dauert es, bis ein Raum warm wird? Sind meine Heizkreise im großen Wohnbereich richtig geregelt? Macht eine Nachtabsenkung bei einer Fußbodenheizung eigentlich Sinn? Funktioniert die Regelung der Vorlauftemperatur wie gewünscht in Abhängigkeit der Außentemperatur? Wieviel Strom braucht eigentlich ein Haushalt? Wie niedrig ist die Grundlast? Wie hoch sind die Spitzen?

Mit diesem Projekt kann ich nun folgende Antworten geben:

  • Bei unserem Haus macht eine Nachtabsenkung der Heizung keinen Sinn. Die Trägheit großer Räume (Wohnzimmer und offene Küche) ist so groß, dass es je nach Außentemperatur mehrere Stunden dauert, bis große Räume aufgeheizt werden. Ich fahre ohne Nachtabsenkung mit Außentemperatur geregelter Vorlauftemperatur (linear, Fußpunkt bei außen +20°C ist VL=25°C, Endpunkt bei -15°C ist VL=40°C).
  • Der elektrische Verbrauch ist sehr stark schwankend. Bei angenommenen 3500 kWh Jahresverbrauch ist der mittlere Verbrauch bei weitem nicht bei ca. 400 W (3500 kWh / 8760 Stunden pro Jahr). 50% meiner Bezüge liegen unter 200 W, ca. 70% unter 300 W. Der minimale Leistungs-Bezug beträgt ca. 75 W.
  • Die Regelung meiner Warmwasser-Zirkulationspumpe hat nicht funktioniert. Eigentlich sollte diese über die Messung der Vorlauftemperatur laufend meinen 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 Warmwasser-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 Warmwasser-Nachschub im Vorlauf sorgt, ging der Hersteller nicht ein und meinte, ich sollte abwarten.