Externe Heizungssteuerung für Heizkreis 1

Auch die neue alte Buderus lässt sich extern steuern

Im neuen alten Haus befindet sich natürlich auch eine neue alte Heizung – zum Glück nicht mehr im Originalzustand von 1978, aber immerhin auch schon fast 25 Jahre alt. Jeder Handwerker, der das gute Stück sieht, sagt: Die hält ewig.

Variablen in HomeMatic-Scripten

Die CCU hatte früher ein Limit von maximal 200 Variablen, das mit Firmware-Version 2.29.18 aufgehoben wurde. Dieses Limit bezog sich auf alle Variablen, die in allen Scripten verwendet werden. Gemeint sind Variablen, die direkt im Script definiert werden: object x; object y; var z;

Wenn Scripte nicht mehr funktionieren und bei der Prüfung unerklärliche Syntax-Fehler auftreten, sollte versuchsweise dieses Programm wieder gelöscht oder deaktiviert werden – oder, noch besser, auf die aktuelle Firmware-Version aktualisiert werden.

Benennung von Systemvariablen

Prinzipiell kann man Systemvariablen – so wie allen Objekten in der CCU – beliebige Namen geben, also z. B. auch Umlaute und Sonderzeichen verwenden. Ich empfehle jedoch, sich auf reguläre Buchstaben (a-z, A-Z) zu beschränken: Bei Umlauten und Sonderzeichen besteht die Gefahr, dass Systemvariablen in Scripten nicht überall gefunden werden.

Bestandsaufnahme: Das blaue Monster

Konkret handelt es sich um einen Kessel Buderus Logano G124, Warmwasserspeicher Logalux L, Mischergruppe HSM20 sowie das Steuergerät R2107M.

Der Kessel erzeugt die Wärme, die dann durch verschiedene Pumpen und Regler verteilt wird:

Heizkreis 2 am Mischer erreicht systembedingt niedrigere Vorlauftemperaturen als Heizkreis 1. Ursprünglich hingen an Heizkreis 1 die Unterflurheizung und an Heizkreis 2 die restlichen Heizkörper im ganzen Haus. Die Zirkulationspumpe war notwendig, um den Einbauort einer zweiten Küche im ersten OG mit Warmwasser zu versorgen – auch wenn da keine Küche war.

Wer nicht weiß, was eine Unterflurheizung ist: Der Heizkörper befindet sich in einem Schacht vor den Fenstern. Die warme Heizungsluft steigt nach oben.

In den 70ern war das sehr schick, aber die Hälfte der Wärme ging in den Keller und ins Mauerwerk. Außerdem kann sich wohl jeder vorstellen, was die Kombination aus Heizungsschacht, Kleinkindern und Spielzeug ergibt.

Nach diversen Umbauten versorgt jetzt der ungeregelte Heizkreis 1 die Heizkörper mit HomeMatic-Thermostaten. Heizkreis 2 versorgt über den Mischer die neue Fußbodenheizung. Da wir nur einen Raum mit Fußbodenheizung haben, habe ich hier auf die HomeMatic-Steuerung für Fußbodenheizungen verzichtet. Lediglich ein Temperatursensor HmIP-STE2-PCB überwacht die Vorlauftemperatur, falls der Mischer die voreingestellten 35° Maximaltemperatur deutlich überschreitet, denn das wäre schlecht für das Parkett

Die Zirkulationspumpe wurde stillgelegt, als das Froschbad saniert wurde. Anderenfalls hätten wir nahezu dauerhaft Warmwasser durch das Bad und die (ebenfalls stillgelegte) Küche im ersten OG pumpen müssen, um Verkeimung zu verhindern. Und um das Wasser zu pumpen, hätten wir erstmal die Pumpe ersetzen lassen müssen – die saß nämlich fest.

Mal sehen, wie lange man uns noch Gas für das blaue Monster liefert.

Herausforderung: Kessel

Die Dokumentation des Herstellers sagt es nicht besonders deutlich, aber auch an die Steuerung dieser Heizung kann man einen Aktor anschließen, der dann zumindest den Brenner steuert. So viele Möglichkeiten, da mit der HomeMatic einzugreifen … Ich habe einen ganzen Vierfach-Aktor im Schaltschrank dafür eingeplant.

Der hier beschriebene Umbau ist nicht durch den Hersteller vorgesehen.

Wenn der Brenner über einen längeren Zeitraum gesperrt wird, geht die Elektronik in den Störungsmodus. Bisher kam sie da bei mir immer wieder selbst raus, sobald der Brenner freigeschaltet wurde und gezündet hat.

Dennoch der Hnweis: Alle Umbauten auf eigene Gefahr.

Soweit, so gut. Jetzt stehe ich vor dem Problem, dass wir zwar einen „Niedertemperaturkessel“ haben, aber effektiv die Mindesttemperatur bei 40 Grad liegt. Das heißt, er beim Heizen muss er erstmal 40 Grad gemessene Temperatur erreichen, damit das Kondensat, das bei der Verbrennung entsteht, verdampfen kann. Erst dann werden die Pumpen für die Heizkreise freigeschaltet.

Zudem ist ein Kessel keine Therme. Bei der Therme wurde das Heizungswasser direkt aufgeheizt. Dadurch wurde das Wasser in der gesamten Anlage relativ langsam aufgewärmt und ich konnte mit der HomeMatic einfach den Brenner abschalten, wenn meine gewünschte Vorlauftemperatur erreicht war. Der Kessel wird dagegen erst auf seine Mindesttemperatur geheizt, bevor die Pumpen eingeschaltet werden und die Wärme abnehmen – weniger Vorlauftemperatur als die, die von der Heizung für richtig gehalten wird, ist nicht möglich.

Schließlich kommt dann noch dazu, dass bei weitgehend geschlossenen Thermostatventilen die Wärme nur langsam aus dem Kessel ins Haus transportiert wird. Das führt zu dem unangenehmen Effekt, dass bei wenig Wärmebedarf an den Heizkörpern eine hohe Vorlauftemperatur anliegt, aber bei großem Wärmebedarf das Wasser schnell durchfließt, abkühlt und damit niedrigere Temperaturen erreicht.

Ich muss also ein bisschen basteln und mich auf etwas verlassen, was ich nicht mag: Die Intelligenz der Heizung.

Externe Ansteuerung des Brenners

Damit die Heizung ihr Ding machen kann, nutze ich die potentialfreien Anschlüsse des HmIP-DRSI4 aus: Ich trenne die Leitungen von der Heizung zu den externen Komponenten auf und setze meine HomeMatic dazwischen.

Arbeiten an elektrischen Anlagen dürfen nur von Elektrofachkräften durchgeführt werden. Netzspannung ist kein Spielzeug! Bei fehlerhafter Ausführung drohen Sach- und Personenschäden durch Brand oder elektrischen Schlag!

Beauftragen Sie einen Elektriker oder Heizungsbauer mit Arbeiten an der Installation, wenn Sie selbst keine Fachkraft sind.

Bei den Pumpen bedeutet das, dass die HomeMatic den Pumpenlauf nur verhindern kann, nicht aktivieren. Eingeschaltet werden die Pumpen nur, wenn die Intelligenz der Heizung meint, dass sie laufen sollen.

Für die Steuerung des Brenners setze ich den HmIP-DRSI4 an den Anschluss für Si-Geräte. Wenn diese Kontakte unterbrochen sind, bleibt der Brenner aus. Auch hier steuert letztlich die Heizung, wann der Brenner laufen soll – ich muss nur über die HomeMatic sicherstellen, dass der Brenner freigeschaltet wird, wenn er gebraucht wird.

Wichtig ist bei dieser Logik, dass die Heizung eine einigermaßen passende Heizkurve hat. Zu hoch eingestellt verbraucht sie unnötig Gas, zu niedrig eingestellt wird es nicht warm.

Dank HomeMatic kann man die Einstellung aber relativ einfach vornehmen: Die Thermostate melden den Öffnungsgrad der Ventile in allen Räumen. Wenn dort einer auf 100% geht, dann liefert die Heizung zu wenig Wärme und ich muss die Auslegungstemperatur (also letztlich die Temperaturkurve) erhöhen. Sind alle Thermostate dauerhaft zu, ist die Temperatur zu hoch und ich kann sie runterdrehen.

Nach einer Saison habe ich die richtige Einstellung gefunden und muss mich nicht mehr drum kümmern, jedenfalls bis die neuen (dichten) Fenster kommen und das Dach gedämmt wird.

Für den Heizkreis 2 gelten ähnliche Überlegungen, aber da ist die Steuerung etwas direkter. Das ist dann ein Thema für sich.

Kurvenlage

Im alten Haus war ich am Ende beim erweiterten Wärmebedarfsrelais mit Vorlaufregelung gelandet. Das hat perfekt funktioniert, da die Therme mit mäßiger Leistung direkt den Heizkreis aufgewärmt hat. Das ging langsam genug, so dass die HomeMatic bei der benötigten Temperatur die Heizung ausschalten und abkühlen lassen konnte.

Bei der Etagenheizung sah es schon etwas anders aus – das Ding hat geheizt, als ob es kein Morgen gibt, so dass nach wenigen Minuten die volle Vorlauftemperatur in die Heizkörper floss. Dort habe ich mir beholfen, indem ich der Therme eine Art Pulswellenmodulation spendiert habe: Je höher der Wärmebedarf, gemessen durch Heizkörperthermostate, desto länger läuft sie. Die Nachlaufzeit für die Pumpe lag bei etwa 10 Minuten; mit einer Taktzeit von 30 Minuten hatten wir recht gleichmäßige Wärme in der Wohnung.

Nun also: Ein Kessel. Im Gegensatz zur Therme fließt nicht das Wasser aus den Heizkreisen direkt am Brenner vorbei, sondern der Brenner erhitzt zunächst den Kessel, durch den dann wiederum das Wasser für die Heizkreise und den Warmwasserspeicher fließt.

Die Elektronik der Heizung sorgt dabei dafür, dass der Brenner nach Bedarf ein- und ausgeschaltet wird, um die erforderliche Kesseltemperatur zu erreichen, und dass die Pumpen und der Mischer nur laufen, wenn der Kessel den richtigen Temperaturbereich hat:

Die Vorlauftemperatur lässt sich daher nicht kontrollieren wie beim ersten Programm. Eine simple Modulation wie beim zweiten Programm kommt auch nicht in Frage, weil keineswegs gesagt ist, dass die Pumpe immer läuft, wenn die CCU sie anfordert.

Am Ende habe ich als faulen Kompromiss die Vorlauftemperatur als Auslöser genommen: Wenn die Vorlauftemperatur niedriger ist als die Wärmeanforderung der Thermostate, dann wird der Brenner freigeschaltet – sonst nicht. Die Pumpe wird freigeschaltet, sobald irgendwo im Haus 7,5% Wärmeanforderung zusammenkommen.

So habe ich dann doch noch einen Temperatursensor eingesetzt – einfach in die Isolierung zum Heizungsrohr gesteckt.

Die dünne Linie in der Grafik zeigt den Wärmebedarf für Heizkreis 1, wie er vom (neuesten) Wärmebedarfsscript errechnet wird. Man erkennt, dass ich den errechneten Wert noch um 20° erhöhe, um die passende Vorlauftemperatur zu bekommen. Außerdem sieht man, wie die Heizung unter anderem zwischen 14 und 16 Uhr in den Sommerbetrieb gegangen ist, weil die entsprechende Außentemperatur erreicht wurde.

Die dicke grüne Linie ist die Vorlauftemperatur, die Balken zeigen den Gasverbrauch. Man sieht, wie stets der Brenner anspringt, wenn die Vorlauftemperatur unter den Wärmebedarf sinkt. Der Gasverbrauch korrespondiert nicht exakt mit den Kurven, weil es auch noch Heizkreis 2 sowie den Warmwasserbedarf gibt. Das wirkt sich auch auf die Vorlauftemperatur aus: Wemn Warmwasser oder Heizkreis 2 den Brenner anfordern, steigt auch die Temperatur im Heizkreis 1.

Immerhin konnte ich die Leistung der Heizungspumpe auf die niedrigste Stufe stellen. Das ist völlig ausreichend, damit es überall im Haus ausreichend warm wird, und spart bei Dauerbetrieb einige kWh Strom.

Systemvariable

Wie immer verbinde ich die verschiedenen Teile der Steuerungslogik über eine Systemvariable.

Meine Variable Heizung HK1 Anforderung ist eine Werteliste, die alles für den Heizkreis 1 steuert.

aus

kein Wärmebedarf, Pumpe ist aus und Brenner wird nicht angefordert

Pumpe

Wärmebedarf ist niedriger als Vorlauftemperatur, nur die Pumpe läuft

Brenner

Wärmebedarf ist größer als Vorlauftemperatur, Pumpe läuft und Brenner wird angefordert

Die Variable wird durch das folgende Script gesetzt. Zwei weitere Scripte steuern dann die Pumpe für Heizkreis 1 und den Brenner.

WebUI-Programm und Script

Das WebUI-Programm ist bereits vom Script des Wärmeanforderung bekannt. Im ersten Teil – verzögert um eine Sekunde – wird der Bedarf ermittelt.

Hier geht es zunächst um den zweiten Teil – verzögert um zwei Sekunden: Die „Berechnung“ der Anforderung.

Strenggenommen wird da gar nichts berechnet, sondern eher bestimmt: Wärmebedarf, Sommerbetrieb (eine weitere Systemvariable) und aktuelle Vorlauftemperatur werden verglichen. Dann bestimmt das Script, welcher Teil von Heizkreis 1 in Betrieb genommen wird.

boolean b_sommerbetrieb = dom.GetObject ("Heizung Sommerbetrieb").Value() > 0;

object o_anforderung = dom.GetObject ("Heizung HK1 Anforderung");
integer i_anforderung_ist = o_anforderung.Value();
integer i_anforderung_soll = i_anforderung_ist;

real r_bedarf = dom.GetObject ("Heizung HK1 Bedarf").Value();

real r_vt = dom.GetObject ("Heizung HK1 Vorlauf").DPByHssDP ("ACTUAL_TEMPERATURE").Value();
integer i_diff = system.Date().ToTime().ToInteger() - o_anforderung.Timestamp().ToInteger();

if ((b_sommerbetrieb) || (r_bedarf < 22.5)) {
  i_anforderung_soll = 0;
} elseif ((r_vt > r_bedarf) || (i_anforderung_ist == 0) || ((i_anforderung_ist == 1) && (i_diff < 180))) {
 i_anforderung_soll = 1;
} else {
 i_anforderung_soll = 2;
}

if (i_anforderung_soll != i_anforderung_ist) {
  o_anforderung.State (i_anforderung_soll);
}

i_anforderung_soll und i_anforderung_ist werden zunächst auf den aktuellen Wert von Heizung HK1 Anforderung gesetzt. Danach beginnt die Programmlogik und ändert bei Bedarf i_anforderung_soll

Am Ende wird dann die Systemvariable Heizung HK1 Anforderung gesetzt, sofern der neue Status abweichend vom alten ist.

Pump Up the Jam

Nachdem die Systemvariable gesetzt ist, kann auch das letzte Script aus dem obigen WebUI-Programm laufen. Wie im Screenshot oben zu sehen ist, läuft es drei Sekunden nach dem schnellen Heizungstakt los.

boolean b_hk1 = dom.GetObject ("Heizung HK1 Anforderung").Value() > 0;
integer i_modus = dom.GetObject ("Heizung Modus").Value();

boolean b_soll = (i_modus == 3) || ((i_modus != 2) && b_hk1);

object o_pumpe = dom.GetObject ("Heizung HK1 Pumpe").DPByHssDP ("STATE");
integer i_diff = system.Date().ToTime().ToInteger() - o_pumpe.Timestamp().ToInteger();

if ((o_pumpe.Value() != b_soll) || (i_diff > 600)) {
  o_pumpe.State (b_soll);
}

Als erstes wird geprüft, ob Heizung HK1 Anforderung größer als 0 ist. Das bedeutet, dass entweder Pumpe oder auch der Brenner angefordert wird.

Danach kommt eine weitere Systemvariable ins Spiel: Heizung Modus steuert die gesamte Heizungsanlage.

Über diese Variable kann ich den Betriebsmodus der Heizung für das ganze Haus festlegen: absenken bei Abwesenheit, Wartung wenn der Monteur kommt, vorwärmen wenn wir nach dem Winterurlaub anheizen und erstmal nur die langsame Fußbodenheitzung dran ist …

Einige der Modi haben direkte Auswirkung auf die Pumpensteuerung. Das wird als nächstes im Script geprüft: Im Wartungsmodus (i_modus == 3) sind alle Pumpen und der Brenner dauerhaft freigeschaltet, im Modus aus sind sie komplett gesperrt. Anderenfalls (i_modus != 2) lasse ich den Bedarf über Heizung HK1 Anforderung schalten: Wenn der aktuelle Status des Kanals Heizung HK1 Pumpe vom Sollstatus abweicht, wird geschaltet.

Schließlich kommt noch der Timestamp() ins Spiel, zu dem das letzte Mal der Status des Aktors an die CCU übermittelt wurde: Wenn dieser älter als 600 Sekunden (also zehn Minuten) ist, wird ebenfalls noch einmal der Sollstatus geschaltet. Damit wird der Status auf jeden Fall geradegezogen, auch wenn wegen einer Funkstörung der Zustand in der CCU nicht dem Zustand des Aktors entspricht.

Der Brenner wird schließlich über ein separates Programm gesteuert, weil dort auch der Bedarf von Heizkreis 2 und dem Warmwasserspeicher berücksichtigt werden muss.

Navigation