Ankündigung

Einklappen
Keine Ankündigung bisher.

Jalousie in Abhängigkeit Fensterkontakt

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

    Jalousie in Abhängigkeit Fensterkontakt

    Hallo zusammen,

    ich bin gerade dabei openHAB kennen zu lernen. Installiert habe ich openHAB auf einer Diskstation in der Version V2.1.0.004.

    Ich habe ein Fensterkontakt von der Firma Homematic und die Jalousie ist mit KNX angebunden.
    Nun soll bei Sonnenuntergang die Jalousie herunter gefahren werden. Die linke Jalousie aber nur in Abhängigkeit des Fensterkontakts.
    Leider funktioniert die if-Abfrage in der folgenden Regel nicht. Wie kann man den Status abfragen? Gibt es hilfreiche Links bei denen man so etwas nachlesen kann?

    Vielen Dank im voraus.

    jalousie.rules:
    Code:
    rule "Jalousie"
        when
           Channel 'astro:sun:home:set#event' triggered START
        then
           if(WohnZi_Fenster.state != OPEN)
           {
              sendCommand(WohnZi_Jal_Links, DOWN)
           }    
           sendCommand(WohnZi_Jal_Mitte,  DOWN)
           sendCommand(WohnZi_Jal_Rechts, DOWN)
    
           if(WohnZi_Fenster.state != OPEN)
           {
              createTimer(now.plusSeconds(20)) [| sendCommand(WohnZi_Jal_Links, STOP) ]
           }
           createTimer(now.plusSeconds(16)) [| sendCommand(WohnZi_Jal_Mitte, STOP) ]
           createTimer(now.plusSeconds(20)) [| sendCommand(WohnZi_Jal_Rechts, STOP) ]
    end
    Wohnzimmer.items:
    Code:
    String WohnZi_Fenster           "Wohnzimmer Fenster [MAP(HM-Sec-RHS.map):%s]"      <window>            (gWohnZi, gFenster)                       {channel="homematic:HM-Sec-RHS:ccu2:LEQ0566501:1#STATE"}
    Rollershutter WohnZi_Jal_Links  "Wohnzimmer Jalousie links"                        <rollershutter>     (gWohnZi, gJalousien)                     {knx="3/2/5, 3/2/6"}
    HM-Sec-RHS.map
    Code:
    // HM-Sec-RHS.map
    // STATE
    CLOSED=zu
    OPEN=offen
    TILTED=gekippt
    
    // UNSET
    NULL=unbekannt
    -=unbekannt

    #2
    Wenn Du das Item WohnZi_Fenster als String Item definierst, sollte da auch ein String vorliegen. Dementsprechend müsste die if-Abfrage so aussehen:
    Code:
    if(WohnZi_Fenster.state.toString != "OPEN")
    Vermutlich funktioniert der Vergleich auch ohne die explizite Umwandlung .toString, aber mit funktioniert es auf jeden Fall.
    OPEN ohne Anführungszeichen wäre ein State, den gibt es allerdings nur beim Contact Item. Das Contact Item unterstützt aber nur OPEN und CLOSED, nicht AJAR oder TILTED. Ein Switch hätte ON und OFF als State, den könnte man dann ohne Anführungszeichen vergleichen:
    Code:
    if(myContact.state != OPEN)
    if(mySwitch.state != ON)
    Zuletzt geändert von udo1toni; 01.06.2017, 19:33.

    Kommentar


      #3
      Dankeschön.
      Es hat auch ohne .toString funktioniert.

      Kommentar


        #4
        Hallo zusammen,

        ich arbeite ebenfalls gerade an so einer ähnlichen Lösung.
        Ich hätte gerne, dass bei Sonnenuntergang (hier als Test eine Uhrzeit, final dann mit Astro Binding) und bei Öffnung einer der 4 Türen (also Fensterkontakt da invertiert über die Map auf "CLOSED") eine Auswahl an Rollladen gefahren wird, wenn alle Türen zu sind (else; wir also im Haus) alle Rollo gefahren werden.
        Ich bin ein Noob auf dem Gebiet und habe auch keine Programmiererfahrung. Es wäre trotzdem nett, wenn ihr mir helfen könntet.
        Die Regel sieht im Moment so aus:
        Code:
        rule "Rollo zu"
        when
            Time cron "0 52 21 * * ? *" and
            Item Fensterkontakt_Bibliothek changed to CLOSED or
            Item Fensterkontakt_Esszimmer_West changed to CLOSED or
            Item Fensterkontakt_Esszimmer_Sued changed to CLOSED or
            Item Fensterkontakt_Wohnzunmer changed to CLOSED
        then
            sendCommand(Rollo_OG_KinderzimmerNord_Alexa, ON)
            sendCommand(Rollo_OG_KinderzimmerSued_Alexa, ON)
            sendCommand(Rollo_OG_Abstellraum_Alexa, ON)
            sendCommand(Rollo_OG_Bad_Alexa, ON)
            sendCommand(Rollo_OG_Buero_Alexa, ON)
            sendCommand(Rollo_OG_Ankleide_Alexa, ON)
            sendCommand(Rollo_OG_Schlafzimmer_Alexa, ON)
            sendCommand(Rollo_OG_Leseecke_Alexa, ON)
            sendCommand(Rollo_EG_Kueche_West_Alexa, ON)
            sendCommand(Rollo_EG_Kueche_Nord_Alexa, ON)
            sendCommand(Rollo_EG_Kueche_Nord_West_Alexa, ON)
            sendCommand(Rollo_EG_WC_Alexa, ON)
        else
            {
            sendCommand(Rollo_EG_Wohnzimmer_Alexa, ON)
            }
            Rollo_ALLES_Alexa.sendCommand(ON)
            createTimer(now.plusSeconds(18))
            [|
            sendCommand(Rollo_EG_Wohnzimmer_Alexa, ON)
            sendCommand(Rollo_EG_Esszimmer_West_Alexa, ON)
            sendCommand(Rollo_EG_Esszimmer_Sued_Alexa, ON)
            ]                        
        end
        Die ITEMS sehen so aus:
        Code:
        Contact Fensterkontakt_Bibliothek        "Bibliothek [MAP(de.map):%s]"        { knx="24/4/92" }
        Contact    Fensterkontakt_Esszimmer_West    "Esszimmer West [MAP(de.map):%s]"    { knx="24/4/90" }
        Contact Fensterkontakt_Esszimmer_Sued    "Esszimmer Süd [MAP(de.map):%s]"    { knx="24/4/96" }
        Contact Fensterkontakt_Wohnzimmer        "Wohnzimmer [MAP(de.map):%s]"        { knx="24/4/101" }
        Akt. passiert leider gar nichts. Ich denke es liegt schon an der When Funktion.
        Zuletzt geändert von Heeman24; 15.02.2018, 22:05.

        Kommentar


          #5
          Es gibt im when-Teil einer Rule kein and.

          Im when-Teil einer Rule werden keine Bedingungen gelistet, sondern Trigger. Die Rule wird also ausgeführt, wenn ein bestimmtes Ereignis eintritt. Deshalb gibt es auch keinen else-Teil zum then.

          Ich interpretiere die Rule jetzt mal so, dass die Rollläden fahren sollen, es sei denn, eine der Türen ist offen, dann soll nur ein Teil der Läden fahren. Dazu wäre es (schon wegen der Menge an beteiligten Items) sinnvoll, Gruppen zu bilden, und zwar
          • eine Gruppe mit den Türkontakten mit :OR(OPEN,CLOSED). Diese zeigt anschließend in der Sitemap die Menge geöffneter Türen an.
          • eine Gruppe mit den Läden, die auf jeden Fall geschlossen werden
          • eine Gruppe mit den Läden, die nur geschlossen werden, wenn alle Türen geschlossen sind.
          Anschließend sieht die Rule dann so aus:
          Code:
          rule "Rollos zu"
          when
              Time cron "0 52 21 * * ?"                             // Rule wird um 21:52:00 täglich ausgeführt
          then
              if(gTuerKontakte.filter[g|g.state == OPEN].size == 0) // Anzahl Kontakte, die offen sind = 0 ?
                  gTuerRoll.members.forEach[i|i.sendCommand(DOWN)]  // Türen schließen
              gRollRest.members.forEach[i|i.sendCommand(DOWN)]      // die anderen Läden schließen
          end
          Zuletzt geändert von udo1toni; 15.02.2018, 23:44.

          Kommentar


            #6
            Danke udo1toni,

            ich habe nun die rule so aufgebaut wie von dir vorgegeben.
            Code:
            rule "Rollos zu"
            when
                Time cron "0 57 11 * * ?"                             // Rule wird um 11:57:00 täglich ausgeführt
            then
                if(gTuerKontakte.filter[g|g.state == OPEN].size == 4) // Ich habe open angegeben, da dies der "geschlossene" Zustand ist, 4 geschlossene Türen sind es
                    gTuerRoll.members.forEach[i|i.sendCommand(ON)]  // Türen schließen, mit Command ON, da es ein einfaches Switch Item ist
                gRollRest.members.forEach[i|i.sendCommand(ON)]      // die anderen Läden schließen
            end
            Die Gruppen sehen so aus:
            Code:
            Group gTuerRoll    // Gruppe Terrassentüren
            Group gRollRest // Gruppe aller Rollos ohne Terrassentüren
            Group:Contact:OR(OPEN, CLOSED) gTuerKontakte "[%d]"    // Gruppe Türkontakte
            die Items (exemplarisch):
            Code:
            Switch Rollo_EG_WC_Alexa                "Rollo im Gäste WC"                (gRollRest) [ "Switchable" ]    { knx="2/4/82" }
            Switch Rollo_EG_Wohnzimmer_Alexa        "Rollo im Wohnzimmer"            (gTuerRoll)    [ "Switchable" ]    { knx="2/4/63"}
            Contact Fensterkontakt_Wohnzimmer        "Wohnzimmer [MAP(de.map):%s]"        (gTuerKontakte)    { knx="24/4/101" }
            Es bewegt sich leider nichts. In der Sitemap sehe ich die 4 Türen, auch mit dem dem richtigen Wert (offen/zu).
            Einen Neustart hab ich bereits gemacht.

            Hier noch ein Auszug der Fehlermeldungen:
            Code:
            2018-02-16 11:56:17.661 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'Rollo_zu Test.rules' is either empty or cannot be parsed correctly!
            2018-02-16 11:56:18.468 [INFO ] [el.core.internal.ModelRepositoryImpl] - Validation issues found in configuration model 'Rollo_zu Test.rules', using it anyway:
            There is no context to infer the closure's argument types from. Consider typing the arguments or put the closures into a typed context.
            2018-02-16 11:56:18.478 [INFO ] [el.core.internal.ModelRepositoryImpl] - Loading model 'Rollo_zu Test.rules'
            2018-02-16 11:57:00.704 [ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule 'Rollos zu': 'filter' is not a member of 'org.eclipse.smarthome.core.items.GroupItem'; line 5, column 8, length 39
            Zuletzt geändert von Heeman24; 16.02.2018, 14:06.

            Kommentar


              #7
              ah, es muss natürlich
              Code:
              if(gTuerKontakte[COLOR=#FF0000].members[/COLOR].filter[g|g.state == CLOSED].size == 0)
              heißen.
              Die Prüfung sollte immmer gegen 0 erfolgen, denn das ist ja die Anzahl erlaubter offener Türen.

              Kommentar


                #8
                Perfekt! Das wars! Vielen Dank!
                Kann man das noch so verfeinern, dass nur das eine Rollo, (wo der Kontakt entsprechend offen ist) offen bleibt? Akt. bleiben die alle 4 definierten Rollo offen. Wäre das ein großer Programmieraufwand? Das wäre sozusagen das i Tüpfelchen. :-)

                Kommentar


                  #9
                  Ja sicher, nichts einfacher als das

                  Dazu ist es allerdings notwendig (oder zumindest vereinfacht es die Sache), die Namen der Items zueinander passend zu gestalten. Wenn Du z.B. die Items so benennst:
                  Tuer1_Kontakt Tuer1_Laden (und dann pro Tür nur die Nummer änderst). Kann man einen Befehl so aufbauen:
                  Code:
                  gKontakte.members.filter[k|
                      k.state == OPEN
                  ].forEach[i|
                      gTueren.members.filter[t|
                          t.name == split(i.name,"_",1) + "_Laden"
                      ].forEach[h|
                          h.sendCommand(ON)
                      ]
                  ]
                  Das ist jetzt allerdings nur auf die Schnelle, vermutlich habe ich irgendwo einen Fehler drin, wie so oft
                  Die Idee ist jedenfalls, dass die Namen der Items zueinander passen, so dass man jeweils das passende Item raussuchen und manipulieren kann.

                  Kommentar


                    #10
                    Danke für deine Antwort. Das werde ich mir in nächster Zeit dann noch ansehen.
                    Es ist wirklich unglaublich, wie viel Potential openHAB mit sich bringt.

                    Kommentar

                    Lädt...
                    X