NEWS
Netatmo Presence Objekt ID für Bewegung
-
Hi,
du musst jede deiner CAMs separat abfragen. Den o.g. Datenpunkt gibt es für jede Kamera. Einfach mal unter Objekte die Struktur unter netatmo.0 anschauen.Mein script sieht so aus:
var timer; var request; var message = 'CAM Bewegung erkannt' on('netatmo.0.xxxx.LastEventData.LastEventId', function (obj) { sendImage(); }); function sendImage() { var fs = require('fs'); var source_url; // Datum und Zeit var today = new Date(); var day = today.toLocaleDateString(); var timestamp = today.toLocaleTimeString().replace(/:/g,"-"); // Zielpfad lokal + Dateiname var dest_path = '/iobroker/iobroker-data/files/webcam/' + 'image-' + day + '-' + timestamp + '.jpg' ; //log(dest_path); // aktuelle URL source_url = getState("netatmo.0.xxxxx.yyyyy.live.picture").val; log(source_url); request.get({url: source_url, encoding: 'binary'}, function (err, response, body) { fs.writeFile(dest_path, body, 'binary', function(err) { if (err) { log('Fehler beim Bild speichern: ' + err, 'warn'); setTimeout(function() { sendTelegram('Fehler beim Bild speichern!'); }, 2000); } else { setTimeout(function() { sendTelegram(dest_path); }, 2000); } }); }); } function sendTelegram (fname) { try { sendTo('telegram.0', { text: fname, caption: message, disable_notification: true }); } catch(err) { if (err.code != "ENOENT") log(err); } setTimeout(function() { }, 3000); }xxxx und yyyy musst du ändern, das sind die Namen deiner CAM.
Bei Änderung von LastEventId wird die Bild-URL ermittelt, das Bild geladen und lokal mit Zeitstempel abgespeichert und an Telegram gesendet. (Achtung, Bild wird lokal nicht gelöscht!)
Frank
Hey,
ich bins wieder.Jetzt hat es die ganze Zeit so gut ausgesehen und jetzt ...?
seit gestern bekomme ich, trotz abfrage der einzelnen Kameras, alle Bilder geschickt.Im Detail:
Ich Kamera 1 erkennt eine Bewegung, Bilder von allen drei Kameras lokal abgespeichert und anschliessend per Telegram verschickt. Es solte aber nur ein Bild von der Kamera 1 verschickt werden.Hat jemand einen Vorschlag
dulles
-
Hey,
ich bins wieder.Jetzt hat es die ganze Zeit so gut ausgesehen und jetzt ...?
seit gestern bekomme ich, trotz abfrage der einzelnen Kameras, alle Bilder geschickt.Im Detail:
Ich Kamera 1 erkennt eine Bewegung, Bilder von allen drei Kameras lokal abgespeichert und anschliessend per Telegram verschickt. Es solte aber nur ein Bild von der Kamera 1 verschickt werden.Hat jemand einen Vorschlag
dulles
-
@frajop
Diesen Script habe ich dreimal angelegt. Für jede Kamera.- netatmo.0.xxxxxx.Netatmo-Garten.live.picture
- netatmo.0.xxxxxx.Netatmo-Hof.live.picture
- netatmo.0.xxxxxx.Netatmo-Carport.live.picture
var timer; var request; var user = 'dulles'; var message = 'CAM-GARTEN Bewegung erkannt' on('netatmo.0.xxxxxx.LastEventData.LastEventId', function (obj) { sendImage(); }); function sendImage() { var fs = require('fs'); var source_url; // Datum und Zeit var today = new Date(); var day = today.toLocaleDateString(); var timestamp = today.toLocaleTimeString().replace(/:/g,"-"); // Zielpfad lokal + Dateiname var dest_path = '/opt/iobroker/kamera/' + 'garten-' + day + '-' + timestamp + '.jpg' ; //log(dest_path); // aktuelle URL source_url = getState("netatmo.0.xxxxxx.Netatmo-Garten.live.picture").val; log(source_url); request.get({url: source_url, encoding: 'binary'}, function (err, response, body) { fs.writeFile(dest_path, body, 'binary', function(err) { if (err) { log('Fehler beim Bild speichern: ' + err, 'warn'); setTimeout(function() { sendTelegram('Fehler beim Bild speichern!'); }, 2000); } else { setTimeout(function() { sendTelegram(dest_path); }, 2000); } }); }); } function sendTelegram (fname) { try { sendTo('telegram.0', { user: user, text: fname, caption: message, disable_notification: true }); } catch(err) { if (err.code != "ENOENT") log(err); } setTimeout(function() { }, 3000); } -
@frajop
Diesen Script habe ich dreimal angelegt. Für jede Kamera.- netatmo.0.xxxxxx.Netatmo-Garten.live.picture
- netatmo.0.xxxxxx.Netatmo-Hof.live.picture
- netatmo.0.xxxxxx.Netatmo-Carport.live.picture
var timer; var request; var user = 'dulles'; var message = 'CAM-GARTEN Bewegung erkannt' on('netatmo.0.xxxxxx.LastEventData.LastEventId', function (obj) { sendImage(); }); function sendImage() { var fs = require('fs'); var source_url; // Datum und Zeit var today = new Date(); var day = today.toLocaleDateString(); var timestamp = today.toLocaleTimeString().replace(/:/g,"-"); // Zielpfad lokal + Dateiname var dest_path = '/opt/iobroker/kamera/' + 'garten-' + day + '-' + timestamp + '.jpg' ; //log(dest_path); // aktuelle URL source_url = getState("netatmo.0.xxxxxx.Netatmo-Garten.live.picture").val; log(source_url); request.get({url: source_url, encoding: 'binary'}, function (err, response, body) { fs.writeFile(dest_path, body, 'binary', function(err) { if (err) { log('Fehler beim Bild speichern: ' + err, 'warn'); setTimeout(function() { sendTelegram('Fehler beim Bild speichern!'); }, 2000); } else { setTimeout(function() { sendTelegram(dest_path); }, 2000); } }); }); } function sendTelegram (fname) { try { sendTo('telegram.0', { user: user, text: fname, caption: message, disable_notification: true }); } catch(err) { if (err.code != "ENOENT") log(err); } setTimeout(function() { }, 3000); }@dulles sagte in Netatmo Presence Objekt ID für Bewegung:
@frajop
Diesen Script habe ich dreimal angelegt. Für jede Kamera.- netatmo.0.xxxxxx.Netatmo-Garten.live.picture
- netatmo.0.xxxxxx.Netatmo-Hof.live.picture
- netatmo.0.xxxxxx.Netatmo-Carport.live.picture
var timer; var request; var user = 'dulles'; var message = 'CAM-GARTEN Bewegung erkannt' on('netatmo.0.xxxxxx.LastEventData.LastEventId', function (obj) { sendImage(); }); function sendImage() { var fs = require('fs'); var source_url; // Datum und Zeit var today = new Date(); var day = today.toLocaleDateString(); var timestamp = today.toLocaleTimeString().replace(/:/g,"-"); // Zielpfad lokal + Dateiname var dest_path = '/opt/iobroker/kamera/' + 'garten-' + day + '-' + timestamp + '.jpg' ; //log(dest_path); // aktuelle URL source_url = getState("netatmo.0.xxxxxx.Netatmo-Garten.live.picture").val; log(source_url); request.get({url: source_url, encoding: 'binary'}, function (err, response, body) { fs.writeFile(dest_path, body, 'binary', function(err) { if (err) { log('Fehler beim Bild speichern: ' + err, 'warn'); setTimeout(function() { sendTelegram('Fehler beim Bild speichern!'); }, 2000); } else { setTimeout(function() { sendTelegram(dest_path); }, 2000); } }); }); } function sendTelegram (fname) { try { sendTo('telegram.0', { user: user, text: fname, caption: message, disable_notification: true }); } catch(err) { if (err.code != "ENOENT") log(err); } setTimeout(function() { }, 3000); }Hat keiner eine Idee, woran es liegen kann.
dulles
-
Hi,
da ich mittlerweile auch eine zweite Kamera habe, hatte ich das gleiche Problem. Man kann es wie folgt lösen:Man benötigt das script nur einmal. Mit der EventId muss die Cam ID ermittelt werden, also welche Cam den Event ausgelöst hat. Dann kann man für diese CamId die Bild URL selektieren. Etwas umständlich, aber es funktioniert :-)
// LastEventId selektieren var LastEventId = getState("netatmo.0.xxx.LastEventData.LastEventId").val; // Fuer Event CamId fuer LastEvendId selektieren var id_path = 'netatmo.0.xxx.Events.' + LastEventId + '.camera_id'; var CamId = getState(id_path).val; // vorhandene CAM IDs selektieren var CAM1 = getState("netatmo.0.xxx.cam1.info.id").val; var CAM2 = getState("netatmo.0.xxx.cam2.info.id").val; // Welche CAM hat angeschlagen? if (CamId === CAM1) { source_url = getState("netatmo.0.xxx.cam1.live.picture").val; } else if (CamId === CAM2) { source_url = getState("netatmo.0.xxx.cam2.live.picture").val; } else { log('keine CAM erkannt'); } if (source_url) { // Bild schicken } -
Hi,
da ich mittlerweile auch eine zweite Kamera habe, hatte ich das gleiche Problem. Man kann es wie folgt lösen:Man benötigt das script nur einmal. Mit der EventId muss die Cam ID ermittelt werden, also welche Cam den Event ausgelöst hat. Dann kann man für diese CamId die Bild URL selektieren. Etwas umständlich, aber es funktioniert :-)
// LastEventId selektieren var LastEventId = getState("netatmo.0.xxx.LastEventData.LastEventId").val; // Fuer Event CamId fuer LastEvendId selektieren var id_path = 'netatmo.0.xxx.Events.' + LastEventId + '.camera_id'; var CamId = getState(id_path).val; // vorhandene CAM IDs selektieren var CAM1 = getState("netatmo.0.xxx.cam1.info.id").val; var CAM2 = getState("netatmo.0.xxx.cam2.info.id").val; // Welche CAM hat angeschlagen? if (CamId === CAM1) { source_url = getState("netatmo.0.xxx.cam1.live.picture").val; } else if (CamId === CAM2) { source_url = getState("netatmo.0.xxx.cam2.live.picture").val; } else { log('keine CAM erkannt'); } if (source_url) { // Bild schicken } -
Ich habe es wie folgt gelöst:
var timer; var request; var message = 'CAM Aktion erkannt' // Netatmo Datenpunkt auf Änderung prüfen on('netatmo.0.XXXX.LastEventData.LastEventId', function (obj) { // max. alle 30 sec if (!timer) { timer = setTimeout(function () { timer = null; }, 30000); } saveImage(); }); function saveImage() { var fs = require('fs'); var source_url; // Datum und Zeit var today = new Date(); var day = today.toLocaleDateString(); // Doppelpunkte im string druch - ersetzen var timestamp = today.toLocaleTimeString().replace(/:/g,"-"); // Zielpfad + Dateiname var dest_path = '/iobroker/iobroker-data/files/webcam/' + 'image-' + day + '-' + timestamp + '.jpg' ; log(dest_path); //---- aktuelle URL für Bild holen. -------------------------------------- // LastEventId selektieren var LastEventId = getState("netatmo.0.XXXX.LastEventData.LastEventId").val; // Fuer Event CamId fuer LastEvendId selektieren var id_path = 'netatmo.0.XXXX.Events.' + LastEventId + '.camera_id'; var CamId = getState(id_path).val; // CAM IDs selektieren var CAM1 = getState("netatmo.0.XXXX.Name1.info.id").val; var CAM2 = getState("netatmo.0.XXXX.Name2.info.id").val; // Welche CAM hat angeschlagen if (CamId === CAM1) { source_url = getState("netatmo.0.Home.Gelting Einfahrt.live.picture").val; } else if (CamId === CAM2) { source_url = getState("netatmo.0.Home.Gelting Garten .live.picture").val; } else { log('keine CAM erkannt'); source_url = 0; } if (source_url) { request.get({url: source_url, encoding: 'binary'}, function (err, response, body) { fs.writeFile(dest_path, body, 'binary', function(err) { if (err) { setTimeout(function() { sendTelegram('Fehler beim Bild speichern!'); }, 2000); } else { setTimeout(function() { sendTelegram(dest_path); }, 2000); } }); }); } } // Bild oder Text über Telegram senden function sendTelegram (fname) { try { sendTo('telegram.0', { text: fname, caption: message, disable_notification: true }); } catch(err) { if (err.code != "ENOENT") log(err); } setTimeout(function() { }, 3000); } -
Ich habe es wie folgt gelöst:
var timer; var request; var message = 'CAM Aktion erkannt' // Netatmo Datenpunkt auf Änderung prüfen on('netatmo.0.XXXX.LastEventData.LastEventId', function (obj) { // max. alle 30 sec if (!timer) { timer = setTimeout(function () { timer = null; }, 30000); } saveImage(); }); function saveImage() { var fs = require('fs'); var source_url; // Datum und Zeit var today = new Date(); var day = today.toLocaleDateString(); // Doppelpunkte im string druch - ersetzen var timestamp = today.toLocaleTimeString().replace(/:/g,"-"); // Zielpfad + Dateiname var dest_path = '/iobroker/iobroker-data/files/webcam/' + 'image-' + day + '-' + timestamp + '.jpg' ; log(dest_path); //---- aktuelle URL für Bild holen. -------------------------------------- // LastEventId selektieren var LastEventId = getState("netatmo.0.XXXX.LastEventData.LastEventId").val; // Fuer Event CamId fuer LastEvendId selektieren var id_path = 'netatmo.0.XXXX.Events.' + LastEventId + '.camera_id'; var CamId = getState(id_path).val; // CAM IDs selektieren var CAM1 = getState("netatmo.0.XXXX.Name1.info.id").val; var CAM2 = getState("netatmo.0.XXXX.Name2.info.id").val; // Welche CAM hat angeschlagen if (CamId === CAM1) { source_url = getState("netatmo.0.Home.Gelting Einfahrt.live.picture").val; } else if (CamId === CAM2) { source_url = getState("netatmo.0.Home.Gelting Garten .live.picture").val; } else { log('keine CAM erkannt'); source_url = 0; } if (source_url) { request.get({url: source_url, encoding: 'binary'}, function (err, response, body) { fs.writeFile(dest_path, body, 'binary', function(err) { if (err) { setTimeout(function() { sendTelegram('Fehler beim Bild speichern!'); }, 2000); } else { setTimeout(function() { sendTelegram(dest_path); }, 2000); } }); }); } } // Bild oder Text über Telegram senden function sendTelegram (fname) { try { sendTo('telegram.0', { text: fname, caption: message, disable_notification: true }); } catch(err) { if (err.code != "ENOENT") log(err); } setTimeout(function() { }, 3000); } -
Gib doch mal ein paar logs aus (source, dest), vielleicht kannst du erkennen wo es klemmt.
Du hast doch mit deinen scrpts schon Bilder geschickt, das hat doch funktioniert, oder!?@frajop
mit den alten Scripts habe ich Bilder verschicken können. Sie wurden auch im entsprechenden Verzeichnis vorher abgelegt. Aber zu diesem Zeitpunkt lief alles noch auf einem anderen Client (Rock64).
Auf dem PI4 hatte ich die alten Script nie am laufen. Ich vermute einal, dass es mit dem Betriebssystem (raspbian-buster-lite) zusammen hängt.
Mit der Datensicherung habe ich auch so einen Effekt, wenn ich den erstellten Backupfile in ein anderes Verzeichnis kopieren möchte.dulles
-
Gib doch mal ein paar logs aus (source, dest), vielleicht kannst du erkennen wo es klemmt.
Du hast doch mit deinen scrpts schon Bilder geschickt, das hat doch funktioniert, oder!?@frajop
Zur Info....
Das Problem hat eine Ende. Es lag an dem Namen der gespeicherten Bilddatei. Genauer gesagt an der Variable "LokaleDate" . Hier wird ein Ergebnis "xx/xx/xx" ausgespuckt und mit den Slash "/" kommt Linux als Namen nicht zurecht. Gelöst habe ich folgendermaßen.- diesen Eintrag löschen
var day = today.toLocaleDateString();- dafür diese Einträge einsetzen
var d = new Date(); var mm = d.getMonth() + 1; var dd = d.getDate(); var yy = d.getFullYear();- dann noch folgende Zeile (speichern des Dateinamen) anpassen
var dest_path = '/opt/iobroker/data/webcam/' + 'image-' + dd + '-' + mm + '-' + yy + '-' + timestamp + '.jpg' ;Nochmal danke für die Vorlage des Scriptes. Jetzt bekomme ich auch noch eine Benachrichtigung und nur ein Bild (Bild von der auslöstenden Kamera.
dulles