Zum Inhalt

Ü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.

Raspberry Pi - Hardwarespezifikation

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.

Donation via PayPalDonation via LiberaPay

Donation via Bitcoin
Bitcoin Address: bc1qfuz93hw2fhdvfuxf6mlxlk8zdadvnktppkzqzj

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 Pi
  • 18384 = 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.

Donation via PayPalDonation via LiberaPay

Donation via Bitcoin
Bitcoin Address: bc1qfuz93hw2fhdvfuxf6mlxlk8zdadvnktppkzqzj

Source

Foto von Mich Smith auf Unsplash