Seite 1 von 5

Beeinflussung einer Rule durch eine andere Rule ?

Verfasst: 22. Mär 2020 11:19
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

Re: Beeinflussung einer Rule durch eine andere Rule ?

Verfasst: 22. Mär 2020 12:19
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).

Re: Beeinflussung einer Rule durch eine andere Rule ?

Verfasst: 22. Mär 2020 12:53
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

Re: Beeinflussung einer Rule durch eine andere Rule ?

Verfasst: 22. Mär 2020 13:02
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.

Re: Beeinflussung einer Rule durch eine andere Rule ?

Verfasst: 22. Mär 2020 13:09
von PeterA
CO2 war nie ein Thema.
Welche KWL betreibst Du ?

Re: Beeinflussung einer Rule durch eine andere Rule ?

Verfasst: 22. Mär 2020 15:31
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

Re: Beeinflussung einer Rule durch eine andere Rule ?

Verfasst: 22. Mär 2020 16:49
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é

Re: Beeinflussung einer Rule durch eine andere Rule ?

Verfasst: 22. Mär 2020 17:12
von PeterA
Wie kann ich denn einen "Bereich" in einer if Bedingung definieren ?

Re: Beeinflussung einer Rule durch eine andere Rule ?

Verfasst: 22. Mär 2020 17:23
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.

Re: Beeinflussung einer Rule durch eine andere Rule ?

Verfasst: 22. Mär 2020 18:50
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