NEWS
Netatmo Presence Objekt ID für Bewegung
-
Hallo zusammen,
ich versuche mir ein Bild per Telegram zu zusenden, wenn die Kamera eine Bewegung erkennt. Bei der Kamera handelt es ich um eine Netatmo Presence.
Welchen Wert muss ich als Objekt ID auswählen, damit ich die Bewegungserkennung einbinden kann.dulles
-
Hi,
du musst den Datenpunkt 'netatmo.0.xxxxx.LastEventData.LastEventId' auf Änderung prüfen. Bei Änderung holst du mit
var url = getState("netatmo.0.xxxx.yyyy.live.picture").val; die aktuelle URL für Bild. Von dieser URL dann das Bild holen und schickenFrank
-
@frajop
Danke für die Info.
Wie kann ich feststellen, welche Kamera nun ausgelöst hat.
Oder wie kann ich gezielt mir ein Bild von der ausgelösten Kamera ein Bild zuschicken lassen. Ich habe 3 Netatmo Presence installiert.dulles
-
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
-
@frajop
entweder stehe ich auf dem Schlauch, oder ich verstehe es noch nicht.
Der Datenpunkt "netatmo.0.xxxx.yyyy.live.picture" ist für jede Kamera vorhanden. Aber den Datenpunkt "netatmo.0.xxxx.yyyy.live.picture" gibt es nur einmal.Deshalb stelle ich mir immer noch die Frage, wie dann die Abfrage für jede Kamera ausführen soll.
dulles
-
Hey,
ich noch einmal. Ich habe auf dem Schlauch gestanden.
Habe den JS von Dir entsprechend angepasst und den für jede Kamera.
Super Sache, läuft wunderbar.Jetzt muss ich nur zusehen, dass die Daten regelmässig oder gleich nach dem Versenden lokal gelöscht werden. Muss sie nicht gespeichert aufheben.
Danke
dulles
-
Kannst Du mir noch helfen, wie ich die Nachricht bzw. das Bild nur an einen Benutzer/User schicken kann ?
dulles
-
Moin,
Löschen könnte so gehen, unlink nach einer Wartezeit:function sendImage (fname) { try { sendTo('telegram.0', { text: fname, caption: message, disable_notification: true }); } catch(err) { if (err.code != "ENOENT") log(err); } setTimeout(function() { deleteImage(fname); }, 3000); } function deleteImage(fname) { try { try { fs.unlinkSync(fname); } catch(err) { if (err.code != "ENOENT") log(err); } } }
Frank
-
@dulles
Hi,
schau mal hier:
https://github.com/iobroker-community-adapters/ioBroker.telegram
Dort steht eigentlich alles
Frank -
Da ich nicht so der Profi für JS bin,
würde das so passen ?var timer; var request; var user = 'Name des Empfänger'; var message = 'CAM Bewegung erkannt'
function sendImage (fname) { try { sendTo('telegram.0', { user: user, text: fname, caption: message, disable_notification: true }); }
Danke
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
-
@dulles
zeig doch mal dein scriptFrank
-
@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 }
-
@frajop
Hey,
Da ich nicht der beste in JS bin, kannst Du einmal den kompletten Script einstellen.
Ich würde es gerne einmal testen. Bis jetzt sind meine Tests alle in die Hose gegangen.dulles
-
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); }
-
@frajop
Danke schon einmal für den Script.
Bekomme aber noch einen Fehler
" Fehler beim Bild speichern"
habe schon versucht in verschiedene Verzeichnisse zu speichern,
hat aber nichts geholfen. Kannst Du mir einen Tipp geben.dulles
-
Stimmt evtl. der Pfad/Dateinamen nicht? Mein Beispiel ist für Windows.
Frank