Ankündigung

Einklappen
Keine Ankündigung bisher.

Exec Binding: Werte an Script übergeben

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

    #16
    Hi Thomas,

    ja klappt jetzt, das war ja einfach :-)

    Gruss und Danke!!!

    Norbert

    Kommentar


      #17
      Hallo,

      ich grabe den alten Thread mal raus, weil ich ein ähnliches Problem habe.
      Im Rahmen einer Rule kann ich mein Script ausführen, aber als Exec Binding wird es nicht ausgeführt.

      In diesem Thread war es gleich, und konnte mit einer Rule gelöst werden.
      Ich hätte aber lieber das execBinding verwendet, da ich sonst viele Rules schreiben muss.

      ItemDefiniton:
      Code:
       Switch OG_Arbeitszimmer_Decke_Licht_50150     "Licht Arbeitszimmer Decke"		(OG_Arbeitszimmer, Light, Digitalstrom)       	{digitalstrom="dsid:3504175fe000000000011b3b", exec="*:java@@-jar@@d:/openhab/IPS-JSONRPC/IPS-JSONRPC.jar@@convert@@%3$s@@%2$s@@40679"}
      Rule:
      Code:
      rule Digitalstrom
      when
      	Item Digitalstrom received update
      then
      	
      	executeCommandLine("java -jar d:/openhab/IPS-JSONRPC/IPS-JSONRPC.jar convert " + OG_Arbeitszimmer_Decke_Licht_50150.name + " " + OG_Arbeitszimmer_Decke_Licht_50150.state + " 40679")
      end
      Ich habe leider keine Idee mehr woran es liegen könnte. Das ExecBinding ist im AddonsVerzeichnis vorhanden.

      Ich habe beim execBinding auch die neue Schreibweise mit >[] und mit oder ohne @ getestet. Leider ohne Ergebnis.
      Ich bekomme im Log nur den Statusupdate zum Item zu sehen. Vom execBinding ist leider kein Eintrag vorhanden.

      Was mache ich falsch?

      Zur Erklärung: Das Java Script übergibt den Status der Variablen per JSON-RPC an IP-Symcon.

      Danke und Gruß
      Christian

      Kommentar


        #18
        Ist der Pfad zum Java den in beiden Varianten gesetzt, schreib doch testweise mal den kompletten Pfad in die Atem-Definition des Exec-Bindings?

        Kommentar


          #19
          Hallo Jockel,

          vielen Dank für den Tip. Leider war es erfolglos.
          Die Datei wird scheinbar gar nicht aufgerufen. Der Pfad zu Java steht auch in der Path Variablen von Windows, sonst würde es meines Erachtens beim Rule Aufruf auch nicht gehen.


          Gruß
          Christian

          Kommentar


            #20
            Hallo,

            ich habe noch etwas getestet;

            Wenn ich das execBinding alleine konfiguriere wird mein Script ausgeführt.
            Nur wenn ich es in Kombination mit dem Digitalstrom-Binding einsetze geht es nicht, egal in welche Reihenfolge die Einträge sind.

            In Verbindung mit einem Homematic Binding geht es.

            Das sieht für mich aus, wie ein Issue.

            Gruß
            Christian

            Kommentar


              #21
              Hi,
              Wie sieht denn ein von Dir getesteter Eintrag mit homematic aus?

              Gruß
              Hans-Jörg

              Kommentar


                #22
                Hallo Hans-Jörg,

                sieht so aus:
                Code:
                Switch OG_Arbeitszimmer_Decke_Licht_50150     "Licht Arbeitszimmer Decke manuell"		(OG_Arbeitszimmer, Light, Digitalstrom)       	{exec="*:java -jar d:/openhab/IPS-JSONRPC/IPS-JSONRPC.jar convert %3$s %2$s 40679", homematic="id=HEQ0101826, channel=1, parameter=STATE"}
                wobei hier die Reihenfolge der Bindings egal ist.

                Gruß
                Christian

                Kommentar


                  #23
                  Hallo Christian,

                  wenn ich Deine Konfiguration richtig deute, hast Du hier zwei Einträge verwendet, die den Status des Items abfragen (homematic parameter STATE).
                  Beim digitalSTROM binding gibt es keine Parameter, um nur den Status eines Device abzufragen.
                  Wenn ich mich nicht irre, wirst Du in Verbindung mit digitalSTROM Hardware um die Verwendung von Rules für Deinen use-case nicht herumkommen.

                  Viele Grüße
                  Hans-Jörg

                  Kommentar


                    #24
                    Hallo Hans-Jörg,

                    vielen Dank für die Info. Ich verstehe es zwar nicht ganz, da ja im Digitalstrom-Binding, so wie ich es eingetragen haben der Status des Items aktualisiert wird.

                    Ich werde dann wohl den Aufruf über Rules machen.

                    Gruß
                    Christian

                    Kommentar


                      #25
                      Es funktioniert bei mir nur zum Teil... Hier die Ausgabe im Log:

                      Code:
                      2016-06-08 19:06:18.607 [INFO ] [g.openhab.io.net.exec.ExecUtil] - executed commandLine '[python, /home/pi/writemin.py“)
                                                             }
                              else    {
                                  Ladestation.sendCommand(OFF)
                              }
                      end
                      
                      
                      
                      rule „Leistung anpassen“
                      when
                          Item aktLeistungberechnet received update
                      then
                              if (Elektronenpumpe.state==ON)     {
                                                  
                          if (aktLeistungberechnet.state<0 && aktLeistungberechnet.state>-500)    {
                                                                          strom.postUpdate=strom-1
                                                                                  }
                          if (aktLeistungberechnet.state<-500 && aktLeistungberechnet.state>-1500)    {
                                                                  strom.postUpdate=strom-3
                                                                  }
                          if (aktLeistungberechnet.state<-1500)    {
                                              strom.postUpdate=strom-6
                                                                      }
                          if (aktLeistungberechnet.state > 500 && aktLeistungberechnet.state < 1000)    {
                                                                              strom.postUpdate=strom+1
                                                                                          }
                              if (aktLeistungberechnet.state > 1000)    {
                                                          strom.postUpdate=strom+4
                                                                      }
                              if (strom.state > 16)    {
                                                  strom.postUpdate=16
                                                      }
                              if (strom.state < 6)    {
                                                  strom.postUpdate=6
                                                      }
                      
                          executeCommandLine(]'
                      2016-06-08 19:06:18.668 [ERROR] [o.o.c.s.ScriptExecutionThread ] - Error during the execution of rule 'automatisch EIN_AUS': The name '<XBlockExpressionImpl> / <XFeatureCallImplCustom>' cannot be resolved to an item or type.
                      Und hier ein Auszug der Rule:

                      Code:
                      import org.joda.time.*
                      import org.openhab.core.library.types.*
                      import org.openhab.core.persistence.*
                      import org.openhab.model.script.actions.*
                      import org.openhab.model.script.actions.Timer
                      import org.joda.time.DateTime
                      import java.lang.Math
                      
                      var int strom=6
                      
                      
                      
                      rule "automatisch EIN_AUS"
                      when
                              Item Elektronenpumpe changed or
                              Item Manu changed from ON to OFF
                      then
                              if (Elektronenpumpe.state==ON)  {
                                                              Ladestation.sendCommand(ON)
                                                              executeCommandLine("python@@/home/pi/writemin.py“)
                                                              }
                              else    {
                                      Ladestation.sendCommand(OFF)
                                      }
                      end
                      home/pi/writemin.py an sich funktioniert.

                      Kommentar


                        #26
                        Du hast hinten falsche Anführungszeichen genutzt. Das führt dazu, dass bis zum nächsten richtigen Anführungszeichen alles als Bestandteil des Aufrufs interpretiert wird.
                        Code:
                        executeCommandLine("python@@/home/pi/writemin.py[COLOR=#FF0000]“[/COLOR])
                        Achte darauf, ausschließlich das Zoll-Zeichen " zu verwenden (wird eventuell von Deinem Editor automatisch durch andere ersetzt)
                        Zuletzt geändert von udo1toni; 08.06.2016, 20:33.

                        Kommentar


                          #27
                          Danke Udo, schulde Dir nun schon mehr als nur ein Bier..... Ganz funtioniert es noch nicht:

                          Hier das Log:

                          Code:
                          2016-06-09 16:26:01.973 [ERROR] [o.o.c.s.ScriptExecutionThread ] - Error during the execution of rule 'Leistung anpassen': The name '<XFeatureCallImplCustom>.state' cannot be resolved to an item or type.
                          und die Rule

                          Code:
                          import org.joda.time.*
                          import org.openhab.core.library.types.*
                          import org.openhab.core.persistence.*
                          import org.openhab.model.script.actions.*
                          import org.openhab.model.script.actions.Timer
                          import org.joda.time.DateTime
                          import java.lang.Math
                          
                          var int strom=6
                          
                          rule "Leistung anpassen"
                          when
                                  Item aktLeistungberechnet received update                                                                               //wenn Leistungsänderung (wird alle 30s abgefragt)
                          then
                                  if (Manu.state==OFF)    {                                                                                                            //wenn manuelle Ladung aus
                          
                                  if (aktLeistungberechnet.state<0 && aktLeistungberechnet.state>-500)    {                             //wenn aktuelle Leistung zwischen 0 und -500W
                                                                                                          strom.postUpdate=strom.state-1                       //reduziere Stromstärke um 1 Ampere
                                                                                                          }
                                  if (aktLeistungberechnet.state<-500 && aktLeistungberechnet.state>-1500)        {              
                                                                                                                  strom.postUpdate=strom.state-3
                                                                                                                  }
                                  if (aktLeistungberechnet.state<-1500)   {
                                                                          strom.postUpdate=strom.state-6
                                                                          }
                                  if (aktLeistungberechnet.state > 500 && aktLeistungberechnet.state < 1000)      {
                                                                                                                  strom.postUpdate=strom.state+1
                                                                                                                  }
                                  if (aktLeistungberechnet.state > 1000)  {
                                                                          strom.postUpdate=strom.state+4
                                                                          }
                                  if (strom.state > 16)   {                                                                                                                          //begrenze max. Stromstärke auf 16A
                                                          strom.postUpdate=16
                                                          }
                                  if (strom.state < 6)    {                                                                                                                            //begrenze min. Stromstärke auf 6A
                                                          strom.postUpdate=6
                                                          }
                          
                                  executeCommandLine("python@@/home/pi/writeneu.py -v " + strom.state)                                    //sende neue Stromstärke
                                                                   }
                          end
                          Wenn ich
                          Code:
                            pi@raspberrypi:~ $ python writeneu.py -v16
                          eingebe erfolgt die Änderung auf 16.

                          Kommentar


                            #28
                            Es muss heißen strom.postUpdate(strom.state+1) - oder eventuell sogar strom.postUpdate(strom.state as DecimalType + 1) Das Gleichheitszeichen ist jedenfalls falsch.

                            Wenn Du die Bedingungen günstig zusammenstellst, kannst Du sie vereinfachen:
                            Code:
                            if (aktLeistungberechnet.state > 1000) strom.postUpdate=strom.state+4
                            else if (aktLeistungberechnet.state > 500) strom.postUpdate=strom.state+1
                            else if (aktLeistungberechnet.state > 0) strom.postUpdate=strom.state
                            else if (aktLeistungberechnet.state>-500) strom.postUpdate=strom.state-1
                            else if (aktLeistungberechnet.state>-1500) strom.postUpdate=strom.state-3
                            else if (aktLeistungberechnet.state<=-1500) strom.postUpdate=strom.state-6
                            Der Trick ist die streng monoton absteigende Sortierung (andersrum funktioniert es natürlich auch, dann halt immer mit der entgegengesetzten Grenze, wichtig ist nur die sortierte Reihenfolge). Nur wenn die erste Bedingung nicht zutrifft, prüfe die zweite Bedingung (und so weiter)
                            Dadurch wird der Code bedeutend kompakter und sogar besser lesbar. Da Du nur einen Befehl ausführen möchtest, brauchst Du auch keine geschweiften Klammern. das kleiner oder gleich ist für den Fall, dass aktLeistungberechnet exakt -1500 ist, da würde sonst nichts passieren.
                            Zuletzt geändert von udo1toni; 09.06.2016, 17:21.

                            Kommentar


                              #29
                              Nun konnte ich dem System doch noch meinen Willen aufzwingen! Danke!

                              Kommentar


                                #30
                                EDIT: Funktioniert wieder. Habe eine Rule verändert was wohl zu Problemen führte...

                                Nun ja, mein Wille ist wieder gebrochen.... Eigentlich habe ich nichts geändert. Oder kann mich zumindest nicht mehr daran erinnern... Jedenfalls wird der Wert nicht mehr geändert.

                                Im Log zum Beispiel:
                                Code:
                                2016-07-18 12:10:30.068 [INFO ] [g.openhab.io.net.exec.ExecUtil] - executed commandLine '[python, /home/pi/write18.py]'
                                Auszug der Rule:
                                Code:
                                if (strom.state==18) executeCommandLine("python@@/home/pi/write18.py")

                                Frage ich dann den Wert ab, hat sich nichts geändert.
                                Gebe ich folgendes ein
                                Code:
                                pi@raspberrypi:~ $ python write18.py
                                und frag den Wert ab, passt es.
                                Zuletzt geändert von Hasso; 12.08.2016, 14:39. Grund: Problem gelöst

                                Kommentar

                                Lädt...
                                X