Seit ein paar Wochen ist eine Edimax Kamera bei mir im Einsatz und es fallen mir immer wieder neue Sachen hierzu ein. Es ist unheimlich spannend was in Kombination mit einem Raspberry Pi, Node-Red, UNIX-Scripts so alles möglich ist.

Als erstes haben mich die CGI-Remote Befehle interessiert, da die Kamera via IoT, MQTT und Smarthome unabhängig gesteuert werden soll, um nicht die Software des Hersteller nehmen zu müssen.
Es gab hierzu echt ein paar sehr interessante Ergebnisse die hier im Blog dokumentiert sind :
Edimax Kamera mit MQTT steuern
In Verbindung mit Node-Red und ein wenig UNIX-Shellscripts kann man wirklich sehr interessante Dinge machen. Zum Beispiel Bilder der Kamera als Snapshot an Twitter zu senden. Die werden dann über einen Crontab Mechanismus via Node-Red angesteuert und automatisiert an Twitter gesendet.
Die Anleitung hierzu gibt es hier: Webcam Bilder mit Raspberry Pi an Twitter senden
Nun kam eine weitere Idee hinzu, alle 15 Minuten automatisiert ein Bild (Snapshot) von der Kamera aufzunehmen, welches dann auf ein NAS-Storage gespeichert wird und zusätzlich per FTP an einen FTP-Server.
Der erste Akt mit dem Snapshot auf ein NAS-Storage ist sehr einfach gelöst, da die Kamera in den Einstellungen die Möglichkeit hat, ein SMB-Fileshare einzubinden. Der Befehl hierzu ist wie folgt:
"wget -O /tmp/snapshot.txt http://admin:1234@192.168.2.1/camera-cgi/admin/recorder.cgi?action=snapshot
Wenn die Anmeldedaten stimmen und die IP-Adresse, kann man einfach in einer Linux-Shell diesen oben angezeigten Befehl kopieren und ENTER drücken. Die Kamera macht dann ein Snapshot auf dass von dem eingestellten Speichermedium zb. Speicherkarte, oder NAS-Storage.

So sieht dann die Verzeichnisstruktur aus wenn die Bilder gespeichert werden.
Nun verbinden wir den oben gezeigten Befehl mit Node-Red wie folgt:
[{"id":"20d83420.f421f4","type":"inject","z":"4bbf54b9.3f94dc","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"*/15 0-22 * * *","once":false,"x":263.88330078125,"y":205,"wires":[["beb64a0.07e90b8"]]},{"id":"beb64a0.07e90b8","type":"exec","z":"4bbf54b9.3f94dc","command":"wget http://admin:1234@192.168.2.1/jpg/image.jpg -O /home/pi/webcams/wohnzimmer/wohnzimmer.jpg","addpay":false,"append":"","useSpawn":"","timer":"","name":"Snapshot","x":551.88330078125,"y":204,"wires":[["6bd99122.6ac518"],[],[]]},{"id":"573399e1.7acec","type":"function","z":"4bbf54b9.3f94dc","name":"Test Function 5","func":"if (msg.payload == \"Snapshot\") {\n return [ msg, null, null, null, null ];\n} else if (msg.payload == \"Inside\") {\n return [ null, msg, null, null, null ];\n} else if (msg.payload == \"InsideFTP\") {\n return [null, null, msg, null, null];\n} else if (msg.payload == \"Cam4\") {\n return [null, null, null, msg, null];\n} else {\n return [null, null, null, null, msg];\n}\n\n","outputs":"5","noerr":0,"x":267.88330078125,"y":301,"wires":[["71e0772f.264b7","f704e77d.3ec658"],["71e0772f.264b7","77606f6e.ada608"],["71e0772f.264b7","beb64a0.07e90b8"],["71e0772f.264b7"],["71e0772f.264b7"]]},{"id":"6bd99122.6ac518","type":"debug","z":"4bbf54b9.3f94dc","name":"","active":true,"console":"false","complete":"false","x":881.88330078125,"y":191.7833251953125,"wires":[]},{"id":"71e0772f.264b7","type":"debug","z":"4bbf54b9.3f94dc","name":"","active":true,"console":"false","complete":"false","x":799.88330078125,"y":296.1166687011719,"wires":[]},{"id":"4f83e0e9.c8d488","type":"mqtt in","z":"4bbf54b9.3f94dc","name":"","topic":"cam","qos":"2","broker":"191d04ca.0c7d13","x":93.88330078125,"y":301,"wires":[["573399e1.7acec"]]},{"id":"f704e77d.3ec658","type":"exec","z":"4bbf54b9.3f94dc","command":"wget -O /tmp/snapshot.txt wget http://admin:password@192.168.2.1/camera-cgi/admin/recorder.cgi?action=snapshot","addpay":false,"append":"","useSpawn":"","timer":"20","name":"Snapshot on Storage","x":597.88330078125,"y":90.99999237060547,"wires":[[],[],[]]},{"id":"77606f6e.ada608","type":"exec","z":"4bbf54b9.3f94dc","command":"wget http://admin:1234@192.168.2.1/jpg/image.jpg -O /home/pi/webcams/wohnzimmer/wohnzimmer.jpg","addpay":false,"append":"","useSpawn":"","timer":"","name":"Take Photo","x":565,"y":144.88330078125,"wires":[["385d6b0e.61ba84"],[],[]]},{"id":"4ba9dc04.feb0ec","type":"inject","z":"4bbf54b9.3f94dc","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"*/15 0-22 * * *","once":false,"x":263.88330078125,"y":93,"wires":[["f704e77d.3ec658"]]},{"id":"385d6b0e.61ba84","type":"file in","z":"4bbf54b9.3f94dc","name":"Read locale Photo","filename":"/home/pi/webcams/wohnzimmer/wohnzimmer.jpg","format":"","x":789,"y":132.88330078125,"wires":[["17db7b2b.f8cbfd"]]},{"id":"a58b9ac5.2cb0e8","type":"inject","z":"4bbf54b9.3f94dc","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":266.0000305175781,"y":144.88330078125,"wires":[["77606f6e.ada608"]]},{"id":"17db7b2b.f8cbfd","type":"change","z":"4bbf54b9.3f94dc","name":"","rules":[{"t":"set","p":"media","pt":"msg","to":"payload","tot":"msg"},{"t":"set","p":"payload","pt":"msg","to":"Current Photoshoot Inside","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1025,"y":132.88330078125,"wires":[["91915da2.530c8"]]},{"id":"91915da2.530c8","type":"twitter out","z":"4bbf54b9.3f94dc","twitter":"","name":"Tweet","x":1206,"y":132.88330078125,"wires":[]},{"id":"191d04ca.0c7d13","type":"mqtt-broker","z":"","broker":"mqtt.unixweb.de","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"willTopic":"","willQos":"0","willPayload":"","birthTopic":"","birthQos":"0","birthPayload":""}]
[{"id":"a9d46366.097b78","type":"exec","z":"4bbf54b9.3f94dc","command":"/home/pi/bin/ftp.sh ","addpay":false,"append":"","useSpawn":"","timer":"","name":"FTP Upload","x":802.88330078125,"y":415.1665954589844,"wires":[["ba23f689.ec4448"],[],[]]},{"id":"e4e8f1ef.3fd","type":"watch","z":"4bbf54b9.3f94dc","name":"Wohnzimmer","files":"/home/pi/webcams/wohnzimmer","x":502.88330078125,"y":412.1999206542969,"wires":[["a9d46366.097b78"]]},{"id":"ba23f689.ec4448","type":"debug","z":"4bbf54b9.3f94dc","name":"","active":true,"console":"false","complete":"false","x":1055.88330078125,"y":400.5500183105469,"wires":[]}]
Hier das UNIX-Script, welches lokal auf dem Raspberry Pi zb. unter /home/pi/bin/ gespeichert werden kann mit dem Namen „ftp.sh“ :
#!/bin/bash #set -x DATE=$(date +%d-%m-%y) DATEFILE=`cat /tmp/date.txt` FILE=backup_`date +%Y%m%d_%H%M%S`.jpg if [ "$DATE" = "$DATEFILE" ]; then echo put /home/pi/webcams/wohnzimmer/wohnzimmer.jpg /$DATE/$FILE |ftp ftp.<meinserver>.de else echo $DATE > /tmp/date.txt echo mkdir $DATE |ftp ftp.<meinserver>.de echo put /home/pi/webcams/wohnzimmer/wohnzimmer.jpg /$DATE/$FILE |ftp ftp.<meinserver>.de fi
Wenn jetzt der Befehl „InsideFTP“ an Topic „cam“ per MQTT-Server Deiner Wahl gesendet wird, wird ein Bild von der Kamera aufgenommen und per FTP auf den FTP-Server hochgeladen.
Ein kleiner Trick fehlt hier noch für das automatische FTP-Login per Shellscript. Hierzu musst Du prüfen unter welchen Benutzer „node-red“ läuft. Wenn dieser unter dem Benutzer „pi“ läuft, muss eine versteckte Datei „/home/pi/.netrc“ angelegt werden mit folgendem Inhalt , die Daten die dort sthen sind nur exemplarisch und müssen durch Deine FTP-Daten ergänzt werden :
cat .netrc machine <ftp.meinserver.de> login <login@meinserver.de> password <Dein Passwort>
Der Node „watch“ überwacht das Verzeichnis „/home/pi/webcams/wohnzimmer“. Wenn hier eine neue Datei hineinkopiert oder angelegt wird, kann der Node „FTP-Upload“ die hochgeladene Datei zB. „wohnzimmer.jpg“ automatisiert mit dem Script „ftp.sh“ auf den eingetragenen FTP-Server hochladen.
So sieht dann das Verzeichnis aus mit den hochgeladenen Bildern. Dieses FTP-Upload dient auch nochmal zur Sicherheit wenn die Daten auf dem lokalem Speichermedium gestohlen werden sollten bei einem eventuellen Einbruch.
Es gibt hier noch so viele weitere Möglichkeiten , die der Fantasie keiner Grenzen gesetzt sind. Was wäre für Dich ein aktueller Anwendungsfall, den Du mit einer eigenen Kamera abbilden möchtest ? Erzähl mir hier und wir arbeiten gemeinsam an einer Lösung. Deal oder No Deal ? 🙂
Viel Spaß wünscht weiterhin , Joachim
Ein echt schön geschriebener Artikel, da klickt man sich gerne mal durch den Blog!
Hallo ,
ich habe selbst ein Problem, wobei ich deine Hilfe brauche.
Als Imker verteile ich meine Bienenkästen im Sommer an verschieden lukrativen Plätzen. Da das Imkern immer mehr Interessenten findet, werden einige Völker entwendet.
Nun zu meinem Anliegen:
Die Bienenvölker werden mit einer „Wildkamera“ überwacht, diese sendet per GSM nach auslösen des Bewegungsmelders ein Foto an meinen FTP Server.
Jetzt soll node red ins Spiel kommen……..
Ich würde gerne das neue Foto (jpg) per Telegram Adapter an eine Gruppe verteilen.
Das Speichern der Fotos auf mein NAS in einen Ordner funktioniert einwandfrei.
Wie kann ich den FTP Ordner triggern ?
Über Lösungsvorschläge würde ich mich sehr freuen.
Hallo Imker
es gibt einen Node „File“ damit kann man ein Verzeichnis überwachen ob eine neue Datei angelegt wird. Damit kannst Du das Bild an Telegram senden.
Grüße , Joachim
Hallo!
Kann ich denn auch direkt ein Bild im Dashboard anzeigen lassen? Also im Prinzip
payload=wget http://admin:1234@192.168.2.1/tmpfs/auto.jpg
payload anzeigen
Im Moment scheitert es schon am exec, da dieser mit error 1 abbricht.
Hintergrund ist, es soll ein Bild von der Kamera geholt werden, wenn jemand den Klingelknopf betätigt. Da wäre ich über den richtigen Denkanstoß sehr glücklich.
Hallo Stefan
schau Dir mal diesen Artikel an, da hab ich sowas realisiert:
https://blog.unixweb.de/digitale-kamerasteuerung-mit-gphoto2-und-nodered/
Bei weiteren Fragen einfach melden.
Beste Grüße , Joachim