Heizung ins Smart Home holen
Im Haus ist inzwischen ja vieles Smart, aber die Heizung bleibt (vor allem die älteren) relativ dumm. Eingeschaltet wird zu einem bestimmten Zeitpunkt, dann wird warmes Wasser für die Heizkörper vorgehalten und irgendwann geht sie aus oder in den Absenkbetrieb. Gerade in den Übergangszeiträumen ist das aber sehr ineffizient da die Heizung nur auf wenige Parameter guckt und man so ggf. Energie verschwendet. Daher habe ich bei unserer Heizung den parametrierbaren Eingang verwendet um wenigstens ein bisschen mehr Intelligenz (gerade in der Übergangszeit) hinzuzufügen.
Um auch im Fehlerfall (warum auch immer) noch eingreifen zu können habe ich einen Wechselschalter eingebaut mit dem ich zwischen „Sommer“, „Winter“ und „openHAB“ umschalten kann.
Material
Shelly 1 (oder direkt als Viererpack) * Affiliatelink
ABB Wechselschalter * Affiliatelink
Zeichnung
Das Gehäuse ist ein Remix vom Gehäuse von gregster. Hier bei Printables: Original -> Mein Remix
Heizung
Bei unserer Heizung kann man den Eingang E1 mit verschiedenen Funktionen belegen. Ich verwende die Sommer/Winter-Umschaltung um die Heizung abzuschalten wenn aktuell keine Heizung benötigt wird.
openHAB
Im openHAB habe ich folgenden Code verwendet, der dafür sorgt, dass die Heizung nur anspringt wenn auch wirklich Energie abgefragt wird und diese nicht in den Wänden „verschwindet“. Da ich auch auf dem HABPanel anzeigen möchte in welchem Status wir uns gerade befinden wird ein entsprechendes Textfeld ebenfalls gefüllt.
Items:
Switch Virtuell_Urlaubsmodus "Urlaubsmodus"
Number Virtuell_Eco "Eco-Modus"
Number Virtuell_Eco_Restlaufzeit "Restlaufzeit [%s Min]"
Switch Virtuell_Heizung_Trotzdem_An "Heizung erzwingen"
String Virtuell_Heizung_Grund "Grund [%s]"
Rules:
val telegramAction = getActions("telegram","telegram:telegramBot:Telegram_Bot")
var Timer tNachlauf_Heizung = null
var int HeizungAN = 0
var String Text_Grund = ""
var String Shelly_Kommando = "ON"
rule "Heizung zwingen"
when
Item Virtuell_Heizung_Trotzdem_An changed
then
if (Virtuell_Heizung_Trotzdem_An.state == ON) {
postUpdate(Virtuell_Eco, 0)
postUpdate(Virtuell_Eco_Restlaufzeit, 0)
sendCommand(Shelly_Heizung_RelayOutput, ON)
// Maximal 60 Minuten Heizungsbetrieb
tNachlauf_Heizung = createTimer(now.plusMinutes(60), [sendCommand(Virtuell_Heizung_Trotzdem_An, OFF)])
telegramAction.sendTelegram(xxx, "\uD83D\uDD25 Heizung erzwingen")
}
else {
tNachlauf_Heizung?.cancel
}
end
rule "Heizung Eco"
when
Item Virtuell_Eco changed
then
if (Virtuell_Eco.state > 0) {
postUpdate(Virtuell_Eco_Restlaufzeit, Virtuell_Eco.state as Number)
sendCommand(Virtuell_Heizung_Trotzdem_An, OFF)
sendCommand(Shelly_Heizung_RelayOutput, OFF)
telegramAction.sendTelegram(xxx, "\uD83D\uDD25 Heizung ECO-Betrieb " + (Virtuell_Eco.state as Number / 60).intValue + "h X")
}
else {
postUpdate(Virtuell_Eco_Restlaufzeit, 0)
}
end
rule "Heizungssteuerung"
when
Time cron "0 0/1 * * * ?" // every Minute
then
// Therme freigeben wenn:
// Brenner = 0
// Thermostate in Summe >= 10% auf und Temperaturunterschied > 0,2°C
// in Räumen:
// - Wohnzimmer
// - Kinderzimmer
/*
Raumthermostat
Bei geöffnetem Eingang E1 wird der Heizbetrieb gesperrt (Sommerbetrieb), auch unabhängig von einem digitalen Wolf-Regelungszubehör
OFF => Sommermodus
ON => Wintermodus
*/
if (Virtuell_Heizung_Trotzdem_An.state == ON) {
// Auf jeden Fall versuchen zu heizen
Shelly_Kommando = "ON"
Text_Grund = "Heizungszwang"
}
else {
if (MQTT_Heizung_BC_Betrieb_Stellgrad.state == 0 && MQTT_Heizung_BC_Betrieb_Aussentemperatur.state < 16) {
// Heizung ist aus und es ist kalt draußen
var Number Ventilsumme = Homematic_Wohnzimmer_Thermostat_Links_Ventil.state as Number + Homematic_Wohnzimmer_Thermostat_Rechts_Ventil.state as Number + Homematic_Kinderzimmer_Thermostat_Ventil.state as Number
if (Ventilsumme >= 15) {
// Thermostate fordern Heizung an
// Befehl an Shelly zum öffnen oder schließen
Shelly_Kommando = "ON"
Text_Grund = "Thermostate >= 15%"
}
else if ((Homematic_Regler_Temperatur_Ist.state as Number - Homematic_Regler_Temperatur_Soll.state as Number) < -0.5) {
// Wohnzimmer heizen
// Befehl an Shelly zum öffnen oder schließen
Shelly_Kommando = "ON"
Text_Grund = "Wohnzimmer < " + Homematic_Regler_Temperatur_Soll.state + " (" + Homematic_Regler_Temperatur_Ist.state + ")"
}
else if ((Homematic_Regler_Kinderzimmer_Temperatur_Ist.state as Number - Homematic_Regler_Kinderzimmer_Temperatur_Soll.state as Number) < -0.5) {
// Kinderzimmer heizen
// Befehl an Shelly zum öffnen oder schließen
Shelly_Kommando = "ON"
Text_Grund = "Kinderzimmer < " + Homematic_Regler_Kinderzimmer_Temperatur_Soll.state + " (" + Homematic_Regler_Kinderzimmer_Temperatur_Ist.state + ")"
}
else if (Homematic_Regler_Temperatur_Ist.state < 19 && (Homematic_Wohnzimmer_Thermostat_Links_Ventil.state as Number + Homematic_Wohnzimmer_Thermostat_Rechts_Ventil.state as Number) > 10) {
// Wohnzimmer kühlt aus
Shelly_Kommando = "ON"
Text_Grund = "Wohnzimmer < 19°C"
}
else if (Homematic_Regler_Kinderzimmer_Temperatur_Ist.state < 19 && Homematic_Kinderzimmer_Thermostat_Ventil.state as Number > 5) {
// Kinderzimmer kühlt aus
Shelly_Kommando = "ON"
Text_Grund = "Kinderzimmer < 19°C"
}
else {
// Befehl an Shelly zum öffnen oder schließen (also das gegenteil von den anderen Befehlen)
Shelly_Kommando = "OFF"
Text_Grund = "keine Anforderung"
}
}
else if (MQTT_Heizung_BC_Betrieb_Stellgrad.state == 0 && MQTT_Heizung_BC_Betrieb_Aussentemperatur.state >= 16) {
// Heizung aus und Temperatur hoch => Sommermodus
Shelly_Kommando = "OFF"
Text_Grund = "Außentemp >= 16°C"
}
// Heizung im Eco-Betrieb nur bei < 16°C heizen
if (Virtuell_Eco_Restlaufzeit.state > 0) {
sendCommand(Virtuell_Heizung_Trotzdem_An, OFF)
sendCommand(Virtuell_Eco_Restlaufzeit, (Virtuell_Eco_Restlaufzeit.state as Number) - 1)
Shelly_Kommando = "OFF"
Text_Grund = "ECO-Betrieb " + Virtuell_Eco_Restlaufzeit.state + " Min"
if (Virtuell_Eco_Restlaufzeit.state <= 1) {
telegramAction.sendTelegram(xxx, "\uD83D\uDD25 Heizung ECO-Betrieb Ende")
sendCommand(Virtuell_Eco, 0)
}
else if (Virtuell_Eco_Restlaufzeit.state as Number == 119 || Virtuell_Eco_Restlaufzeit.state as Number == 239 || Virtuell_Eco_Restlaufzeit.state as Number == 479) {
telegramAction.sendTelegram(xxx, "\uD83D\uDD25 Heizung ECO-Betrieb " + (Virtuell_Eco_Restlaufzeit.state as Number / 60).intValue + "h")
sendCommand(Virtuell_Eco, (Virtuell_Eco_Restlaufzeit.state as Number / 60).intValue * 60)
}
}
// Heizung im Urlaubs-Betrieb nur bei < 16°C heizen
if (Virtuell_Urlaubsmodus.state == ON) {
Shelly_Kommando = "OFF"
Text_Grund = "Urlaubsbetrieb"
telegramAction.sendTelegram(xxx, "\uD83D\uDD25 Heizung Urlaubsbetrieb")
}
}
postUpdate(Virtuell_Heizung_Grund, Text_Grund)
if (Shelly_Kommando == "ON") {
sendCommand(Shelly_Heizung_RelayOutput, ON)
}
else if (Shelly_Kommando == "OFF") {
sendCommand(Shelly_Heizung_RelayOutput, OFF)
}
end
Dadurch wird die Heizung nur eingeschaltet wenn die Heizungsventile (bei mir Homematic-Ventile) geöffnet sind und auch wirklich Energie abgenommen wird. Dadurch kann man die Heizung auch „ausschalten“ wenn man die Ventile einfach schließt.
Zusätzlich habe ich im HABPanel ein paar Buttons erstellt mit denen ich entsprechende virtuelle Items verändern kann:
Schreibe einen Kommentar