Ich hatte nun schon seit ein paar Jahren eine Wanscam Dome-Kamera an meiner Haustüre hängen, mit der ich einen guten Rundumblick über das gesamte Grundstück habe. Einer Arbeitskollegin hatte ich sie ebenfalls empfohlen, die mit inzwischen zwei dieser Kameras ihre Pferde-Ranch im Blick behält.

Leider musste ich damals vor Jahren feststellen, dass irgendwie jede Wanscam Dome-Kamera, die man so bei Amazon kauft, ohne Hinweis auf eine Modellnummer, irgendwie anders ist. Von den zwei Kameras hatte besagte Kollegin auch schon zwei wieder zurück geschickt, weil immer irgendetwas anderes nicht funktionierte...und seltsamerweise war auch das WebInterface immer anders.

Nachdem bei meiner alten Kamera nun nach etwa 5 Jahren irgendetwas (nur nicht das Netzteil) durchgebrannt ist, musste ich mich nach einer neuen umschauen und bin wieder bei einer Wanscam Dome-Kamera gelandet.

Bei GearBest, von dem ich zuvor noch nie gehört hatte, bin ich auf eine Wanscam HW0038 für 45€ gestoßen. Das ist weniger als die Hälfte, was diese Teile ansonsten kosten und wurde noch dazu versandkostenfrei geliefert. Einserseits gibt das einiges an negativen Karma-Punkten, sich billige Chinaware so billig aus China hierherverfrachten zu lassen, andererseits dachte ich mir, dass eine Wanscam aus einem Amazon-Shop von nirgendwoher anders kommt und nur ein Zwischenhändler noch umso mehr daran verdient. Deutsche Markenprodukte zum fairen Preis sind in dieser Kategorie rar.

Nachtsicht, bei der man auch was sieht
Überraschenderweise scheint es inzwischen bei Wanscam Modellbezeichnungen zu geben. Die HW0038 sieht im großen und ganzen wie meine alte Kamera aus, bietet aber ein deutlich besseres Bild. Auch die Nachtsicht ist nun tatsächlich nutzbar, auch wenn sich die Anzahl der IR-LEDs nicht geändert hat.

Konfiguration

Internetsperre auf Fritz!Box
Wie es sich für billige China-Netzwerkgeräte gehört, habe ich sämtlichen Internetverkehr dieser Kamera auf dem Router gesperrt. Auf meinem Webserver ist ein Reverse-Proxy eingerichtet, so dass ich auch von unterwegs auf die Kamera zugreifen kann, wobei ich sowieso nie direkt auf das Kamera-WebUI zugreife, sondern einerseits all 10 Minuten die Kamera einmal rundum fahren lasse und Snapshots anfertige und dann noch auf meiner Intranet-Seite einen Livestream habe, der mehr oder weniger dem Mobile-Zugriff entspricht, den auch das kameraeigene WebUI zur Verfügung stellt.

Die Kamera lässt sich mit denselben Befehlen steuern, die im Wiki einer InStar-Kamera zu finden sind: https://wikiold.instar.de/index.php/Complete_CGI_Command_List_(HD)
Zwar unterstützt die HW0038 auch das Onvif-Protokoll, aber einerseits fand ich hier auf Anhieb keine Dokumentation zur Schnittstelle und außerdem ist die Steuerung per HTTP-GET um einiges einfacher, als der XML-Schrott.

Beispiel für die Steuerung per HTTP-GET

Nehmen wir an, die IP-Adresse der Kamera lautet
192.168.178.77
und Benutzername und Passwort für den Zugriff lauten
admin
und
wanscam
. Dann kann ich wie hier dokumentiert mit einem Aufruf der Adresse
http://admin:wanscam@192.168.178.77/cgi-bin/hi3510/param.cgi?cmd=ptzctrl&-step=1&-act=left
die Kamera um einen Schritt nach links bewegen.

Livestream

Einen aktuellen Snapshot der Kamera erhalte ich zu jeder Zeit über die Adresse
http://admin:wanscam@192.168.178.77/tmpfs/auto.jpg

Zudem kann ich mir z.B. mit dem VLC den Livestream der Kamera anschauen.
In niedriger Auflösung (VGA):

rtsp://admin:wanscam@192.168.178.77:554/12

Und in höherer Auflösung (720p):
rtsp://admin:wanscam@192.168.178.77:554/11

In diesem Artikel hatte ich mal beschrieben, wie man so einen RTSP-Stream auch in einen MJPEG-Stream umwandeln kann und hier, wie man einen Stream in Einzelbilder umwandelt.
Allerdings ist es mir noch nicht gelungen, einen RTSP-Stream so hin zu biegen, um am Ende einen HTML5-Kompatiblen Stream zu haben, den ich per
<video/>
-Tag in meine Intranet-Seite einbinden könnte.

Mein Use Case

ReverseProxy

Wie gesagt habe ich sämtlichen Traffic zwischen Kamera und Internet unterbunden.

Um von extern auf die Kamera zugreifen zu können, habe ich auf meinem Webserver (Mac/Apache) einen ReverseProxy eingerichtet, der dafür sorgt, dass Anfragen zum Webserver auf die URL

http://intranet.meinedomain.de/intranet/kamera/direkt/
zur Kamera geleitet werden.
Somit umschifft man auch das Problem, dass man eigentlich schon an Port 80 der eigenen Domain eine eigene Website betreibt und die Kamera nicht an einem HTTP-fremden kryptischen Port betreiben möchte.

Folgende drei Zeilen sind in der Apache-Konfiguration ausreichend:

/etc/apache2/httpd.conf
<Location /intranet/kamera/direkt/>
  ProxyPass http://192.168.178.77/
</Location>

All 10 Minuten ein Bild von verschiedenen Perspektiven aufnehmen

Gleich auf meiner Intranet-Startseite sind Bilder zu sehen, die mein Grundstück einmal rundherum abdecken. Hierbei handelt es sich um keine Livebilder, sondern um Schnappschüsse, die all 10 Minuten erneuert werden.
Dies ist für mich ausreichend, um einen kurzen Überblick über Wetter und Co. zu erlangen.

Grundlage dieser Übersicht ist ein Bash-Skript, welches all 10 Minuten von meinem Server aufgerufen wird und per curl die Kamera schwenkt, sich einen Schnappschuss herunterlädt und in das Web-Verzeichnis des Apache-Webservers legt.

camSnapshots.sh
#!/bin/bash

IP="192.168.178.77"
USER="admin"
PASS="wanscam"
OUTPATH="/Library/Webserver/Documents/intranet/kamera/uebersicht/pics/" # Pfad zum Apache-Verzeichnis, in dem die Bilder gespeichert werden

# Zwischen 22 und 6 Uhr verzichte ich auf Bilder
# Da das Skript per launchd und nicht per cron aufgerufen wird,
# erfolgt die Ausnahmeregelung an dieser Stelle
STUNDE=`eval expr $(date +%H)`;
if [[ $STUNDE -ge 22 || $STUNDE -lt 6 ]]; then
        exit
fi

# Schwenkt die Kamera zu den vorab gespeicherten Positionen 1, 2, 3 und 4
# und speichert ein Standbild
for POS in 1 2 3 4
do
        RESPONSE=`curl --basic -u $USER:$PASS -s "http://$IP/web/cgi-bin/hi3510/param.cgi?cmd=preset&-act=goto&-number=$POS"` # Zur Position schwenken
        if [[ $RESPONSE == "[Succeed]set ok." ]]; then
                if [[ ! -d $OUTPATH/$POS ]]; then
                        mkdir $OUTPATH/$POS
                fi
                sleep 5s # Kurz warten, denn die Kamera benötigt ja ein paar Sekunden, bis sie geschwenkt hat
                curl --basic -u $USER:$PASS -s http://$IP/tmpfs/auto.jpg > $OUTPATH/$POS/$(date +%Y%m%d)-$(date +%H%M%S).jpg # Bild speichern
                if [[ `stat -f%z $OUTPATH/$POS/$(date +%Y%m%d)-$(date +%H%M%S).jpg` == 0 ]]; then rm $OUTPATH/$POS/$(date +%Y%m%d)-$(date +%H%M%S).jpg; fi # Falls was schief ging und das Bild 0kB groß ist...
        fi
        sleep 5s
done

# Am Ende wieder zur Standard-Position 1 zurückschwenken
curl --basic -u $USER:$PASS -s "http://$IP/web/cgi-bin/hi3510/param.cgi?cmd=preset&-act=goto&-number=2"

Die Positionen 1,2,3 und 4 wurden zuvor im Web-Interface der Kamera gesetzt, so dass die Kamera bei jedem Snapshot genau dieselbe Stelle ablichtet.

Aufräumen

All 10 Minuten 4 Bilder...da kommt mit der Zeit etwas zusammen. Schon nach wenigen Tagen interessiert es mich eigentlich nicht mehr, was auf Perspektive X um Y Uhr zu sehen war. Aber ein Bild je Tag und Perspektive würde ich gerne aufbehalten.

Deshalb habe ich ein Säuberungs-Skript geschrieben, welches einmal am Tag alle Bilder der vor-vortages löscht, das Bild von 1200h (bzw. um 1200h rum, da ich nicht davon ausgehen kann, dass das Bild um die Minute genau um 1200h aufgenommen wurde) allerdings auf behält und in ein Archiv verschiebt.

camPurge.sh
PFAD="/Library/WebServer/Documents/intranet/kamera/uebersicht/pics/"
ARCHIV="/Library/WebServer/Documents/intranet/kamera/historie/pics/"
STUNDE=12 #Bild welcher Stunde soll aufbehalten werden?

for VIEW in 1 2 3 4
do
        # Bild von 1200h ins Archiv kopieren
        DATUM=$(date +%Y%m%d)
        DATEI=`ls $PFAD$VIEW/$DATUM-$STUNDE* 2>/dev/null | head -n 1`
        if [[ ! -d "$ARCHIV$VIEW" ]]; then mkdir -p "$ARCHIV$VIEW"; fi
        if [[ $DATEI != "" ]]; then
                cp $DATEI $ARCHIV$VIEW/$DATUM.jpg
                fi
        # Andere Bilder von Vorgestern löschen
        find $PFAD$VIEW -mtime +2 | xargs rm -Rf
done

Das Jahr als Zeitraffer

Die täglich aufbewahrten Bilder haben für mich persönlich einmal den Zweck, mal schnell nachzuschauen "wann hatte es nochmal das letzte Mal geschneit?" und zum zweiten den Zweck, am Ende des Jahres ein nettes Zeitraffervideo zu erstellen. Hierbei werden alle 365 Bilder je Perskeptive jeweils zu einem kleinen Daumenkino zusammengesetzt. Sehr amüsant, wenn auf dem einen oder anderen Bild Pflanzen zu sehen sind, die während des Frühlings die Herrschaft über den Boden übernehmen.

Für den Teil "Timestamp in Bild einfügen" (optional) wird ImageMagick benötigt, für die Filmerstellung mencoder
Im Anschluss habe ich noch eine Variante, die auf ffmpeg statt auf mencoder setzt.

camTimelapse.sh
#!/bin/bash

PFAD="/Library/WebServer/Documents/intranet/kamera/historie/pics/"
OUTDIR="/Library/WebServer/Documents/intranet/kamera/timelapse/"
FONTFILE="/Library/Fonts/Courier New Bold.ttf"
JAHR=$(date +%Y)

for VIEW in 1 2 3 4
do
        # Timestamp in Bild einfügen
        COUNTER=1
        mkdir /tmp/timelapse
        for bild in `ls $PFAD$VIEW/$JAHR*.jpg`; do
                DATUM=`echo "$bild" | sed 's/.*\([0-9][0-9][0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9]\).*/\3.\2.\1/g'`
                TMP_NAME=$(printf '%03d.jpg' $COUNTER)
                ((COUNTER++))
                convert $bild -fill white -stroke black -pointsize 20 -font "$FONTFILE" -gravity SouthEast -annotate 0 "$DATUM" /tmp/timelapse/$TMP_NAME 2>/dev/null
                done
        # Film erstellen
        mencoder -nosound mf:///tmp/timelapse/*.jpg -mf type=jpg:fps=5 -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=2160000:mbd=2:keyint=132:v4mv:vqmin=3:lumi_mask=0.07:dark_mask=0.2:mpeg_quant:scplx_mask=0.1:tcplx_mask=0.1:naq -o $OUTDIR$VIEW-$JAHR.mkv
        rm -r /tmp/timelapse
done

Steht

mencoder
nicht zur Verfügung (für den Raspberry Pi konnte ich zum Beispiel nichts finden), so lässt sich zur Filmerstellung natürlich auch
avconv
des
ffmpeg
-Projektes einsetzen:

avconv -framerate 25 -f image2 -i /tmp/timelapse/%03d.jpg -b 65536k -y -v quiet -c:v mpeg2video -qscale 10 $OUTDIR$VIEW-$JAHR.mpg

Fazit

Ich bin zufrieden mit dem 45€-Teil...besonders, wenn sich herausstellen sollte, dass sie mindestens so lange wie die alte Kamera durchhält.