Rule für Dämmerung

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

hulda
Beiträge: 68
Registriert: 13. Jan 2018 19:43
Answers: 0

Re: Rule für Dämmerung

Beitrag von hulda »

es geht um 21 Uhr aus aber wenn sich der Dämmerungswert wieder ändert gleich wieder an.
Alos muß man es doch bis zum nächsten Hell werden wieder sperren?
Oder....

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Rule für Dämmerung

Beitrag von int5749 »

Jain, sperren wäre sehr hart. Ich würde dann eher über ein Proxy-Item arbeiten.

Dieses sollte dann bei unterschreiten einer Helligkeit z.B. auf ON gehen und wenn es hell wird wieder OFF.
Auf diesem könntest Du dann triggern und schalten.

Ich nuzte dafür ein "Switch Night" bei mir, welches von einem Dämmerungsschalter auf ON oder OFF gesetzt und in diversen Rules genutzt wird.
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

hulda
Beiträge: 68
Registriert: 13. Jan 2018 19:43
Answers: 0

Re: Rule für Dämmerung

Beitrag von hulda »

Hallo,
ich habe es mal mit dem Google Kalender versucht...
Ist das so zu umständlich?
Item

Code: Alles auswählen

Number                Daemmerungswerteinstellen_sd03                 "Dämmerungswert einstellen [%s]"                                      <sun_clouds>
Switch                automatik_sd03_hauptschalter                                 "Steckdose Fenster Automatik Hauptschalter"
Switch                automatik_sd03_kalender                                 
Switch                automatik_sd03  
Rule

Code: Alles auswählen


rule "Kalender auslesen"
when
    Item automatik_sd03_kalender changed  //BEGIN:automatik_sd03_kalender:ON oder END:automatik_sd03_kalender:OFF

    then
    	if(automatik_sd03_kalender.state == ON)   		
        {
          automatik_sd03.sendCommand(ON)
        }
else
{
   automatik_sd03.sendCommand(OFF)
   Sd_03_EZ01_2OG.sendCommand(OFF) 
}    
end



rule "Dämmerungsschalter Fenster Esszimmer"
when

    Item Daemmerungswert received update or  //wenn eins von beiden ausgelöst
    Item automatik_sd03_hauptschalter received update or
    Item automatik_sd03_kalender received update
then
    if ((automatik_sd03_hauptschalter.state == ON) && (Sd_03_EZ01_2OG.state == OFF) && (automatik_sd03.state == ON)) {   //wenn der Schalter auf ein steht und die Steckdose noch aus ist und der Kalender ON sendet
        if (Daemmerungswert.state <= Daemmerungswerteinstellen_sd03.state as Number) {  //wenn der Daemmerungswert kleiner ist als Daemmerungswerteinstellen_sd03
            Sd_03_EZ01_2OG.sendCommand(ON)  //dann Steckdose ein
        
        } 
          else 
          {Sd_03_EZ01_2OG.sendCommand(OFF) 
          }
    }        
    
end


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

Re: Rule für Dämmerung

Beitrag von udo1toni »

Ich klemme mich mal dazu... Ich denke, Du machst Dir Dein Leben zu kompliziert.
Du hast ursprünglich ein Item uhrzeit_schalten_sd03, welches als Ausschaltzeitpunkt dienen soll. Dann bräuchtest Du aber auch zwingend ein zweites Item mit einem Eionschaltzeitpunkt. Nein, ich meine jetzt nicht, dass dann eingeschaltet wird. Stattdessen ist das Ganze ja ein dreistufiges Enable/Disable.
1. Stufe: Automatik aktiv
2. Stufe: Zeitfenster aktiv
3. Stufe Helligkeit passt.

Ich erkläre mal, wie ich das umsetzen würde (ohne Google Calendar):

Code: Alles auswählen

Number time_enable_sd03  // in Minuten nach Mitternacht
Number time_disable_sd03 // in Minuten nach Mitternacht
Number setLevel_sd03     
Number Daemmerungswert   
Switch automatik_sd03    
Switch Sd_03_EZ01_2OG    

Code: Alles auswählen

rule "Auto Switch SD03"
when
    Item time_enable_sd03  changed or
    Item time_disable_sd03 changed or
    Item setLevel_sd03     changed or
    Item Daemmerungswert   changed 
then
    if(automatik_sd03.state != ON) {                                                            // Automatik aus? 
        return;                                                                                 // dann Abbruch!
    }
    var Number nEnable   = 0                                                                    // Defaultwert, falls noch nichts eingestellt ist
    var Number nDisable  = 60*24                                                                // Defaultwert, falls noch nichts eingestellt ist
    var Number nSetLevel = 100                                                                  // Defaultwert, falls noch nichts eingestellt ist
    var Number nLevel    = 200                                                                  // Defaultwert, falls noch kein Messwert kommt
    var sSoll  = OFF                                                                            // Soll Schaltstellung
    val Number mNow      = now.getMinuteOfDay                                                   // Minute des Tages

    if(time_enable_sd03.state  instanceof Number) nEnable   = time_enable_sd03.state  as Number // Wert lesen
    if(time_disable_sd03.state instanceof Number) nDisable  = time_disable_sd03.state as Number // Wert lesen
    if(setLevel_sd03.state     instanceof Number) nDisable  = setLevel_sd03.state     as Number // Wert lesen
    if(Daemmerungswert.state   instanceof Number) nDisable  = Daemmerungswert.state   as Number // Wert lesen

    if(mNow >= nEnable && mNow < nDisable && nLevel <= nSetLevel) {                             // Im Zeitfenster und Wert unterschritten?
        sSoll = ON                                                                              // Dann Solltustand ändern
    }
    if(Sd_03_EZ01_2OG.state != sSoll)                                                           // Falls aktueller Status von Sollzustand abweicht
        Sd_03_EZ01_2OG.sendCommand(sSoll.toString)                                              // umsteuern
end
Die Rule triggert also bei etlichen Itemänderungen, eben alle, die Einfluss auf den Sollzustand des Aktors haben.
Der erste Schritt ist, zu überprüfen, ob die Automatik eingeschaltet ist. Und da kommt schon eine Frage auf... Was soll passieren, wenn der Aktor aktiv ist, und von Automatikmodus nach Manuell gewechselt wird? Meine Regel tut dann einfach gar nichts, man könnte dann aber auch gezielt abschalten, dann müsste halt zusätzlich der Wechsel des Modus in die Trigger und ein paar zusätzliche Zeilen Code in den ersten if-Block rein.

Nach dem ersten if-Block ist klar, dass der Automatik Modus aktiv ist. Nun werden also alle Werte abgeholt, die für die Betrachtung relevant sind. Da jedes der Items auch NULL enthalten kann, müssen Vorkehrungen getroffen werden, hier der Einfachheit halber über lokale Variablen.

Nun folgt eine Grenzwertbetrachtung, zum einen, befinden wir uns im festgelegten Zeitfenster? Und zum anderen, wurde der eingestellte Grenzwert unterschritten? Anhand der Defaultwerte kannst Du erkennen, dass bei fehlenden Werten der Sollzustand OFF sein wird. Fehlen nur die Zeitwerte, so reagiert die Rule auf die Helligkeitswerte, die Zeitgrenzen sind also inaktiv.

Sind alle Bedingungen erfüllt, so wird lediglich der Sollwert geändert, sonst nichts.

Zum Schluss prüft die Rule, ob der Sollwert vom Istwert abweicht. Nur wenn das der Fall ist, wird auch ein Schaltbefehl abgesetzt. Damit werden unnötige Schaltbefehle vermieden, die nur das log vollmüllen.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Antworten