Ankündigung

Einklappen
Keine Ankündigung bisher.

Jalousie Lüftungsstufe bei geöffnetem Fenster

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Jalousie Lüftungsstufe bei geöffnetem Fenster

    Hallo zusammen,

    bei mir fahren alle Jalousie um 22:45 Sommer bzw. 21:45 Winter auf 100% Verschattung.
    Ich habe in allen Fenstern Magnetkontakte eingebaut und möchte nun folgendes realisieren:

    Wenn die Jalousie zur oben genannten Uhrzeit heruntergefahren sind, soll im Anschluss geprüft werden ob der Magnetkontakt ausgelöst ist bzw. das Fenster offen ist.

    Ist das Fenster offen, soll die Jalousie auf 90 % gefahren werden, damit ein "Lüften" weiterhin gewährleistet ist.

    Kann mir jemand ein Beispiel geben, wie eine Rule aussehen könnte, die das abbildet.

    Ich habe 15 Magnetkontakte im Haus verbaut die überwacht werden müssten. Diese senden zyklisch ihren Status.

    Viele Grüße
    Sascha

    #2
    Warum fährst Du nicht direkt auf die 90% Position?

    Grundsätzlich solltest Du versuchen, Dir Gruppenfunktionen zunutze zu machen, etwa so:
    Code:
    Group gFensterkontakte
    Group gRolllaeden
    Contact Fensterkontakt_Fenster01   "Fenster 01 [%s]"                 (gFensterkontakte) {...}
    Contact Fensterkontakt_Fenster02   "Fenster 02 [%s]"                 (gFensterkontakte) {...}
    Contact Fensterkontakt_Wohnzimmer  "Wohnzimmer Fenster [%s]"         (gFensterkontakte) {...}
    Rollershutter Rollladen_Fenster01  "Laden Fenster 01 [%d%%]"         (gRolllaeden)      {...}
    Rollershutter Rollladen_Fenster02  "Laden Fenster 02 [%d%%]"         (gRolllaeden)      {...}
    Rollershutter Rollladen_Wohnzimmer "Laden Wohnzimmer Fenster [%d%%]" (gRolllaeden)      {...}
    Wichtig ist also, dass alle Läden in der einen Gruppe sind, alle Kontakte in der anderen Gruppe. Der jeweils 2. Teil des Itemnamens ist identisch und in der Gruppe eindeutig.

    Nun die Rule:
    Code:
    rule "Läden runter"
    when
        Time cron "0 45 22 * APR-SEP ?" or         // vom 1. April bis 30. September
        Time cron "0 45 21 * JAN-MAR,OCT-DEC ?"    // vom 1. Oktober bis 31. März
    then
        gRolllaeden.members.forEach[r|
            val cKontakt = gFensterkontakte.members.filter[c|c.name.split("_").get(1) == r.name.split("_").get(1)].head
            r.sendCommand(
                if(cKontakt.state == CLOSED) 100 else 90
            )
        ]
    end
    Wenn die Rule triggert, steuert sie jeden Rollladen der Gruppe individuell, abhängig vom Status des zugehörigen Kontakts.

    Falls der Rollladen zwingend auf 100% fahren muss, böte sich eine Rule an, die so aussieht:
    Code:
    rule "Läden zum Lüften"
    when
        Member of gRolllaeden changed to 100
    then
        val cKontakt = gFensterkontakte.members.filter[c|c.name.split("_").get(1) == triggeringItem.name.split("_").get(1)].head
        if(cKontakt.state == OPEN)
            triggeringItem.sendCommand(90)
    end
    Allerdings wird diese Rule im Zweifel innerhalb eines extrem kurzen Zeitfensters fünfzehnmal aufgerufen, eben für jeden Laden. Wenn Du viele Läden hast, die exakt die gleiche Laufzeit aufweisen, kannst Du damit die zur Verfügung stehenden Threads kurzzeitig auslasten. Gewöhnlich sollte openHAB alle "zu kurz gekommenen" Rules nachholen, sicher bin ich mir da aber nicht.

    Zur Erklärung (weil die Zeile vielleicht nicht selbsterklärend ist...)
    Code:
    val cKontakt = gFensterkontakte // die Gruppe
        .members                          // alle unmittelbaren Mitglieder als Liste
        .filter[                          // filtere die Liste
            c|                            // substituiere jedes Element mit c
            c.name                        // untersuche den Namen von c
            .split("_")                   // trenne bei der Zeichenfolge _ und bilde eine Liste
            .get(1) ==                    // nimm das 2. Element der Liste (nullbasierter Index) und vergleiche mit
            r.name                        // dem Namen des aktuellen Rollladenitems
            .split("_")                   // trenne bei _
            .get(1)                       // nimm den 2. Teil
        ].head                            // Das Ergebnis ist eine Liste mit einem Element. Nimm das erste Element der Liste
    Anschließend ist cKontakt also das zugehörige Contact Item.
    In der 2. Rule läuft es genauso, nur dass diesmal nur ein Rollershutteritem existiert, dasjenige, welches die Rule getriggert hat.

    Ach so... fast vergessen...

    Natürlich kannst Du noch eine weitere Rule bauen, die
    • Beim Öffnen eines Fensters, dessen Laden zu 100% geschlossen ist, diesen ebenfalls auf 90% fährt
    • Beim Schließen eines Fensters, dessen Laden zu 90% geschlossen ist, diesen auf 100% fährt.
    Da die Kontakte sich schon in einer Gruppe befinden, ist das eine Fingerübung und ebenfalls mit einer Rule erledigt:
    Code:
    rule "Fensterkontakt geändert"
    when
        Member of gFensterkontakte changed
    then
        val rLaden = gRolllaeden.members.filter[r|r.name.split("_").get(1) == triggeringItem.name.split("_").get(1)].head
        if(triggeringItem.state == OPEN && rLaden.state == 100)
            rLaden.sendCommand(90)
        if(triggeringItem.state == CLOSED && rLaden.state == 90)
            rLaden.sendCommand(100)
    end

    Es wird kein Schlüsselwort else benötigt, da ohnehin maximal eine der beiden Bedingungen erfüllt sein kann.
    Zuletzt geändert von udo1toni; 27.07.2020, 20:44.

    Kommentar


      #3
      Vielen herzlichen Dank. Mega Aufwand, besten Dank.

      Ich würde nur gerne das Datum anders einpflegen:
      22:46 Uhr 24. April bis 15. September
      21:46 Uhr 16. September bis 23 April

      wie mache ich das syntaktisch?


      Ich habe nun die Rules wie folgt eingepflegt:

      Code:
      
      rule "Lüftungsstufe Jalousie bei Abendverschattung"
      
      when
      Time cron "0 46 22 * APR-SEP ?" or // vom 1. April bis 30. September
      Time cron "0 46 21 * JAN-MAR,OCT-DEC ?" // vom 1. Oktober bis 31. März
      then
      gEGOGRolladen,.members.forEach[r|
      val cKontakt = gEGOGMagnetkontakte.members.filter[c|c.name.split("_").get(1) == r.name.split("_").get(1)].head
      r.sendCommand(
      if(cKontakt.state == CLOSED) 100 else 90
      )
      ]
      end
      
      rule "Jalousiesteuerung mit Magnekontakten bei 90 und 100 %"
      when
      Member of gEGOGMagnetkontakte changed
      then
      val rLaden = gEGOGRolladen.members.filter[r|r.name.split("_").get(1) == triggeringItem.name.split("_").get(1)].head
      if(triggeringItem.state == OPEN && rLaden.state == 100)
      rLaden.sendCommand(90)
      if(triggeringItem.state == CLOSED && rLaden.state == 90)
      rLaden.sendCommand(100)
      end



      Zuletzt geändert von SaschaQ; 28.07.2020, 10:23.

      Kommentar


        #4
        Das geht leider nicht so einfach, allerdings...
        Code:
        Time cron "0 46 22 24-30 APR ?" or // vom 24. - 30. April
        Time cron "0 46 22 * MAY-AUG ?" or // vom 1. Mai bis 31. August
        Time cron "0 46 22 1-15 SEP ?" or // vom 1. bis 15. September
        Time cron "0 46 21 16-30 SEP ?" // vom 16. bis 30. September
        Time cron "0 46 21 * JAN-MAR,OCT-DEC ?" // vom 1. Oktober bis 31. März
        Time cron "0 46 21 1-23 APR ?" // vom 1. bis 23. April
        Sieht halt hässlich aus.
        Die Alternative: Du lässt die Rule überlappend triggern:
        Code:
        Time cron "0 46 22 * APR-SEP ?" or // vom 1. April bis 30. September
        Time cron "0 46 21 * JAN-APR,SEP-DEC ?" // vom 1. September bis 30. April
        und testest in der Rule zusätzlich auf das konkrete Datum, dann kannst Du entscheiden, ob der Trigger der richtige ist.
        Code:
        if(new Interval(now.withTmeAtStartOfDay.withDate(now.getYear,4,24),now.withTimeAtStartOfDay.withDate(now.getYear,9,16)).contains(now) && now.getHourOfDay < 22) return;
        liefert true wenn die spätere Uhrzeit verwendet werden muss, aber die frühere Uhrzeit getriggert hat, damit bricht die Rule dann direkt ab (mit dem return.

        Ist aber nicht wirklich besser...

        Kommentar

        Lädt...
        X