Reolink Kamera Operator
Übersicht
Primäre Oberfläche: reolink-cli (JSON auf stdout standardmäßig). Starten Sie den MCP-Server nicht, es sei denn, es wird explizit danach gefragt. Wenn der Benutzer einen nicht-CLI Zugriff benötigt (Browser, curl, andere Sprachen), verweisen Sie ihn auf das Gateway POST /api.
Schrägstrich-Befehle (nur Claude Code) – bevorzugen Sie diese für feste/einzelne Aktionsabsichten; überspringen Sie den Overhead der Absichtsermittlung:
| Schrägstrich | Äquivalent | Wann verwenden |
|---|---|---|
/reolink-cli:status | reolink-cli status | Benutzer fragt nach aktuellem Zustand / Dashboard / „wie läuft's“ |
/reolink-cli:features | reolink-cli features | Benutzer fragt, was das Plugin kann / „was kann es tun“ |
/reolink-cli:scan | reolink-cli discover | Lokales Netzwerk scannen / „scannen“ |
/reolink-cli:devices | reolink-cli device list | Registrierte Kameras auflisten |
/reolink-cli:cache-clean | reolink-cli cache clean Dry-Run→Anwenden | Alte Schnappschüsse löschen / „Cache leeren“ |
/reolink-cli:update | reolink-cli self-update | Auf die neueste Version aktualisieren (prüft GitHub, keine Änderung, wenn aktuell) |
/reolink-cli:uninstall | reolink-cli setup --uninstall --purge --no-interactive | Vollständige Deinstallation |
Claude Code Laufzeit: Muss den Schrägstrich-Befehl verwenden, wenn die Benutzerabsicht genau einer dieser sieben entspricht – schneller (keine LLM-Latenz), deterministisch und über /-Autovervollständigung auffindbar.
Andere Agenten (Codex / Cursor / Copilot / Gemini): Diese Oberflächen unterstützen keine plugin-definierten Schrägstrich-Befehle, daher gilt die „Schrägstrich-zuerst“-Regel nicht – springen Sie direkt zur Ausführung des entsprechenden reolink-cli … CLI-Befehls. Die fähigkeitsgesteuerte Absichtsermittlung übernimmt alles andere.
Alle Agenten: Zurückfallen auf fähigkeitsgesteuerte CLI-Verkettung für zusammengesetzte / vage Absichten („Ansage, wenn eine Person erkannt wird“, „mach es heller“), die nicht durch die Schrägstrich-Liste / sieben festen Aktionen oben abgedeckt sind.
Das Gateway ist für fast jeden Steuerbefehl zwingend erforderlich. Die CLI leitet standardmäßig über 127.0.0.1:9000 (festgelegt in config.toml im Plattform-Konfigurationsverzeichnis – ~/.config/reolink-cli/config.toml unter Linux, ~/Library/Application Support/reolink-cli/config.toml unter macOS, %APPDATA%\reolink-cli\config.toml unter Windows – als gateway-addr). Wenn Sie „gateway connect failed: Connection refused“ sehen, läuft das Gateway nicht – starten Sie es einmal:
reolink-cli gateway start --addr 127.0.0.1:9000 &
Funktioniert ohne das Gateway: device add|list|update|remove|resolve|show, config init, discover, features, doctor, cache status|clean – alles, was lokale Konfiguration liest oder direkt mit dem Netzwerk kommuniziert. (Verifiziert durch Ausführen jedes Befehls ohne lauschendes Gateway.) Alles andere (ping, login, info, config get/set, image, osd, ptz, detect, light, audio, preview, snapshot, vod, events, users, system reboot, system upgrade) benötigt ein laufendes Gateway.
Hüllen (Envelopes) – .ok bei der CLI parsen, .status beim Gateway:
| Oberfläche | Erfolg | Fehler |
|---|---|---|
| CLI | {ok:true, command, protocol, data} | {ok:false, error:{code, message, retryable}} (stderr) |
| CLI Batch | {command, summary, results:[{camera, host, ok, data, error}]} | Pro-Ziel ok |
Gateway /api | {status:"success", data} | {status:"error", code, message} (HTTP-Status == code) |
references/ enthält themenspezifische Rezeptdateien. Muss nur diejenige laden, die Ihrer Aufgabe entspricht – references/index.md ist der Router. references/troubleshooting.md enthält Diagnose-Entscheidungsbäume für Fehler.
Grundwahrheit (Bindung)
Verboten ist das Behaupten oder Implizieren als Tatsache: Geräteerreichbarkeit, Anmeldestatus, Konfigurationswerte, Fähigkeiten, Erkennungs-/KI-Typen, Ereigniszahlen, VOD-Dateiexistenz, Benutzerkonten oder jeder andere beobachtbare Kamerazustand – außer wenn er aus der JSON-Ausgabe eines ausgeführten reolink-cli Befehls oder einer Gateway POST /api Antwort innerhalb der aktuellen Aufgabe abgeleitet wurde.
Verboten: Demo-artige Listen, angenommene Layouts, synthetische Werte, vorgetäuschte Erfolge nach Fehlern/Timeouts, Prosa/JSON, die CLI-Ausgabe ohne echte Antwort nachahmen, oder „das Gerät hat X“, wenn kein get/info/inventory/capabilities ausgeführt wurde.
Muss bei fehlenden Daten: angeben, was fehlt und die Ursache (keine Kamera registriert, Gateway ausgefallen, Authentifizierung fehlgeschlagen, Gerät offline), dann einen konkreten Wiederherstellungsschritt (aus der Fehlerbehebungstabelle) unternehmen oder eine einzige klärende Frage stellen. Verboten ist das Auffüllen mit plausibel klingenden Standardwerten.
Absichtsermittlung
Lösen Sie Mehrdeutigkeiten auf, bevor Sie einen Befehl auswählen. Wenn immer noch unklar, fragen Sie mit Optionen.
| Benutzer sagt | Befehl | Warum / Einschränkung |
|---|---|---|
| Benutzer hinzufügen | users add | Gerätekonto, KEIN CLI-Kameraeintrag |
| Kamera hinzufügen | device add | CLI-Kameraeintrag (~/.config/reolink-cli/aliases.toml), KEIN Gerätekonto |
| Passwort ändern | users passwd (Standard) ODER device update (CLI-Anmeldedaten) | Fragen, welches |
| Blinklicht | light statusled | Gehäuse-LED |
| Nachtsicht | light ir | Unsichtbare IR-LED |
| Scheinwerfer | light spotlight (manuell) ODER light whiteled (alarmausgelöst) | Gleiche Birne, unterschiedliche Verkabelung |
| zu dunkel | image tune --bright zuerst, light ir get prüfen, wenn Nacht | Bildanpassung, nicht Scheinwerfer |
| auf dem Kopf | image flip set --flip | Vertikal |
| gespiegelt | image flip set --mirror | Horizontal |
| Maske | privacy mask | Zuerst aktuelle Bereiche lesen |
| umbenennen | osd set --name (Bildschirmanzeige) ODER config set device-name (App) | Fragen, welches |
| neu starten / reboot | system reboot | 30–60s offline |
| aktualisieren / Firmware flashen / OTA | system upgrade <file.pak> | ⚠️ Risiko der Gerätebeschädigung. Modell+hw_ver über info abgleichen; GATEWAY liest die LOKALE Datei; automatisch fensterbasiert / Stop-and-Wait. Details in references/admin.md |
| Werksreset | — eigenständig; system upgrade --factory-reset setzt während eines Flashvorgangs zurück | Eigenständiger Reset nicht in der CLI; Benutzer bitten, die Reolink-App zu verwenden |
| rauswerfen | users remove (dauerhaft) ODER users passwd + system reboot (Sitzung beenden) | Aktive Sitzungen überleben users remove bis zum Neustart |
| Schnappschuss | snapshot [--file PFAD] | JPEG. Übergeordnete Verzeichnisse werden automatisch erstellt von der Binärdatei (seit v0.5.0) – führen Sie NICHT vorher mkdir -p für das Ziel aus. Gleiches gilt für vod download und preview capture --file. |
| langsam / wie lange / Zeitaufwand / Leistung / Latenz / Benchmark | benchmark [--iterations N] [--phases ...] [--reuse-session] | Pro-Phase p50/p95/p99: connect, login, info, snapshot. --reuse-session für den Warmpfad. Details in references/index.md. |
| CPU / Speicher / Geräteauslastung / ist die Kamera überlastet / ruckelt | config get performance | Live-Wert vom Gerät: cpuUsedPercent, codeRate, netDataRate. Schreibgeschützt und augenblicklich – zwei Aufrufe im Abstand einer Sekunde unterscheiden sich berechtigterweise. Nicht jedes Modell implementiert es; diejenigen, die es tun, antworten mit einer Ablehnung auf Geräteebene. Zu unterscheiden von benchmark, das die Client-Hin- und Rücklaufzeit misst, nicht die Kamera. |
| rtsp / rtmp / flv Adresse / Stream-URL / HA / Frigate / go2rtc / VLC | stream url [--kind rtsp,rtmp,flv] [--stream main,sub,ext] [--with-auth] | Standard --kind rtsp --stream main. --with-auth nur, wenn der Benutzer explizit eine einmalig einfügbare URL möchte. NVR: device expand dann --tag <nvr>. Details in references/media.md. |
| NVR mit 8 Kanälen / RLN Unterkameras / Kanal N | device expand <nvr-name> [--yes | --names A,B,C] | Nur NVR. Registriert einen Eintrag pro Kanal, getaggt mit dem übergeordneten Namen. Danach: --tag <nvr-name> fächert auf. |
| Befehl abgelehnt 400 / „Modell unterstützt es nicht“ / Batteriekamera an einem Hub / erster Befehl nach einer Pause | Nichts – das Gateway wiederholt bereits. attempts in der Antwort sagt, welcher Versuch durchkam (3 ist normal nach einer Pause, 1 während eines Bursts) | Ein Batterie-Kind hinter einem Hub schläft und lehnt dann Befehle mit einem bloßen 400 ab, nicht zu unterscheiden von nicht unterstützt. Wann es schläft, ist nicht allein aus der Leerlaufzeit vorhersagbar (die Messungen eines Tages sagten ~2 min; spätere Fenster über Nacht fanden es wach), also versuchen Sie nicht, ihm zuvorzukommen. Was konsistent ist: Eine schlafende Kamera kostet pauschal 3 Versuche (~1,6 s) zum Aufwecken, und die verweigerte Anfrage ist selbst das Aufwecken. Wenn es nach dem Budget immer noch fehlschlägt, erklärt info → channel.loginState = standby es – aber dieses Feld hinkt hinterher, also erklärt es einen Fehler, es kann keinen vorab prüfen. |
| Dual-Linse / zwei Linsen / Bullet+PTZ in einer Kamera / Weitwinkel und Tele / zweite Linse | info zuerst (channel.views, channel.dualLens), dann --view N bei Konfigurationsbefehlen | --view ist eine dritte Achse: --channel wählt die Kamera, --view wählt die Linse, --stream wählt das Kodierungsprofil dieser Linse. Pro-Ansicht verifiziert: encode, privacy mask, detect motion, PTZ. Nicht pro-Ansicht: snapshot (Gerät antwortet mit 400 für Ansicht≥1), preview/stream url (Protokoll hat keinen Selektor – diese lehnen jetzt --view N ab, anstatt stillschweigend Ansicht 0 zurückzugeben), image/ISP (geteilt). Standard 0 = die einzige Ansicht, die eine gewöhnliche Kamera hat. |
| Vorschau / ansehen / N Minuten beobachten / Live ansehen | preview play (öffnet ffplay-Fenster) | STANDARDMÄSSIG play, nicht capture. Benutzer möchte ein Live-Fenster, keine Datei. |
| N Sekunden aufzeichnen / einen Clip speichern / speichern | preview capture --packets ≈N×25 | Nur, wenn der Benutzer explizit speichern / aufzeichnen / exportieren sagt. Paketanzahl, nicht Sekunden; ~25 fps Hauptstrom, ~10 fps Unterstrom |
| 60-Sekunden-Vorschau (mehrdeutig!) | Wenn der Benutzer „Vorschau für N Sekunden/Minuten“ sagt → preview play --packets N×fps. Wenn der Benutzer „N Sekunden aufzeichnen“ sagt → preview capture. Fragen, wenn wirklich unklar. | Standardmäßig zu play bei Verb „Vorschau/ansehen“, capture nur bei Verb „aufzeichnen/speichern/exportieren“ |
| Lautstärke | audio volume set (Hauptlautstärke) | Fragen, ob Stummschaltung gemeint ist: audio mute |
| Alarm stumm | audio mute | Nur Alarmaudio, nicht Vorschau |
| Sirene / Alarmton / Alarm auslösen / verscheuchen / piepen lassen | audio siren play [--duration N | --times N] [--wait] | Laut + nebenwirkungsreich – zuerst bestätigen. cmd 263 manueller Klingelton (der Sirenenknopf der App); Gerät stoppt selbst nach --duration s, oder audio siren stop. --wait wartet für die Dauer und stoppt dann explizit und meldet stoppedAt + stopAcknowledged – verwenden Sie es, wenn Sie in der Lage sein müssen zu sagen, dass die Sirene gestoppt wurde, nicht nur, dass sie gestartet wurde. Ein 400 von einer Batteriekamera hinter einem Hub ist kein Beweis für die Hardware – ein schlafendes Kind antwortet mit 400 genau wie ein nicht implementierter Befehl. (Separat: An einem Home Hub 2 wurde gemessen, dass die Sirene überhaupt nicht ertönt, selbst wenn der Befehl erfolgreich ist – siehe verified: false unten. Behaupten Sie niemals, dass sie ertönt ist.) Das Gateway wiederholt (gemessen: Eine Kamera, die >2 min im Leerlauf ist, benötigt 3 Versuche, ~1,6 s), und attempts in der Antwort sagt Ihnen, welcher Versuch durchkam. Wenn es immer noch fehlschlägt, erklärt info → channel.loginState = standby es – aber dieses Feld hinkt hinterher, also dient es der Erklärung eines Fehlers, nicht der Überprüfung davor. Sagen Sie einem Benutzer niemals, dass seiner Kamera eine Funktion fehlt, allein aufgrund eines 400; capabilities beantwortet das. Gleiche Regel für light spotlight. „Sirene bei Bewegungserkennung“ ist anders – das ist audio siren task Verknüpfung (oft 405 bei neueren Modellen). |
| scharf / unscharf / abwesend / zu Hause / ich gehe / Szenenmodus / Aufnahme stoppen, während ich da bin | scene set <id> (scene list für die IDs, scene set --schedule zur Rückgabe an den Zeitplan) | Nur Hub/NVR. Ein Schalter schaltet jeden Kanal scharf – es berührt nicht die kameraspezifische Erkennungskonfiguration. scene show zuerst: currentSceneId 0 bedeutet, dass der Zeitplan steuert. Details in references/scene-mode.md. |
| Auflösung / Bitrate / fps / Bildrate / h265 / h264 / Stream-Qualität / Stream verkleinern | encode set --stream main|sub|third ... | Führen Sie zuerst encode capability aus – ein Wert, den das Gerät nicht bewirbt, wird mit einem bloßen 400 beantwortet. stream url ist nicht verwandt (das erstellt nur eine Wiedergabe-URL). |
| Personenerkennung | detect ai --type person | Zuerst device inventory --capabilities prüfen |
| Fahrzeug | detect ai --type vehicle | Nicht alle Modelle |
| Aufnahme einschalten | record schedule set --enable | |
| Aufnahmekonfig. / Aufnahmeparameter / Voraufnahme-Sekunden / Clip-Größe | record config get | Schreibgeschützt; Zyklus / Vor-/Nachaufnahme / Paketzeit |
| SD-Karte / Speicherkarte / Kapazität / freier Speicher | storage status | Schreibgeschützt; totalGB / remainGB / formatiert / eingehängt |
| manuelle Aufnahme / jetzt aufnehmen / Aufnahme starten | — | Nicht unterstützt auf Reolink IPCs; zurückfallen auf record schedule set --enable/--disable |
| gestern herunterladen / Aufnahme herunterladen | vod search --since 24h → vod download NAME | |
| 09:45–09:55 herunterladen / nur diesen Clip / einen Zeitbereich | vod download --from 2026-09-02T09:45:00 --to 2026-09-02T09:55:00 | Kameraseitiger Schnitt – NICHT die ganze Stunde herunterladen und trimmen |
| irgendwelche Alarme / irgendwelche Alarme heute | events query --since 24h | Erfordert Gateway |
| Ereignisverlauf weiter zurück als der Live-Puffer / was letzte Woche passiert ist / Hub-Ereignisprotokoll | --channel N events history --since 7d [--types people,motion] (nur Hub/NVR) | Liest das aufgezeichnete Ereignisprotokoll des Geräts (cmd 516/517), nicht den ~500 Einträge umfassenden Live-Ring. Eigenständige IPCs antworten mit 400. Leere Liste = keine passenden Ereignisse; ein Hub kann nach starker Nutzung kurzzeitig ruhig werden, nach einer Pause erneut versuchen. |
| Sprachansage / Sprachdurchsage / ansagen, wenn jemand ankommt / Sprache abspielen, wenn eine Person erkannt wird | audio talk (siehe references/voice-alert.md) | Nur PCM16 LE Mono; benötigt capabilities.audioTalk=1 |
| X erkennen und Y tun / Automatisierung / Ereignisauslöser / erkennen-dann-tun | Muss events monitor init/check/run mit TOML-Regel verwenden. Verboten sind Ad-hoc-Bash-while + events query-Schleifen – siehe references/event-monitor.md. | |
| läuft der Monitor / hat eine Regel ausgelöst / Monitor-Status / was wurde kürzlich ausgelöst | events monitor status (pid + cursor + lastFires + pro-Regel expired/secondsRemaining) oder events monitor history --last N [--rule NAME] [--since 30m] | Den laufenden Daemon inspizieren, ohne ihn neu zu starten. Filter werden vor --last angewendet, also ist --rule watch --last 20 die letzten 20 Auslösungen dieser Regel, nicht das, was den globalen Tail überlebt. |
Fehlerbehandlung
| Fehler | Ursache | Wiederherstellung |
|---|---|---|
gateway connect refused | Gateway läuft nicht | reolink-cli gateway start --addr 127.0.0.1:9000 & |
ok:false (CLI) | Siehe error.message | --debug erneut versuchen |
status:'error' (Gateway) | Siehe code + message | HTTP-Status == code |
| 400 auf einem Befehl | Nicht unterstütztes Modell ODER schlafende Batteriekamera | Zuerst capabilities prüfen; wenn Batterie: erneut versuchen (Gateway wiederholt bereits) |
channel.loginState = standby | Batteriekamera schläft | Gateway wiederholt automatisch; keine Aktion erforderlich |