NEWS
[gelöst] Frage zu Script Bewegungsmelder und Schnappschuss Kamera
-
Hallo,
ich benutze folgendes Script, was auch soweit funktioniert. Wie stelle ich es an, das bei Bewegung 3 (oder eben mehr) Bilder im 3 Sekunden Abstand (oder auch anderer Zeitabstand) gemacht und gesendet werden ?
Der untere Teil war der Versuch das zu realisieren, funktioniert aber nur manchmal. Oft kommt nur ein Bild.
on({id: "hm-rpc.0.000xxxx.1.MOTION"/*Bewegungsmelder Gartentür.MOTION*/, val: true}, function (obj) { // Beginn on var request = require('request'); var fs = require('fs'); request.get({url: 'http://192.168.180.50:80/cgi-bin/snapshot.cgi?loginuse=[XXX]&loginpas=[XXX]', encoding: 'binary'}, function (err, response, body) { fs.writeFile("/tmp/snap.jpg", body, 'binary', function(err) { if (err) { console.error(err); } else { console.log('Snapshot sent'); sendTo('telegram.0', '/tmp/snap.jpg'); } }); }); }); on("hm-rpc.0.000xxx.1.MOTION", function (obj) { if (obj.state.val) { // send 2 images: immediately, in 15, and 30 seconds //sendImage(); setTimeout(sendImage, 15000); setTimeout(sendImage, 30000); } });
-
Genau das habe ich bereits umgesetzt. Ich stell dir mal alles zur Verfügung, eben die Trigger und Daten der kam tauschen sowie den Pfad zum Bild und es müsste laufen.
Gruß
// Telegram Bild senden durch Klingel oder Text to command var source_url = 'http://xxx.xxx.xxx.xxx/tmpfs/snap.jpg?usr=xxxxxxx&pwd=xxxxxxxxxx', //Adresse der IpKamera dest_path = '/opt/iobroker/ipcam/'; var Nachricht = "Es hat an der Haustüre geklingelt"; // Nachricht, welche mit dem Bild gesendet wird var request = require('request'); var fs = require('fs'); //var timer = null; var count = 0; // Bild an telegram schicken function sendImage (pfad) { sendTo('telegram.0', pfad); //log('Webcam Bild per telegram verschickt'); //sendTo("telegram.0", Nachricht); // <-- nach der Timeout funktion ausführen } // Bild speichern function saveImage() { request.get({url: source_url, encoding: 'binary'}, function (err, response, body) { fs.writeFile(dest_path + 'image2.jpg', body, 'binary', function(err) { if (err) { //log('Fehler beim Bild speichern: ' + err, 'warn'); } else { //log('Webcam Bild gespeichert'); sendImage(dest_path + 'image2.jpg'); } }); }); } //Trigger // 3 Bilder senden wenn Bewegung erkannt und keiner zu Hause ist on({id: "hm-rpc.0.xxxxxx.MOTION"/*Garten_BW_Haustuer:1.MOTION*/, val: true}, function () { if (getState("javascript.0.MyStates.anwesenheit"/*anwesenheit*/).val === false) { count = 3; counter(); timer = setInterval(counter, 3000); } }); function counter() { saveImage(); count--; if(count === 0 && timer) clearInterval(timer); }
-
@ple:Genau das habe ich bereits umgesetzt. Ich stell dir mal alles zur Verfügung, eben die Trigger und Daten der kam tauschen sowie den Pfad zum Bild und es müsste laufen.
Gruß
// Telegram Bild senden durch Klingel oder Text to command var source_url = 'http://xxx.xxx.xxx.xxx/tmpfs/snap.jpg?usr=xxxxxxx&pwd=xxxxxxxxxx', //Adresse der IpKamera dest_path = '/opt/iobroker/ipcam/'; var Nachricht = "Es hat an der Haustüre geklingelt"; // Nachricht, welche mit dem Bild gesendet wird var request = require('request'); var fs = require('fs'); //var timer = null; var count = 0; // Bild an telegram schicken function sendImage (pfad) { sendTo('telegram.0', pfad); //log('Webcam Bild per telegram verschickt'); //sendTo("telegram.0", Nachricht); // <-- nach der Timeout funktion ausführen } // Bild speichern function saveImage() { request.get({url: source_url, encoding: 'binary'}, function (err, response, body) { fs.writeFile(dest_path + 'image2.jpg', body, 'binary', function(err) { if (err) { //log('Fehler beim Bild speichern: ' + err, 'warn'); } else { //log('Webcam Bild gespeichert'); sendImage(dest_path + 'image2.jpg'); } }); }); } //Trigger // 3 Bilder senden wenn Bewegung erkannt und keiner zu Hause ist on({id: "hm-rpc.0.xxxxxx.MOTION"/*Garten_BW_Haustuer:1.MOTION*/, val: true}, function () { if (getState("javascript.0.MyStates.anwesenheit"/*anwesenheit*/).val === false) { count = 3; counter(); timer = setInterval(counter, 3000); } }); function counter() { saveImage(); count--; if(count === 0 && timer) clearInterval(timer); } ```` ` Danke, schaue ich mir nach den Feiertagen mal an um es dann zu testen.(dann bin ich wieder zu Hause)
-
Hi,
was muss ich tun, damit die Bilder auch gespeichert werden? Denke mal, meine Kamera braucht irgendwie eine Berechtigung, auf den NUC zu schreiben - nur wie?
Frohes Fest allen
-
Hallo,
ich bekomme mit Deinem Script zwar Bilder gesendet, aber es ist eine Endlosschleife. Es kommen dann ohne Ende Bilder.
Speichern brauche ich die Bilder eigentlich nicht, es würde mir reichen einfach , sagen wir drei Bilder im Abstand mit 3 Sekunden nach Bewegung zu senden.
Wie bekomme ich das hin ?
(Bilder speichern klappt auch nicht, bei mir läuft iobroker auf einer Synology, da habe ich schon verschiedene Pfade probiert, aber es wurde kein Bild in dem freigegebenen/angegebenen Ordner gespeichert)
LG Heiko
-
Das müsste so eigentlich laufen, 3 Bilder mit 3 Sekunden Pause dazwischen.
Ist dein Trigger anders, dass er immer auslöst? Wie sieht dein Trigger aus?
-
Ich benutze im Moment das Script, da bekomme ich dann zwei Bilder. Aber mit Deinem Script werde ich auch noch weiter probieren.
// ------------------------------------------------------------------------- // Dieses Script überwaht den Zustand eines Bewegungsmelders und speichert bei // Aktivierung ein Bild einer Überwachnungskamera in einem Vereichnis und sendet // dieses via Telegram.0-Adapter. Nach 10 Sek wird ein weiteres Bild erstellt und // gesendet. // Die Speicherung der Bilder erfolgt als "Stack", d.h. das aktuellste Bild bekommt // immer den Suffix "0" und es werden n Bilder mit den Suffixen 1..n-1 vorgehalten // Uhula 2017.11 // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- // Konfiguration // ------------------------------------------------------------------------- // Objekt-ID des Bewegungsmelders const oidLichtBewmelderTuer = "hm-rpc.0.xxx.1.MOTION"/*Bewegungsmelder Gartentür.MOTION*/; // URL zur Kamera umn ein Image (jpg) zu erhalten const cam_url = "http://192.168.180.50:80/cgi-bin/snapshot.cgi?loginuse=[xxx]&loginpas=[xxx]"; // Pfadangabe für die Speicherung der Bilder, der Pfad muss existieren const dest_path = ''; // Anzahl der Bilder, die vorgehalten werden sollen const imageCountMax = 8; // Prefix für die Bildnamen const imageNamePre = "Gartentür"; // ------------------------------------------------------------------------- // Scriptteil // ------------------------------------------------------------------------- var request = require('request'); var fs = require('fs'); // Bild an telegram schicken function sendImage (path) { try { var stats = fs.statSync(path); var msg = formatDate(stats.birthtime,"DD.MM.YYYY hh:mm:ss") + " " + path.substring(path.lastIndexOf('/')+1); sendTo('telegram.0', { text: path, caption: msg, disable_notification: true }); } catch(err) { if (err.code != "ENOENT") log(err); } } // löscht eine Datei synchron (wartet auf das Ergebnis) function fsUnlinkSync(path) { try { var stats = fs.statSync(path); try { fs.unlinkSync(path); } catch(err) { if (err.code != "ENOENT") log(err); } } catch(err) { if (err.code != "ENOENT") log(err); } } // benennt eine Datei synchron um (wartet auf das Ergebnis) function fsRenameSync(oldPath, newPath) { try { var stats = fs.statSync(oldPath); try { fs.renameSync(oldPath, newPath); } catch(err) { if (err.code != "ENOENT") log(err); } } catch(err) { if (err.code != "ENOENT") log(err); } } // Bild speichern und senden function saveImage() { // Bild imageCountMax-1 löschen fsUnlinkSync( dest_path + imageNamePre + (imageCountMax-1) + "" ); // Bilder 0..imageCountMax-2 umbenennen for (var i=imageCountMax-2; i >= 0; i-- ) { fsRenameSync(dest_path + imageNamePre + i + "", dest_path + imageNamePre + (i+1) + ".jpg"); } // Bild 0 löschen var fname = imageNamePre + ".jpg"; fsUnlinkSync( fname ); // Bild holen und speichern request.get({url: cam_url, encoding: 'binary'}, function (err, response, body) { fs.writeFile(dest_path + fname, body, 'binary', function(err) { if (err) { log('Fehler beim Bild speichern: ' + err, 'warn'); } else { // dem Filesystem 2 Sek Zeit zum Speichern lassen setTimeout(function() { sendImage(dest_path + fname); }, 2000); } }); }); } // sofort ein Bild senden und nach 3 Sek erneut function onEvent() { saveImage(); setTimeout(function() { saveImage(); }, 10 * 300); } // Ereignisroutine on({id: oidLichtBewmelderTuer, val: true}, function (obj) { onEvent( obj ); }); // manuelle Ausführung (Test) onEvent();
-
@ple:Das müsste so eigentlich laufen, 3 Bilder mit 3 Sekunden Pause dazwischen.
Ist dein Trigger anders, dass er immer auslöst? Wie sieht dein Trigger aus? `
Ich habe bei mir jetzt den Pfad rausgenommen (iobroker läuft auf einer Synology) Als Trigger hatte ich eine Steckdose benutzt, damit ich nicht immer raus laufen muss zum probieren.Jedenfalls funktioniert es jetzt so wie gewünscht. Prima, Danke !
Sieht jetzt so aus bei mir.
// Telegram Bild senden durch Klingel oder Text to command var source_url = 'http://192.168.180.50:80/cgi-bin/snapshot.cgi?loginuse=[xxx]&loginpas=[xxx]', //Adresse der IpKamera dest_path = ''; var Nachricht = "Es hat an der Haustüre geklingelt"; // Nachricht, welche mit dem Bild gesendet wird var request = require('request'); var fs = require('fs'); //var timer = null; var count = 0; // Bild an telegram schicken function sendImage (pfad) { sendTo('telegram.0', pfad); //log('Webcam Bild per telegram verschickt'); //sendTo("telegram.0", Nachricht); // <-- nach der Timeout funktion ausführen } // Bild speichern function saveImage() { request.get({url: source_url, encoding: 'binary'}, function (err, response, body) { fs.writeFile(dest_path + 'image2.jpg', body, 'binary', function(err) { if (err) { //log('Fehler beim Bild speichern: ' + err, 'warn'); } else { //log('Webcam Bild gespeichert'); sendImage(dest_path + 'image2.jpg'); } }); }); } //Trigger // 3 Bilder senden wenn Bewegung erkannt und keiner zu Hause ist on({id: "hm-rpc.0.xxx.1.MOTION"/*Bewegungsmelder Gartentür.MOTION*/, val: true}, function () { // if (getState("javascript.0.MyStates.anwesenheit"/*anwesenheit*/).val === false) { count = 3; counter(); timer = setInterval(counter, 3000); } ); function counter() { saveImage(); count--; if(count === 0 && timer) clearInterval(timer); }