Beeinflussung einer Rule durch eine andere Rule ?

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Tokamak
Beiträge: 183
Registriert: 20. Aug 2019 08:37
Answers: 4
Wohnort: Aachen

Re: Beeinflussung einer Rule durch eine andere Rule ?

Beitrag 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.
Proxmox mit OH 4.2 und HABApp 24 im LXC-Container

violine21
Beiträge: 600
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Beeinflussung einer Rule durch eine andere Rule ?

Beitrag 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é

Benutzeravatar
PeterA
Beiträge: 1106
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Beeinflussung einer Rule durch eine andere Rule ?

Beitrag 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!
- OpenHab 2.4
#PWRUP

Benutzeravatar
PeterA
Beiträge: 1106
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Beeinflussung einer Rule durch eine andere Rule ?

Beitrag 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
   }
- OpenHab 2.4
#PWRUP

Tokamak
Beiträge: 183
Registriert: 20. Aug 2019 08:37
Answers: 4
Wohnort: Aachen

Re: Beeinflussung einer Rule durch eine andere Rule ?

Beitrag von Tokamak »

Die Grundregel ist: Halte die Luftfeuchtigkeit unter 60%.

Die Lüftung springt an, wenn
  1. irgendein Wert 65% übersteigt (Duschen oder möglicherweise trocknende Wäsche)
  2. 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.
Proxmox mit OH 4.2 und HABApp 24 im LXC-Container

Benutzeravatar
PeterA
Beiträge: 1106
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Beeinflussung einer Rule durch eine andere Rule ?

Beitrag 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
- OpenHab 2.4
#PWRUP

Tokamak
Beiträge: 183
Registriert: 20. Aug 2019 08:37
Answers: 4
Wohnort: Aachen

Re: Beeinflussung einer Rule durch eine andere Rule ?

Beitrag 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.
Proxmox mit OH 4.2 und HABApp 24 im LXC-Container

Benutzeravatar
PeterA
Beiträge: 1106
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Beeinflussung einer Rule durch eine andere Rule ?

Beitrag 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 :)
- OpenHab 2.4
#PWRUP

Benutzeravatar
PeterA
Beiträge: 1106
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Beeinflussung einer Rule durch eine andere Rule ?

Beitrag 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
- OpenHab 2.4
#PWRUP

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

Re: Beeinflussung einer Rule durch eine andere Rule ?

Beitrag 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:
  1. Es gibt eine Methode forEach, welche sich hier anbietet, um über die Gruppe zu iterieren.
  2. Wann immer möglich, sollte man keine Primitives verwenden. Hier also lieber Integer statt int
  3. 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. ;)
  4. 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
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten