Hallo zusammen, hier stelle ich mein erstes Raspberry-Projekt vor, eine:
Kameraüberwachung des Hauseingangs mit Raspberry Pi Zero
Jeder, der das System nachbauen will ist herzlich eingeladen, sämtliche hier geposteten Informationen zu kopieren und zu verwenden
Ich habe diesen Post bewusst so gestaltet dass man hier alle benötigten Informationen findet, und nicht noch mit 18 geöffneten Browsertabs sich mühsam von unterschiedlichen Internetseiten alles zusammensuchen muss. Sozusagen eine A-Z-Anleitung und Projektvorstellung aus einer Hand.
Hier die Eckdaten des Projektes. Man kann:
- mit einem Computer auf die gespeicherten Kameravideos (Bewegungserkennung) bequem zugreifen
- mitbekommen was am Kamerastandort los ist/war, auch wenn man nicht zu Hause ist/war
- Kameravideos in seinem Google-Drive-Account, die automatisch hochgeladen werden, wiederfinden und abspielen
- den Videostream von überall auf der Welt beobachten, zum Beispiel vom Smartphone aus
- per "Fernwartung" (SSH) auf den Raspberry zugreifen um Konfigurationen vorzunehmen, sowohl vom lokalen Netzwerk aus, als auch vom Internet
- einen großen Sichtbereich abdecken, dank 120-Grad-Weitwinkelkamera
- einen nahezu beliebigen Standort wählen, da drahtlose WLAN-Anbindung
- eine preisgünstige Videoüberwachung mitsamt Aufzeichnung realisieren
Hier noch ein paar Impressionen des fertigen Projekts:
Videodateien der Bewegungserkennung in Nautilus
Livestream am Handy
Da kommt noch 'ne schöne Aufputzsteckdose,
und eine saubere Verdrahtung hin, keine Angst
Dieses Kameramodell passt zwar vorne durch das
Gehäuseloch, hält aber erstens nicht richtig weil das
Loch viel größer ist als das Objektiv, außerdem müsste
die Kamera hinten auf dem Flachbandkabel sitzen, und
nicht vorne. Für eine Montage im Kameraloch ist das
Flachbandkabel also genau um 180 Grad verdreht und
eine Montage im weißen Deckel somit nicht möglich.
Glücklicherweise waren auf der Rückseite des
Flachbandkabels zwei doppelseitige Klebebänder,
die werden schon gewusst haben, warum
Schnell noch ein Loch in den
weißen Deckel gebohrt, und mit
einem Winkel an der Dachsparre
befestigt. So lässt sich die Kamera
für Wartungsarbeiten ohne
Aufwand aus dem Clip-Verschluss
des Deckels abnehmen.
Also, los gehts.
Die verwendete Hardware
Ich habe folgende Komponenten eingesetzt:
Für die Kamera:
- Raspberry Pi Zero mit Gehäuse: RPIZ-ZWPC
- Netzteil, 1A, mit Micro-USB-Anschluss: 8003512
- Kameramodul: RPIZ-CAM-WA (Beim Kameramodul empfehle ich allerdings eine original Raspberry-Kamera, zum Beispiel diese hier: RASP CAN 2, inklusive Zero-Adapter RPIZ CAM FL3,8. Ist zwar teurer, aber meine Erfahrungswerte haben mittlerweile gezeigt, dass sich die Billig-Kameras gerne mal festfressen und daraufhin das ganze System hängenbleibt)
- SD-Karte mit 32 GB, damit auch jede Menge Fotos und Videos draufpassen*: 740617274707
Alles zusammen kostet ca. 40,- Euro.
* (meine SD-Karte ist von HAMA und vom Händler im Ort, weil ich die bestellte SD-Karte gekillt habe, deswegen also nicht wundern wenn auf den Fotos eine Hama-SD-Karte auftaucht)
Wem eine Überwachung per Handy und Computer nicht reicht, der kann sich zusätzlich noch einen Monitor an die Wand klatschen:
-
Gehäuse: RPI-35CASE-B
- Raspberry Pi 3 B+**: RPI3-BP
- Netzteil, 2,5A, mit Micro-USB-Anschluss: 71889
- Display*** (Naja! Dazu später im Text mehr): RPI-35LCD
- SD-Karte mit 8 GB: 0023942440123
** (vielleicht etwas übertrieben für eine einfache Streamdarstellung, aber ich plane noch weitere Aufgaben für diesen Raspberry)
*** Anmerkung: Für zukünftige Projekte würde ich persönlich ein IPS-Display verwenden statt des oben genannten LCD's. Das Bild ist nur erkennbar, wenn man rechts neben dem Monitor steht, bei der Betrachtung von links wird ein Negativ-Effekt sichtbar und die Farben kehren sich um. Die Auflösung von 480x320 ist außerdem zu gering, teilweise passen Fensterdialoge von Raspbian nichtmal komplett auf's Bild und man muss mit der Tab-Taste navigieren und erraten, ob man auf der richtigen Schaltfläche ist. Die Aktualisierungsrate dieses Displays liegt bei gefühlt 3 Frames pro Sekunde, also für Videostreaming dann doch eher ungeeignet. Ich empfehle daher eine Mindestauflösung von 800x480 und ein Blickwinkelunabhängiges IPS-Display mit HDMI-Ansteuerung. Tja, wiedermal am falschen Ende gespart
Zum Konfigurieren und Installieren verwendete ich:
- Laptop mit Ubuntu 18.04.02 LTS
Vorbereiten der SD-Karte
Zunächst habe ich mir Raspbian Stretch Lite heruntergeladen.
forum-raspberrypi.de/attachment/20589/
Unter "Laufwerke" und "Laufwerksabbild wiederherstellen" (Ubuntu) wurde dann das Betriebssystem-Image auf die SD-Karte geschrieben.
Um für die folgenden Änderungen auf die SD-Karte zugreifen zu können, nimmt man diese nach dem Image-Schreibvorgang kurz aus dem Computer und steckt sie dann wieder rein. Die Karte wird dann automatisch von Ubuntu in's Dateisystem eingehängt.
WLAN
Als erstes wird der WLAN-Zugang eingerichtet. Dazu geht man in's Terminal mit STRG+ALT+T, und bearbeitet die entsprechende Konfigurationsdatei direkt auf der SD-Karte mit folgendem Befehl:
sudo nano /media/<benutzername>/rootfs/etc/wpa_supplicant/wpa_supplicant.conf
forum-raspberrypi.de/attachment/20590/
und passt diese folgendermaßen an:
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=DE
network={
ssid="<netzwerkname>"
scan_ssid=1
psk="<schlüssel>"
key_mgmt=WPA-PSK
}
"scan=ssid=1" ist normalerweise nicht nötig, habe ich aber eingefügt, weil mein WLAN unsichtbar ist und keine SSID übermittelt. Gespeichert und geschlossen wird die Datei mit STRG+O, Enter, STRG+X.
SSH
Anschließend muss man noch dafür sorgen, dass man zu jeder Zeit in einem Terminalfenster per SSH auf den Raspberry zugreifen kann. Um dies zu ermöglichen, wechselt man auf der SD-Karte in die Boot-Partition mit
cd /media/<benutzername>/boot/
und fügt dort mit den Befehlen
touch ssh
und STRG+C eine neue leere Datei ein.
Abschließend schmeißt man die SD-Karte wieder aus dem Dateisystem mit folgenden Befehlen:
umount /media/<benutzername>/boot/
und
umount /media/<benutzername>/rootfs/
Jetzt wird die SD-Karte aus dem Computer entnommen und in den (stromlosen, nicht eingesteckten) Raspberry Zero gesteckt.
Zugriff auf den Zero über's Netzwerk überprüfen
Nachdem der Raspberry Pi Zero mit Strom versorgt wurde und gebootet hat (erkennbar an der flackernden grünen LED während des Startvorgangs), sollte er sich aus dem Netzwerk ansprechen lassen. Im LAN taucht der Zero normalerweise mit "raspberrypi" auf. Auf der Fritz!Box kann man das leicht überprüfen, in dem man im Menü auf "Heimnetz" und "Netzwerk" klickt. Dort werden alle Netzwerkgeräte aufgelistet.
IP-Adresse und Netzwerkname des Zero festlegen
Ich persönlich empfinde die Konfigurationsarbeit als einfacher, wenn bestimmte Netzwerkgeräte feste IP-Adressen haben. Zum Beispiel meine Raspberrys. Andere Geräte, wie etwa Smartphones oder Computer, werden bei mir per DHCP automatisch mit IP's versorgt.
Um die IP-Adresse des Zero fest einzustellen, verbinden wir uns zunächst per SSH in einem Terminal mit dem Raspberry. Der Befehl dazu lautet:
ssh pi@raspberrypi
Die folgende Abfrage bestätigt man dann mit "yes" und Enter. Anschließend ist noch das Standardkennwort "raspberry" erforderlich, und wir sind drin!
Um eine ganz bestimmte IP-Adresse für den Zero festzulegen, öffnet man die entsprechende Konfigurationsdatei mit dem Befehl
sudo nano /etc/dhcpcd.conf
In der Datei habe ich dann folgenden Abschnitt hinzugefügt bzw. die entsprechenden Zeilen angepasst und auskommentiert:
interface wlan0
static ip_address=10.0.0.206/8
static routers=10.0.0.1
static domain_name_servers=10.0.0.1
...wobei hier die 206 frei gewählt wurde und für den Raspberry Zero steht. Die Datei wird wieder mit STRG+O, Enter, STRG+X gespeichert und geschlossen.
Für das standardmäßige 192er-Netz der Fritz!Box sähe das ganze z. B. folgendermaßen aus:
interface wlan0
static ip_address=192.168.178.206/24
static routers=192.168.178.1
static domain_name_servers=192.168.178.1
Jetzt legen wir noch einen Netzwerknamen für den Zero fest. Im Terminal rufen wir dazu
sudo raspi-config
auf. Mit den Pfeiltasten navigieren wir zu "Network Options", wählen mit der Tab-Taste "Select" und bestätigen mit Enter. Jetzt wählen wir "Hostname" und bestätigen wieder mit "Select". Der folgende Hinweis kann mit Enter bestätigt werden. Jetzt fordert uns der Raspberry auf: Please enter a hostname". Ich habe "eg-haustuer-aussen" gewählt. Nachdem der Name eingetippt wurde, wird mit "Ok" bestätigt.
Damit nicht jeder Unbefugte an unserem Schätzchen herumfuchteln kann, legen wir nun noch ein neues Passwort für den Zero fest. Dazu wählen wir den Menüpunkt "Change User Password", geben zweimal hintereinander das neue Passwort ein, und bestätigen dann mit "Ok".
Nun wird noch der CSI-Port (Kameraanschluss für das Flachbandkabel) aktiviert. Dazu geht man in das Menü "Interfacing Options" und anschließend auf "Camera" und "Select". Hier kann dann der Anschluss mit "Enable" aktiviert werden.
Jetzt noch den RaspberryPi neu starten.
Nun ist der Zero ab sofort im Netzwerk mit der von uns festgelegten IP-Adresse und unserem gewählten Namen erreichbar. Ich zum Beispiel erreiche meinen Raspberry entweder mit
ssh pi@eg-haustuer-aussen
oder mit
ssh pi@10.0.0.206
Montageort wählen
Bevor die Kamera endgültig am finalen Platz montiert wird, empfehle ich eine Überprüfung der WLAN-Signalstärke mit wavemon, dieses nette Tool lässt sich mit
sudo apt-get install wavemon
schnell installieren und benötigt weder Einrichtung noch Konfiguration.
Nachdem das Tool mit
wavemon
im Terminal auf einer SSH-Sitzung aufgerufen wurde, kann man am Laptop schön mitverfolgen wie sich mit wechselnden Kamerapositionen die WLAN-Signalstärke ändert und den Montageort dementsprechend festlegen.
Meine Experimente haben gezeigt, dass ein "signal level" von weniger als ca. -75 dBm nicht mehr hinnehmbar ist, die Übertragungsraten werden dann zu gering, und auch das Anmelden per SSH dauert dann eine Ewigkeit. Ab etwa -80 bis -85 dBm geht dann fast gar nix mehr, hier beginnt der Videostream sporadisch für mehrere Sekunden auszusetzen. Die "link quality" kann auch weit nach unten gehen - solange der obere Balken grün bleibt, funktioniert alles.
Kameraüberwachungsprogramm "motion" installieren
Wir verbinden uns im Terminal wieder per SSH, in meinem Fall lautet der Befehl dazu:
ssh pi@eg-haustuer-aussen
Dann noch das Kennwort eintippen, und wir sind wiedermal "drin"
Betriebssystem aktualisieren
Anschließend bringen wir das Betriebssystem auf den neuesten Stand mit
sudo apt-get update
und
sudo apt-get upgrade
Je nach Internetanbindung kann der Upgradevorgang schon eine Weile dauern.
Kernelmodule beim Systemstart laden, damit die Kamera erkannt wird
Im Terminal die folgenden zwei Zeilen eintragen, und mit Enter bestätigen:
Danach wird die Kamera bei jedem Neustart erkannt.
motion installieren
Nun wird motion installiert. Dies geschieht ganz einfach mit dem Befehl
sudo apt-get install motion
Verzeichnisse erstellen und vorbereiten
Nach abgeschlossener Installation müssen wir noch ein paar Konfigurationsanpassungen und Einrichtungen vornehmen. Zunächst erstellen wir zwei Verzeichnisse. Eines für die Aufnahmen der Kamera, und ein weiteres für Log-Dateien.
Wir erstellen ein Kameraverzeichnis und vergeben die entsprechenden Schreibrechte für motion:
Dann noch das Logverzeichnis erstellen und wieder die entsprechenden Schreibrechte für motion vergeben:
In der Standardeinstellung sind Kameradateien und Logdatei in einem einzigen Verzeichnis untergebracht, ich habe es aber lieber getrennt, damit beim Synchronisieren mit Google Drive nicht jedesmal dutzende Megabyte an Logdaten übertragen werden müssen und damit es übersichtlicher bleibt. Außerdem verhindert man so, dass versehentlich auch die Logdatei mitgelöscht wird, wenn man meint, den Videoordner leerräumen zu müssen (Alle Dateien markieren + löschen + dabei die motion.log übersehen).
motion nach Neustart immer ausführen
Damit motion bei jedem Neustart ausgeführt wird, muss die entsprechende Konfigurationsdatei mit
sudo nano /etc/default/motion
geöffnet und angepasst werden. Wir ändern folgene Zeile von "no" auf "yes":
start_motion_daemon=yes
Konfigurationsdatei von motion anpassen
Bevor wir an der Datei herumexperimentieren, machen wir zunächst eine Sicherungskopie mit
sudo cp /etc/motion/motion.conf /etc/motion/motion.conf.backup
Nun öffnen wir mit
sudo nano /etc/motion/motion.conf
die Konfigurationsdatei von motion und passen diese noch entsprechend an.
Starten in daemon mode auf "on" stellen:
Speicherort für die Logdatei:
# Use a file to save logs messages, if not defined stderr and syslog is used. ($
logfile /home/pi/log/motion.log
Bilddrehung, falls die Kamera kopfüber hängt oder verdreht ist:
# Rotate image this number of degrees. The rotation affects all saved images as
# well as movies. Valid values: 0 (default = no rotation), 90, 180 and 270.
rotate 180
Auflösung und Framerate - hier muss man etwas herumexperimentieren. Wie das geht, erläutere ich weiter unten. Zwar können die allermeisten Kameramodule Full HD mit 30 Bildern pro Sekunde liefern, diese Datenmenge aber in's WLAN zu pressen ist mit einem Zero nahezu unmöglich - dafür ist er zu leistunggschwach und auch die onboard-WLAN-Antenne bei größeren Entfernungen zum Accesspoint nicht mehr ausreichend. Ist die Kamera um 90 oder 270 Grad verdreht, muss man width (320 statt 480) und height (480 statt 320) vertauschen, da ja sozusagen sonst vom Quer- ins Hochformat gewechselt wird. Folgende Einstellungen klappen bei mir sehr gut:
# Image width (pixels). Valid range: Camera dependent, default: 352
width 480
# Image height (pixels). Valid range: Camera dependent, default: 288
height 320
# Maximum number of frames to be captured per second.
# Valid range: 2-100. Default: 100 (almost no limit).
framerate 10
Nun zur Empfindlichkeit für die Bewegungserkennung. Bei einem Wert von 500 (vorausgesetzt die oben genannte Auflösung wird verwendet) reagiert die Bewegungserkennung bereits auf Katzen oder Igel. Falls nur auf Menschen oder Fahrzeuge reagiert werden soll, muss man den Wert entsprechend raufdrehen - auf 1000 oder noch mehr.
# Threshold for number of changed pixels in an image that
# triggers motion detection (default: 1500)
threshold 500
Damit auch wirklich ein komplettes Ereignis in einer Videodatei gespeichert, und nicht vorne oder hinten abgeschnitten wird, habe ich noch "pre_capture" und "post_capture" angepasst:
# Specifies the number of pre-captured (buffered) pictures from before motion
# was detected that will be output at motion detection.
# Recommended range: 0 to 5 (default: 0)
# Do not use large values! Large values will cause Motion to skip video frames $
# cause unsmooth movies. To smooth movies use larger values of post_capture ins$
pre_capture 5
# Number of frames to capture after motion is no longer detected (default: 0)
post_capture 50
Die Ausgabe von Fotos nach einem Ereignis habe ich abgeschaltet und statt dessen die Videoausgabe aktiviert. Diese Einstellung kann man je nach Wunsch ein- oder ausschalten:
# Output 'normal' pictures when motion is detected (default: on)
# Valid values: on, off, first, best, center
# When set to 'first', only the first picture of an event is saved.
# Picture with most motion of an event is saved when set to 'best'.
# Picture with motion nearest center of picture is saved when set to 'center'.
# Can be used as preview shot for the corresponding movie.
output_pictures off
Falls Bewegungen erkannt werden, wird eine Videodatei mit dem Ereignis erstellt:
Den Videocodec habe ich von mpeg4 auf mp4 umgestellt, da einige Geräte im Haus dieses Videoformat nicht wiedergeben konnten (zum Beispiel ein Raspberry Pi 3 B+ mit Raspbian):
Am linken und rechten unteren Bildschirmrand kann man sich frei wählbare Informationen einblenden lassen. Bei mir steht links unten der Kamerastandort, und rechts unten das Datum und die Uhrzeit. Damit man den Text auch auf kleinen Bildschirmen noch gut lesen kann, wurde die Schriftgröße mit "text_double on" vergrößert.
# Draws the timestamp using same options as C function strftime(3)
# Default: %Y-%m-%d\n%T = date in ISO format and time in 24 hour clock
# Text is placed in lower right corner
text_right "%d.%m.%Y %H:%M:%S"
# Draw a user defined text on the images using same options as C function strft$
# Default: Not defined = no text
# Text is placed in lower left corner
text_left "HAUSTUER EG"
# Draw characters at twice normal size on images. (default: off)
text_double on
Display More
Im folgenden Abschnitt kann man das Ausgabeverzeichnis für Fotos und Videos festlegen:
# Target base directory for pictures and films
# Recommended to use absolute path. (Default: current working directory)
target_dir /home/pi/cam
Der Dateiname von ausgegebenen Videos lässt sich ebenfalls nahezu beliebig anpassen. Selbst wenn sich Punkte oder Doppelpunkte im Dateinamen befinden (wegen der besseren Lesbarkeit von Datums- und Zeitangaben) läuft alles tadellos - ich habe es erfolgreich getestet. Die Videodateien mit den Sonderzeichen im Namen lassen sich ohne Probleme im Netzwerk herumkopieren, auf Google Drive hochladen, am Handy betrachten oder per E-Mail versenden.
# File path for motion triggered ffmpeg films (movies) relative to target_dir
# Default: %v-%Y%m%d%H%M%S
# File extensions(.mpg .avi) are automatically added so do not include them
movie_filename %d.%m.%Y-%H:%M:%S
Nun müssen wir noch den Zugriff auf den Kamerastream (= das Livebild) erlauben, und setzen dazu folgende Einstellung:
Damit nicht jeder Nutzer auf das Livebild zugreifen kann, habe ich den Videostream mit einem Passwort geschützt:
# Set the authentication method (default: 0)
# 0 = disabled
# 1 = Basic authentication
# 2 = MD5 digest (the safer authentication)
stream_auth_method 1
# Authentication for the stream. Syntax username:password
# Default: not defined (Disabled)
stream_authentication pi:geheimespasswort
Nachdem alles angepasst ist, wird die motion.conf mit STRG+O, Enter und STRG-X gespeichert und geschlossen.
Dann wird mit
sudo reboot
der Zero neu gestartet. Bis ein Livebild geliefert wird, dauert es nach dem Einschalten bzw. Neustart etwa 30 Sekunden.
Normalerweise müsste man jetzt schon ein Livebild bekommen. Wir testen das im Browser an einem Computer mit folgender Eingabe in der Adresszeile:
http://eg-haustuer-aussen:8081 + Enter.
Den Netzwerknamen muss man dann natürlich durch den selbst gewählten ersetzen.
Herumexperimentieren mit den motion.conf-Einstellungen
Bildgröße und Framerate
Um feststellen zu können, wie viel Bildschirmauflösung und Frameraten das ganze System leisten kann, "spielen" wir nun etwas mit der Konfiguration herum. Nachdem eine Änderung gemacht ist wird der motion-Dienst neu gestartet und anschließend geprüft, wieviele CPU-Ressourcen dieser verbrät.
Zunächst öffnen wir wieder unsere Konfiguration mit
sudo nano /etc/motion/motion.conf
Im Abschnitt "height" und "width" kann dann schrittweise eine höhere Auflösung getestet werden, zum Beispiel height 720 und width 1280.
# Image width (pixels). Valid range: Camera dependent, default: 352
width 1280
# Image height (pixels). Valid range: Camera dependent, default: 288
height 720
# Maximum number of frames to be captured per second.
# Valid range: 2-100. Default: 100 (almost no limit).
framerate 10
Nachdem die Bildschirmauflösung geändert wurde, verlassen wir die Datei mit STRG+O, Enter, STRG-X. Anschließend wird der motion-Dienst mit
sudo service motion restart
neu gestartet. Am Betrachtungscomputer muss man den Livestream aktualisieren (meistens Taste F5), damit dieser wieder startet und aktuelle Bilder liefert.
Wichtig: Bei mir ist es so, dass motion nur offizielle Auflösungen unterstützt (wie z. B. 1280x720). Werte die dazwischen liegen oder "krumm" sind (z. B. 1597x889), werden nicht akzeptiert und der motion-Dienst startet nicht (feststellbar mit dem Befehl "top", siehe nächster Absatz).
Mit dem Befehl
top
lässt sich am Zero die aktuelle CPU-Auslastung anzeigen. Falls der motion-Dienst nahe an der 100-%-Marke liegt, waren die vorherigen Einstellungen zuviel des Guten, und man muss eine geringere Auflösung wählen. Auf diese Art kann man etwas mit Bildgrößen und Frameraten herumexperimentieren, bis die idealen Werte gefunden sind. Bei mir liegt die CPU-Last von "motion" mit einer gewählten Auflösung von 1280x720 und einer Framerate von 10 bei durchschnittlich 92 %. Daher verwende ich 480x320 bei 10 Frames pro Sekunde. Hier beansprucht der motion-Dienst dann nur noch ca. 15 % CPU und es bleibt auch noch für andere Aufgaben (SSH, WLAN-Upload, etc...) genug Rechenzeit übrig.
Trotz allem ist eine Verzögerung feststellbar, vom Auftreten des realen Ereignisses vor der Kamera, bis zur Anzeige am Monitor. Ist die WLAN-Anbindung perfekt, vergeht etwa eine halbe Sekunde, bei schlechtem WLAN-Signal sind es etwa 3 bis 4 Sekunden bevor man sieht, was an der Haustür los ist.
Empfindlichkeit der Bewegungserkennung
Bevor man die motion.conf 20-mal öffnet und ändert, kann man die Empfindlichkeit der Bewegungserkennung auch einfacher feststellen. Dazu lassen wir uns auf dem Livebild die Variable "changed pixels" anzeigen. Dies erzeugt auf dem Webcambild eine Zahl die angibt, wieviele Pixel sich gerade ändern, wenn sich etwas durch das Bild bewegt. Ich habe mir dazu in der motion.conf einen Debugmodus gebastelt, der so ziemlich alle relevanten Werte auf das Livebild draufpackt. Der entsprechende Abschnitt der motion.conf sieht folgendermaßen aus:
# Draws the timestamp using same options as C function strftime(3)
# Default: %Y-%m-%d\n%T = date in ISO format and time in 24 hour clock
# Text is placed in lower right corner
# ###########################################
# Standard-Modus (nur nötigste Informationen)
# ###########################################
text_right "%d.%m.%Y %H:%M:%S"
# ###########################################
# Debug-Modus (alle Informationen)
# ###########################################
; text_right DEBUG-MODE\nDATE: %d.%m.%Y\nTIME: %H:%M:%S\nEVENT: %v\nFRAME: %q/10\nCAM ID: %t\nCHANGED PX: %D\nNOISE LVL: %N\nMOTION AREA: %ix%J\nMOTION CENTER: %K,%L\nTEXT EVENT: %C\n IMG WIDTH: 480\nIMG HEIGHT: 320\nROT: 180 DEG
Display More
Wie man sieht, gibt es "text_right" zweimal. Je nachdem ob man nur Uhrzeit und Datum, oder alle Informationen angezeigt haben möchte, kommentiert man entweder die eine oder die andere Zeile mit ";" aus. Auf dem Webcambild sieht mein DEBUG-MODE dann folgendermaßen aus:
Wichtig ist hier der Parameter "CHANGED PX". Man kann jetzt entweder warten, bis der Gartenigel anfängt seine Runde zu drehen, oder selbst für Pixeländerungen im Bild sorgen. Die Anzeige "CHANGED PX" behält man währenddessen (zum Beispiel am Laptop) genau im Blick und erhält so einen Richtwert für die optimale Einstellung. Bei mir hat sich "500" bewährt. Die Kamera reagiert noch nicht auf Laub oder Schattenspiele, aber auf Katzen. Dieser Wert wird dann in der motion.conf in folgendem Abschnitt eingetragen:
# Threshold for number of changed pixels in an image that
# triggers motion detection (default: 1500)
threshold 500
Anschließend wieder den motion-Dienst mit
sudo service motion restart
neu starten, und die Bewegungserkennung sollte ab jetzt zuverlässig funktionieren.
Einrichten einer automatischen Synchronisierung zu Google Drive
Damit, aus welchen Gründen auch immer, keine Beweismittel verloren gehen (zum Beispiel wenn der Postbote aus Langeweile den Briefkasten runterreißt), habe ich noch einen automatischen Google-Drive-Upload eingerichtet - hier sind die Daten von überall aus abrufbar und auch besser aufgehoben als auf einer nicht ganz so zuverlässigen SD-Karte, die mitsamt dem Raspberry draußen Wind und Wetter ausgesetzt ist.
Programm herunterladen
Nun rufen wir mit einem PC den Link https://github.com/gdrive-org/gdrive auf, scrollen runter bis zum Abschnitt "Downloads" und laden uns die Datei "gdrive-linux-rpi" auf den (ganz normalen, nicht Raspberry) Computer herunter.
forum-raspberrypi.de/attachment/20587/
Diese heruntergeladene Datei müssen wir jetzt auf den Raspberry schicken. Das passiert mit folgendem Befehl (Netzwerkname des Raspberrys einfach ersetzen):
scp gdrive-linux-rpi pi@eg-haustuer-aussen:/home/pi/
Wenn alles geklappt hat, befindet sich jetzt die Datei gdrive-linux-rpi auf unserem Raspberry im Homeverzeichnis /home/pi/.
Aus Bequemlichkeitsgründen bzw. wegen der besseren Lesbarkeit habe ich die Datei in "gdrive" umbenannt mit:
mv /home/pi/gdrive-linux-rpi /home/pi/gdrive
Damit die Datei auch aufgerufen werden kann und ihre Arbeit verrichtet, wird sie mit
chmod +x /home/pi/gdrive
ausführbar gemacht.
Ich bin mir jetzt nicht Hundertprozentig sicher wo die Datei gdrive hingehört, aber ich denke im Verzeichnis /usr/local/bin ist sie gut aufgehoben, weil auch die $PATH-Variable darauf zeigt und das Programm deswegen ohne Angabe eines kompletten Pfades aufgerufen werden kann. Also hin damit:
sudo mv /home/pi/gdrive /usr/local/bin/
Nun hat gdrive seinen Bestimmungsort erreicht und ist von nun an bereit zum Werkeln.
gdrive und Google Drive konfigurieren
Zunächst muss gdrive mit dem eigenen Google-Drive-Account verbunden werden bzw. die nötigen Rechte erhalten. Mit dem Befehl
gdrive about
startet man die Einrichtung.
Anschließend öffnet man den angezeigten Link im Browser, erteilt Google die Zugriffsrechte, und trägt den Verifizierungscode im Terminal ein.
Ist die Einrichtung abgeschlossen, überprüfen wir nochmal mit
gdrive about
die Konfiguration. Die Ausgabe sollte dann in etwa so aussehen:
Jetzt richten wir in Google Drive einen neuen Ordner ein, in dem die Kameravideos und -fotos gespeichert werden.
In meinem Fall habe ich folgende Verzeichnisstruktur auf Google Drive angelegt:
/Überwachungskameras Videos und Fotos/eg-haustuer-aussen/
Es kommen sicher noch weitere Überwachungskameras dazu, hier werden dann weitere entsprechende Unterordner auf Google Drive erstellt, zum Beispiel "eg-gartentor-eingang" oder "ug-garage-einfahrt".
Videos aus der motion-detection automatisch auf Google Drive hochladen
Mein Zero an der Haustür ist so programmiert, dass er täglich um Mitternacht einen Abgleich mit Google Drive macht. Sind neue Bewegungserkennungs-Videos hinzugekommen, werden diese automatisch in die Cloud hochgeladen.
Das automatisierte Hochladen ist in zwei Teile ausgelagert:
- ein Skript, welches eine Verbindung zu Google Drive aufbaut und die Dateien hochlädt
- eine zeitgesteuerte Aufgabe, die das Skript zu festgelegten Zeiten startet
Zunächst starten wir mit der Erstellung des Skripts. Dazu wird im Homeverzeichnis (/home/pi/) mit dem Befehl
nano /home/pi/sync-camfiles-to-google-drive.sh
eine leere Datei erstellt.
Diese Datei "befüllen" wir nun so, wie im folgenden Abschnitt zu sehen. Die lange unleserliche ID in Zeile 10 teilt dem Programm gdrive mit, in welches Verzeichnis die Dateien hochgeladen werden sollen. Wie man diese ID herausfindet, wird nach dem Quellcode-Abschnitt gezeigt.
#!/bin/sh
# Skript überträgt neue Camvideos und Fotos, die aus der motion detection vom Dienst motion stammen, auf google drive
# Aktuelles Datum und aktuelle Uhrzeit in log-Datei schreiben
datum=$(date +"%d.%m.%Y %H:%M:%S")
echo "\n\n\n${datum}\n###################" >> sync-camfiles-to-google-drive.log
# Synchronisierung beginnen und Meldungen in log-Datei schreiben
gdrive sync upload /home/pi/cam/ 1OeMNDpb9LPUGnC****************** >> sync-camfiles-to-google-drive.log
Bei mir entspricht die ID "1OeMNDpb9LPUGnC******************" aus Zeile 10 dem Ordner "eg-haustuer-aussen" auf Google Drive. An diese ID kommt man relativ einfach mit dem Befehl
gdrive list --query "name contains 'eg-haustuer-aussen'"
den wir in einem zweiten Terminalfenster ausführen. Den Text "eg-haustuer-aussen" muss man dann natürlich mit dem Ordnernamen ersetzen, zu dem man die entsprechende ID haben will. Die Ausgabe sieht dann etwa so aus:
Diese ID markieren wir mit der Maus und drücken anschließend STRG+SHIFT+C um diese zu kopieren.
Dann wechseln wir wieder in's andere Terminal zu unserem Skript, und fügen die ID mit der Tastenkombination STRG+SHIFT+V an der entsprechenden Stelle ein.
Mit den bereits bekannten Tastenkombinationen STRG+O, Enter, und STRG+X wird die Datei gespeichert und geschlossen. Die Log-Datei in Zeile 7 muss nicht extra erstellt werden, sondern wird vom Skript automatisch angelegt.
Bevor das Skript gestartet werden kann, müssen wir es noch mit
chmod +x sync-camfiles-to-google-drive.sh
ausführbar machen.
Nun testen wir erstmal das Skript, bevor wir es automatisiert ablaufen lassen. Dazu rufen wir es auf mit:
./sync-camfiles-to-google-drive.sh
Je nachdem wieviele Dateien schon von der Kamera auf die SD-Karte geschrieben wurden, und auch je nach Internetanbindung, dauert der Uploadvorgang auch schon mal ein paar Minütchen. Wir warten geduldig ab, bis wir wieder an der Eingabeaufforderung landen. Anschließend sehen wir uns mit
nano sync-camfiles-to-google-drive.log
die Logdatei an, die in etwa so aussehen müsste:
12.04.2019 20:15:11
###################
Starting sync...
Collecting local and remote file information...
Found 187 local files and 148 remote files
40 remote files are missing
[0001/0040] Uploading 12.04.2019-10:34:09.mp4 -> eg-haustuer-aussen/12.04.2019-10:34:09.mp4
[0002/0040] Uploading 12.04.2019-10:51:14.mp4 -> eg-haustuer-aussen/12.04.2019-10:51:14.mp4
[0003/0040] Uploading 12.04.2019-10:52:00.mp4 -> eg-haustuer-aussen/12.04.2019-10:52:00.mp4
[0004/0040] Uploading 12.04.2019-10:57:58.mp4 -> eg-haustuer-aussen/12.04.2019-10:57:58.mp4
[0005/0040] Uploading 12.04.2019-11:00:14.mp4 -> eg-haustuer-aussen/12.04.2019-11:00:14.mp4
[0006/0040] Uploading 12.04.2019-11:07:01.mp4 -> eg-haustuer-aussen/12.04.2019-11:07:01.mp4
[0007/0040] Uploading 12.04.2019-11:29:37.mp4 -> eg-haustuer-aussen/12.04.2019-11:29:37.mp4
[0008/0040] Uploading 12.04.2019-11:41:45.mp4 -> eg-haustuer-aussen/12.04.2019-11:41:45.mp4
[0009/0040] Uploading 12.04.2019-12:33:23.mp4 -> eg-haustuer-aussen/12.04.2019-12:33:23.mp4
[0010/0040] Uploading 12.04.2019-12:42:06.mp4 -> eg-haustuer-aussen/12.04.2019-12:42:06.mp4
[0011/0040] Uploading 12.04.2019-12:43:08.mp4 -> eg-haustuer-aussen/12.04.2019-12:43:08.mp4
[0012/0040] Uploading 12.04.2019-12:43:39.mp4 -> eg-haustuer-aussen/12.04.2019-12:43:39.mp4
[0013/0040] Uploading 12.04.2019-12:57:45.mp4 -> eg-haustuer-aussen/12.04.2019-12:57:45.mp4
[0014/0040] Uploading 12.04.2019-13:00:19.mp4 -> eg-haustuer-aussen/12.04.2019-13:00:19.mp4
[0015/0040] Uploading 12.04.2019-13:01:44.mp4 -> eg-haustuer-aussen/12.04.2019-13:01:44.mp4
[0016/0040] Uploading 12.04.2019-13:04:05.mp4 -> eg-haustuer-aussen/12.04.2019-13:04:05.mp4
[0017/0040] Uploading 12.04.2019-13:04:24.mp4 -> eg-haustuer-aussen/12.04.2019-13:04:24.mp4
[0018/0040] Uploading 12.04.2019-13:05:19.mp4 -> eg-haustuer-aussen/12.04.2019-13:05:19.mp4
[0019/0040] Uploading 12.04.2019-13:05:42.mp4 -> eg-haustuer-aussen/12.04.2019-13:05:42.mp4
[0020/0040] Uploading 12.04.2019-13:08:27.mp4 -> eg-haustuer-aussen/12.04.2019-13:08:27.mp4
[0021/0040] Uploading 12.04.2019-13:08:49.mp4 -> eg-haustuer-aussen/12.04.2019-13:08:49.mp4
[0022/0040] Uploading 12.04.2019-13:10:40.mp4 -> eg-haustuer-aussen/12.04.2019-13:10:40.mp4
[0023/0040] Uploading 12.04.2019-13:16:44.mp4 -> eg-haustuer-aussen/12.04.2019-13:16:44.mp4
[0024/0040] Uploading 12.04.2019-13:39:53.mp4 -> eg-haustuer-aussen/12.04.2019-13:39:53.mp4
[0025/0040] Uploading 12.04.2019-13:40:43.mp4 -> eg-haustuer-aussen/12.04.2019-13:40:43.mp4
[0026/0040] Uploading 12.04.2019-13:44:20.mp4 -> eg-haustuer-aussen/12.04.2019-13:44:20.mp4
[0027/0040] Uploading 12.04.2019-13:51:51.mp4 -> eg-haustuer-aussen/12.04.2019-13:51:51.mp4
[0028/0040] Uploading 12.04.2019-14:21:50.mp4 -> eg-haustuer-aussen/12.04.2019-14:21:50.mp4
[0029/0040] Uploading 12.04.2019-15:17:12.mp4 -> eg-haustuer-aussen/12.04.2019-15:17:12.mp4
[0030/0040] Uploading 12.04.2019-18:46:35.mp4 -> eg-haustuer-aussen/12.04.2019-18:46:35.mp4
[0031/0040] Uploading 12.04.2019-18:48:02.mp4 -> eg-haustuer-aussen/12.04.2019-18:48:02.mp4
[0032/0040] Uploading 12.04.2019-18:48:19.mp4 -> eg-haustuer-aussen/12.04.2019-18:48:19.mp4
[0033/0040] Uploading 12.04.2019-18:59:00.mp4 -> eg-haustuer-aussen/12.04.2019-18:59:00.mp4
[0034/0040] Uploading 12.04.2019-18:59:43.mp4 -> eg-haustuer-aussen/12.04.2019-18:59:43.mp4
[0035/0040] Uploading 12.04.2019-19:00:02.mp4 -> eg-haustuer-aussen/12.04.2019-19:00:02.mp4
[0036/0040] Uploading 12.04.2019-19:00:41.mp4 -> eg-haustuer-aussen/12.04.2019-19:00:41.mp4
[0037/0040] Uploading 12.04.2019-19:02:17.mp4 -> eg-haustuer-aussen/12.04.2019-19:02:17.mp4
[0038/0040] Uploading 12.04.2019-19:03:20.mp4 -> eg-haustuer-aussen/12.04.2019-19:03:20.mp4
[0039/0040] Uploading 12.04.2019-19:04:55.mp4 -> eg-haustuer-aussen/12.04.2019-19:04:55.mp4
[0040/0040] Uploading 12.04.2019-19:30:06.mp4 -> eg-haustuer-aussen/12.04.2019-19:30:06.mp4
Sync finished in 1m21.721329045s
Display More
Auf Google Drive sieht das Ganze dann so aus:
Google-Drive-Synchronisierung automatisieren
Damit wir uns nicht immer einloggen und das Skript per Hand starten müssen, legen wir einen entsprechenden Job an, der das automatisch für uns erledigt. Zunächst rufen wir
crontab -e
auf.
In die letzte Zeile tragen wir ein:
# Täglich um Mitternacht Kameravideos und -Fotos mit Google Drive synchronisieren
0 0 * * * /home/pi/sync-camfiles-to-google-drive.sh
Wichtig: Nach der letzten Zeile Enter drücken, um noch eine Leerzeile einzufügen, ansonsten zickt eventuell die Job-Ausführung.
Gespeichert wird wieder mit STRG+O, Enter, STRG+X.
Das war's. Von nun an werden immer Punkt Mitternacht alle neu angefallenen Videos mit Google Drive synchronisiert.
Webcam-Livestream am Computer anzeigen
Man kann den Livestream entweder in einem normalen Browserfenster öffnen, oder sich aber auch ein kleines Skript basteln, welches den Browser ohne Menüleiste und in minimaler Ansicht darstellt. So spart man Platz und man kann gleich mehrere Webcams auf dem Bildschirm platzsparend unterbringen.
Wir wechseln also wieder vom Raspberry an den normalen Computer, öffnen ein Terminal, und erstellen eine leere Datei im Home-Verzeichnis:
nano show-livestream-eg-haustuer-aussen.sh
Das "eg-haustuer-aussen" natürlich wieder nach eigenen Vorstellungen anpassen
Da ich ein Fan von Chrome und Chromium bin, habe ich das ganze auch über diesen Browser realisiert.
Mit der Option --app startet der Browser in minimaler Ansicht, mit --window-size legt man die Fenstergröße fest. Der Schalter --disable-extensions schaltet alle Erweiterungen ab.
#!/bin/sh
/snap/bin/chromium -app=http://pi:geheimeskennwort@eg-haustuer-aussen:8081 --window-size=480,320 --disable-extensions
"geheimeskennwort" und "eg-haustuer-aussen" müssen natürlich noch ersetzt werden.
Und wieder das alte Lied: Speichern und schließen mit STRG+O, Enter, STRG+X.
Jetzt noch eine ausführbare Datei draus machen:
chmod +x show-livestream-eg-haustuer-aussen.sh
Damit der Dateimanager "Nautilus" unter Ubuntu die sh-Datei bei einem Aufruf auch ausführt und nicht nur als Textdatei darstellt, ist folgende Anpassung nötig:
- Nautilus öffnen
- Auf "Dateien" und "Einstellungen" gehen
- Im Reiter "Verhalten" bei "Ausführbare Textdateien" den Punkt "Ausführen" anwählen
Nun sieht man nach einem Doppelklick auf die sh-Datei den Livestream der Kamera in einem kleinen Browserfenster. Und wenn es nicht gerade dunkel wäre, würde man sogar ein Bild sehen
Fernzugriff einrichten mit einer Fritz!Box (7560)
DynDNS
Zunächst müssen wir sicherstellen, dass wir immer Zugriff auf die externe IP-Adresse der Fritz!Box haben, die sich in der Regel alle 24 Stunden ändert. Dafür richten wir uns bei einem DynDNS-Anbieter ein Konto ein. Ich habe ddnss.de gewählt.
Nachdem man im Dashboard "Neuen Host erstellen" gewählt hat...
...vergibt man einen Namen und die Domain.
Anschließend legt man fest ob IPv4 oder v6 verwendet werden soll...
Dann noch auf "Jetzt erstellen" klicken und der Host ist eingerichtet.
Den Hostnamen müssen wir uns merken bzw. kopieren, diesen brauchen wir gleich für die Einrichtung der Fritz!Box.
Fritz!Box für Fernzugriff konfigurieren
DynDNS aktivieren
Damit die Fritz!Box auf DynDNS-Anfragen reagiert, müssen wir ihr unseren DynDNS-Anbieter noch bekannt geben. Die Einrichtung geschieht im Menüpunkt "Freigaben" unter "DynDNS". Die Informationen, die hier rein müssen, erfährt man beim DynDNS-Anbieter. Bei DynDNS klickt man dazu auf den Schraubenschlüssel auf der rechten Seite.
Diese Informationen müssen wir nun an der entsprechenden Stelle in der Fritz!Box eintragen und mit "Übernehmen" aktivieren:
Kamera aus dem Internet erreichbar machen
Zunächst wählen wir auf der Benutzeroberfläche der Fritz!Box:
Internet / Freigaben / Gerät für Freigabe hinzufügen
In der Dropdown-Liste oben wählen wir unseren Raspberry (in meinem Fall eg-haustuer-aussen) und klicken dann rechts unten auf die Schaltfläche "Neue Freigabe".
Im folgenden Fenster müssen diese Einstellungen gemacht werden:
- Portfreigabe
- Anwendung: Andere Anwendung
- Bezeichnung: Frei wählbar, in meinem Fall "Überwachungskamera"
- Protokoll TCP
- Port an Gerät: 8081 bis 8081 (je nachdem, wie es in der motion.conf eingestellt ist)
- Port extern: Frei wählbar. Ich habe die interne IP-Adresse des Raspberry gewählt, plus eine "81" hinten dran. Weil ich weiß, dass der Raspberry unter der IP 10.0.0.206 erreichbar ist, lässt sich so der Port leicht merken. Kommen noch weitere Raspberrys hinzu, bekommen diese die Ports 20781, 20881, 20981, und so weiter. Wenn der Port außerhalb des zulässigen Bereichs ist (maximal 65535), meldet sich die Fritz!Box sowieso und meckert.
Dann bestätigen wir mit OK, nochmals mit OK und mit "Übernehmen".
Anschließend erscheinen folgende Einträge in der Fritz!Box:
Raspberry per SSH aus dem Internet erreichbar machen
Das, was wir eben für die Kamera gemacht haben, wiederholen wir nochmals für den SSH-Fernzugriff.
Dazu klicken wir im Menüpunkt "Freigaben" und "Portfreigaben" auf den Bearbeiten-Bleistift rechts neben unserem Raspberry und wählen "Neue Freigabe".
Im folgenden Fenster müssen diese Einstellungen gemacht werden:
- Portfreigabe
- Anwendung: Andere Anwendung
- Bezeichnung: Frei wählbar, in meinem Fall "SSH"
- Protokoll TCP
- Port an Gerät: 22 bis 22
- Port extern: Frei wählbar. Ich habe wieder die interne IP-Adresse des Raspberry gewählt, plus eine "22" hinten dran. Weil ich weiß, dass der Raspberry unter der IP 10.0.0.206 erreichbar ist, lässt sich so der Port leicht merken. Kommen noch weitere Raspberrys hinzu, bekommen diese die Ports 20722, 20822, 20922, und so weiter...
Jetzt wieder OK, OK und Übernehmen klicken.
Wir erhalten dann folgende Darstellung:
Fertig - von nun an lässt sich der Raspberry Zero aus dem Internet erreichen, entweder um das Kamera-Livebild anzusehen, oder sich per SSH draufzuschalten um Konfigurationen vornehmen zu können.
Das Livebild der Kamera lässt sich folgendermaßen betrachten:
Man tippt seine DynDNS-Adresse, gefolgt vom Port, in die Adresszeile des Browsers ein, zum Beispiel:
mein-gewählter-hostname.ddnss.org:20681
Da ich in der motion.conf meine Webcam mit Benutzername und Passwort gesichert habe, tippen wir diese beiden Zeilen noch ein:
Wenn die Kamera jetzt nicht zu Testzwecken im Dachboden, sondern außen an der Tür hängen würde, wäre auch das Livebild das Richtige
Fernzugriff auf den Raspberry mit SSH
Da ich kein Windows-Fan (mehr) bin, zeige ich den Fernzugriff am Beispiel von Linux bzw. Ubuntu.
Man öffnet am Computer an einem x-beliebigen Standort auf der Welt ein Terminal (STRG+ALT+T) und tippt folgenden Befehl ein:
ssh -p 20622 pi@mein-gewählter-hostname.ddnss.org
Mit der Option "-p" teile ich der SSH-Verbindung mit, welchen Port sie benutzen soll. Die "20622" muss man dann natürlich durch den Wert ersetzen, den man in der Fritz!Box bei den Portfreigaben eingetragen hat.
Dann noch das Raspberry-Kennwort eintippen, und wir sind drin
Datenschutz-Vorkehrungen
Noch bevor ein Besucher in den Überwachungsbereich der Kamera eintritt, sollte gut sichtbar ein Schild angebracht werden. Der Inhalt könnte etwa folgendermaßen aussehen. Entsprechende Angaben sind dann natürlich noch zu ergänzen bzw. zu ersetzen:
Viel Spaß bei der Umsetzung!
LG
Christian
PS: Sobald ich wieder Zeit und Lust habe, beschreibe ich noch die Installation und Einrichtung des Überwachungsmonitors in der Wohnung.