Heizungsfernsteuerung

Meine Heizung (und noch ein paar Dinge mehr) steuert ein openhab2. Man koennte nun meinen, das Thema Fernsteuerung ist damit erledigt. Aber halt, nicht so schnell, ich meine etwas anderes: mein Wohnzimmer grenzt auf der einen Seite an einen Balkon, mit schoen grosser Fensterfront, darunter der Heizkoerper. Das ist die gute Nachricht. Auf der anderen Seite oeffnet sich das Zimmer zu einer Diele, in welcher eine Treppe ins kuehle Obergeschoss fuehrt. Das ist die schlechte Nachricht, genau genommen eine Katastrophe: waehrend es auf der Couch direkt an der Heizung kuschelig warm ist, friert der, welcher mit dem Ruecken zur Diele sitzt.

Als Abhilfe fallen mir ohne viel Nachdenken gleich drei Loesungen ein:

  1. Feingefuehl gepaart mit Erfahrung: nach ein paar Jahren in der Wohnung wird man wohl ein sicheres Gefuehl dafuer entwickeln, auf welche Temperatur man die Heizung einstellen muss, um im ganzen Wohnzimmer eine behagliche Temperatur zu haben. Vielleicht noch unter Beachtung der Aussentemperatur. Im Prinzip kann man das dann auch in Code giessen. Ist sicher eine gangbare Loesung fuer jemanden mit Geduld und eben Feingefuehl. Faellt fuer mich also flach.
  2. Eine Art KI-Algorithmus, welcher die Temperatur regelmaessig reguliert, aus den Ergebnissen lernt, damit quasi eine Wissendatenbank aufbaut und damit regelt. Offenbar muss man fuer diese Loesung die Temperatur irgendwo im Uebergang zwischen Wohnzimmer und Diele messen. Und dann realisiert der Computer im Prinzip die Variante 1. Das waere mein Favorit, wenn da nicht meine pragmatische Faulheit waere.
  3. Wenn ich fuer Variante 2 eh schon einen weiteren Messpunkt habe, kann ich es mir auch einfach machen: der Messpunkt steuert einfach die Heizung. Wenn ich am Messpunkt 20 Grad einstelle, dreht openhab einfach die Heizung solange hoch, bis die 20 Grad erreicht sind. Und dann halt wieder runter auf 20 Grad. Das klingt doch gut: einfach und funktional.

Fuer die Realisierung braucht man also einen Heizungsthermostat, bei welchen openhab2 die Temperatur lesen und setzen kann. Dazu ein Thermometer, welches openhab2 auslesen kann. Ich habe mich bei letzteren fuer das “HomeMatic Funk-Wandthermostat, Aufputzmontage” entschieden. Das ist batteriegetrieben, kann also beliebig platziert werden, und hat einen Einstellknopf, man kann also auch manuell regeln. Damit es nicht zu einfach ist, haben wir noch eine Balkontuer – deren Oeffnung soll natuerlich die Heizung abschalten.

So, lange Vorrede, jetzt endlich mal etwas Substanz:

Wir brauchen einige Items:

  • Temperature_Wall_Wohnzimmer: die Ist-Temperatur des Wandthermostats,
  • Soll_Temperatur_Wall_Wohnzimmer: die Soll-Temperatur des Wandthormostats,
  • Soll_Temperatur_Wohnzimmer: die Soll-Temperatur des Heizungsthermostats
  • Fenster_Wohnzimmer: der Fensterkontakt an der Balkontuer

Und damit bauen wir uns einfach eine Regel:

var Number targetTemp =  18
rule "heizung aufdrehen falls zu kalt oder zudrehen falls zu warm"
when
  Item Temperature_Wall_Wohnzimmer received update
then
  val Number sollTemp = Soll_Temperatur_Wohnzimmer.state
  val Number istTemp = Temperature_Wall_Wohnzimmer.state

  // sometimes targetTemp is null if this rule gets called...
  if (targetTemp == null) return;

  // no adjustments during window open
  if (Fenster_Wohnzimmer.state == OPEN) return; 

  if (istTemp < targetTemp) {
    if (sollTemp < targetTemp) {
      sendCommand(Soll_Temperatur_Wohnzimmer, targetTemp)
    }
    else {
      if (sollTemp - targetTemp > 5) {
        /* diff to high, do nothing */ 
      }
      else {
        sendCommand(Soll_Temperatur_Wohnzimmer, sollTemp+1)
      }
    }
  }
  if (istTemp > targetTemp && istTemp - targetTemp > 0.5) {
    if (sollTemp > targetTemp) {
      logInfo("dyn wohnz", "set sollTemp runter")
      sendCommand(Soll_Temperatur_Wohnzimmer, targetTemp)
    }
  }
end

Dazu kommt dann noch eine Regel, mit welcher der Wandthermostat quasi die Heizung ueberstimmt:

rule "heizung wohnzimmer wall thermostat overrules"
when 
  Item Soll_Temperatur_Wall_Wohnzimmer received update
then
  targetTemp = Soll_Temperatur_Wall_Wohnzimmer.state
  if (Fenster_Wohnzimmer.state == CLOSED && targetTemp != Soll_Temperatur_Wohnzimmer.state) {
    sendCommand(Soll_Temperatur_Wohnzimmer, targetTemp)
  }
end

Ich habe dann noch ein paar Regeln, welche die Heizung ab- und anschalten, wenn die Balkontuer geoeffnet oder geschlossen wird, am Wochenende Morgens die Temperatur etwas hochdrehent und spaet abends auf jeden Fall runterdrehen.

Im Ergebnis sieht das dann so aus:

Man kann schoen sehen, wie die Heizung staendig nachregelt. Offenbar wurde abends dann die Temperatur runtergedreht und am spaeten Vormittag hat wohl jemand gelueftet.

Im Ergebnis hat schon lange niemand mehr im Wohnzimmer manuell an der Heizung rumgestellt. So wie es sein soll.