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.

Symbolbild für digitale Bildüberwachung mit Kamera, Automatisierung und lokaler Verarbeitung


Image licensed by Ingram Image/adpic

Aktualisiert: Mai 2026 · Praxis-Setup mit Java, Node.js, lokaler Bildverarbeitung und WhatsApp-Web-Integration


Inhalt

  1. Kurzfassung: Was macht dieses Setup?
  2. Architektur: Zwei Projekte, ein Workflow
  3. upcam-client: Kamera-Bilder lokal abholen
  4. SnapShotter: Bewegung bewerten & Bilder versenden
  5. Der komplette Ablauf in der Praxis
  6. Installation & Repository-Setup
  7. Konfiguration: Kamera, Ordner, Filter, WhatsApp
  8. Betrieb, Logging & Health-Dateien
  9. Als Windows-Service betreiben
  10. Marken-, Hersteller- & Drittanbieterhinweis
  11. Sicherheit, Datenschutz & rechtliche Hinweise
  12. Fazit
  13. 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:

upcam-clientJava-basierter Kamera-Ingest. Der Client verbindet sich mit der Kamera, lädt Snapshots herunter und schreibt Bilddateien lokal in ein Eingangsverzeichnis.

SnapShotterNode.js-basierte Runtime. SnapShotter verarbeitet die eingehenden Bilder, bewertet Bewegung, schreibt Laufzeitdaten und verschickt akzeptierte Bilder an WhatsApp.

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:

  1. Kamera liefert Snapshot oder Bildquelle.
  2. Java-Ingest speichert Frames lokal.
  3. SnapShotter bewertet die Frames.
  4. Relevante Bilder gehen an WhatsApp.
  5. Verworfene Bilder landen getrennt in einem Filter-Ordner.
  6. Health-, Decision- und Notification-Dateien helfen beim Betrieb.
Architektur-Prinzip: Ein Prozess holt Bilder ab. Ein zweiter Prozess bewertet und verschickt. Das macht Debugging, Neustart-Verhalten und späteren Windows-Service-Betrieb deutlich sauberer.

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

  • UPCAM
  • REOLINK

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 --once ausfü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

  1. Neue Bilddateien landen im Eingangsordner, z. B. ./images/received/.
  2. SnapShotter bewertet Bewegung, Helligkeit und Ereignislogik.
  3. Akzeptierte Bilder werden an WhatsApp gesendet.
  4. Gesendete Bilder landen z. B. in ./images/sent/.
  5. Verworfene Bilder landen z. B. in ./images/filtered/.
  6. 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

Der typische Flow:
Kamera → upcam-client → lokaler Bildordner → SnapShotter → Filterentscheidung → WhatsApp → Archiv / Filterordner

In der Praxis sieht das so aus:

  1. Die Kamera stellt ein aktuelles Bild bereit.
  2. upcam-client ruft dieses Bild ab und speichert es lokal.
  3. SnapShotter erkennt den neuen Frame.
  4. Die Filterlogik prüft, ob wirklich Bewegung oder ein relevantes Ereignis vorliegt.
  5. Nur akzeptierte Bilder werden verschickt.
  6. Die Entscheidung wird protokolliert.
  7. 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

Terminal · Repository klonen   
git clone --recurse-submodules https://github.com/gzeuner/upcam-client.git
cd upcam-client

Falls du das Repository bereits ohne Submodule geklont hast:

Terminal · Submodule nachladen   
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.

Linux/macOS · Setup   
./setup.sh
Windows · Setup   
setup.bat

Danach kann der Java-Part über die vorbereiteten Starter aufgerufen werden.

Windows · upcam-client starten   
%USERPROFILE%\upcam\upcamclient.cmd
Linux · upcam-client starten   
~/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.

Terminal · Single ingest cycle   
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 Platzhaltern
  • upcamclient.properties – legacy-kompatible Defaults
  • application.local.properties – lokale echte Werte, nicht versionieren
  • application.local.properties.example – Vorlage für lokale Konfiguration

Die lokalen Werte sollten in application.local.properties liegen.

Minimalbeispiel für UPCAM

application.local.properties · 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

application.local.properties · 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/received geschrieben?
  • Verschiebt SnapShotter Dateien nach sent oder filtered?
  • 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.properties
  • images/
  • 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.

Wichtiges Prinzip: Nicht beide Prozesse in eine Sammel-Batchdatei packen. Besser: ein Prozess = ein Windows-Service.

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

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.

Transparenzhinweis


🔎
Transparenzhinweis:
Die Inhalte auf tiny-tool.de werden sorgfältig recherchiert, redaktionell geprüft und regelmäßig aktualisiert. Quellen und Zitate werden nachvollziehbar angegeben. Dennoch übernehmen wir keine Garantie für Richtigkeit, Vollständigkeit oder Aktualität der bereitgestellten Informationen. Irrtümer sind nicht ausgeschlossen.

Urheber & redaktionelle Unterstützung: Texte auf tiny-tool.de sind geistige Werke der Redaktion (Endredaktion: Guido Zeuner). Digitale Werkzeuge – darunter auch KI-basierte Hilfsmittel – kommen lediglich als Assistenzsysteme bei Recherche, Struktur oder Sprachoptimierung zum Einsatz. Auswahl der Inhalte, Struktur, Argumentation und finale Textfassung stammen von uns als natürlichen Personen; KI-Systeme sind keine Urheber.

Reichweitenmessung (VG Wort / METIS): Zur Ermittlung der Textreichweite werden Zählmarken der VG Wort eingesetzt. Aus technischen Gründen werden diese beim Aufruf der Seite geladen und können derzeit nicht über das Cookie-Banner blockiert werden, da keine Cookies gesetzt werden. Die Messung dient ausschließlich der Reichweitenstatistik; personenbezogene Profile werden nicht erstellt. Mehr dazu in unseren Datenschutzhinweisen.

Bitte beachte: Die Inhalte dienen ausschließlich der allgemeinen Information und stellen keine fachliche Beratung (z. B. rechtlicher, steuerlicher oder finanzieller Art) dar. Die Nutzung der Inhalte erfolgt auf eigene Verantwortung. Eine Haftung für Schäden materieller oder immaterieller Art ist ausgeschlossen, sofern kein vorsätzliches oder grob fahrlässiges Verschulden vorliegt.

Werbung & Affiliate-Links: Einige Beiträge enthalten werbliche Hinweise oder sogenannte Affiliate-Links. Diese sind entsprechend gekennzeichnet. Beim Klick entstehen dir keine zusätzlichen Kosten – wir erhalten ggf. eine kleine Provision.

Markenrechtlicher Hinweis: Alle Markennamen, Logos und Produktbezeichnungen sind Eigentum der jeweiligen Rechteinhaber und werden nur zur identifizierenden Beschreibung verwendet. Es besteht keinerlei Verbindung zu den genannten Unternehmen.

Externe Links: Diese Website enthält Verweise auf externe Websites Dritter. Trotz sorgfältiger Prüfung übernehmen wir keine Verantwortung für deren Inhalte. Bei Bekanntwerden rechtswidriger Inhalte entfernen wir entsprechende Links umgehend.