Ankündigung

Einklappen
Keine Ankündigung bisher.

Regel Loop bestimmten "val" abrufen

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

    #16
    Zitat von narf Beitrag anzeigen
    Code:
    Rule 'Test': 'intValue' is not a member of 'org.eclipse.smarthome.core.types.State'; line 84, column 13, length 18
    ohne ".intValue()" läuft die Regel wie geplant durch.
    Das hatte ich im Post #7 bereits korrigiert, so wie udotoni1:

    if (i.state instanceof Number && (i.state as Number).intValue() > 90) { sendCommand(i, 0) }
    sendCommand(i,0) hatte ich so gelassen, da auch das KNX-v1-Binding verwendet wird, was auf alten Code hindeutet.

    Tatsächlich sind
    Code:
    if (i.state instanceof Number && (i.state as Number).intValue() > 90) i.sendCommand(0)
    bzw., ja nach Gusto,

    Code:
    if (i.state instanceof Number && (i.state as Number).intValue() > 90) {
        i.sendCommand(0)
    }
    stilistisch die wohl beste Lösungen.
    openHAB 4.2

    Kommentar


      #17
      Kann ich den Thread wieder hochholen?

      Habe heute ein wenig mit Sepia (Sprachsteuerung) rumgespielt, und damit die Sepia Items ansprechen kann muss man in den Tags was machen.

      Aber wie erweitere ich einen Tag?
      Bei einem Raffstore schaut der Tag (down/up) so aus:
      Code:
      [ "139;272" ]
      Nun muss ich irgendwie den Tag
      Code:
      "sepia-room=office"
      da reinpacken.
      Habe folgendes versucht:
      Code:
      [ "139;272" , "sepia-room=office"]
      aber da bekomm ich eine Fehlermeldung
      [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'various-5' failed: For input string: "sepia-room=office" in various
      habs auch versucht "umzudrehen" aber das geht auch nicht. vermutlich sollte ich openHAB irgendwie anweisen, dass er nur bestimmte Tags anspricht? Habs auch mit der Variante versucht, wo für "up", "down" und "sepia-room" ein eigener Tag verwendet wird, aber auch da kommt der Fehler...

      Würde mich freuen, wenn ihr mich hier erleuchtet. 😁
      Zuletzt geändert von narf; 30.05.2022, 19:26.

      Kommentar


        #18
        Ui, da hast du ja einen Zombie wiederbelebt... tatsächlich erinnere ich mich schon nicht mehr daran, hier gepostet zu haben 😮

        Ohne Code-Fragment, in dem der Fehler auftritt, wird man dir nicht helfen können.
        openHAB 4.2

        Kommentar


          #19
          Zitat von Tokamak Beitrag anzeigen
          tatsächlich erinnere ich mich schon nicht mehr daran, hier gepostet zu haben 😮
          ich musste auch bissl suchen bis ich wieder verstanden habe, wie meine Regel entstanden ist 😃

          Zitat von Tokamak Beitrag anzeigen
          Ohne Code-Fragment, in dem der Fehler auftritt, wird man dir nicht helfen können.
          In Anlehnung auf die Tips hier im Thread sieht meine Regel so aus (habe eine "Test" Regel nur mit dem "Auslese-Part" gemacht):
          Code:
          rule "Test"
              when
                  Item Test_Test0815 changed
              then
                      val String[] values=rs_buero.getTags().iterator().next().split( ";")
                      val Integer i_down=Integer::parseInt(values.get(0))
                      val Integer i_up=Integer::parseInt(values.get(1))
                    
                      logInfo("Test", i_down + " " + i_up)
          end
          das funktioniert, wenn das item so aussieht:
          Code:
          Rollershutter   rs_buero               "Büro"                       (gRS_EG, gRSsouth, JalouAuto, sNacht)               [ "139;272" ]
          sobald ich in den eckigen Klammern einen neuen Tag einfüge, kommt der Fehler wie oben gepostet:
          Code:
          Rollershutter   rs_buero               "Büro"                       (gRS_EG, gRSsouth, JalouAuto, sNacht)               [ "139;272", "sepia-room=office" ]
          Es wäre Problem, den ursprünglichen Tag zu ändern (damit man per Rule nur bestimmte Tags ausliest?), falls das Abhilfe schaffen würde.

          Kommentar


            #20
            Okayyy... vorwegschicken muss ich, dass ich mich komplett von der RulesDSL und Java verabschiedet habe und ausschließlich Python bei openHAB verwende. Daher ist der Java-Code unten möglicherweise nicht ausführbar oder fehlerbehaftet.

            Das Problem ist, dass die Tags bei getTags() als Set = Menge zurückkommen. Eine Menge ist nicht sortiert. Daher weißt du nicht, auf welchen Tag du zuerst bei iterator().next() stößt.
            Abhilfe schafft man, indem man die Tags mit Schlüsseln versieht. Daher ist der erste Schritt etwa:


            Code:
            Rollershutter rs_buero "Büro" (gRS_EG, gRSsouth, JalouAuto, sNacht) [ "up=139", "down=272", "office=sepia-room" ]
            Nun musst du in der Rule durch die Tags durchgehen, das jeweils enthaltene Pärchen Key=Value splitten, den Key abfragen, damit du weißt, was sich im Value befindet, und den Wert auswerten:

            Code:
            rule "Test"
                   when
                          Item Test_Test0815 changed
                   then
                          val Iterator<String> iter=rs_buero.getTags().iterator()
                          var Integer i_down=-1
                          var Integer i_up=-1
                          var String room="-"
            
                          while (iter.hasNext()) {
                                 var String[] key_value=iter.next().split("=")
                                 switch (key_value.get(0).toLowerCase()) {
                                        case "up" :
                                               i_up=Integer::parseInt(key_value.get(1))
                                               break;
            
                                        case "down" :
                                               i_down=Integer::parseInt(key_value.get(1))
                                               break;
            
                                        case "office" :
                                               room=key_value.get(1)
                                               break;
                          }
                   }
            
                   logInfo("Test", i_down + " " + i_up + " " + room)
            end
            openHAB 4.2

            Kommentar


              #21
              Hi! Habs mit dem Code versucht, in VS bekomme ich bei
              Code:
              val Iterator<String> iter=rs_buero.getTags().iterator()
              aber die Fehlermeldung:
              Iterator cannot be resolved to a type.(org.eclipse.xtext.diagnostics.Diagnostic.Lin king)

              und weiter unten bei
              Code:
              break;
              die Meldung:
              break cannot be resolved to a type.(org.eclipse.xtext.diagnostics.Diagnostic.Lin king)
              Zuletzt geändert von narf; 01.06.2022, 13:06.

              Kommentar


                #22

                Punkt 1: Es handelt sich hier nicht um Java. openHAB bietet die Rules DSL an, welche ursprünglich auf XTend aufsetzt. XTend wiederum ist in Java programmiert, wodurch die DSL eine gewisse Ähnlichkeit zu Java aufweist, aber es gibt eben auch Unterschiede.
                Punkt 2: Es gibt in der DSL tatsächlich kein break;. Wenn ein case zutrifft, werden die übrigen cases für den vorliegenden Wert nicht mehr abgearbeitet. Was die .iterator() Methode betrifft, so habe ich keinen Schimmer., ob die DSL das so unterstützt.

                Kommentar


                  #23
                  Habe jetzt nochmal den Code von vor 2 Jahren versucht:
                  Code:
                  var Integer i_up=0
                  var Integer i_down=0
                  for (String tag: i.getTags()) {
                  val String[] keyValue=tag.split("=")
                  val value=Integer::parseInt(keyValue.get(1))
                  switch (keyValue.get(0)) {
                  case "up" : i_up=value
                  case "down" : i_down=value
                  }
                  }
                  Bei diesem Code macht wohl die Zeile
                  Code:
                  val value=Integer::parseInt(keyValue.get(1))
                  Probleme, da beim key/value Paar sepia-room=office als value kein Zahlenwert sondern String kommt:
                  [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'various-5' failed: For input string: "office" in various

                  Wenn ich (testweise) den Tag auf "sepia-room=5" ändere läuft die Regel ohne Probleme durch. Bringt mich leider aber nicht ans Ziel...

                  Kommentar


                    #24
                    Zitat von narf Beitrag anzeigen
                    Wenn ich (testweise) den Tag auf "sepia-room=5" ändere läuft die Regel ohne Probleme durch. Bringt mich leider aber nicht ans Ziel...
                    Wenn ich das richtig verstanden habe, dann wird nur bei den keys up und down einen integer-wert hinterlegt. Wenn Du nun auch für alle bzw. auch andere keys versuchst zu parsen dann scheitert das natürlich...

                    Probiere es doch wie folgt: (Beim überfliegen der alten Postings ist mir spontan allerdings nicht wieder ganz klar geworden was eigentlich das Ziel ist)
                    Code:
                    var Integer i_up=0
                    var Integer i_down=0
                    for (String tag: i.getTags()) {
                      val String[] keyValue=tag.split("=")
                      // den value nicht immer parsen, sondern nur für keys hinter denen auch ein integer erwartet wird
                      switch (keyValue.get(0)) {
                        case "up" : i_up=Integer::parseInt(keyValue.get(1))
                        case "down" : i_down=Integer::parseInt(keyValue.get(1))
                      }
                    }

                    Kommentar


                      #25
                      Aah... so ging das mit Xtend 🙃

                      Zum Item

                      Code:
                      Rollershutter rs_buero "Büro" (gRS_EG, gRSsouth, JalouAuto, sNacht) [ "up=139", "down=272", "sepia-room=office" ]
                      kommt dann im Code noch der Raum dazu:

                      Code:
                      var Integer i_up=0
                      var Integer i_down=0
                      var String sepia="-"
                      for (String tag: i.getTags()) {
                          val String[] keyValue=tag.split("=")
                          switch (keyValue.get(0)) {
                              case "up" : i_up=Integer::parseInt(keyValue.get(1)
                              case "down" : i_down=Integer::parseInt(keyValue.get(1)
                              case "sepia-room" : sepia=keyValue.get(1)
                          }
                      }
                      openHAB 4.2

                      Kommentar


                        #26
                        Zitat von wknx Beitrag anzeigen
                        Beim überfliegen der alten Postings ist mir spontan allerdings nicht wieder ganz klar geworden was eigentlich das Ziel ist
                        Die Idee dürfte sein, zusätzliche Informationen über die Tags zu definieren, also z.B. Grenzwerte, die dann aber pro Item individuell gesetzt werden können. Vorteil bei den Tags ist, dass es eindeutig dem Item zugeordnet ist. Die Alternative wäre, solche Einstellungen in einer Hashmap zu verwalten, womit aber kein direkter Bezug mehr zum Item besteht.

                        Kommentar


                          #27
                          Vielen Dank, hat natürlich wunderbar geklappt!

                          Kommentar


                            #28
                            Zitat von udo1toni Beitrag anzeigen
                            zusätzliche Informationen über die Tags zu definieren, also z.B. Grenzwerte, die dann aber pro Item individuell gesetzt werden können.

                            Dann würde ich das doch eher in zwei Schritte trennen (und bedauere mal wieder, dass es - soweit mir bekannt - nicht möglich ist solche Funktionalität in eine selbst definierte Funktion oder gar Klasse auslagern zu können):
                            Code:
                            // tags der Form "key=value" parsen
                            val values = new HashMap<String, String>
                            for (String t: i.getTags()) {
                                val String[] kv = t.split("=")
                                if (kv.length == 2) {
                                    values.put(kv.get(0), kv.get(1))
                                }
                            }
                            
                            // benötigte Werte abrufen:
                            val Integer i_up = Integer.valueOf(values. get("up"))
                            val Integer i_down = Integer.valueOf(values.get("down"))
                            val String sepia = values.get("sepia-room")
                            
                            // Alternativ
                            // benötigte Werte abrufen (mit Standardwert als Fallback)
                            // auch hier ein Fehlerrisiko, wenn typ von value nicht passt
                            val Integer i_up = Integer.valueOf(values. getOrDefault("up", "0"))
                            val Integer i_down = Integer.valueOf(values.getOrDefault("down", "0"))
                            val String sepia = values.getOrDefault("sepia-room", "-")
                            (ungetestet)

                            Kommentar


                              #29
                              Zitat von wknx Beitrag anzeigen
                              Dann würde ich das doch eher in zwei Schritte trennen
                              Wenn man mehrere RollerShutterItems hat, kann man mit Hilfe der Tags alle in einer Rule abfrühstücken. Dazu müsste man dein Beispiel in eine HashMap (Item-Namen) von HashMaps (Key-Value-Pairs) erweitern (HashMap<String, HashMap<String, String>>). So hatte ich es gemacht, als ich noch mit der RulesDSL gearbeitet hatte.

                              und bedauere mal wieder, dass es - soweit mir bekannt - nicht möglich ist solche Funktionalität in eine selbst definierte Funktion oder gar Klasse auslagern zu können
                              Wegen dieser Limitierung - keine Klassen - bin ich zu Python gewechselt, zunächst zum leider inzwischen toten Pferd Jython, nun zu HAPApp.
                              openHAB 4.2

                              Kommentar


                                #30
                                Zitat von Tokamak Beitrag anzeigen
                                Wegen dieser Limitierung - keine Klassen - bin ich zu Python gewechselt, zunächst zum leider inzwischen toten Pferd Jython, nun zu HAPApp.
                                Gibt es zu HAPApp irgendwas offizielles? Mit den ersten Fundstellen aus der OpenHab-Community wirkt das auf mich auch gerade schon wieder nicht vertrauenserweckend :-|

                                Kommentar

                                Lädt...
                                X