Beeinflussung einer Rule durch eine andere Rule ?

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Beeinflussung einer Rule durch eine andere Rule ?

Beitrag von PeterA »

Hallo zusammen,

vor einiger Zeit hatte ich mit Eurer Hilfe eine Timer Rule für unsere Lüftungsanlage entwickelt.
Das funktioniert auch sehr gut.

rule:

Code: Alles auswählen

var Timer Deko = null

rule "Wecker Deko"
    when
        Time cron "0 * * * * ?" //Abfrage jede Minute
    then

    if(WAC350_Zeitschaltung_01.state == ON) {
        var sollMinute = (Deko_WECKER_M.state as DecimalType).intValue
        var sollStunde = (Deko_WECKER_H.state as DecimalType).intValue
        var sollMinuteo = (Deko_WECKER_Mo.state as DecimalType).intValue
        var sollStundeo = (Deko_WECKER_Ho.state as DecimalType).intValue

        if (sollMinute == now.getMinuteOfHour && sollStunde == now.getHourOfDay) {
            LuefterStufe.sendCommand(1)
            sendBroadcastNotification("Timer Lüftung Stufe Klein") //Allgemeine Warnung an alle
        } else if (sollMinuteo == now.getMinuteOfHour && sollStundeo == now.getHourOfDay) {
            LuefterStufe.sendCommand(0)
            sendBroadcastNotification("Timer Lüftung Stufe Stop") //Allgemeine Warnung an alle
        }
    }
    
    if(WAC350_Zeitschaltung_02.state == ON) {
        var sollMinute = (Deko_WECKER_Ma.state as DecimalType).intValue
        var sollStunde = (Deko_WECKER_Ha.state as DecimalType).intValue
        var sollMinuteo = (Deko_WECKER_Maa.state as DecimalType).intValue
        var sollStundeo = (Deko_WECKER_Haa.state as DecimalType).intValue

        if (sollMinute == now.getMinuteOfHour && sollStunde == now.getHourOfDay) {
            LuefterStufe.sendCommand(2)
            sendBroadcastNotification("Timer Lüftung Stufe Mittel") //Allgemeine Warnung an alle
        } else if (sollMinuteo == now.getMinuteOfHour && sollStundeo == now.getHourOfDay) {
            LuefterStufe.sendCommand(1)
            sendBroadcastNotification("Timer Lüftung Stufe Klein") //Allgemeine Warnung an alle
        }    
    }
end
Mit dieser Rule habe ich zwei Zeiträume realisiert in welcher ich unsere Lüftung entsprechend Schalten kann.
Hauptsächlich zur Regulierung der Luftfeuchte im Haus.
Nun, insbesondere in der kalten Periode (Winter kann man das ja nicht mehr nennen :) ), schalte ich die Lüftung zwischen
22Uhr und 7Uhr ab um die Luft nicht zu trocken werden zu lassen.
Funktioniert auch sehr gut soweit.

Des weiteren habe ich im Haus Sensoren mit welchen in die Durchschnittsfeuchte über OpenHab erfasse.
Funktioniert auch Prima.

Nun möchte ich beides "zusammen" bringen.

Kann ich nun eine weitere Rule erstellen welche mir zb. bei 40% Durchschnittsfeuchte im Haus als Untergrenze mittels einem "PostUpdate" OFF
auf das item

Code: Alles auswählen

WAC350_Zeitschaltung_01
den Timer deaktiviert ?
Und bei zb. 50% wieder aktiviert ?

Gruß Peter
von Tokamak » 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.
Gehe zur vollständigen Antwort
- OpenHab 2.4
#PWRUP

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

Re: Beeinflussung einer Rule durch eine andere Rule ?

Beitrag von udo1toni »

Machen kannst Du das auf jeden Fall. Die Frage ist eher, ob die Herangehensweise nicht grundsätzlich zu überdenken wäre. Ich ginge davon aus, dass Du eine möglichst konstante Luftfeuchte zwischen 40% und 50% erreichen willst. Wozu dienen die festgelegten Schaltzeiten? geht es um Geräusch und/oder Luftbewegung?

Allgemein finde ich minütlich triggernde Rules, die dann überwiegend statische Items abfragen eher suboptimal :)

Ich würde auch versuchen, die Rule anders zu strukturieren.
Definiere in der Rule eine Variable. Im ersten Teil der Rule bestimmst Du die Sollstufe der Lüftung, abhängig von Uhrzeit, Datum, Luftfeuchte, Sperrschaltern, whatever... und speicherst diese Sollstufe nur in der Variablen.
Im zweiten Teil prüfst Du, auf welcher Stufe die Lüftung läuft, und nur falls die Sollstufe von der aktiven Stufe abweicht, sendest Du einen entsprechenden Befehl (samt Meldung, wenn es denn sein soll).
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

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

Re: Beeinflussung einer Rule durch eine andere Rule ?

Beitrag von PeterA »

Hallo Udo,

es sind nicht die Geräusche oder Luftbewegungen. Es geht darum das in Häusern mit einer zentralen Lüftungsanlage wenn mal die Baufeuchte raus ist die Luftfeuchtigkeit in der kalten Jahreszeit sehr schnell zu trocken werden kann. (Sagt aber auch keiner vorher). Möglicherweise gibt es KWLs mit Abluftfeuchteregelung aber unsere kann das nicht.
Somit habe ich mir über die Zeitsteuerung beholfen und natürlich auch etwas probieren müssen.
Jetzt habe ichs aber ganz gut im Griff.
Nur die "Unterbrechung" der Zeitsteuerung wenn die Feuchte zu niedrig ist fehlt noch.
Ja und ich kann mich erinnern dass Du damals schon bei der Timerrule das obige angemerkt hast.
Aber es funktioniert hier wunderbar.

Wie beeinflusse ich nun ein Item mit einer Rule ?
Mit PostUpdate wenn ich das richtig verstanden habe?

Gruss Peter
- OpenHab 2.4
#PWRUP

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

Re: Beeinflussung einer Rule durch eine andere Rule ?

Beitrag von Tokamak »

Um eine Idee in die Runde zu schmeißen: Ich habe eine Netatmo Wetterstation im Wohnzimmer stehen, um CO2 zu messen. Das Außenmodul steht im Bad, um dort die Luftfeuchtigkeit zu messen (das Außenmodul reagiert viel schneller auf Luftfeuchteänderungen als die Innenmodule).

Die KWL steuere ich über die CO2-Werte (Stufe 1 bei CO2>800ppm, Stufe 2 bei >1000ppm, bei >1200ppm Stufe 3). Ebenso schalte ich die KWL ein, wenn ein Luftfeuchtewert >65% gemessen wird. Bei CO2<800ppm und alle Luftfeuchtewerte <60% läuft die KWL nicht.

Durch die bedarfsgerechte Steuerung konnte ich die Laufzeiten deutlich reduzieren.
Produktiv: Proxmox mit OH 3.4 und HABApp im LXC-Container
Entwicklung: Proxmox mit OH 4.1 und HABApp im LXC-Container

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

Re: Beeinflussung einer Rule durch eine andere Rule ?

Beitrag von PeterA »

CO2 war nie ein Thema.
Welche KWL betreibst Du ?
- OpenHab 2.4
#PWRUP

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

Re: Beeinflussung einer Rule durch eine andere Rule ?

Beitrag von PeterA »

So hier mal mein Entwurf:

Code: Alles auswählen

rule "Stoppe Zeitsteuerung wenn Feuchte zu Niedrig"
when
    Item Durchschnitt_Feuchte_Haus changed // Durchschnitt Feuchte durch Lacross Sensoren
then
    if(WAC350_Durchschnitt_Feuchte_Haus.state != ON) { // wenn Schalter aus(nicht an) , keine Aktionen
        logInfo("Feuchtesteuerung:","Steuerung deaktiviert!")
        return;
    }
   if (Durchschnitt_Feuchte_Haus.state <= 35) {
       WAC350_Zeitschaltung_01.postUpdate(OFF)
       logInfo("Feuchtesteuerung:","Zeitschaltung AUS, Feuchte kleiner gleich 35%")
       sendBroadcastNotification("Zeitschaltung AUS, Feuchte kleiner gleich 35%") //Pushnachricht
   } else if (Durchschnitt_Feuchte_Haus.state >= 45) {
       WAC350_Zeitschaltung_01.postUpdate(ON)
       logInfo("Feuchtesteuerung:","Zeitschaltung EIN, Feuchte größer gleich 45%")
       sendBroadcastNotification("Zeitschaltung EIN, Feuchte größer gleich 45%") //Pushnachricht
   }
end
Funktioniert soweit auch. Triggert aber natürlich bei jedem "changed".
Eigentlich wäre es ja elegant wenn die Rule einmal Triggert wenn der untere Feuchtewert erreicht ist
und dann erst wieder wenn der obere Feuchtewert.

Gruß Peter
- OpenHab 2.4
#PWRUP

violine21
Beiträge: 589
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 15:31 Funktioniert soweit auch. Triggert aber natürlich bei jedem "changed".
Eigentlich wäre es ja elegant wenn die Rule einmal Triggert wenn der untere Feuchtewert erreicht ist
und dann erst wieder wenn der obere Feuchtewert.
Wenn ich das richtig verstanden habe, passiert zwischen 35,1 und 44,9% nichts?
Du könntest diesen Bereich in die 1. if-Bedingung einfügen. Dann wird die Rule sofort beendet.

VG André

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

Re: Beeinflussung einer Rule durch eine andere Rule ?

Beitrag von PeterA »

Wie kann ich denn einen "Bereich" in einer if Bedingung definieren ?
- OpenHab 2.4
#PWRUP

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

Re: Beeinflussung einer Rule durch eine andere Rule ?

Beitrag von violine21 »

Probier mal:

Code: Alles auswählen

if ((Durchschnitt_Feuchte_Haus.state as Number > 35.1) && (44.9 > Durchschnitt_Feuchte_Haus.state as Number))
    logInfo("Feuchtesteuerung:","Bereich optimal!")
    return;
if (WAC350_Durchschnitt_Feuchte_Haus.state != ON )
    logInfo("Feuchtesteuerung:","Steuerung deaktiviert!")
    return;
    
Wobei die log-Meldungen würde ich nach erfolgreicher Inbetriebnahme weglassen, da bei jedem change-Ereignis eine Meldung erzeugt wird.

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

Re: Beeinflussung einer Rule durch eine andere Rule ?

Beitrag von PeterA »

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

Antworten