NEWS
Javascript - Bild / Url lokal speichern
-
Hallo zusammen.
Ich habe folgenden Shell Befehl:
curl http://192.168.0.18/raw.jpg -o /test-$(date +%Y%m%d).jpg
Ich könnte den Befehl als Shell-Script speichern und aufrufen, was ich nicht sehr toll finde.
Wie schreibe ich den Befehl als Javascript, dass ich diesen direkt im JS-Adapter ausführen kann?
lg Bit
-
-
Danke, das habe ich auch schon gefunden aber ich verstehe es nicht:
const axios = require("axios").default; const downloadFile = async (url, path) => { try { const response = await axios({ method: "GET", url: url, responseType: "stream", }); // Do something with the response } catch (err) { // Handling errors } }; fs.createWriteStream( http://192.168.0.18/raw.jpg, options )
Wenn ich das als Script eingebe, kommt nur ein Fehler.
Ich ich verstehe auch nicht wie ich das Zielverzeichnis eingebe. -
@bitwicht ,
ich speichere meine Klingelbilder auch lokal ab.var request = require('request'); var fs = require('fs'); var bell = true; var snap = ''; function sendImage() { request.get({url: 'http://192.168.55.55:9100/?action=snapshot', encoding: 'binary'}, function (err, response, body) { fs.writeFile(snap, body, 'binary', function(err) { if (err) { console.error(err); } else { console.log('Snapshot sent'); sendTo('telegram.0', {text: snap, caption: 'Jemand klingelt an der Haustür !!!'}); sendTo("email", { to: "x.xxx@gmx.de", subject: "Message from ioBroker", text: "Jemand klingelt an der Haustür !!!", attachments: [{path: snap}] }); } }); }); } on({id: "mqtt.0.piface.input.DoorBell_1", val: true}, function (obj) { if (bell) { snap = '/opt/iobroker/snapshots/snap_' + formatDate(obj.state.lc, 'TT.MM.JJJJ_hh:mm:ss') + '.jpg'; sendImage(); } bell = false; setTimeout(function() { bell = true; }, 120000); });
Snap ist der Dateiname und Ordner unter dem ich das Bild speichern möchte.
Mit request.get hole ich mir das aktuelle Bild und speichere unter Snap ab und ist unter "/opt/iobroker/snapshot/snap_Datum/Zeit.jpg " zu finden.
Der Ordner "/opt/iobroker/snapshot" muss vorhanden sein.
Den Telegram und E-Mail Teil kannst du ignorieren. -
Danke, ich verstehe leider nicht wie man das Script ändern muss.
var request = require('request'); var fs = require('fs'); var bell = true; var snap = ''; function sendImage() { request.get({url: 'http://192.168.0.18/img_tmp/raw.jpg', encoding: 'binary'}, function (err, response, body) { fs.writeFile(snap, body, 'binary', function(err) { if (err) { console.error(err); } else { console.log('Snapshot sent'); // sendTo('telegram.0', {text: snap, caption: 'Jemand klingelt an der Haustür !!!'}); // sendTo("email", { // to: "x.xxx@gmx.de", // subject: "Message from ioBroker", // text: "Jemand klingelt an der Haustür !!!", // attachments: [{path: snap}] // }); } }); }); } on({id: "mqtt.0.piface.input.DoorBell_1", val: true}, function (obj) { if (bell) { snap = '/opt/iobroker/snapshots/snap_' + formatDate(obj.state.lc, 'TT.MM.JJJJ_hh:mm:ss') + '.jpg'; sendImage(); } bell = false; setTimeout(function() { bell = true; }, 120000); });
Wenn ich das so ändere, geht es nicht.
Ich glaube dein Trigger ist die Dorbell, aber ich will ja nur das das Script einfach läuft wenn der Adapter es aufruft
-
var request = require('request'); var fs = require('fs'); var snap = ''; on({id: "mqtt.0.piface.input.DoorBell_1", val: true}, function (obj) { snap = '/opt/iobroker/snapshots/snap_' + formatDate(obj.state.lc, 'TT.MM.JJJJ_hh:mm:ss') + '.jpg'; request.get({url: 'http://192.168.0.18/img_tmp/raw.jpg', encoding: 'binary'}, function (err, response, body) { fs.writeFile(snap, body, 'binary', function(err) { if (err) { console.error(err); } } }); });
Das müsste die kurze Version sein.
mqtt.0.piface.input.DoorBell_1
ist der Trigger um die Datei zu speichern, das musst du mit deinem Trigger ersetzen.
-
ich habe ja keinen trigger.
Ich will das Script im JS-Adapter eingeben und der soll das Script jeden 1ten eines Monats ein mal ausführen.
Ich will jeden 1ten des Monats ein Bild von der Wasseruhr.
lg
Bit. -
@bitwicht ,
dann ist dein Trigger jeden 1sten im Monat. -
wenn ich das script starte kommt:
12:31:58.629 error javascript.0 (305518) script.js.Skript_1 compile failed: at script.js.Skript_1:12 -
-
hier - einfach kopiert:
var request = require('request'); var fs = require('fs'); var snap = ''; on({id: "mqtt.0.piface.input.DoorBell_1", val: true}, function (obj) { snap = '/opt/iobroker/snapshots/snap_' + formatDate(obj.state.lc, 'TT.MM.JJJJ_hh:mm:ss') + '.jpg'; request.get({url: 'http://192.168.0.18/img_tmp/raw.jpg', encoding: 'binary'}, function (err, response, body) { fs.writeFile(snap, body, 'binary', function(err) { if (err) { console.error(err); } } }); });
error javascript.0 (305518) script.js.Skript_1 compile failed: at script.js.Skript_1:12
-
@bitwicht ,
Klammer zu wenig.var request = require('request'); var fs = require('fs'); var snap = ''; on({id: "mqtt.0.piface.input.DoorBell_1", val: true}, function (obj) { snap = '/opt/iobroker/snapshots/snap_' + formatDate(obj.state.lc, 'TT.MM.JJJJ_hh:mm:ss') + '.jpg'; request.get({url: 'http://192.168.0.18/img_tmp/raw.jpg', encoding: 'binary'}, function (err, response, body) { fs.writeFile(snap, body, 'binary', function(err) { if (err) { console.error(err); } }); }); });
-
Danke, jetzt habe ich nur noch einen Fehler.
Das Script lässt sich starten.Wenn ich im Adapter einen Cron bzw. Zeit Assistenten einstellt - einfach , jede Minute fügt er folgende Zeile hinzu:
'* * * * *'var request = require('request');
dann lässt sich das script nicht mehr starten:
error javascript.0 (305518) script.js.Skript_1 compile failed: at script.js.Skript_1:1Bilder legt er auch keine ab.
Ich wollte das der Cron bzw. Zeit Assistenten das Script starten und as Bild gespeichert wird.
-
Ich wollte das der Cron bzw. Zeit Assistenten das Script starten und as Bild gespeichert wird.
Dann wäre Dein Trigger nicht
on({id: "mqtt.0.piface.input.DoorBell_1", val: true}, function (obj) {
sondern stattdessen
schedule("* * * * *", function () {
Dann muss aber noch der Dateiname anders generiert werden ...
Statt
snap = '/opt/iobroker/snapshots/snap_' + formatDate(obj.state.lc, 'TT.MM.JJJJ_hh:mm:ss') + '.jpg';
dann
snap = '/opt/iobroker/snapshots/snapshot.jpg';
denn Du willst vermutlich nicht hunderte oder gar tausende Bilder ablegen, sondern die Datei immer wieder überschreiben.
-
@bitwicht ,
habe heute meinen humanen Tag.
Habe den Schedule 1sten im Monat aus Blockly kopiert, ich denke der stimmt.var request = require('request'); var fs = require('fs'); var snap = ''; var Monat; schedule('{"time":{"start":"00:00","exactTime":true},"period":{"months":1,"dates":"[1]"}}', async function () { Monat = formatDate(new Date(), "DD.MM.YYYY"); snap = '/opt/iobroker/snapshot/snap_' + Monat + '.jpg'; request.get({url: 'http://192.168.0.18/img_tmp/raw.jpg', encoding: 'binary'}, function (err, response, body) { fs.writeFile(snap, body, 'binary', function(err) { if (err) { console.error(err); } }); }); });
-
var fs = require('fs'); var snap = ''; schedule("* * * * *", function () { snap = '/var/www/html/wasseruhr-haus/' + formatDate(obj.state.lc, 'TT.MM.JJJJ_hh:mm:ss') + '.jpg'; request.get({url: 'http://192.168.0.18/img_tmp/raw.jpg', encoding: 'binary'}, function (err, response, body) { fs.writeFile(snap, body, 'binary', function(err) { if (err) { console.error(err); } }); }); });
kommt der fehler:
error javascript.0 (305518) at Object.<anonymous> (script.js.Skript_1:5:61)Das er an den Dateinamen das Datum hängt ist OK.
Ich habe es aktuell auf Minute, dass ich sehen ob er Bilder macht.
das würde ich dann auf monatlich umstellen. -
@bitwicht
Du hast das Ändern des Dateinamens nicht übernommen.
Das Objektobj
ist nur im Trigger vorhanden und nicht im Schedule.Nimm den Code von @Wal und ändere sein Schedule auf
"* * * * *"
. Dann erhältst Du testweise jede Minute ein Bild.
Wenn das passt, kannst Du das Schedule auf"5 0 1 * *"
ändern. Das wird dann um 00:05 Uhr an jedem 1. eines Monats ausgeführt. -
@bitwicht said in Javascript - Bild / Url lokal speichern:
formatDate(obj.state.lc, 'TT.MM.JJJJ_hh:mm:ss')
und in Zeile 5 kannst du diesen Teil
formatDate(obj.state.lc, 'TT.MM.JJJJ_hh:mm:ss')
gegen
formatDate(new Date(), 'TT.MM.JJJJ_hh:mm:ss')
tauschen
-
Super, für Eure Mühe!
Es gehen jetzt beide Scripte ! (nur schade das ich es nicht verstehe).Lösung1:
var fs = require('fs'); var snap = ''; schedule("* * * * *", function () { snap = '/var/www/html/wasseruhr-haus/' + formatDate(new Date(), 'TT.MM.JJJJ_hh:mm:ss') + '.jpg'; request.get({url: 'http://192.168.0.18/img_tmp/raw.jpg', encoding: 'binary'}, function (err, response, body) { fs.writeFile(snap, body, 'binary', function(err) { if (err) { console.error(err); } }); }); });
oder
Lösung2:
var request = require('request'); var fs = require('fs'); var snap = ''; var Monat; schedule('{"time":{"start":"00:00","exactTime":true},"period":{"months":1,"dates":"[1]"}}', async function () { Monat = formatDate(new Date(), "DD.MM.YYYY"); snap = '/opt/iobroker/snapshot/snap_' + Monat + '.jpg'; request.get({url: 'http://192.168.0.18/img_tmp/raw.jpg', encoding: 'binary'}, function (err, response, body) { fs.writeFile(snap, body, 'binary', function(err) { if (err) { console.error(err); } }); }); });
-
Ich will Eure Nerven ja nicht überstrapazieren, aber dieser E-Mail Versand ist auch ganz schick.
müsste ich das dann einfach als "else" anhängen:
if (err) { console.error(err); } else { sendTo("email", { to: "x.xxx@gmx.de", subject: "TEXT", text: "TEXT", attachments: [{path: snap}] }); }
Ich glaube aber das attachments ist falsch