Ankündigung

Einklappen
Keine Ankündigung bisher.

Zählen offenen Fenster

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

    #16
    Ich denke wenn man tief in Java, xtext usw. drin ist, dann kennt man viele Sachen so wie z.B. Lambdas

    Thomas

    Kommentar


      #17
      Ah. Mengenlehre... Du hast eine Menge Früchte, bestehend aus Äpfeln und Birnen. Dann gibt filter().size die Mächtigkeit der Teilmenge zurück. Ja, da muss man erstmal drauf kommen...

      Kommentar


        #18
        Ah, ok. Über .filter() funktioniert das natürlich auch wenn man einfach nur für jedes Fenster open/closed haben möchte.
        Ich habe das bei mir etwas komplexer gelöst, da ich den Status eines Fensters auch über die entsprechenden Icons in der Visu darstellen möchte. Bei 2 Fensterflügeln funktioniert das dann leider nicht mehr einfach über open/close, da dort 4 Kontakte verbaut sind und sich somit 9 Status pro Fenster ergeben (siehe die Icons namens "fts_window_2w*" in https://github.com/OpenAutomationPro...r/raw_480x480; nicht wundern, 2 sind da doppelt ).

        Als mapping in meiner visu_config.xml habe ich das hier:
        Code:
              <mapping name="WindowStatus2w">
                <entry value="0" default="true">
                  <icon flavour="white" name="fts_window_2w"/>
                </entry>
                <entry value="1">
                  <icon flavour="white" name="fts_window_2w_tilt_l"/>
                </entry>
                <entry value="3">
                  <icon flavour="white" name="fts_window_2w_open_l"/>
                </entry>
                <entry value="4">
                  <icon flavour="white" name="fts_window_2w_tilt_r"/>
                </entry>
                <entry value="5">
                  <icon flavour="white" name="fts_window_2w_tilt_lr"/>
                </entry>
                <entry value="7">
                  <icon flavour="white" name="fts_window_2w_open_l_tilt_r"/>
                </entry>
                <entry value="12">
                  <icon flavour="white" name="fts_window_2w_open_r"/>
                </entry>
                <entry value="13">
                  <icon flavour="white" name="fts_window_2w_tilt_l_open_r"/>
                </entry>
                <entry value="15">
                  <icon flavour="white" name="fts_window_2w_open_lr"/>
                </entry>
              </mapping>
        Und dann diese kleine Regel (Window_FF_Bedroom_1 ist dabei die Gruppe der 4 Kontakte im Schlafzimmerfenster):
        Code:
        /**
         * Calculate the current state of a double window.
         * 
         * @param ContactItem cItemTopLeft
         *   Sensor top left.
         * @param ContactItem cItemBottomLeft
         *   Sensor bottom left.
         * @param ContactItem cItemTopRight
         *   Sensor top right.
         * @param ContactItem cItemBottomRight
         *   Sensor bottom right.
         * 
         * @return Number
         *   Current state of window.
         */
        val org.eclipse.xtext.xbase.lib.Functions$Function4 calculateWindowStateDouble = [
            ContactItem cItemTopLeft,
            ContactItem cItemBottomLeft,
            ContactItem cItemTopRight,
            ContactItem cItemBottomRight |
              var int nState = 0
              if (cItemTopLeft.state == CLOSED) {
                // Left window is tilted.
                nState = nState + 1
              }
              if (cItemBottomLeft.state == CLOSED) {
                // Left window is open.
                nState = nState + 2
              }
              if (cItemTopRight.state == CLOSED) {
                // Right window is tilted.
                nState = nState + 4
              }
              if (cItemBottomRight.state == CLOSED) {
                // Right window is open.
                nState = nState + 8
              }
              // Return state.
              return nState
        ]
        
        /**
         * Convert data of window contacts WindowBedroom1.
         */
        rule "window contacts FF_Bedroom_1"
        when
            Item Window_FF_Bedroom_1 received update 
        then
          logInfo("rules.window.contacts", "Window contacts [FF_Bedroom_1] received update")
          var int sum = 0
          try {
            sum = calculateWindowStateDouble.apply(Window_FF_Bedroom_1_TL, Window_FF_Bedroom_1_BL, Window_FF_Bedroom_1_TR, Window_FF_Bedroom_1_BR) as Integer
          }
          catch (Exception e) {
            logInfo("rules.window.contacts", "Couldn't calculate state of window contacts [FF_Bedroom_1]")
            logDebug("rules.window.contacts", "Error: " + e.toString)
          }
            logInfo("rules.window.contacts", "state of WindowBedroom1: " + sum)
            WindowBedroom1.postUpdate(sum)
        end

        Kommentar


          #19
          Hallo

          ich habe da mal eine Frage zu. Muss das als Regel eingebunden werden oder kommt das in die Items Datei?
          und wie erfolgt die Zuweisung zum Item? welcher Syntax is da der Richtige?

          Zitat von staehler Beitrag anzeigen
          So, die Antwort aus der Google Group (für die, die es interessiert):
          Code:
           [COLOR=#000]gFenster[/COLOR][COLOR=#660].[/COLOR][COLOR=#000]members[/COLOR][COLOR=#660].[/COLOR][COLOR=#000]filter[/COLOR][COLOR=#660]([/COLOR][COLOR=#000]s[/COLOR][COLOR=#660]|[/COLOR][COLOR=#000]s[/COLOR][COLOR=#660].[/COLOR][COLOR=#000]state[/COLOR][COLOR=#660]==[/COLOR][COLOR=#000]OPEN[/COLOR][COLOR=#660]).[/COLOR][COLOR=#000]size[/COLOR]
          Gruß

          Guido

          Kommentar


            #20
            Das musst du ein eine rule einbinden. Aber nur der Befehl alleine nutzt dir nicht viel, da fehlt schon noch was drumherum...


            Hier eine rule mit einem ähnlichen Inhalt, nur mal als Anschauungsobjekt:

            Code:
             [COLOR=#c586c0]rule[/COLOR][COLOR=#ce9178]"Fensterkontakte State Changed"[/COLOR]
            [COLOR=#c586c0]when[/COLOR]
            [COLOR=#569cd6]Item[/COLOR][COLOR=#d4d4d4] gFensterkontakte received update [/COLOR][COLOR=#608b4e]// NOTE: the rule will trigger multiple times per event[/COLOR]
            [COLOR=#c586c0]then[/COLOR]
            [COLOR=#4ec9b0]Thread[/COLOR][COLOR=#c586c0]::[/COLOR][COLOR=#d4d4d4]sleep([/COLOR][COLOR=#b5cea8]500[/COLOR][COLOR=#d4d4d4]) [/COLOR][COLOR=#608b4e]// give persistence time to catch up[/COLOR]
            [COLOR=#569cd6]val[/COLOR][COLOR=#d4d4d4] haveHistory [/COLOR][COLOR=#d4d4d4]=[/COLOR][COLOR=#d4d4d4] gFensterkontakte[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]members[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]filter[c|c[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]lastUpdate([/COLOR][COLOR=#ce9178]"mapdb"[/COLOR][COLOR=#d4d4d4]) [/COLOR][COLOR=#d4d4d4]!==[/COLOR][COLOR=#569cd6]null[/COLOR][COLOR=#d4d4d4]][/COLOR]
            [COLOR=#569cd6]val[/COLOR][COLOR=#d4d4d4] mostRecent [/COLOR][COLOR=#d4d4d4]=[/COLOR][COLOR=#d4d4d4] haveHistory[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]sortBy[lastUpdate([/COLOR][COLOR=#ce9178]"mapdb"[/COLOR][COLOR=#d4d4d4])][/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]last[/COLOR]
            [COLOR=#c586c0]if[/COLOR][COLOR=#d4d4d4](mostRecent [/COLOR][COLOR=#d4d4d4]===[/COLOR][COLOR=#569cd6]null[/COLOR][COLOR=#d4d4d4]) logError([/COLOR][COLOR=#ce9178]"Test contacts"[/COLOR][COLOR=#d4d4d4], [/COLOR][COLOR=#ce9178]"Failed to find most recent"[/COLOR][COLOR=#d4d4d4])[/COLOR]
            [COLOR=#c586c0]else[/COLOR][COLOR=#c586c0]if[/COLOR][COLOR=#d4d4d4](mostRecent[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]state [/COLOR][COLOR=#d4d4d4]==[/COLOR][COLOR=#b5cea8]OPEN[/COLOR][COLOR=#d4d4d4]){[/COLOR]
            [COLOR=#569cd6]val[/COLOR][COLOR=#d4d4d4] dt [/COLOR][COLOR=#d4d4d4]=[/COLOR][COLOR=#d4d4d4] gKontakteZeit[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]members[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]filter[dt|dt[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]name [/COLOR][COLOR=#d4d4d4]==[/COLOR][COLOR=#d4d4d4] mostRecent[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]name[/COLOR][COLOR=#d4d4d4]+[/COLOR][COLOR=#ce9178]"_last_opened"[/COLOR][COLOR=#d4d4d4]][/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]head[/COLOR]
            [COLOR=#c586c0]if[/COLOR][COLOR=#d4d4d4](dt [/COLOR][COLOR=#d4d4d4]===[/COLOR][COLOR=#569cd6]null[/COLOR][COLOR=#d4d4d4]) logError([/COLOR][COLOR=#ce9178]"Test contacts"[/COLOR][COLOR=#d4d4d4], [/COLOR][COLOR=#ce9178]"Failed to find "[/COLOR][COLOR=#d4d4d4]+[/COLOR][COLOR=#d4d4d4] mostRecent[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]name[/COLOR][COLOR=#d4d4d4]+[/COLOR][COLOR=#ce9178]"_last_opened"[/COLOR][COLOR=#d4d4d4])[/COLOR]
            [COLOR=#c586c0]else[/COLOR][COLOR=#d4d4d4] dt[/COLOR][COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]postUpdate([/COLOR][COLOR=#569cd6]new[/COLOR][COLOR=#4ec9b0]DateTimeType[/COLOR][COLOR=#d4d4d4])[/COLOR]
            [COLOR=#d4d4d4] }[/COLOR]
            [COLOR=#c586c0]end[/COLOR]
            In deinem Fall würde dann eben die Menge der offenen Fenster an die Variable übergeben werden und du kannst damit machen was du willst.


            EDIT:
            Code:
            [COLOR=#c586c0]rule[/COLOR][COLOR=#ce9178]"Test rule"[/COLOR]
            [COLOR=#c586c0]when[/COLOR]
            [COLOR=#569cd6]Item[/COLOR][COLOR=#d4d4d4] gFenster received update [/COLOR][COLOR=#608b4e]// NOTE: the rule will trigger multiple times per event[/COLOR]
            [COLOR=#c586c0]then[/COLOR]
            [COLOR=#4ec9b0]Thread[/COLOR][COLOR=#c586c0]::[/COLOR][COLOR=#d4d4d4]sleep([/COLOR][COLOR=#b5cea8]500[/COLOR][COLOR=#d4d4d4]) [/COLOR][COLOR=#608b4e]// give persistence time to catch up[/COLOR]
            [COLOR=#569cd6]val[/COLOR][COLOR=#d4d4d4] AnzahlFenster [/COLOR][COLOR=#d4d4d4]=[/COLOR] [COLOR=#000]gFenster[/COLOR][COLOR=#660].[/COLOR][COLOR=#000]members[/COLOR][COLOR=#660].[/COLOR][COLOR=#000]filter[/COLOR][COLOR=#660]([/COLOR][COLOR=#000]s[/COLOR][COLOR=#660]|[/COLOR][COLOR=#000]s[/COLOR][COLOR=#660].[/COLOR][COLOR=#000]state[/COLOR][COLOR=#660]==[/COLOR][COLOR=#000]OPEN[/COLOR][COLOR=#660]).[/COLOR][COLOR=#000]size[/COLOR]
            Summe_offene_Fenster_Item[COLOR=#d4d4d4].[/COLOR][COLOR=#d4d4d4]postUpdate([/COLOR][COLOR=#569cd6]AnzahlFenster[/COLOR][COLOR=#d4d4d4])[/COLOR]
            [COLOR=#c586c0]end[/COLOR]

            Ohne Gewähr dass das funktioniert... Nur grob als Hilfestellung.
            Zuletzt geändert von halloween; 07.02.2018, 09:18.

            Kommentar


              #21
              Und darf ich Fragen wie das Ganze dann korrekt auszusehen hat?
              Gruß

              Guido

              Kommentar


                #22
                Siehe oben, aber ich weiß nicht, ob das fehlerfrei funktioniert.

                Du musst noch ein Item "Summe_offene_Fenster_Item" anlegen.

                Kommentar


                  #23
                  Ok vielen Dank,
                  ich werde mich da mal rantasten. Die größten Probelme habe ich mit sem Syntax auch in der Items Datei. Ein Leerzeichen zu viel und schon wird sie nicht mehr abgearbeitet.
                  Gruß

                  Guido

                  Kommentar


                    #24
                    Ich würde die erste Rule ändern, denn dann geht immer die Lüftung an, wenn Du ein Fenster öffnest :-)

                    Kommentar


                      #25
                      Du weisst doch nicht, ob das Item "Abzugshaube" nicht nur ein Proxy-Item ist, anhand dessen der Dunstabzug lediglich gesperrt oder freigegeben wird. Unabhängig davon, ob er tatsächlich eingeschaltet ist.

                      Kommentar


                        #26
                        Das stimmt, das weiss ich nicht... Aufgrund der Fragestellung hätte ich jetzt nicht erwartet, dass das ein Proxy ist.

                        Kommentar


                          #27
                          Naja, hast auch wieder recht

                          Kommentar

                          Lädt...
                          X