Seite 2 von 5
Re: Beeinflussung einer Rule durch eine andere Rule ?
Verfasst: 23. Mär 2020 06:54
von Tokamak
PeterA hat geschrieben: ↑22. Mär 2020 13:09
CO2 war nie ein Thema.
Welche KWL betreibst Du ?
Eine Pluggit P300.
Bei mir war eine Steuerung über CO2 und Luftfeuchtigkeit auch nie ein Thema. Die KWL lief wegen dem Duschen bis 9 Uhr, dann wieder ab 14 Uhr. Ausgeschaltet wurde sie, wenn man das Schlafzimmerfenster öffnet, so dass sie nachts nicht uunötigerweise lief. Allerdings lief sie immer auf der geringsten Stufe.
Damit war ihr Lauf nicht bedarfsgerecht. Die KWL dient der Aufrechterhaltung eines guten Raumklimas. Es sollte nicht zu feucht und nicht zu trocken sein, und der CO2-Gehalt der Luft sollte nicht zu hoch werden. Hierzu finden sich Vorgaben zu Betriebsstätten.
Die Netatmo-Wetterstation hatte ich bereits im Einsatz. Als dann OH dazukam, hatte ich die Möglichkeit, die über KNX gesteuerte KWL mit der Wetterstation zu verknüpfen.
Den Rest habe ich dargestellt. Im Wesentlichen: Die KWL läuft bei mindestens 65% Luftfeuchte (-> Duschen) oder bei mindestens 800ppm CO2. Wenn es draußen wärmer wird und die Heizung nicht mehr läuft, sind so viele Fenster auf, dass die KWL nur ca. 30 Minuten pro Tag läuft, um die Luftfeuchte aus dem Bad zu schaffen.
Re: Beeinflussung einer Rule durch eine andere Rule ?
Verfasst: 23. Mär 2020 18:13
von violine21
PeterA hat geschrieben: ↑22. Mär 2020 18:50
Hi violine21
so hab ichs jetzt mal gebaut aber ohne die Timerbeeinflussung sondern direkt um die Lüftung zu Stoppen:
Code: Alles auswählen
rule "Stoppe Lüftung wenn Feuchte zu Niedrig"
when
Item Durchschnitt_Feuchte_Haus changed // Durchschnitt Feuchte durch Lacross Sensoren
then
if ((Durchschnitt_Feuchte_Haus.state as Number > 40.1) && (49.9 > Durchschnitt_Feuchte_Haus.state as Number)){
logInfo("Feuchtesteuerung:","Bereich optimal!")
return;
}
if (WAC350_Durchschnitt_Feuchte_Haus.state != ON) { // wenn Schalter aus(nicht an) , keine Aktionen
logInfo("Feuchtesteuerung:","Steuerung deaktiviert!")
return;
}
if ((Durchschnitt_Feuchte_Haus.state <= 40) && FanStandby_Switch.state != ON) { //Standby ist OFF und nicht ON = Lüftung läuft
FanStandby_Switch.sendCommand(ON) // Lüftung Standby
logInfo("Feuchtesteuerung:","Lüftung Standby, Feuchte kleiner gleich 40%") // Lüftung Standby
sendBroadcastNotification("Lüftung Standby, Feuchte kleiner gleich 40%") //Pushnachricht
} else if ((Durchschnitt_Feuchte_Haus.state >= 50) && FanStandby_Switch.state != OFF) { //Standby ist ON und nicht OFF = Lüftung läuft nicht
FanStandby_Switch.sendCommand(OFF) // Lüftung EIN
logInfo("Feuchtesteuerung:","Lüftung EIN, Feuchte größer gleich 50%")
sendBroadcastNotification("Lüftung EIN, Feuchte größer gleich 50%") //Pushnachricht
}
end
Hast Du es schon getestet?
Welche Auflösung hat eigentlich der Sensor? Übermittelt der überhaupt Kommastellen?
Sonst müsstest Du ganze Zahlen nehmen.
Wie gesagt, bricht die Rule nach der 1. if-Abfrage im Idealfall ab. Getriggert wird trotzdem, nur wird "etwas" Rechenzeit eingespart.
Ich denke, die meiste Zeit liegt die Feuchte sowieso in dem Gutbereich??
VG André
Re: Beeinflussung einer Rule durch eine andere Rule ?
Verfasst: 23. Mär 2020 18:36
von PeterA
Hi André,
Die Sensoren sind JelinkLacrosse H/T Sensoren und liefern bei der Feuchte keine Zahlen mit Kommastellen...
Zumindest heute Morgen hat die Rule getriggert und die Lüftung wurde bei 40% gestoppt.
Und die "Alles gut" Meldung kommt auch:
Code: Alles auswählen
2020-03-23 18:35:13.912 [INFO ] [thome.model.script.Feuchtesteuerung:] - Bereich optimal!
2020-03-23 18:35:13.948 [GroupItemStateChangedEvent] - Durchschnitt_Feuchte_Haus changed from 40 to 41 through InnenDGFeuchte
Code: Alles auswählen
2020-03-23 19:53:53.952 [GroupItemStateChangedEvent] - Durchschnitt_Feuchte_Haus changed from 40 to 41 through InnenKellerHBYTRRFeuchte
2020-03-23 19:53:53.955 [vent.ItemStateChangedEvent] - InnenKellerHBYTRRFeuchte changed from 40 % to 41 %
==> /var/log/openhab2/openhab.log <==
2020-03-23 19:53:53.963 [INFO ] [thome.model.script.Feuchtesteuerung:] - Bereich optimal!
Re: Beeinflussung einer Rule durch eine andere Rule ?
Verfasst: 23. Mär 2020 20:43
von PeterA
Tokamak hat geschrieben: ↑23. Mär 2020 06:54
PeterA hat geschrieben: ↑22. Mär 2020 13:09
CO2 war nie ein Thema.
Welche KWL betreibst Du ?
Eine Pluggit P300.
....
Den Rest habe ich dargestellt. Im Wesentlichen: Die KWL läuft bei mindestens 65% Luftfeuchte (-> Duschen) oder bei mindestens 800ppm CO2. Wenn es draußen wärmer wird und die Heizung nicht mehr läuft, sind so viele Fenster auf, dass die KWL nur ca. 30 Minuten pro Tag läuft, um die Luftfeuchte aus dem Bad zu schaffen.
Hier ist eine Westaflex WAC350 in Betrieb.
Wenn ich fragen darf: Wie sieht denn dein "Setup" der Sensoren aus ?
Hier im Haus habe ich im Keller,Wohnzimmer,Flur, Schlafen und Bad von JeelinkLacrosse H/T Sensoren.
Über diese lasse ich mir den Durchschnittswert der Luftfeuchte bilden.
Nehmen wir mal an die Lüftung ist nicht Betrieb weil die Luftfeuchte im Haus unter 40% liegt.
Jetzt wird geduscht dann erhöht sich ja kurzzeitig die Luftfeuchte im Bad. Sagen wir mal auf 55% bis 60% (so beobachte ich es immer)
Nun reicht das aber nicht aus um den Durchschnitt für das gesamte Haus soweit zu erhöhen das ich, wie in meiner Rule eingestellt, über 50% komme und die Lüftung wieder anläuft.
Wie könnte ich das verbessern ?
Die Badfeuchte noch mal zusätzlich als "Wiederanlauf" Bedingung mit einbauen ?
Oder eher den kurzfristigen Anstieg auswerten ?
So in etwa ?
Code: Alles auswählen
} else if ((Durchschnitt_Feuchte_Haus.state >= 50) || InnenDGBadFeuchte.state >= 50 && FanStandby_Switch.state != OFF) { //Standby ist ON und nicht OFF = Lüftung läuft nicht
FanStandby_Switch.sendCommand(OFF) // Lüftung EIN
logInfo("Feuchtesteuerung:","Lüftung EIN, Feuchte größer gleich 50%")
sendBroadcastNotification("Lüftung EIN, Feuchte größer gleich 50%") //Pushnachricht
}
Re: Beeinflussung einer Rule durch eine andere Rule ?
Verfasst: 24. Mär 2020 07:23
von Tokamak
Die Grundregel ist: Halte die Luftfeuchtigkeit unter 60%.
Die Lüftung springt an, wenn
- irgendein Wert 65% übersteigt (Duschen oder möglicherweise trocknende Wäsche)
- der Durchschnitt aller Werte 60% übersteigt
Die Lüftung läuft so lange, bis alle Werte unterhalb 60% liegen.
Technisch ist das ein Kinderspiel:
Alle Luftfeuchteitems liegen in einer Gruppe. Ändert sich ein Wert, bestimme ich Maximum und Durchschnitt dieser Werte.
Ist das Maximum>65 oder der Durchschnitt>60, schalte die Lüftung ein.
Ist das Maximum <60, schalte die Lüftung aus.
Diese Werte kannst du deinem Bedarf anpassen. Da die opimale Luftfeuchte zwischen 40 und 60 liegt, im Bad sogar höher, sah ich keinen Grund, niedrigere Werte zu nehmen.
Bei deinen Werten - normal 40%, Anstieg bis 60% - würde ich vermutlich gar nichts tun, sondern eher versuchen, Feuchtigkeit ins Haus zu bekommen.
Re: Beeinflussung einer Rule durch eine andere Rule ?
Verfasst: 24. Mär 2020 07:50
von PeterA
Hi,
vielen Dank für die Infos zu Deinem Konzept.
Aktuell wurde das nur weil es jetzt nochmal so kalt geworden ist und dann natürlich die Luftfeuchte "in den Keller" geht.
Ich stimme Dir zu das es eigentlich zu Trocken ist.
Wäre es möglich das ich mir die Rule zu Deinem Konzept mal ansehen darf ?
Denn ich bestimme derzeit nur den Durchschnitt und Bewerte nicht einzelne Maxima.
Gruß Peter
Re: Beeinflussung einer Rule durch eine andere Rule ?
Verfasst: 24. Mär 2020 08:36
von Tokamak
Klar:
Code: Alles auswählen
rule "PluggitLuftfeuchtigkeit"
when
Member of gPluggit_Items_Luftfeuchtigkeit changed
then
// bestimme die durchschnittliche und maximale Luftfeuchte
var int lfSumme=0
var int lfMax=0
var int lfCnt=0
for (item: gPluggit_Items_Luftfeuchtigkeit.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 65% oder avg 60% Luftfeuchtigkeit lüfte.
if (lfMax>=65 || lfAvg>=60) {
Pluggit_Status_Luftfeuchte.postUpdate(ON)
}
else {
// fällt die Luftfeuchte aller Stationen unter 60%, wurde genug gelüftet
if (lfMax<60) {
Pluggit_Status_Luftfeuchte.postUpdate(OFF)
}
}
end
Das Item Pluggit_Status_Luftfeuchte geht in eine andere Rule, wo neben dem CO2-Status auch bewertet wird, ob die Lüftung manuell angeschaltet wurde.
Im letzteren Fall läuft sie dann 30 Minuten. Meine Frau nutzt das, um Essensgerüche aus dem Haus zu bekommen.
Re: Beeinflussung einer Rule durch eine andere Rule ?
Verfasst: 24. Mär 2020 08:50
von PeterA
Fett!!! Vielen Dank. Doch so einfach
Ich war gedanklich schon bei einem Groups AVG und Groups MAX Konzept.
Gruß Peter
... Mit den Essensgerüchen kommt mir gerade auch eine Idee:
Ich könnte über einen Shelly den Stromverbrauch der Umlufthaube auswerten und dann die Lüftung auch für eine gewisse Zeit laufen lasssen....
Sehr Spannend

Re: Beeinflussung einer Rule durch eine andere Rule ?
Verfasst: 24. Mär 2020 08:58
von PeterA
Tokamak hat geschrieben: ↑24. Mär 2020 08:36
Klar:
Code: Alles auswählen
rule "PluggitLuftfeuchtigkeit"
when
Member of gPluggit_Items_Luftfeuchtigkeit changed
then
// bestimme die durchschnittliche und maximale Luftfeuchte
var int lfSumme=0
var int lfMax=0
var int lfCnt=0
for (item: gPluggit_Items_Luftfeuchtigkeit.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 65% oder avg 60% Luftfeuchtigkeit lüfte.
if (lfMax>=65 || lfAvg>=60) {
Pluggit_Status_Luftfeuchte.postUpdate(ON)
}
else {
// fällt die Luftfeuchte aller Stationen unter 60%, wurde genug gelüftet
if (lfMax<60) {
Pluggit_Status_Luftfeuchte.postUpdate(OFF)
}
}
end
Das Item Pluggit_Status_Luftfeuchte geht in eine andere Rule, wo neben dem CO2-Status auch bewertet wird, ob die Lüftung manuell angeschaltet wurde.
Im letzteren Fall läuft sie dann 30 Minuten. Meine Frau nutzt das, um Essensgerüche aus dem Haus zu bekommen.
Und was macht dieser Code in der Rule ?
Code: Alles auswählen
for (item: gPluggit_Items_Luftfeuchtigkeit.members) {
if (item.state instanceof Number) {
lfCnt+=1
val int lf=(item.state as Number).intValue()
lfSumme+=lf
if (lf>lfMax) lfMax=lf
Re: Beeinflussung einer Rule durch eine andere Rule ?
Verfasst: 24. Mär 2020 11:24
von udo1toni
Der Code iteriert über alle Gruppenmitglieder. Er prüft für jedes Item, ob es einen gültigen Wert zurück liefert. Ist das der Fall, zählt er einen Zähler hoch und addiert den Wert zu einer Summe. Zum Schluss prüft der Code, ob der Wert höher als der bisherige Maximalwert ist und ersetzt diesen, falls das der Fall ist.
Da ich es eh nicht lassen kann, einige kleine Anmerkungen:
- Es gibt eine Methode forEach, welche sich hier anbietet, um über die Gruppe zu iterieren.
- Wann immer möglich, sollte man keine Primitives verwenden. Hier also lieber Integer statt int
- Die Definition als Integer ist nur für lfCnt zwingend, da sonst die Abkürzung lfCnt+=1 fehlschlägt. lfAvg könnte dann natürlich auch einen Dezimalbruch enthalten, das sollte aber für die Funktion keine Rolle spielen.
Allgemein wird davon abgeraten, alle Variablen auf einen Typ festzulegen, da sich dadurch die Startzeit erhöht. Ob das stimmt, weiß ich nicht. 
- Die Rule sendet bei jedem Trigger ein postUpdate, gleichgültig, ob das notwendig ist oder nicht.
Hier die optimierte Version:
Code: Alles auswählen
rule "PluggitLuftfeuchtigkeit" // bestimme die durchschnittliche und maximale Luftfeuchte
when
Member of gPluggit_Items_Luftfeuchtigkeit changed
then
var lfSumme=0
var lfMax=0
var Integer lfCnt=0
gPluggit_Items_Luftfeuchtigkeit.members.filter[i |
i.state instanceof Number].forEach[ item |
lfCnt+=1
val Integer lf=(item.state as Number).intValue
lfSumme+=lf
if (lf>lfMax) lfMax=lf
]
var lfAvg
if (lfCnt>=2) // nur bei mindestens 2 Werten ist es sinnvoll, die Werte zu betrachten
lfAvg=(lfSumme/lfCnt).intValue
else {
lfAvg=0
lfMax=0
}
var newState=Pluggit_Status_Luftfeuchte.state
if (lfMax>=65 || lfAvg>=60) newState=ON // Bei mehr als max 65% oder avg 60% Luftfeuchtigkeit lüfte.
else if (lfMax<60) newState=OFF // fällt die Luftfeuchte aller Stationen unter 60%, wurde genug gelüftet
if(Pluggit_Status_Luftfeuchte.state != newState)
Pluggit_Status_Luftfeuchte.postUpdate(newState)
end