
Bosch Smart Home Kamera per Python CLI Tool
Die Bosch Smart Home Kameras sind technisch gut ausgestattet — aber eine offizielle Programmierschnittstelle gibt es nicht. Wer die Kameras automatisieren, in Skripte einbinden oder einfach vom Terminal aus steuern möchte, findet hier ein Python CLI Tool, das die gleiche reverse-engineerte Cloud-API nutzt wie die Home Assistant Integration. Kein App-Zwang nach dem ersten Setup, kein Smart Home Controller notwendig — nur ein normaler Bosch-Cloud-Account, eine Handvoll Python-Befehle und wahlweise ffplay oder VLC.
Das Protokoll ist auf vier Plattformen portiert: dieses Python CLI Tool für die Kommandozeile, eine Home Assistant Custom Integration mit Lovelace Card, ein ioBroker-Adapter, und ein MCP-Server für Claude Code und andere KI-Assistenten. Alle vier sind Open Source auf GitHub.
Was kann das CLI-Tool?
Das Tool deckt den kompletten Funktionsumfang der Bosch Smart Camera App ab — und in einigen Bereichen deutlich mehr. Snapshots, Live-Stream (cloud und lokal per LAN), Privacy-Modus, Kameralicht, Pan-Steuerung, Gegensprechen, Sirene, Echtzeit-Events, Signal-Alerts, Kamera-Sharing, Bewegungszonen, Automatisierungsregeln und Low-Level-Protokollzugriff über das interne RCP-Protokoll: alles per Kommandozeile, alles skriptbar.
Nach dem einmaligen OAuth2-Login im Browser laufen alle weiteren Aufrufe ohne manuelles Eingreifen — der Refresh-Token wird automatisch erneuert. Wer mit Home Assistant oder ioBroker arbeitet, kann das CLI zusätzlich als Diagnose- und Research-Werkzeug einsetzen.
Unterstützte Kameramodelle
Unterstützt werden alle vier aktuellen Bosch Smart Home Kameras. Modellspezifische Eigenheiten — Heartbeat-Frequenz, Streaming-Parameter, unterstützte Befehle — erkennt das Tool automatisch.
| Kamera | Generation | Typ | Besonderheiten |
|---|---|---|---|
| 360° Innenkamera | Gen1 | Indoor | Pan-/Tilt-Motor, Auto-Follow, IR-Nachtsicht, mechanische Privacy-Blende, Sirene |
| Eyes Innenkamera II | Gen2 | Indoor | 75-dB-Sirene, Audio+ (Glasbruch / Rauch / CO), Bewegungszonen mit KI, RGB-LEDs, einziehbarer Kamerakopf |
| Eyes Außenkamera | Gen1 | Outdoor (IP66) | Front-Spotlight, Bewegungslicht, Umgebungslicht-Sensor, Zeitplan-basierte Beleuchtung |
| Eyes Außenkamera II | Gen2 | Outdoor (IP66) | Front- + Top- + Bottom-RGB-LED-Gruppen, DualRadar (Bewegung + Einbruch), Wallwasher-Modus |
Voraussetzungen
Python 3.10 oder neuer ist Pflicht (das Tool nutzt die str | None-Union-Syntax). Für die Live-Stream-Wiedergabe wird ffmpeg benötigt, das auch ffplay mitbringt. VLC ist optional.
pip3 install requests
brew install ffmpeg # macOS — liefert ffplay für Live-Video
Ein aktiver Bosch Smart Home Account (SingleKey ID) ist erforderlich, und die Kameras müssen einmalig über die offizielle Bosch Smart Camera App eingerichtet worden sein. Danach ist die App nicht mehr notwendig.
Quick Start in 3 Schritten
Beim ersten Aufruf ohne Argumente öffnet das Tool automatisch den Browser zur OAuth2-Anmeldung, speichert den Refresh-Token und erkennt alle Kameras im Account.
# Schritt 1: Erstes Setup — Browser-Login + Kamera-Erkennung
python3 bosch_camera.py
# Schritt 2: Snapshot der letzten Bewegung
python3 bosch_camera.py snapshot Outdoor
# Schritt 3: Live-Stream starten
python3 bosch_camera.py live Outdoor
Ohne Argumente startet das Tool das interaktive Menü — nummerierte Einträge für jede Kamera und jeden Befehl, nach Ausführung wieder zurück ins Menü:
╔══════════════════════════════════════════════════════════╗
║ Bosch Smart Home Camera — Control Panel ║
╚══════════════════════════════════════════════════════════╝
1) Camera status (ONLINE / OFFLINE)
2) Camera info (full details + stream URLs)
3) Latest event snapshot — Outdoor
4) Latest event snapshot — Indoor
5) Latest event snapshot — ALL cameras
6) Live snapshot — Outdoor (remote/local)
...
q) Exit
OAuth2-Login und Token-Verwaltung
Die Authentifizierung läuft über den OAuth2 PKCE Flow gegen Boschs SingleKey ID (Keycloak). Das Tool generiert Verifier und Challenge, startet einen lokalen Callback-Server und öffnet den Browser. Nach dem Login landet der Authorization Code im Terminal — der Rest läuft automatisch. Der Refresh-Token wird in bosch_config.json gespeichert; alle weiteren Starts erneuern den Access-Token lautlos im Hintergrund.
Token-Verwaltung bei Bedarf manuell:
python3 bosch_camera.py token # Token-Info + Ablaufzeit anzeigen
python3 bosch_camera.py token fix # stille Erneuerung per Refresh-Token
python3 bosch_camera.py token browser # erzwungener Browser-Login
Alle Befehle im Überblick
Der Kameraname im Befehl entspricht einem Teil des in der Bosch-App vergebenen Namens (Groß-/Kleinschreibung egal). Wird kein Kameraname angegeben, gilt der Befehl für alle Kameras.
| Gruppe | Befehl | Beschreibung |
|---|---|---|
| Info & Status | status | Online-/Offline-Status aller Kameras |
info | Vollständige Details + Stream-URLs | |
info --full | Zusätzlich Firmware, Motion, Audio, Ambient Light, WiFi | |
account | Account-Info, Feature-Flags, Subscription-Status | |
profile | Benutzerprofil anzeigen oder ändern | |
| Snapshots | snapshot [cam] | Letzter bewegungsgetriggerter JPEG-Snapshot |
liveshot [cam] | Aktuelles Live-Bild (~1,5 s) | |
liveshot [cam] --hq | Live-Snapshot in hoher Qualität | |
| Live-Stream | live [cam] | 30fps H.264 + AAC Audio in ffplay |
live [cam] --vlc | Stream in VLC öffnen | |
live [cam] --quality high | Höchste Bitrate (~30 Mbps) | |
live [cam] --quality low | Niedrige Bandbreite (~1,9 Mbps) | |
live --local [cam] | Direktstream per LAN-TLS-Proxy | |
| Kamerasteuerung | privacy [cam] [on|off] | Privacy-Modus abfragen oder setzen |
privacy [cam] on --minutes N | Privacy für N Minuten aktivieren | |
light [cam] [on|off] | Kameralicht steuern | |
notifications [cam] [on|off] | Push-Benachrichtigungen ein-/ausschalten | |
motion [cam] [--enable|--disable] | Bewegungserkennung ein-/ausschalten | |
motion [cam] --sensitivity SUPER_HIGH | Empfindlichkeit setzen (OFF bis SUPER_HIGH) | |
audio-alarm [cam] [--enable|--disable] | Audio-Alarm ein-/ausschalten | |
audio-alarm [cam] --threshold N | Lautstärke-Schwellenwert setzen | |
recording [cam] [--sound-on|--sound-off] | Audio bei Cloud-Aufnahme ein-/ausschalten | |
timestamp [cam] [on|off] | Zeitstempel-Overlay im Video ein-/ausschalten | |
| 360°-Kamera | pan [cam] [left|center|right|<-120..120>] | Kamera schwenken |
pan [cam] --preset home | Benannte Pan-Position anfahren (home, left, right, back-left, back-right) | |
autofollow [cam] [on|off] | Automatische Bewegungsverfolgung | |
siren [cam] | Akustischen Alarm auslösen | |
privacy-sound [cam] [on|off] | Hörbares Privacy-Indikator-Signal | |
| Intercom | intercom [cam] | 60 s Kamera-Audio abhören (Gegensprechen) |
intercom [cam] --duration N | Dauer in Sekunden festlegen | |
intercom [cam] --speaker-level N | Lautstärke des Kameralautsprechers | |
| Events & Download | watch [cam] | Echtzeit-Event-Polling (alle 30 s) |
watch --push | Echtzeit via FCM Push (~2 s Latenz) | |
watch --snapshot | JPEG automatisch herunterladen bei Event | |
watch --webhook URL | HTTP-POST bei jedem Event an externe URL (n8n, Node-RED, eigener Service) | |
download [cam] | Alle Cloud-Event-Clips herunterladen | |
unread [cam] | Ungelesene Events anzeigen | |
| Zonen & Regeln | zones [cam] [list|set|clear] | Bewegungszonen verwalten |
privacy-masks [cam] [list|set|clear] | Privacy-Masken verwalten | |
rules [cam] [list|add|edit|delete] | Cloud-Automatisierungsregeln verwalten | |
lighting-schedule [cam] [set --on HH:MM --off HH:MM] | Beleuchtungszeitplan verwalten | |
| Sharing | friends [list|invite|share|unshare|resend|remove] | Kamera-Sharing mit Freunden |
rename [cam] "Neuer Name" | Kamera umbenennen | |
| Low-Level | rcp [cam] <info|clock|snapshot|...> | RCP-Protokoll-Lesezugriff |
| Konnektivität | ping [cam] | Kamera direkt per LAN anpingen — prüft Erreichbarkeit ohne Cloud-Roundtrip |
ping [cam] --local | Alle lokalen Endpunkte der Kamera auf LAN-Erreichbarkeit testen | |
| Token & Config | token [fix|browser] | Token anzeigen, erneuern oder neu einloggen |
config | Aktuelle Konfiguration anzeigen | |
rescan | Kameras neu erkennen |
Live-Stream — LOCAL und REMOTE
Der live-Befehl öffnet standardmäßig eine REMOTE-Session über den Bosch Cloud Proxy — das funktioniert überall, auch von unterwegs. Im heimischen Netz ist der --local-Modus die bessere Wahl: der Stream läuft direkt von der Kamera über LAN, ohne Umweg über die Cloud. Mit ping [cam] --local lässt sich vorab prüfen, ob die Kamera-IP im LAN erreichbar ist — ohne Stream-Session zu öffnen.
Bosch serviert RTSPS auf Hosts wie proxy-37.live.cbs.boschsecurity.com, aber das TLS-Zertifikat deckt nur *.residential.connect.boschsecurity.com ab. FFmpeg und VLC lehnen die Verbindung daher mit einem Zertifikatsfehler ab. Das Tool löst das mit einem eingebetteten Python TLS-Terminator: er nimmt die TLS-Bytes auf einem lokalen Port entgegen, entpackt sie und schickt nacktes RTSP an den Player — egal ob Quelle LAN oder Cloud ist. Nur für diese spezifische Bosch-Verbindung ist die Zertifikatsprüfung deaktiviert, der Rest des Systems bleibt unangetastet.
# REMOTE (Standard) — funktioniert überall
python3 bosch_camera.py live Outdoor
# LOCAL — direkt per LAN, kein Cloud-Umweg
python3 bosch_camera.py live --local Outdoor
# Qualitätsstufen
python3 bosch_camera.py live Outdoor --quality high # ~30 Mbps
python3 bosch_camera.py live Outdoor --quality auto # ~7,5 Mbps (Standard)
python3 bosch_camera.py live Outdoor --quality low # ~1,9 Mbps
# VLC statt ffplay
python3 bosch_camera.py live Outdoor --vlc
Echtzeit-Events und Push-Notifications
Der watch-Befehl überwacht Kamera-Events in Echtzeit. Im Standard-Polling-Modus fragt er alle 30 Sekunden die Event-API ab. Mit --push registriert das Tool einen eigenen Firebase Cloud Messaging Listener und erhält Events in circa 2 Sekunden — mehr als eine Größenordnung schneller als Polling.
# Polling — alle 30 s (Standard)
python3 bosch_camera.py watch Outdoor
# FCM Push — Events in ~2 s
python3 bosch_camera.py watch --push
# Push mit automatischem Snapshot-Download
python3 bosch_camera.py watch --push --snapshot
# Push-Mode explizit wählen
python3 bosch_camera.py watch --push --push-mode ios # iOS FCM-Credentials
python3 bosch_camera.py watch --push --push-mode android # Android FCM-Credentials
python3 bosch_camera.py watch --push --push-mode polling # FCM deaktivieren
# Zeitlimit und Intervall anpassen
python3 bosch_camera.py watch Outdoor --interval 15 --duration 600
Der FCM-Listener nutzt die öffentlich im Bosch-Open-Source-Reflektor veröffentlichten Firebase-Credentials. Die Verbindung ist gegen kurze WAN-Aussetzer gehärtet: bei Verbindungsfehlern reconnectet der Listener automatisch ohne Limit. Das aktuelle Event-Typen-Set:
MOTION_DETECTED — Bewegungserkennung ausgelöst
PERSON_DETECTED — Person im Bild erkannt (Gen2 DualRadar)
AUDIO_ALARM — Audio-Ereignis (Glasbruch, Rauch, CO bei Gen2 Indoor II)
CONNECTION_LOST — Kamera nicht mehr erreichbar
CAMERA_ALARM — Kameraseitig ausgelöster Alarm
Systemarchitektur
Das Tool kommuniziert ausschließlich über die Bosch Cloud API — eine direkte lokale API gibt es nicht offiziell. Der Smart Home Controller (SHC) dient dabei als Bridge zwischen Kamera und Cloud, wird aber vom CLI nicht direkt angesprochen. Für den Live-Stream startet das Tool einen lokalen TLS-Proxy-Thread, der die verschlüsselte RTSPS-Verbindung terminiiert und nacktes RTSP an den Mediaplayer weitergibt.
Die Verbindung zwischen CLI und Bosch Cloud läuft über Bearer JWT Tokens. Der Token hat eine Laufzeit von circa einer Stunde; der Refresh-Token läuft deutlich länger (Monate). Die Session für den Live-Stream wird nach 60 Minuten automatisch verlängert — der Stream bricht dabei nicht ab.
Skript-Automatisierung und Beispiele
Alle Befehle sind direkt aus Shell-Skripten, Cron-Jobs oder Python-Modulen aufrufbar. Das Konfigurationsformat (bosch_config.json) ist lesbar und kann programmatisch ausgewertet werden.
#!/bin/bash
# Stundenweise Status-Abfrage per Cron
python3 /opt/bosch/bosch_camera.py status >> /var/log/bosch_status.log
# Privacy automatisch bei Anwesenheit
python3 bosch_camera.py privacy Indoor off
python3 bosch_camera.py privacy Outdoor on
# Snapshot mit Zeitstempel sichern
python3 bosch_camera.py liveshot Outdoor
# → speichert: snapshots/YYYY-MM-DD_HH-MM-SS_liveshot_Outdoor.jpg
# Python-Modul: Snapshot-URL aus dem CLI-Output parsen
import subprocess, re
result = subprocess.run(
["python3", "bosch_camera.py", "info"],
capture_output=True, text=True
)
# snapshot URL, stream URLs etc. aus result.stdout parsen
Signal-Integration
Mit watch --signal sendet das Tool bei jedem erkannten Event automatisch eine Signal-Nachricht — inklusive JPEG-Snapshot. Voraussetzung ist eine laufende signal-cli-rest-api Instanz.
python3 bosch_camera.py watch --push --snapshot \
--signal http://localhost:8080 \
--signal-sender +491234567890 \
--signal-recipients +490987654321
Der Snapshot wird nach Event-Erkennung asynchron heruntergeladen (die Bosch Cloud stellt Bilddaten eventually consistent bereit — das Tool wartet mit mehrstufigem Backoff bis zu 25 Sekunden auf das Bild). Sobald das JPEG verfügbar ist, sendet das Tool Text und Bild in einer Signal-Nachricht.
Erweiterte Funktionen
Neben den Kernbefehlen deckt das CLI einige Funktionen ab, die in anderen Integrationen nicht verfügbar sind: vollständiges Kamera-Sharing, Gegensprechen (Two-Way Audio) und direkter RCP-Protokollzugriff.
RCP-Protokoll-Zugriff
Das RCP-Protokoll (Remote Camera Protocol) ist Boschs internes Binär-/CGI-Hybridprotokoll mit mehreren hundert Befehlen. Das CLI kann über den Cloud-Proxy auf Auth-Level-3-Befehle zugreifen — ohne direkten Netzwerkzugang zur Kamera.
# Kamera-Identität: Produktname, FQDN, LAN-IP, MAC
python3 bosch_camera.py rcp Outdoor info
# Echtzeit-Kamerauhr
python3 bosch_camera.py rcp Outdoor clock
# RCP-JPEG-Thumbnail 160x90 — speichern und öffnen
python3 bosch_camera.py rcp Outdoor snapshot
# Bewegungszonen-Koordinaten auslesen
python3 bosch_camera.py rcp Outdoor motion
# LED-Dimmer-Wert (0–100)
python3 bosch_camera.py rcp Outdoor dimmer
# Bitraten-Leiter in kbps
python3 bosch_camera.py rcp Outdoor bitrate
# Rohes Video-Frame 320x180 YUV422 → JPEG
python3 bosch_camera.py rcp Outdoor frame
# IVA-Automatisierungsscript (gzip → Text)
python3 bosch_camera.py rcp Outdoor script
# Alle RCP-Abfragen für eine Kamera
python3 bosch_camera.py rcp Outdoor all
Der RCP-Zugriff läuft über eine 2-Step-Session-Handshake, die per Proxy-Verbindung gecacht wird (5-Minuten-TTL). Das reduziert die Latenz bei aufeinanderfolgenden Abfragen deutlich.
Weitere erweiterte Befehle:
# Kamera-Sharing mit Freunden
python3 bosch_camera.py friends list
python3 bosch_camera.py friends invite [email protected]
python3 bosch_camera.py friends share Outdoor FRIEND_ID
python3 bosch_camera.py friends unshare Outdoor FRIEND_ID
# Bewegungszonen und Privacy-Masken (normalisierte Koordinaten 0.0–1.0)
python3 bosch_camera.py zones Outdoor list
python3 bosch_camera.py zones Outdoor set --json '[{"x":0.0,"y":0.3,"w":0.67,"h":0.7}]'
python3 bosch_camera.py privacy-masks Outdoor set --json '[{"x":0.0,"y":0.0,"w":0.3,"h":0.3}]'
# Cloud-Automatisierungsregeln
python3 bosch_camera.py rules Outdoor list
python3 bosch_camera.py rules Outdoor add
python3 bosch_camera.py rules Outdoor delete RULE_ID
# Beleuchtungszeitplan
python3 bosch_camera.py lighting-schedule Outdoor set --on 20:00 --off 06:00 --motion
Haftungsausschluss / Rechtliches
Dieses Projekt ist eine unabhängige, community-entwickelte Software. Es besteht keine Verbindung zu Robert Bosch GmbH oder Bosch Smart Home GmbH. „Bosch“ und „Bosch Smart Home“ sind eingetragene Marken der Robert Bosch GmbH.
Das Tool kommuniziert mit einer reverse-engineerten, undokumentierten und inoffiziellen API. Die Software wird „wie sie ist“ ohne Gewährleistung bereitgestellt. Die Nutzung erfolgt auf eigene Gefahr. Die API kann von Bosch jederzeit ohne Ankündigung geändert oder eingestellt werden, was das Tool funktionsunfähig machen kann. Jeder Nutzer ist selbst dafür verantwortlich, die Einhaltung der Bosch-Nutzungsbedingungen und geltender Gesetze sicherzustellen.
Das Reverse Engineering erfolgte ausschließlich zum Zweck der Interoperabilität mit eigenen Geräten und Daten — was nach § 69e des deutschen Urheberrechtsgesetzes (UrhG) und Artikel 6 der EU-Richtlinie 2009/24/EG zum Schutz von Computerprogrammen ausdrücklich zulässig ist. Es wurde keine Bosch-Software kopiert oder verbreitet; nur Netzwerkprotokollbeobachtungen wurden verwendet.
Alle vier Plattformen im Vergleich
Alle vier Geschwister-Projekte teilen sich die gleiche reverse-engineerte Cloud-API und das RCP-Protokoll, entwickeln sich aber unabhängig weiter. Wer im LAN bleiben möchte, profitiert von einem klaren Konzept: der ioBroker-Adapter ist LOCAL-only by design — er greift nur dann auf die Cloud zu, wenn es unvermeidbar ist (OAuth-Login + FCM-Subscribe + Sessions-Token). Die Home Assistant Integration kann beides — LOCAL als Default mit automatischem REMOTE-Fallback, wenn das LAN kurzzeitig nicht erreichbar ist. Das Python CLI Tool ist die niedrigste, skriptbare Schnittstelle für Capture- und Research-Use-Cases. Der MCP-Server bringt eine KI-gesteuerte Steuerungsebene für Claude Code und kompatible Assistenten.
| Feature | HA Integration | Python CLI | ioBroker Adapter | MCP Server |
|---|---|---|---|---|
| Reife | Quality Scale Platinum | stabil | Beta | stabil · PyPI |
| Plattform | Home Assistant (HACS) | Python 3.10+ CLI | ioBroker (npm) | Python 3.10+ · stdio + HTTP |
| Login | ✅ OAuth2 PKCE (Browser) | ✅ OAuth2 PKCE (Browser) | ✅ OAuth2 PKCE (Browser) | ✅ nutzt CLI-Config |
| Snapshots | ✅ native Camera.image | ✅ snapshot-Kommando | ✅ File-Store + Base64-DP | ✅ bosch_camera_snapshot (LAN-only) |
| Live RTSP-Stream (LAN) | ✅ HA Stream Component | ✅ FFmpeg / RTSPS | ✅ TLS-Proxy → lokales RTSP | ✅ bosch_camera_stream_url (LAN-only) |
| WebRTC (Sub-Sekunden-Latenz) | ✅ via go2rtc | ✅ live --webrtc | ❌ | ❌ |
| Dual-Stream (Haupt + Sub) | ✅ sensor.bosch_<n>_stream_url + _sub | ✅ live --sub | ✅ stream_url + stream_url_sub | ✅ via bosch_camera_stream_url |
| Externer Recorder (Frigate, BlueIris) | ✅ über go2rtc | ✅ Stdout-Pipe | ✅ Digest-Creds-URL + LAN-Bind | ✅ URL zurückgegeben |
| Privacy-Modus | ✅ Switch | ✅ Kommando | ✅ DP | ✅ bosch_camera_privacy_set |
| Frontlicht (Gen1/Gen2) | ✅ Light-Entity | ✅ Kommando | ✅ DP | ✅ bosch_camera_light_set |
| RGB-Wallwasher (Gen2 Außen II) | ✅ Light mit RGB | ✅ Kommando | ✅ Farbe + Helligkeit DPs | ❌ (nur Ein/Aus) |
| Panik-Sirene (Gen2) | ✅ Button | ✅ Kommando | ✅ DP | ❌ |
| Bildrotation 180° | ✅ Switch | ✅ Flag | ✅ DP | ❌ |
| Bewegung / Person / Audio-Events | ✅ FCM-Push + Polling | ✅ event-watch | ✅ FCM-Push + Polling | ✅ bosch_camera_events |
| Motion-Edge-Trigger | ✅ binary_sensor.motion | n/a | ✅ motion_active | n/a |
| Auto-Snapshot bei Bewegung | ✅ refresht Camera | n/a | ✅ last_event_image Base64 | n/a |
| Synthetischer Motion-Trigger (externer Sensor) | ✅ Service | n/a | ✅ DP | ❌ |
| Cloud-Clip-Download (~30 Tage) | ✅ über Media Browser | ✅ download-Kommando | ❌ (LOCAL-only) | ❌ |
| Mini-NVR (bewegungsgetriggerte Aufnahme) | ✅ Beta | ✅ Beta | ❌ | ❌ |
| SMB / NAS Clip-Upload | ✅ | ✅ Beta | ❌ | ❌ |
| Audio-Alarm-Empfindlichkeit (Gen2) | ✅ Select | ✅ Kommando | ❌ | ❌ |
| Kamera-Sharing (Freunde) | ❌ | ✅ Kommando | ❌ | ❌ |
| Pan / Tilt (360° Gen1) | ✅ Services | ✅ Kommando | ✅ pan_position DP | ✅ bosch_camera_pan |
| Benannte Pan-Presets (home / links / rechts…) | ✅ opt-in Select-Entity | ✅ pan --preset | ✅ pan_preset DP | ✅ bosch_camera_pan preset= |
| Zwei-Wege-Audio / Intercom | ❌ | ✅ Kommando | ❌ | ❌ |
| Webhook-Zustellung bei Events | ✅ Service + opt-in | ✅ watch --webhook URL | ✅ via MQTT-Bridge | ❌ (Request-Response-Modell) |
| MQTT-Event-Bridge (Bewegung / Audio / Person) | n/a (HA Event Bus nativ) | n/a | ✅ Admin-Konfiguration | n/a |
| Apple HomeKit (über HA Core Bridge) | ✅ dokumentiert | n/a | n/a | n/a |
| Snapshot-Scheduler / Time-Lapse | ✅ examples/ YAML | ✅ cron + ffmpeg Beispiele | ✅ Blockly-Beispiel | n/a |
| Custom Lovelace-Card | ✅ 2 Cards (Einzel + Grid) | n/a | n/a | n/a |
| ioBroker VIS Dashboard | n/a | n/a | ✅ VIS-2 Widget (alpha) | n/a |
| Cloud-Relay REMOTE-Fallback | ✅ automatisch bei LAN-Ausfall | ✅ --remote-Modus | ❌ (LOCAL-only by design) | ❌ |
| Browser-Admin- / Config-UI | ✅ HA Config Flow | n/a (CLI) | ✅ JSON-Config-Tabs | n/a (LLM-gesteuert) |
| KI-gesteuerte Auswertung | ❌ | ❌ | ❌ | ✅ Prompts + Tools |
| UI-Sprachen | 11 | 11 | 11 | n/a |
| LAN-Ping / Erreichbarkeitstest | ✅ Coordinator | ✅ ping --local | ✅ Coordinator | ✅ bosch_camera_lan_ping |
Legende: ✅ unterstützt · ❌ nicht unterstützt / nicht geplant · n/a auf dieser Plattform nicht anwendbar.
Die HA-Integration ist die feature-vollste Referenz-Implementierung. Das Python-CLI ist die niedrigste, skriptbare Schnittstelle für Research und Automation. Der ioBroker-Adapter positioniert sich klar als Local-Champion. Der MCP-Server bringt Bosch-Kamerasteuerung direkt in den KI-Assistenten-Kontext.
Vergleich mit der Bosch-App — was das CLI mehr kann
Die offizielle Bosch Smart Camera App ist für den Alltagsgebrauch ausgelegt: Live-Bild, Benachrichtigungen, einfache Einstellungen. Das Python CLI Tool adressiert einen anderen Bedarf — Automatisierung, Scripting und technische Diagnose. Hier sind die Bereiche, in denen das CLI über die App hinausgeht.
| Fähigkeit | Bosch App | Python CLI |
|---|---|---|
| Batch-Snapshots aller Kameras | Manuell, eine Kamera nach der anderen | ✅ liveshot ohne Kameraname — alle auf einmal |
| Automatisierter Snapshot-Cronjob | ❌ Nicht möglich | ✅ Shell-Skript + cron, Zeitstempel im Dateinamen |
| Bewegungs-Events skriptbar verarbeiten | Nur App-Benachrichtigungen | ✅ watch --push --snapshot mit Event-Hook |
| Signal-Alerts mit Foto | ❌ | ✅ watch --signal — JPEG direkt in Signal |
| RCP-Diagnose (Firmware-Internals) | ❌ | ✅ rcp-Befehl — IP, MAC, Bitrate, IVA-Skript |
| Kamera-Sharing per CLI | Nur in der App möglich | ✅ friends invite / share / unshare |
| Zwei-Wege-Audio ohne App | Nur in der App möglich | ✅ intercom-Befehl |
| Cloud-Clips lokal archivieren | Manuell, einzeln | ✅ download — alle Clips auf einmal, lokal speichern |
| Stream in externem Player öffnen | ❌ | ✅ live --vlc oder ffmpeg-Pipe für NVR |
| Token-Lifecycle verstehen | Vollständig verborgen | ✅ token-Befehl zeigt Ablaufzeit + erneuert lautlos |
Kurz zusammengefasst: Die Bosch-App ist für End-User optimiert. Das Python CLI ist für den technischen Anwender gedacht — wer seine Kamerainfrastruktur mit Smart Home-Automatisierung verbinden, in Bash-Skripte integrieren oder forensisch auswerten möchte, findet im CLI das präzisere Werkzeug.
Use-Cases im Detail
Capture und Forensik
Wer Bewegungsereignisse nicht nur als Push-Benachrichtigung empfangen, sondern lückenlos dokumentieren möchte, kann das CLI dauerhaft im Hintergrund laufen lassen. Mit watch --push --snapshot landen alle erkannten Bewegungsbilder automatisch im snapshots/-Verzeichnis — mit Zeitstempel und Kameraname im Dateinamen. Das eignet sich beispielsweise für Einbruchs-Forensik, Baustellen-Protokollierung oder die Dokumentation von Lieferungen.
# Forensik-Setup: Push-Events + automatischer Snapshot-Download
python3 bosch_camera.py watch --push --snapshot
# Ergebnis im snapshots/-Verzeichnis:
# snapshots/2026-05-17_08-23-41_MOTION_DETECTED_Outdoor.jpg
# snapshots/2026-05-17_09-01-12_PERSON_DETECTED_Outdoor.jpg
Für eine lückenlose Beweissicherung lässt sich zusätzlich ein Signal-Alert einschalten — das Bild landet dann gleichzeitig im lokalen Verzeichnis und im Signal-Chat.
Snapshot-Cronjob für externe Speicher-Strategie
Die Bosch Cloud speichert Clips nur für rund 30 Tage. Wer einen längeren Archivierungszeitraum benötigt oder Events auf einem NAS oder einer eigenen Cloud-Storage-Lösung sichern möchte, kann das CLI als Backup-Schicht einsetzen. Ein einfacher Cron-Job zieht jede Stunde ein Liveshot aller Kameras und legt es timestamped auf einem gemounteten NAS-Share ab.
# /etc/cron.hourly/bosch-snapshot
#!/bin/bash
cd /opt/bosch
python3 bosch_camera.py liveshot >> /var/log/bosch-snapshot.log 2>&1
# Dateien landen in snapshots/ — NFS/SMB-Mount oder rsync anschließen
Für ereignisgesteuerte Archivierung statt zeitgesteuerte ist der watch --push --snapshot-Modus besser geeignet: er schreibt nur dann eine Datei, wenn tatsächlich eine Bewegung erkannt wurde — ohne Polling-Overhead.
Aus einem Verzeichnis mit timestamped Snapshots lässt sich mit einem einzigen ffmpeg-Aufruf ein Time-Lapse-Video bauen — zum Beispiel für Baustellen-Protokollierung oder Garten-Wachstumsdokumentierung:
# Snapshots im Stunden-Takt archivieren (aus bosch_camera.py liveshot):
# snapshots/2026-05-20_08-00_liveshot_Outdoor.jpg
# snapshots/2026-05-20_09-00_liveshot_Outdoor.jpg ...
# Time-Lapse aus allen Frames (1 Bild = 0.5s im Video)
ffmpeg -framerate 2 -pattern_type glob \
-i "snapshots/*_liveshot_Outdoor.jpg" \
-c:v libx264 -pix_fmt yuv420p timelapse_outdoor.mp4
RCP-Diagnose und Kamera-Internals
Das Remote Camera Protocol (RCP) ist Boschs internes Protokoll mit mehreren hundert Befehlen — von der Firmware-Identität über Bitraten-Leiter bis hin zu IVA-Automatisierungsskripten. Das CLI ermöglicht Lesezugriff auf Auth-Level-3-Befehle über den Cloud-Proxy. Das ist besonders nützlich für technische Diagnose: LAN-IP und MAC-Adresse der Kamera, aktuelle Bitraten-Konfiguration, Motion-Zonen-Koordinaten oder den LED-Dimmer-Wert — alles ohne Netzwerkzugang zur Kamera.
# Vollständige Diagnose einer Kamera
python3 bosch_camera.py rcp Outdoor all
# Einzelne RCP-Abfragen
python3 bosch_camera.py rcp Outdoor info # Produktname, FQDN, LAN-IP, MAC
python3 bosch_camera.py rcp Outdoor clock # Kamerauhr in Echtzeit
python3 bosch_camera.py rcp Outdoor bitrate # Bitraten-Leiter in kbps
python3 bosch_camera.py rcp Outdoor frame # Video-Frame 320×180 → JPEG
python3 bosch_camera.py rcp Outdoor script # IVA-Automatisierungsskript (gzip → Text)
RCP-Abfragen sind auch für die Home Assistant Integration relevant: Die HA-Integration nutzt denselben RCP-Proxy-Mechanismus für interne Diagnose-Reads. Wer das CLI parallel zur HA-Integration betreibt, kann RCP-Reads direkt aus dem Terminal triggern, ohne in die HA-Logs schauen zu müssen.
Token-Sicherheit und Credential-Rotation
Nach dem einmaligen OAuth2 PKCE Browser-Login speichert das Tool den Refresh-Token in bosch_config.json. Diese Datei sollte mit restriktiven Dateirechten geschützt sein (chmod 600 bosch_config.json) und nicht in Versionskontrolle landen. Der Access-Token läuft nach rund einer Stunde ab — das Tool erneuert ihn automatisch und lautlos über den Refresh-Token, ohne dass ein erneuter Browser-Login nötig wäre. Der Refresh-Token selbst ist deutlich länger gültig (Monate).
Wenn der Refresh-Token ungültig wird (z. B. nach einem Passwort-Wechsel bei der Bosch SingleKey ID oder bei Ablauf), erkennt das Tool den 401-Fehler und leitet automatisch einen Browser-Login ein. Der laufende Stream bricht dabei nicht ab — die Session-Verlängerung läuft separat im Hintergrund.
# Token-Status anzeigen (Ablaufzeit, Gültigkeit)
python3 bosch_camera.py token
# Stille Erneuerung über Refresh-Token
python3 bosch_camera.py token fix
# Erzwungener Browser-Login (z. B. nach Passwort-Wechsel)
python3 bosch_camera.py token browser
TLS-Proxy-Architektur im Detail
Bosch liefert RTSPS-Streams auf Hosts wie proxy-37.live.cbs.boschsecurity.com. Das TLS-Zertifikat dieser Hosts deckt aber nur *.residential.connect.boschsecurity.com ab — ein SAN-Mismatch. FFmpeg, VLC und go2rtc lehnen die Verbindung deshalb mit einem Zertifikatsfehler ab. Das Tool löst das mit einem eingebetteten Python TLS-Terminator, der ausschließlich für diese Bosch-spezifische Verbindung läuft.
Der Proxy startet auf einem zufälligen lokalen Port, nimmt die TLS-Bytes auf 127.0.0.1 entgegen, entpackt die verschlüsselte Verbindung und reicht nacktes RTSP an den Player weiter. Das Muster ist symmetrisch für LOCAL (direkt zur Kamera im LAN) und REMOTE (über den Bosch Cloud Relay Proxy): in beiden Fällen sieht der Mediaplayer nur ein gewöhnliches rtsp://127.0.0.1:PORT-URL.
Diese Architektur ist auch der Grund, warum die Home Assistant Integration denselben Proxy-Ansatz verwendet — und warum das Python CLI als Referenz-Implementierung für alle drei Plattformen gilt. Wer den ioBroker-Adapter einsetzt, nutzt ebenfalls einen TLS-Proxy nach demselben Prinzip.
TOFU-Cert-Pinning für LAN-Kameras
Beim ersten LAN-Verbindungsaufbau zu einer Kamera berechnet das Tool den SHA-256-Fingerprint des Kamera-TLS-Zertifikats und speichert ihn in bosch_config.json unter cam_cert_fingerprints. Bei jedem nachfolgenden Connect wird dieser gespeicherte Fingerprint gegen das aktuell präsentierte Zertifikat verglichen. Stimmt er nicht überein, bricht das Tool mit einem CertPinningError ab — statt einer stillen Verbindung zu einer unbekannten Gegenstelle. Das Trust-on-First-Use (TOFU)-Prinzip verhindert so Man-in-the-Middle-Angriffe im LAN, bei denen ein Angreifer das Kamera-Zertifikat austauscht oder den Kamera-Traffic auf einen anderen Host umleitet. Wer eine Kamera tauscht oder eine Firmware-Aktualisierung die Zertifikatskette ändert, löscht einfach den betroffenen Eintrag aus cam_cert_fingerprints — beim nächsten Start wird ein neues Cert gelernt.
Häufige Fragen (FAQ)
Brauche ich Home Assistant für das CLI Tool?
Nein. Das Python CLI Tool ist vollständig standalone — kein Home Assistant, kein Smart Home Controller, kein Bosch SHC notwendig. Einzige Voraussetzung ist ein Bosch Cloud Account (SingleKey ID), Python 3.10+ und ffmpeg. Die Kameras müssen einmalig über die offizielle Bosch App eingerichtet worden sein; danach ist die App nicht mehr notwendig.
Auf welchen Betriebssystemen läuft das CLI?
Das Tool läuft auf macOS, Linux und Windows (WSL empfohlen). Auf macOS steht ffmpeg über Homebrew bereit (brew install ffmpeg). Auf Linux genügt der Paketmanager (apt install ffmpeg). VLC ist optional und funktioniert plattformübergreifend als Player-Alternative.
Kann ich das CLI auf einem Raspberry Pi nutzen?
Ja. Das Tool läuft problemlos auf einem Raspberry Pi (ab Pi 3) mit Raspberry Pi OS oder Ubuntu. Python 3.10+ ist auf aktuellen Raspberry Pi OS Versionen vorinstalliert oder einfach über apt verfügbar. Da der Raspberry Pi typischerweise im heimischen Netz läuft, profitiert er vom --local-Modus, der den Stream direkt über LAN ohne Cloud-Umweg bezieht.
Wie sicher ist der OAuth-Token?
Der Refresh-Token wird in bosch_config.json im Klartext gespeichert. Für Produktivbetrieb empfiehlt sich chmod 600 bosch_config.json und der Ausschluss der Datei aus Versionskontrolle (.gitignore). Der Token gewährt Zugriff auf den Bosch Account — er sollte wie ein Passwort behandelt werden. Im Verlustfall erzwingt token browser einen Neu-Login und überschreibt den alten Token.
Funktioniert der Live-Stream ohne Internet?
Mit --local läuft der Stream direkt über das LAN — ohne jeglichen Cloud-Zugriff nach dem initialen Session-Setup. Der Session-Aufbau (PUT /connection type=LOCAL) benötigt einmalig Internetzugang zur Bosch Cloud; danach fließen die RTSP-Daten ausschließlich zwischen Kamera und lokalem TLS-Proxy. Fällt das Internet während eines laufenden LOCAL-Streams aus, bleibt der Stream aktiv bis die 60-Minuten-Session-Grenze erreicht ist.
Kann ich Bewegungs-Events automatisch verarbeiten?
Ja. Der watch --push-Modus registriert einen Firebase Cloud Messaging Listener und liefert Events in rund 2 Sekunden. Mit --snapshot wird bei jedem Event automatisch ein JPEG heruntergeladen. Mit --signal landet das Bild zusätzlich als Signal-Nachricht im Chat. Für eigene Verarbeitung kann der CLI-Output aus Shell-Skripten oder Python-Modulen geparsed werden — der subprocess-Weg ist im Abschnitt Skript-Automatisierung dokumentiert.
Welche Latenz hat der Stream?
Im LOCAL-Modus (LAN, TLS-Proxy) liegt die End-to-End-Latenz typischerweise bei 1–3 Sekunden in ffplay — abhängig von der ffplay-Pufferkonfiguration. Im REMOTE-Modus über den Bosch Cloud Relay erhöht sich die Latenz auf 3–8 Sekunden. Für Sub-Sekunden-Latenz ist die Home Assistant Integration mit WebRTC via go2rtc die bessere Wahl.
Wie steuere ich mehrere Kameras gleichzeitig?
Wird kein Kameraname angegeben, gilt der Befehl für alle Kameras gleichzeitig. python3 bosch_camera.py liveshot zieht z. B. einen Snapshot von jeder Kamera im Account. python3 bosch_camera.py privacy on aktiviert den Privacy-Modus aller Kameras auf einmal. Für selektive Steuerung reicht ein Teilstring des Kameranamens — Groß-/Kleinschreibung wird ignoriert.
Community und Support
Fragen, Bug-Reports und Diskussionen rund um das CLI-Tool laufen in den folgenden Communities — dort wird das Projekt aktiv begleitet und neue Themen werden direkt aufgegriffen.
- community.simon42.com — deutschsprachige Smart-Home-Community mit Schwerpunkt Home Assistant und ioBroker. Gut geeignet für Skript-Patterns, Capture-Workflows und Automatisierung mit Python.
- community.home-assistant.io — das offizielle Home-Assistant-Forum. Relevant wenn das CLI parallel zur HA-Integration läuft (zum Beispiel für Capture-/Forensik-Sessions).
- GitHub Issues — strukturierte Bug-Reports und Feature-Anfragen direkt am Repo. Bevorzugter Weg für reproduzierbare Probleme mit CLI-Output und Token-Status.
Direkter Kontakt geht über das Kontaktformular. Weitere Bosch-Kamera-Projekte: HA Integration · ioBroker Adapter · MCP Server · Node-RED · Smart-Home-Hub.