Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Überführung funktionierendes node.js Script

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    Überführung funktionierendes node.js Script

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

      Ich habe ein Script, welches ich erfolgreich auch der Konsole ausführen kann:
      ab4479c0-71e5-4da8-8324-ede7c581d2a1-image.png

      Erfolgreiche Auführung:
      dc2a8aca-6c85-4885-9f03-890608ac55ea-image.png

      Mache ich das gleiche in ioBroker:
      f504c373-7a6a-43c7-936a-d80a28c28b98-image.png

      Bekomme ich eine Fehlermeldung:
      7d451bea-54c8-42e9-a431-9f748a860c83-image.png

      Kann mir hier jemand weiterhelfen. Das wäre super klasse!

      AlCalzone Thomas Braun 2 Replies Last reply Reply Quote 0
      • AlCalzone
        AlCalzone Developer @uwe72 last edited by AlCalzone

        @uwe72 Zwei unterschiedliche Node-Versionen installiert?
        fs.promises gibt es seit Node 10

        @Thomas-Braun kann sicher helfen

        1 Reply Last reply Reply Quote 0
        • Thomas Braun
          Thomas Braun Most Active @uwe72 last edited by Thomas Braun

          @uwe72
          Bitte KonsolenTEXT in CodeTags posten.

          Die Ausgabe von

          which nodejs && nodejs -v && which node && node -v && which npm && npm -v && apt policy nodejs
          

          schaut wie aus?
          Und als root hampelt man auch nicht herum.

          U 1 Reply Last reply Reply Quote 0
          • U
            uwe72 @Thomas Braun last edited by uwe72

            @thomas-braun

            Auf der Konsole ausgeführt:

            /usr/bin/nodejs
            v10.19.0
            /usr/bin/node
            v10.19.0
            /usr/bin/npm
            6.14.4
            nodejs:
              Installed: 10.19.0~dfsg-3ubuntu1
              Candidate: 10.19.0~dfsg-3ubuntu1
              Version table:
             *** 10.19.0~dfsg-3ubuntu1 500
                    500 http://de.archive.ubuntu.com/ubuntu focal/universe amd64 Packages
                    100 /var/lib/dpkg/status
            
            
            Thomas Braun 1 Reply Last reply Reply Quote 0
            • Thomas Braun
              Thomas Braun Most Active @uwe72 last edited by

              @uwe72
              Zwar sauber installiert, allerdings die 'falsche' Version.
              Du willst die von nodesource gepackte Variante haben:

              https://forum.iobroker.net/topic/35090/howto-nodejs-installation-und-upgrades-unter-debian

              U 1 Reply Last reply Reply Quote 0
              • AlCalzone
                AlCalzone Developer last edited by

                Kommando zurück... Ich weiß woran es liegt.
                Der Skript-Adapter sandboxed das fs-Modul, damit da bestimmte Dinge nicht gemacht werden.

                Daher existiert fs.promises dort nicht. Ein Workaround wäre, die synchrone FS API zu nutzen.

                U 1 Reply Last reply Reply Quote 1
                • U
                  uwe72 @Thomas Braun last edited by uwe72

                  @thomas-braun

                  Ich muss mich leider korrigieren. Ich hatte einen Denkfehler. Bei mir läuft iobroker ja in einem Docker-Container. Die vorherige Logausgabe war von meinem NUC, und nicht vom ioBroker Docker Container.

                  Diese ist die Ausgabe vom Container:

                  
                  /usr/bin/nodejs
                  v12.20.1
                  /usr/bin/node
                  v12.20.1
                  /usr/bin/npm
                  6.14.10
                  nodejs:
                    Installiert:           12.20.1-1nodesource1
                    Installationskandidat: 12.21.0-1nodesource1
                    Versionstabelle:
                       12.21.0-1nodesource1 500
                          500 https://deb.nodesource.com/node_12.x buster/main amd64 Packages
                   *** 12.20.1-1nodesource1 100
                          100 /var/lib/dpkg/status
                       10.24.0~dfsg-1~deb10u1 500
                          500 http://security.debian.org/debian-security buster/updates/main amd64 Packages
                       10.21.0~dfsg-1~deb10u1 500
                          500 http://deb.debian.org/debian buster/main amd64 Packages
                  
                  

                  Aber auch auf der Konsole des ioBroker Docker containers läuft das Script auf der Konsole.

                  1 Reply Last reply Reply Quote 0
                  • U
                    uwe72 @AlCalzone last edited by uwe72

                    @alcalzone Versuche ich mal umzubauen

                    Wobei ich vermutlich daran scheitere:

                    Das ist ja der Ausgangszustand:

                     const cocoSsd = require('@tensorflow-models/coco-ssd');
                     const tf = require('@tensorflow/tfjs-node');
                     const fs2 = require('fs').promises;
                    
                     // Load the Coco SSD model and image.
                     Promise.all([cocoSsd.load(), fs2.readFile('/home/iobroker/12-14-2020-tout.jpg')])
                     .then((results) => {
                       // First result is the COCO-SSD model object.
                       const model = results[0];
                       // Second result is image buffer.
                       const imgTensor = tf.node.decodeImage(new Uint8Array(results[1]), 3);
                       // Call detect() to run inference.
                       return model.detect(imgTensor);
                     })
                     .then((predictions) => {
                       console.log(JSON.stringify(predictions, null, 2));
                     });
                    

                    Das ist mein erster Versuch, funktioniert aber noch nicht:

                     const cocoSsd = require('@tensorflow-models/coco-ssd');
                     const tf = require('@tensorflow/tfjs-node');
                     const fs = require('fs');
                    
                    fs.readFile('/home/iobroker/12-14-2020-tout.jpg', function read(err, data) {
                        if (err) {
                            throw err;
                        }
                        
                        Promise.all([cocoSsd.load()])
                            .then((results) => {
                            const model = results[0];
                            const imgTensor = tf.node.decodeImage(new Uint8Array(data), 3);
                            return model.detect(imgTensor);
                        })
                        .then((predictions) => {
                            console.log(JSON.stringify(predictions, null, 2));
                        });
                        
                    });
                    
                    

                    Fehler:

                    javascript.0	2021-02-25 11:41:39.008	error	(343176) at processTicksAndRejections (internal/process/task_queues.js:97:5)
                    javascript.0	2021-02-25 11:41:39.008	error	(343176) at runMicrotasks (<anonymous>)
                    javascript.0	2021-02-25 11:41:39.008	error	(343176) at script.js.common.000_Test6:14:35
                    javascript.0	2021-02-25 11:41:39.008	error	(343176) at Object.decodeImage (/opt/iobroker/node_modules/iobroker.javascript/node_modules/@tensorflow/tfjs-node/dist/image.js:204:20)
                    javascript.0	2021-02-25 11:41:39.008	error	(343176) at decodeJpeg (/opt/iobroker/node_modules/iobroker.javascript/node_modules/@tensorflow/tfjs-node/dist/image.js:100:19)
                    javascript.0	2021-02-25 11:41:39.008	error	(343176) at Object.tidy (/opt/iobroker/node_modules/iobroker.javascript/node_modules/@tensorflow/tfjs-core/src/globals.ts:192:17)
                    javascript.0	2021-02-25 11:41:39.007	error	(343176) at Engine.tidy (/opt/iobroker/node_modules/iobroker.javascript/node_modules/@tensorflow/tfjs-core/src/engine.ts:440:17)
                    javascript.0	2021-02-25 11:41:39.007	error	(343176) at Engine.scopedRun (/opt/iobroker/node_modules/iobroker.javascript/node_modules/@tensorflow/tfjs-core/src/engine.ts:453:19)
                    javascript.0	2021-02-25 11:41:39.007	error	(343176) at /opt/iobroker/node_modules/iobroker.javascript/node_modules/@tensorflow/tfjs-core/src/engine.ts:442:20
                    javascript.0	2021-02-25 11:41:39.007	error	(343176) at /opt/iobroker/node_modules/iobroker.javascript/node_modules/@tensorflow/tfjs-node/dist/image.js:102:14
                    javascript.0	2021-02-25 11:41:39.007	error	(343176) at NodeJSKernelBackend.decodeJpeg (/opt/iobroker/node_modules/iobroker.javascript/node_modules/@tensorflow/tfjs-node/dist/nodejs_kernel_backend.js:333:33)
                    javascript.0	2021-02-25 11:41:39.007	error	(343176) at Object.scalar (/opt/iobroker/node_modules/iobroker.javascript/node_modules/@tensorflow/tfjs-core/src/ops/scalar.ts:54:10)
                    javascript.0	2021-02-25 11:41:39.007	error	(343176) at makeTensor (/opt/iobroker/node_modules/iobroker.javascript/node_modules/@tensorflow/tfjs-core/src/ops/tensor_ops_util.ts:39:11)
                    javascript.0	2021-02-25 11:41:39.007	error	(343176) script.js.common.000_Test6: Error: values passed to tensor(values) must be a number/boolean/string or an array of numbers/booleans/strings, or a TypedArray
                    
                    U 1 Reply Last reply Reply Quote 0
                    • U
                      uwe72 @uwe72 last edited by

                      @AlCalzone

                      Danke Dir!

                      Habe es nun hinbekommen, musste noch das Uint8Array elimieren.

                      Das ist der funktionierende Umbau:

                       const cocoSsd = require('@tensorflow-models/coco-ssd');
                       const tf = require('@tensorflow/tfjs-node');
                      
                      fs.readFile('/home/clement/tfjs-project/826869587.jpg', function read(err, data) {
                          if (err) {
                              throw err;
                          }
                      
                          Promise.all([cocoSsd.load()])
                              .then((results) => {
                              const model = results[0];
                              const imgTensor = tf.node.decodeImage(data, 3);
                              return model.detect(imgTensor);
                          })
                          .then((predictions) => {
                              console.log(JSON.stringify(predictions, null, 2));
                          });
                          
                      });
                      
                      AlCalzone 1 Reply Last reply Reply Quote 0
                      • AlCalzone
                        AlCalzone Developer @uwe72 last edited by

                        @uwe72 Zeilen 9-11 kannst du noch ein bisschen vereinfachen, da du ja jetzt nicht auf mehrere Promises wartest.

                        cocoSsd.load().then(model => {
                            const imgTensor = ...
                        

                        Evtl kannst du das hässliche .then Gedöns auch gegen async/await ersetzen:

                        const cocoSsd = require("@tensorflow-models/coco-ssd");
                        const tf = require("@tensorflow/tfjs-node");
                        
                        fs.readFile(
                          "/home/clement/tfjs-project/826869587.jpg",
                          async function read(err, data) {
                            if (err) {
                              throw err;
                            }
                        
                            const model = await cocoSsd.load();
                            const imgTensor = tf.node.decodeImage(data, 3);
                            const predictions = await model.detect(imgTensor); // ggf. ohne await (?)
                        
                            console.log(JSON.stringify(predictions, null, 2));
                          }
                        );
                        
                        U 1 Reply Last reply Reply Quote 0
                        • U
                          uwe72 @AlCalzone last edited by uwe72

                          @alcalzone Perfekt, danke! Code funktioniert, aber das untere await muss noch sein.

                          Off-Topic Frage: Weißt Du warum bei diesem Script nie beim Script das Log erscheint, sondern immer nur "im Hauptlog" im Reiter Log? Bei anderen Scripten zeigt es mir das Log auch unter dem Script an.

                          6e10be3f-84ff-49ee-98f0-0dbd5e5ffa03-image.png

                          AlCalzone 1 Reply Last reply Reply Quote 0
                          • AlCalzone
                            AlCalzone Developer @uwe72 last edited by

                            @uwe72 Keine Ahnung - hab ich auch manchmal, konnte es aber nie gezielt reproduzieren.

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

                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            736
                            Online

                            31.8k
                            Users

                            80.0k
                            Topics

                            1.3m
                            Posts

                            javascript
                            3
                            12
                            444
                            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