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

                              979
                              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