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!
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.
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
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.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
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?
// 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)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
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
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
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'
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
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
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'
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.