Ankündigung

Einklappen
Keine Ankündigung bisher.

members.filter filtert nicht wie erwartet

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

    members.filter filtert nicht wie erwartet

    Hallo zusammen,
    ich möchte eine Regel erstellen, mit der ich alle Rollladen im OG und EG herunterfahre. Damit nur diese einen Fahrbefehl erhalten, welche nicht schon bei 100% (also unten) sind, wollte ich eine FIlter-Liste nutzen.

    Jedoch werden bei:
    Code:
    gShutterOG.members.filter(f|f.state.toString!=="100").forEach[ sOG|
        sOG.sendCommand(DOWN)
    ]
    Trotzdem alle Rollladen im OG gefahren, obwohl 5 bereits unten sind

    Code:
    gShutterOG.members.filter(f|f.state.toString!=="100").forEach[ sOG|
        logInfo("Attention", sOG.state.toString)
    ]
    liefert dann ....
    Code:
    23:22:14.972 [INFO ] [ipse.smarthome.model.script.Attention] - 100
    23:22:14.972 [INFO ] [ipse.smarthome.model.script.Attention] - 100
    23:22:14.988 [INFO ] [ipse.smarthome.model.script.Attention] - 100
    23:22:14.988 [INFO ] [ipse.smarthome.model.script.Attention] - 100
    23:22:15.003 [INFO ] [ipse.smarthome.model.script.Attention] - 100
    23:22:15.019 [INFO ] [ipse.smarthome.model.script.Attention] - 100
    Dort hätte ich mit den einzelnen Rolladen gerechnet?

    An anderer Stelle funktionieren ähnliche Filterregeln, hier stehe ich derzeit auf dem Schlauch.

    Viele Grüße,
    Jörg

    #2
    SOLVED: Nach einigem experimentieren lag es offensichtlich an einer falschen Abfrage der Zahl

    Code:
    gShutterEG.members.filter(f|(f.state as DecimalType).intValue!==100).forEach[ m|
        logInfo("Shutter", m.name)
    ]
    Dies führte mich dazu, das die bisherige Rule zum Rolladen öffnen auch noch nicht ordentlich funktioniert hat, dies konnte ich somit direkt mit korrigieren ;-)

    Kommentar


      #3
      Nun habe ich doch noch eine Herausforderung

      Ich habe für unsere Rollladen folgende Gruppenstruktur in meiner Items
      Code:
      Group All
          Group:Rollershutter:AVG Rollladen (All)
              Group:Rollershutter:AVG gShutterOG "Rollladen Obergeschoss"    <rollershutter>    (Rollladen, gOG)
              Group:Rollershutter:AVG gShutterEG "Rollladen Erdgeschoss"    <rollershutter>    (Rollladen, gEG)
      Derzeit fahre ich z.B. mit dem folgenden Befehl(en) alle Rollladen am Morgen auf
      Code:
      gShutterEG.members.filter(f|(f.state as DecimalType).intValue!==0).forEach[ s|
          s.sendCommand(UP)
          logInfo("Shutter", s.name + " received UP")
      ]
      gShutterOG.members.filter(f|(f.state as DecimalType).intValue!==0).forEach[ s|
          s.sendCommand(UP)
          logInfo("Shutter", s.name + " received UP")
      ]
      Dies funktioniert zwar, jedoch ist es ja eigentlich identischer und somit doppelter => unnötiger Code.
      Wenn ich dies ändere auf
      Code:
      Rollershutter.members.filter(f|(f.state as DecimalType).intValue!==0).forEach[ s|
          s.sendCommand(UP)
          logInfo("Shutter", s.name + " received UP")
      ]
      sind leider auch die beiden Gruppen "gShutterEG" und "gShutterOG" in der Filterliste enthalten und würden auch einen Fahrbefehl erhalten

      Kann ich die Liste auch NUR nach Items filtern und Gruppen nicht berücksichtigen?

      Viele Grüße

      Jörg

      Kommentar


        #4
        Au contraire, es sind dann ausschließlich die Gruppen enthalten, aber nicht die Member der beiden Gruppen. Was Du suchst, ist eher das hier:
        Code:
         Rollershutter.allMembers.filter(f|(f.state as DecimalType).intValue!==0).forEach[ s |
            s.sendCommand(UP)
            logInfo("Shutter", s.name + " received UP")
        ]
        allMembers enthält alle Items, die direkt zur Gruppe oder einer ihrer Untergruppen gehören. Soweit ich weiß, beinhaltet es aber nicht die Gruppen selbst (hab das aber nie ausprobiert... aber Du loggst ja eh mit, kannst das also auch falsifizieren).

        Kommentar


          #5
          Mit
          Code:
          Rollershutter.members.filter[ f | !(f instanceof GroupItem) && (f.state as DecimalType).intValue!==0 ].forEach[ s |
              s.sendCommand(UP)
              logInfo("Shutter", s.name + " received UP")
          ]
          oder, weil die Intention klarer wird und du sicher bist, dass der Zugriff mittels intValue() funktioniert:

          Code:
          Rollershutter.members.filter[ f | f instanceof RollerShutterItem && (f.state as DecimalType).intValue!==0 ].forEach[ s |
              s.sendCommand(UP)
              logInfo("Shutter", s.name + " received UP")
          ]
          Gira HS3 V4.5, openHAB 2.4

          Kommentar


            #6
            Zitat von udo1toni Beitrag anzeigen
            Soweit ich weiß, beinhaltet es aber nicht die Gruppen selbst (hab das aber nie ausprobiert... aber Du loggst ja eh mit, kannst das also auch falsifizieren).
            Richtig. Nur alle echten Items in allen Untergruppen, ohne die Gruppen selbst.
            Gira HS3 V4.5, openHAB 2.4

            Kommentar


              #7
              Zitat von udo1toni Beitrag anzeigen
              Au contraire, es sind dann ausschließlich die Gruppen enthalten, aber nicht die Member der beiden Gruppen. .
              OK, wieder die selbstgebauten Fehler Da meine Items in beiden Gruppen stecken (historisch um die Sitemap automatisch über Gruppen zu füllen) und daher wurden dann neben den Gruppen auch die Items noch mit angezeigt. Zum Glück liefert "allMembers" dann keine doppelten Einträge

              Code:
              logInfo("Shutter", "ALLE Rollladen - All Members")
              Rollladen.allMembers.filter(f|(f.state as DecimalType).intValue!==100).forEach[ s|
                  logInfo("Shutter", s.name + " received DOWN")
              ]
              liefert dann korrekt

              Code:
              2019-12-30 12:43:39.037 [INFO ] [lipse.smarthome.model.script.Shutter] - ALLE Rollladen - All Members
              2019-12-30 12:43:39.037 [INFO ] [lipse.smarthome.model.script.Shutter] - Terrasse_links_Fenster_Rollo received DOWN
              2019-12-30 12:43:39.052 [INFO ] [lipse.smarthome.model.script.Shutter] - Lea_Rollo received DOWN
              2019-12-30 12:43:39.068 [INFO ] [lipse.smarthome.model.script.Shutter] - Flur_Rollo received DOWN
              2019-12-30 12:43:39.068 [INFO ] [lipse.smarthome.model.script.Shutter] - GaesteWC_Rollo received DOWN
              2019-12-30 12:43:39.068 [INFO ] [lipse.smarthome.model.script.Shutter] - Eltern_Widerkehr_Rollo received DOWN
              2019-12-30 12:43:39.083 [INFO ] [lipse.smarthome.model.script.Shutter] - Bad_Rollo received DOWN
              2019-12-30 12:43:39.083 [INFO ] [lipse.smarthome.model.script.Shutter] - Kueche_links_Rollo received DOWN
              2019-12-30 12:43:39.099 [INFO ] [lipse.smarthome.model.script.Shutter] - Melissa_Widerkehr_Rollo received DOWN
              2019-12-30 12:43:39.099 [INFO ] [lipse.smarthome.model.script.Shutter] - Esszimmer_rechts_Rollo received DOWN
              2019-12-30 12:43:39.099 [INFO ] [lipse.smarthome.model.script.Shutter] - Melissa_Strasse_Rollo received DOWN
              2019-12-30 12:43:39.099 [INFO ] [lipse.smarthome.model.script.Shutter] - Terrasse_links_Tuere_Rollo received DOWN
              2019-12-30 12:43:39.115 [INFO ] [lipse.smarthome.model.script.Shutter] - Kueche_rechts_Rollo received DOWN
              2019-12-30 12:43:39.130 [INFO ] [lipse.smarthome.model.script.Shutter] - Eltern_Garten_Rollo received DOWN
              Keine Gruppen mehr enthalten.

              Danke nochmals an Euch.

              Jörg

              Kommentar


                #8
                Zitat von JoergA Beitrag anzeigen
                Zum Glück liefert "allMembers" dann keine doppelten Einträge
                Ja, solche Dinge werden ganz gut abgefangen (ein Vorteil, wenn man zum Programmieren entsprechende Bibliotheken verwendet - die sind meist gut getestet und achten auch auf gemeine Details)

                Kommentar

                Lädt...
                X