Heizungssteuerung mit Raspberry PI und GNU/Linux
Mariasdorf, 19.1.2013, Gregor Horvath
Einleitung
Ich habe eine Hackschnitzelheizung aus den 80iger Jahren in einem Haus mit ca. 250 m2 in Betrieb.
Die Vorlauftemperatur kann über einen 3 Wege Mischhahn stufenlos geregelt werden.
Vor 2004 konnte dies nur manuell geschehen.
Um Energie und Kosten zu sparen, entschloss ich mich 2004 nachträglich eine computergesteuerte Regelung zu bauen Diese wurde seither immer weiter verbessert.
Auch sollte der Komfort erhöht werden, weil die manuelle Regelung der häufig notwendigen Aufwärmung und der damit sehr schwankenden Regelungsparametern sehr schwierig war.
Übersicht
Ein Raspberry PI dient zur Messung der Temperatur in einem Raum und steuert die daraus berechnete diskrete Verstellung des 3 Wege Mischhahns.
Desweiteren wird mit diesem System die Erdwärmeheizung gesteuert (Ein / Aus), die bei Abwesenheit in Betrieb ist. Die Software (in Python geschrieben) ermöglicht die Programmierung von Temperaturpfrofilen und berücksichtigt die thermischen Eigenschaften / Trägheit des Hauses.
Früher wurde das System von ausrangierten Linux PCs (Pentium 100, 16MB Speicher, Debian Woody) über den Parallel und Serial Port gesteuert.
Nachdem diese Hardwarefehler hatten, habe ich das System auf Raspberry PI ohne Bildschirm umgebaut.
Nachdem mein Arduino bereits von einem Blitz zerstört wurde, habe ich den Raspberry in ein Metallgehäse eingebaut.
Hahndrehung
Ich wollte an der Heizung selbst kaum etwas verändern.
Um einen automatische Durchrutschkupplung für Fehler zu haben entschloss ich mich, den vorhandenen 3 Wege Handhahn mit einem Riemengetriebe anzutreiben. Ich drehte ich einen entsprechenden Adapter um auf den Hahn eine Riemenscheibe montieren zu können.
Auf die Wasserrohre montierte ich ein Stahlträger, sodaß ich parallel zur Drehachse des Hahns einen Drehpunkt für einen Hebel hatte. Die definierte Riemenspannung (Durchrutschen) sollte über diesen Hebel und entsprechenden Gewichten automatisch erfolgen, sodaß eine manuelle Verstellung des Hahns weiterhin ohne Werkzeug oder der Notwendigkeit erneuten Spannens möglich war.
Der Hebel ist ein L Stahlprofil. Auf einen Arm des Hebels wurde ein Bohrung gemacht und eine Motor/Getriebeeinheit mit einem Plantetengetriebe 1:512 und einer Riemenscheibe am Wellenende montiert. Der Motor stammt von Conrad (Artikelnr. 222351 - LN),
einen Adapter zur Riemenscheibe drehte ich mir.
Der Motor dreht recht hoch und ist daher auch relativ laut. Das ist aber im Heizraum kein Problem.
Vor die Riemenscheibe montierte ich ein Kunststoffgehäuse, das die notwendige Elekronik enthält.
Der Hebel hat einen Verstellbereich von 90 Grad. Der Motor muß also links und rechtsdrehen, die Umpolung wurde mit einem Relais gelöst.
Das Ein / Ausschalten des Motors übernimmt ebenso ein Relais.
Drehwinkelmessung
Für die Bestimmung der vorhandenen Stellung / Drehwinkel baute ich eine binäre Stellungsmessung mittels 3 Mikroschaltern. Diese 180 Grad zueinander gedrehten feststehenden Schalter werden von vom Hahn gedrehten Torbandschraubenchraubenköpfen je nach Winkel in verschiedene Binärmuster gedrückt. Dadurch sind 7 verschiedene Winkelstellungen messbar.
Vorher hatte ich eine Drehwinkelmessung mittels Potentiometer, Spannungsteilerschaltung und Analog/Digitalwandler. Dies erwies sich jedoch als zu langsam und fehleranfällig.
Auch für die Winkelmessung mittels Schalter musste ich eine softwareseitige Fehlerkorrektur schreiben. Es wird 3 mal der Wert gemessen, zeigen mindestens 2 denselben Wert wird dieser genommen. Damit funktioniert es jetzt ausreichend gut.
Temperaturmessung
Die Temperatur wird über einen Dallas 1 Wire DS18S20 Temperatursensor im Parasite Mode gemessen.
Am Raspberry wird der Sensor mit einm 4,7 kOhm Widerstand an die GPIO Pins angeschlossen und mittels der Linux-Kernelmodule w1-gpio und w1-therm angesprochen.
Nach einem Jahr problemlosen Betrieb zeigte der Sensor immer 85 Grad an.
Folgende Änderung brachte Abhilfe:
$ cat /etc/modprobe.d/w1.conf
options w1_gpio pullup=1
options w1_therm strong_pullup=1
Für die PC Messung hatte ich mir einen Adapter für die serielle PC Schnittstelle gebaut (Software digitemp ).
Früher wurde die Temperatur wird über einen temperaturabhängigen Widerstand und einen Spannungsteiler gemessen.
Das war jedoch sehr ungenau.
Computerschnittstelle
Früher hatte ich als Schnittstelle zum Computer das RS-232-Messmodul, Artikel-Nr.: 68-292-30 von ELV im Einsatz.
Dieses Teil sollte sich als problematisch herausstellen. Die IO Ausgänge waren zu schwach um direkt eine Relaisspule anzusteuern.
Also musste ich zusätzliche Transitorschaltungen bauen. Da stellt sich die Frage warum nicht direkt die IO Ports der parallelen Schnittstelle verwenden. Der A/D Wandler spinnte manchmal (offenbar temperaturepmfindlich) und liefert schwankende Werte. Er ist recht langsam, sodaß ich eine softwareseitige Kompensation programmieren mußte um eine präzise Reglerstellung zu erhalten. Daher habe ich die Steuerung auf die Ein/Ausgänge der parallelen Schnittstelle umgebaut, und dann auf die GPIO Ports des Raspberry PIs (kompatibel mit der parallelen Steuerung).
Software
Die entwickelte Software veröffentliche ich unter der GPL .
Ich habe die Sofware in Python 2.7 geschrieben.
- librpi.py: kaspelt den Zugriff auf die Raspberry GPIO-PINs
- hzg.py enthält die Logik der 3 Wege Hanhsteuerung.
- tempregeln.py enthält die Regelungslogik.
- 0.py ist eine einfache aber ausreichende und ressourcenschonende Text-Bedienoberfläche.
- libparallel.py: This class abstracts the usage of a parallel port as Input Output Card
- elv.py: steuert die low level Kommunikation mit dem M232 von ELV. Von ELV gibt es keine Linux geeignete Software (nur DOS/Windows) und scheinbar auch kein Interesse an Linux (keine Antwort auf meine Anfrage).
Notwendig ist dazu das Modul pyserial da der M232 über die Serielle Schnittstelle angesprochen wird.
Temperaturprofile werden als Texdateien erstellt und abgespeichert. Diese enthalten Soll Zeit / Temperaturangaben.
Es ist möglich je Heizungsart (Erdwärme/Hackschnitzel) standard, wochentagsspezfifische (z.B Montag) oder tagesspezifische Profildateien (genau an einem Tag gültig) anzulegen.
Je Heizungsart geht die Software von einer durschnittlichen Aufwärmzeit in Grad je Stunde aus, und startet rechtzeitig die Aufheizphase. (Um die Trägheit des Hauses/Heizung zu berücksichtigen)
Ein Cronjob startet regelmäßig (alle halben Stunden) das Script TempRegeln.py und das Script TempLog.py.
TempRegeln entscheidet aufgrund der jetztigen und der letzten Temperaturmessung und der aktuellen Zieltemperatur über eine Reglerverstellung . Der Reglerwert wird nicht absolut sondern immer nur ein Delta zum vorhandenen Wert berechnet.
Gregor Horvath
Zurück zur Hauptseite