Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Python Script ausführen (GPIO)

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Python Script ausführen (GPIO)

    This topic has been deleted. Only users with topic management privileges can see it.
    • M
      mimquadrat last edited by

      Hallo Leute,

      ich komm mal wieder mit meinem Thema an…

      Ich habe an ein IKEA Rollo einen Schrittmotor den ich über den Raspi ansteuere. Bis jetzt leider immer nur manuell über SSH.

      Ich wollte jetzt dieses script entweder mit nodered starten oder in nodered einbauen.

      IoBroker läuft im Mutierst (der Schrittmotor also auf einem slave iobroker).

      Hier wäre noch das script zum Hochfahren zB:

      #!/usr/bin/env python

      import RPi.GPIO as GPIO

      import time

      GPIO.setmode(GPIO.BOARD)

      ControlPin = [7,11,13,15]

      for pin in ControlPin:

      GPIO.setup(pin,GPIO.OUT)

      GPIO.output(pin,0)

      seq = [ [1,0,0,1],

      [0,0,0,1],

      [0,0,1,1],

      [0,0,1,0],

      [0,1,1,0],

      [0,1,0,0],

      [1,1,0,0],

      [1,0,0,0] ]

      for i in range (4500):

      for halfstep in range(8):

      for pin in range(4):

      GPIO.output(ControlPin[pin], seq[halfstep][pin])

      time.sleep(0.001)

      GPIO.cleanup()

      vielen dank für Eure Hilfe!

      PS: Interessant wäre doch, eigene Nodes zu den ganzen billig Aktoren und Sensoren für den Raspi zu machen (Motoren, ultraschallsensoren, feuchte- und tempfühler, kleine displays,…

      1 Reply Last reply Reply Quote 0
      • Bluefox
        Bluefox last edited by

        Ich muss anschauen, ob es mit rpi-out node geht.

        So sollte es aber auch gehen:

        `[{"id":"6f5fe60c.90a018","type":"inject","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":91,"y":38,"z":"d8cc32bf.2733d","wires":[["f53fa777.0ac058"]]},{"id":"f53fa777.0ac058","type":"function","name":"Control PINS","func":"// Warning:\n// to use rpi-gpi add to /opt/iobroker/node_modules/iobroker.node-red/userdata/settings.js\n\n// functionGlobalContext: {\n//    gpio: require(\"rpi-gpio\")\n// }\n\nvar gpio = context.global.gpio;\n\nvar controlPin = [7,11,13,15];\n\nvar debug = \"\";\n// Create dummy functions to test\nif (!gpio) {\n    debug = \"THIS IS DEBUG. NO PINS CONTROLLED\";\n    gpio = {\n        write: function (pin, val, cb) {\n            if (cb) cb();\n        },\n        setup: function (pin, dir, cb) {\n            if (cb) cb();\n        },\n        destroy: function (cb) {\n            if (cb) cb();\n        }\n    };\n} else {\n    \n}\n\n\n// write one value to all pins\nfunction _write(values, callback) {\n    var _ready = values.length;\n    debug += \"\\nWrite values \" + JSON.stringify(values);\n    for (var i = 0; i < values.length; i++) {\n        gpio.write(controlPin[i], values[i], function () {\n            _ready--;\n            if (!_ready && callback) callback();\n        });\n    }\n}\n\n// write whole sequense\nfunction write(_sequense, i, callback) {\n    if (i >= _sequense.length) {\n        if (callback) callback();\n        return;\n    }\n    _write(_sequense[i], function () {\n        setTimeout(function () {\n            write(_sequense, i + 1, callback);\n        }, 0);\n    })\n}\n\nvar sequense = [ \n    [true,  false, false, true],\n    [false, false, false, true],\n    [false, false, true,  true],\n    [false, false, true,  false],\n    [false, true,  true,  false],\n    [false, true,  false, false],\n    [true,  true,  false, false],\n    [true,  false, false, false]\n];\n\n// Init outputs of all pins\nnode.log(\"Init outputs of all pins\");\nvar ready = controlPin.length;\nfor (var i = 0; i < controlPin.length; i++) {\n    gpio.setup(controlPin[i], gpio.DIR_OUT, function () {\n        ready--;\n        if (!ready) {\n            debug += \"\\nWrite sequence\";\n            write(sequense, 0, function () {\n                gpio.destroy(function () {\n                    debug += \"\\nfinished\";\n                    node.send({payload: debug});\n                });\n            });\n        }\n    });\n}\n\nreturn;","outputs":1,"valid":true,"x":283,"y":47,"z":"d8cc32bf.2733d","wires":[["b9b52194.464ae"]]},{"id":"b9b52194.464ae","type":"debug","name":"","active":true,"console":"false","complete":"false","x":542,"y":35,"z":"d8cc32bf.2733d","wires":[]}]`
        
        Man muss nur noch "/opt/iobroker/node_modules/iobroker.node-red/userdata/settings.js" erweitern mit:
        `~~[code]~~...
        functionGlobalContext: {
           gpio: require("rpi-gpio")
        }
        ...[/code]`[/i][/i][/i][/i]
        
        1 Reply Last reply Reply Quote 0
        • M
          mimquadrat last edited by

          hab ich versucht - klappt leider nicht.

          der einfachere weg wäre, das python script auszuführen das auf diesem Raspi lokal gespeichert ist - aber nicht mal DAS krieg ich hin 😞

          EDIT:

          ich habe das hier:

          functionGlobalContext: {

          gpio: require("rpi-gpio")

          }

          in die settings.js eingefügt, aber nach einem neustart ist das immer wieder weg! Hab Root Rechte!

          EDIT2:

          Aber bitte lieber Bluefox: halte dich mit so nem sch… nicht auf! Du hast wichtigere Sachen vor Dir :)! Spasiva!

          1 Reply Last reply Reply Quote 0
          • Bluefox
            Bluefox last edited by

            Python kann man in javascript adapter einfach ausführen lassen:

            http://stackoverflow.com/questions/2097 … om-node-js

            Einfach

            createState('startPython');
            on({id: 'startPython', change: 'any'}, function (obj) {
               if (obj.newState.val === 'true' || obj.newState.val === true) {
                 var python = require('child_process').spawn('python',
                 // second argument is array of parameters, e.g.:
                 ["/home/me/pythonScript.py"]);
                 python.stdout.on('data', function(){ log(data); });
                 python.on('close', function(code){ 
                   if (code !== 0) {  
                         log('Error: ' + code); 
                   } else {
                         log('OK');
                   }
                 });
            
              }
            });
            
            
            1 Reply Last reply Reply Quote 0
            • S
              starfish last edited by

              nach obigem Script versuche ich mein Python-Programm auszuführen, welches bei Aufruf per modbus Daten von meinem Instrument abholt. In der Konsole funktioniert das wie gewünscht, der Wert wird auf der Konsole ausgegeben. Beim javascript Aufruf haperts aber noch ein bisschen.

              (python script name ist natürlich angepasst) - wenn ich richtig verstanden habe, sollte die Konsolenausgabe stdout in iobroker eingelesen werden?

              Dabei ist mir nicht klar wie

              1. das Script getriggert wird, dies sollte in regelmässigen Intervall geschehen.

              2. ich die Daten auslesen kann (wohl unter Javascript.0 … aber dort steht kein Wert)

              Kann mir jemand auf die Sprünge helfen?

              1 Reply Last reply Reply Quote 0
              • Bluefox
                Bluefox last edited by

                @starfish:

                nach obigem Script versuche ich mein Python-Programm auszuführen, welches bei Aufruf per modbus Daten von meinem Instrument abholt. In der Konsole funktioniert das wie gewünscht, der Wert wird auf der Konsole ausgegeben. Beim javascript Aufruf haperts aber noch ein bisschen.

                (python script name ist natürlich angepasst) - wenn ich richtig verstanden habe, sollte die Konsolenausgabe stdout in iobroker eingelesen werden?

                Dabei ist mir nicht klar wie

                1. das Script getriggert wird, dies sollte in regelmässigen Intervall geschehen.

                2. ich die Daten auslesen kann (wohl unter Javascript.0 … aber dort steht kein Wert)

                Kann mir jemand auf die Sprünge helfen? `
                Es war ein Fehler im Kode:

                So konnte es aussehen. Alle 5 Minuten:

                createState('pythonResult', '');
                schedule("*/5 * * * *", function () {
                     var python = require('child_process').spawn('python',
                     // second argument is array of parameters, e.g.:
                     ["/home/me/pythonScript.py"]);
                     var result = '';
                     python.stdout.on('data', function(){ result += data.toString(); });
                     python.on('close', function(code){ 
                       if (code !== 0) {  
                             log('Error: ' + code); 
                       } else {
                             log(result);
                             setState('pythonResult', result, true);
                       }
                     });
                });
                

                Ergebnis dann in javascript.0.pythonResult

                1 Reply Last reply Reply Quote 0
                • S
                  starfish last edited by

                  hallo bluefox, danke für die Antwort,

                  jetzt läuft wenigstens etwas, aber wohl nicht das erwünschte:

                  odroid 2015-06-03 23:29:01 error host.odroid instance system.adapter.javascript.0 terminated with code 6 (uncaught exception)

                  in javascript.0.pythonResult steht kein Wert

                  der manuelle Aufruf:

                  root@odroid:/# python /root/strom.py

                  2.36

                  (Skript angepasst)

                  1 Reply Last reply Reply Quote 0
                  • S
                    starfish last edited by

                    … ich komm nicht weiter

                    wenn ich die variable data initialisiere var data = ' ';

                    dann verschwindet die Meldung uncaught exception

                    initialisiere ich mit irgendeinem Wert, wird der auch unter javascript.0.pythonResult angezeigt.

                    irgendwie funktioniert die Datenübergabe via stdout nicht, aber da blick ich zuwenig durch

                    1 Reply Last reply Reply Quote 0
                    • Y
                      ykuendig last edited by

                      @Bluefox:

                      Es war ein Fehler im Kode:

                      So konnte es aussehen. Alle 5 Minuten:

                      gekürzt...
                           var python = require('child_process').spawn('python',
                           // second argument is array of parameters, e.g.:
                           ["/home/me/pythonScript.py"]);
                      gekürzt...
                      
                      ```` `  
                      

                      Versuch mal den 'unbuffered' Parameter -u mitzugeben…

                      Singemäss:

                      ["/home/me/pythonScript.py"], '-u');
                      
                      
                      1 Reply Last reply Reply Quote 0
                      • S
                        starfish last edited by

                        hallo Yves - schade, gleiches Bild

                        ! inMem 2015-06-05 12:49:04 debug message * system.adapter.javascript.0.alive val=true, ack=true, ts=1433501344, from=system.adapter.javascript.0, lc=1433500654
                        ! javascript-0 2015-06-05 12:49:00 info script.js.modbusstrom: 12
                        ! inMem 2015-06-05 12:48:00 debug message * javascript.0.pythonResult val=12, ack=true, ts=1433501281, from=system.adapter.javascript.0, lc=1433501161
                        wobei 12 der Wert ist, den ich manuell vorinitialisiert hab.

                        ohne var data = '12'; siehts so aus

                        ! odroid 2015-06-05 13:00:00 error host.odroid instance system.adapter.javascript.0 terminated with code 6 (uncaught exception)
                        ! odroid 2015-06-05 12:59:30 info host.odroid instance system.adapter.javascript.0 started with pid 12531
                        ! host-odroid 2015-06-05 12:59:00 info Restart adapter system.adapter.javascript.0 because enabled
                        ! host-odroid 2015-06-05 12:59:00 error instance system.adapter.javascript.0 terminated with code 6 (uncaught exception)
                        ! inMem 2015-06-05 12:59:00 debug message * javascript.0.pythonResult val=, ack=true, ts=1433501940, from=system.adapter.javascript.0, lc=1433501940
                        ! javascript-0 2015-06-05 12:59:00 info script.js.modbusstrom:
                        ! ReferenceError: 2015-06-05 12:59:00 error at Pipe.onread (net.js:526:21)
                        ! ReferenceError: 2015-06-05 12:59:00 error at Socket.Readable.push (_stream_readable.js:127:10)
                        ! ReferenceError: 2015-06-05 12:59:00 error at readableAddChunk (_stream_readable.js:165:9)
                        ! ReferenceError: 2015-06-05 12:59:00 error at emitReadable (stream_readable.js:404:5)
                        ! ReferenceError: 2015-06-05 12:59:00 error at emitReadable
                        (_stream_readable.js:408:10)
                        ! ReferenceError: 2015-06-05 12:59:00 error at Socket.EventEmitter.emit (events.js:92:17)
                        ! ReferenceError: 2015-06-05 12:59:00 error at Socket. (_stream_readable.js:746:14)
                        ! ReferenceError: 2015-06-05 12:59:00 error at Socket.EventEmitter.emit (events.js:95:17)
                        ! ReferenceError: 2015-06-05 12:59:00 error at Socket. (script.js.modbusstrom:9:57)
                        ! ReferenceError: 2015-06-05 12:59:00 error data is not defined
                        ! uncaught 2015-06-05 12:59:00 error exception: data is not defined

                        1 Reply Last reply Reply Quote 0
                        • Y
                          ykuendig last edited by

                          Ich bin mir sowieso nicht sicher, ob das nicht besser mit exec als mit spawn gemacht werden sollte ?

                          Vielleicht weiss Bluefox da mehr.

                          1 Reply Last reply Reply Quote 0
                          • Bluefox
                            Bluefox last edited by

                            @starfish:

                            hallo Yves - schade, gleiches Bild

                            ! inMem 2015-06-05 12:49:04 debug message * system.adapter.javascript.0.alive val=true, ack=true, ts=1433501344, from=system.adapter.javascript.0, lc=1433500654
                            ! javascript-0 2015-06-05 12:49:00 info script.js.modbusstrom: 12
                            ! inMem 2015-06-05 12:48:00 debug message * javascript.0.pythonResult val=12, ack=true, ts=1433501281, from=system.adapter.javascript.0, lc=1433501161
                            wobei 12 der Wert ist, den ich manuell vorinitialisiert hab.

                            ohne var data = '12'; siehts so aus

                            ! odroid 2015-06-05 13:00:00 error host.odroid instance system.adapter.javascript.0 terminated with code 6 (uncaught exception)
                            ! odroid 2015-06-05 12:59:30 info host.odroid instance system.adapter.javascript.0 started with pid 12531
                            ! host-odroid 2015-06-05 12:59:00 info Restart adapter system.adapter.javascript.0 because enabled
                            ! host-odroid 2015-06-05 12:59:00 error instance system.adapter.javascript.0 terminated with code 6 (uncaught exception)
                            ! inMem 2015-06-05 12:59:00 debug message * javascript.0.pythonResult val=, ack=true, ts=1433501940, from=system.adapter.javascript.0, lc=1433501940
                            ! javascript-0 2015-06-05 12:59:00 info script.js.modbusstrom:
                            ! ReferenceError: 2015-06-05 12:59:00 error at Pipe.onread (net.js:526:21)
                            ! ReferenceError: 2015-06-05 12:59:00 error at Socket.Readable.push (_stream_readable.js:127:10)
                            ! ReferenceError: 2015-06-05 12:59:00 error at readableAddChunk (_stream_readable.js:165:9)
                            ! ReferenceError: 2015-06-05 12:59:00 error at emitReadable (stream_readable.js:404:5)
                            ! ReferenceError: 2015-06-05 12:59:00 error at emitReadable
                            (_stream_readable.js:408:10)
                            ! ReferenceError: 2015-06-05 12:59:00 error at Socket.EventEmitter.emit (events.js:92:17)
                            ! ReferenceError: 2015-06-05 12:59:00 error at Socket. (_stream_readable.js:746:14)
                            ! ReferenceError: 2015-06-05 12:59:00 error at Socket.EventEmitter.emit (events.js:95:17)
                            ! ReferenceError: 2015-06-05 12:59:00 error at Socket. (script.js.modbusstrom:9:57)
                            ! ReferenceError: 2015-06-05 12:59:00 error data is not defined
                            ! uncaught 2015-06-05 12:59:00 error exception: data is not defined `
                            Es war ein Fehlerchen drin:

                            createState('pythonResult', '');
                            schedule("*/5 * * * *", function () {
                                 var python = require('child_process').spawn('python',
                                 // second argument is array of parameters, e.g.:
                                 ["/home/me/pythonScript.py"]);
                                 var result = '';
                                 python.stdout.on('data', function(data){ result += data.toString(); });
                                 python.on('close', function(code){ 
                                   if (code !== 0) {  
                                         log('Error: ' + code); 
                                   } else {
                                         log(result);
                                         setState('pythonResult', result, true);
                                   }
                                 });
                            });
                            
                            1 Reply Last reply Reply Quote 0
                            • S
                              starfish last edited by

                              8-) 8-) 8-) 8-)

                              Jetzt läuft alles - danke bluefox.

                              :idea: Sollte man das nicht (sticky) unter "ioBroker Skripten" und/oder im wiki aufführen? Zumindest die Lösung passt dort m.E besser hinein.

                              1 Reply Last reply Reply Quote 0
                              • Homoran
                                Homoran Global Moderator Administrators last edited by

                                Wenn du mir sagst welches das aktuelle und funktionierende Skript ist.

                                Und einen Zweizeiler wozu es gut ist kommt es da hin:

                                http://www.iobroker.net/docu/?page_id=57&lang=de

                                Gruß

                                Rainer

                                Gesendet von meinem LIFETAB_S785X mit Tapatalk

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

                                Support us

                                ioBroker
                                Community Adapters
                                Donate

                                662
                                Online

                                31.7k
                                Users

                                79.7k
                                Topics

                                1.3m
                                Posts

                                5
                                14
                                4486
                                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