Ankündigung

Einklappen
Keine Ankündigung bisher.

Probleme mit erster Rule

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

    #16
    Hallo,

    gibt es eine Regel wann ein Status auf ON OFF geprüft wird und wann auf 1 und 0?

    Ich habe eine Regel welche beim öffnen des Fensters in abängikeit von auf oder zu eine Aktion ausführen soll. Das Item ist als Contact angelegt. wenn ich diese auf ON OFF abfrage, wird die Aktion nicht ausgeführt aber wenn ich das Item auf 1 und 0 Abfrage schon. Beim Switch Item hingegen funktioniert es wieder mit ON OFF.

    also quasi if( fenster.state == 1) funktioniert aber if (fenster.state == ON) funktioniert nicht ?
    Gruß

    Guido

    Kommentar


      #17
      Hallo Höhlenbär,

      das Contact-Item kennt keinen Staus ON oder OFF, sondern nur OPEN und CLOSE.

      Probier's mal damit...

      Andreas

      Kommentar


        #18
        OPEN und CLOSED.

        Wenn man sich nicht sicher ist, was ein Item für Status liefert, kann man im events.log nachschauen.

        Ansonsten liefert Contact OPEN/CLOSED, Switch ON/OFF, String "einen String", Number, Rollershutter und Dimmer liefern immer Zahlen zurück.

        Kommentar


          #19
          Ah OK vielen Dank ich hatte die Hoffnung das man das eifach auf 1 und 0 runterbrechen kann.
          Gruß

          Guido

          Kommentar


            #20
            Hallo,

            ich habe folgende Frage ich bekomme von meiner USV den Status als Number zurück und möchte je nach Empangenen wert. ein String Item beschreiben.
            Der erste Versuch sieht so aus
            Code:
            rule "usv Meldung1"
            
            when
              Item SNMP_Status_APC changed or
            
            then
              if (SNMP_Status_APC == 1) {
                      local_USV_Staus.sendCommand("Unbekannt")  }
                  else if (SNMP_Status_APC == 2) {
                      local_USV_Staus.sendCommand("On Line")  }
            
            end
            Leider wird der String nicht beschrieben. Ich vermute mal des es am Syntax liegt. Wie würde es gehen ein Item mit einem Text zu füllen ?
            Muss ich beim Number Item in der IF Abfrage auch "as number" schreiben ? Oder ist es hier klar das es ein Number ist ?
            Gruß

            Guido

            Kommentar


              #21
              Du hast hier ein OR zuviel:
              Code:
              Item SNMP_Status_APC changed or
              Dann würde ich vor dem IF einfügen
              Code:
              local_USV_Staus.sendCommand("Test")
              und eine Logausgabe von SNMP_Status_APC
              Damit siehst du erstmal wie weit er kommt.
              Holger

              PS: der Wert sollte so abgefragt werden:
              Code:
               
               if (SNMP_Status_APC.state == 1)
              Zuletzt geändert von HolgerW; 09.03.2018, 11:24. Grund: PS hinzugefügt

              Kommentar


                #22
                Eigentlich... sollte der Wert so abgefragt werden:
                Code:
                if (SNMP_Status_APC.state instanceof Number) {
                    if ((SNMP_Status_APC.state as Number) == 1) {
                        local_USV_Status.sendCommand("Unbekannt")
                    }
                    else if ((SNMP_Status_APC.state as Number) == 2) {
                        local_USV_Status.sendCommand("On Line")
                    }
                }
                Das erste if() stellt sicher, dass SNMP_Status_APC auch tatsächlich vom Typ Number ist (wenn das Item noch nie beschrieben wurde, hat es den Status NULL)
                Im weiteren Verlauf wird dann der Status explizit als Number behandelt. Es mag sein, dass dies inzwischen meist auch so funktioniert, dann hat aber openHAB nur stillschweigend das Casting selbst übernommen (und das kann halt schon mal schief gehen).

                Allerdings ist meine Frage: Warum schreibst Du das in ein String Item? Wenn es nur um die Anzeige geht, Du also nicht darauf angewiesen bist, dass Du ein Item mit exakt diesem String als Status hast, ist es wesentlich eleganter, eine Map anzulegen.
                meine.items:
                Code:
                Number SNMP_Status_APC "USV ist [MAP(usvstatus.map):%s]" {snmp="..."}
                ./transform/usvstatus.map:
                Code:
                1=Unbekannt
                2=On Line
                NULL=-
                -=-
                Nur ein Item, keine Rule, trotzdem Klartext. Man beachte, dass der Itemtyp immer noch Number ist!

                Kommentar


                  #23
                  HolgerW

                  Zitat von HolgerW Beitrag anzeigen
                  Du hast hier ein OR zuviel:
                  Code:
                  Item SNMP_Status_APC changed or
                  Das war ein Fehler vom Kopieren. Sorry
                  Zitat von HolgerW Beitrag anzeigen
                  PS: der Wert sollte so abgefragt werden:
                  Code:
                  if (SNMP_Status_APC.state == 1)
                  Ja so funktioniert das Danke

                  udo1toni

                  Ok das mit der Abfrage ist logisch. Schade das es für so etwas keine Doku gibt oder habe ich diese einfach nur nicht gefunden.
                  Aber was passiert wenn das Item dann =NULL ist? Dann wird doch einfach keine Übereinstimmung in den IF abfragen gefunden oder gibt's dann ein Fehler ?

                  Allerdings ist meine Frage: Warum schreibst Du das in ein String Item? Wenn es nur um die Anzeige geht, Du also nicht darauf angewiesen bist, dass Du ein Item mit exakt diesem String als Status hast, ist es wesentlich eleganter, eine Map anzulegen.
                  Ja das mit der Map ist einfacher aber ich möchte die Cometvisu verwenden. Bei dieser könnte mann das natürlich auch über ein Mapping lösen. Allerdings möchte ich das auch noch in eine Mysql Datenbank schreiben. Wenn dort nur die Zahl steht kenne ich irgendwann die Bedeutung nicht mehr, darum möchte ich das gen als Klartext reinschreiben. Oder geht das auch durch ein Mapping ?
                  Gruß

                  Guido

                  Kommentar


                    #24
                    udo1toni

                    wenn ich deine Abfrage nach inctanceof number verwende, bekomme ich folgenden Fehler "Rule 'usv Meldung1': Could not cast 2 to void; line 9, column 11, length 31"

                    Ohne die Abfrage bekomme diesen Fehler nicht.
                    Gruß

                    Guido

                    Kommentar


                      #25
                      Zitat von Höhlenbär Beitrag anzeigen
                      Ja das mit der Map ist einfacher aber ich möchte die Cometvisu verwenden. Bei dieser könnte mann das natürlich auch über ein Mapping lösen. Allerdings möchte ich das auch noch in eine Mysql Datenbank schreiben. Wenn dort nur die Zahl steht kenne ich irgendwann die Bedeutung nicht mehr, darum möchte ich das gen als Klartext reinschreiben. Oder geht das auch durch ein Mapping ?
                      Das war der Punkt, dann geht es leider nur als echtes String Item.
                      was passiert wenn das Item dann =NULL ist? Dann wird doch einfach keine Übereinstimmung in den IF abfragen gefunden oder gibt's dann ein Fehler ?
                      Wenn Du die Abfrage ...instanceof... verwendest, gibt es keine Fehlermeldung. In der obigen Form wird dann einfach kein Wert gesetzt (kann man natürlich noch über eine else Anweisung ergänzen).
                      Da Du explizit nach == 1 und == 2 entscheidest, wird es im Fall == NULL auch bei Dir keine Wertzuweisung geben. Ob eine Fehlermeldung kommt, weiß ich nicht. Das Problem ist hier, dass inzwischen relativ viele Unsauberkeiten beim Programmieren stillschweigend abgefangen werden, das Verhalten hat sich definitiv von Version zu Version geändert, muss man halt ausprobieren. Eigentlich dürfte nie ein wert gecshrieben werden, wenn der State nicht explizit als Number gecastet wird.

                      Kommentar


                        #26
                        Zitat von Höhlenbär Beitrag anzeigen
                        wenn ich deine Abfrage nach inctanceof number verwende
                        weil es instanceof Number heißt exakte Schreibweise, openHAB ist case sensitive.

                        Kommentar


                          #27
                          instanceof Number kenne ich jetzt nicht so, ich verwende immer instance of DecimalType. Aber ich kenne auch nicht alles... Udo weiss da sicher mehr.

                          Die Abfrage macht immer Sinn, denn die direkte Abfrage auf einen Wert schlägt fehl, wenn das Item NULL ist, das muß man also quasi immer prüfen.
                          Bei einer Rule "changed" würde ich aber davon ausgehen das das Item nur auf einen gültigen Wert geändert wird.


                          Holger

                          Kommentar


                            #28
                            Zitat von udo1toni Beitrag anzeigen
                            weil es instanceof Number heißt exakte Schreibweise, openHAB ist case sensitive.
                            Sorry das war nur hier falsch geschrieben für den Versuch hatte ich es aus deinem Post kopiert. Ich habe es auch noch einmal versucht leider mit der gleichen Meldung.
                            Gruß

                            Guido

                            Kommentar


                              #29
                              Zitat von Höhlenbär Beitrag anzeigen
                              Ich habe es auch noch einmal versucht leider mit der gleichen Meldung
                              Das ist sehr seltsam. Bei mir funktioniert das genau so und es gibt keine Fehlermeldung.

                              Spaßeshalber könntest Du nochmal die komplette Rule posten.

                              Kommentar


                                #30
                                Hallo Hier die Rule

                                Code:
                                rule "usv Meldung1"
                                
                                when 
                                      Item SNMP_Status_APC changed  or
                                      Time cron "0 0-59 * * * ?"
                                
                                then 
                                
                                     if (SNMP_Status_APC.state == 1) {
                                          local_USV_Status.sendCommand("Unbekannt")  }
                                      else if (SNMP_Status_APC.state == 2) {
                                          local_USV_Status.sendCommand("On Line")  }
                                      else if (SNMP_Status_APC.state == 3) {
                                          local_USV_Status.sendCommand("Batterie Betrieb")  }
                                      else if (SNMP_Status_APC.state == 4) {
                                          local_USV_Status.sendCommand("on Smart Boost")  }
                                      else if (SNMP_Status_APC.state == 5) {
                                          local_USV_Status.sendCommand("Timed Sleeping")  } 
                                      else if (SNMP_Status_APC.state == 6) {
                                          local_USV_Status.sendCommand("Software Bypass")  }
                                      else if (SNMP_Status_APC.state == 7) {
                                          local_USV_Status.sendCommand("Aus")  }
                                      else if (SNMP_Status_APC.state == 8) {
                                          local_USV_Status.sendCommand("Neustart")  }
                                      else if (SNMP_Status_APC.state == 9) {
                                          local_USV_Status.sendCommand("Switched Bypass")  }
                                      else if (SNMP_Status_APC.state == 10) {
                                          local_USV_Status.sendCommand("Hardware Failure Bypass")  }
                                      else if (SNMP_Status_APC.state == 11) {
                                          local_USV_Status.sendCommand("Sleeping Until Power Returns")  }
                                      else if (SNMP_Status_APC.state == 12) {
                                          local_USV_Status.sendCommand("On Smart Trim")  }                        
                                
                                
                                end
                                Gruß

                                Guido

                                Kommentar

                                Lädt...
                                X