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.

KameraGenerationTypBesonderheiten
360° InnenkameraGen1IndoorPan-/Tilt-Motor, Auto-Follow, IR-Nachtsicht, mechanische Privacy-Blende, Sirene
Eyes Innenkamera IIGen2Indoor75-dB-Sirene, Audio+ (Glasbruch / Rauch / CO), Bewegungszonen mit KI, RGB-LEDs, einziehbarer Kamerakopf
Eyes AußenkameraGen1Outdoor (IP66)Front-Spotlight, Bewegungslicht, Umgebungslicht-Sensor, Zeitplan-basierte Beleuchtung
Eyes Außenkamera IIGen2Outdoor (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.

OAuth2 PKCE Sequenzdiagramm — Login-Flow des CLI Tools
OAuth2 PKCE Login-Flow: Browser-Öffnung, Bosch-Login, Callback, Token-Speicherung

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.

Übersicht aller CLI-Befehlsgruppen
Alle Befehlsgruppen des Python CLI Tools: Info, Stream, Snapshot, Privacy, Licht, Events, Signal, Sharing und RCP-Protokoll
GruppeBefehlBeschreibung
Info & StatusstatusOnline-/Offline-Status aller Kameras
infoVollständige Details + Stream-URLs
info --fullZusätzlich Firmware, Motion, Audio, Ambient Light, WiFi
accountAccount-Info, Feature-Flags, Subscription-Status
profileBenutzerprofil anzeigen oder ändern
Snapshotssnapshot [cam]Letzter bewegungsgetriggerter JPEG-Snapshot
liveshot [cam]Aktuelles Live-Bild (~1,5 s)
liveshot [cam] --hqLive-Snapshot in hoher Qualität
Live-Streamlive [cam]30fps H.264 + AAC Audio in ffplay
live [cam] --vlcStream in VLC öffnen
live [cam] --quality highHöchste Bitrate (~30 Mbps)
live [cam] --quality lowNiedrige Bandbreite (~1,9 Mbps)
live --local [cam]Direktstream per LAN-TLS-Proxy
Kamerasteuerungprivacy [cam] [on|off]Privacy-Modus abfragen oder setzen
privacy [cam] on --minutes NPrivacy 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_HIGHEmpfindlichkeit setzen (OFF bis SUPER_HIGH)
audio-alarm [cam] [--enable|--disable]Audio-Alarm ein-/ausschalten
audio-alarm [cam] --threshold NLautstä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°-Kamerapan [cam] [left|center|right|<-120..120>]Kamera schwenken
pan [cam] --preset homeBenannte 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
Intercomintercom [cam]60 s Kamera-Audio abhören (Gegensprechen)
intercom [cam] --duration NDauer in Sekunden festlegen
intercom [cam] --speaker-level NLautstärke des Kameralautsprechers
Events & Downloadwatch [cam]Echtzeit-Event-Polling (alle 30 s)
watch --pushEchtzeit via FCM Push (~2 s Latenz)
watch --snapshotJPEG automatisch herunterladen bei Event
watch --webhook URLHTTP-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 & Regelnzones [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
Sharingfriends [list|invite|share|unshare|resend|remove]Kamera-Sharing mit Freunden
rename [cam] "Neuer Name"Kamera umbenennen
Low-Levelrcp [cam] <info|clock|snapshot|...>RCP-Protokoll-Lesezugriff
Konnektivitätping [cam]Kamera direkt per LAN anpingen — prüft Erreichbarkeit ohne Cloud-Roundtrip
ping [cam] --localAlle lokalen Endpunkte der Kamera auf LAN-Erreichbarkeit testen
Token & Configtoken [fix|browser]Token anzeigen, erneuern oder neu einloggen
configAktuelle Konfiguration anzeigen
rescanKameras 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.

LOCAL vs. REMOTE Stream-Pfad im Python CLI Tool
LOCAL: TLS-Proxy terminiert die Kamera-Verbindung im LAN und reicht RTSP an ffplay weiter. REMOTE: Bosch Cloud-Relay-Proxy übernimmt den Stream.

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.

Event-Watch-Flow — Polling vs. FCM Push
watch-Befehl: Polling-Modus (30s-Intervall) und FCM-Push-Modus (~2s Latenz) im Vergleich
# 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
FCM Push-Modus: Firebase-Registrierung und Event-Empfang
FCM Push-Modus: Das CLI registriert sich beim Firebase-Backend und empfängt Bosch-Events direkt, ohne zyklisches Polling.

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.

Systemarchitektur — CLI, Cloud-API, TLS-Proxy, Kamera und Player
Systemarchitektur: OAuth2 PKCE Login, REST-API, TLS-Proxy für Stream, FCM-Push für Echtzeit-Events, Signal-Alerts

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.

Beispiel: Automatisierungsskript mit watch --push und Snapshot-Verarbeitung
Typisches Automatisierungsmuster: watch –push liefert Events, ein Shell-Skript verarbeitet Snapshots weiter
#!/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.

Signal-Integration: watch --push mit Snapshot-Download und Signal-Versand
Signal-Alert-Flow: FCM-Push triggert Snapshot-Download, Signal-CLI sendet Bild + Text an Empfänger
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.

RCP-Protokoll-Pfad: CLI → Cloud-Proxy → Kamera-Firmware
RCP über Cloud-Proxy: Das CLI sendet RCP-Befehle an den Bosch-Cloud-Proxy, der sie an die Kamera-Firmware weiterleitet
# 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.

FeatureHA IntegrationPython CLIioBroker AdapterMCP Server
ReifeQuality Scale PlatinumstabilBetastabil · PyPI
PlattformHome Assistant (HACS)Python 3.10+ CLIioBroker (npm)Python 3.10+ · stdio + HTTP
Login✅ OAuth2 PKCE (Browser)✅ OAuth2 PKCE (Browser)✅ OAuth2 PKCE (Browser)✅ nutzt CLI-Config
Snapshots✅ native Camera.imagesnapshot-Kommando✅ File-Store + Base64-DPbosch_camera_snapshot (LAN-only)
Live RTSP-Stream (LAN)✅ HA Stream Component✅ FFmpeg / RTSPS✅ TLS-Proxy → lokales RTSPbosch_camera_stream_url (LAN-only)
WebRTC (Sub-Sekunden-Latenz)✅ via go2rtclive --webrtc
Dual-Stream (Haupt + Sub)sensor.bosch_<n>_stream_url + _sublive --substream_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✅ DPbosch_camera_privacy_set
Frontlicht (Gen1/Gen2)✅ Light-Entity✅ Kommando✅ DPbosch_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 + Pollingevent-watch✅ FCM-Push + Pollingbosch_camera_events
Motion-Edge-Triggerbinary_sensor.motionn/amotion_activen/a
Auto-Snapshot bei Bewegung✅ refresht Cameran/alast_event_image Base64n/a
Synthetischer Motion-Trigger (externer Sensor)✅ Servicen/a✅ DP
Cloud-Clip-Download (~30 Tage)✅ über Media Browserdownload-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✅ Kommandopan_position DPbosch_camera_pan
Benannte Pan-Presets (home / links / rechts…)✅ opt-in Select-Entitypan --presetpan_preset DPbosch_camera_pan preset=
Zwei-Wege-Audio / Intercom✅ Kommando
Webhook-Zustellung bei Events✅ Service + opt-inwatch --webhook URL✅ via MQTT-Bridge❌ (Request-Response-Modell)
MQTT-Event-Bridge (Bewegung / Audio / Person)n/a (HA Event Bus nativ)n/a✅ Admin-Konfigurationn/a
Apple HomeKit (über HA Core Bridge)✅ dokumentiertn/an/an/a
Snapshot-Scheduler / Time-Lapse✅ examples/ YAML✅ cron + ffmpeg Beispiele✅ Blockly-Beispieln/a
Custom Lovelace-Card✅ 2 Cards (Einzel + Grid)n/an/an/a
ioBroker VIS Dashboardn/an/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 Flown/a (CLI)✅ JSON-Config-Tabsn/a (LLM-gesteuert)
KI-gesteuerte Auswertung✅ Prompts + Tools
UI-Sprachen111111n/a
LAN-Ping / Erreichbarkeitstest✅ Coordinatorping --local✅ Coordinatorbosch_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ähigkeitBosch AppPython CLI
Batch-Snapshots aller KamerasManuell, eine Kamera nach der anderenliveshot ohne Kameraname — alle auf einmal
Automatisierter Snapshot-Cronjob❌ Nicht möglich✅ Shell-Skript + cron, Zeitstempel im Dateinamen
Bewegungs-Events skriptbar verarbeitenNur App-Benachrichtigungenwatch --push --snapshot mit Event-Hook
Signal-Alerts mit Fotowatch --signal — JPEG direkt in Signal
RCP-Diagnose (Firmware-Internals)rcp-Befehl — IP, MAC, Bitrate, IVA-Skript
Kamera-Sharing per CLINur in der App möglichfriends invite / share / unshare
Zwei-Wege-Audio ohne AppNur in der App möglichintercom-Befehl
Cloud-Clips lokal archivierenManuell, einzelndownload — alle Clips auf einmal, lokal speichern
Stream in externem Player öffnenlive --vlc oder ffmpeg-Pipe für NVR
Token-Lifecycle verstehenVollständig verborgentoken-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.

TLS-Proxy-Internals: Verbindungsaufbau, Zertifikat-Bypass und RTSP-Weiterleitung
TLS-Terminator: SAN-Mismatch-Bypass für Bosch RTSPS — lokaler Proxy-Port für ffplay/VLC, symmetrisch für LOCAL (LAN) und REMOTE (Cloud-Relay)

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.