And here comes a additional rule to having a reminder to change the filter elements inside the unit:
// globale Variablen müssen zu Beginn der rules Datei deklariert werden!
var Timer tFilter = null
rule "Filterwarnung"
when
Item FilterTimer changed
then
if(tFilter === null && (FilterTimer.state >2000 )) {
tFilter = createTimer(now.plusHours(12), [ |
tFilter = null
])
sendBroadcastNotification("Erinnerung !! Filterwechsel bei 2160h! Aktueller Wert "+FilterTimer.state.toString+"h") //Allgemeine Warnung an alle
}
end
Here another usefull rule:
“Control based on humidity”
var Timer tLuftfeuchtigkeitBad = null
rule "LuftfeuchtigkeitBad"
when
Item InnenDGBadFeuchte changed
then
val int lfBad=(InnenDGBadFeuchte.state as Number).intValue()
if (lfBad<50) {
// sollte die Lueftung wegen dem Bad auf Stufe 2 (Mittel) geschaltet worden sein und noch kein Timer laufen,
// der die Lueftung wieder mit Nachlauf durch reaktivierung der Feuchtesteuerung auf Stufe Klein schaltet
//if (LuefterStufe.state==2 && tLuftfeuchtigkeitBad===null && Lueftung_Zeit.state==OFF && Lueftung_Feuchte.state==OFF && WAC350_Durchschnitt_Feuchte_Haus.state==ON) {
if (Lueftung_Bad.state==ON && tLuftfeuchtigkeitBad===null) {
// ...starte nun einen Timer, der nach 60 Minuten die Feuchtesteuerung wieder aktiviert
logInfo("Feuchtesteuerung mit Nachlauf:","Nachlauf 60min aktiviert!")
sendBroadcastNotification("Feuchtesteuerung mit Nachlauf um " + now.toString("HH:mm") + " Uhr: Starte 60min Timer") //Pushnachricht
tLuftfeuchtigkeitBad=createTimer(now.plusMinutes(60), [| // wenn der der Timer abgelaufen ist:
WAC350_Durchschnitt_Feuchte_Haus.postUpdate(ON) // reaktiviere Feuchtesteuerung
Lueftung_Bad.postUpdate(OFF) // Status Item Lüftung durch Nachlaufsteuerung AUS
logInfo("Feuchtesteuerung mit Nachlauf:","Nachlauf 60min beendet!")
sendBroadcastNotification("Feuchtesteuerung mit Nachlauf um " + now.toString("HH:mm") + " Uhr: 60min Timer beendet, Feuchtesteuerung reaktiviert") //Pushnachricht
tLuftfeuchtigkeitBad=null
])
}
}
else if (lfBad>55 && Lueftung_Bad.state==OFF && Lueftung_Temperatur.state==OFF && LuefterStufe.state==1) {
// schalte die Lueftung auf Grund des Bades auf Stufe 2 (Mittel) und deaktiviere die Feuchtesteuerung
Lueftung_Bad.postUpdate(ON) // Status Item Lüftung durch Nachlaufsteuerung EIN
WAC350_Durchschnitt_Feuchte_Haus.postUpdate(OFF) // Deaktiviere Feuchtesteuerung
LuefterStufe.sendCommand(2) // Schalte Lüftung auf Stufe 2 (Mittel)
logInfo("Feuchtesteuerung mit Nachlauf:","Lüftung Stufe 2 (Mittel)")
sendBroadcastNotification("Feuchtesteuerung mit Nachlauf um " + now.toString("HH:mm") + " Uhr: Lüftung Stufe 2 (Mittel) durch: " + triggeringItem.name + " " + triggeringItem.state.toString) //Pushnachricht
// sollte noch der Timer laufen, der sie wieder ausschaltet, brich ihn ab, damit
// erst dann mit Nachlauf ausgeschaltet wird, wenn der Luftfeuchtewert wieder gesunken ist
if (tLuftfeuchtigkeitBad!==null) {
tLuftfeuchtigkeitBad.cancel()
tLuftfeuchtigkeitBad=null
}
}
end
rule "WACLuftfeuchtigkeit"
when
Member of Durchschnitt_Feuchte_Haus changed // Durchschnitt Feuchte durch Lacrosse Sensoren
then
if (WAC350_Durchschnitt_Feuchte_Haus.state==OFF) { // wenn Schalter aus, keine Aktionen
logInfo("Feuchtesteuerung:","Steuerung deaktiviert!")
return;
}
// bestimme die durchschnittliche und maximale Luftfeuchte
var int lfSumme=0
var int lfMax=0
var int lfCnt=0
for (item: Durchschnitt_Feuchte_Haus.members) {
if (item.state instanceof Number) {
lfCnt+=1
val int lf=(item.state as Number).intValue()
lfSumme+=lf
if (lf>lfMax) lfMax=lf
}
}
// nur bei mindestens 2 Werten ist es sinnvoll, die Werte zu betrachten
var int lfAvg
if (lfCnt>=2) {
lfAvg=lfSumme/lfCnt
}
else {
lfAvg=0
lfMax=0
}
// Bei mehr als max 55% pro Sensor oder avg 50% Luftfeuchtigkeit, lüfte durch Lüftung Stufe 2 (Mittel)
if ((lfMax>=55 || lfAvg>=50) && Lueftung_Feuchte.state==OFF && Lueftung_Bad.state==OFF) { // Lüftung läuft auf Stufe 1 (Klein)
LuefterStufe.sendCommand(2) // Schalte Lüftung auf Stufe 2 (Mittel)
Lueftung_Feuchte.postUpdate(ON) // Status Item Lüftung durch Feuchtesteuerung Stufe 2 (Mittel)
logInfo("Feuchtesteuerung:","Lüftung Stufe 2 (Mittel)" + triggeringItem.name + " " + triggeringItem.state.toString)
sendBroadcastNotification("Feuchtesteuerung um " + now.toString("HH:mm") + " Uhr: Lüftung Stufe 2 (Mittel) durch: " + triggeringItem.name + " " + triggeringItem.state.toString) //Pushnachricht
}
else {
// fällt die Luftfeuchte aller Sensoren unter 50%, wurde genug gelüftet, schalte Lüftung zurück auf Stufe 1 (Klein)
if ((lfMax<50) && LuefterStufe.state==2) { // Lüftung läuft auf Stufe 2 (Mittel)
LuefterStufe.sendCommand(1) // Schalte Lüftung auf Stufe Klein
Lueftung_Feuchte.postUpdate(OFF) // Status Item Lüftung durch Feuchtesteuerung Stufe Klein
logInfo("Feuchtesteuerung:","Lüftung Stufe 1 (Klein)" + triggeringItem.name + " " + triggeringItem.state.toString)
sendBroadcastNotification("Feuchtesteuerung um " + now.toString("HH:mm") + " Uhr: Lüftung Stufe 1 (Klein) durch: " + triggeringItem.name + " " + triggeringItem.state.toString) //Pushnachricht
}
}
end
rule "Zwangslüftung EIN auf Stufe 2 (Mittel)"
when
Time cron "0 30 11,18 * * ? *" // 11:30, 18:30 Uhr
then
if (WAC350_Durchschnitt_Feuchte_Haus_Zwang.state==OFF) { // wenn Schalter aus, keine Aktionen
logInfo("Zwangslüftung:","Einschaltzeit erreicht aber Deaktiviert")
sendBroadcastNotification("Zwangslüftung: Einschaltzeit " + now.toString("HH:mm") + " Uhr erreicht aber Deaktiviert") //Pushnachricht
return;
}
if (LuefterStufe.state==2) { // Lüftung läuft schon auf Stufe 2 (Mittel)
WAC350_Durchschnitt_Feuchte_Haus.postUpdate(OFF) // deaktiviere Feuchtesteuerung trotzdem
Lueftung_Zeit.postUpdate(ON) // Status Item Zwangslüftung ist EIN
// läuft der Timer Nachlauf, brich ihn ab, damit die Zwangslüftung nicht vorzeitig beendet wird.
if (tLuftfeuchtigkeitBad!==null) {
tLuftfeuchtigkeitBad.cancel()
tLuftfeuchtigkeitBad=null
Lueftung_Bad.postUpdate(OFF) // lösche Status Item Lüftung durch Nachlaufsteuerung
logInfo("Zwangslüftung:","Beende Nachlauftimer 60min vorzeitig")
sendBroadcastNotification("Zwangslüftung: Beende Nachlauftimer vorzeitig um: " + now.toString("HH:mm") + " Uhr") //Pushnachricht
}
logInfo("Zwangslüftung:","Einschaltzeit erreicht. Lüftung läuft schon auf Stufe 2 (Mittel)")
sendBroadcastNotification("Zwangslüftung: Einschaltzeit " + now.toString("HH:mm") + " Uhr erreicht. Lüftung läuft schon auf Stufe 2 (Mittel)") //Pushnachricht
return;
}
// wenn Uhrzeit erreicht ist und die Lüftung noch nicht auf Stufe 2 (Mittel) läuft deaktiviere Feuchtesteuerung und schalte Lüftung auf Stufe 2 (Mittel)
WAC350_Durchschnitt_Feuchte_Haus.postUpdate(OFF) // deaktiviere Feuchtesteuerung
LuefterStufe.sendCommand(2) // Schalte Lüftung auf Stufe 2 (Mittel)
Lueftung_Zeit.postUpdate(ON) // Status Item Zwangslüftung ist EIN
logInfo("Zwangslüftung:","Zwangslüftung gestartet")
sendBroadcastNotification("Zwangslüftung um " + now.toString("HH:mm") + " Uhr gestartet, Feuchtesteuerung deaktiviert, schalte Lüftung auf Stufe 2 (Mittel)") //Pushnachricht
end
rule "Zwangslüftung AUS auf Stufe 1 (Klein)"
when
Time cron "0 30 13,21 * * ? *" // 13:30, 21:30 Uhr
then
if (WAC350_Durchschnitt_Feuchte_Haus_Zwang.state==OFF) { // wenn Schalter aus, keine Aktionen
logInfo("Zwangslüftung:","Ausschaltzeit erreicht aber Deaktiviert")
sendBroadcastNotification("Zwangslüftung: Ausschaltzeit " + now.toString("HH:mm") + " Uhr erreicht aber Deaktiviert") //Pushnachricht
return;
}
// wenn Uhrzeit erreicht ist und noch auf Stufe 1 (Klein) läuft reaktiviere nur Feuchte Steuerung
if (LuefterStufe.state==1) { // Lüftung läuft noch auf Stufe 1 (Klein)
WAC350_Durchschnitt_Feuchte_Haus.postUpdate(ON) // reaktiviere Feuchtesteuerung
Lueftung_Zeit.postUpdate(OFF) // Status Item Zwangslüftung ist AUS
logInfo("Zwangslüftung:","Ausschaltzeit erreicht. Lüftung läuft noch auf Stufe 1 (Klein)")
sendBroadcastNotification("Zwangslüftung: Ausschaltzeit " + now.toString("HH:mm") + " Uhr erreicht. Lüftung läuft noch auf Stufe 1 (Klein)") //Pushnachricht
return;
}
// wenn Uhrzeit erreicht ist und noch auf Stufe 2 (Mittel) läuft reaktiviere nur Feuchte Steuerung
WAC350_Durchschnitt_Feuchte_Haus.postUpdate(ON) // reaktiviere Feuchtesteuerung
//LuefterStufe.sendCommand(1) // Schalte Lüftung auf Stufe 1 (Klein)
Lueftung_Zeit.postUpdate(OFF) // Status Item Zwangslüftung ist AUS
logInfo("Zwangslüftung:","Zwangslüftung beendet")
sendBroadcastNotification("Zwangslüftung um " + now.toString("HH:mm") + " Uhr beendet, Feuchtesteuerung reaktiviert") //Pushnachricht
end
rule "Lüfterstufe nach Außentemperatur"
when
Item AussenTemp changed // Lacrosse Sensor
then
if(Lueftung_min_max_Temp.state==OFF) { // wenn Schalter aus, keine Aktionen
//logInfo("Lüfterstufe nach Außentemperatur","Steuerung deaktiviert!")
return;
}
if(!(AussenTemp.state instanceof Number)) { // numerisch ?
logWarn("Lüfterstufe nach Außentemperatur","AussenTemp.state not a Number: {}",AussenTemp.state)
return;
}
if(!(AussenGrenzMax_Set.state instanceof Number)) { // numerisch ?
logWarn("Lüfterstufe nach Außentemperatur","AussenGrenzMax_Set.state not a Number: {}",AussenGrenzMax_Set.state)
return;
}
if(!(AussenGrenzMin_Set.state instanceof Number)) { // numerisch ?
logWarn("Lüfterstufe nach Außentemperatur","AussenGrenzMin_Set.state not a Number: {}",AussenGrenzMin_Set.state)
return;
}
if ((Aussenluft.state as Number) >= (AussenGrenzMax_Set.state as Number) && LuefterStufe.state==2) { //Schalte Lüftung auf Stufe 1 wenn die angesaugte Außenluft den Sollwert erreicht hat
LuefterStufe.sendCommand(1)
WAC350_Durchschnitt_Feuchte_Haus_Zwang.postUpdate(OFF) // deaktiviere Zeitsteuerung
WAC350_Durchschnitt_Feuchte_Haus.postUpdate(OFF) // deaktiviere Feuchtesteuerung
Lueftung_Temperatur.postUpdate(ON) // Status Item Lüftung auf Stufe 1 durch Außenlufttemperatur
logInfo("Lüfterstufe nach Außentemperatur","LuefterStufe ist jetzt: {} Aussenluft {}",LuefterStufe.state,Aussenluft.state )
sendBroadcastNotification("Lüftung durch Aussenluft: " +Aussenluft.state.toString+"°C, auf Stufe 1 (Klein) um " + now.toString("HH:mm") + " Uhr") //Pushnachricht
} else if ((AussenTemp.state as Number) <= (AussenGrenzMin_Set.state as Number) && Lueftung_Temperatur.state==ON) { //Schalte Lüftung auf Stufe 2 wenn die Außentemperatur den Sollwert erreicht hat
LuefterStufe.sendCommand(2)
WAC350_Durchschnitt_Feuchte_Haus_Zwang.postUpdate(ON) // reaktiviere Zeitsteuerung
WAC350_Durchschnitt_Feuchte_Haus.postUpdate(ON) // reaktiviere Feuchtesteuerung
Lueftung_Temperatur.postUpdate(OFF) // Status Item Lüftung auf Stufe 2 durch Außentemperatur
logInfo("Lüfterstufe nach Außentemperatur","LuefterStufe ist jetzt: {} AussenTemp beträgt {}",LuefterStufe.state,AussenTemp.state)
sendBroadcastNotification("Lüftung durch Aussentemp: " +AussenTemp.state.toString+"°C, auf Stufe 2 (Mittel) um " + now.toString("HH:mm") + " Uhr") //Pushnachricht
}
end
rule "Lüfterstufe 1 (Klein) Zeitstempel"
when
Item LuefterStufe changed from 2 to 1
then
LuefterStufe.state == 1 // Lüftung ist auf Stufe 1 (Klein)
Luefterstufe_1_last.postUpdate(now.toString())
end
rule "Lüfterstufe 2 (Mittel) Zeitstempel"
when
Item LuefterStufe changed from 1 to 2
then
LuefterStufe.state == 2 // Lüftung ist auf Srufe 2 (Mittel)
Luefterstufe_2_last.postUpdate(now.toString())
end
rule "Lüftung Standby Zeitstempel AUS"
when
Item FanStandby_Switch changed from OFF to ON
then
FanStandby_Switch.state == ON // Lüftung ist AUS
Lueftungstandby_on_last.postUpdate(now.toString())
end
rule "Lüftung Standby Zeitstempel EIN"
when
Item FanStandby_Switch changed from ON to OFF
then
FanStandby_Switch.state == OFF // Lüftung ist EIN
Lueftungstandby_off_last.postUpdate(now.toString())
end