Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Python3 Skript in Iobroker einbinden

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    2.6k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    996

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.3k

Python3 Skript in Iobroker einbinden

Geplant Angeheftet Gesperrt Verschoben JavaScript
30 Beiträge 3 Kommentatoren 3.9k Aufrufe 2 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • F Offline
    F Offline
    Fibs
    schrieb am zuletzt editiert von
    #1

    Hallo, ich habe ein funktionierendes Python3 Skript und möchte dieses im Iobroker einbinden um es von überall aus zu starten zu können. Außerdem möchte ich Parameter eingeben können z.B Strecke da ich 2 Dc Motoren ansteuere. Bitte um Tipps wie ich das durchführe.

    rrov1R arteckA 2 Antworten Letzte Antwort
    0
    • F Fibs

      Hallo, ich habe ein funktionierendes Python3 Skript und möchte dieses im Iobroker einbinden um es von überall aus zu starten zu können. Außerdem möchte ich Parameter eingeben können z.B Strecke da ich 2 Dc Motoren ansteuere. Bitte um Tipps wie ich das durchführe.

      rrov1R Offline
      rrov1R Offline
      rrov1
      schrieb am zuletzt editiert von
      #2

      @fibs Hallo,
      der Javascript Adapter bietet sich da an. Denk dran in der Konfiguration "exec" zu aktivieren.

      Du hast dann die Option mit Javascript den Aufruf durchzuführen:

      on({id: "pfad.0.zum.datenpunkt", change: "any"}, function (obj) {
          exec('python3 /pfad/zum/script.py param1 param2', function (error, stdout, stderr) {
              console.log('*** stdout: ' + stdout);
              if (error !== null) {
                  console.log('*** stderr: ' + error);
              }
          });
      });
      

      oder mit Blockly:
      a643ae1e-6d24-4615-acf6-af7ec4535f79-image.png
      Das kann ich aber nicht, das sollte aber recht selbsterklärend sein.

      Wichtig ist vielleicht noch, das der User unter dem ioBroker läuft natürlich Zugriff auf die Python-Skripte braucht und falls du Module nutzt sollten die für den User auch erreichbar sein.

      Gibt sicher noch andere Optionen, aber bei mir funktioniert das so gut.

      Viel Erfolg,

      rrov1

      F 1 Antwort Letzte Antwort
      0
      • rrov1R rrov1

        @fibs Hallo,
        der Javascript Adapter bietet sich da an. Denk dran in der Konfiguration "exec" zu aktivieren.

        Du hast dann die Option mit Javascript den Aufruf durchzuführen:

        on({id: "pfad.0.zum.datenpunkt", change: "any"}, function (obj) {
            exec('python3 /pfad/zum/script.py param1 param2', function (error, stdout, stderr) {
                console.log('*** stdout: ' + stdout);
                if (error !== null) {
                    console.log('*** stderr: ' + error);
                }
            });
        });
        

        oder mit Blockly:
        a643ae1e-6d24-4615-acf6-af7ec4535f79-image.png
        Das kann ich aber nicht, das sollte aber recht selbsterklärend sein.

        Wichtig ist vielleicht noch, das der User unter dem ioBroker läuft natürlich Zugriff auf die Python-Skripte braucht und falls du Module nutzt sollten die für den User auch erreichbar sein.

        Gibt sicher noch andere Optionen, aber bei mir funktioniert das so gut.

        Viel Erfolg,

        rrov1

        F Offline
        F Offline
        Fibs
        schrieb am zuletzt editiert von
        #3

        @rrov1 Wie genau meinst du das Ich hab jetzt den Code eingefügt und Exec aktiviert aber es passiert nichts. Was sind die nächsten Schritte?

        F 1 Antwort Letzte Antwort
        0
        • F Fibs

          @rrov1 Wie genau meinst du das Ich hab jetzt den Code eingefügt und Exec aktiviert aber es passiert nichts. Was sind die nächsten Schritte?

          F Offline
          F Offline
          Fibs
          schrieb am zuletzt editiert von
          #4

          @fibs said in Python3 Skript in Iobroker einbinden:

          @rrov1 Wie genau meinst du das Ich hab jetzt den Code eingefügt und Exec aktiviert aber es passiert nichts. Was sind die nächsten Schritte? Wie macht man einen Datenpunkt?

          1 Antwort Letzte Antwort
          0
          • F Fibs

            Hallo, ich habe ein funktionierendes Python3 Skript und möchte dieses im Iobroker einbinden um es von überall aus zu starten zu können. Außerdem möchte ich Parameter eingeben können z.B Strecke da ich 2 Dc Motoren ansteuere. Bitte um Tipps wie ich das durchführe.

            arteckA Offline
            arteckA Offline
            arteck
            Developer Most Active
            schrieb am zuletzt editiert von
            #5

            @fibs was macht das script... poste es mal..

            zigbee hab ich, zwave auch, nuc's genauso und HA auch

            F 1 Antwort Letzte Antwort
            0
            • arteckA arteck

              @fibs was macht das script... poste es mal..

              F Offline
              F Offline
              Fibs
              schrieb am zuletzt editiert von Homoran
              #6

              @arteck

              import RPi.GPIO as GPIO          
              import time
              import datetime
              import math
              
              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 Torlänge ein: ")
              t = float(t)
              print("Eingegeben wurde: " + str(l))
              T = t/11
              print("Benötigte Zeit in s: " + str(T))
              
              
              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()
              

              MOD-EDIT: Code in code-tags gesetzt!

              arteckA rrov1R 2 Antworten Letzte Antwort
              0
              • F Fibs

                @arteck

                import RPi.GPIO as GPIO          
                import time
                import datetime
                import math
                
                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 Torlänge ein: ")
                t = float(t)
                print("Eingegeben wurde: " + str(l))
                T = t/11
                print("Benötigte Zeit in s: " + str(T))
                
                
                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()
                

                MOD-EDIT: Code in code-tags gesetzt!

                arteckA Offline
                arteckA Offline
                arteck
                Developer Most Active
                schrieb am zuletzt editiert von arteck
                #7

                @fibs da werden doch nur paar gpio geschaltet.. entweder nimmst du den rpi adapter oder die lösung von @rrov1

                und mach bitte demnächst code in ein code-tag 1d35b628-43da-4cf6-a106-0c3c54f910cc-grafik.png

                zigbee hab ich, zwave auch, nuc's genauso und HA auch

                F 1 Antwort Letzte Antwort
                0
                • arteckA arteck

                  @fibs da werden doch nur paar gpio geschaltet.. entweder nimmst du den rpi adapter oder die lösung von @rrov1

                  und mach bitte demnächst code in ein code-tag 1d35b628-43da-4cf6-a106-0c3c54f910cc-grafik.png

                  F Offline
                  F Offline
                  Fibs
                  schrieb am zuletzt editiert von
                  #8

                  @arteck Kannst du mir erklären wie das mit dem rpi adpater geht ?

                  1 Antwort Letzte Antwort
                  0
                  • F Fibs

                    @arteck

                    import RPi.GPIO as GPIO          
                    import time
                    import datetime
                    import math
                    
                    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 Torlänge ein: ")
                    t = float(t)
                    print("Eingegeben wurde: " + str(l))
                    T = t/11
                    print("Benötigte Zeit in s: " + str(T))
                    
                    
                    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()
                    

                    MOD-EDIT: Code in code-tags gesetzt!

                    rrov1R Offline
                    rrov1R Offline
                    rrov1
                    schrieb am zuletzt editiert von
                    #9

                    @fibs Hallo Fibs,
                    ich denk schon, das es geht, es wird nur nichts passieren, weil du ab Zeile 38 die Funktion input() aufrufst, welche eine interaktive Eingabe erwartet. Dort bleibt das Script dann stehen, weil ja keiner da ist, der an der Kommandozeile was eingibt.

                    Um das Aufrufen des Python-Skriptes und die Javascript Funktion zu prüfen nimm erst mal folgendes, ganz einfache Python-Skript "hello_world.py":

                    print("hello world.")
                    

                    Wenn du nun den Datenpunkt aktivierst sollte dieses ausgeführt werden und im ioBroker Protokoll auch "hello world." zu finden sein.

                    Damit kannst du erst mal sicher sein, das der Javascript teil klappt.

                    Danach musst du die Eingaben in dem Python-Skript entfernen, es muss ohne diese laufen. Du kannst die Daten z.B. per Parameter dem Skript übergeben oder halt fest kodieren.

                    rrov1

                    F 1 Antwort Letzte Antwort
                    0
                    • rrov1R rrov1

                      @fibs Hallo Fibs,
                      ich denk schon, das es geht, es wird nur nichts passieren, weil du ab Zeile 38 die Funktion input() aufrufst, welche eine interaktive Eingabe erwartet. Dort bleibt das Script dann stehen, weil ja keiner da ist, der an der Kommandozeile was eingibt.

                      Um das Aufrufen des Python-Skriptes und die Javascript Funktion zu prüfen nimm erst mal folgendes, ganz einfache Python-Skript "hello_world.py":

                      print("hello world.")
                      

                      Wenn du nun den Datenpunkt aktivierst sollte dieses ausgeführt werden und im ioBroker Protokoll auch "hello world." zu finden sein.

                      Damit kannst du erst mal sicher sein, das der Javascript teil klappt.

                      Danach musst du die Eingaben in dem Python-Skript entfernen, es muss ohne diese laufen. Du kannst die Daten z.B. per Parameter dem Skript übergeben oder halt fest kodieren.

                      rrov1

                      F Offline
                      F Offline
                      Fibs
                      schrieb am zuletzt editiert von
                      #10

                      @rrov1 Ok alles klar, gibt es irgendeine Möglichkeit ein Skript mit Eingabeaufforderung über IoBroker laufen zu lassen?

                      rrov1R 1 Antwort Letzte Antwort
                      0
                      • F Fibs

                        @rrov1 Ok alles klar, gibt es irgendeine Möglichkeit ein Skript mit Eingabeaufforderung über IoBroker laufen zu lassen?

                        rrov1R Offline
                        rrov1R Offline
                        rrov1
                        schrieb am zuletzt editiert von
                        #11

                        @fibs Hallo,

                        ioBroker und Eingabeaufforderung passt in meinen Gedanken grad nicht zusammen. Der ioBroker werkelt im Hintergrund man benutzt eine Webseite auf einem abgesetzten Gerät mit dem man ein Visualisierung aufruft. An die Eingabeaufforderung auf dem ioBroker kommt keiner ran.

                        Wenn ich das benötigen würden, dann würde ich:

                        • 3 Datenpunkte anlegen in denen ich die 3 Werte die du per input() in dem Pyhton Skript abfragst halten kann.
                        • Eine Visualisierung bauen (z.B. vis) mit der ich die 3 Werte setzen/ändern kann
                        • Die 3 Werte aus den Datenpunkten dem Python Skript mitgeben als Parameter.

                        Für den letzten Schritt hier mal (ungetestet) noch die angepassten Skripte:
                        Javascript:

                        on({id: "pfad.0.zum.datenpunkt", change: "any"}, function (obj) {
                            var Spielfeldlaenge = getState("pfad.zur.Spielfeldlaenge").val;
                            var Spielfeldbreite = getState("pfad.zur.Spielfeldbreite").val;
                            var Torlänge = getState("pfad.zur.Torlänge").val;
                            exec('python3 /pfad/zum/script.py ' + Spielfeldlaenge + ' ' + Spielfeldbreite + ' ' + Torlänge, function (error, stdout, stderr) {
                                console.log('*** stdout: ' + stdout);
                                if (error !== null) {
                                    console.log('*** stderr: ' + error);
                                }
                            });
                        });
                        

                        Python (Aufruf: scriptname.py <<Spielfeldlaenge>> <<Spielfeldbreite>> <<Torlänge>>):

                        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("*** call example: {sys.argv[0]} <<Spielfeldlaenge>> <<Spielfeldbreite>> <<Torlänge>>")
                            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 = sys.argv[1]
                        if (not is_float(l)):
                            print(f"error: argument {l} is not a float")
                            quit(-1)
                        l = float(l)
                        print("Eingegeben wurde als Spielfeldlaenge: " + str(l))
                        L = l/11
                        print("Benötigte Zeit in s: " + str(L))   # Nur für mich Kontrolle
                         
                        b = sys.argv[2]
                        if (not is_float(b)):
                            print(f"error: argument {b} is not a float")
                            quit(-1)
                        b = float(b)
                        print("Eingegeben wurde als Spielfeldbreite: " + str(l))
                        B = b/11
                        print("Benötigte Zeit in s: " + str(B))
                         
                        t = sys.argv[3]
                        if (not is_float(t)):
                            print(f"error: argument {t} is not a float")
                            quit(-1)
                        t = float(t)
                        print("Eingegeben wurde als Torlänge: " + str(l))
                        T = t/11
                        print("Benötigte Zeit in s: " + str(T))
                         
                         
                        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()
                        
                        

                        Hoffe das hilft dir weiter.

                        F 1 Antwort Letzte Antwort
                        0
                        • rrov1R rrov1

                          @fibs Hallo,

                          ioBroker und Eingabeaufforderung passt in meinen Gedanken grad nicht zusammen. Der ioBroker werkelt im Hintergrund man benutzt eine Webseite auf einem abgesetzten Gerät mit dem man ein Visualisierung aufruft. An die Eingabeaufforderung auf dem ioBroker kommt keiner ran.

                          Wenn ich das benötigen würden, dann würde ich:

                          • 3 Datenpunkte anlegen in denen ich die 3 Werte die du per input() in dem Pyhton Skript abfragst halten kann.
                          • Eine Visualisierung bauen (z.B. vis) mit der ich die 3 Werte setzen/ändern kann
                          • Die 3 Werte aus den Datenpunkten dem Python Skript mitgeben als Parameter.

                          Für den letzten Schritt hier mal (ungetestet) noch die angepassten Skripte:
                          Javascript:

                          on({id: "pfad.0.zum.datenpunkt", change: "any"}, function (obj) {
                              var Spielfeldlaenge = getState("pfad.zur.Spielfeldlaenge").val;
                              var Spielfeldbreite = getState("pfad.zur.Spielfeldbreite").val;
                              var Torlänge = getState("pfad.zur.Torlänge").val;
                              exec('python3 /pfad/zum/script.py ' + Spielfeldlaenge + ' ' + Spielfeldbreite + ' ' + Torlänge, function (error, stdout, stderr) {
                                  console.log('*** stdout: ' + stdout);
                                  if (error !== null) {
                                      console.log('*** stderr: ' + error);
                                  }
                              });
                          });
                          

                          Python (Aufruf: scriptname.py <<Spielfeldlaenge>> <<Spielfeldbreite>> <<Torlänge>>):

                          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("*** call example: {sys.argv[0]} <<Spielfeldlaenge>> <<Spielfeldbreite>> <<Torlänge>>")
                              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 = sys.argv[1]
                          if (not is_float(l)):
                              print(f"error: argument {l} is not a float")
                              quit(-1)
                          l = float(l)
                          print("Eingegeben wurde als Spielfeldlaenge: " + str(l))
                          L = l/11
                          print("Benötigte Zeit in s: " + str(L))   # Nur für mich Kontrolle
                           
                          b = sys.argv[2]
                          if (not is_float(b)):
                              print(f"error: argument {b} is not a float")
                              quit(-1)
                          b = float(b)
                          print("Eingegeben wurde als Spielfeldbreite: " + str(l))
                          B = b/11
                          print("Benötigte Zeit in s: " + str(B))
                           
                          t = sys.argv[3]
                          if (not is_float(t)):
                              print(f"error: argument {t} is not a float")
                              quit(-1)
                          t = float(t)
                          print("Eingegeben wurde als Torlänge: " + str(l))
                          T = t/11
                          print("Benötigte Zeit in s: " + str(T))
                           
                           
                          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()
                          
                          

                          Hoffe das hilft dir weiter.

                          F Offline
                          F Offline
                          Fibs
                          schrieb am zuletzt editiert von
                          #12

                          @rrov1 Kannst du mir erklären wie und was ich bei der vis einstellen muss

                          rrov1R 1 Antwort Letzte Antwort
                          0
                          • F Fibs

                            @rrov1 Kannst du mir erklären wie und was ich bei der vis einstellen muss

                            rrov1R Offline
                            rrov1R Offline
                            rrov1
                            schrieb am zuletzt editiert von
                            #13

                            @fibs said in Python3 Skript in Iobroker einbinden:

                            @rrov1 Kannst du mir erklären wie und was ich bei der vis einstellen muss

                            Ich wills versuchen. Vielleicht noch als Vorwort, ich persönlich nutze den Adapter vis für die Visualisierung. Warum, weil ich vor 3 Jahren damit angefangen habe und dabei geblieben bin, weil er für meinen Bedarf geeignet ist. Es gibt noch andere Adapter (älterer Vergleich) für die Erstellung von Visualisierungen, aber ich muss gestehen, ich kenne die nicht. Soweit ich beobachtet habe ist eine Folgeversion von vis in Entwicklung.

                            Also ich würde das wie folgt aufsetzen:

                            • 3 Datenpunkte zum abspeichern der Werte und zusätzlich habe ich mal noch einen Datnepunkt zum auslösen des Scriptes eingefügt (brauchen wir noch), einfach in ein neues Javascript einfügen und ausführen, damit die Datenpunkte angelegt sind:

                              createState("GPIOSteuerung.Spielfeldlaenge", {
                              read: true,
                              write: true,
                              name: "Spielfeldlaenge",
                              type: "number",
                              role: "value",
                              desc: "Spielfeldlaenge",
                              def: 0
                              });
                              createState("GPIOSteuerung.Spielfeldbreite", {
                              read: true,
                              write: true,
                              name: "Spielfeldbreite",
                              type: "number",
                              role: "value",
                              desc: "Spielfeldbreite",
                              def: 0
                              });
                              createState("GPIOSteuerung.Torlänge", {
                              read: true,
                              write: true,
                              name: "Torlänge",
                              type: "number",
                              role: "value",
                              desc: "Torlänge",
                              def: 0
                              });
                              createState("GPIOSteuerung.Ausfuehren", {
                              read: true,
                              write: true,
                              name: "Ausfuehren",
                              type: "boolean",
                              role: "button",
                              desc: "GPIO Steuerung ausführen",
                              def: false
                              });
                            • Adapter "Visualisierung" installieren, Lizenz beschaffen (Community Lizenz siehe hier), danach den Editor aufrufen und ein neues Standardprojekt anlegen lassen.
                            • Den Demo-View würde ich löschen und einen neuen, leeren anlegen (das farbliche Design überlasse ich Dir im weiteren, da ist vis sehr flexibel und bietet dementsprechend extrem viele Optionen)
                            • Ab hier nutzen wir pro Datenpunkt 3 Objekte zu Darstellung:
                              1. Ein "basic - HTML" Widget, wo wir einfach nur den Feldnamen reinschreiben damit man weiß, welchen der drei Werte man verändert
                              2. Ein " basic - Number" Widget um den aktuellen Wert des Datenpunktes anzuzeigen. Das Widget ist mit dem korrespondierenden Datenpunkt verbunden.
                              3. Ein "Slider horizontal" Widget um den Wert des Datenpunktes zu ändern. Das Widget ist mit dem korrespondierenden Datenpunkt verbunden.
                            • Dann brauchen wir noch einen Button um das Script auszuführen, dafür taugt ein "Button state" Widget sehr gut.
                            • Das GUI sieht dann so aus (nicht schön vom Design her, aber selten):
                              645ce941-c426-4350-8032-38c0e561b047-image.png
                            • Testen: Slider verschieben sollte sich im Objekt View auf den Datenpunkt auswirken
                            • Ich habe dir mal den fertigen View exportiert, den kannst du im vis Editor auch einfach importieren (testview.txt )
                            • Jetzt noch das Script für den Button zum ausführen (Achtung, neue Version, nicht das alte nehmen):
                            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 /pfad/zum/script.py ' + Spielfeldlaenge + ' ' + Spielfeldbreite + ' ' + Torlaenge)
                                exec('python3 /pfad/zum/script.py ' + Spielfeldlaenge + ' ' + Spielfeldbreite + ' ' + Torlaenge, function (error, stdout, stderr) {
                                    console.log('*** stdout: ' + stdout);
                                    if (error !== null) {
                                        console.log('*** stderr: ' + error);
                                    }
                                });
                            });
                            

                            Damit sollte es gehen, das Python-Skript muss du natürlich noch hinlegen und den Pfad im Javascript anpassen.

                            rrov1

                            F 1 Antwort Letzte Antwort
                            0
                            • rrov1R rrov1

                              @fibs said in Python3 Skript in Iobroker einbinden:

                              @rrov1 Kannst du mir erklären wie und was ich bei der vis einstellen muss

                              Ich wills versuchen. Vielleicht noch als Vorwort, ich persönlich nutze den Adapter vis für die Visualisierung. Warum, weil ich vor 3 Jahren damit angefangen habe und dabei geblieben bin, weil er für meinen Bedarf geeignet ist. Es gibt noch andere Adapter (älterer Vergleich) für die Erstellung von Visualisierungen, aber ich muss gestehen, ich kenne die nicht. Soweit ich beobachtet habe ist eine Folgeversion von vis in Entwicklung.

                              Also ich würde das wie folgt aufsetzen:

                              • 3 Datenpunkte zum abspeichern der Werte und zusätzlich habe ich mal noch einen Datnepunkt zum auslösen des Scriptes eingefügt (brauchen wir noch), einfach in ein neues Javascript einfügen und ausführen, damit die Datenpunkte angelegt sind:

                                createState("GPIOSteuerung.Spielfeldlaenge", {
                                read: true,
                                write: true,
                                name: "Spielfeldlaenge",
                                type: "number",
                                role: "value",
                                desc: "Spielfeldlaenge",
                                def: 0
                                });
                                createState("GPIOSteuerung.Spielfeldbreite", {
                                read: true,
                                write: true,
                                name: "Spielfeldbreite",
                                type: "number",
                                role: "value",
                                desc: "Spielfeldbreite",
                                def: 0
                                });
                                createState("GPIOSteuerung.Torlänge", {
                                read: true,
                                write: true,
                                name: "Torlänge",
                                type: "number",
                                role: "value",
                                desc: "Torlänge",
                                def: 0
                                });
                                createState("GPIOSteuerung.Ausfuehren", {
                                read: true,
                                write: true,
                                name: "Ausfuehren",
                                type: "boolean",
                                role: "button",
                                desc: "GPIO Steuerung ausführen",
                                def: false
                                });
                              • Adapter "Visualisierung" installieren, Lizenz beschaffen (Community Lizenz siehe hier), danach den Editor aufrufen und ein neues Standardprojekt anlegen lassen.
                              • Den Demo-View würde ich löschen und einen neuen, leeren anlegen (das farbliche Design überlasse ich Dir im weiteren, da ist vis sehr flexibel und bietet dementsprechend extrem viele Optionen)
                              • Ab hier nutzen wir pro Datenpunkt 3 Objekte zu Darstellung:
                                1. Ein "basic - HTML" Widget, wo wir einfach nur den Feldnamen reinschreiben damit man weiß, welchen der drei Werte man verändert
                                2. Ein " basic - Number" Widget um den aktuellen Wert des Datenpunktes anzuzeigen. Das Widget ist mit dem korrespondierenden Datenpunkt verbunden.
                                3. Ein "Slider horizontal" Widget um den Wert des Datenpunktes zu ändern. Das Widget ist mit dem korrespondierenden Datenpunkt verbunden.
                              • Dann brauchen wir noch einen Button um das Script auszuführen, dafür taugt ein "Button state" Widget sehr gut.
                              • Das GUI sieht dann so aus (nicht schön vom Design her, aber selten):
                                645ce941-c426-4350-8032-38c0e561b047-image.png
                              • Testen: Slider verschieben sollte sich im Objekt View auf den Datenpunkt auswirken
                              • Ich habe dir mal den fertigen View exportiert, den kannst du im vis Editor auch einfach importieren (testview.txt )
                              • Jetzt noch das Script für den Button zum ausführen (Achtung, neue Version, nicht das alte nehmen):
                              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 /pfad/zum/script.py ' + Spielfeldlaenge + ' ' + Spielfeldbreite + ' ' + Torlaenge)
                                  exec('python3 /pfad/zum/script.py ' + Spielfeldlaenge + ' ' + Spielfeldbreite + ' ' + Torlaenge, function (error, stdout, stderr) {
                                      console.log('*** stdout: ' + stdout);
                                      if (error !== null) {
                                          console.log('*** stderr: ' + error);
                                      }
                                  });
                              });
                              

                              Damit sollte es gehen, das Python-Skript muss du natürlich noch hinlegen und den Pfad im Javascript anpassen.

                              rrov1

                              F Offline
                              F Offline
                              Fibs
                              schrieb am zuletzt editiert von Fibs
                              #14

                              @rrov1 Irgendwo habe ich noch einen Fehler, habe alles so wie oben durchgeführt und bekomme auch keine Fehlermeldungen. Hier noch mein Log vllt findest du noch etwas aber irgendwas passt mit dem pfad nicht aber ich weiß nicht was.

                              2c89ca95-e424-43c4-abe3-06067b8afc8c-image.png

                              rrov1R 1 Antwort Letzte Antwort
                              0
                              • F Fibs

                                @rrov1 Irgendwo habe ich noch einen Fehler, habe alles so wie oben durchgeführt und bekomme auch keine Fehlermeldungen. Hier noch mein Log vllt findest du noch etwas aber irgendwas passt mit dem pfad nicht aber ich weiß nicht was.

                                2c89ca95-e424-43c4-abe3-06067b8afc8c-image.png

                                rrov1R Offline
                                rrov1R Offline
                                rrov1
                                schrieb am zuletzt editiert von
                                #15

                                @fibs Da fehlt ein Leerzeichen zwischen dem Scriptnamen und dem ersten Parameter. Schau mal in meinem Beispiel auf Zeile 6, nach dem ".py", da muss eins hin.

                                F 1 Antwort Letzte Antwort
                                0
                                • rrov1R rrov1

                                  @fibs Da fehlt ein Leerzeichen zwischen dem Scriptnamen und dem ersten Parameter. Schau mal in meinem Beispiel auf Zeile 6, nach dem ".py", da muss eins hin.

                                  F Offline
                                  F Offline
                                  Fibs
                                  schrieb am zuletzt editiert von
                                  #16

                                  @rrov1
                                  Der Log Bereich sieht soweit gut aus. 9f0da957-87b6-4f0c-85b4-28dc14fe0fac-image.png
                                  aber es bewegt sich nichts. Wenn ich das Programm auf dem rpi direkt starte bekomme ich den Fehler "Process ended with exit code 255"

                                  rrov1R 1 Antwort Letzte Antwort
                                  0
                                  • F Fibs

                                    @rrov1
                                    Der Log Bereich sieht soweit gut aus. 9f0da957-87b6-4f0c-85b4-28dc14fe0fac-image.png
                                    aber es bewegt sich nichts. Wenn ich das Programm auf dem rpi direkt starte bekomme ich den Fehler "Process ended with exit code 255"

                                    rrov1R Offline
                                    rrov1R Offline
                                    rrov1
                                    schrieb am zuletzt editiert von
                                    #17

                                    @fibs Da wird's schwierig. Da ich grad keinen RPI zu Hand habe kann ich das auch nicht vollumfänglich testen, mein ioBroker läuft auf x86. Ich habe das Python-Skript von dir mal ausgeführt ohne RPI/GPIO spezifisches, das scheint sauber zu laufen. Neben der Fehlermeldung, in welcher Zeile tritt denn der Fehler auf? Ist es noch der gleiche Python Code wie weiter oben?

                                    F 1 Antwort Letzte Antwort
                                    0
                                    • rrov1R rrov1

                                      @fibs Da wird's schwierig. Da ich grad keinen RPI zu Hand habe kann ich das auch nicht vollumfänglich testen, mein ioBroker läuft auf x86. Ich habe das Python-Skript von dir mal ausgeführt ohne RPI/GPIO spezifisches, das scheint sauber zu laufen. Neben der Fehlermeldung, in welcher Zeile tritt denn der Fehler auf? Ist es noch der gleiche Python Code wie weiter oben?

                                      F Offline
                                      F Offline
                                      Fibs
                                      schrieb am zuletzt editiert von
                                      #18

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

                                      rrov1R 1 Antwort Letzte Antwort
                                      0
                                      • F Fibs

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

                                        rrov1R Offline
                                        rrov1R Offline
                                        rrov1
                                        schrieb am zuletzt editiert von
                                        #19

                                        @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 Antwort Letzte Antwort
                                        0
                                        • rrov1R rrov1

                                          @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 Offline
                                          F Offline
                                          Fibs
                                          schrieb am zuletzt editiert von
                                          #20

                                          @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.

                                          rrov1R 1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          703

                                          Online

                                          32.6k

                                          Benutzer

                                          82.3k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe