Dokumentation Webcam

Dokumentation Webcam

Das haben wahrscheinlich schon viele Leute vor mir gemacht, trotzdem möchte ich festhalten, wie ich es selber angegangen bin, eine Webcam einzurichten, die die großen Bilder lokal am USB-Stick speichert und jeweils das Aktuelle auf den Server spielt. In der Nacht nehme ich keine schwarzen Bilder auf, da pausiert die Kamera.

Hardware

  • Raspberry Zero
  • Raspberry Kamera-Modul
  • 16 GB USB-Stick

Programm

Ich hab dazu raspistill in einem shell-skript verwendet:

#!/bin/bash

Daten festlegen:

Zuerst baue ich das Datum für den Zeitstempel im Bild zusammen und lege die Variablen für die Dateinamen an. Gleich mit dem ganzen Pfad.
opath ist dann für die Datei mit dem Namen original.jpg und rpath für die Datei mit dem Zeitstempel im Namen:

stamp="Datum: $(date +'%d.%m.%Y %H:%M') Uhr"
opath="/media/pi/4E67-7EAC/original.jpg"
rname="/media/pi/4E67-7EAC/$(date +%Y-%m-%d_%H-%M-%S).jpg"

Foto aufnehmen:
-rot 270, weil mein Raspberry waagrecht daliegt. Das fertige Bild wird mit dem Namen original.jpg abgespeichert:

raspistill -rot 270 -h 720 -w 960 -o $opath

Bildbeschriftung:
Dafür nehme ich das Programm convert aus dem Paket imagemagick:
Schriftgröße 25, weiße Schrift, unten links und zwar den Zeitstempel; gespeichert wird das Bild wieder als original.jpg:

convert $opath -pointsize 25 -fill white -draw "text 25,710 '$stamp'" $opath

Nun kopiere ich das Bild auf den USB-stick und gebe ihm den Namen web_bild_2.jpg. Der ist immer gleich und das ist die Datei, die dann zum Server übertragen wird. Außerdem wird die Größe für die Übertragung reduziert auf Lange-Seite-640. Somit gibt es in diesem Moment das Bild zweimal:
groß mit dem Namen original.jpg und
klein mit dem Namen web_bild_2.jpg

cp $opath /media/pi/4E67-7EAC/web_bild_2.jpg
convert /media/pi/4E67-7EAC/web_bild_2.jpg -resize 640x640

/media/pi/4E67-7EAC/web_bild_2.jpg

Die Datei web_bild_2.jpg wird nun auf den Server übertragen mittels scp. Damit das automatisch geht, hab ich einen key erzeugt, das beschreibe ich weiter unten. Die Identifikationsdatei ist hier der private key, der mit -i benannt wird:

scp -i ~/.ssh/id_rsa /media/pi/4E67-7EAC/web_bild_2.jpg
NAME@SERVER:/PFAD/ZUR/webcam/web_bild_2.jpg

Umbenennen:
Nun kann ich die Datei original.jpg umbenennen und die Datei heißt nun so wie der Zeitstempel:
mv $opath $rname

key erzeugen:

Auf dem Raspi:
ssh-keygen -t rsa
ssh-copy-id USER@SERVER

chmod 600 id_rsa

Zweites Skript für Unterverzeichnisse:

Zuerst hab ich Variable festgelegt, um das Verzeichnis des jeweiligen Tages zu erzeugen:

today=$(date +'%Y%m%d')

file=$(date +'%Y-%m-%d')

und das Basisverzeichnis auf dem USB-Stick:

basedir="/media/pi/E8F6-B3DA"

Damit kann ich nun das Verzeichnis des jeweiligen Tages erzeugen lassen:

mkdir -p "$basedir/$today"

Etwas kniffliger ist dann das Verschieben der Dateien in dieses Verzeichnis:

find "$basedir" -maxdepth 1 -type f -name "$file*.jpg" -print0 | xargs -r0 mv -t "$basedir/$today"

find sucht im basedir in maximal einem Unterverzeichnis nach dem Typ file mit der Endung jpg und gibt das nicht aus, aber übergibt es an xargs, das rekursiv alle files in das Verzeichnis schiebt.

Crontab

Nun noch Einrichten der Zeitsteuerung:

crontab -e

und darin:
alle 5 Minuten von 6 bis 22 Uhr; genaugenommen 21:55:

*/5 6-21 * * * /home/pi/webcam/webcam_convert.sh

um 22:05 werden die Dateien in das Tagesverzeichnis verschoben:

5 22 * * * /home/pi/webcam/dirmaker.sh

Auf der HDD

Habe ich mir noch ein Skript angelegt, das zwei Verzeichnisse anlegt, in die dann die Dateien der beiden Webcams hineinkopiert werden:

Als erstes die Sicherheitsabfrage:

set -eu

So lege ich die Verzeichnisse an:

today=$(date +'%Y%m%d')

month=$(date +'%Y%m')

basedir="/media/chrisu/3TB/Webcam"

rp2="$basedir/$month/${today}_rp2"

zero="$basedir/$month/${today}_zero"

mkdir -p "$rp2"

mkdir -p "$zero"

Dieses Skript rufe ich noch genussvoll jeden Tag auf und kopiere die Dateien händisch hinein.

scp pi@10.0.0.31:/media/pi/4E67-7EAC/20230430/* .

Aber das wird auch bald automatisiert.

Am Server / Homepage

Eine Seite einrichten mit einem Meta-Tag:

<meta http-equiv="refresh" content="300">

damit wird die Seite alle 5 Minuten (5*60=300 Sekunden) neu geladen. Es braucht darin nur das Bild anzeigen, das ja immer gleich heißt.

Das war es. Und nun noch:

  • geeigneten Platz finden
  • Spiegelungen ausschalten