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

Anschluss Shelly 1
So siehts dann im Schrank aus

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:

Betriebmodus der Heizung
Eco-Möglichkeiten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert