Fibaro Heizung aus bei Fenster auf - so sparst du bares Geld!

Geschrieben von crissxcross

So pausiert der Heizplan in der Fibaro, wenn ein Fenster geöffnet wird, oder die Wohnung verlässt.

Daniel hat mal wieder programmiert (richtig cool!) und ich versuch euch mal erklären was dieses LUA Script macht. :-)

Features v.0.1 :

  • pausiert den Heizplan bei:
    • geöffnetem Fenster
    • Abwesenheit
  • verschiedene Temperaturen für Fenster-auf und Abwesenheit
  • erkennt ob Fenster zum Lüften geöffnet- oder nur kurz geöffnet wurde
  • prüft offene Fenster bei Abwesenheit und Ankunft
  • kehrt nach schließen des Fensters, oder bei Ankunft sofort in regulären Heizplan zurück

 

Ich glaub, ich muss da etwas ausholen. Ich hatte Daniel gebeten, eine Lösung zu finden programmieren, dass die Heizung abgesenkt wird wenn das Fenster geöffnet wird. Aber nach dem Schließen des - oder der Fenster, sollte der reguläre Heizplan im Fibaro Home Center wieder greifen.

Letztes Jahr hatte Alex mal ein ziemlich cooles Script hier im Forum gepostet, welches eigentlich genau das macht. Dieses hab ich seit einem Jahr im Einsatz und es funktioniert meistens wie es soll. Warum "meistens"?  Es funktioniert folgendermaßen: Wenn das Fenster geöffnet wird, wartet das Script ob das Fenster länger als eine Minute offen bleibt. Dann wird die aktuelle SOLL - Temperatur des Heizkörperthermostats in einer globalen Variable gespeichert und die Heizung abgesenkt. Wird das Fenster wieder geschlossen, setzt das LUA Script die ursprüngliche Temperatur aus der globalen Variable.

Nun kann es aber sein, das ich zum Beispiel um 16:00 Uhr das Fenster im Kinderzimmer öffne. Es wird eine Temperatur von 23°C gespeichert. Es gibt im Heizplan den Schaltpunkt 16:30 Uhr auf 19°C herunter regeln. Schließe ich das Fenster 16:35 Uhr oder später, wird die Absenktemperatur ignoriert, da das Script die ursprüngliche Temperatur wieder setzt.

Auch für den Abwesenheitsmodus war das Script recht schwierig, denn dem Danfoss Thermostat muss man ausser der SOLL Temperatur auch einen Zeitstempel mitgeben. Dieser gibt an, wie lange die übermittelte Temperatur gilt. Maximal sind hier 6 Stunden möglich. Danach wechselt das Thermostat in den regulären Heizplan zurück.

Wenn es nach Ablauf der Zeit zurück in den regulären Heizplan wechselt, warum also diese Funktion nicht für Fenster - auf nutzen? Nun, wenn ich das Fenster öffne, weiß ich meistens nicht wie lange ich dieses offen lasse ;-)

Fibaro Heizplan pausieren

FIBARO LUA Script - Heizplan pausieren

FIBARO LUA Script - Heizplan pausieren

Auch von Alex kam dann hier ein Script im Forum, welches ursprünglich Fibaro selbst veröffentlicht hat und welches von Alex modifiziert wurde. Dieses nutzt den "Urlaubsmodus" und pausiert somit den Fibaro Heizplan. Das ist genial und gab Daniel die Grundlage für folgendes Script.

 

Was macht das neue Fibaro Heizungsscript?

Es adressiert keine Heizkörper Thermostate direkt und gibt diesen keine SOLL Temperatur vor, sondern aktiviert den Urlaubsmodus, in welchem eine definierte Temperatur pro Raum gesetzt wird. Diese wird solange gehalten, bis der Urlaubsmodus wieder deaktiviert wird.

Urlaubsmodus im Fibaro Heizplan

Urlaubsmodus im Fibaro Heizplan

Eine runde Sache mit der perfekten Lichtsteuerung

Wir haben euch in der letzten Zeit wirklich viele, teils sehr komplexe Scripte präsentiert. Letztendlich ist das Smart Home eine modular wachsende Geschichte, aber dennoch greift jedes Modul und jedes Script wie ein Zahnrad in das andere.

Im LUA Script für die perfekte Lichtsteuerung werden die Leuchten alle ausgeschaltet, sobald die globale Variable "PresentState" von Home auf "Away" wechselt. Diese Variable findest du auch hier in diesem Script. Denn nicht nur wenn die Fenster geöffnet werden wird die Heizung gesenkt, sondern auch wenn du das Haus bzw. deine Wohnung verlässt. Ich verwende das RFID Script von Daniel ebenfalls mit der PresentState Variable (anstelle der rfid_alarm Variable wie von Daniel vorgeschlagen). Verlasse ich also das Haus, und schalte den Alarm via RFID Tag oder Karte scharf, so wird nicht nur der Alarm scharf geschaltet, das Danalock schließt die Tür zu, das Licht wird ausgeschaltet und der Staubsauger fährt los, sondern nun senkt sich auch die Temperatur individuell pro Raum ab.

Ich verwende zum Beispiel 5°C als Fenster-offen Einstellung, damit das Ventil komplett geschlossen wird. Bei Abwesenheit wird die Temperatur auf 19°C gesenkt, damit die Wohnung nicht zu sehr auskühlt.

Was passiert, wenn ein Fenster noch offen ist wenn ich die Wohnung verlasse? Auch dies prüft das Script ab und setzt in diesem Fall nicht die Temperatur für Abwesenheit. In meinem Beispiel oben würden also weiterhin 5°C für Fenster-offen gesetzt bleiben. Gleiches gilt, wenn jemand nach Hause kommt. Auch hier wird geprüft ob noch ein Fenster offen ist und der Heizplan pausiert weiterhin mit 5°C, bis das Fenster geschlossen wird.

Abwesend, Fenster im Schlafzimmer offen

Abwesend, Fenster im Schlafzimmer offen

Was muss ich dazu im Script anpassen?

Nicht viel. Beginnen wir mal ganz oben. Logisch in den Properties die Trigger, also die Auslöser für diese Szene.

  1. der Fensterkonakt, welcher die Szene startet wenn das Fenster geöffnet wurde (z.B. 710 value)
  2. deine globale Variable für die Anwesenheit (hier: PresentState)
In der Zeile 8-12 findest du die kleine Funktion, welche definiert welche Zone (Tutorial Heizplan einrichten) (meist nutzt man eine Zone pro Raum) auf wieviel °C gesenkt wird, wenn das Fenster geöffnet wird.

ID des Fibaro Heizplan sthet in der URL

ID des Fibaro Heizplan sthet in der URL

Die ID der Zone sieht du in der URL im Browser, wenn du den Heizplan der entsprechenden Zone bearbeitest.

Ab der Zeile 14, findest du die identische Funktion, welche aber definiert welche Temperatur "angefahren" werden soll wenn du deine Wohnung verlässt.

In die Zeile 19 gehört noch die ID deines Fenstersensors hinein:

ID eines Gerätes in der Fibaro auslesen

ID eines Gerätes in der Fibaro auslesen

Danach folgt viel Script. Hier verbindet sich die Fibaro mit sich selbst und pausiert eben den genannten Heizplan. Die IP 127.0.0.1 welche im Script auftaucht, adressiert den local Host, also sich selbst.

Ab Zeile 114 pürft das Script, was eigentlich der Trigger, also der Auslöser war, welcher die Szene gestartet hat. War es die Abwesenheits Variable, so wird die Funktion oben aufgerufen welche die Temperatur setzt für "Abwesenheit"

Sollte die Bedingung (getriggert durch globale Variable) nicht erfüllt sein, so wird ab Zeile 131 abgeprüft, ob es vielleicht durch den Fensterkontakt (property) ausgelöst wurde. Dann wird die andere Funktion ausgeführt und somit auch diese andere definierte Temperatur gesetzt.

Falls du in einem Raum zwei Fenster haben solltest, nimmst du das folgende Script:

So, dass war mal wieder ein kleines LUA Script passend zur Jahreszeit. Ich hoffe es macht dein Leben ab sofort etwas smarter. Wenn du Ideen hast, wie wir das Script noch weiterentwickeln könnten, dann immer her damit, unden gibt eine eine Kommentarspalte. Vielleicht ein "Holiday Modus" ? Was solltedieser können?

Hier noch ein paar Icon Vorschläge für deine neue Szene:

Diesen Blogpost hat geschrieben ...

crissxcross

Chris, Gründer und Blogger von siio.
Gelernter IT-Systemelektroniker, seit vielen Jahren beruflich als Produktmanager im Smart Home unterwegs. Technikverliebter Familienvater, Apple Fan. Nach einigen Jahren Stadtleben wieder froh auf dem Land zu sein.

41 Kommentare

  • Da ich nicht genau weiß wie man diese für die Hausbeleuchtung echt schlechte Information euch am besten mitteilt wähle ich diesen Weg. Durch ein Firmware Update unterstützt die neue Hue Bridge KEINE Lampen anderer Anbieter mehr. Etwas nachzulesen in den Kommentaren im Recht bekannten fastvoiceblog.
    http://fastvoice.net/2015/12/13/led-tagebuch-kw-50-osram-duette-ikea-absatzplan-neue-hue-freunde/#comments

    Mit freundlichen Grüßen
    J.M.

  • Hallo,

    mal eine Anfängerfrage:
    Wieso läuft das Script nicht mehr wenn ich in Zeile 16 folgende Änderung vornehme,
    idleTemp = fibaro:getGlobalValue('AwayTemp') --Temperatur, die bei Abwesenheit gesetzt werden soll
    damit ich das ganze über eine Globale Variable ändern kann?
    der Debugger bringt auch nicht mehr die Meldung " Änderung wurde übernommen"

    Gruß Michael

    • Hi,

      beim Auslesen der Variablen wird der Wert zu einem String-Datentyp. Ein String kann aber nicht dafür verwendet werden. Du musst also den String mit idleTemp = tonumber(fibaro:getGlobalValue(‘AwayTemp’)) wieder zu einem Integer umwandeln.

      Dann sollte es laufen :)

      Gruß

  • Hallo,
    gibt es auch die Möglichkeit das die Szene bei Abwesenheit nur greift, wenn eine weitere Variable (in meinem Fall eine Uhrzeit) auf 1 gesetzt ist? Wenn ja was müsste ich noch anpassen?

    Danke für eure Hilfe!
    Patrick

  • Hallo,da es ja langsam kalt wird wollte ich mal meine Heizungsteuerung überarbeiten.
    Ich nutze das Script von Daniel und das Heizungspannel. Laut Script sollte auch alles funktionieren im Debugger wird alles richtig angezeigt, ob Fenster auf und zu ist, jemand zu hause ist oder auch nicht auch Verbindung zum pannel hergestellt funktioniert. Was aber nicht geht ist das irgendwas geändert wird. Es ändert sich keine Temperatur am Thermostat egal welchen Zustand das Script meldet.
    Mfg Tilo

    • Hallo Tilo,

      habe das gleiche Problem.
      Fenster offen wird erkannt, Urlaubsmodus auf 5°C gesetzt, aber am Thermostaten tut sich nix, weder direkt noch in der Modulübersicht im HC2.
      Bist Du inzwischen einen Schritt weiter?
      Grüße Michl

      • Hallo, konntet ihr das Problem lösen? Ich habe hier das gleiche Problem...keine Änderung am Thermostat, trotz erkanntem Urlaubsmodus.
        Grüße Tino

  • Ja, muss es.
    Ich habe es aber soweit angepasst, dass man zu Beginn nur die Zuordnung Heizzone Raum (notwendig, falls man mehrere Räume zu einer Zone zusammenfasst) eintragen muss und im Header natürlich alle Relevanten Fenster-IDs.

  • Das Script ist wirklich sehr praktisch, besten Dank dafür. Ich schreibe solche Dinge auch gern selbst, aber das ist hier wirklich unnötig. Ich habe es nun für eine Weile ausprobiert und es läuft wunderbar. Es bietet mit der Variable zur Anwesenheit sowie zum offenen/ geschlossenen Fenster genau die Funktionen, die es braucht.

    Die genaue Gestalt des Heizplans ist dann eigentlich schon nebensächlich, da das Script intelligenter arbeitet und somit einem echten Smart Home Ansatz deutlich näher kommt. Einwandfrei!

  • Super Arbeit ich habe das Skript im Einsatz und funktioniert auch alles super. Nur leider habe ich vorgehabt einen Urlaubsmodus damit zu realisieren. Beim schalten meiner Urlaubsszene wird der "PresentState", "Away" gesetzt. Funktioniert auch alles aber leider habe ich überlesen das dieser Zustand nur 6h geht. Ich brauche keine tägliche Abwesenheit Absenkung sondern vor allem den Urlaubsmodus da ich oft wochenlang weg bin. Kann mir jemand helfen?

  • Hallo,
    klasse Script.
    Funktioniert auch einwandfrei.
    Jetzt meine Frage, gibt es eine möglichkeit 2 Verschiedene Heizpläne für einen Raum zu nutzen.
    Umschaltbar über eine Variable.
    Ich arbeite in Dauernachtschicht und zwar im 4/4er Model. Also schieb sich laufend alles.

    Gruß Peter

  • Hi,
    ich habe das Skript seit einiger Zeit (eigentlich) erfolgreich mit Devolo-Thermostaten in mehreren Räumen am Laufen. Leider kommt es jedoch ab und zu vor, dass nach dem Schließen eines Fensters (immer ein anderes) der Urlaubsmodus sporadisch nicht beendet wird und die Thermostate im betroffenen Raum bei 5°C bleiben (HC2, 4.100). Gibt es hier Abhilfe? Wenn man schon unterwegs ist kann man ja kein Fenster erneut öffnen und schließen, oder den Urlaubsmodus in der Smartphone-App manuell beenden (zumindest kann ich die Option auf dem Iphone nicht finden).
    Danke und Gruß

    • Hallo,
      anbei das Debug-Fenster von heute. Ich habe das Fenster um 15:22 Uhr nicht geöffnet, sondern wieder geschlossen! Aufgrund dieses Bugs(?) wird der Heizplan nach dem Schließen des Fensters nicht fortgesetzt und es bleibt bei den 5°C, wie im vorherigen Post schon beschrieben. Nun muss ich entweder den Urlaubsmodus für diesen Raum manuell beenden, oder das Fenster erneut länger als Minute öffnen und wieder schließen. Beides geht natürlich nicht, wenn man bereits unterwegs ist.

      Würde mich über Unterstützung sehr freuen, vielen Dank im Voraus.

      [DEBUG] 15:12:14: Fenster geöffnet.
      [DEBUG] 15:13:14: Fenster ist immer noch auf, es wird gelüftet. Fahre Heizung runter.
      [DEBUG] 15:13:14: Verbindung zum Heizpanel erfolgreich, Status 200
      [DEBUG] 15:13:14: Setze Temperatur auf 5 C
      [DEBUG] 15:13:15: Änderung wurde vorgenommen.
      [DEBUG] 15:22:38: Fenster geöffnet.
      [DEBUG] 15:22:39: Fenster wurde innerhalb einer Minute wieder geschlossen

      • Hi,

        hast du dir mal den Eventlog angeschaut, ob das Fenster wirklich eine Statusänderung ans HC2 überträgt? Hast du mal die Trigger überprüft, ob diese korrekt gesetzt sind?

        Gruß

  • Hallo,
    habe das Script verwendet und es funktioniert sehr gut.
    Ich würde aber gerne die Abwesenheit weglassen und mich nur auf das Fenster auf/zu festlegen wollen.
    Was muss ich an dem Script weglassen bzw. verändern?
    Vielen Dank für die Hilfe
    Gruß

  • Hallo Daniel.

    Super Script!
    funktioniert tadellos. Eine Frage habe ich jedoch noch:

    da ich mehrere Räume so steuern möchte würde ich gern wissen, ob ich für jedes LUA-Script eine andere globale Variable definieren muss.

    Besten Dank schon einmal für die Antwort

    Gerd

  • Hallo Daniel,
    leider habe ich mich zu früh gefreut, denn ich habe einen Raum mit 2 Doppelflügelfenstern, also kommen 4 Sensoren zum Einsatz.
    Habe vorsichtshalber eine neue globale Variable PresentState8 und die Sensoren Sensor3 und Sensor4 hinzugefügt.
    Dann habe ich an den relevanten Stellen im Script natürlich zusätzlich auch diese mit "or" abgefragt.
    Leider hatte ich keinen Erfolg. Woran kann das denn liegen??

    Wäre für einen Tipp sehr dankbar.

    Gerd

    Hier ist das ergänzte Script:

    --[[
    %% properties
    172 value
    176 value
    180 value
    184 value
    %% globals
    PresentState8
    --]]

    --------------- Absenk-Temperatur bei Fenster-Öffnung-------------
    local schedule = {
    id = 100, --ID des Raumes / Zone im Heiz-Panel
    idleTemp = 15 --Temperatur, die bei Fenster-Öffnung gesetzt werden soll
    }
    --------------- Absenk-Temperatur bei Abwesenheit ----------------
    local scheduleAway = {
    id = 100, --ID des Raumes im Heiz-Panel
    idleTemp = 5 --Temperatur, die bei Abwesenheit gesetzt werden soll
    }

    sensorID = 172 --ID des Tür-/Fenstersensor1
    sensorID2 = 176 --ID des Tür-/Fenstersensor2
    sensorID3 = 180 --ID des Tür-/Fenstersensor3
    sensorID4 = 184 --ID des Tür-/Fenstersensor4

    -- AB HIER NICHTS MEHR ÄNDERN

    function Debug( color, message )
    fibaro:debug(string.format('%s', "span", color, message, "span"));
    end

    local function getMethod(requestUrl, successCallback, errorCallback)
    local http = net.HTTPClient()
    http:request(requestUrl, {
    options = {
    method = 'GET'
    },
    success = successCallback,
    error = errorCallback
    })
    end

    local function putMethod(requestUrl, data, successCallback, errorCallback)
    local http = net.HTTPClient()
    http:request(requestUrl, {
    options = {
    method = 'PUT',
    data = json.encode(data)
    },
    success = successCallback,
    error = errorCallback
    })
    end

    local function setVactionModeTrue(subjectToChange)
    local url = 'http://127.0.0.1:11111/api/panels/heating/' .. subjectToChange.id
    getMethod(url, function(resp)
    if resp.status == 200 then
    print('Verbindung zum Heizpanel erfolgreich, Status ' .. resp.status)
    local panel = json.decode(resp.data)
    if panel.properties.vacationTemperature ~= nil then
    panel.properties.vacationTemperature = subjectToChange.idleTemp
    print('Setze Temperatur auf ' .. subjectToChange.idleTemp .. ' C')
    putMethod(url, panel, function(resp)
    if resp.status == 200 then
    print('Änderung wurde vorgenommen.')
    end
    end,
    function(err)
    print('Error ' .. err)
    end
    )
    else
    print('Panel nicht gefunden')
    end
    else
    print('Verbindung konnte nicht hergestellt werden, Status ' .. resp.status)
    end
    end,
    function(err)
    print('error ' .. err)
    end
    )
    end

    local function setVactionModeFalse(subjectToChange)
    local url = 'http://127.0.0.1:11111/api/panels/heating/' .. subjectToChange.id
    getMethod(url, function(resp)
    if resp.status == 200 then
    print('Verbindung zum Heizpanel erfolgreich, Status ' .. resp.status)
    local panel = json.decode(resp.data)
    if panel.properties.vacationTemperature ~= nil then
    panel.properties.vacationTemperature = 0
    print('Setze Heizplan wieder fort.')
    putMethod(url, panel, function(resp)
    if resp.status == 200 then
    print('Änderung wurde vorgenommen.')
    end
    end,
    function(err)
    print('Error ' .. err)
    end
    )
    else
    print('Panel nicht gefunden')
    end
    else
    print('Verbindung konnte nicht hergestellt werden, Status ' .. resp.status)
    end
    end,
    function(err)
    print('error ' .. err)
    end
    )
    end

    local trigger = fibaro:getSourceTrigger();

    if (trigger['type']=='global') then
    if (fibaro:getGlobalValue("PresentState8") == "Away") then
    if (tonumber(fibaro:getValue(sensorID, 'value')) == 0 and
    tonumber(fibaro:getValue(sensorID2, 'value')) == 0 and
    tonumber(fibaro:getValue(sensorID3, 'value')) == 0 and
    tonumber(fibaro:getValue(sensorID4, 'value')) == 0)then
    setVactionModeTrue(scheduleAway)
    Debug("blue",'Abwesend, niemand Zuhause, Fahre Heizung runter.')
    else
    Debug("white",'Abwesend, niemand Zuhause, Fenster ist noch geöffnet. Es bleibt bei der festgelegten Temperatur.')
    end
    elseif (fibaro:getGlobalValue("PresentState8") == "Home") then
    if (tonumber(fibaro:getValue(sensorID, 'value')) == 0 and
    tonumber(fibaro:getValue(sensorID2, 'value')) == 0 and
    tonumber(fibaro:getValue(sensorID3, 'value')) == 0 and
    tonumber(fibaro:getValue(sensorID4, 'value')) == 0) then
    setVactionModeFalse(schedule)
    Debug("red", 'Anwesend, jemand ist wieder Zuhause. Schalte Heizplan wieder ein.')
    else
    Debug("white",'Anwesend, jemand ist wieder Zuhause. Fenster ist noch geöffnet. Es bleibt bei der festgelegten Temperatur.')
    end
    end

    elseif (trigger['type']=='property') then
    if (tonumber(trigger['deviceID'])==tonumber(sensorID) or
    tonumber(trigger['deviceID'])==tonumber(sensorID2) or
    tonumber(trigger['deviceID'])==tonumber(sensorID3) or
    tonumber(trigger['deviceID'])==tonumber(sensorID4)) then
    local sensor = fibaro:getValue(sensorID, 'value')
    local sensor2 = fibaro:getValue(sensorID2, 'value')
    local sensor3 = fibaro:getValue(sensorID3, 'value')
    local sensor4 = fibaro:getValue(sensorID4, 'value')
    if (tonumber(sensor) == 1 or
    tonumber(sensor2) == 1 or
    tonumber(sensor3) == 1 or
    tonumber(sensor4) == 1) then
    Debug("yellow", 'Fenster geöffnet.')
    counter = 0
    while ((tonumber(fibaro:getValue(sensorID, 'value')) == 1 or
    tonumber(fibaro:getValue(sensorID2, 'value')) == 1 or
    tonumber(fibaro:getValue(sensorID3, 'value')) == 1 or
    tonumber(fibaro:getValue(sensorID4, 'value')) == 1 )and
    counter < 60) do
    counter = counter + 1
    fibaro:sleep(1*1000)
    end
    if (tonumber(fibaro:getValue(sensorID, 'value')) == 1 or
    tonumber(fibaro:getValue(sensorID2, 'value')) == 1 or
    tonumber(fibaro:getValue(sensorID3, 'value')) == 1 or
    tonumber(fibaro:getValue(sensorID4, 'value')) == 1) then
    Debug("blue",'Fenster ist immer noch auf, es wird gelüftet. Fahre Heizung runter.')
    setVactionModeTrue(schedule)
    else
    Debug("yellow", 'Fenster wurde innerhalb einer Minute wieder geschlossen.')
    end
    else
    fibaro:debug('Fenster geschlossen.')
    Debug("red", 'Fenster ist wieder zu. Schalte Heizplan wieder ein.')
    setVactionModeFalse(schedule)
    end
    end
    end

  • Klasse Script, Läuft völlig problemlos. Hab dann gleich mal einen Schwung Sensoren geordert. Damit der Winter kommen kann. Dankeschön dafür...

  • Bin ich der einzige, bei dem das erste Script auf dieser Seite so gar nicht laufen will?!
    Alle IDs (auch im Header) sind angepasst. Im Debug Fenster wird gar nichts angezeigt. Auch die manuelle Auslösung führt nicht zur Umschaltung der Temperatur an den Heizungen....Gibt es einen Trick?

  • Hallo und Danke für das Script.

    ich habe das Ähnliche Problem wie Gert Gerdes nur allerdings bis zu 5 Sensoren im Raum.
    Kann mir jemand helfen?

    Danke und Gruß
    Stefan

  • Ich verwende das Script seid jahren funzt auch super.
    Heute wollte ich jedoch die Anwesenheit einrichten.
    Die Globale Variable hab auch eingestellt mit Away und Home.

    Nur bei Away ändert sich genau nichts.

    Die Absenkung funktioniert nicht, jemand eine idee?

  • Hey sehr nützliches Script, aber wenn man die / das Fenster auf kippe hat und diese dann ganz aufmachen möchte, müsste man das Fenster kurz schließen wobei die Heizung dann direkt wieder anspringt was nicht so toll ist. Kann da evt. einer helfen das Script zu erweitern ? Viele Grüße :)

Gib deinen Senf dazu!

Cookie Consent mit Real Cookie Banner