OpenHAB Fußbodenheizung Thermostat mit Shelly Relais
Schritt-für-Schritt-Anleitung: Mit openHAB und einem oder mehreren Shelly-Relais machst du deine Fußbodenheizung smart – komfortabel steuerbar über die openHAB BlockLibrary und das Thermostat-List-Widget.
Problem- Beschreibung
Ich habe hierzu sehr lange recherchiert und versucht mich an Standards, bereits vorhandenen openHAB Lösungen und Regelwerken zu orientieren. Leider gab es für mich keine Lösung, die ich für mich vernünftig adaptieren konnte. Auch die Lösung von Shelly selbst, ein virtuelles Thermostat, mit Hilfe eines Shelly Temperatur Sensors und einem Shelly Relais zu nutzen, hat mich alleine aus dem Grund, dieses nicht auch noch über openHAB steuerbar zu machen, nicht überzeugt. Eine alternativ Lösung, ist es ein Shelly Walldisplay zu nutzen. Dies wird aber eine sehr kostspielige Lösung, wenn man es in jedem Raum nutzbar machen möchte und wird auch Stand heute noch nicht im Thermostat Mode vom openHAB Shelly Binding unterstützt. Alternativ kann man es via MQTT in openHAB einbinden.
Lösungs- Beschreibung
Zunächst einmal verwende ich an jedem Stellantrieb für die Fußbodenheizung ein Shelly Relais (bei mir: Shelly 1 oder Shelly 1mini gen3 / gen4). Dies macht es dann möglich einfach per Ein- und Aus- Befehl, die Heizung, bzw. den Stellantrieb An oder Aus zuschalten. Die Shelly Relais kann man ganz einfach anstelle des bereits vorhanden Raumthermostates anschließen. Ich habe bei mir die alten Thermostate komplett ausgebaut und dann durch eine Blind-Abdeckung die Wanddose verschlossen. Alternativ kann man die Verkabelung auch direkt im Heizverteilerkasten machen, in dem die Stellantriebe verbaut sind. Um nun die Heizung Temperatur gesteuert zu nutzen, braucht man noch einen Smarten Temperatur Sensor, der ebenfalls am Ende in openHAB nutzbar ist. Die einfachste und sicher beste Lösung ist es ein Shelly Blu H&T Sensor zu kaufen, diesen kann man dann einfach im Raum dort platzieren, wo man die Temperatur messen möchte. (Hinweis: nicht auf die Blind Abdeckung kleben, die Eigenwärme des Shelly Relais verfälscht die Werte). Ich gehe weiter unten noch auf die verschiedenen Möglichkeiten von Temperatur Sensoren ein. Nachdem wir nun den Heizungsventilschalter und den Temperatursensor in openHAB nutzbar haben, verheiraten wir das Ganze dann mittels speziell angelegten Items und einem passenden Regelwerk (openHAB Block Library).
Die Raumtemperatur Regelung in meiner Beschreibung hier bietet die folgenden Features:
- Temperaturgesteuerte Raumklimaregelung
- Raum Nachtabsenkung (Zeit gesteuert)
- Booster Mode (öffnet Heizungsventil für x Minuten)
- Smart-Grid Steuerung (Erhöhung der Raumtemperatur bei SmartGrid-Grün Modus)
- Raum Abwesenheitsabsenkung (Urlaubsmodus) (Bei vorhanden Anwesenheitsschalter)
- Regelwerk vereinfacht durch openHAB Block Library für Blockly
- openHAB List Widget zum Einstellen der Raumtemperatur und Anzeige des Thermostatstatus
- Einbindung in Amazon Alexa und Apple Home für die Sprachsteuerung
Hier ein Paar Beispiele wie das Ganze dann in der UI (hier iOS openHAB App) aussieht.
-
Heizventile alle aus (Absenkung)
-
Heizventile an
-
Booster Mode an
-
Tag und Nacht
Voraussetzungen
- funktionsfähiges openHAB Setup
- installiertes openHAB Shelly Binding
- vorhandener Stellantrieb für Fußbodenheizungsventile
- ggf. vorhandenes Wandthermostat für die Fußbodenheizung
- Shelly Relais, zum Beispiel:
- Raum Temperatur Sensor, zum Beispiel:
- Eigene Temperatur Sensor Lösungen, zum Beispiel:
Shelly Relais an Stellantrieb anschließen
Der erste Schritt in die smarte Zukunft der Fußbodenheizung ist der Anschluss des Shelly Relais an das Fußbodenheizungsstellventil.
Hierzu einmal folgendes Anschlussbild bei der Nutzung eines Shelly 1:
Ich habe hier einfach die vorhanden Thermostate, die vom Anschluss her identisch waren durch den Shelly 1 ausgetauscht und am ende mit deiner Blind Abdeckung die Wanddose wieder verschlossen. Wahlweise kann man auch direkt im Heizkreisverteiler Kasten den Shelly anschließen. Vorteil der Lösung mit dem Thermostat-Austausch, man kann ganz einfach wieder zurück zur alten Lösung.
Achtung – Arbeiten an elektrischen Anlagen!
Arbeiten an elektrischen Anlagen dürfen ausschließlich von Elektrofachkräften oder unter deren Aufsicht durchgeführt werden. Vor Beginn der Arbeiten sind alle aktiven Teile spannungsfrei zu schalten, gegen Wiedereinschalten zu sichern und auf Spannungsfreiheit zu prüfen.
Temperatur Sensor

Generell könnt ihr für diese Lösung hier jeden Temperatur Sensor verwenden, den ihr in openHAB einbinden könnt und am Ende die Temperatur des Raumes in °C als Number:Temperature item ausgibt. Ich selbst nutze verschiedenste Lösungen, die alle vor und Nachteile haben. Meine präferierte Lösung ist die Verwendung des Shelly Blu H&T Sensors. Dieser lässt sich wie das Relais auch sehr einfach in openHAB einbinden. Diese Lösung wäre auch mittels Shelly App und dem virtuellen Shelly Thermostat nutzbar und er liefert die Daten in einem angemessenen Zeitrahmen. Dies ist zum Beispiel beim Shelly H&T im Batteriebetrieb nicht ganz so optimal, da hier bei geringer Temperaturschwankung nur alle paar Stunden ein Update an openHAB geschickt wird.
Hier noch ein paar weitere Lösungen die ich einsetze zur Temperatur Messung in den Räumen einsetze:
- Netatmo Smarte Wetterstation
- Raspberry Pi DHT22 Temperatur Sensor
- Raspberry Pi BME680 Gas Sensor
- Raspberry Pi zero w zur Raumluft und Luftqualitätsüberwachung
- Raspberry Pi Pico W DHT22 Temperatur Sensor
Die Sensoren Sollten im besten Fall dort positioniert werden, wo man sich im Raum befindet, also zum Beispiel im Wohnzimmer in der näher der Couch. Vermeidet es die Sensoren dort anzubringen, wo die Messungen zum Beispiel durch Geräte, mit Wärmeentwicklung verfälscht werden. Auch sollten das Anbringen an Außenwänden vermieden werden. Die ideale Höhe für die Sensoren beträgt so ungefähr 1,5m.
Einbinden in openHAB und anlegen "Helfer" items
Um nun unsere Heizungssteuerung nach openHAB zu bekommen, benötigen wir als erstes ein Gruppen Item, unter welcher wir dann die ganzen Items zur Steuerung der Heizung hinzufügen. Ich nutze dafür eine Gruppe, die wie folgt aus sieht:
Die Parent Gruppe ist bei mir, der Ort (Raum), an dem das Thermostat sich befindet. ansonsten sollte man die Semantic Class HVAC --> Thermostat (Heizung --> Thermostat) auswählen. Label und Itemname ist jedem selbst überlassen. Typ ist selbstverständlich "Gruppe".
Nun benötigen wir in der Gruppe die folgenden Items:
- Heizungsventil Switch item (über Shelly Binding)
- Solltemperatur Item (Helfer Item)
- Solltemperatur (effektiv) Item (Helfer Item)
- Temperatur Sensor Item (H&T sensor Item)
- Luftfeuchtigkeit Sensor Item (H&T sensor Item) - Optional
- Thermostat Switch Item (Helfer Item)
- Thermostat Absenkzeit (Helfer Item) - Optional
- Thermostat Normalbetriebzeit (Helfer Item) - Optional
Ich habe noch zusätzlich ein Item für den Luftfeuchtigkeit Alarm und den Batterieladezustand meines H&T Sensors, die beiden Items sind aber für diese Anleitung irrelevant. Die "Helfer" Items habe ich wie folgt angelegt:
Thermostat Switch Item:
Thermostat Absenkzeit Item:
Thermostat Normalbetriebzeit:
erstellt bei beiden Zeit Items noch:
eine State Description mit %1$tH:%1$tM
ein Default Standalone Widget mit type = time und Send Button = true
ein Default List Item Widget mit type = time und Send Button = true
Solltemperatur Item:
Solltemperatur (effektiv) Item:
In den Metadaten der beiden Solltemperatur Items habe ich noch die folgende "State Description" ergänzt um den Min und Max Temperatur Wert festzulegen und das die Temperatur einstellen im 0.1 er Steps geschieht:
value: " "
config:
pattern: "%0.1f %unit%"
step: "0.1"
min: "18"
max: "30"
Fußbodenheizung Steuerung Gruppe:
Ich habe noch eine Gruppe erstellt, zu der ich alle Solltemperatur Items, den Booster Switch und meine Wärmepumpensteuerung hinzugefügt habe:
Booster Mode (Booster Items)
Um den Booster Mode zu verwenden, bei dem das Booster Switch Item beim Aktivieren, die Logik der automatischen Heizungssteuerung für x Minuten (hier 45min) überschreibt, benötigen wir ein Booster Switch Item. Hier hat man die Wahl, ob man ein Switch Item für alles macht, oder man für jeden Raum ein eigenes erstellt. Ich verwende bei mir nur ein Booster Item für alle Räume, da ich, wenn die Photovoltaikanlage im Winter gut produziert einfach alle Räume auf einmal heizen möchte.
Legt also als erstes das Booster Switch Item als Standard Switch an:
und dann noch eine Gruppe, in die ihr alle Heizventile (Shelly Stellantrieb Betrieb Items) hinzufügt, die ihr via Booster steuern möchtet:
Damit das ganze nun auch zeitgesteuert funktioniert, wird noch ein kleines Regelwerk benötigt:
Blockly Regelwerk:
Regelwerk Code
hier der Code zum Copy and Pasten. Es muss vorher ein Label Name für die Regel vergeben werden.
configuration: {}
triggers:
- id: "1"
configuration:
itemName: Fussbodenheizung_Boost
type: core.ItemStateChangeTrigger
conditions: []
actions:
- inputs: {}
id: "2"
configuration:
blockSource: <xml
xmlns="https://developers.google.com/blockly/xml"><variables><variable
id="s548J}A2Ndh#puo0}LQ,">BoosterRunTime</variable></variables><block
type="variables_set" id="YA$hvvln*+a!~n*(Lo9]" x="114" y="-185"><field
name="VAR" id="s548J}A2Ndh#puo0}LQ,">BoosterRunTime</field><value
name="VALUE"><block type="math_number" id="{GasnEcG0=%%I0k|a~vA"><field
name="NUM">45</field></block></value><next><block type="controls_if"
id="/W,=j[B]jMmVBr}c6~HD"><mutation elseif="1"></mutation><value
name="IF0"><block type="logic_compare" id="wMq2Ztf0}1XPe(h7832B"><field
name="OP">EQ</field><value name="A"><block type="oh_getitem_state"
id="Tq*sPe7tDt*OG!oyw;PW"><value name="itemName"><shadow type="oh_item"
id="|vg(iqsH`~;y]-VjAt#i"><mutation itemName="MyItem"
itemLabel="MyItem"></mutation><field
name="itemName">MyItem</field></shadow><block type="oh_item"
id="@=Wk0yUlg.U,uD2}y!Mw"><mutation itemName="Fussbodenheizung_Boost"
itemLabel="Fußbodenheizung Booster"></mutation><field
name="itemName">Fussbodenheizung_Boost</field></block></value></block></value><value
name="B"><block type="text" id=".*$$8|,6`E`PI9zOvS3A"><field
name="TEXT">ON</field></block></value></block></value><statement
name="DO0"><block type="oh_event" id="uq@8EAbK]ut=/Rs/YUpW"><field
name="eventType">sendCommand</field><value name="value"><shadow
type="text" id="m7.d)uvNi-=,*+-E5}_a"><field
name="TEXT">value</field></shadow><block type="text"
id="mkEm(NWV$Wweiww83]=q"><field
name="TEXT">ON</field></block></value><value name="itemName"><shadow
type="oh_item" id="O]`Z=*@+a)j2CR}gct;]"><mutation itemName="MyItem"
itemLabel="MyItem"></mutation><field
name="itemName">MyItem</field></shadow><block type="oh_item"
id="OEk))0[PN25g,^J%65H#"><mutation itemName="Heatingvalve_BOOSTER"
itemLabel="Alle Booster Heizungsventile"></mutation><field
name="itemName">Heatingvalve_BOOSTER</field></block></value><next><block
type="oh_timer" id="@KC8S/mzYie!FOYqSc2d"><field
name="delayUnits">plusMinutes</field><field
name="cache">private</field><value name="delay"><shadow
type="math_number" id="i@_e/3B`7DqqCiW)gB1i"><field
name="NUM">10</field></shadow><block type="variables_get_dynamic"
id="Sb3e3Utr};.dq=wW+w(B"><field name="VAR"
id="s548J}A2Ndh#puo0}LQ,">BoosterRunTime</field></block></value><value
name="timerName"><shadow type="text" id="nVAX@5dahI+5S[E+8k.t"><field
name="TEXT">MyTimer</field></shadow><block type="text"
id="o3n/$*c_VWe}/FCizxQ/"><field
name="TEXT">HeatingBoost</field></block></value><value
name="context"><shadow type="oh_logic_undefined"
id=":q76[AYLS():8(_%f5Yi"></shadow></value><statement
name="timerCode"><block type="oh_event" id="oD*/)JSS%kH(TxNs.6/;"><field
name="eventType">sendCommand</field><value name="value"><shadow
type="text" id="m7.d)uvNi-=,*+-E5}_a"><field
name="TEXT">value</field></shadow><block type="text"
id="3u]Ry-Ctul)32=mnp`dV"><field
name="TEXT">OFF</field></block></value><value name="itemName"><shadow
type="oh_item" id="O]`Z=*@+a)j2CR}gct;]"><mutation itemName="MyItem"
itemLabel="MyItem"></mutation><field
name="itemName">MyItem</field></shadow><block type="oh_item"
id="`0ns}ek{wsxP|Oywq.bc"><mutation itemName="Heatingvalve_BOOSTER"
itemLabel="Alle Booster Heizungsventile"></mutation><field
name="itemName">Heatingvalve_BOOSTER</field></block></value><next><block
type="oh_event" id="oLDe1d;vjfqP*{I(=K(;"><field
name="eventType">sendCommand</field><value name="value"><shadow
type="text" id="m7.d)uvNi-=,*+-E5}_a"><field
name="TEXT">value</field></shadow><block type="text"
id="jSUBR8UNH-#e`?JGG1^*"><field
name="TEXT">OFF</field></block></value><value name="itemName"><shadow
type="oh_item" id="O]`Z=*@+a)j2CR}gct;]"><mutation itemName="MyItem"
itemLabel="MyItem"></mutation><field
name="itemName">MyItem</field></shadow><block type="oh_item"
id="0dy-%@z1nwPbkvo7.v/^"><mutation itemName="Fussbodenheizung_Boost"
itemLabel="Fußbodenheizung Booster"></mutation><field
name="itemName">Fussbodenheizung_Boost</field></block></value></block></next></block></statement></block></next></block></statement><value
name="IF1"><block type="logic_operation"
id="7r`mjh{@h%o-P`x#s,jx"><field name="OP">AND</field><value
name="A"><block type="oh_timer_isActive"
id="?uv4Wv^bhke:]`Z)t-(I"><field name="cache">private</field><value
name="timerName"><shadow type="text" id="wviGFtaSPUv(;b*G9Xd9"><field
name="TEXT">MyTimer</field></shadow><block type="text"
id=",H}-Uk2a0.rXD~yY~hk8"><field
name="TEXT">HeatingBoost</field></block></value></block></value><value
name="B"><block type="logic_compare" id="F0@*OC3`fW~Pne6ArNk{"><field
name="OP">EQ</field><value name="A"><block type="oh_getitem_state"
id="mb|tE(UB^H=+gMbBD9;o"><value name="itemName"><shadow type="oh_item"
id="|vg(iqsH`~;y]-VjAt#i"><mutation itemName="MyItem"
itemLabel="MyItem"></mutation><field
name="itemName">MyItem</field></shadow><block type="oh_item"
id="^rS73[]o5odr?C39EHT%"><mutation itemName="Fussbodenheizung_Boost"
itemLabel="Fußbodenheizung Booster"></mutation><field
name="itemName">Fussbodenheizung_Boost</field></block></value></block></value><value
name="B"><block type="text" id="}bR,?D(4OdX|Pe=]yQl:"><field
name="TEXT">OFF</field></block></value></block></value></block></value><statement
name="DO1"><block type="oh_timer_cancel"
id="s^WIpW@QxSVOrB5#xn!X"><field name="cache">private</field><value
name="timerName"><shadow type="text" id=":?NN:hea_@T*c3]BhRai"><field
name="TEXT">MyTimer</field></shadow><block type="text"
id="^_^nd.mNbvI5+gS+Y(%e"><field
name="TEXT">HeatingBoost</field></block></value></block></statement></block></next></block></xml>
type: application/javascript
script: >
var BoosterRunTime;
BoosterRunTime = 45;
if (items.getItem('Fussbodenheizung_Boost').state == 'ON') {
items.getItem('Heatingvalve_BOOSTER').sendCommand('ON');
if (cache.private.exists('HeatingBoost') === false || cache.private.get('HeatingBoost').hasTerminated()) {
cache.private.put('HeatingBoost', actions.ScriptExecution.createTimer('HeatingBoost', time.ZonedDateTime.now().plusMinutes(BoosterRunTime), function (timer_context) {
items.getItem('Heatingvalve_BOOSTER').sendCommand('OFF');
items.getItem('Fussbodenheizung_Boost').sendCommand('OFF');
}, undefined));
};
} else if ((cache.private.exists('HeatingBoost') &&
cache.private.get('HeatingBoost').isActive()) &&
items.getItem('Fussbodenheizung_Boost').state == 'OFF') {
if (cache.private.exists('HeatingBoost')) { cache.private.remove('HeatingBoost').cancel(); };
}
type: script.ScriptAction
Thermostat Regelwerk mit Blockly Library
Um mir das Leben und viel Copy and Paste zu ersparen habe ich mir mittels selbst erstellter Blockly Library ein Regelwerk erstellt, welches ich ganz einfach in meine Blockly Regeln einbauen kann. Den kompletten Code meiner Blockly Libraries bekommt ihr bei GitHub, ist weiter unten verlinkt. Diesen könnt ihr in openHAB unter Entwickler Tools --> Block Libraries einfach via Copy and Paste einfügen.
Hier der aktueller Code bei GitHub:
Habt ihr das getan, könnt ihr für jeden Raum einfach eine Regel erstellen, die wie folgt aussieht:
Triggerung soll passieren wenn:
- Solltemperatur sich ändert
- Temperatur Sensor Wert sich ändert
- Thermostat Switch sich ändert
- Optional:
- Booster sich ändert
- Wärmepumpen Smart-Grid Status sich ändert
- Anwesenheit sich ändert
- Fenster Zustandsich ändert
- Absenkzeit erreicht ist
- Normalbetriebzeit erreicht ist
Ihr könnt die Regel auch einfach alle X Minuten triggern, falls ihr dies möchtet. ich bin hier aber eher der Freund von einer direkt Triggerung, falls ein Zustand sich ändert.
Als Script unter "Then", wählt "Blockly" aus. Ihr findet dann unter Libraries --> Blocklibraries Laub-home.de, den großen Control Thermostat Block, den ihr einfügen könnt.
Pflicht ist es hier nun die vorher angelegten Items auszuwählen:
- Thermostat Switch Item
- Raum Solltemperatur Item
- Heizungsventil Switch Item (vom Shelly Relais)
- Raum Temperatur Sensor Item
- Absenkzeit Item (kann aber auch einfach Uhrzeit als Text übergeben)
- Normalbetrieb Item (kann aber auch einfach Uhrzeit als Text übergeben)
- Raum Solltemperatur (effektiv) Item
- alles andere könnt ihr so lassen wie es ist um die Grundfunktionen zu nutzen.
Optionale Settings:
- LogLevel, möchtet ihr zum Debuggen den LogLevel Ändern, könnt ihr das direkt mit dem Menü machen.
- Fenster, solltet ihr ein Fenster im Raum mit einem Sensor haben, der OPEN/CLOSED ausgibt, könnt ihr dieses Item hier angeben.
- Fenster Delay ist die Zeitdauer, nachdem das Fenster geschlossen ist, die Heizung wieder angehen kann.
- Habt ihr das Booster Item von weiter oben angelegt und möchtet es verwenden, dann nutzt get state of item --> Booster Item
- Solltet ihr einen An/Abwesenheitsschalter nutzen, dann auch einfach wie im Screenshot hinzufügen
- Ich habe zusätzlich noch die Möglichkeit meinen Wärmepumpe Smart-Grid Status mit einzubinden, um bei Status grün, die Raum Solltemperatur nochmals zu erhöhen, solange der Status auf Grün ist.
Thermostat Widget
Ich habe mir ein einfaches Thermostat List Widget für die Steuerung und den Klimastatus im Raum gebaut:
- Das Icon zeigt folgenden Status an:
- rot: Heizungsventil aus
- grün: Heizungsventil an
- gelb: Booster aktiv
- grau: Kein Heizungsventil
- Titel, zeigt entweder Item Label an, oder selbstdefinierten Text
- Statistik Icon (Balken Symbol) Springt in einen Analyzer View.
- Einstellung der Solltemperatur
- blau: Thermostat Switch ist aus
- grün: Thermostat Switch ist an
- gelb: Heizen läuft
- orange: Booster Mode ist aktiv
- grau: Keine Solltemperatur gesetzt
- Untertitel:
- Zeigt die aktuelle Raumtemperatur und (Luftfeuchtigkeit) an wenn Items hinterlegt wurden
- Sonne und Mond zeigen Tag / Nacht Modus an (Absenkung, Normalbetrieb)
- △ zeigt eine Anhebung, dahinter der Anhebewert und die Solltemperatur (effektiv)
- ▽ zeigt eine Absenkung, dahinter der Absenkwert und die Solltemperatur (effektiv)
- ◉ zeigt Normalbetrieb an, Thermostat eingeschaltet
- ○ Thermostat ausgeschaltet
hier der Code für das Hinzufügen in openHAB unter Entwicklertools --> Widgets:
Nun kann man das Widget dem jeweiligen Solltemperatur Item als Default List Widget via Metadata mitgeben und entsprechend konfigurieren:
Diese Werte könnt ihr einfach unbearbeitet lassen: