Ankündigung

Einklappen
Keine Ankündigung bisher.

Wie kann man Gruppen/Listen durchlaufen?

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

    Wie kann man Gruppen/Listen durchlaufen?

    Hi,
    nachdem ich jetzt unter Nutzung einiger Switch-Items ein Rollo so rauf und runterfahren kann, wie ich das aktuell möchte, habe ich nun die Aufgabe, diese Funktion auch für andere Rollos (natürlich mit anderen Zeiten) umzusetzten. Ich habe mittlerweile gelernt, dass Scripte, selbst wenn sie ansich funktionieren, keine Möglichkeit der Parameterübergabe haben, also nicht wie ein Unterprogramm im herkömmlichen Sinne funktionieren und somit an dieser Stelle ausscheiden.

    Meine Idee ist es nun, die unterschiedlichen Items pro Rollo (z.B. Startzeit-erreicht, Endezeit-erreicht, Sonnenuntergang+x, Sonnenaufgang+x und andere) jeweils zu einer Liste oder Gruppe zusammenzufassen und den Steueralgorithmus dann pro Listenelement einmal durchlaufen zu lassen.
    PHP-Code:
    <META>
    # definiere Listen
    Liste1 Rollo1_startRollo2_startRollo3_start
    Liste2 
    Rollo1_endeRollo2_endeRollo3_ende
    # Abarbeiten der Listen
    for Durchlauf 1 to Länge(Liste1)
       
    benutze Liste1(Durchlauffür irgendwas
       benutze Liste2
    (Durchlauffür irgendwas
    next
    <endMETA
    Ich tue mich aktuell etwas schwer mit der zweigeteilten Dokumentation Openhab und Xtend/Xtext. Vermutlich gibt es da etwas was weiterhelfen könnte, ich finde aber keinen Anfang, an dem ich zumindestens mal anfang könnte zu lesen.

    Kann da jemand Hilfestellung geben?

    Gruß und schönes (langes) Wochenende
    Peter

    #2
    Hi,
    als Alternative ist mir noch eingefallen, den Namen des abzufragenden ITEMS aus zwei Stringteilen zusammenzusetzten. Aber auch da habe ich bisher keinen Ansatz gefunden, dass dann auch umzusetzten.

    Gruß
    Peter

    Kommentar


      #3
      das ist einfach Zum Beispiel
      Code:
      GS_Bath?.members.forEach(Shutter|Shutter.sendCommand(UP))
      durchläuft die Gruppe GS_Bath und führt für jeden Member sendCommand(UP) aus. bei forEach steht also vor dem | der verwendete Name, der jeweils im Code nach dem | für das einzelne Item steht.

      Kommentar


        #4
        Hi udo1toni,

        danke für die Info. Zwischenzeitlich bin ich auch darüber gestolpert und mit ein wenig weitergooglen bin ich dann auch auf

        PHP-Code:
        gStatus?.members.get(2).name 
        und
        PHP-Code:
        gStatus?.members.get(2).state 
        gestolpert, die einen Zugriff auf z.B. hier das zweite Gruppenelement erlauben.

        Der Syntax des forEach Konstruktes ist mir zwar noch etwas suspect, aber vielleicht kannst du noch zusteuern, wo sowas denn dokumentiert ist?

        Gruß
        Peter

        Kommentar


          #5
          Dokumentation habe ich bisher auch keine gefunden - schon gar keine mit direktem Bezug zu openHAB. Der Designer hilft aber mit der Kontext-Ergänzung schon mal ganz gut, die meisten Methoden sind ja mit sprechenden Namen versehen. Wenn Du mit forEach arbeitest, kannst Du auch mit
          Code:
          forEach(MyItem|{
              If(MyItem.name=="Bla") {
                  machwas
                  und das
                  und das auch noch
                  }
              else
                  oder das
              }
          )
          arbeiten. Da ich gerade nicht zuhause bin, kann ich schlecht verifizieren, dass ich keinen Unsinn erzähle aber mehr oder weniger sollte das so gehen.

          Für mich ist vor allem das Type-Casting ein einziger Graus. Ich verstehe schon den Sinn, muss aber bei jedem Versuch, selbst auf den jeweils passenden Code zu kommen irgendwann aufgeben und hier fragen Zu viele verschiedene Schreibweisen, bei denen ich (mangels gescheiter Dokumentation) nicht verstehe, was denn nun der Unterschied ist, und warum die eine Variante da funktioniert und die andere dort...

          Kommentar


            #6
            Kann ich denn in so einer forEach Loop auch den Status der GroupItems verändern? Vermutlich mit .set(x) aber irgendwie bekomme ich den Syntax nicht hin.

            Gruß

            Kommentar


              #7
              Siehe meine erste Antwort...
              Code:
              Gruppe?.members.forEach(Item|Item.sendCommand(Status))
              oder (wenn nur die Anzeige geändert werden soll, ohne was zu schalten)
              Code:
              Gruppe?.members.forEach(Item|Item.postUpdate(Status))
              Zuletzt geändert von udo1toni; 18.05.2015, 10:06.

              Kommentar


                #8
                Hi,
                gibt es für das Konstrukt in der Klammer irgendwo eine Beschreibung? Mich würde interessieren, was der senkrechte Strich bewirkt (z.B. hab ich ein Beispiel gefunden, das vor dem Strich ein "Item,i" hat. Item für Item und i für einen 'indexzähler'). Und die Funktion des ? wäre auch interessant.

                Gruß

                Kommentar


                  #9
                  So wie ich es verstanden habe, ist das ? die Mitteilung, dass es sich um eine Gruppe handelt, die jetzt als Liste einzelner Items verwendet werden soll.
                  Schließlich kannst Du die Gruppe auch als Item verwenden, woher soll openHAB wissen, ob Du nun das Gruppenitem oder die Liste meinst.
                  Vor dem | steht der Platzhalter, den Du hinter dem | als Synonym für das einzelnde Item verwendest.

                  Z.B. in VBA gibt es auch das ForEach-Konstrukt, da steht es dann etwas leserlicher: For Each Item in Itemgroup... If Item.name= bla...

                  Du könntest das vermutlich auch per Hand programmieren, so in der Art For i=1 to Gruppe.Countitems ... If Gruppe.Item(i).Name=bla, aber gerade, wenn Du ohnehin die gesamte Liste durchgehen musst, ist die ForEach-Schleife doch um einiges eleganter.

                  Kommentar


                    #10
                    Und jetzt die provokative Frage: warum weißt du das (z.B. mit dem Fragezeichen. Beim Persist ist es ja dann ein * statt ein ? für die Gruppe)? Wo würde ich -diesen- speziellen Fall jetzt nachlesen können? Irgendwie muß ich ja mal einen Griff an das Dokuthema bekommen.

                    Gruß

                    Kommentar


                      #11
                      Ich 'weiß' das, weil ich hier und an etlichen anderen Stellen viel mitlese. Manches an Doku kann man sich zusammen suchen. Ich hab keine Ahnung, ob es eine komplette xtext und xtend und so weiter Doku gibt, sicher aber keine openHAB-spezifische. Ich hab leieder auch gar keine Ahnung von Java, das würde die Sache vermutlich vereinfachen, aber bisher 'wurde ich hier noch immer geholfen'
                      Es gibt ja auch veschiedene Bestrebungen, openHAB zu dokumentieren, da kannst Du sicher auch mit beitragen.

                      Der Open-Source-Gedanke: nimm es wie es ist oder ändere es.

                      Kommentar

                      Lädt...
                      X