Zentralheizung nahtlos mit Arduino verbinden für smarte Steuerung
Komponenten und Zubehör
| Arduino UNO | × | 1 |
| Arduino OpenTherm Shield | × | 1 |
| 24V Netzteil | × | 1 |
Über dieses Projekt
Haben Sie sich schon gefragt, wann und warum Ihre Heizung läuft und Ihr Zuhause heizt? Möchten Sie Ihr Heizsystem mit Arduino automatisieren? Der OpenTherm Shield ist genau dafür gemacht. Er ermöglicht die Überwachung und Steuerung Ihres OpenTherm-Kessels mit Arduino.


Hintergrund
Letztes Jahr wollte ich meine Gasheizung mit einem Kaminregler kombinieren. Mein BAXI-Kessel und Thermostat sind recht smart, also wollte ich den Kessel natürlich so erweitern, dass er auch den Kamin steuert. Ich hatte genug von den teuren offiziellen BAXI-Erweiterungen dafür.
Also baute ich mir ein OpenTherm-Gateway, das die Kommunikation zwischen Thermostat und Kessel abfing und einen Algorithmus einbaute, der entweder den Kessel zündet oder die Wärme vom Kamin nutzt – [mehr über den Regler].
Da viele Leute Ähnliches wollten, entschied ich mich, ein Modul – einen Arduino Shield – zu entwickeln, mit dem jeder ganz einfach seine Hausheizung steuern kann.

Wofür ist der Shield gut?
- Eigenen Arduino-basierten Kessel mit bestehendem OpenTherm-Thermostat bauen (eher unwahrscheinlich, aber möglich).
- Shield nutzen, um einen eigenen Arduino-basierten Thermostat zu bauen, der Kessel und Heizung vollständig übernimmt. Ideal für Hausautomation. Benötigt nur externe 5V-Versorgung.
- OpenTherm-Shield in die Leitung zwischen bestehendem Kessel und Thermostat schalten, um einen Monitor zu erstellen, der anzeigt, wann und wie der Kessel heizt. Kommunikation kann sogar abgefangen werden, z. B. für drahtlose Steuerung.
- OpenTherm erlaubt ein Man-in-the-Middle-Gateway, das mit Kessel und Thermostat spricht. So nutzte ich den Shield für meinen OpenTherm-Regler.
Verfügbare Daten und Befehle
- Raumtemperatur
- Raumtemperatur-Sollwert
- Vorlauftemperatur (Heizwasser)
- Rücklauftemperatur
- Warmwassertemperatur*
- Warmwasserdruck*
- Warmwasserdurchfluss*
- Außentemperatur*
- Kesselstatus (läuft / nicht läuft / Fehler)
- Modulationsgrad
- Abgastemperatur*
- Statistik: wie lange der Kessel lief
* Hinweis: Diese Werte sind nur verfügbar, wenn der Kessel mit dem nötigen Zubehör ausgestattet ist.
Shield aufbauen
Die Elektronik basiert auf dem OpenTherm-Gateway-Projekt, das einen PIC-Mikrocontroller nutzt. Ich habe es für Arduino adaptiert und ein Arduino-UNO-kompatibles Layout erstellt.

Sie können obigen Schaltplan und die Gerber-Dateien nutzen, um den Shield selbst zu fertigen. Ich lasse meine Platinen bei PCBWay herstellen – PCB Prototyping the Easy Way. Die blauen Platinen sind in einer Woche da, blauer Lötstopplack kostet gleich viel wie grün. Der Kundenservice ist top. Oder Sie bestellen ein fertiges DIY-Kit.

Shield als Thermostat nutzen
Das erste Beispiel zeigt, wie man den Shield als eigenen Thermostat einsetzt. Benötigt:
- OpenTherm-Kessel
- Arduino UNO, WeMos D1 oder jedes Arduino-UNO-kompatible Board. Einzige Voraussetzung: Unterstützung von Pin-Interrupts an Pin 2 und 3.
- 5V-Netzteil. Kein 24V-Netzteil nötig, da nur mit Kessel kommuniziert wird.

Verbinden Sie Kessel und Arduino OpenTherm Shield wie abgebildet, stecken Sie den Shield auf den Arduino und starten Sie mit der Programmierung. Die Arduino OpenTherm IO Library enthält folgendes Beispiel zur Kesselskommunikation:
void loop() { if (OPENTHERM::isIdle()) { message.type = OT_MSGTYPE_READ_DATA; message.id = OT_MSGID_SLAVE_CONFIG; message.valueHB = 0; message.valueLB = 0; Serial.print("-> "); OPENTHERM::printToSerial(message); Serial.println(); OPENTHERM::send(BOILER_OUT, message); // send message to boiler } else if (OPENTHERM::isSent()) { OPENTHERM::listen(BOILER_IN, 800); // wait for boiler to respond } else if (OPENTHERM::getMessage(message)) { // boiler responded OPENTHERM::stop(); Serial.print("<- "); OPENTHERM::printToSerial(message); Serial.println(); Serial.println(); delay(100); // minimal delay before next communication } else if (OPENTHERM::isError()) { OPENTHERM::stop(); Serial.println("<- Timeout"); Serial.println(); } }
Zuerst prüfen Sie mit OPENTHERM::isIdle, ob kein Befehl ansteht. Falls nicht, senden Sie den nächsten. Hier wird die Slave-Konfiguration angefordert. Nach erfolgreichem Senden starten Sie das Lauschen auf Antwort mit OPENTHERM::listen. OPENTHERM::getMessage liefert true, sobald eine Antwort vorliegt; bei Fehler oder Timeout gibt OPENTHERM::isError true zurück. Die Library enthält die OpenTherm-Nachrichtenstruktur mit dekodierten Protokolldaten – Sie müssen sich nicht um Formate kümmern. Schauen Sie in den gut dokumentierten Quellcode. Alle Nachrichtentypen sind in den Konstanten oder der OpenTherm-Dokumentation gelistet.
struct OpenthermData { byte type; byte id; byte valueHB; byte valueLB; float f88(); void f88(float value); uint16_t u16(); void u16(uint16_t value); int16_t s16(); void s16(int16_t value); }
Shield als Monitor, Gateway oder Regler nutzen
Das zweite Beispiel zeigt, wie man ein Man-in-the-Middle-Gerät in den OpenTherm-Bus einschleift, um Kessel und Thermostat zu überwachen oder ihre Kommunikation abzufangen. Benötigt:
- OpenTherm-Thermostat
- 24V 500mA Netzteil

Verbinden Sie den Shield in den Bus zwischen Kessel und Thermostat wie abgebildet. Er unterbricht die Leitung. Jetzt ist die Kommunikation unterbrochen, es sei denn, Sie laden eine Gateway-Software auf den Arduino, die Befehle und Antworten zwischen Thermostat und Kessel weiterleitet. Auch dafür gibt es ein hervorragendes Beispiel in der Arduino OpenTherm IO Library.
void loop() { if (mode == MODE_LISTEN_MASTER) { if (OPENTHERM::isSent() || OPENTHERM::isIdle() || OPENTHERM::isError()) { OPENTHERM::listen(THERMOSTAT_IN); } else if (OPENTHERM::getMessage(message)) { Serial.print("-> "); OPENTHERM::printToSerial(message); Serial.println(); OPENTHERM::send(BOILER_OUT, message); // forward message to boiler mode = MODE_LISTEN_SLAVE; } } else if (mode == MODE_LISTEN_SLAVE) { if (OPENTHERM::isSent()) { OPENTHERM::listen(BOILER_IN, 800); // reply need to be send back in 800ms } else if (OPENTHERM::getMessage(message)) { Serial.print("<- "); OPENTHERM::printToSerial(message); Serial.println(); Serial.println(); OPENTHERM::send(THERMOSTAT_OUT, message); // send message back to thermostat mode = MODE_LISTEN_MASTER; } else if (OPENTHERM::isError()) { mode = MODE_LISTEN_MASTER; Serial.println("<- Timeout"); Serial.println(); } } }
Das Gateway lauscht auf Thermostat-Befehle. Erkennt es eine Anfrage, parst und leitet sie an den Kessel weiter. Dann lauscht es auf die Kessel-Antwort. Trifft diese innerhalb von 800 ms ein, leitet es sie zurück zum Thermostat. Weder Thermostat noch Kessel bemerken das Zwischengeschaltete. Es bleibt viel Raum für eigenen Code, um Nachrichten auszuwerten und nützliche Informationen (Status, Temperaturen, Druck, Statistiken…) auszulesen. Sie können sogar Anfragen oder Antworten überschreiben oder verwerfen.
Wie Sie sehen, ist es wirklich einfach, mit Ihrer smarten Heizung zu kommunizieren und sie noch intelligenter zu machen. Im nächsten Artikel zeige ich die praktische Nutzung dieser Hardware in meinem OpenTherm-Regler.
Code
OpenTherm IO Library für Arduino
https://github.com/jpraus/arduino-opentherm
Schaltplan
Herstellungsprozess
- Zentralheizungskessel mit Raspberry Pi überwachen – Hardware, Software & Setup Guide
- Günstiges drahtloses Sensornetzwerk für Zuhause selbst bauen
- TGS2600 Gassensor an Raspberry Pi anschließen für Schadgasdetektion
- Internet-gesteuerter Video-Streaming-Roboter mit Arduino & Raspberry Pi bauen
- GrabCAD Print mit Ihrem Stratasys 3D-Drucker verbinden – Schritt-für-Schritt-Anleitung
- Geschäftsgewinne maximieren: Bewährte Heizöl-Effizienzstrategien
- Deckenventilator per Alexa steuern – Schritt-für-Schritt-Anleitung
- Bluetooth-gesteuerter Arduino-Spybot bauen – Überwachungsroboter mit IP-Kamera
- FlickMote: Gestensteuerung per Ultraschall & IR für Smart Home (Arduino 101)
- Dynamische Marquee-LED-Beleuchtung mit Arduino Nano und NeoPixels erstellen