
Bilder von Überwachungskamera per Telegram versenden
Aus aktuellem Anlass und weil es immer wieder nachgefragt wird habe ich mal in meinem ioBroker-Notizbuch gestöbert und ein „altes“ Script (hat mir schon über 4000 Bilder geschickt) ausgegraben und etwas hübsch gemacht.
Im Script geht es darum, dass mein ioBroker mir beim Auslösen des Bewegungsmelders im Vorgarten ein Bild per Telegram-Messenger schickt, im Abstand von jeweils 3 Sekunden noch zwei weitere Bilder aufnimmt und auf Nachfrage ebenfalls zusendet.
Für dieses Tutorial habe ich das Script dann noch etwas verfeinert und die Möglichkeit zum Deaktivieren der Benachrichtigung und einen anpassbaren Zeitintervall für die Aufnahme der zusätzlichen Bilder hinzugefügt.
Im Folgenden will ich nun kurz beschreiben wie Ihr mein Script einsetzen könnt und die einzelnen Parameter konfiguriert. Zuerst klären wir aber mal die Vorraussetzungen.
Voraussetzungen
Ich werde versuchen das Tutorial nach Möglichkeit vollständig “copy-and-paste-fähig” zu schreiben, trotzdem solltet ihr nach Möglichkeit schon etwas ioBroker-Erfahrung mitbringen. Ich beziehe mich natürlich auch hier wieder auf meine eigene ioBroker-Umgebung (ioBroker unter Docker auf der Synology DiskStation), was allerdings nicht bedeutet, dass dieses Tutorial nicht 1:1 auch auf anderen Systemen umgesetzt werden kann. Außerdem setze ich folgendes voraus:
-
Eine eingerichtete IP-Kamera und Pfad zum Kamerabild (Standbild)
-
Ein Bewegungsmelder und/ oder anderer Auslöser
-
Eine funktionsfähige ioBroker-Installation
Konfiguration Telegram-Adapter
Wenn ihr bisher eventuell den Telegram-Adapter nur zum Senden von Benachrichtigungen genutzt habt, müsst ihr ggf. noch eine Einstellung anpassen. Dies ist die Verknüpfung des Adapters mit dem Text2command-Adapter.
Zu finden ist die Option in den Einstellungen des Telegram Adapters unter „NACHRICHTEN > Text2Command-Instanz“. Hier bitte die Text2Command-Instanz, die ihr verwenden wollt auswählen und speichern.
Javascript anlegen und konfigurieren
Als nächstes einfach ein neues Javascript unter “Scripte” anlegen und die Zeilen aus dem Script hinter diesem Link hinein kopieren:
Die zu konfigurierenden Parameter im Script sollten eigentlich ausreichend kommentiert sein, sodass ich darauf hier wohl nicht weiter eingehen muss.
Hinweis
Solltet ihr das Verzeichnis für die Speicherung der Kameraaufnahmen übernehmen, so müsst ihr den Ordner vor der Inbetriebnahme noch anlegen. Dies geht am einfachsten über die Konsole über den Befehl:mkdir -p /opt/iobroker/temp/cam/
Konfiguration der Steuerbefehle im Text2Command-Adapter
Wenn ihr soweit alles richtig gemacht habt, dann sollte das Script euch nun bereits bei automatischer Auslösung das erste aufgenommene Bild zusenden. Damit Ihr aber z.B. weitere Bilder abfragen könnt, müssen noch ein paar Schlüsselworte und Aktionen im Text2Command-Adapter konfigurieren
Dazu öffnet einfach die Adapter-Website und konfiguriert folgende Aktionen:
Im Einzelnen bildet das dann folgende Funktionen ab:
Mehr Bilder
Triggerworte: | mehr bilder |
Variablen-ID: | javascript.0.notify.telegram.cam.trigger_more_img |
Wert: | true |
Antwort: | Geht los./Kommen sofort./OK. |
Benachrichtigungen aktivieren
Triggerworte: | kamera benachrichtigung einschalten/kamera benachrichtigung ein/kamera benachrichtigung aktivieren |
Variablen-ID: | javascript.0.notify.telegram.cam.disable |
Wert: | false |
Antwort: | Kamera Haustür: Benachrichtigung aktiv! |
Benachrichtigungen deaktivieren
Triggerworte: | kamera benachrichtigung ausschalten/kamera benachrichtigung aus/kamera benachrichtigung deaktivieren |
Variablen-ID: | javascript.0.notify.telegram.cam.disable |
Wert: | true |
Antwort: | Kamera Haustür: Benachrichtigung inaktiv! |
Manuelle Auslösung
Triggerworte: | kamera |
Variablen-ID: | javascript.0.notify.telegram.cam.trigger_manu |
Wert: | true |
Antwort: | Geht los./Kommt sofort./OK. |
Von nun an sollte euch das Script bei jeder Auslösung ein Bild zusenden. Mit “Mehr Bilder” könnt ihr die anderen beiden Bilder abrufen. Mit dem Schlüsselwort “Kamera” löst ihr das Script manuell aus. Über das Senden von z.B. “Kamera Benachrichtigung aus” oder “Kamera Benachrichtigung ein” könnt ihr das automatische zusenden ein- und ausschalten. Natürlich könnt ihr die Schlüsselworte/ -phrasen nach Belieben gestalten. 🙂
Ich hoffe ihr könnt mit meinem kurzen Tutorial etwas anfangen. Bei Fragen und Anregungen zum Tutorial freue ich mich auf eure Kommentare. Bitte berücksichtigt, dass ich keinen individuellen Support per E-Mail anbieten kann. Nutzt also bitte die öffentlichen Kanäle wie Kommentare, Foren oder Social Media. Gerne könnt ihr mich bei Bedarf auch per E-Mail oder Direktnachricht auf einen Post/ Thread/ Kommentar aufmerksam machen. Danke.
MfG,
André
Änderungshistorie
2020-10-06
Überarbeitung und Umzug auf smarthome.buanet.de.
Hallo,
ich habe eine Frage: Ich würde gerne noch eine Abhängigkeit einstellen, wenn ich beispielsweise nicht zu Hause bin oder die Tür ist verschlossen oder in der Nacht. Wie würdet Ihr das umsetzen ?
Gruß Björn
Hallo Björn,
das sollte eigentlich ganz einfach funktionieren. Entweder du erweiterst das Script um einen eigenen Trigger oder du nutzt den Datenpunkt „javascript.0.notify.telegram.cam.disable“. Den kannst du z.B. einfach mit einem zusätzlichen Script je nach Anwesenheit schalten und damit die Benachrichtigungen aktivieren und deaktivieren.
MfG,
André
Vielen Dank! Ich hab es jetzt einfach mit einem Blockly Script gelöst!
Hallo
Erstmals vielen Dank für das Teilen
Ich hab alle soweit eingerichtet und habe den iobroker auch im Docker nach deiner Anleitung am Laufen.
Leider hab ich anscheinend ein Problem mit den Berechtigungen auf dem Ordner.
Kannst du mir eventuell genau sagen welche Rechte du vergeben hast und wie du das gemacht hast (Visu Synology oder per Console)?
javascript.0 2020-12-16 17:21:44.906 warn (984) script.js.Testscripte.IPCAM_Bild_Telegram: Fehler beim Speichern von Bild 3: Error: ENOENT: no such file or directory, open ‚/opt/iobroker_data/ipcam/cam1_3.jpg‘
javascript.0 2020-12-16 17:21:44.905 error (984) Request error: Error: Parse Error: Invalid header token
Vielen lieben Dank schon mal für deine Hilfe.
Hallo Christian,
existiert der Ordner? das Script kann nur die Datei anlegen, nicht aber einen Ordner/ Unterordner.
MfG,
André
Hallo Andre,
Ja der Ordner besteht definitiv und die Rechte sollten auch passen.
LG
Christian
Jetzt seh ich es erst. 🙂 Der Pfad im Script scheint falsch:
ändere mal
/opt/iobroker_data/ipcam/cam1_3.jpg
zu
/opt/iobroker/iobroker_data/ipcam/cam1_3.jpg
oder
/opt/iobroker/ipcam/cam1_3.jpg
Je nachdem wo es wirklich hin soll…
MfG,
André
Erst einmal danke für dieses Tutorial. Die Einrichtung hat soweit geklappt, aber ich erhalte immer nur den Pfad des Bildes geschickt. Ich meine es müsste das Bild geschickt werden. Was genau mache ich falsch?!
Bei „Mehr Bilder“ erhalte ich folgende Antworten:
Ok,
/opt/iobroker/temp/cam/cam1_2.jpg
/opt/iobroker/temp/cam/cam1_3.jpg
Hallo Aike,
das muss an deinem Script liegen. Offenbar wird dein Pfad nicht als Bild sondern als Text interpretiert. Da ich kein JavaScript Spezi bin kann ich dir nur empfehlen mal im ioBroker Forum zu Fragen. Am Besten mit deinem Script und einem Hinweis auf mein Tutorial. Bin mir sicher dass sich ein JavaScript Spezi findet, der dann ruck Zuck gelöst bekommt.
Die Lösung würde mich dann allerdings auch interessieren…
MfG,
André
Es lag an den Rechten des Ordners 🙈
Hallo, habe das gleiche Problem, wie war hier die Lösung?
The commands for modifying file permissions and ownership are:
chmod -R ugo+rw /opt/iobroker/temp/cam/
Hey, danke für das Tutorial. Hat wunderbar geklappt. Hab es ein bisschen auf meine Bedürfnisse angepasst. 🙂
Gruß, Kai
Ich bekomme es nicht hin . Das Verzeichnis für die Bilder bleibt leer und es passiert garnix .
// Variablen
var cam_img = ‚http://BEN:PW@192.168.100.20/jpgmulreq/1/image.jpg?key=0&lq=0‘;
var trigger_auto = ‚knx.0.Licht_OG.Raum_uber_Garage.Licht_Büro_schalten‘;
var trigger_manu = ‚javascript.0.notify.telegram.cam.trigger_manu‘;
var trigger_more_img = ‚javascript.0.notify.telegram.cam.trigger_more_img‘;
var disable = ‚javascript.0.notify.telegram.cam.disable‘;
var interval = ‚3000‘;
var img_path = ‚/opt/iobroker/temp/cam/‘;
Der Link öffnet im Browser das Bild der IP Cam.
Wenn ich /kamera schreibe kommt als Antwort „Geht los“
Hallo Joschi,
leider eignen sich die Kommentare hier nicht so sehr für Code.
In deinen Variablen sehe ich nach dem „Ist-Gleich“ aber Kommata??
Siehe: „var interval = ‚3000‘;“.
Das kann so eigentlich nicht stimmen…
MfG,
André
Ist im original nicht so .
24.8.2020, 16:12:12.694 [info ]: javascript.0 (5425) Stop script script.js.common.Bild_von_Webcam_holen
24.8.2020, 16:12:12.799 [info ]: javascript.0 (5425) Start javascript script.js.common.Bild_von_Webcam_holen
24.8.2020, 16:12:12.815 [info ]: javascript.0 (5425) script.js.common.Bild_von_Webcam_holen: registered 3 subscriptions and 0 schedules
24.8.2020, 16:18:19.614 [info ]: javascript.0 (5425) script.js.common.Bild_von_Webcam_holen: Bild 1 gespeichert.
24.8.2020, 16:18:19.624 [error]: javascript.0 (5425) script.js.common.Bild_von_Webcam_holen: ReferenceError: cd is not defined
24.8.2020, 16:18:19.624 [error]: javascript.0 (5425) at sendImage (script.js.common.Bild_von_Webcam_holen:58:14)
24.8.2020, 16:18:19.625 [error]: javascript.0 (5425) at script.js.common.Bild_von_Webcam_holen:69:13
24.8.2020, 16:18:19.757 [error]: host.raspberrypi Caught by controller[0]: at sendImage (script.js.common.Bild_von_Webcam_holen:58:14)
24.8.2020, 16:18:19.758 [error]: host.raspberrypi Caught by controller[0]: at script.js.common.Bild_von_Webcam_holen:69:13
24.8.2020, 16:18:54.982 [info ]: javascript.0 (5589) Start javascript script.js.common.Bild_von_Webcam_holen
24.8.2020, 16:18:54.993 [info ]: javascript.0 (5589) script.js.common.Bild_von_Webcam_holen: registered 3 subscriptions and 0 schedules
Sorry, da hab ich auch keine Idee. Die Fehlermeldung ist schon komisch, da „cd“ gar nicht verwendet wird. Da braucht es mal nen javascript Spezi. Vielleicht kann dir wer im ioBroker Forum sagen wo es da klemmt….
MfG,
André
Eigentlich geht es jetzt . Nur nicht über das trigger Objekt , Habe KNX , ist das dann so Richtig ?
var trigger_auto = ‚knx.0.Licht_OG.Raum_uber_Garage.Licht_Büro_schalten‘; // Datenpunkt zur autmatischen Auslösung
Habe ich aus den Objekten rauskopiert zum testen
Vielen dank
Joschi
Habe gerade herausgefunden wenn ih das Objekt direkt im IoBroker Anstoße geht es . Vom Schalter passiert nix ?
Du hast hier mehrere Benutzer auf dem selben Bot. Wie hast du das hingekriegt? Sobald sich meine Frau anmeldet werde ich raus geschmissen und umgekehrt. Was könnte die Ursache sein?
Danke für die Hilfe
Hallo Oliver,
ich wüsste nicht, dass ich was spezielles gemacht habe. Habe einfach meine Frau auf den gleichen Bot connected und es läuft. Vielleicht kann dir der Entwickler vom telegram-Adapter helfen. Am Besten du versuchst es mal im ioBroker-Forum oder direkt bei Github.
MfG,
André
MfG,
André
Hi, ich habe 2 Fragen dazu 🙂
1) hat es schon einer hinbekommen eine kurze Video Sequenz zu erstellen anstatt ein Bild ?
2) kann man eine Verzögerung mit einbauen ? Also der Trigger kommt aber das Foto wird erst nach zum Beispiel 5 sekunden erstellt ?
Hallo,
ich habe 2 Antworten dazu 🙂
1. Meines Wissens nicht, wenn du es schaffst bin ich zwecks Erweiterung des Tutorials aber sehr interessiert. Dann aber bitte das Video nicht als Push, sondern wie „Mehr Bilder“ nur auf Abruf…
2. Verstehe ich nicht, ist doch für Bild 2 und 3 bereits eingebaut
var interval = '3000'; // Verzögerung der weiteren Aufnahmen in Millisekunden
. Das sollte sich ohne Probleme analog auch auf das erste Bild anwenden lassen…MfG,
André
Würde gerne statt Bildern ein kurzes Video (Stream) erstellen und senden.
Hallo Uwe,
ist das eine Frage? Falls ja, dann kann ich dir leider nur mitteilen, dass mein Script nur auf Bilder ausgelegt ist.
Falls du es aber als Vorlage nehmen willst die Video-Aufnahme zu integrieren, dann würde ich mich freuen wenn du mir das Resultat anschließend zur Verfügung stellen könntest. Dann würde ich das Tutorial gerne um diese Funktion erweitern. Vielleicht statt des Buttons „Mehr Bilder“ ein „Video abrufen“ einfügen? Währe schon ein nettes Feature…
MfG,
André
Hallo, hab alles benötigte am laufen aber irgendwie will dein skript nicht laufen.
13:24:40.003 info javascript.0 (8602) Stop script script.js.Klingel.Bild_beim_klingeln_Bild_senden
13:24:40.106 info javascript.0 (8602) Start javascript script.js.Klingel.Bild_beim_klingeln_Bild_senden
13:24:40.106 error javascript.0 (8602) script.js.Klingel.Bild_beim_klingeln_Bild_senden compile failed: at script.js.Klingel.Bild_beim_klingeln_Bild_senden:12
ich hab leider auch keine Ahnung was ich falsch mache.
Hallo und ein gesundes neues Jahr. Hat sich erledigt, es läuft:-) Vielen Dank für das Script! Ich hatte einen winzigen Fehler in der CamIP
Danke nochmal
Hi, vielen Dank für die Funktion. Das erste Bild kommt perfekt an, bei „mehr Bilder“ kommt im Log aber nur: Object “ javascript.0.notify.telegram.cam.trigger_more_img“ does not exist!
Kann mir jemand helfen?
Hallo Hans,
bitte unter „// Variablen“ im Script die Pfade zu den Objekten anpassen.
Wahrscheinlich liegt das angemeckerte Objekt bei dir in: „javascript.0.trigger_more_img“. Es sei denn du hast die Objekte manuell angelegt und „// Datenpunkte anlegen“ auskommentiert…
MfG,
André
Hallo André,
ich hatte scheinbar ein Leerzeichen im Text2Command-Parameter. Problem ist behoben und alles funktioniert perfekt! danke nochmals.
Hallo,
großes Lob für diese gute Arbeit ! Tolle Idee und tolle Ausführung. Genau so etwas habe ich gesucht.
Die Trigger-Objekte wurden bei mir zwar nicht durch das Skript angelegt, aber nach manueller Anlage läuft es prima.
Ein kleines Problem habe ich aber noch:
Wird der automatische Trigger ausgelöst, wird ein Bild versandt und Telegramm verbleibt in einem Dialogmodus. Dort wird dann kein weiteres Bild angezeigt, wenn der Trigger erneut anschlägt. Erst nach Klick auf „Danke“ ist Telegramm wieder bereit neue Bilder anzuzeigen. Da ich ja nicht immer Zeit habe, jedes Bild zu „bestätigen“ wäre es toll, wenn die Bilder einfach chronologisch angezeigt werden würden.
Hallo Anni,
das Problem kann ich nicht nachvollziehen. Ich bekomme auch ohne Beenden des „Dialogmodus“ weitere Bilder angezeigt.
Der „Dialogmodus“ ist ja im Prinzip auch nichts anderes als das Einblenden einer alternativen Tastatur mit Buttons für vorgefertigte Befehle. Wenn du dir das Script einmal anschaust, dann siehst du das auch. Steht in der Funktion zum Senden der Bilder. Wenn du dort
keyboard: [
['Mehr Bilder', 'Danke']
],
entfernst werden die Buttons nicht mehr angezeigt.
MfG,
André
Hallo, danke für die Antwort.
Du hast natürlich vollkommen Recht. Das Problem war das Triggerobjekt, welches nicht zurückgesetzt wurde. Hatte also überhaupt nichts mit dem „Dialogmodus“ zu tun. Nach Löschen der Kommentarstriche in deinem Skript setzt das Skript den Trigger nun zurück und es läuft wunderbar.
Die Keyboard-Auswahl habe ich noch um einen Button für Bilder von der anderen Webcam erweitert. Echt sehr komfortabel.
Danke für diese Einführung in Javascript. da habe ich als ausschließlicher Blockly-Anwender mal einen Einblick gewonnen. Bitte gerne mehr von diesen tollen Projekten.
Gruß
Anni
Hi,
echt super gemacht!
Nachdem ich dem Ordner die passenden Rechte geben hatte und Text2Command auf den 2 Telegram Adapter gelegt hatte, hat das Script sofort und ohne Fehler funktioniert!
Danke für die Arbeit! 😉
Ich bekomme beim speichern die Meldung: EACCES: permission denied Open /pfad
Kannst du mir verraten wie du das mit den Rechten gelöst hast?
Vielen Dank für das Script! Bei mir (Dahua IP Cam’s) wurden leere Dateien angelegt. Per URL im Browser ging es zwar mit user und pw in der URL aber offensichtlich in request.get nicht. Meine Lösung (Fehlerbehandlung fehlt), vielleicht nützt es ja noch jemandem:
var USER = ‚admin‘;
var PASS = ’secretpassword‘;
request(cam_img , function (error, response, body) {
if ((error) || (response.statusCode !== 200)) {
// self.emit(„error“, ‚ERROR ON SNAPSHOT‘);
}
})
.auth(USER,PASS,false).pipe(fs.createWriteStream(img_path + ‚cam1_1.jpg‘));
Gruss, Thomas
DANKE, hat geholfen 😉
Hey,
vielen dank für die Anleitung.
Leider bin ich mit google und probieren nicht so wirklich weiter gekommen, aber gibt es auch eine Möglichkeit als Pfad die Raspberry Cam direkt zu integrieren?
Vielen Dank für eine Antwort.
Gruß Lucas
Hallo Lukas,
ob das so direkt geht kann ich dir nicht sagen. Da habe ich keinerlei Erfahrungen zu.
Allerdings hatte ich mir mal aus nem Raspberry mit USB-Webcam eine Überwachungskamera gebaut. Die Software dazu hieß „MJPG-Streamer“ und stellt dir verschiedene Streams (und ein Webinterface) zur Verfügung. Wenn du das zum Laufen bringst, kannst du den Stream von dort auch in meinem Script verwenden. Viel Erfolg!
MfG,
André
Hallo André,
Vielen Dank für die Antwort, an den Umweg hatte ich auch schon gedacht, leider hat sich die Installation an irgendeiner Stelle mit dem iobroker oder so nicht vertragen.
Aber ich werde mir heute wohl noch einen raspberry kaufen und es über diesen einrichten.
Gruß Lucas
Nabend, habe mal etwas rumexperimentiert und ich benötigte beim auto trigger noch eine funktion die true wieder auf false setzt. habe es so gelöst: // trigger_auto
on(trigger_auto, function(dp) {
stateTrigger_auto = dp.newState.val;
stateDisable = getState(disable).val;
if (stateTrigger_auto === true && stateDisable === false) {
saveImage();
setStateDelayed( trigger_auto, false, true, parseInt(15000, 10), false);
}
});
Hoffe ist alles richtig funzt auf jeden fall
Hallo Alex,
danke für die Ergänzung. Ist bei mir nicht notwendig, da der Bewegungsmelder das ja nach einer bestimmten Zeit automatisch macht.
Es geht aber glaub ich sogar noch einfacher. 🙂 Am Ende des Scriptes subscribe ich ja die Auslöser. Die Auslöser von „mehr Bilder“ und „manuell“ setze ich dort auch gleich wieder zurück. Könnte man auch für „automatisch“ so machen. Werde das mal als auskommentierte Option einbauen.
MfG,
André
bei mir schickt telegramm dann kein bild sondern nur ein link zum pfad/bild. im ordner liegt dann auch kein bild ;( pfad zur kam ist def in ordnung und pfad existiert auch…
ist eine instar: http://192.168.xxx.xxx:xx/snapshot.cgi?user=admin&pwd=
ich hab kein pwd vergeben…
Hatte ich auch erst . Nachdem ich „mehr Bilder“ zurück geschickt habe , kommen dann richtige Bilder . Evt. hilft es bei dir auch .