Gut zu wissen
- Kameras werden nicht direkt angesprochen, sondern über den Protect-Controller (UNVR, Cloud Key, Dream Machine): https://{ip}/proxy/protect/integration/v1/… (HTTPS, Port 443). Diese lokale Basis-URL zeigen die offiziellen curl-Beispiele (Verbindungstyp „Local“); die OpenAPI-Spezifikation selbst nennt nur „/integration“.
- Authentifizierung: API-Key im Header X-API-Key: {token} (so in den offiziellen curl-Beispielen). Den Key legt man lokal in der Konsole im Bereich „Integrations“ über „Create New API Key“ an; er wird nur einmal angezeigt, also sicher wie ein Passwort aufbewahren. curl-Beispiel: curl -k -H "X-API-Key: {token}" https://{ip}/proxy/protect/integration/v1/cameras
- Das -k braucht man nur, solange die Konsole ihr selbstsigniertes Zertifikat verwendet. Die CCU muss HTTPS und frei definierbare Header können, z. B. CUxD oder ein Skript mit curl.
Alle Hinweise (6)
- {kanal} ist die Geräte-ID (24 Hex-Zeichen), nicht die Kanalnummer. Kamera-IDs liefert GET /v1/cameras, Lichter /v1/lights, Sirenen /v1/sirens.
- Laut offizieller Spezifikation (v7.3.74) gibt es kein Feld für Aufnahmemodus, Privatsphäre-Maske, IR/Nachtsicht, Bewegungserkennung oder Benachrichtigungen. Per PATCH /v1/cameras/{kanal} änderbar sind nur name, osdSettings, ledSettings (isEnabled, welcomeLed, floodLed), lcdMessage, micVolume, videoMode, hdrType und smartDetectSettings. Neustart und manuelle PTZ-Bewegung gibt es ebenfalls nicht.
- Ebenfalls dokumentiert: Scharf/Unscharf des Alarm-Managers per POST /v1/arm-profiles/enable bzw. /disable, Relais-Ausgänge per POST /v1/relays/{id}/outputs/{outputId}/activate und Alarm-Hub-Ausgänge per POST /v1/alarm-hubs/{id}/outputs/{outputId}/trigger.
Position anfahren
Im Generator öffnenBewegungsmelder an der Einfahrt löst aus → Kamera schwenkt auf die gespeicherte Position
curl -s -k -X POST -H 'X-API-Key: TOKEN' 'https://KAMERA-IP/proxy/protect/integration/v1/cameras/KAMERA-ID/ptz/goto/1'Header X-API-Key: {token}. {preset} = Slot: -1 = Home-Position, ab 0 = gespeicherte Presets. Kein Body. Patrouille: POST …/ptz/patrol/start/{slot} (Slot 0–4) bzw. …/ptz/patrol/stop.
Erwartete Antwort: HTTP 204
Als Homematic-Skript (CCU3/OpenCCU)
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("curl -s -m 10 -k -X POST -H 'X-API-Key: TOKEN' 'https://KAMERA-IP/proxy/protect/integration/v1/cameras/KAMERA-ID/ptz/goto/1'");Quelle: developer.ui.com
Schnappschuss (Bild-URL)
Im Generator öffnenKlingel gedrückt → aktuelles Bild abrufen und per Push oder Telegram verschicken
curl -s -k -H 'X-API-Key: TOKEN' 'https://KAMERA-IP/proxy/protect/integration/v1/cameras/KAMERA-ID/snapshot?highQuality=true'Header X-API-Key: {token}. {kanal} = Kamera-ID aus GET …/v1/cameras. highQuality=true erzwingt ≥1080p; channel=package (Werte main/package) für Paketkamera. 503 = Kamera offline.
Erwartete Antwort: HTTP 200, image/jpeg
Als Homematic-Skript (CCU3/OpenCCU)
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("curl -s -m 10 -k -H 'X-API-Key: TOKEN' 'https://KAMERA-IP/proxy/protect/integration/v1/cameras/KAMERA-ID/snapshot?highQuality=true'");Quelle: developer.ui.com
Sirene / Alarmton auslösen
Im Generator öffnenEinbruchalarm der Homematic-Alarmanlage → Sirene der Kamera auslösen
curl -s -k -X POST -H 'X-API-Key: TOKEN' -H 'Content-Type: application/json' --data-binary '{"duration":10}' 'https://KAMERA-IP/proxy/protect/integration/v1/sirens/KAMERA-ID/play'Header X-API-Key: {token}. {kanal} = Sirenen-ID aus GET …/v1/sirens (eigenes Gerät, nicht die Kamera). duration 5, 10, 20 oder 30 s (Body optional, Standard 5). Vorzeitig stoppen: POST …/sirens/{kanal}/stop.
Erwartete Antwort: HTTP 204
Als Homematic-Skript (CCU3/OpenCCU)
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("printf '{\042duration\042:10}' | curl -s -m 10 -k -X POST -H 'X-API-Key: TOKEN' -H 'Content-Type: application/json' --data-binary @- 'https://KAMERA-IP/proxy/protect/integration/v1/sirens/KAMERA-ID/play'");Quelle: developer.ui.com
Videostream (RTSP)
Im Generator öffnenLive-Bild in Dashboard, NAS oder Tablet einbinden
curl -s -k -X POST -H 'X-API-Key: TOKEN' -H 'Content-Type: application/json' --data-binary '{"qualities":["high"]}' 'https://KAMERA-IP/proxy/protect/integration/v1/cameras/KAMERA-ID/rtsps-stream'Header X-API-Key: {token}. Legt RTSPS-Freigabe an (qualities: high, medium, low; package nur bei Paketkamera) und liefert die Stream-URLs (Port 7441). Entfernen: DELETE auf denselben Pfad mit Pflicht-Query ?qualities=high (Antwort 204).
Erwartete Antwort: HTTP 200, JSON z. B. {"high":"rtsps://{ip}:7441/…?enableSrtp"}
Als Homematic-Skript (CCU3/OpenCCU)
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("printf '{\042qualities\042:[\042high\042]}' | curl -s -m 10 -k -X POST -H 'X-API-Key: TOKEN' -H 'Content-Type: application/json' --data-binary @- 'https://KAMERA-IP/proxy/protect/integration/v1/cameras/KAMERA-ID/rtsps-stream'");Quelle: developer.ui.com
curl -s -k -H 'X-API-Key: TOKEN' 'https://KAMERA-IP/proxy/protect/integration/v1/cameras/KAMERA-ID/rtsps-stream'Header X-API-Key: {token}. Liest bereits freigegebene RTSPS-URLs aus; nicht freigegebene Qualitäten = null.
Erwartete Antwort: HTTP 200, JSON mit high/medium/low/package (URL oder null)
Als Homematic-Skript (CCU3/OpenCCU)
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("curl -s -m 10 -k -H 'X-API-Key: TOKEN' 'https://KAMERA-IP/proxy/protect/integration/v1/cameras/KAMERA-ID/rtsps-stream'");Quelle: developer.ui.com
Was per URL nicht geht
Aufnahme an, Aufnahme aus, Bewegungserkennung an, Bewegungserkennung aus, Push-Benachrichtigung an, Push-Benachrichtigung aus, E-Mail-Alarm an, E-Mail-Alarm aus, Schwenken / Neigen, Nachtsicht (IR) an, Nachtsicht (IR) aus, Nachtsicht (IR) automatisch, Privatsphäre-Modus an, Privatsphäre-Modus aus, Neustart – laut Dokumentation gibt es dafür keinen URL-Befehl.
Modellreihen
- UniFi Protect G3-SerieUVC-G3
- UniFi Protect G4-Serie (inkl. G4 Doorbell)UVC-G4, UVC-G4-DB
- UniFi Protect G5-SerieUVC-G5
- UniFi Protect G6-SerieUVC-G6
- UniFi Protect AI-SerieUVC-AI
- UniFi Protect PTZ-Kameras (G4 PTZ, G5 PTZ, AI PTZ)UVC-G4-PTZ, UVC-G5-PTZ, UVC-AI-PTZ, PTZ
- UniFi Protect Floodlight (eigenes Light-Gerät)UP-FloodLight, Floodlight
- UniFi Protect Sirene (eigenes Siren-Gerät)Siren
Häufige Fragen
Wie melde ich mich bei UniFi Protect-Befehlen an?
UniFi Protect nutzt Token / API-Key. Im Generator wird die passende Anmeldung automatisch in den curl- und CCU-Befehl eingebaut.
Funktionieren die Befehle mit jedem UniFi Protect-Modell?
Nicht immer. Je Befehl steht dabei, für welche Modellreihe und Firmware er dokumentiert ist. Im Zweifel den Befehl einmal im Browser oder per curl testen und die Antwort der Kamera prüfen.
Quellen
- UniFi Protect API – Getting Started (developer.ui.com)
- UniFi Protect API – Get camera snapshot
- UniFi Protect API – Move PTZ camera to preset
- UniFi Protect API – Create RTSPS streams
- UniFi Protect API – Get RTSPS streams
- UniFi Protect API – Patch camera settings
- UniFi Protect API – Patch light settings (inkl. lokalem curl-Beispiel)
- UniFi Protect API – Play siren
Etwas funktioniert bei dir anders? Gib uns Bescheid – wir prüfen jede Meldung.