Überwachungskamera mit einem Raspberry Pi, motion und Syncthing in 20 Minuten
Eine Überwachungskamera mit einem Raspberry Pi nichts einfacher als das? Auf vielen Seiten im Internet findet man dazu einen Verweis auf motioneyeos
, so auch hier im Blog. Aber, das Betriebssystem wird nicht mehr weiter entwickelt.
Es gibt aber Alternativen, die sich genauso einfach installieren und managen lassen.
Beitrag überarbeitet im Januar 2024
Syncthing wird auf der Kamera dafür genutzt, die aufgenommenen Bilder und Videos unkompliziert auf andere Geräte mit Syncthing zu übertragen. Die Bilder werden von Motion
aufgenommen und in einem Ordern /mnt/motion/pictures
gespeichert.
Gleichzeitig mit der Installation von Motion wird auch ein gleichnamiger Benutzer motion
auf dem Raspberry Pi angelegt. Das ist auch gleichzeitig der Benutzer, mit dem der Motion Service läuft und mit dessen Rechte auf Ordner und Dateien zugegriffen wird. Der Benutzer motion
hat kein Home-Verzeichnis, was aber für die weitere Konfiguration keine Rollte spielt.(Das lässt sich in der /etc/group
einsehen.)
Das bedeutet für die nachfolgende Konfiguration, dass ausschließlich der Benutzer motion
Zugriff 🚪 auf die Ordner und Dateien benötigt, weitreichende Berechtigungen werden vermieden.
Die Anleitung wurde überarbeitet und die alten Abschnitte entsprechend gekennzeichnet.
Das Ziel
Eine kleine Überwachungskamera,
- die Bilder und/oder Videos von Bewegung aufzeichnet,
- Zeitrafferaufnahmen macht,
- der überwachte Bereich im Webbrowser oder VLC in (fast) Echtzeit angeschaut werden kann
- die Bilder-/Video-Aufnahmen automatisch auf den eigenen Client übertragen werden
Was wird benötigt?
Hardware: Raspberry Pi >= Modell 3️⃣
Raspberry Pi Zeros eignen sich gut für Snapshots oder zum Streamen. Für die Erkennung von Bewegung sind die Modelle ein wenig schwach auf der CPU und RAM.
Betriebssystem
Als Betriebssystem kommt das aktuellste Raspberry Pi OS
zum Einsatz. Es kann nach dieser Anleitung auf die SD-Karte geschrieben werden.
Das System kann noch ein wenig abgesichert werden. Dazu kann man z.B. fail2ban
, unattended-upgrades
, ufw
, etc. installieren und konfigurieren.
Codeberg
Dein Weg zur eigenen Nextcloud
Motion
Motion installieren und motion.conf
Im nächsten Schritt ist motion
aus den Repositories zu installieren.
sudo apt update && sudo apt dist-upgrade && sudo apt autoremove
sudo apt install motion
Die Konfigurationsdatei motion.conf
findet sich im Verzeichnis /etc/motion/motion.conf
.
Die einzelnen Optionen sind auf der offiziellen Seite des Projekts genau beschrieben.
Ein kleines Beispiel soll zeigen, wie einzelne Funktionen in der Konfigurationsdatei aktiviert werden.
# Backup anlegen
sudo nano /etc/motion/motion.conf /etc/motion/motion.conf-bak
# Datei bearbeiten
sudo nano /etc/motion/motion.conf
Stream anschalten:
############################################################
# Live stream configuration parameters
############################################################
# The port number for the live stream.
stream_port 8081
# Restrict stream connections to the localhost.
stream_localhost off
# This parameter establishes the username and password to use for the stream.
# The syntax is username:password
# stream_authentication username:password
Je nach verwendetem Kameramodell kann die Auflösung angepasst werden. Dazu sind die Einträge entsprechend ein- oder auszuschalten.
- ein = ohne
#
- aus = mit
#
# Image width in pixels.
width 640
#width 1280
#width 1920
# Image height in pixels.
height 480
#height 720
#height 1080
Nach jeder Änderung an der motion.conf
ist die Datei neu einzulesen, also motion neu zu starten.
sudo systemctl restart motion
Befehlsliste für motion
sudo systemctl start motion
sudo systemctl restart motion
sudo systemctl stop motion
Ordner für Motion anlegen
Die Bilder und Videos werden auf einem USB-Stick mit ext4
-Formatierung gespeichert.
Mit dem Befehl lsblk -f
lassen sich alle verfügbaren Laufwerke auflisten und das richtige Verzeichnis auswählen. Kann das Laufwerk nicht eindeutig identifiziert werden, hilft ein Check mit sudo blkid
. Die angezeigten UUIDs lassen sich dann vergleichen und der USB-Stick kann eindeutig identifiziert werden.
sudo mkfs -t ext4 /dev/sda1
mke2fs 1.46.2 (28-Feb-2021)
/dev/sda1 contains a ntfs file system labelled 'motion'
Proceed anyway? (y,N) y
Creating filesystem with 61145080 4k blocks and 15286272 inodes
Filesystem UUID: sssdddsssdddsssddd
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872
Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done
# Kontrolle und Abfrage der UUID
lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
sda
└─sda1 ext4 1.0 sssdddsssdddsssddd
mmcblk0
├─mmcblk0p1 vfat FAT32 bootfs 2222222222 223,3M 12% /boot
└─mmcblk0p2 ext4 1.0 rootfs 3333333333csaasdasdasdasdasdasda s 23,1G 16% /
Der Eintrag in der /etc/fstab
für ein ext4-formatierten USB-Stick ist wie folgt zu setzen.
sudo nano /etc/fstab
UUID=sssdddsssdddsssddd /mnt/motion ext4 defaults 0 0
Der Mount Point ist zu erstellen und anschließend das USB-Laufwerk einzuhängen:
sudo mkdir /mnt/motion
sudo mount /mnt/motion
Auf die Motion Ordner benötigt nur der Benutzer motion
Zugriff 🚪. Andere Benutzer, also auch der eigenen Benutzer, hat ab diesem Zeitpunkt keinen Zugriff mehr auf die Inhalte. Mit sudo
kann man aber nach wie vor auf die Bilder zugreifen.
sudo chown root:root /mnt/motion
sudo chmod 0755 /mnt/motion
# Ordner für Logdateien von Motion
sudo mkdir /mnt/motion/logs
sudo chown motion:motion /mnt/motion/logs
sudo chmod 0700 /mnt/motion/logs
# Ordner für Videos, Bilder und Snap shoots
sudo mkdir /mnt/motion/pictures
sudo chown motion:motion /mnt/motion/pictures
sudo chmod 0700 /mnt/motion/pictures
# Ordner für masks
sudo mkdir /mnt/motion/masks
sudo chown motion:motion /mnt/motion/masks
sudo chmod 0600 /mnt/motion/masks
Die neuen Ordner sind in der Konfigurationsdatei motion.conf
einzutragen.
# File to write logs messages into. If not defined stderr and syslog is used.
#log_file /var/log/motion/motion.log
log_file /mnt/motion/logs
# Target directory for pictures, snapshots and movies
target_dir /mnt/motion/pictures
##############################################################
# Mask Files
#############################################################
#mask_file /mnt/motion/masks/mask.pgm
#mask_privacy /mnt/motion/masksmask_privacy.pgm
Zum Einlesen der neuen Konfiguration ist Motion neu zu starten.
sudo systemctl restart motion
Skripte in motion.conf
Motion bietet auch die Möglichkeit an, bei bestimmten Ereignissen einen Befehl auszuführen.
So kann z.B. beim Speichern eines Bildes ein Shell Skript ausgeführte werden
# Auszug aus der motion.conf
on_picture_save echo 'webcam alert' | sh /etc/scripts/newest-file.sh
Damit das Skript von Motion gestartet werden kann, benötigt der Benutzer motion
die entsprechenden Zugriffsrechte 🚪.
sudo touch /etc/scripts/custom/custom/newest-file.sh
sudo chown motion:motion /etc/scripts/custom/newest-file.sh
sudo chmod 0500 /etc/scripts/custom/newest-file.sh
sudo nano /etc/scripts/custom/newest-file.sh
Testen lässt sich das Skript, indem man es mit dem Benutzer motion
ausführt.
sudo -u motion /etc/scripts/custom/newest-file.sh
Inhalt von newest-file.sh
.
#!/usr/bin/env bash
# E-Mail where the file should be mailed to
EMAIL="cctv@email.de"
picpath='/mnt/motion/pictures/'
newest=$(ls -rt ${picpath}*.jpg | tail -n1)
echo $(date +%Y-%m-%d_%H-%M-%S) '- CCTV - Motion detected' | mutt -e "set content_type=text/html, realname='CCTV'" -s "CCTV - Motion Detected" -a $newest -- ${EMAIL}
Syncthing
Syncthing Installation
Die Installation von Syncthing ist optional. Das Tool wird nur benötigt, wenn die Bilder und / oder Videos von der Kamera automatisch auf einen oder mehrere andere Geräte übertragen werden sollen.
Warning
🚨 Syncthing sollte ausschließlich den aktuellen Paketen des Projekts installiert werden. Es sind dafür die Sources und Repositories entsprechend der offiziellen Dokumentation einzubinden. 👉👉👉 https://apt.syncthing.net/ 👈👈👈
Die Installation von Syncthing ist dann schnell erledigt.
sudo apt update && sudo apt install syncthing
Syncthing muss PRO Benutzer auf der Kamera gestartet werden. Ein Benutzer ist dafür ausreichend.
sudo systemctl start syncthing@benutzername
Damit Syncthing auch automatisch mit dem Pi gestartet wird, ist der Autostart ebenfalls PRO Benutzer anzulegen
sudo systemctl enable syncthing@benutzername
Befehlsliste für Syncthing
sudo systemctl status syncthing@benutzer
sudo systemctl stop syncthing@benutzer
sudo systemctl restart syncthing@benutzer
Info
Syncthing benötigt für die Übertragung der Bilder aus dem Ordner /mnt/motion/pictures
auf andere Geräte Schreibrechte auf den Ordner❗️
Zugriff 🚪 darauf hat nur der Benutzer motion
.
Da Syncthing immer PRO Benutzer konfiguriert werden muss, ist der Benutzer motion
dafür zu nutzen.
# Benutzer motion für CCTVs
sudo systemctl start syncthing@motion
Damit Syncthing auch automatisch mit dem System gestartet 🏁 wird, ist der Autostart ebenfalls PRO Benutzer anzulegen.
sudo systemctl enable syncthing@motion
Auf dem gleichen Weg lässt sich der Systemdienst für den Benutzer wieder deaktivieren ⛔️.
sudo systemctl disable syncthing@motion
Befehlsliste
# Benutzer motion
sudo systemctl status syncthing@motion
sudo systemctl stop syncthing@motion
sudo systemctl restart syncthing@motion
Warning
Wird Syncthing von mehreren Benutzern auf einem Server verwendet, dann erhält jeder Benutzer einen eigen Port zum Aufrufen der Web-GUI zugewiesen ❗️❗️❗️❗️❗️
Der jeweilige Port wird mit dem Status-Befehl sudo systemctl status syncthing@benutzername
angezeigt.
Da auf dem System nur ein Benutzer Syncthing verwendet, sollte der Standardport 8384
verwendet werden. Eine kurze Kontrolle mit sudo systemctl status syncthing@motion
schadet aber nicht und erspart einigen Ärger 😉
Wer Syncthing nicht installieren möchte, kann auch rsync
für das Übertragen der Bilder/Videos auf den eigenen Client verwenden. Am Einfachsten ist dann das Anlegen eines eigenen Shell Skripts, dass in regelmäßigen Abständen mit einem CRON gestartet wird.
Syncthing Share Ordner
Mit der bestehenden Konfiguration wird nur der Ordner /mnt/motion/pictures
auf andere Geräte übertragen.
Es bietet sich aber auch die Option an, den Raspberry Pi als eine Art Sicherungs- Snycserver zu verwenden. Sind weitere CCTVs vorhanden ist es evtl. sinnvoll alle Bilder auf einen zentralen Server zusammenzufassen.
In einem solchen Fall bietet sich ein Share Ordner an, im Beispiel synthing-share
benannt.
Es wird der Benutzer motion
verwendet, den wir bereits oben eingerichtet haben.
sudo mkdir /mnt/motion/synthing-share
sudo chown motion:motion /mnt/motion/synthing-share
sudo chmod 0700 /mnt/motion/synthing-share
Alle empfangenden Ordner können in Syncthing als Unterordner in das Verzeichnis hinzugefügt werden. Zugriff 🚪 hat nur der Benutzer motion
.
Natürlich kann für diese Synchronisation auch ein neuer Syncthing-Benutzer mit eingeschränkten Rechten angelegt werden. Die Zugriffsrechte 🚪 auf den Ordner synthing-share
ist entsprechend anzupassen.
Syncthing Konfigurationsdateien
Die Konfigurationsdatei für Syncthing kann für jeden Benutzer individuell angepasst werden. Sie befindet sich im Home-Verzeichnis.
~/.config/syncthing
#oder
~/.local/state/syncthing
Syncthing - Verbindungseinstellungen
Je nach Anwendungszweck können die Verbindungseinstellungen in der Web-GUI angepasst werden. In der Tabelle habe ich versucht den Einsatzszweck übersichtlich darzustellen.
Option | Nur eigenes LAN | LAN und Subnetze | Internet |
---|---|---|---|
NAT-Durchdringung aktivieren | ✅ | ✅ | ✅ |
Globale Gerätesuche | ❌ | ✅ | ✅ |
Lokale Gerätesuche | ✅ | ✅ | ✅ |
Weiterleitung aktivieren | ❌ | ❌ | ✅ |
Gib mir gerne einen Kaffee ☕ aus ❗️
Wenn dir meine Beiträge gefallen und geholfen haben, dann kannst du mir gerne einen Kaffee ☕️ ausgeben.
Syncthing - Firewall
Firewall, ein muss auf jedem Server. Für die CCTVs wird ufw genutzt.
ufw bietet bereits eine Profil-Datei für Syncthing an, die für die Firewallregel verwendet werden kann.1
sudo ufw app list
sudo ufw allow syncthing
sudo ufw reload
sudo ufw status
Infos zu ufw
gibt es hier 👉 ufw App Profile für die Nextcloud
Codeberg
Dein Weg zur eigenen Nextcloud
SSH-Zugriff
Da der Raspberry Pi Headless betrieben wird, steht dort keine grafische Benutzeroberfläche für die Administration zur Verfügung.
Mithilfe eines SSH-Tunnels (TCP-Forwarding) kann jedoch die grafische Oberfläche vom Pi auf den eigenen Client (oder einen anderen PC) geholt werden, was die Administration von Syncthing sehr vereinfacht.
Note
Verwenden mehrere Benutzer Syncthing auf dem Server kann sich der Port unterscheiden. Der Port für einen bestimmten Benutzer wird mit dem Status-Befehl sudo systemctl status syncthing@benutzername
angezeigt.
8384
= Port auf dem Raspberry Pi18384
= getunnelter Port zum eigenen Client
SSH-Verbindung herstellen:
ssh benutzername@ip-adresse-kamera -L 18384:localhost:8384
Auf dem eigenen Client kann nun im Webbrowser die Syncthing-Oberfläche des Pis aufgerufen werden.
http://localhost:18384/
In der sshd_config
der Kamera ist zu prüfen, ob die Option AllowTcpForwarding
auf yes
gestellt ist.
###
# AllowTcpForwarding
###
# Specifies whether TCP forwarding is permitted. The default is ''yes''.
# Note that disabling TCP forwarding does not improve security unless users are also
# denied shell access, as they can always install their own forwarders.
AllowTcpForwarding yes
Der eigene Client
Auf dem eigenen Client benötigt man lediglich einen Webbrowser, um den Stream der Überwachungskamera anzuschauen.
In die Adresszeile ist einzutragen:
http://ip-addresse:8081
Auch mit VLC lässt sich der Stream der Kamera öffnen. Dazu legt man sich ein kleines Skript mit dem Namen vlc.xspf
an. Es ist lediglich der Eintrag http://ip-addresse:8081
zu ändern.
Note
Die Firewall auf dem Raspberry Pi muss für den Port 8081 geöffnet werden❗️
(sudo ufw allow 8081/tcp
oder sudo ufw allow from 192.xxx.xxx.0/24 to any port 8081 proto tcp
oder an die eigenen Anforderungen anpassen)
<?xml version="1.0" encoding="UTF-8"?>
<playlist xmlns="http://xspf.org/ns/0/" xmlns:vlc="http://www.videolan.org/vlc/playlist/ns/0/" version="1">
<title>Meine Kamera - WLAN</title>
<trackList>
<track>
<location>http://192.168.312.61:8081/</location>
<extension application="http://www.videolan.org/vlc/playlist/0">
<vlc:id>0</vlc:id>
<vlc:option>network-caching=1000</vlc:option>
</extension>
</track>
</trackList>
<extension application="http://www.videolan.org/vlc/playlist/0">
<vlc:item tid="0"/>
</extension>
</playlist>
Möchte man auch die Bilder und/oder Videos von der Überwachungskamera vom Ordner mn´/moíon/pictures
auf den eigenen Client holen oder auf einen anderen Laptop/Server übertragen, dann ist Syncthing dort ebenfalls zu installieren.
Warning
🚨 Syncthing sollte ausschließlich den aktuellen Paketen des Projekts installiert werden. Es sind dafür die Sources und Repositories entsprechend der offiziellen Dokumentation einzubinden. 👉👉👉 https://apt.syncthing.net/ 👈👈👈
Für Mac gibt es ein Homebrew Cask 2
brew install syncthing
Nach der Installation kann das Tool gestartet werden und im Webbrowser aufgerufen werden, um eine Verbindung zur Kamera herzustellen.
https://127.0.0.1:8384/
Damit man sehr einfach die Verbindung zum Client auf der Kamera freigeben kann, ist der SSH-Tunnel wie oben beschrieben aufzubauen. Auf dem eigenen Client kann dann Syncthing der Kamera im Webbrowser aufgerufen werden und auch konfiguriert werden.
❗️ Es müssen unterschiedliche Ports für das lokal installierte Syncthing (8384
) und das getunnelte Syncthing (z.B. 18384
) verwendet werden.
http://localhost:18384/
Syncthing gibt es auch als Docker Image. Damit kann man das kleine Tool auch auf dem eigenen NAS (Synology, omv, etc.) sehr einfach installieren.
Weitere Tweaks für die Kamera
Automatisches Löschen von Bildern/Videos auf der Kamera
Die Bilder/Videos lassen sich auf der Kamera sehr einfach mit einem kleinen Shell Skript löschen.
sudo mkdir /etc/scripts
sudo nano /etc/skripte/autodelete.sh
Der Inhalt von autodelete.sh
#!/usr/bin/env bash
#
# This scripts deletes files older than x days
#
# Copyright by Stefan Strobel
# https://www.strobelstefan.de
###################################
# Variables
###################################
# Script name
MAINSCRIPT=$(basename -- "$0")
# Storage device as defined in your /etc/fstab.
MOUNTPOINT='/mnt/motion/pictures/'
###################################
# Delete Old Files
###################################
find ${MOUNTPOINT}* -mtime +7 -exec rm {} \;
exit 0
Das Skript muss nicht zwingend als root
ausgeführt werden, es kann auch bom Benutzer motion
gestartet werden. Es werden beide Möglichkeiten aufgezeigt.
# Ausführen als root
sudo chown root:root /etc/scripts/autodelete.sh
sudo chmod 0700 /etc/scripts/autodelete.sh
# Ausführen als motion
sudo chown motion:motion /etc/scripts/autodelete.sh
sudo chmod 0500 /etc/scripts/autodelete.sh
Cron für Benutzer root
anlegen:
sudo crontab -e
Die Zeile ist einzutragen
# Deletes files older than x days
00 8 * * * /bin/bash /etc/scripts/autodelete.sh
Cron für Benutzer motion
anlegen:
sudo crontab -u motion -e
Die Zeile ist einzutragen
# Deletes files older than x days
00 8 * * * /bin/bash /etc/scripts/autodelete.sh
E-Mail-Versand für Kamera einrichten
Codeberg
Dein Weg zur eigenen Nextcloud
Man kann z.B. ein regelmäßiges Statusupdate von der Kamera versenden lassen
Regelmäßiger Neustart
Manchmal ist es ganz sinnvoll den Raspberry Pi in regelmäßigen Abständen neu zu starten.
sudo crontab -e
# Reboot to defined time
0 5 * * * /sbin/shutdown -r +5
NTFS USB-Stick - veraltet
Note
Die Anleitung gilt für NTFS formatierte USB-Sticks. Nach Möglichkeit ist ext4
zu verwenden.
An der Kamera kann ein externer USB-Stick angeschlossen werden, der eine größere Speicherkapazität als die interne SD-Karte hat.
In der motion.conf
ist der Speicherpfad dann entsprechend einzustellen.
# USB-Stick ist NTFS-formatiert
sudo apt install ntfs-3g
# USB-Stick anschließen und UUID herausfinden
sudo blkid
# Eintrag für das Mounten des USB-Sticks in die /etc/fstab eintragen
# Die UUID des USB-Sticks wird hier benötigt
sudo nano /etc/fstab
UUID=xxxxxxx /mnt/motion ntfs defaults,auto,umask=000,users,rw 0 0
# Mount Point für USB-Stick anlegen
sudo mkdir /mnt/motion
# USB-Stick mounten
sudo mount /mnt/motion
# Ordner für Bilder / Videos auf USB-Stick anlegen
sudo mkdir /mnt/motion/pictures
# Ordner für motion logfiles anlegen
sudo mkdir /mnt/motion/logs
In der motion.conf
sind die Pfade anzupassen, damit die Bilder/Videos und die Logfiles auf dem USB-Stick gespeichert werden.
sudo nano /etc/motion/motion.conf
In der Datei sind die Zeilen anzupassen.
target_dir /mnt/motion/pictures
log_file /mnt/motion/logs/motion.log
Nach dem Speichern ist motion neu zu starten, um die Änderungen einzulesen.
sudo systemctl restart motion
Gib mir gerne einen Kaffee ☕ aus ❗️
Wenn dir meine Beiträge gefallen und geholfen haben, dann kannst du mir gerne einen Kaffee ☕️ ausgeben.
Follow Me❗️
Source
Foto von Mich Smith auf Unsplash