Ankündigung

Einklappen
Keine Ankündigung bisher.

Rollladen-Status Rule löst nicht aus

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

    Rollladen-Status Rule löst nicht aus

    Hallo Leute,

    ich habe alle meine KNX Rollladen in OH2 eingebunden und lasse sie automatisch per CRON und per Sonnenstand öffnen/schließen. Soweit so gut. Jetzt möchte ich ein paar Rules bauen, welche auf Positionsstatis wie 0 oder 100 reagieren.

    Folgende Beispiele habe ich getestet, funktionieren aber leider nicht.
    Code:
    rule "ROLLER: TEST geschlossen"
    when
        Item Rollladen_TEST changed to 100
    then
    ...
    oder

    Code:
    rule "ROLLER: TEST geschlossen"
    when
        Item Rollladen_TEST changed
    then
        if ( Rollladen_TEST.state == 100 ) {
    Beide Rules werden nicht aktiviert.

    Vielleicht jemand eine Idee? Oder habe ich da irgendwie einen Denkfehler?

    #2
    Ist das Item auch ein Number Item ?

    Ist es auch auf 100 gesetzt ?

    MfG

    Kommentar


      #3
      Die Items sind nach diesem Schema angelegt:
      Code:
      Rollershutter Rollladen_TEST        "Rollladen TEST [%d%%]"        <rollershutter>        (gRoller)        {knx="2/0/0,2/0/20,<2/0/60"}
      die Item-Abfrage ergibt:
      Code:
      openhab> items | grep Roll
      Rollladen_TEST (Type=RollershutterItem, State=100, Label=Rollladen TEST, Category=rollershutter, Groups=[gRoller])

      Kommentar


        #4
        Hallo,

        ein paar Tipps / Ideen:

        Aus Erfahrung: eine Rule wird bei "changed" nicht getrigget, wenn wiederholt der gleiche Wert hineingeschrieben wird. In dem Fall (und vor allem zum Testen) verwende ich "received update".
        In beiden Code-Stücken ist der Name der Rule gleich. Dies funktioniert (auch in unterschiedlichen *.rules-Files) nicht.
        Ist das Zeilenendzeichen ein einfachen LF (wie bei Unix)?

        Hast du mit "logInfo" dir mal Werte aus der Rule ausgeben lassen? Gibt es Fehler in "openhab.log"?
        Im 2. Code-Stück die if-Abfrage zu:
        Code:
         if ( ((Rollladen_TEST.state as DecimalType).floatValue()) > 99)
        ändern.

        Kommentar


          #5
          Wenn Du auf ein Number Item per changed triggern willst, gibt es zwei Probleme, beide hast Du zielsicher getroffen.

          1. changed to funktioniert nur mit "echten" Status, nicht mit Zahlen und schon gar nicht mit Strings.
          Code:
          Item changed to ON //geht
          Item changed to "ON" //geht nicht!!!
          Item changed to 100 //geht nicht
          2. Die zweite Rule triggert zwar bei jedem Change, also Wertänderung, aber Du vergleichst einen Status mit einer Zahl. Eine Zahl ist kein Status.
          So sollte es funktionieren:
          Code:
          rule "ROLLER: TEST geschlossen"
          when
             Item Rollladen_TEST changed
          then
             if ( [COLOR=#FF0000]([/COLOR]Rollladen_TEST.state [COLOR=#FF0000]as Number)[/COLOR] == 100 ) {
          ...
          }
          end
          Es kann auch nötig sein, ein .intValue an das Type Casting anzuhängen, damit der Wert sicher als Integer verwendet wird (kommt etwas auf die Version von OH an, da wurde mehrfach optimiert).
          Ob die Rule wie vorgesehen funktioniert kann man am besten ausprobieren, indem man mit logInfo("loggername","Log Statement") gezielt eine Ausgabe in openhab.log erzeugt.

          Diese Rule wird jedesmal triggern, wenn sich der Status ändert. Es bietet sich an, in dieser Rule gleich mehrere abzufragende Fälle zu erfassen, entweder mit mehreren if() Statements oder auch (bei exakten Werten) mit switch case.
          Code:
          if((Rollladen_TEST.state as Number) == 100) {}  //Status == 100
          else if((Rollladen_TEST.state as Number) < 100 && (Rollladen_TEST.state as Number) > 75) {}  //  75 < Status < 100
          else {}  // Status <= 75
          
          ...
          
          switch (Rollladen_TEST.state as Number) {
              case 100: {}  //Status == 100
              case 75: {}   //Status == 75
              case 50: {}   //Status == 50
              case default: {}  // alle anderen Status
          }
          Rollladenaktoren sollten eigentlich mit vier GA angebunden werden: Auf/Ab, Stopp, Absolute Position setzen+<Absolute Position lesen. Ansonsten wird eventuell eine falsche Position angezeigt, sobald der Laden mit einem knx-Taster verfahren wird, oder es ist nicht möglich, den Rollladen auf eine absolute Position fahren zu lassen.
          Zuletzt geändert von udo1toni; 14.11.2017, 18:19.

          Kommentar


            #6
            Danke für schon mal für eure Tipps

            Ich habe mal eben meine IF-Abfrage wie folgt modifiziert:
            Code:
            rule "ROLLER: Test geschlossen"
            when
                    Item Rollladen_TEST changed
            then
                    if ( AutoMode.state == ON ) {
                            if ( ( Rollladen_TEST.state as Number ) == 100 ) {
                                    logInfo( "roller.rules", "ROLLER: TEST geschlossen" )
                            }
                    }
            end
            in der openhab.log gibt es dann einen Fehler:
            Code:
            [ERROR] [.script.engine.ScriptExecutionThread] - Rule 'ROLLER: TEST geschlossen': An error occured during the script execution: The name 'Rollladen_TEST' cannot be resolved to an item or type.
            Mit heiko74 Beispiel mit ...as DeciamalType).floatValue()... klappt es auch nicht.

            Zitat von udo1toni Beitrag anzeigen
            Es kann auch nötig sein, ein .intValue an das Type Casting anzuhängen, damit der Wert sicher als Integer verwendet wird (kommt etwas auf die Version von OH an, da wurde mehrfach optimiert).
            ...wie meinst du das?


            ...und nein, diese Funktion gibt es nur einmal, ich wollte oben nur meine verschiedenen Test aufzeigen.
            Zuletzt geändert von netzlaff; 15.11.2017, 11:29.

            Kommentar


              #7
              Zitat von netzlaff Beitrag anzeigen
              ...wie meinst du das?
              Na so:
              Code:
              if((Rollladen_TEST.state as Number).intValue == 100)
              Aber wenn er schon Rollladen_TEST nicht als Item erkennt... (cannot be resolved to an item...)

              Bearbeitest Du Deine Files mit dem Smarthome Designer? Alternativ könnntest Du auch VSCode mit dem openHAB Plugin nutzen, wobei der Designer immer noch besser bei der Fehlererkennung ist.
              Ich könnte mir als einzigen Punkt noch vorstellen, dass openHAB sich am Doppelpunkt im Rulenamen stört.

              Kommentar


                #8
                Ich ziehe meine letzte Behauptung zurück. Da war in meiner Test-Rule wirklich ein Tippfehler. Mit folgender If-Klausel funktioniert es nun:
                Code:
                if ( ( Rollladen_TEST.state as Number ) == 100 ) {
                Ich bearbeite meine Dateien mit vi.

                Das einzig komische ist, wenn das Item den Befehl DOWN erhält, bekommt das Item sofort 100 als state. Wenn beispielsweise ein STOP geschaltet wird, erhält das Item beispielsweise 44 (für %). Ist das logisch?

                Kommentar


                  #9
                  Ja, das ist durchaus logisch. openHAB erzeugt bei sendComand automatisch auch ein postUpdate. Wenn das nicht erwünscht ist, musst Du in der Itemdefinition zusätzlich ein Dummy-Binding autoupdate="false" eintragen:
                  Code:
                  Rollershutter MeinLaden "Mein Laden [%d%%]" {knx="1/1/1,1/1/2,1/1/3+<1/1/4",autoupdate="false"}

                  Kommentar


                    #10
                    Danke, das teste ich nochmal. Vielel Dank für eure Hilfe.

                    Kommentar

                    Lädt...
                    X