Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Python3 Skript in Iobroker einbinden

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Python3 Skript in Iobroker einbinden

    This topic has been deleted. Only users with topic management privileges can see it.
    • rrov1
      rrov1 @Fibs last edited by

      @fibs said in Python3 Skript in Iobroker einbinden:

      @rrov1 Es ist der gleiche Code den du mir oben genannt hast. Er arbeitet den Code bis Zeile 10 durch.

      Hm, also wenn's Zeile 10 ist, dann sehe ich einen kleinen Fehler in dieser. Ersetze sie mal mit:

          print(f"*** call example: {sys.argv[0]} <<Spielfeldlaenge>> <<Spielfeldbreite>> <<Torlänge>>")
      

      Alternativ kommentiere sie aus. In den Zweig kommst du nur, wenn du die Parameter falsch angegeben hast, sprich zu wenig oder zu viele. Es müssen genau 3 Parameter sein, idealer Weise beim manuellen Testen erst mal nur ganze Zahlen. Dann wird dieser Teil des Codes auch nicht aktiv.

      F 1 Reply Last reply Reply Quote 0
      • F
        Fibs @rrov1 last edited by

        @rrov1 Hä warte mal, kann das so überhaupt funktionieren mit den Datenpunkten Spielfeldlaenge, Spielfeldbreite und Torlaenge. Die Variablen in meinem Projekt heißen ja, l,b, und t . Die Namen kommen nur einmal vor und zwar bei der Aufforderung was einzugeben ist.

        rrov1 1 Reply Last reply Reply Quote 0
        • rrov1
          rrov1 @Fibs last edited by

          @fibs Nun, die Zeile 10 wird nur dann aufgerufen, wenn die Anzahl der Parameter falsch ist. Es ist die Ausgabe vom Script die dem aufrufenden Nutzer sagt wie der das Script nutzen soll (vergleichbar mit dem Schalter -h für "Hilfe"). In der Zeile findet keine Zuweisung zu einer Variablen statt. Das passiert in den Zeilen 58, 67 und 76. Alles im grünen Bereich 🙂

          F 1 Reply Last reply Reply Quote 0
          • F
            Fibs @rrov1 last edited by

            @rrov1 Aber grundsätzlich sollen die Motoren starten wenn ich den Button in der visu drücke oder muss ich noch irgendwas beachten?

            rrov1 1 Reply Last reply Reply Quote 0
            • rrov1
              rrov1 @Fibs last edited by

              @fibs ganz genau, erst die 3 Regler einstellen, dann den Button drücken (kannst du später immer noch optimieren). Ich denk auf ioBroker Seite sieht's soweit ganz gut aus wenn ich den letzten Screenshot wo noch der Pfad falsch war lese.

              Läuft das Script jetzt mit der Korrektur der Zeile 10 wenn du es von der Kommandozeile mit 3 sinnvollen Parametern aufrufst?

              F 1 Reply Last reply Reply Quote 0
              • F
                Fibs @rrov1 last edited by Fibs

                @rrov1
                Ich habe Zeile 10 ausgeklammert und das Programm manuell gestartet. Anders funktionierts noch nicht.

                F 1 Reply Last reply Reply Quote 0
                • F
                  Fibs @Fibs last edited by

                  @fibs a5951760-0555-4c92-af62-46467ab3b6b3-image.png
                  Ich habe den Button über Objekte betätigt, das ist e egal oder?

                  rrov1 1 Reply Last reply Reply Quote 0
                  • rrov1
                    rrov1 @Fibs last edited by

                    @fibs said in Python3 Skript in Iobroker einbinden:

                    Ich habe den Button über Objekte betätigt, das ist e egal oder?

                    Ja, ist egal. Das Log ist leider für mich nicht ausreichend um den Fehler zu ermitteln. Kannst du bitte noch mal das Javascript "DC-Motoren_starten" hier bereitstellen? Ich vermute mal es ist mein Script, aber vielleicht müssen wir mal etwas Code einfügen der noch ein bisschen mehr protokolliert. Es fehlt die Ausgabe des exec Aufrufst, das sollte mit "*** stdout:" anfangen und falls ein Fehler auftritt "*** stderr:".

                    Zusätzlich müssen wir wahrscheinlich das Python-Skript auch mal anfassen um zu sehen ob es läuft. Momentan sehen wir ja garnichts, nicht mal das es läuft. Ich ersetze das dann meist erst mal mit was ganz trivialen, was z.B.:

                    print("hello world")
                    

                    Dann wüsste man erst mal ob der Aufruf aus der VIS heraus sauber funktioniert (weil man das ja als stdout zurückbekommt). Dann tastet man sich weiter vor, indem man 90% vom eigentlichen Script auskommentiert, das ausführt und wenn's geht wieder 10% Kommentare entfernt, bis man mal grob eingegrenzt hat wo im Code es hängt.

                    F 1 Reply Last reply Reply Quote 0
                    • F
                      Fibs @rrov1 last edited by

                      @rrov1 ```
                      import sys
                      import RPi.GPIO as GPIO
                      import time
                      import datetime
                      import math

                      Anzahl Argumente prüfen

                      if len(sys.argv) != 4:
                      print("*** Wrong number of script arguments.")
                      print("f*** call example: {sys.argv[0]} <<Spielfeldlaenge>> <<Spielfeldbreite>> <<Torlaenge>>")
                      quit(-1)

                      def is_float(element: any) -> bool:
                      #If you expect None to be passed:
                      if element is None:
                      return False
                      try:
                      float(element)
                      return True
                      except ValueError:
                      return False

                      print("Total arguments passed:", len(sys.argv))

                      in1 = 24
                      in2 = 23 #Motor links
                      en1 = 25

                      in3 = 22
                      in4 = 27#Motor rechts
                      en2 = 17
                      temp1=1
                      #Reifen außen zu außen 45 cm
                      #Reifen innen zu innen 35 cm
                      #Linienbreite 10 cm
                      GPIO.setmode(GPIO.BCM)

                      GPIO.setup(in1,GPIO.OUT)
                      GPIO.setup(in2,GPIO.OUT)
                      GPIO.setup(en1,GPIO.OUT)
                      GPIO.output(in1,GPIO.LOW)
                      GPIO.output(in2,GPIO.LOW)

                      GPIO.setup(in3,GPIO.OUT)
                      GPIO.setup(in4,GPIO.OUT)
                      GPIO.setup(en2,GPIO.OUT)
                      GPIO.output(in3,GPIO.LOW)
                      GPIO.output(in4,GPIO.LOW)

                      p1=GPIO.PWM(en1,1000)
                      p2=GPIO.PWM(en2,1000)

                      p1.start(50) #Motor 1 Startgeschwindigkeit
                      p2.start(50) #Motor 2 Startgeschwindigkeit

                      l = input("Bitte geben Sie die Spielfeldlaenge in cm ein: ")
                      l = float(l)
                      print("Eingegeben wurde: " + str(l))
                      L = l/11
                      print("Benötigte Zeit in s: " + str(L)) # Nur für mich Kontrolle

                      b = input("Bitte geben Sie die Spielfeldbreite in cm ein: ")
                      b = float(b)
                      print("Eingegeben wurde: " + str(l))
                      B = b/11
                      print("Benötigte Zeit in s: " + str(B))

                      t = input("Bitte geben Sie die Torlaenge in cm ein: ")
                      t = float(t)
                      print("Eingegeben wurde: " + str(l))
                      T = t/11

                      s = input("Bitte geben Sie die Entfernung von Torstange zu 16ner Ecke in cm ein: ")
                      s = float(s)
                      print("Eingegeben wurde: " + str(s))
                      S = s/11
                      print("Benötigte Zeit in s: " + str(S))

                      Str1 = datetime.timedelta(seconds=L) # Fährt eingegeben Strecke
                      start = datetime.datetime.now()

                      while datetime.datetime.now()-start < Str1:

                      if(temp1==1):  
                         GPIO.output(in1,GPIO.HIGH)
                         GPIO.output(in2,GPIO.LOW)           #Sprühen
                         GPIO.output(in3,GPIO.HIGH)
                         GPIO.output(in4,GPIO.LOW)
                         print("Str1")
                         time.sleep(1)
                      

                      GPIO.cleanup()

                      F 1 Reply Last reply Reply Quote 0
                      • F
                        Fibs @Fibs last edited by Fibs

                        @fibs said in Python3 Skript in Iobroker einbinden:

                        import sys
                        import RPi.GPIO as GPIO
                        import time
                        import datetime
                        import math
                        Anzahl Argumente prüfen
                        if len(sys.argv) != 4:
                        print("*** Wrong number of script arguments.")
                        print("f*** call example: {sys.argv[0]} <<Spielfeldlaenge>> <<Spielfeldbreite>> <<Torlaenge>>")
                        quit(-1)
                        def is_float(element: any) -> bool:
                        #If you expect None to be passed:
                        if element is None:
                        return False
                        try:
                        float(element)
                        return True
                        except ValueError:
                        return False
                        print("Total arguments passed:", len(sys.argv))
                        in1 = 24
                        in2 = 23 #Motor links
                        en1 = 25
                        in3 = 22
                        in4 = 27#Motor rechts
                        en2 = 17
                        temp1=1
                        #Reifen außen zu außen 45 cm
                        #Reifen innen zu innen 35 cm
                        #Linienbreite 10 cm
                        GPIO.setmode(GPIO.BCM)
                        GPIO.setup(in1,GPIO.OUT)
                        GPIO.setup(in2,GPIO.OUT)
                        GPIO.setup(en1,GPIO.OUT)
                        GPIO.output(in1,GPIO.LOW)
                        GPIO.output(in2,GPIO.LOW)
                        GPIO.setup(in3,GPIO.OUT)
                        GPIO.setup(in4,GPIO.OUT)
                        GPIO.setup(en2,GPIO.OUT)
                        GPIO.output(in3,GPIO.LOW)
                        GPIO.output(in4,GPIO.LOW)
                        p1=GPIO.PWM(en1,1000)
                        p2=GPIO.PWM(en2,1000)
                        p1.start(50) #Motor 1 Startgeschwindigkeit
                        p2.start(50) #Motor 2 Startgeschwindigkeit
                        l = input("Bitte geben Sie die Spielfeldlaenge in cm ein: ")
                        l = float(l)
                        print("Eingegeben wurde: " + str(l))
                        L = l/11
                        print("Benötigte Zeit in s: " + str(L)) # Nur für mich Kontrolle
                        b = input("Bitte geben Sie die Spielfeldbreite in cm ein: ")
                        b = float(b)
                        print("Eingegeben wurde: " + str(l))
                        B = b/11
                        print("Benötigte Zeit in s: " + str(B))
                        t = input("Bitte geben Sie die Torlaenge in cm ein: ")
                        t = float(t)
                        print("Eingegeben wurde: " + str(l))
                        T = t/11
                        s = input("Bitte geben Sie die Entfernung von Torstange zu 16ner Ecke in cm ein: ")
                        s = float(s)
                        print("Eingegeben wurde: " + str(s))
                        S = s/11
                        print("Benötigte Zeit in s: " + str(S))
                        Str1 = datetime.timedelta(seconds=L) # Fährt eingegeben Strecke
                        start = datetime.datetime.now()
                        while datetime.datetime.now()-start < Str1:
                        if(temp1==1): GPIO.output(in1,GPIO.HIGH)
                        GPIO.output(in2,GPIO.LOW)
                        GPIO.output(in3,GPIO.HIGH)
                        GPIO.output(in4,GPIO.LOW)
                        print("Str1") time.sleep(1)
                        GPIO.cleanup()

                        F rrov1 2 Replies Last reply Reply Quote 0
                        • F
                          Fibs @Fibs last edited by Fibs

                          @fibs

                          on({id: "javascript.0.GPIOSteuerung.Ausfuehren", change: "any"}, function (obj) {
                          var Spielfeldlaenge = getState("javascript.0.GPIOSteuerung.Spielfeldlaenge").val;
                          var Spielfeldbreite = getState("javascript.0.GPIOSteuerung.Spielfeldbreite").val;
                          var Torlaenge = getState("javascript.0.GPIOSteuerung.Torlaenge").val;
                          console.log("führe aus: " + 'python3 /Desktop/iobroker/DA/Main.py ' + Spielfeldlaenge + ' ' + Spielfeldbreite + ' ' + Torlaenge)
                          exec('python3 /Desktop/iobroker/DA/Main.py ' + Spielfeldlaenge + ' ' + Spielfeldbreite + ' ' + Torlaenge, function (error, stdout, stderr) {
                          console.log('*** stdout: ' + stdout);
                          if (error !== null) {
                          console.log('*** stderr: ' + error);
                          }
                          });
                          });

                          1 Reply Last reply Reply Quote 0
                          • rrov1
                            rrov1 @Fibs last edited by

                            @fibs Das Python-Skript passt nicht. Zum einen fehlen an verschiedenen Stellen die Einrückungen, wobei ich vermute mal das liegt ein der Einbettung des Codes hier im Forum, zum anderen sind wieder die input()-Funktionsaufrufe drinnen, welche dazu führen, dass das Skript stehen bleibt und auf Eingabe wartet. Ich habe dir noch mal eine Version mit Parametern hier beigelegt: Main.py .
                            Was mir noch aufgefallen ist, du hast jetzt einen vierten Wert den du per input() Abfragst, den habe ich gleich mit als jetzt 4 Parameter eingebaut. Damit brauchst du jetzt auch einen vierten Datenpunkt in ioBroker + einen vierten Parameter im Javascript. Nicht vergessen, sonst geht das nicht.

                            1 Reply Last reply Reply Quote 0
                            • First post
                              Last post

                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            815
                            Online

                            31.8k
                            Users

                            80.0k
                            Topics

                            1.3m
                            Posts

                            3
                            30
                            2035
                            Loading More Posts
                            • Oldest to Newest
                            • Newest to Oldest
                            • Most Votes
                            Reply
                            • Reply as topic
                            Log in to reply
                            Community
                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                            The ioBroker Community 2014-2023
                            logo