Tools · Automation · Bildüberwachung

Zeus Herald: Zuverlässige Kamera-Benachrichtigungen mit Telegram und ntfy

Der schlanke Nachfolger von upcam-client und SnapShotter: Snapshots lokal abholen, Bewegung erkennen und relevante Bilder über offizielle APIs ans Handy schicken – ohne WhatsApp Web, ohne Chromium, ohne Java.

Zeus Herald Hero-Bild: Überwachungskamera, modernes Haus bei Nacht und Smartphone mit Bewegungsmeldung über Telegram und ntfy

Aktualisiert: Juli 2026 · Praxis-Setup mit Node.js, Reolink/UpCam, Telegram Bot API und ntfy


Inhalt

  1. Kurzfassung: Was ist Zeus Herald?
  2. Warum ein Nachfolger? Vorteile gegenüber upcam-client & SnapShotter
  3. Architektur: Zwei Prozesse, ein klarer Flow
  4. Telegram und ntfy statt WhatsApp Web
  5. Installation & erster Start
  6. Telegram einrichten
  7. ntfy einrichten
  8. Kamera konfigurieren (Reolink & UpCam)
  9. Bewegungserkennung und Filter
  10. Dauerbetrieb, Health und Cleanup
  11. Als Windows-Service mit NSSM
  12. Migration von den alten Projekten
  13. Sicherheit, Datenschutz & Hinweise
  14. Fazit
  15. Ressourcen & Links

Kurzfassung: Was ist Zeus Herald?

Zeus Herald ist ein lokal laufender Node.js-Dienst, der Snapshots von IP-Kameras abholt, Bewegungen erkennt und nur relevante Ereignisbilder an dein Handy schickt – über Telegram, ntfy oder beides.

Der Kern in einem Satz

zeus-herald ersetzt die alte Zwei-Projekt-Pipeline aus Java-Ingest und WhatsApp-Web-Automation durch einen schlanken, wartbaren Node.js-Flow mit offiziellen APIs.

Die eigentliche Auswertung bleibt lokal. Du brauchst keine Kamera-Cloud, die jede Bewegung erst irgendwohin schickt. Gleichzeitig entfällt die fragilste Stelle des alten Setups: die Browser-Automation um WhatsApp Web.

Was sich grundsätzlich ändert

WhatsApp Web und Chromium sind raus. An ihre Stelle treten Telegram Bot API und/oder ntfy. Das ist stabiler, ressourcenschonender und deutlich einfacher zu betreiben – besonders als Dauerläufer auf einem Mini-PC oder einem Windows-Rechner im Keller.

Warum ein Nachfolger? Vorteile gegenüber upcam-client & SnapShotter

Die alte Kombination aus upcam-client (Java) und SnapShotter (Node.js + whatsapp-web.js) hat lange gut funktioniert. Mit der Zeit sind aber genau die Punkte nervig geworden, die bei einem unattended Setup am meisten stören:

  • WhatsApp-Web-Sessions laufen ab oder brauchen erneutes Scannen.
  • Chromium frisst RAM und macht den Prozess schwerer zu überwachen.
  • Zwei Runtime-Welten (Java + Node) bedeuten doppelte Wartung, doppelte Service-Konfiguration und mehr Stellen, an denen etwas hängen kann.
  • Die Filterlogik in SnapShotter war mächtig, aber auch komplex zu tunen.
Zeus Herald räumt auf: Ein Repository, eine Sprache, offizielle APIs, klar getrennte Prozesse und eine Konfiguration, die in einer einzigen .env-Datei steckt.

Die wichtigsten Vorteile auf einen Blick

Thema upcam-client + SnapShotter Zeus Herald
Stack Java 21+ und Node.js 20+ Nur Node.js 20+
Benachrichtigung WhatsApp Web (Browser-Automation) Telegram Bot API und/oder ntfy
Ressourcen Chromium-Prozess im Hintergrund Leichtgewichtig, kein Browser
Kamera-Trigger Hauptsächlich periodische Snapshots Reolink-Motion-State + optionale Pixelanalyse
Konfiguration Properties + config.js Eine .env-Datei
Prozess-Modell Zwei getrennte Projekte / Submodule Ein Repo, zwei klare npm-Skripte
Deployment Manuell / Setup-Skripte Optional ZIP ohne node_modules
Wartung Legacy / Maintenance-only Aktive Weiterentwicklung

Der eigentliche Gewinn ist weniger „mehr Features“, sondern weniger Reibung im Alltag: weniger abgelaufene Sessions, weniger RAM, weniger Stellen, an denen man raten muss, warum gerade nichts ankommt.

Architektur: Zwei Prozesse, ein klarer Flow

Zeus Herald trennt bewusst zwei Aufgaben:

ingest
Holt Snapshots von der Kamera und legt sie lokal ab. Bei Reolink kann zusätzlich der Motion-State der Kamera abgefragt werden – dann werden nur bei Alarm Burst-Aufnahmen gespeichert.
motion
Überwacht den Eingangsordner, bewertet die Frames (optional pixelbasiert mit ROI), verschiebt sie nach filtered/sent und schickt akzeptierte Bilder an den Notifier-Hub.
Typischer Ablauf:
Kamera → npm run ingestimages/received/npm run motion → JPEG dekodieren, skalieren, zuschneiden, ROI, Pixelvergleich → images/filtered/ oder images/sent/ → Notifier Hub → Telegram und/oder ntfy

Die Bewegungserkennung entscheidet einmal pro Frame. Alle aktivierten Notifier bekommen danach dasselbe komprimierte Bild. Das spart doppelte Bildverarbeitung und hält die Logik übersichtlich.

Praxis-Tipp

Ingest und Motion laufen als getrennte Prozesse – und das ist Absicht. So kannst du den einen neu starten, ohne den anderen mitzureißen, und du siehst in Logs und Health-Datei klar, welcher Teil gerade hängt.

Telegram und ntfy statt WhatsApp Web

Der größte operative Unterschied zum Vorgänger: Es gibt keine WhatsApp-Web-Session mehr. Stattdessen nutzt Zeus Herald zwei etablierte, dokumentierte Kanäle.

Telegram Bot API

  • Offizielle Bot-API von Telegram
  • Bilder gehen als Foto an einen privaten Chat oder eine Gruppe
  • Mehrere Empfänger über eine private Gruppe möglich
  • Chat-ID lässt sich mit einem Hilfsbefehl ermitteln

ntfy

  • HTTP-basiertes Push-System (ntfy.sh oder selbst gehostet)
  • Bilder werden per PUT an ein Topic geschickt
  • Sehr leichtgewichtig und gut für self-hosted Setups
  • Mit Token und privatem Server deutlich sicherer als ein öffentliches Topic

Beide Kanäle gleichzeitig

Du kannst Telegram und ntfy parallel aktivieren. Der Notifier-Hub komprimiert das Bild einmal und schickt es an alle aktiven Ziele. Das ist praktisch, wenn du z. B. Telegram privat nutzt und ntfy zusätzlich auf einem Tablet oder einem zweiten Gerät laufen lässt.

Installation & erster Start

Voraussetzungen

  • Node.js 20+
  • eine per HTTP erreichbare Kamera mit Snapshot-Endpunkt (Reolink empfohlen, UpCam optional)
  • optional: Telegram-Bot und/oder ntfy-Topic

Repository klonen und vorbereiten

Terminal · Installation
git clone https://github.com/gzeuner/zeus-herald.git
cd zeus-herald
npm install
cp .env.example .env

Danach die lokale .env mit echten Werten füllen – und diese Datei niemals committen oder teilen.

Erste Funktionstests

Terminal · Checks & Tests
npm run lint
npm test
npm run check:banned

npm run ingest:once
npm run notify:latest
npm run motion:once

Mein Tipp

Erst Ingest allein testen, dann einen manuellen Versand mit notify:latest, dann Motion. Wenn alle drei Schritte einzeln laufen, ist der Dauerbetrieb fast schon Formsache.

Telegram einrichten

  1. Bei Telegram den @BotFather öffnen und einen neuen Bot anlegen.
  2. Den Bot-Token notieren.
  3. Den Bot in einen privaten Chat oder eine private Gruppe einladen (bei Gruppen: Bot als Mitglied hinzufügen und ggf. eine Nachricht schreiben).
  4. Die Chat-ID ermitteln.
.env · Telegram
TELEGRAM_ENABLED=true
TELEGRAM_BOT_TOKEN=123456789:AA...dein_token...
TELEGRAM_CHAT_ID=-1001234567890

Die Chat-ID findest du am einfachsten so:

Terminal · Chat-ID ermitteln
npm run telegram:chat-id

Der Befehl liest die Updates des Bots und zeigt sichtbare Chats an. Für private Gruppen ist die ID meist negativ und beginnt mit -100.

Wichtig bei Gruppen

Der Bot muss Mitglied der Gruppe sein und darf Nachrichten senden. Wenn nichts ankommt, prüfe zuerst Token, Chat-ID und ob der Bot in der Gruppe überhaupt sichtbar ist – nicht die Motion-Logik.

ntfy einrichten

ntfy ist bewusst simpel: Du legst ein Topic an und schickst Bilder per HTTP PUT dorthin. Auf dem Handy installierst du die ntfy-App und abonnierst dasselbe Topic.

.env · ntfy
NTFY_ENABLED=true
NTFY_URL=https://ntfy.sh/dein-langes-privates-topic
# Optional, empfohlen bei eigenem Server:
# NTFY_TOKEN=tk_...

Sicherheitshinweis zu ntfy.sh

Ein öffentliches Topic auf ntfy.sh ist im Grunde ein geteiltes Geheimnis. Wer die URL kennt, kann mitlesen. Für sensible Kamerabilder besser einen eigenen ntfy-Server betreiben und mit Token absichern – oder ein sehr langes, nicht erratbares Topic verwenden und die URL streng privat halten.

Danach kannst du den Versand unabhängig von der Kamera testen:

Terminal · Testversand
npm run notify:latest

Kamera konfigurieren (Reolink & UpCam)

Reolink ist der primäre und am besten unterstützte Weg. UpCam bleibt optional möglich.

Minimalbeispiel Reolink

.env · Reolink
CAMERA_TYPE=reolink
CAMERA_ID=front
INGEST_MODE=files_only
INGEST_TARGET_DIR=images/received
INGEST_INTERVAL_MS=3000

REOLINK_HOST=192.168.1.50
REOLINK_HTTP_PORT=80
REOLINK_USER=admin
REOLINK_PASSWORD="dein_passwort"
REOLINK_CHANNEL=0
REOLINK_SNAPSHOT_PATH=/cgi-bin/api.cgi?cmd=Snap&channel={channel}&rs={timestamp}&user={usernameEncoded}&password={passwordEncoded}

REOLINK_BURST_ENABLED=true
REOLINK_BURST_COUNT=2
REOLINK_BURST_INTERVAL_MS=350
REOLINK_BURST_REQUIRE_SIGNAL=true

Mit REOLINK_BURST_REQUIRE_SIGNAL=true speichert der Ingest nur dann mehrere Frames, wenn die Kamera selbst Bewegung meldet. Das spart Speicher und reduziert sinnlose Auswertung.

Optional: UpCam

.env · UpCam
CAMERA_TYPE=upcam
UPCAM_SNAPSHOT_URL=http://upcam.local/snapshot.jpg
# oder Host + Basic Auth:
# UPCAM_HOST=upcam.local
# UPCAM_USER=admin
# UPCAM_PASSWORD=change_me

Keine echten Zugangsdaten ins Repository

Passwörter, Tokens, Chat-IDs und echte Kamera-IPs gehören ausschließlich in die lokale .env. Die Beispielwerte im Repo sind Platzhalter.

Bewegungserkennung und Filter

Die Motion-Stufe ist bewusst pragmatischer als das alte SnapShotter-Zonenmodell. Der Ablauf:

  1. JPEG dekodieren
  2. auf Arbeitsbreite skalieren
  3. optional oberen Bildrand abschneiden
  4. ROI-Polygone anwenden
  5. Grauwert-Pixel mit dem vorherigen Frame vergleichen
  6. Bestätigungsframes, Cooldown und maximale Sendungen pro Ereignis anwenden
.env · Motion (Startwerte)
MOTION_RECEIVED_DIR=images/received
MOTION_FILTERED_DIR=images/filtered
MOTION_SENT_DIR=images/sent
MOTION_POLL_MS=250
MOTION_NOTIFY=true

MOTION_IMAGE_DECODE_ENABLED=true
MOTION_RESIZE_WIDTH=512
MOTION_CROP_TOP_PX=24
MOTION_PIXEL_DIFF_THRESHOLD=12
MOTION_SCORE_THRESHOLD=0.012
MOTION_CONFIRM_COUNT=1
MOTION_COOLDOWN_MS=1000
MOTION_MAX_SENDS=20

ROI-Polygone kannst du als JSON hinterlegen, wenn nur bestimmte Bildbereiche relevant sind (Einfahrt, Terrasse, Briefkasten). Der Rest des Bildes wird dann bei der Auswertung ignoriert.

Tunen ohne Drama

Starte mit den empfohlenen Reolink-Werten. Wenn zu viele Meldungen kommen, Score-Schwellwert leicht erhöhen oder ROI enger ziehen. Wenn zu wenig kommt, Score senken oder Burst-Anforderung lockern. Ändere nicht alles auf einmal.

Dauerbetrieb, Health und Cleanup

Im Alltag laufen zwei Prozesse dauerhaft:

Terminal · Dauerbetrieb
npm run ingest
npm run motion

Was im Betrieb hilft

  • Health-Datei: standardmäßig unter state/health.json
  • Decision-Log: optional über DECISION_LOG=1
  • Prozess-Locks: unter .lock/, verhindern doppelte Instanzen
  • Cleanup: alte Bilder und Logs werden automatisch aufgeräumt
.env · Cleanup (Defaults)
CLEANUP_ENABLED=true
CLEANUP_INTERVAL_MS=300000
CLEANUP_IMAGES_MAX_AGE_HOURS=36
CLEANUP_LOGS_MAX_AGE_HOURS=48

Was du regelmäßig prüfen solltest

  • Läuft Ingest noch und kommen neue Dateien in images/received?
  • Verschiebt Motion Dateien nach sent oder filtered?
  • Sind Telegram- und/oder ntfy-Zustellung in der Health-Datei okay?
  • Wachsen Logs und Bildordner kontrolliert?

Als Windows-Service mit NSSM

Für den Dauerbetrieb auf Windows eignet sich NSSM hervorragend. Wichtig: ein Prozess = ein Service.

  • Service 1: zeus-herald-ingest
    Path: …\npm.cmd
    Startup directory: Projektordner
    Arguments: run ingest
  • Service 2: zeus-herald-motion
    Path: …\npm.cmd
    Startup directory: Projektordner
    Arguments: run motion
Prinzip: Nicht beide Tasks in eine Sammel-Batchdatei packen. Getrennte Services lassen sich einzeln neu starten und sind im Windows-Eventlog klarer nachvollziehbar.

Vor dem Umschalten auf Services den Flow manuell so lange testen, bis Ingest, Motion und Notifier stabil laufen. Erst dann die alten Java-/WhatsApp-Dienste abschalten.

Migration von den alten Projekten

Die alte Pipeline bleibt vorerst lauffähig, wird aber nicht mehr aktiv weiterentwickelt. Der empfohlene Weg:

  1. Zeus Herald parallel installieren und .env befüllen.
  2. Kamera mit npm run ingest:once testen.
  3. Versand mit npm run notify:latest prüfen.
  4. Motion einmalig und dann dauerhaft laufen lassen.
  5. Erst wenn der neue Flow stabil ist, die alten Java- und WhatsApp-Prozesse stoppen.
Altes Setup Zeus Herald
camera.type=REOLINK CAMERA_TYPE=reolink
reolink.host / Port / User / Password REOLINK_HOST, REOLINK_HTTP_PORT, REOLINK_USER, REOLINK_PASSWORD
Eingangs-/Sent-Ordner INGEST_TARGET_DIR, MOTION_RECEIVED_DIR, MOTION_SENT_DIR
WhatsApp-Zielchat TELEGRAM_CHAT_ID und/oder NTFY_URL
WhatsApp-Session-Dateien werden nicht übernommen

Keine Session-Übernahme

WhatsApp-Auth-Daten aus SnapShotter gehören nicht in Zeus Herald. Der neue Weg startet bewusst sauber mit Telegram und/oder ntfy.

Sicherheit, Datenschutz & Hinweise

Keine Rechtsberatung

Die folgenden Punkte sind technische und praktische Orientierung. Sie ersetzen keine individuelle Rechtsberatung – besonders bei Kameras mit Personenbezug oder Blick auf öffentliche Flächen.

  1. Kameraausrichtung: möglichst nur den eigenen Bereich erfassen.
  2. Empfänger informieren: Wer Bilder in einer Telegram-Gruppe oder über ntfy bekommt, sollte wissen, was dort ankommt.
  3. Speicherung begrenzen: Cleanup-Zeiten bewusst setzen; Filter- und Sent-Ordner wachsen sonst unbemerkt.
  4. Secrets schützen: .env nie committen, nie in öffentliche Cloud-Ordner legen, restriktive Dateirechte nutzen.
  5. ntfy absichern: öffentliches Topic nur mit langem, geheimem Namen – besser privater Server mit Token.
  6. ZIP-Deployments: enthalten standardmäßig die lokale .env und sind damit private Artefakte.

Praktischer Grundsatz

Je sensibler der Ort, desto enger konfigurieren: ROI, kurze Aufbewahrung, wenige Empfänger, klare Dokumentation.

Fazit

Zeus Herald ist der konsequente nächste Schritt nach upcam-client und SnapShotter: gleiche Idee (lokal auswerten, nur relevante Bilder schicken), aber mit deutlich weniger operativem Ballast.

Ein Repository statt zwei, Node.js statt Java-plus-Node, Telegram und ntfy statt WhatsApp-Web-Automation. Dazu Reolink-Motion-State, optionale Pixelanalyse, Prozess-Locks, Health-Datei und automatisches Cleanup.

Für Bastler, Smart-Home-Setups und kleine interne Überwachungen ist das genau der Trade-off, der im Alltag zählt: weniger Sessions, die ablaufen – und mehr Zeit, in der das System einfach läuft.

Kurz gesagt: Nicht jedes Bild muss nerven. Nur die wichtigen. Und die sollen zuverlässig ankommen.

Ressourcen & Links

Hinweis: Die Projekte sind öffentlich auf GitHub verfügbar. Beachte die jeweilige Lizenzdatei 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 Telegram, ntfy, Reolink, UpCam, WhatsApp oder Meta verbunden.

Transparenzhinweis


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

Redaktion und Einsatz von KI: Bei der Erstellung von Inhalten können digitale Werkzeuge – darunter auch KI-basierte Assistenzsysteme – unterstützend eingesetzt werden, etwa bei Recherche, Strukturierung, sprachlicher Überarbeitung, Übersetzung, Codeanalyse oder visueller Gestaltung. Veröffentlichte Inhalte werden redaktionell geprüft, bearbeitet und von Guido Zeuner freigegeben. Auswahl, Einordnung und Veröffentlichung liegen beim Menschen. KI-Ausgaben gelten nicht als eigenständige Quellen. KI-Systeme sind keine verantwortlichen Autoren oder Redakteure. Weitere Informationen zu Texten, Bildern, Videos und digitalen Personas findest du auf unserer Seite Transparenz beim Einsatz von Künstlicher Intelligenz.

Reichweitenmessung (VG WORT / METIS): Zur Ermittlung der Reichweite einzelner Texte können Zählmarken der VG WORT eingesetzt werden. Im Rahmen der METIS-Zugriffszählung kann eine Client-ID gebildet und ein sogenanntes „METIS Session Cookie“ gesetzt werden. Die Messung dient der statistischen Ermittlung von Textzugriffen und als Grundlage für mögliche Ausschüttungen der VG WORT. Nach Angaben der VG WORT werden dabei keine personenbezogenen Nutzungsprofile erstellt; die Messung dient nicht der Werbung oder dem Marketing-Tracking. Weitere Informationen findest du in unseren Datenschutzhinweisen.

Bitte beachte: Die Inhalte dienen ausschließlich der allgemeinen Information und stellen keine fachliche Beratung dar, insbesondere keine rechtliche, steuerliche, medizinische, technische oder finanzielle Beratung. Die Nutzung der Inhalte erfolgt auf eigene Verantwortung.

Werbung und Affiliate-Links: Einige Beiträge können werbliche Hinweise oder sogenannte Affiliate-Links enthalten. Diese werden entsprechend gekennzeichnet. Beim Klick entstehen dir keine zusätzlichen Kosten; wir erhalten gegebenenfalls eine kleine Provision.

Markenrechtlicher Hinweis: Alle Markennamen, Logos und Produktbezeichnungen sind Eigentum der jeweiligen Rechteinhaber und werden ausschließlich zur Identifikation und Beschreibung verwendet. Eine Verbindung zu den genannten Unternehmen besteht nur, wenn dies ausdrücklich angegeben wird.

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 werden entsprechende Links geprüft und gegebenenfalls entfernt.