NEWS
Javascript - Bild / Url lokal speichern
-
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
-
@bitwicht sagte in Javascript - Bild / Url lokal speichern:
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:
Versuch macht kluch !
-
Hier noch das Script zusätzlich mit E-Mail versand (E-Mail Adapter muss installiert sein):
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); } else { sendTo("email", { to: "hier-an-Emailadresse-eintragen", subject: "Betreff-Eintragen", text: "Tect-Eintargen", attachments: [{path: snap}] }); } }); }); });
-
das skript lädt aktuell das komplette bild erst in den Hauptspeicher und speichert es dann. solange genug Speicher da ist, kann man das lassen.
Behalt dir mal im Hinterkopf, das man hier optimieren könnte, falls es mit dem Speicher mal eng wird. Dann könnten die Daten gestreamt werden, da wird dann nur ein kleiner Teil im Hauptspeicher zwischengespeichert.
https://github.com/request/request#streaming -
zu deiner Zeitangabe noch eine Frage. Du schreibst:
{"time":{"start":"00:00","exactTime":true},"period":{"months":1,"dates":"[1]"}}',
Wenn ich das im IOBroker eingebe kommt:
{"time":{"start":"00:00","end":"23:59","mode":"hours","interval":1},"period":{"months":"[1,2,3,4,5,6,7,8,9,10,11,12]","dates":"[1]"}}',
Du schreibst months":1," wäre das dann nicht nur JAN ?
Muss ich bei months nicht alle Monate und dates nicht alle Tage spezifizieren?
-
-
-
@bitwicht
Exakt - kurz und knackig -
@codierknecht ,
ich verwende auch nur Cron, aber ich wollte das der Themenstarter auch noch etwas selbst herausfinden muss, sonst hat das alles keinen Lerneffekt und beim nächsten Skript steht er wieder auf der Matte.