Tools · Automation · Bildüberwachung
Intelligente Bildüberwachung mit upcam-client & SnapShotter
Kamera-Snapshots lokal abholen, Bewegung bewerten und relevante Bilder automatisch per WhatsApp weiterleiten: Dieses Setup verbindet upcam-client als Java-Ingest-Service mit SnapShotter als Node.js-Runtime für Filterung, Telemetrie und Benachrichtigung.

Image licensed by Ingram Image/adpic
Inhalt
- Kurzfassung: Was macht dieses Setup?
- Architektur: Zwei Projekte, ein Workflow
- upcam-client: Kamera-Bilder lokal abholen
- SnapShotter: Bewegung bewerten & Bilder versenden
- Der komplette Ablauf in der Praxis
- Installation & Repository-Setup
- Konfiguration: Kamera, Ordner, Filter, WhatsApp
- Betrieb, Logging & Health-Dateien
- Als Windows-Service betreiben
- Marken-, Hersteller- & Drittanbieterhinweis
- Sicherheit, Datenschutz & rechtliche Hinweise
- Fazit
- Ressourcen & Links
Kurzfassung: Was macht dieses Setup?
Dieses Projekt ist für alle interessant, die eine Kamera nicht nur „irgendwie“ laufen lassen wollen, sondern daraus eine kleine, lokale Automatisierung bauen möchten: Bilder werden von der Kamera abgeholt, lokal gespeichert, bewertet und bei relevanter Bewegung automatisch an einen WhatsApp-Chat geschickt.
Der Kern in einem Satz
upcam-client holt Kamera-Bilder ab, SnapShotter bewertet diese Bilder und verschickt nur relevante Treffer an WhatsApp.
Der Charme liegt darin, dass die eigentliche Verarbeitung lokal läuft. Du bist nicht darauf angewiesen, dass jede kleine Bewegung erst durch irgendeine Kamera-Cloud geschoben wird. Gleichzeitig nutzt du für die Benachrichtigung einen bekannten Kanal: WhatsApp Web.
Wichtig: Nicht „komplett cloudfrei“
Die Kamera-Verarbeitung und die Dateiablage laufen lokal. Der Versand erfolgt aber über WhatsApp Web. Das ist praktisch, aber natürlich ein externer Dienst. Wer absolute Unabhängigkeit von Drittplattformen möchte, müsste statt WhatsApp z. B. E-Mail, Matrix, MQTT, Signal-Bot oder eine eigene Push-Lösung anbinden.
Architektur: Zwei Projekte, ein Workflow
Das Setup besteht aus zwei Teilen, die bewusst getrennt sind:
Früher hätte man das vielleicht als „Kamera lädt Bild runter, Skript schickt Bild weiter“ beschrieben. Das stimmt grob immer noch, wird dem aktuellen Projektstand aber nicht mehr ganz gerecht. Inzwischen ist daraus eher eine kleine Pipeline geworden:
- Kamera liefert Snapshot oder Bildquelle.
- Java-Ingest speichert Frames lokal.
- SnapShotter bewertet die Frames.
- Relevante Bilder gehen an WhatsApp.
- Verworfene Bilder landen getrennt in einem Filter-Ordner.
- Health-, Decision- und Notification-Dateien helfen beim Betrieb.
upcam-client: Kamera-Bilder lokal abholen
upcam-client ist der Java-Part des Setups. Er kümmert sich darum, Bilder von einer kompatiblen Kamera abzuholen und lokal bereitzustellen. Im aktuellen Repository ist das Projekt nicht mehr nur auf klassische UpCam-Setups beschränkt, sondern kennt als Kameraquellen u. a.:
UPCAMREOLINK
Das ist praktisch, weil sich das Konzept damit besser auf moderne Kamera-Setups übertragen lässt. In meinem eigenen Setup ist der Gedanke: Die Kamera liefert Bildmaterial, aber die Entscheidung, was daraus wirklich relevant ist, liegt lokal in der eigenen Pipeline.
Was upcam-client macht
- Verbindung zur Kamera herstellen
- Snapshots oder Bildquellen abrufen
- Bilder lokal speichern
- Konfiguration über Properties-Dateien laden
- lokale Zugangsdaten von versionierten Defaults trennen
- optional einen einzelnen Ingest-Lauf mit
--onceausführen
Warum Java?
Für den Kamera-Ingest ist Java ziemlich angenehm: stabil, gut als Dauerläufer betreibbar, stark bei Dateiverarbeitung und einfach als Windows-Service einzubinden. Für produktive Setups ist das nicht sexy, aber genau das ist hier ein Vorteil. Es soll laufen. Nicht glitzern.
SnapShotter: Bewegung bewerten & Bilder versenden
SnapShotter ist der Node.js-Part. Er verarbeitet die vom Java-Ingest erzeugten Frames, bewertet Bewegung und entscheidet, ob ein Bild relevant genug für den Versand ist.
Kurz erklärt: Was macht SnapShotter?
SnapShotter nimmt eingehende Kamera-Frames entgegen, bewertet sie anhand konfigurierbarer Filterregeln, verschickt akzeptierte Bilder an WhatsApp und sortiert verarbeitete Dateien in passende Zielordner.
Typischer Runtime-Flow
- Neue Bilddateien landen im Eingangsordner, z. B.
./images/received/. - SnapShotter bewertet Bewegung, Helligkeit und Ereignislogik.
- Akzeptierte Bilder werden an WhatsApp gesendet.
- Gesendete Bilder landen z. B. in
./images/sent/. - Verworfene Bilder landen z. B. in
./images/filtered/. - Health- und Entscheidungsdaten werden in
./.state/geschrieben.
Warum Node.js?
SnapShotter nutzt Node.js, weil der Versand über WhatsApp Web sehr gut in die JavaScript-Welt passt. Die Bibliothek whatsapp-web.js automatisiert WhatsApp Web im Hintergrund. Das ist keine offizielle WhatsApp-Business-API, sondern eine Automatisierung des Web-Clients.
WhatsApp-Hinweis
Automatisierter Versand über WhatsApp Web ist praktisch, aber du solltest ihn nicht für Spam, Werbung oder Massennachrichten missbrauchen. Dieses Setup ist für private oder interne Benachrichtigungen gedacht – nicht als Marketing-Schleuder. Außerdem ist es keine offizielle WhatsApp-, Meta- oder Business-API-Integration.
Der komplette Ablauf in der Praxis
Kamera → upcam-client → lokaler Bildordner → SnapShotter → Filterentscheidung → WhatsApp → Archiv / Filterordner
In der Praxis sieht das so aus:
- Die Kamera stellt ein aktuelles Bild bereit.
- upcam-client ruft dieses Bild ab und speichert es lokal.
- SnapShotter erkennt den neuen Frame.
- Die Filterlogik prüft, ob wirklich Bewegung oder ein relevantes Ereignis vorliegt.
- Nur akzeptierte Bilder werden verschickt.
- Die Entscheidung wird protokolliert.
- Die Datei wird in den passenden Zielordner verschoben.
Das klingt nach Kleinkram, ist aber im Alltag Gold wert. Denn eine Kamera, die bei jeder Wolke, jedem Schatten und jedem Ast im Wind auslöst, nervt sehr schnell. Der eigentliche Mehrwert liegt deshalb nicht nur im Versand, sondern in der Filterung.
Praxis-Erfahrung
Gute Bildüberwachung bedeutet nicht: „Schick mir jedes Bild.“ Gute Bildüberwachung bedeutet: „Schick mir nur das, was ich wahrscheinlich wirklich sehen will.“
Installation & Repository-Setup
Das aktuelle Setup arbeitet mit zwei Repositories:
Im aktuellen upcam-client-Repository ist SnapShotter als Submodule eingebunden. Deshalb ist beim Klonen wichtig, die Submodules direkt mitzuladen.
Repository inklusive Submodule klonen
git clone --recurse-submodules https://github.com/gzeuner/upcam-client.git cd upcam-client
Falls du das Repository bereits ohne Submodule geklont hast:
git submodule update --init --recursive
Voraussetzungen
- Java 21+ für den Java-Ingest
- Maven für Build und Packaging
- Node.js 20+ für SnapShotter
- npm für die Node-Abhängigkeiten
- eine kompatible IP-Kamera bzw. Snapshot-Quelle
- ein WhatsApp-Konto für die Web-Kopplung
Setup-Skripte nutzen
Das Repository bringt Setup-Skripte mit, die eine Runtime-Struktur vorbereiten können.
./setup.sh
setup.bat
Danach kann der Java-Part über die vorbereiteten Starter aufgerufen werden.
%USERPROFILE%\upcam\upcamclient.cmd
~/upcam/upcamclient.sh
Ein einzelner Ingest-Lauf
Zum Testen ist ein einzelner Lauf praktisch. Damit kannst du prüfen, ob Kamera-Verbindung, Zugangsdaten und Zielordner korrekt funktionieren.
java -jar upcam-client-1.0-jar-with-dependencies.jar --once
Konfiguration: Kamera, Ordner, Filter, WhatsApp
Die wichtigste Regel zuerst:
Keine echten Zugangsdaten ins Repository
Echte Kamera-Logins, lokale IPs, Tokens, Sessions und WhatsApp-Auth-Dateien gehören niemals ins Git-Repository. Nutze lokale Konfigurationsdateien und achte darauf, dass Runtime-Ordner ignoriert werden.
Konfigurationsmodell beim Java-Ingest
upcam-client trennt versionierte Defaults von lokalen Overrides. Das ist genau richtig: Defaults dürfen ins Repo, echte Zugangsdaten nicht.
application.properties– versionierte Defaults mit sicheren Platzhalternupcamclient.properties– legacy-kompatible Defaultsapplication.local.properties– lokale echte Werte, nicht versionierenapplication.local.properties.example– Vorlage für lokale Konfiguration
Die lokalen Werte sollten in application.local.properties liegen.
Minimalbeispiel für UPCAM
camera.type=UPCAM
base.url=http://upcam.local
image.daily.root.resource=/sd/${day}
upcam.user.name=admin
upcam.user.pwd=change_me
Minimalbeispiel für REOLINK
camera.type=REOLINK
reolink.host=reolink.local
reolink.httpPort=80
reolink.username=admin
reolink.password=change_me
reolink.snapshotPath=/cgi-bin/api.cgi?cmd=Snap&channel=0&rs={timestamp}
SnapShotter-Konfiguration
SnapShotter wird im Node-Projekt konfiguriert. Die zentrale Datei ist typischerweise:
SnapShotter/src/config.js
Besonders wichtig sind diese Bereiche:
imageFilter.nativeSignal.*imageFilter.delta.*imageFilter.brightnessGuard.*imageFilter.event.*runtime.*whatsapp.*logging.*
Mein Tipp
Erst Kamera-Ingest sauber testen. Dann SnapShotter ohne Windows-Service manuell starten. Erst wenn beide Teile einzeln funktionieren, lohnt sich der Dauerbetrieb als Service. Sonst debuggt man drei Ebenen gleichzeitig – und das ist ungefähr so spaßig wie Druckertreiber im Jahr 2003.
Betrieb, Logging & Health-Dateien
Ein gutes Überwachungssetup braucht nicht nur Bilder, sondern auch Betriebsdaten. SnapShotter schreibt deshalb Laufzeitinformationen in lokale Dateien.
Wichtige Runtime-Dateien
- Health:
./.state/runtime-health.json - Entscheidungen:
./.state/decisions.ndjson - Benachrichtigungen:
./.state/notifications.ndjson - Logs:
./logs/
Das ist im Betrieb enorm hilfreich. Wenn keine Bilder mehr ankommen, willst du nicht raten müssen, ob die Kamera spinnt, WhatsApp abgemeldet ist, ein Filter zu streng greift oder der Prozess hängt.
Was du im Betrieb regelmäßig prüfen solltest
- Läuft der Java-Ingest noch?
- Werden neue Bilder in
images/receivedgeschrieben? - Verschiebt SnapShotter Dateien nach
sentoderfiltered? - Ist die WhatsApp-Web-Session noch gültig?
- Wachsen Logs oder State-Dateien kontrolliert?
- Greifen Filter zu hart oder zu weich?
Ordner, die nicht ins Repository gehören
Runtime-Daten, Sessions und echte Bilder gehören nicht in Git.
application.local.propertiesimages/logs/.state/.lock/dataset/sent/SnapShotter/.wwebjs_auth/
Als Windows-Service betreiben
Für den Dauerbetrieb ist ein Windows-Service deutlich stabiler als zwei offene Konsolenfenster. Die Grundidee:
- upcam-client läuft als Java-Service und holt Bilder ab.
- SnapShotter läuft als Node-Service und verarbeitet/verschickt Bilder.
Dafür eignet sich NSSM sehr gut. NSSM macht aus normalen Programmen wie javaw.exe oder node.exe echte Windows-Dienste.
Die konkrete Schritt-für-Schritt-Anleitung findest du hier:
Marken-, Hersteller- & Drittanbieterhinweis
Unabhängiges Open-Source-Projekt
Dieses Projekt ist ein unabhängiges Open-Source-Setup und steht in keiner geschäftlichen, organisatorischen oder technischen Verbindung zu den genannten Herstellern, Plattformen oder Markeninhabern.
Insbesondere besteht keine Verbindung, Partnerschaft, Zertifizierung, Empfehlung oder Unterstützung durch WhatsApp, Meta, Reolink, UpCam oder andere im Artikel genannte Anbieter. Alle Produkt-, Marken- und Firmennamen werden ausschließlich beschreibend verwendet, um Kompatibilität, technische Schnittstellen oder den praktischen Einsatzzweck zu erklären.
Der Betrieb, die Konfiguration, die rechtliche Bewertung und die Nutzung im eigenen Umfeld liegen vollständig beim jeweiligen Betreiber.
Sicherheit, Datenschutz & rechtliche Hinweise
Keine Rechtsberatung
Die folgenden Hinweise sind eine technische und praktische Orientierung. Sie ersetzen keine individuelle Rechtsberatung. Gerade bei Kameras, Personenbezug und öffentlichem Raum solltest du im Zweifel fachlichen Rat einholen.
1. Kamera nicht auf öffentlichen Raum richten
Richte deine Kamera so aus, dass möglichst nur dein eigener Bereich erfasst wird. Gehwege, Straßen, Nachbargrundstücke oder gemeinschaftliche Flächen sind heikel. Technisch geht vieles – erlaubt ist deshalb noch lange nicht alles.
2. Empfänger müssen Bescheid wissen
Wenn Bilder automatisch in eine WhatsApp-Gruppe geschickt werden, sollten alle Beteiligten wissen, was dort landet, warum es dort landet und wer Zugriff darauf hat.
3. Speicherung begrenzen
Nur weil Bilder lokal gespeichert werden können, müssen sie nicht ewig gespeichert werden. Lege dir eine sinnvolle Aufbewahrungslogik zurecht. Gerade Filterordner können sonst unbemerkt wachsen.
4. Zugangsdaten schützen
Kamera-Passwörter, lokale IPs, WhatsApp-Sessions und Runtime-Dateien gehören nicht ins Repository. Nutze lokale Konfigurationsdateien, restriktive Dateirechte und sichere Backups.
5. WhatsApp nicht als Spam-Kanal nutzen
Dieses Setup ist für Benachrichtigungen im privaten oder internen Umfeld gedacht. Es ist nicht dafür gedacht, automatisiert Massennachrichten zu verschicken.
Praktischer Grundsatz
Je sensibler der Ort, desto strenger solltest du konfigurieren: enger Bildausschnitt, kurze Speicherung, wenige Empfänger, klare Dokumentation.
Fazit
upcam-client & SnapShotter sind zusammen ein schönes Beispiel dafür, wie man aus einer normalen IP-Kamera eine deutlich intelligentere lokale Automatisierung bauen kann.
Der eigentliche Mehrwert liegt nicht nur darin, Bilder an WhatsApp zu schicken. Der Mehrwert liegt in der Pipeline: Kamera-Ingest, lokale Speicherung, Filterentscheidung, saubere Ordnerstruktur, Health-Dateien, Logs und ein betreibbares Service-Konzept.
Für Bastler, Smart-Home-Nerds und kleine interne Setups ist das ziemlich charmant: keine zusätzliche Kamera-Cloud nötig, volle Kontrolle über Dateien und Konfiguration, aber trotzdem schnelle Benachrichtigung auf dem Handy.
Kurz gesagt: Nicht jedes Bild muss nerven. Nur die wichtigen.
Ressourcen & Links
- upcam-client auf GitHub
- SnapShotter auf GitHub
- whatsapp-web.js – Dokumentation
- NSSM – Non-Sucking Service Manager
- SnapShotter & upcam-client als Windows-Service einrichten
- Windows Services einrichten mit NSSM
Hinweis: Die Projekte sind öffentlich auf GitHub verfügbar. Beachte die jeweilige Lizenzdatei, Third-Party-Hinweise und die Verantwortung für dein eigenes Kamera-, Datenschutz- und Betriebssetup. Die genannten Marken und Produktnamen gehören den jeweiligen Rechteinhabern; dieses Projekt ist nicht mit WhatsApp, Meta, Reolink, UpCam oder anderen genannten Anbietern verbunden.




