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.

Aktualisiert: Juli 2026 · Praxis-Setup mit Node.js, Reolink/UpCam, Telegram Bot API und ntfy
Inhalt
- Kurzfassung: Was ist Zeus Herald?
- Warum ein Nachfolger? Vorteile gegenüber upcam-client & SnapShotter
- Architektur: Zwei Prozesse, ein klarer Flow
- Telegram und ntfy statt WhatsApp Web
- Installation & erster Start
- Telegram einrichten
- ntfy einrichten
- Kamera konfigurieren (Reolink & UpCam)
- Bewegungserkennung und Filter
- Dauerbetrieb, Health und Cleanup
- Als Windows-Service mit NSSM
- Migration von den alten Projekten
- Sicherheit, Datenschutz & Hinweise
- Fazit
- 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.
.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:
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.
Überwacht den Eingangsordner, bewertet die Frames (optional pixelbasiert mit ROI), verschiebt sie nach filtered/sent und schickt akzeptierte Bilder an den Notifier-Hub.
Kamera →
npm run ingest → images/received/ → npm run motion → JPEG dekodieren, skalieren, zuschneiden, ROI, Pixelvergleich → images/filtered/ oder images/sent/ → Notifier Hub → Telegram und/oder ntfyDie 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
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
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
- Bei Telegram den @BotFather öffnen und einen neuen Bot anlegen.
- Den Bot-Token notieren.
- Den Bot in einen privaten Chat oder eine private Gruppe einladen (bei Gruppen: Bot als Mitglied hinzufügen und ggf. eine Nachricht schreiben).
- Die Chat-ID ermitteln.
TELEGRAM_ENABLED=true TELEGRAM_BOT_TOKEN=123456789:AA...dein_token... TELEGRAM_CHAT_ID=-1001234567890
Die Chat-ID findest du am einfachsten so:
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.
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:
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
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
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:
- JPEG dekodieren
- auf Arbeitsbreite skalieren
- optional oberen Bildrand abschneiden
- ROI-Polygone anwenden
- Grauwert-Pixel mit dem vorherigen Frame vergleichen
- Bestätigungsframes, Cooldown und maximale Sendungen pro Ereignis anwenden
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:
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
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
sentoderfiltered? - 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
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:
- Zeus Herald parallel installieren und
.envbefüllen. - Kamera mit
npm run ingest:oncetesten. - Versand mit
npm run notify:latestprüfen. - Motion einmalig und dann dauerhaft laufen lassen.
- 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.
- Kameraausrichtung: möglichst nur den eigenen Bereich erfassen.
- Empfänger informieren: Wer Bilder in einer Telegram-Gruppe oder über ntfy bekommt, sollte wissen, was dort ankommt.
- Speicherung begrenzen: Cleanup-Zeiten bewusst setzen; Filter- und Sent-Ordner wachsen sonst unbemerkt.
- Secrets schützen:
.envnie committen, nie in öffentliche Cloud-Ordner legen, restriktive Dateirechte nutzen. - ntfy absichern: öffentliches Topic nur mit langem, geheimem Namen – besser privater Server mit Token.
- ZIP-Deployments: enthalten standardmäßig die lokale
.envund 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
- zeus-herald auf GitHub
- Konfigurationsdokumentation
- Betriebsdokumentation
- Migrationsleitfaden
- upcam-client (Legacy)
- SnapShotter (Legacy)
- Telegram Bot API
- ntfy Dokumentation
- NSSM – Non-Sucking Service Manager
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
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.



tiny-tool.de
tiny-tool.de