Fensterkontakt zur Heitzungssteuerung

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
udo1toni
Beiträge: 15248
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Fensterkontakt zur Heitzungssteuerung

Beitrag von udo1toni »

Dein 1. Fehler ist, das in einer Regel verwursten zu wollen.

Du hast hier zwei getrennte Aufgaben.
Die erste Aufgabe ist, die Heizung zeitgesteuert zu schalten, abhängig vom Fensterzustand.
Die zweite Aufgabe ist, die Heizung über den Fensterkontakt zu steuern, abhängig von der Zeit.

Man kann beides in ein Rule packen, ob das sinnvoll ist, hängt von verschiedenen Faktoren ab, aber mindestens müssen noch Time cron Trigger für die Grenzen mit in den Trigger-Teil der Rule.

Dein 2. Fehler ist die Abfrage der Zeit. Seit wann ist ein String größer oder kleiner als ein anderer String? Man kann nur Gleichheit oder Ungleichheit eines Strings feststellen. Du willst aber einen Zeitraum bestimmen, dazu musst Du mit Zahlen arbeiten. Das sähe dann so aus:

Code: Alles auswählen

var Timer fenstertimer = null                                    // Timervariable definieren

rule "Test Bad oben"
when
    Time cron "0 0 5 * * ?" or                                   // Triggere täglich um 5 Uhr
    Time cron "0 0 23 * * ?" or                                  // Triggere täglich um 23 Uhr
    Item Sensor_Status_Badezimmer_oben changed                   // Triggere wenn der Fensterkontakt geschaltet hat
then
    if(now.getHourOfDay > 4 && now.getHourOfDay < 23) {          // Innerhalb des Zeitfensters?
        if(Sensor_Status_Badezimmer_oben.state != CLOSED) {      // Fenster offen oder nicht initialisiert?
            Heizkoerper_Bad_oben_Thermostat_Mode.sendCommand(0)  
            logInfo("Test", "Fenster im Bad geöffnet und Heizkörper abgedreht")
            fenstertimer = createTimer(now.plusMinutes(30), [|   // Starte Timer für Meldung
                sendPushoverMessage(pushoverBuilder("Info, Fenster Bad oben 30 Min. geöffnet").withApiKey("xxxxxxxxxx").withUser("xxxxxxxxxxxx"))
                fenstertimer = null 
            ])                                                   // Lambda in die Funktion verschoben, Lesbarkeit des Codes
        } else {                                                 // Fenster ist geschlossen!
            Heizkoerper_Bad_oben_Thermostat_Mode.sendCommand(1)
            logInfo("Test", "Fenster im Bad geschlossen und Heizkörper aufgedreht")
            if(fenstertimer !== null) {                          // Timer läuft?
                fenstertimer.cancel                              // Timer abbrechen
                fenstertimer = null 
            }
        }
    }
    else {                                                       // Außerhalb des Zeitfensters, Heizung aus!
        Heizkoerper_Bad_oben_Thermostat_Mode.sendCommand(0)
        logInfo("Test", "Nachtmodus")
        if(fenstertimer !== null) {                          // Timer läuft?
            fenstertimer.cancel                              // Timer abbrechen
            fenstertimer = null 
        }
    }
end
Ich habe Deine Rule als Basis genommen und nur an den fehlerhaften Stellen abgeändert. Was die Meldung über das geöffnete Fenster betrifft, kommt die ebenfalls nur tagsüber. Falls das anders sein soll, müsste man anders an das Problem heran gehen.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Eleven
Beiträge: 53
Registriert: 15. Okt 2018 10:27
Answers: 0

Re: Fensterkontakt zur Heitzungssteuerung

Beitrag von Eleven »

Hallo udo1toni,

vielen Dank für die schöne Erklärung und Änderung meiner rule.
Diese werde ich nach der Arbeit direkt mal testen. Die Benachrichtigung tagsüber ist vollkommen ausreichend.

Eine Idee von mir war noch eine Rule zu erstellen, bei der zu einer bestimmten Zeit überprüft wird, welche Fenster noch geöffnet sind und diese per Pushover an mein Handy zu senden. Könnte man dies auch noch in die vorhandene Rule einbauen oder wäre davon eher abzuraten?


Grüße eleven

Benutzeravatar
udo1toni
Beiträge: 15248
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Fensterkontakt zur Heitzungssteuerung

Beitrag von udo1toni »

Es ist besser, so etwas in einer separaten Rule zu erledigen. Du kannst z.B. alle Fensterkontakte zu einer Gruppe zusammenfassen und dann sowas machen:

Code: Alles auswählen

rule "Fenster Alarm"
when
    Member of AlleFenster changed to OPEN
then
    if(away.state == ON) {
        val String myText = new stringBuilder
        myText.add("Folgende Fenster wurden trotz Abwesenheit geöffnet: ")
        AlleFenster.members.filter[f|f.state == OPEN].forEach[f|
            myText.add(f.name)
            myText.add(", ")
        ]
        logInfo("alarm",myText)
        sendPushoverMessage(pushoverBuilder(myText).withApiKey("xxxxxxxxxx").withUser("xxxxxxxxxxxx"))
    }
end
Dann brauchst Du nur ein Switch Item away, welches z.B. ON geht, wenn kein Handy mehr im Empfangsbereich des WLAN ist. Wenn niemand zuhause ist, bekommst Du umgehend eine Benachrichtigung mit einer Liste aller geöffneten Fenster, sobald mindestens ein Fenster geöffnet wurde.
Da ich gerade nicht zuhause bin, mag es sein, dass in der Rule oben noch Fehler versteckt sind, aber die grundsätzliche Idee sollte klar sein.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Eleven
Beiträge: 53
Registriert: 15. Okt 2018 10:27
Answers: 0

Re: Fensterkontakt zur Heitzungssteuerung

Beitrag von Eleven »

udo1toni hat geschrieben: 15. Okt 2018 13:16 Dein 1. Fehler ist, das in einer Regel verwursten zu wollen.

Du hast hier zwei getrennte Aufgaben.
Die erste Aufgabe ist, die Heizung zeitgesteuert zu schalten, abhängig vom Fensterzustand.
Die zweite Aufgabe ist, die Heizung über den Fensterkontakt zu steuern, abhängig von der Zeit.

Man kann beides in ein Rule packen, ob das sinnvoll ist, hängt von verschiedenen Faktoren ab, aber mindestens müssen noch Time cron Trigger für die Grenzen mit in den Trigger-Teil der Rule.

Dein 2. Fehler ist die Abfrage der Zeit. Seit wann ist ein String größer oder kleiner als ein anderer String? Man kann nur Gleichheit oder Ungleichheit eines Strings feststellen. Du willst aber einen Zeitraum bestimmen, dazu musst Du mit Zahlen arbeiten. Das sähe dann so aus:

Code: Alles auswählen

var Timer fenstertimer = null                                    // Timervariable definieren

rule "Test Bad oben"
when
    Time cron "0 0 5 * * ?" or                                   // Triggere täglich um 5 Uhr
    Time cron "0 0 23 * * ?" or                                  // Triggere täglich um 23 Uhr
    Item Sensor_Status_Badezimmer_oben changed                   // Triggere wenn der Fensterkontakt geschaltet hat
then
    if(now.getHourOfDay > 4 && now.getHourOfDay < 23) {          // Innerhalb des Zeitfensters?
        if(Sensor_Status_Badezimmer_oben.state != CLOSED) {      // Fenster offen oder nicht initialisiert?
            Heizkoerper_Bad_oben_Thermostat_Mode.sendCommand(0)  
            logInfo("Test", "Fenster im Bad geöffnet und Heizkörper abgedreht")
            fenstertimer = createTimer(now.plusMinutes(30), [|   // Starte Timer für Meldung
                sendPushoverMessage(pushoverBuilder("Info, Fenster Bad oben 30 Min. geöffnet").withApiKey("xxxxxxxxxx").withUser("xxxxxxxxxxxx"))
                fenstertimer = null 
            ])                                                   // Lambda in die Funktion verschoben, Lesbarkeit des Codes
        } else {                                                 // Fenster ist geschlossen!
            Heizkoerper_Bad_oben_Thermostat_Mode.sendCommand(1)
            logInfo("Test", "Fenster im Bad geschlossen und Heizkörper aufgedreht")
            if(fenstertimer !== null) {                          // Timer läuft?
                fenstertimer.cancel                              // Timer abbrechen
                fenstertimer = null 
            }
        }
    }
    else {                                                       // Außerhalb des Zeitfensters, Heizung aus!
        Heizkoerper_Bad_oben_Thermostat_Mode.sendCommand(0)
        logInfo("Test", "Nachtmodus")
        if(fenstertimer !== null) {                          // Timer läuft?
            fenstertimer.cancel                              // Timer abbrechen
            fenstertimer = null 
        }
    }
end
Ich habe Deine Rule als Basis genommen und nur an den fehlerhaften Stellen abgeändert. Was die Meldung über das geöffnete Fenster betrifft, kommt die ebenfalls nur tagsüber. Falls das anders sein soll, müsste man anders an das Problem heran gehen.
So, ich habe die Rule gerade ausgiebig getestet. Funktioniert wurderbar und einwandfrei.
Vielen Dank udo1toni!!!!

Mit der zweiten Rule werde ich mich mal die Tage beschäftigen

Grüße eleven

Xenon
Beiträge: 9
Registriert: 22. Okt 2018 12:00
Answers: 0

Re: Fensterkontakt zur Heitzungssteuerung

Beitrag von Xenon »

Hallo, ich habe es noch etwas anders gemacht. Ich möchte keine Nachricht auf mein Handy bekommen, sondern es soll eine Warnung angezeigt werden (derzeit noch in der Basic UI, demnächst dann in HABPanel).

Wenn ein Fenster geöffnet wird, wird automatisch der letzte Wert des Thermostates gespeichert, sowie die Öffnungszeit des Fenster angezeigt. Wird das Fenster geschlossen, wird, wenn die Heizung denn eingeschaltet ist, der letze gesetzte Wert wieder in das Thermostat geladen. Unabhängig vom Heizungsstatus wird immer eine Warnung ausgegeben wenn das Fenster länger als 15 Minuten geöffnet ist.

Ich habe jetzt nur die Rule für dieses Szenario angehangen, nicht auch die Rules die die Heizung steuern usw.

Code: Alles auswählen

//Regeln fuer die Fenster/Türsensoren

var Timer fenstertimerSZE = null                                                      // Timervariable definieren (Schlafzimmer Eltern)

rule "Fenster oeffnen Schlafzimmer Eltern"
when 
    Item FenstersensorSchlafzimmerEltern_Contact changed                        // Fenstersensor Kontaktänderung
then
    if(FenstersensorSchlafzimmerEltern_Contact.state == OPEN && HeizungHauptschalter.state == ON) 
        {      
            ThermostatSchlafzimmerEltern_SetTemperature.persist                 // speichere letzte SetTemp
            ThermostatSchlafzimmerEltern_SetTemperature.sendCommand(6)          // Thermostat ausschalten
            FensterSzEltern.postUpdate( new DateTimeType() )                    // Fensteröffnungszeit speichern
            fenstertimerSZE = createTimer(now.plusMinutes(15),                  // Starte Timer für Warnmeldung
            [|               
                FensterSZElternWarn.postUpdate(OPEN)                            // Warnung wird ausgegeben
                fenstertimerSZE = null                                          // Timer wird beendet
            ])
        }
    else if(FenstersensorSchlafzimmerEltern_Contact.state == CLOSED && HeizungHauptschalter.state == ON)        // Fenstergeschlossen & Heizung an
        {
            ThermostatSchlafzimmerEltern_SetTemperature.sendCommand(ThermostatSchlafzimmerEltern_SetTemperature.previousState.state as Number)  // Setze letzte Temperatur aus SetTemp
            if(fenstertimerSZE !== null)                                        // Timer läuft?
            {                                                               
                fenstertimerSZE.cancel                                          // Timer abbrechen
                fenstertimerSZE = null                                          // Timer auf "null" setzen
                FensterSZElternWarn.postUpdate(CLOSED)                          // Warnung beenden
            }
            else if(fenstertimerSZE === null)                                   // Timer auf "null"
            {
                FensterSZElternWarn.postUpdate(CLOSED)                          // Warnung löschen
            }
        }
    else if(FenstersensorSchlafzimmerEltern_Contact.state == OPEN)              // Fenstersensor Kontakt "offen"
        {
            FensterSzEltern.postUpdate( new DateTimeType() )                    // Fensteröffnungszeit speichern
        }
end
Auf der Sitemap dann folgendes

Code: Alles auswählen

    // Warnungen -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Frame label="aktuelle Warnungen"    // Warnungen
    {
        //offene Fenster (zu lange)
        Text item=FensterSZElternWarn visibility=[FensterSZElternWarn==OPEN] labelcolor=["red"]
    }
Als Item noch ein virtuelles erstellt

Code: Alles auswählen

Contact     FensterSZElternWarn "Schlafzimmerfenster länger als 15min geöffnet"
Screenshot von der Basic UI
2018-10-22 13_18_32-Window.png


Klappt bei mir problemlos, als nächstes werde ich wohl auch noch eine Pushnachricht mit einfügen.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
Tolotos
Beiträge: 1
Registriert: 21. Okt 2018 15:11
Answers: 0

Re: Fensterkontakt zur Heitzungssteuerung

Beitrag von Tolotos »

Hallo,

ich bin gerade dabei von HOMEE auf openhab umzustellen.
Für die Heizung habe ich die folgenden rules erstellt. In den "Trockenübungen" (ohne eingebundene Geräte) funktioniert alles. Evtl. ist das eine Hilfe.

Code: Alles auswählen

rule "BueroTemperature"
when 
    Item Heizperiode changed or
    Item FensterModus_Buero changed or
	Item HeatingMode changed or
    Item SollTemperatur_Buero_Setpoint changed or
	Item DelayedStartup changed from OFF to ON
then
    if(Heizperiode.state == ON) {
      if(FensterModus_Buero.state == "AntiIcingMode") {
        HeizungsModus_Buero.postUpdate(5)
      } else if(FensterModus_Buero.state == "NormalHeatMode") {
        if(HeatingMode.state == "DayTemperature") {
          HeizungsModus_Buero.postUpdate(SollTemperatur_Buero_Setpoint.state)
        } else if(HeatingMode.state == "NightTemperature") {
          HeizungsModus_Buero.postUpdate(17)
        } else {
          logInfo("all.rules", "Unkown heating mode: {}", HeatingMode.state)
        }
      } else {
        logInfo("all.rules", "Unkown window mode: {}", FensterModus_Buero.state)
      }
    } else {
      HeizungsModus_Buero.postUpdate(0)
      // TODO switch heating controller off
    }
end


rule "BueroFensterModus"
when 
    Item Fenster_Buero_Links changed or
	Item Fenster_Buero_Rechts changed or
	Item DelayedStartup changed from OFF to ON
then
    if( Fenster_Buero_Links.state == ON && Fenster_Buero_Rechts.state == ON) {
      FensterModus_Buero.postUpdate("NormalHeatMode")
    } else {
      FensterModus_Buero.postUpdate("AntiIcingMode")
    }
end

rule "Init virtual buero items"
when
    System started or
    Item DelayedStartup changed from OFF to ON
then
    if (SollTemperatur_Buero_Setpoint.state == Uninitialized) {
        SollTemperatur_Buero_Setpoint.postUpdate(17.0)
    }
end

Code: Alles auswählen

rule "HeatingTimes"
when 
    Time cron "0 0/1 * * * ? *" or
    Item DelayedStartup changed from OFF to ON
then
    val heatingTimesMonday      = "5:00, 7:00, 12:30, 21:00"
    val heatingTimesTuesday     = "5:00, 7:00, 14:30, 21:00"
    val heatingTimesWednesday   = "5:00, 7:00, 12:30, 14:00, 16:00, 21:00"
    val heatingTimesThursday    = "5:00, 7:00, 12:30, 21:00"
    val heatingTimesFriday      = "5:00, 7:00, 12:30, 23:00"
    val heatingTimesSaturday    = "6:30, 23:00"
    val heatingTimesSunday      = "6:30, 21:00"
    
    var heatingTimesToUse = heatingTimesMonday.split(',') // pre initialize for type
    val Number dow = now.getDayOfWeek
    if(dow == 1) {
      heatingTimesToUse = heatingTimesMonday.split(',')
    } else if(dow == 2) {
      heatingTimesToUse = heatingTimesTuesday.split(',')
    } else if(dow == 3) {
      heatingTimesToUse = heatingTimesWednesday.split(',')
    } else if(dow == 4) {
      heatingTimesToUse = heatingTimesThursday.split(',')
    } else if(dow == 5) {
      heatingTimesToUse = heatingTimesFriday.split(',')
    } else if(dow == 6) {
      heatingTimesToUse = heatingTimesSaturday.split(',')
    } else if(dow == 7) {
      heatingTimesToUse = heatingTimesSunday.split(',')
    } else {
      logInfo("all.rules", "New day of week detected: {}", dow)
    }
     
    var switchHeaterOn = false
    var ii = 0
    while (ii < heatingTimesToUse.length) {
      val heatingOn = heatingTimesToUse.get(ii)
      val heatingOff = heatingTimesToUse.get(ii + 1)

      // NOTE: DateTime is class org.joda.time.DateTime
      var onDT = new DateTime(now.toLocalDate().getYear(), 
                              now.toLocalDate().getMonthOfYear(), 
                              now.toLocalDate().getDayOfMonth(), 
                              Integer::parseInt(heatingOn.split(':').get(0).trim()),
                              Integer::parseInt(heatingOn.split(':').get(1).trim()))
      
      var offDT = new DateTime(now.toLocalDate().getYear(), 
                               now.toLocalDate().getMonthOfYear(), 
                               now.toLocalDate().getDayOfMonth(), 
                               Integer::parseInt(heatingOff.split(':').get(0).trim()),
                               Integer::parseInt(heatingOff.split(':').get(1).trim()))
            
      if(now.isAfter(onDT) && now.isBefore(offDT)) {
        switchHeaterOn = true
      }
      ii = ii + 2
    }
    
    if(switchHeaterOn) {
      HeatingMode.postUpdate("DayTemperature")
    } else {
      HeatingMode.postUpdate("NightTemperature")
    }
end

rule "Init virtual heating items"
when
    System started or 
    Item DelayedStartup changed from OFF to ON
then
    if (HeatingMode.state == Uninitialized) {
        HeatingMode.postUpdate("DayTemperature")
    }
    if (Heizperiode.state == Uninitialized) {
        Heizperiode.postUpdate(ON)
    }
end

Eleven
Beiträge: 53
Registriert: 15. Okt 2018 10:27
Answers: 0

Re: Fensterkontakt zur Heitzungssteuerung

Beitrag von Eleven »

Hallo zusammen,
ich bräuchte nochmal eure Hilfe bzgl. meiner Heizungs-Regelung. In diesem Beitrag wurde mir bei der Regelung mit meinen Badezimmern bereits geholfen.

Code: Alles auswählen

var Timer fenstertimer = null                                    // Timervariable definieren

rule "Test Bad oben"
when
    Time cron "0 0 5 * * ?" or                                   // Triggere täglich um 5 Uhr
    Time cron "0 0 23 * * ?" or                                  // Triggere täglich um 23 Uhr
    Item Sensor_Status_Badezimmer_oben changed                   // Triggere wenn der Fensterkontakt geschaltet hat
then
    if(now.getHourOfDay > 4 && now.getHourOfDay < 23) {          // Innerhalb des Zeitfensters?
        if(Sensor_Status_Badezimmer_oben.state != CLOSED) {      // Fenster offen oder nicht initialisiert?
            Heizkoerper_Bad_oben_Thermostat_Mode.sendCommand(0)  
            logInfo("Test", "Fenster im Bad geöffnet und Heizkörper abgedreht")
            fenstertimer = createTimer(now.plusMinutes(30), [|   // Starte Timer für Meldung
                sendPushoverMessage(pushoverBuilder("Info, Fenster Bad oben 30 Min. geöffnet").withApiKey("xxxxxxxxxx").withUser("xxxxxxxxxxxx"))
                fenstertimer = null 
            ])                                                   // Lambda in die Funktion verschoben, Lesbarkeit des Codes
        } else {                                                 // Fenster ist geschlossen!
            Heizkoerper_Bad_oben_Thermostat_Mode.sendCommand(1)
            logInfo("Test", "Fenster im Bad geschlossen und Heizkörper aufgedreht")
            if(fenstertimer !== null) {                          // Timer läuft?
                fenstertimer.cancel                              // Timer abbrechen
                fenstertimer = null 
            }
        }
    }
    else {                                                       // Außerhalb des Zeitfensters, Heizung aus!
        Heizkoerper_Bad_oben_Thermostat_Mode.sendCommand(0)
        logInfo("Test", "Nachtmodus")
        if(fenstertimer !== null) {                          // Timer läuft?
            fenstertimer.cancel                              // Timer abbrechen
            fenstertimer = null 
        }
    }
end
Nun habe ich mir für die restlichen Heizkörper meines Hauses weitere Eurotronic Spirit gekauft. Eingebunden wurden diese bereits. Ich habe ein wenig im Netz nach Ideen zur Umsetzung gesucht und bin dabei auf eine Interessante Anleitung von Thom Dietrich gestoßen (https://community.openhab.org/t/heating ... odes/34843).
Diese würde ich gerne in einer leicht geänderten Form in mein System integrieren.
Ich bin nun soweit das ich auf der sitemap den Modus ändern kann, das sich zu bestimmten Uhrzeiten die eingestellten Sollwerte der Thermostate ändern.

Ich würde nun gerne zwei Dinge hinzufügen.
- "Feste Heizzeit" --> Im Zeitfenster von 5 - 22.30 Uhr wird geheizt. Je nach Modi und Uhrzeit (siehe heating_mode.rules) Zwischen 22.30 und 5 Uhr sollen die Heizkörper ausgeschaltet werden. Aktuell setze ich die Thermostate um 22.30 Uhr auf 15°C.

- "Fenster offen" Erkennung --> Je nachdem welches Fenster offen Ist, sollen die Heizkörper aus dem Raum etwas heruntergeregelt werden (Eco Mode).

Nun stelle ich mir die Frage wie ich das ganze realisieren könnte.


Hier mal die aktuelle heating_mode.rules. (Modus Party und Sickday ist aktuell nur zu Testzwecken mit einem item versethen!)

Code: Alles auswählen

val String filename = "heating_mode.rules"

rule "Initialize uninitialized virtual Items"
when
    System started
then
    createTimer(now.plusSeconds(180)) [ |
        logInfo(filename, "Executing 'System started' rule for Heating")
        if (Whg_Heating_Mode.state == NULL)
        {
            Whg_Heating_Mode.postUpdate("NORMAL")
        }
        Heating_PresetNormal_Group.members.filter[item | item.state == NULL].forEach[item | item.postUpdate(20.0)]
        Whg_Heating_UpdateHeater.sendCommand(ON)
    ]
end

rule "React on heating mode switch, send target temperatures"
when
    Item Whg_Heating_Mode received update or
    Item Whg_Heating_UpdateHeater received command ON
then
    Whg_Heating_UpdateHeater.postUpdate(OFF)
    logInfo(filename, "Heating Mode: " + Whg_Heating_Mode.state)
    switch Whg_Heating_Mode.state {
        case "NORMAL": {
            AZ_Heizung_SetTemp.sendCommand(AZ_TempNormal.state as Number)
            BDU_Heizung_SetTemp.sendCommand(BDU_TempNormal.state as Number)
            BDO_Heizung_SetTemp.sendCommand(BDO_TempNormal.state as Number)
            EZ_Heizung_SetTemp.sendCommand(EZ_TempNormal.state as Number)
            WZKL_Heizung_SetTemp.sendCommand(WZKL_TempNormal.state as Number)
            WZKR_Heizung_SetTemp.sendCommand(WZKR_TempNormal.state as Number)
            WZG_Heizung_SetTemp.sendCommand(WZG_TempNormal.state as Number)
            SZ_Heizung_SetTemp.sendCommand(SZ_TempNormal.state as Number)
            TZ_Heizung_SetTemp.sendCommand(TZ_TempNormal.state as Number)
            KUE_Heizung_SetTemp.sendCommand(KUE_TempNormal.state as Number)
            KZ_Heizung_SetTemp.sendCommand(KZ_TempNormal.state as Number)
            AZ_Heizung_Mode.sendCommand(1)
            TZ_Heizung_Mode.sendCommand(1)
            BDU_Heizung_Mode.sendCommand(1)
            BDO_Heizung_Mode.sendCommand(1)
            EZ_Heizung_Mode.sendCommand(1)
            WZKL_Heizung_Mode.sendCommand(1)
            WZKR_Heizung_Mode.sendCommand(1)
            WZG_Heizung_Mode.sendCommand(1)
            SZ_Heizung_Mode.sendCommand(1)
            TZ_Heizung_Mode.sendCommand(1)
            //KU_Heizung_Mode.sendCommand(1)
            KZ_Heizung_Mode.sendCommand(1)
        }
        case "PARTY": {
            AZ_Heizung_SetTemp.sendCommand(20.0)
            AZ_Heizung_Mode.sendCommand(1)
        }
        case "SICKDAY": {
            AZ_Heizung_SetTemp.sendCommand(23.0)
            AZ_Heizung_Mode.sendCommand(1)
        }
        case "OFF_SUMMER": {
            Heating_Theromstat_Mode.sendCommand(0)
        }
        default : { logError(filename, "Heating Mode unknown: " + Whg_Heating_Mode.state) }
    }
end

// ========================
// mode resets

rule "End PARTY and SICKDAY mode at 2:00 in the night"
when
    Time cron "0 0 2 ? * * *"
then
    if (Whg_Heating_Mode.state == "PARTY" || Whg_Heating_Mode.state == "SICKDAY") {
        Whg_Heating_Mode.postUpdate("NORMAL")
    }
end

// ========================
// NORMAL schedule

rule "MON-FRI, 05:00"
when
    Time cron "0 0 5 ? * MON-FRI *"
then
    BDU_TempNormal.postUpdate(22.0)
    BDO_TempNormal.postUpdate(21.0)
    EZ_TempNormal.postUpdate(21.0)
    WZKL_TempNormal.postUpdate(21.0)
    WZKR_TempNormal.postUpdate(21.0)
    WZG_TempNormal.postUpdate(21.0)
    KZ_TempNormal.postUpdate(20.0)
    Whg_Heating_UpdateHeater.sendCommand(ON)
end

rule "MON-FRI, 07:00"
when
    Time cron "0 30 7 ? * MON-FRI *"
then
    BDU_TempNormal.postUpdate(18.0)
    BDO_TempNormal.postUpdate(18.0)
    EZ_TempNormal.postUpdate(18.0)
    WZKL_TempNormal.postUpdate(18.0)
    WZKR_TempNormal.postUpdate(18.0)
    WZG_TempNormal.postUpdate(18.0)
    KZ_TempNormal.postUpdate(18.0)
    Whg_Heating_UpdateHeater.sendCommand(ON)
end

rule "MON-FRI, 11:00"
when
    Time cron "0 0 11 ? * MON-FRI *"
then
    BDU_TempNormal.postUpdate(22.0)
    BDO_TempNormal.postUpdate(18.0)
    EZ_TempNormal.postUpdate(21.0)
    WZKL_TempNormal.postUpdate(21.0)
    WZKR_TempNormal.postUpdate(21.0)
    WZG_TempNormal.postUpdate(21.0)
    KZ_TempNormal.postUpdate(21.0)
    Whg_Heating_UpdateHeater.sendCommand(ON)
end

rule "Täglich 18:00"
when
    Time cron "0 0 18 1/1 * ? *"
then
    AZ_TempNormal.postUpdate(20.0)
    BDO_TempNormal.postUpdate(20.0)
    SZ_TempNormal.postUpdate(19.0)
    TZ_TempNormal.postUpdate(19.0)
    Whg_Heating_UpdateHeater.sendCommand(ON)
end

rule "Täglich 18:30"
when
    Time cron "0 30 18 1/1 * ? *"
then
    KZ_TempNormal.postUpdate(18.0)
    Whg_Heating_UpdateHeater.sendCommand(ON)
end

rule "Täglich 22:30"
when
    Time cron "0 30 22 * * ?"
then
    AZ_TempNormal.postUpdate(15.0)
    BDU_TempNormal.postUpdate(15.0)
    BDO_TempNormal.postUpdate(15.0)
    EZ_TempNormal.postUpdate(15.0)
    WZKL_TempNormal.postUpdate(15.0)
    WZKR_TempNormal.postUpdate(15.0)
    WZG_TempNormal.postUpdate(15.0)
    SZ_TempNormal.postUpdate(15.0)
    TZ_TempNormal.postUpdate(15.0)
    KZ_TempNormal.postUpdate(15.0)
    Whg_Heating_UpdateHeater.sendCommand(ON)
end

rule "SAT-SUN, 06:00"
when
    Time cron "0 0 6 ? * SAT,SUN *"
then
    BDU_TempNormal.postUpdate(22.0)
    BDO_TempNormal.postUpdate(21.0)
    EZ_TempNormal.postUpdate(21.0)
    WZKL_TempNormal.postUpdate(21.0)
    WZKR_TempNormal.postUpdate(21.0)
    WZG_TempNormal.postUpdate(21.0)
    KZ_TempNormal.postUpdate(20.0)
    Whg_Heating_UpdateHeater.sendCommand(ON)
end

Ich bin für allerlei Vorschläge offen!

Liebe Grüße eleven

Antworten