NEWS
Serienbildaufnahme, alle 2 Sekunden ein Bild
-
ich versuche grad eine Serienbildaufnahme zu erstellen, Dabei soll alle 2 Sekunden ein Bild erstellt werden.
var screenon = "fullybrowser.0.192_xxx_x_xxx.Info.isScreenOn"/*isScreenOn*/; var heute; var jahr; var monat; var tag; var stunde; var minute; var sekunde; var i; on(screenon, function(dp) { if(dp.state.val) { var request = require('request'); var fs = require('fs'), heute = new Date(), jahr = heute.getYear(), monat = heute.getMonth()+1, tag = heute.getDate(), stunde = heute.getHours(), minute = heute.getMinutes(), sekunde = heute.getSeconds(); for(i = 1; i < 11; i++) { timeout = setTimeout(function () { request.get({url: 'http://192.xxx.x.xxx:2323/?cmd=getCamshot&password=xxx', encoding: 'binary'}, function (err, response, body) { fs.writeFile("/home/iobroker/" + jahr + monat + tag + stunde + minute + "_" + i + ".jpg", body, 'binary', function(err) { if (err) { console.error(err); } }); }); }, 2000); } var info_text = 'neue Bilder im Archive'; console.log('Snapshot sent'); sendTo('telegram.0', {text: info_text }); } });
es wird aber immer nur das letzte Bild gespeichert
-
Ich hatte letztens etwas ähnliches. Schau mal wie ich das mit dem Zeitstempel gemacht habe und auch an welcher Stelle das ist ganz wichtig. Damit das Datum nicht global berechnet wird, sondern nur in der Funktion beim speichern.
function saveImage(){ request.get({url: cam_img, encoding: 'binary'}, function (err, response, body) { var dateTime = formatDate(new Date(), "JJJJ.MM.TT SS:mm:ss") fs.writeFile(img_path + img_name + dateTime + img_typ, body, 'binary',); sendImage(img_path + img_name + dateTime + img_typ); }); }
Also ungetestet (Achtung ich habe keine Ahnung von Javascript - bitte testen):
var screenon = "fullybrowser.0.192_xxx_x_xxx.Info.isScreenOn"/*isScreenOn*/; var i; on(screenon, function(dp) { if(dp.state.val) { var request = require('request'); var fs = require('fs'), for(i = 1; i < 11; i++) { timeout = setTimeout(function () { request.get({url: 'http://192.xxx.x.xxx:2323/?cmd=getCamshot&password=xxx', encoding: 'binary'}, function (err, response, body) { var dateTime = formatDate(new Date(), "JJJJ.MM.TT SS:mm:ss") fs.writeFile("/home/iobroker/" + dateTime + "_" + i + ".jpg", body, 'binary', function(err) { if (err) { console.error(err); } }); }); }, 2000); } var info_text = 'neue Bilder im Archive'; console.log('Snapshot sent'); sendTo('telegram.0', {text: info_text }); } });
-
moin,
danke für die Antwort.
das Datum sollte eigendlich for der Schleife berechnet werden, damit alle Bilder aus einer Serie den gleichen Zeitstempel haben. Ich denke das Problem lieg an der Schleife in Verbindung mit dem Timeout. Ich bin mir nicht sicher ob das so funktionieren kann. -
Ich habe jetzt noch mal ein wenig gelesen und ich denke , es hängt damit zusammen. dass es Probleme mit Funktionen innerhalb von Schleifen gibt. Ich hoffe ich habe den Workaround dafüt richtig verstanden.
var screenon = "fullybrowser.0.192_xxx_xxx_xxx.Info.isScreenOn"/*isScreenOn*/; var i, timeout, timestamp; var funcs = []; on(screenon, function(dp) { if(dp.state.val) { var request = require('request'); var fs = require('fs'); for(i = 1; i <= 10; i++) { timstamp = formatDate(new Date(), "JJJJ.MM.TT SS:mm:ss"); funcs[i] = snapshot(timestamp, i); } var info_text = 'neue Bilder im Archive'; console.log('Snapshot sent'); sendTo('telegram.0', {text: info_text }); } }); function snapsot (timestamp, num){ return function() { timeout = setTimeout(function () { request.get({url: 'http://192.xxx.xxx.xxx:2323/?cmd=getCamshot&password=xxx', encoding: 'binary'}, function (err, response, body) { fs.writeFile("/home/iobroker/" + timestamp + "_" + num + ".jpg", body, 'binary', function(err) { if (err) { console.error(err); } }); }); }, 2000); }; }
-
Hast du bereits zum Testen das Intervall von 2 Sek. auf 5 Sek. erhöht?
Je nach Kamera-Auflösung und WLAN-Verbindung kann es schon mal länger als 2 Sek. dauern, bis das Bild abgefragt und weggeschrieben wird. -
Ich denke, das mit den zwei Sekunden sollte schon klappen.
Wie ich geschrieben habe, funktioniert das wohl mit der Funktion innerhalb der Schleibe nicht.
Das script hat die Bilder wohl immer wieder überschrieben. Ich werde nachher mal testen ob es jetzt so klappt...Im Moment scheint Fully bei mir abgestürzt zu sein. Ich habe jedenfalls keinen zugriff mehr darauf.
-
Wenn du das Datum Global ermittelst bleibt es für immer das selbe bis das Script neu gestartet wird.
Und deswegen wird das Bild überschrieben, weil der Dateiname immer gleich ist.
Nimm doch mal den Zähler raus, die Funktion läuft eh immer... -
funktioniert leider nicht, ich bekomme keine Bilder...
-
so, ich habe es gelöst bekommen... mein Fehler war die Annahme das die Schleife erst nach dem timeout weiter abgearbeitet wird. Die Schleife wird weiter abgearbeitet und die Funktion inner halb des Timeout nach ablauf des Timeout.
Also muß sich der Timeout bei jedem Durchlauf der Schleife erhöhen.var screenon = "fullybrowser.0.xxx_xxx_xxx_xxx.Info.isScreenOn"/*isScreenOn*/; var timestamp; on(screenon, function(dp) { if(dp.state.val) { timestamp = formatDate(new Date(), "JJJJ.MM.TT SS:mm:ss"); for(let i=1;i <= 10; ++i) { setTimeout(function() { snapshot(timestamp, i); },i*2000); } var info_text = 'neue Bilder im Archive'; console.log('Snapshot sent'); sendTo('telegram.0', {text: info_text }); } }); function snapshot(timestamp, prefix){ // log(timestamp + "_" + prefix); var request = require('request'); var fs = require('fs'); request.get({url: 'http://192.xxx.xxx.xxx:2323/?cmd=getCamshot&password=xxx, encoding: 'binary'}, function (err, response, body) { fs.writeFile("/home/iobroker/" + timestamp + "_" + prefix + ".jpg", body, 'binary', function(err) { if (err) { console.error(err); } }); }); }