Seite 1 von 2

Regel erweitern

Verfasst: 16. Nov 2019 12:53
von isostar1101
Guten Tag,

ich habe folgende Regel am Start:

Code: Alles auswählen


rule "Mila Heizung"


when
    Item FF_Kinderzimmer_Temperatur changed
//or
//    Item FF_Kinderzimmer_Fenster changed (Sensor für die Fenster fehlt noch)

then
    
    var Heizung = OFF  // Falls etwas schief geht, Heizung abschalten!
    var Number Temp = null
   // if (FF_Kinderzimmer_Fenster.state == CLOSED)
    if(FF_Kinderzimmer_Temperatur.state instanceof Number) { //Gültige Temp???
        Temp = FF_Kinderzimmer_Temperatur.state as Number
        if(now.getHourOfDay > 18 && now.getHourOfDay < 23) // Zeitfensters OK?
            if(Temp < 19 || (Temp < 21 && FF_Kinderzimmer_Heizung.state == ON)) Heizung = ON
            
    }
    if(FF_Kinderzimmer_Heizung.state != Heizung) FF_Kinderzimmer_Heizung.sendCommand(Heizung)
    end


ich würde die Regel gerne erweitern, das in der Woche die Heizung nochmals zwischen 05:15 Uhr und 6:30 an geht! Des weitern würde ich gerne einen Bewegungsmelder für die übrigen Zeiten einbringen, der bei Anwesenheit die Heizung einschaltet und dann die Temperatur zwischen 19 und 21 Grad hält, wenn nach 15 Minuten keine Bewegung mehr erfolgt soll die Heizung abgeschaltet werden. im Zeitraum von 24-05:00 Uhr soll kein heizen erfolgen. Vielen Dank!

Re: Regel erweitern

Verfasst: 16. Nov 2019 13:46
von KellerK1nd
Ich hab das über einen Dummyschalter (Absenkung) geregelt. Den schalte ich in einer anderen Regel nach Uhrzeit und Wochentage wie ich möchte. Und in der Heizungsregel hab ich den einfach nur als if-Abfrage drin.

Jetzt als schnelles Beispiel:

Absenkung:

Code: Alles auswählen

 //Nachtabsenkung deaktivieren
rule "Badezimmer Nachtabsenkung deaktivieren"
when
    Time cron "0 0 5 * * ?"
then
    Heizung_Absenkung_Badezimmer.sendCommand(OFF)
    logInfo("", "Heizung Badezimmer, Nachtabsenkung inaktiv")
end

//Tagabsenkung aktivieren
rule "Badezimmer Tagabsenkung aktivieren"
when
    Time cron "0 30 7 ? * MON-FRI"
then
    Heizung_Absenkung_Badezimmer.sendCommand(ON)
    logInfo("", "Heizung Badezimmer, Tagabsenkung aktiv")
end

//Tagabsenkung deaktivieren
rule "Badezimmer Tagabsenkung deaktivieren"
when
    Time cron "0 0 15 ? * MON-FRI"
then
    Heizung_Absenkung_Badezimmer.sendCommand(OFF)
    logInfo("", "Heizung Badezimmer, Tagabsenkung inaktiv")
end

//Nachtabsenkung aktivieren
rule "Badezimmer Nachtabsenkung aktivieren"
when
    Time cron "0 0 20 * * ?"
then
    Heizung_Absenkung_Badezimmer.sendCommand(ON)
    logInfo("", "Heizung Badezimmer, Nachtabsenkung aktiv")
end
Heizung:

Code: Alles auswählen

 rule "Badezimmer Heizung"
when
    Item gTemperaturBadezimmer received update
then
        logInfo("Badezimmer Heizung", "Temperatur aktualisiert: {}°C",gTemperaturBadezimmer.state)
        if(Heizung_Auto_Manu_Badezimmer.state == ON){
                if(Heizung_Absenkung_Badezimmer.state == OFF){
                        if(gTemperaturBadezimmer.state <= 21){
                                if((AVM_Heizung_Badezimmer_Solltemperatur.state as Number).floatValue() != 23){
                                        AVM_Heizung_Badezimmer_Solltemperatur.sendCommand(23)
                                        logInfo("Badezimmer Heizung", "Automatik ist an, Absenkung ist aus, Raumtemperatur unter 21°C, Heizung auf 23°C eingestellt.")
                                }
                        }
                        if(gTemperaturBadezimmer.state >= 22){
                                if((AVM_Heizung_Badezimmer_Solltemperatur.state as Number).floatValue() != 21){
                                        AVM_Heizung_Badezimmer_Solltemperatur.sendCommand(21)
                                        logInfo("Badezimmer Heizung", "Automatik ist an, Absenkung ist aus, Raumtemperatur über 22°C, Heizung auf 21°C eingestellt.")
                                }
                        }
                }
                else{
                        if((AVM_Heizung_Badezimmer_Solltemperatur.state as Number).floatValue() != 19){
                                AVM_Heizung_Badezimmer_Solltemperatur.sendCommand(19)
                                logInfo("Badezimmer Heizung", "Absenkung ist an, Heizung auf 19°C eingestellt.")
                        }
                }
        }
        else{
                logInfo("Badezimmer Heizung", "Manueller Modus aktiv.")
        }
end

Re: Regel erweitern

Verfasst: 16. Nov 2019 14:28
von udo1toni
Es bietet sich an, die einzelnen Funktionen in verschiedene Rules auszulagern:

Code: Alles auswählen

var Boolean bKomfort_01 = false
var Timer tKomfort_01 = null

rule "Heizung an"
when
    Time cron "0 15 5 * * ?" or
    Time cron "0 0 19 * * ?"
then
    bKomfort_01 = true
end

rule "Heizung aus"
when
    Time cron "0 30 6 * * ?" or
    Time cron "0 0 23 * * ?"
then
    bKomfort_01 = false
end

rule "Heizung bei Bewegung"
when
    Item Bewegung changed to ON
then
    if(((now.getMinuteOfDay > 5*60+14) && (now.getMinuteOfDay < 6*60+30)) || ((now.getMinuteOfDay > 19*60-1) && (now.getMinuteOfDay < 23*60+0))) return;
    tKomfort_01?.cancel
    tKomfort_01 = createTimer(now.plusMinutes(15),[|
        bKomfort_01 = false
    ])
    bKomfort_01 = true
end

rule "Mila Heizung"
when
    Item FF_Kinderzimmer_Temperatur changed //or
    // Item FF_Kinderzimmer_Fenster changed //(Sensor für die Fenster fehlt noch)
then
    var Heizung = OFF  // Falls etwas schief geht, Heizung abschalten!
    var Number Temp = null
   // if (FF_Kinderzimmer_Fenster.state == CLOSED)
    if(FF_Kinderzimmer_Temperatur.state instanceof Number) { //Gültige Temp???
        Temp = FF_Kinderzimmer_Temperatur.state as Number
        if(bKomfort_01) // Zeitfensters OK?
            if(Temp < 19 || (Temp < 21 && FF_Kinderzimmer_Heizung.state == ON)) Heizung = ON
    }
    if(FF_Kinderzimmer_Heizung.state != Heizung) 
        FF_Kinderzimmer_Heizung.sendCommand(Heizung)
end
Die erste Rule schaltet auf Komfort, die zweite Rule schaltet Komort ab. die Dritte Rule schaltet bei Bewegung Komfort ein und setzt einen Timer, der Komfort abschaltet. Der Timer wird bei Bewegung zurückgesetzt und neu gestartet. Das passiert aber nur außerhalb der Komfort-Zeiten. Eventuell wäre es eleganter, einen weiteren Merker zu verwenden und diesen nur in den Zeit-Rules zu aktivieren und deaktivieren.

Re: Regel erweitern

Verfasst: 16. Nov 2019 17:16
von isostar1101
Hallo Zusammen,

ich habe jetzt den Bewegungsmelder in die Regel von Udo eingebaut und dieser zieht auch bei Bewegung an, nur leider wird die Heizung nicht eingeschaltet?

Code: Alles auswählen


var Boolean bKomfort_01 = false
var Timer tKomfort_01 = null

rule "Heizung an"
when
    Time cron "0 15 5 * * ?" or
    Time cron "0 0 19 * * ?"
then
    bKomfort_01 = true
end

rule "Heizung aus"
when
    Time cron "0 30 6 * * ?" or
    Time cron "0 0 23 * * ?"
then
    bKomfort_01 = false
end

rule "Heizung bei Bewegung"
when
    Item FF_Kinderzimmer_Bewegungsmelder changed to ON
then
    if(((now.getMinuteOfDay > 5*60+14) && (now.getMinuteOfDay < 6*60+30)) || ((now.getMinuteOfDay > 19*60-1) && (now.getMinuteOfDay < 23*60+0))) return;
    tKomfort_01?.cancel
    tKomfort_01 = createTimer(now.plusMinutes(15),[|
        bKomfort_01 = false
    ])
    bKomfort_01 = true
end

rule "Mila Heizung"
when
    Item FF_Kinderzimmer_Temperatur changed 
    //or
    // Item FF_Kinderzimmer_Fenster changed //(Sensor für die Fenster fehlt noch)
then
    var Heizung = OFF  // Falls etwas schief geht, Heizung abschalten!
    var Number Temp = null
   // if (FF_Kinderzimmer_Fenster.state == CLOSED)
    if(FF_Kinderzimmer_Temperatur.state instanceof Number) { //Gültige Temp???
        Temp = FF_Kinderzimmer_Temperatur.state as Number
        if(bKomfort_01) // Zeitfensters OK?
            if(Temp < 19 || (Temp < 21 && FF_Kinderzimmer_Heizung.state == ON)) Heizung = ON
    }
    if(FF_Kinderzimmer_Heizung.state != Heizung) 
        FF_Kinderzimmer_Heizung.sendCommand(Heizung)
end






Danke für die Mühe und die Zeit dir Ihr investiert!

vG. Isostar

Re: Regel erweitern

Verfasst: 17. Nov 2019 11:49
von udo1toni
Vermutlich ist es besser, das Ganze noch etwas umzubauen.

Code: Alles auswählen

// Items: Dieses ungebundene Item zusätzlich definieren
Switch MilaKomfort "Komfort [%s]"

Code: Alles auswählen

//  globale Variablen werden zu Beginn der Datei definiert
var Boolean bKomfort_01 = false                                      // Merker für Timer-Aktivierung
var Timer tKomfort_01 = null                                         // Timer für Rückschaltung auf Nachtabsenkung

rule "Heizung an"
when
    Time cron "0 15 5 * * ?" or                                      // täglich 05:15 Uhr
    Time cron "0 0 19 * * ?"                                         // täglich 19:00 Uhr
then
    bKomfort_01 = true                                               // Komfort über Zeit aktiv
    MilaKomfort.postUpdate(ON)                                       // Komfort ein
    logInfo("heat","Komfort ein auf Zeit")
end

rule "Heizung aus"
when
    Time cron "0 30 6 * * ?" or
    Time cron "0 0 23 * * ?"
then
    bKomfort_01 = false                                              // Komfort über Zeit inaktiv
    MilaKomfort.postUpdate(OFF)                                      // Komfort aus
    logInfo("heat","Komfort aus auf Zeit")
end

rule "Heizung bei Bewegung"
when
    Item FF_Kinderzimmer_Bewegungsmelder changed to ON
then
    tKomfort_01?.cancel                                              // Timer canceln
    if(bKomfort_01) return;                                          // falls Komfort über Zeit aktiv, Rule Ende

    tKomfort_01 = createTimer(now.plusMinutes(15),[|                 // Timer für Abschaltung anlegen
        MilaKomfort.postUpdate(OFF)                                  // Komfort aus
        logInfo("heat","Komfort aus nach Bewegung")
    ])
    MilaKomfort.postUpdate(ON)                                       // Komfort ein
    logInfo("heat","Komfort ein nach Bewegung")
end

rule "Mila Heizung"
when
    Item MilaKomfort changed or                                      // Komfort aktiviert oder deaktiviert
    Item FF_Kinderzimmer_Temperatur changed                          // Temperatur geändert
then
    val Number nSoll = if(MilaKomfort.state == ON) 21 else 19        // Solltemperatur anhand von Komfort festlegen
    var Heizung = OFF                                                // Standard ist Heizung aus
    var Number nTemp = 21                                            // Standard Raumtemperatur ist 21
    if(FF_Kinderzimmer_Temperatur.state instanceof Number) 
        nTemp = FF_Kinderzimmer_Temperatur.state as Number           // setze reale Temperatur
    if(nTemp < nSoll) Heizung = ON                                   // falls reale Temperatur unter Solltemperatur Heizung ein
    if(FF_Kinderzimmer_Heizung.state != Heizung)                     // Sollstatus setzen, falls abweichend
        FF_Kinderzimmer_Heizung.sendCommand(Heizung)
end
Daus Hauptproblem beim ursprünglichen Ansatz ist, dass die eigentliche Rule nicht von der Änderung der Variablen getriggert werden kann.
So ist es gleich viel hübscher-
Für das offene Fenster kann man das Ganze noch problemlos erweitern, man könnte statt des Switches auch ein Number Item verwenden, dann kann man noch andere Temperaturstufen hinterlegen (z.B. Frostschutz bei offenem Fenster)

Re: Regel erweitern

Verfasst: 17. Nov 2019 12:36
von isostar1101
Guten Morgen, Udo1Toni,

beim laden der Rule bekomme ich leider eine Fehlermeldung.

2019-11-17 12:31:16.183 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'Heizung_Mila.rules' has errors, therefore ignoring it: [42,5]: no viable alternative at input 'MilaKomfort'

das Item habe ich angelegt!
Items.PNG

Re: Regel erweitern

Verfasst: 17. Nov 2019 13:27
von KellerK1nd
isostar1101 hat geschrieben: 17. Nov 2019 12:36 Guten Morgen, Udo1Toni,

beim laden der Rule bekomme ich leider eine Fehlermeldung.

2019-11-17 12:31:16.183 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'Heizung_Mila.rules' has errors, therefore ignoring it: [42,5]: no viable alternative at input 'MilaKomfort'

das Item habe ich angelegt!Items.PNG
Kleiner Fehler drin:

Code: Alles auswählen

 rule "Mila Heizung"
when
    MilaKomfort changed or                                           // Komfort aktiviert oder deaktiviert
    Item FF_Kinderzimmer_Temperatur changed                          // Temperatur geändert
then
    val Number nSoll = if(MilaKomfort.state == ON) 21 else 19        // Solltemperatur anhand von Komfort festlegen
    var Heizung = OFF                                                // Standard ist Heizung aus
    var Number nTemp = 21                                            // Standard Raumtemperatur ist 21
    if(FF_Kinderzimmer_Temperatur.state instanceof Number) 
	    nTemp = FF_Kinderzimmer_Temperatur.state as Number           // setze reale Temperatur
    if(Temp < nSoll) Heizung = ON                                    // falls reale Temperatur unter Solltemperatur Heizung ein
    if(FF_Kinderzimmer_Heizung.state != Heizung)                     // Sollstatus setzen, falls abweichend
        FF_Kinderzimmer_Heizung.sendCommand(Heizung)
end
So sollte es laufen:

Code: Alles auswählen

 rule "Mila Heizung"
when
    Item MilaKomfort changed or                                           // Komfort aktiviert oder deaktiviert
    Item FF_Kinderzimmer_Temperatur changed                          // Temperatur geändert
then
    val Number nSoll = if(MilaKomfort.state == ON) 21 else 19        // Solltemperatur anhand von Komfort festlegen
    var Heizung = OFF                                                // Standard ist Heizung aus
    var Number nTemp = 21                                            // Standard Raumtemperatur ist 21
    if(FF_Kinderzimmer_Temperatur.state instanceof Number) 
	    nTemp = FF_Kinderzimmer_Temperatur.state as Number           // setze reale Temperatur
    if(Temp < nSoll) Heizung = ON                                    // falls reale Temperatur unter Solltemperatur Heizung ein
    if(FF_Kinderzimmer_Heizung.state != Heizung)                     // Sollstatus setzen, falls abweichend
        FF_Kinderzimmer_Heizung.sendCommand(Heizung)
end

Re: Regel erweitern

Verfasst: 17. Nov 2019 13:35
von isostar1101
Danke für deine Geduld, jetzt lädt er die Regel schon es kommt aber noch eine Meldung vorher...

2019-11-17 13:31:47.959 [INFO ] [el.core.internal.ModelRepositoryImpl] - Validation issues found in configuration model 'Heizung_Mila.rules', using it anyway:
The value of the local variable nTemp is not used
2019-11-17 13:31:47.964 [INFO ] [el.core.internal.ModelRepositoryImpl] - Loading model 'Heizung_Mila.rules'

Re: Regel erweitern

Verfasst: 17. Nov 2019 13:38
von Cyrelian
isostar1101 hat geschrieben: 17. Nov 2019 13:35 2019-11-17 13:31:47.959 [INFO ] [el.core.internal.ModelRepositoryImpl] - Validation issues found in configuration model 'Heizung_Mila.rules', using it anyway:
The value of the local variable nTemp is not used
2019-11-17 13:31:47.964 [INFO ] [el.core.internal.ModelRepositoryImpl] - Loading model 'Heizung_Mila.rules'
Hi,

du hast die Variable nTemp definiert, nutzt sie aber in der rule nicht. Deswegen der Hinweis.

CU
Cyrelian

Re: Regel erweitern

Verfasst: 17. Nov 2019 23:04
von udo1toni
Jepp, da ist noch ein weiterer Tippfehler.

Code: Alles auswählen

if(Temp < nSoll) Heizung = ON
Auch hier sollte es

Code: Alles auswählen

if(nTemp < nSoll) Heizung = ON
heißen.

Ich hab das oben korrigiert...