NEWS
Überführung funktionierendes node.js Script
-
Ich habe ein Script, welches ich erfolgreich auch der Konsole ausführen kann:
Erfolgreiche Auführung:
Mache ich das gleiche in ioBroker:
Bekomme ich eine Fehlermeldung:
Kann mir hier jemand weiterhelfen. Das wäre super klasse!
-
@uwe72 Zwei unterschiedliche Node-Versionen installiert?
fs.promises
gibt es seit Node 10@Thomas-Braun kann sicher helfen
-
@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. -
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
-
@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
-
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. -
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.
-
@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
-
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)); }); });
-
@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)); } );
-
@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.
-
@uwe72 Keine Ahnung - hab ich auch manchmal, konnte es aber nie gezielt reproduzieren.