Ankündigung

Einklappen
Keine Ankündigung bisher.

Zählen offenen Fenster

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

    Zählen offenen Fenster

    Hallo Zusammen,

    Es geht um ein altes Thema "Thema Dunstabzugshaube und Kamin"

    Im Wohn/Küchenbereich gibt es mehrere Fenster. Sowie mindestens eines dieser Fenster offen ist, darf der Motor der Dunstabzugshaube laufen. Sind alle geschlossen halt nicht.

    Ich habe daher alle betroffenen Fenster in eine Gruppe "FensterWZ zusammengefasst.

    Group:Contact:OR(OPEN, CLOSED) FensterWZ "Fenster [(%d)]" <contact>

    Wird diese Gruppe in der Sitemap eingebunden sieht man dann sogar die Anzahl offener Fenster. Das ist schon mal schön.

    Durch Zufall habe ich dazu eine Regel erstellt die wie folgt aussieht.

    rule "Dunstabzugshaube FREI" //wenn ein Element offen ist
    when
    Item FensterWZ received update OPEN
    then
    sendCommand (Abzugshaube, ON)
    end


    rule "Dunstabzugshaube GESPERRT" //wenn alle Elemente geschlossen
    when
    Item FensterWZ received update CLOSED
    then
    sendCommand(Abzugshaube, OFF)
    end



    Somit kann jederzeit ein neuer Fensterkontakt in die Gruppe dazukommen, ohne das ich die Regel anpassen muss. Was mich erstaunt... Das funktioniert sogar. :-)


    Hierzu habe ich nun zwei Anfänger-Fragen:

    1. Ich würde gerne verstehen warum bzw. wie meine Regel funktioniert. Ich finde das sieht nicht sauber aus bzw. mir geht die Logik nicht auf.
    2. Ich hätte lieber die Anzahl offener Kontakte gezählt (Anzahl items in der Gruppe mit Status=open) und über eine IF-Bedingung dann bei Anzahl > 0 das Kommando ON abgesetzt bzw. mit else bei Anzahl = 0 das Kommando OFF. Aber wie setzte ich das um?



    Die Fragen mögen sich blöd anhören weil es ja funktioniert aber ich will es einfach verstehen.


    Viele Grüße,
    Andreas

    #2
    Hi,

    wieso? Das passt doch!

    Alle Kontakte die der Gruppe "FensterWZ" zugeordnet sind, sind ODER verknüpft. Sobald ein Fenster geöffnet wird, wechselt der Status von "FensterWZ" auf "OPEN" und die erste Rule wird getriggert. Öffnest du weitere Fenster, dürfte eigentlich nichts mehr passieren, da die ODER-Bedingung ja bereits erfüllt ist.

    Werden die Fenster geschlossen, passiert solange nichts, bis das letzte Fenster geschlossen wird. Dann wechselt das Ergebnis der ODER-Bedingung on "OPEN" nach "CLOSED" und die zweite Rule wird getriggert.

    Du weißt, was eine ODER-Bedingung ist?

    Gruß,
    thoern

    Kommentar


      #3
      Ja natürlich,

      Jetzt hats klick gemacht :-) Ich glaube ich war heute schon zu lange mit openHAB beschäftigt so das ich den Wald vor lauter Bäumen nicht mehr gesehen hab. Danke.

      Trotzdem und nur aus Neugier würde mich aber schon interessieren, ob ich die Items gefilter auf den Status in einer Schleife durchzählen könnte. Wir würde das aussehen?


      Grüße,
      Andreas

      Kommentar


        #4
        Meinst Du so etwas?
        Code:
        var int Zaehler=0
        Gruppenname?.members.forEach(MyItem|
           if (MyItem.state==ON) {
              Zaehler=Zaehler+1
           })
        Allerdings ist das garnicht nötig, Du kannst auch auf den Zahlenwert der Gruppe zugreifen, das müsste irgendwie so aussehen:
        Code:
        Zaehler=Gruppenname.state as DecimalType
        eventuell auch mit einem .toString am state dran, mit den Typumwandlungen stehe ich etwas auf Kriegsfuß

        Kommentar


          #5
          Allerdings ist das garnicht nötig, Du kannst auch auf den Zahlenwert der Gruppe zugreifen, das müsste irgendwie so aussehen:
          Code:
          Zaehler=Gruppenname.state as DecimalType
          eventuell auch mit einem .toString am state dran, mit den Typumwandlungen stehe ich etwas auf Kriegsfuß
          Hi,

          ich wäre auch an der Anzahl geöffneter Fenster interessiert. Weiß wer, wie der Vorschlag von udo1toni aussehen muss. Ich bekomme es nicht hin und stehe mit diesen Typumwandlungen auch auf Kriegsfuß.
          Diese beiden Lösungen meckert der Designer an, z.B.
          Multiple markers at this line
          - Cannot cast element of sealed type java.lang.String to org.openhab.core.library.types.DecimalType
          - Incompatible types. Expected int or java.lang.Integer but was
          org.openhab.core.library.types.DecimalType
          Code:
          var int fensteroffen
          fensteroffen=gFenster.state.toString as DecimalType
          fensteroffen=gFenster.state as DecimalType

          Kommentar


            #6
            Hallo, hab dazu auch noch eine Frage:

            Oben wurde das mit der ODER-Bedingung ja erklärt. Aber woher weiss Openhab, dass mich Open interessiert und nicht Close?

            Genausogut könnte Openhab ja anzeigen sollen, wenn mindestens eines der Fenster geschlossen ist - also andersherum. Wie müsste man den Code aus dem ersten Post dann anpassen? Derzeit wird ja angezeigt, wenn mindestens ein Fenster offen ist.

            Code:
            [SIZE=10px][COLOR=Navy]Group:Contact:OR(OPEN, CLOSED) FensterWZ "Fenster [(%d)]" <contact>[/COLOR][/SIZE]
            Erkennt Openhab das daran, was an erster Stelle steht? Also müsste mit OR(CLOSED, OPEN) angezeigt werden, wenn mindestens 1 Fenster zu ist?
            Beispiel: Ich möchte in einer Firma überprüfen, ob die Notausgänge alle offen sind. Wenn mindestens einer geschlossen ist, soll "CLOSED" da stehen, nur wenn alle offen sind, soll "OPEN" dran stehen.
            Zuletzt geändert von halloween; 02.06.2015, 07:30.

            Kommentar


              #7
              Moin,

              wenn ich das richtig verstanden habe liegt das an der Reihenfolge von Open, Close in den Klammern. Wenn erst Open steht werden die Opens verodert, wenn erst close steht, dann die Closes.

              Ich habe das bei mir für die Rauchmelder gemacht Group:Contact:OR(CLOSED, OPEN) gDpFireAlert "Feueralarm" <myFire>

              ich habe mir mal eine Liste gemacht, wie sich die einzelnen Stati darstellen. dann kann man mit den Kontakten auch gut umgehen

              1 0
              Switch ON OFF
              Contact CLOSED OPEN
              Thomas

              Kommentar


                #8
                So, und bräuchte jetzt die Anzahl der offenen Fenster in einer Rule. Kommt man an diese Anzahl über das Group Item? Im Sitefile wird es ja immerhin angezeigt ohne großen Aufwand.

                Kommentar


                  #9
                  ungetestet und ohne Gewähr:

                  Du benötigst ein Item
                  Code:
                  Number FensterWZCount "offene Fenster WZ [%d]"
                  und dann noch eine Regel zum Zählen:

                  Code:
                  /**
                   * Count open windows in group.
                   */
                  rule "open window"
                  when
                    Item FensterWZ changed 
                  then
                    logInfo("rules.window.contacts", "Window status changed")
                    var int sum = 0
                    FensterWZ?.members.forEach(window|
                      if (window.state == OPEN) {
                        sum = sum + 1;
                      }
                    )
                    FensterWZCount.postUpdate(sum)
                  end
                  Das sollte eigentlich so passen.

                  Kommentar


                    #10
                    Das müsste auch ohne zählen gehen. Wenn Du im Label der Gruppe ein [%d] einbaust, dann bekommst du in der Anzeige die Anzahl der offenen Fenster. Stellt sich nur die Frage, wie man in den Rules auf den nummerischen Wert zugreift.

                    Kommentar


                      #11
                      Zitat von dibbler42 Beitrag anzeigen
                      Das müsste auch ohne zählen gehen. Wenn Du im Label der Gruppe ein [%d] einbaust, dann bekommst du in der Anzeige die Anzahl der offenen Fenster. Stellt sich nur die Frage, wie man in den Rules auf den nummerischen Wert zugreift.
                      Genau das ist der Punkt. In meinem Sitefile sehe ich ja die Anzahl der offenen Fenster mit dem [%d], aber genau diesen Wert wollte ich in einer Rule verwenden ohne aufwändig eine Zählschleife zu konstruieren.

                      Kommentar


                        #12
                        Also ich habe jetzt mal probiert, aber keine Lösung gefunden. Vielleicht kannst du die Frage ja mal in der Goolge Group stellen.

                        Thomas

                        Kommentar


                          #13
                          Werde ich machen, trotzdem danke Dir!

                          Kommentar


                            #14
                            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]
                            So hatte ich mir das vorgestellt , wobei ich auf sowas nie kommen würde.
                            Wo findet man eigentlich eine Doku über all diese Methoden und Funktionen?

                            Kommentar


                              #15
                              Zitat von staehler Beitrag anzeigen
                              So hatte ich mir das vorgestellt , wobei ich auf sowas nie kommen würde.
                              Wo findet man eigentlich eine Doku über all diese Methoden und Funktionen?

                              Würde mich auch interessieren... Ich sehe hier immer die tollsten Regeln, aber wie man auf sowas kommt ist mir rätselhaft. Meine bisherigen Versuche hab ich alles aus bereits fertigen Regeln weiterentwickelt.

                              Kommentar

                              Lädt...
                              X