Opérateur de Caméra Reolink
Aperçu
Surface principale : reolink-cli (stdout JSON par défaut). Ne démarrez pas le serveur MCP sauf si demandé. Lorsque l'utilisateur a besoin d'un accès autre que CLI (navigateur, curl, autres langages), orientez-le vers la passerelle POST /api.
Commandes slash (Claude Code uniquement) — privilégiez celles-ci pour les intentions fixes/à action unique ; évitez la surcharge de mappage d'intention :
| Slash | Équivalent | Quand l'utiliser |
|---|---|---|
/reolink-cli:status | reolink-cli status | l'utilisateur demande l'état actuel / tableau de bord / "comment ça va" |
/reolink-cli:features | reolink-cli features | l'utilisateur demande ce que le plugin peut faire / "qu'est-ce que ça peut faire" |
/reolink-cli:scan | reolink-cli discover | scanner le réseau local / "scan" |
/reolink-cli:devices | reolink-cli device list | lister les caméras enregistrées |
/reolink-cli:cache-clean | reolink-cli cache clean dry-run→apply | effacer les anciens instantanés / "vider le cache" |
/reolink-cli:update | reolink-cli self-update | mettre à jour vers la dernière version (vérifie GitHub, ne fait rien si à jour) |
/reolink-cli:uninstall | reolink-cli setup --uninstall --purge --no-interactive | désinstallation complète |
Runtime Claude Code : Doit utiliser la commande slash lorsque l'intention de l'utilisateur correspond exactement à l'un de ces sept cas — plus rapide (pas de latence LLM), déterministe, et découvrable via l'autocomplétion /.
Autres agents (Codex / Cursor / Copilot / Gemini) : ces surfaces ne prennent pas en charge les commandes slash définies par le plugin, donc la règle "slash d'abord" ne s'applique pas — passez directement à l'exécution de la commande CLI reolink-cli … équivalente. Le mappage d'intention basé sur les compétences gère tout le reste.
Tous les agents : Repliez-vous sur l'enchaînement de commandes CLI basé sur les compétences pour les intentions composées / floues ("annoncer quand une personne est détectée", "rendre plus lumineux") qui ne sont pas couvertes par la liste des commandes slash / les sept actions fixes ci-dessus.
La passerelle est obligatoire pour presque toutes les commandes de contrôle. La CLI route via 127.0.0.1:9000 par défaut (défini dans config.toml sous le répertoire de configuration de la plateforme — ~/.config/reolink-cli/config.toml sur Linux, ~/Library/Application Support/reolink-cli/config.toml sur macOS, %APPDATA%\reolink-cli\config.toml sur Windows — comme gateway-addr). Si vous voyez gateway connect failed: Connection refused, la passerelle n'est pas en cours d'exécution — démarrez-la une fois :
reolink-cli gateway start --addr 127.0.0.1:9000 &
Fonctionne sans la passerelle : device add|list|update|remove|resolve|show, config init, discover, features, doctor, cache status|clean — tout ce qui lit la configuration locale ou communique directement avec le réseau. (Vérifié en exécutant chacune sans passerelle à l'écoute.) Tout le reste (ping, login, info, config get/set, image, osd, ptz, detect, light, audio, preview, snapshot, vod, events, users, system reboot, system upgrade) nécessite que la passerelle soit active.
Enveloppes — analysez .ok sur CLI, .status sur passerelle :
| Surface | Succès | Erreur |
|---|---|---|
| CLI | {ok:true, command, protocol, data} | {ok:false, error:{code, message, retryable}} (stderr) |
| CLI batch | {command, summary, results:[{camera, host, ok, data, error}]} | ok par cible |
Passerelle /api | {status:"success", data} | {status:"error", code, message} (statut HTTP == code) |
references/ contient des fichiers de recettes par sujet. Doit charger uniquement celui correspondant à votre tâche — references/index.md est le routeur. references/troubleshooting.md contient des arbres de décision de diagnostic pour les échecs.
Vérité Terrain (Liaison)
Interdit d'affirmer ou d'impliquer comme factuel : l'accessibilité de l'appareil, l'état de connexion, les valeurs de configuration, les capacités, les types de détection/IA, les nombres d'événements, l'existence de fichiers VOD, les comptes utilisateurs, ou tout état observable de la caméra — sauf lorsqu'il est dérivé de la sortie JSON d'une commande reolink-cli exécutée ou d'une réponse POST /api de la passerelle dans la tâche en cours.
Interdit : listes de type démo, mises en page supposées, valeurs synthétiques, faux succès après des erreurs/délais, prose/JSON imitant une sortie CLI sans réponse réelle, ou "l'appareil a X" alors qu'aucune commande get/info/inventory/capabilities n'a été exécutée.
Doit lorsque les données manquent : indiquer ce qui manque et la cause (aucune caméra enregistrée, passerelle hors ligne, échec d'authentification, appareil hors ligne), puis prendre une mesure de récupération concrète (à partir du tableau de Récupération d'Erreur) ou poser une seule question de clarification. Interdit de combler avec des valeurs par défaut plausibles.
Interprétation de l'Intention
Résolvez l'ambiguïté avant de choisir une commande. Si ce n'est toujours pas clair, demandez avec des options.
| L'utilisateur dit | Commande | Pourquoi / mise en garde |
|---|---|---|
| ajouter un utilisateur | users add | Compte de l'appareil, PAS une entrée caméra CLI |
| ajouter une caméra | device add | Entrée caméra CLI (~/.config/reolink-cli/aliases.toml), PAS un compte d'appareil |
| changer le mot de passe | users passwd (par défaut) OU device update (identifiants CLI) | Demander lequel |
| lumière clignotante | light statusled | LED du boîtier |
| vision nocturne | light ir | LED IR invisible |
| projecteur | light spotlight (manuel) OU light whiteled (déclenché par alarme) | Même ampoule, câblage différent |
| trop sombre | image tune --bright d'abord, vérifier light ir get si nuit | Réglage de l'image, pas le projecteur |
| à l'envers | image flip set --flip | Vertical |
| miroir | image flip set --mirror | Horizontal |
| masquer | privacy mask | Lire les zones actuelles d'abord |
| renommer | osd set --name (à l'écran) OU config set device-name (application) | Demander lequel |
| redémarrer / reboot | system reboot | 30–60s hors ligne |
| mise à niveau / flasher le firmware / OTA | system upgrade <file.pak> | ⚠️ risque de brick. Faire correspondre le modèle+hw_ver via info ; la PASSERELLE lit le fichier LOCAL ; fenêtrage automatique stop-and-wait. Détails dans references/admin.md |
| réinitialisation d'usine | — autonome ; system upgrade --factory-reset réinitialise pendant un flash | Réinitialisation autonome non dans la CLI ; demander à l'utilisateur d'utiliser l'application Reolink |
| déconnecter | users remove (permanent) OU users passwd + system reboot (expulser la session) | Les sessions actives survivent à users remove jusqu'au redémarrage |
| instantané | snapshot [--file CHEMIN] | JPEG. Les répertoires parents sont créés automatiquement par le binaire (depuis v0.5.0) — ne PAS faire de mkdir -p sur la destination. Idem pour vod download et preview capture --file. |
| lent / combien de temps / temps pris / performance / latence / benchmark | benchmark [--iterations N] [--phases ...] [--reuse-session] | p50/p95/p99 par phase : connect, login, info, snapshot. --reuse-session pour le chemin chaud. Détails dans references/index.md. |
| cpu / mémoire / charge de l'appareil / la caméra est-elle surchargée / saccades | config get performance | Lecture en direct de l'appareil : cpuUsedPercent, codeRate, netDataRate. Lecture seule et instantanée — deux appels à une seconde d'intervalle diffèrent légitimement. Tous les modèles ne l'implémentent pas ; ceux qui le font répondent par un rejet au niveau de l'appareil. Distinct de benchmark, qui mesure le temps aller-retour du client, pas celui de la caméra. |
| rtsp / rtmp / flv addresse / URL de flux / HA / Frigate / go2rtc / VLC | stream url [--kind rtsp,rtmp,flv] [--stream main,sub,ext] [--with-auth] | Par défaut --kind rtsp --stream main. --with-auth uniquement lorsque l'utilisateur veut explicitement une URL copiable en un clic. NVR : device expand puis --tag <nvr>. Détails dans references/media.md. |
| nvr avec 8 canaux / sous-caméras RLN / canal N | device expand <nom-nvr> [--yes | --names A,B,C] | NVR uniquement. Enregistre une entrée par canal, étiquetée avec le nom parent. Après : --tag <nom-nvr> se diffuse. |
| commande rejetée 400 / "le modèle ne le supporte pas" / caméra à batterie sur un hub / première commande après une pause | Rien — la passerelle réessaie déjà. attempts dans la réponse indique quelle tentative a réussi (3 est normal après une pause, 1 pendant une rafale) | Un enfant à batterie derrière un hub dort puis rejette les commandes avec un simple 400, impossible à distinguer d'une non prise en charge. Quand il dort n'est pas prévisible à partir du seul temps d'inactivité (les lectures d'un jour indiquaient ~2 min ; plus tard, des fenêtres nocturnes l'ont trouvé éveillé), donc n'essayez pas de le préempter. Ce qui est cohérent : une caméra qui dort coûte 3 tentatives plates (~1.6 s) pour se réveiller, et la requête refusée est elle-même le réveil. Si elle échoue encore après le budget, info → channel.loginState = standby l'explique — mais ce champ est en retard, donc il explique un échec, il ne peut pas en faire une vérification préalable. |
| double objectif / deux objectifs / bullet+PTZ dans une seule caméra / grand-angle et téléobjectif / deuxième objectif | info d'abord (channel.views, channel.dualLens), puis --view N sur les commandes de configuration | --view est un troisième axe : --channel sélectionne la caméra, --view sélectionne l'objectif, --stream sélectionne le profil d'encodage de cet objectif. Vérifié par vue : encode, privacy mask, detect motion, PTZ. Pas par vue : snapshot (l'appareil répond 400 pour view≥1), preview/stream url (le protocole n'a pas de sélecteur — ceux-ci rejettent maintenant --view N plutôt que de renvoyer silencieusement la vue 0), image/ISP (partagé). Par défaut 0 = la seule vue d'une caméra ordinaire. |
| prévisualiser / jeter un œil / regarder N minutes / regarder en direct | preview play (ouvre une fenêtre ffplay) | PAR DÉFAUT à play, pas capture. L'utilisateur veut une fenêtre en direct, pas un fichier. |
| enregistrer N secondes / sauvegarder un clip / sauvegarder | preview capture --packets ≈N×25 | Uniquement lorsque l'utilisateur dit explicitement sauvegarder / enregistrer / exporter. Nombre de paquets, pas de secondes ; ~25 ips main, ~10 ips sub |
| prévisualisation de 60 secondes (ambigu !) | Si l'utilisateur dit "prévisualiser pendant N secondes/minutes" → preview play --packets N×fps. Si l'utilisateur dit "enregistrer N secondes" → preview capture. Demander si vraiment pas clair. | Par défaut à play quand le verbe est "prévisualiser/regarder", capture uniquement quand le verbe est "enregistrer/sauvegarder/exporter" |
| volume | audio volume set (principal) | Demander s'ils veulent dire muet : audio mute |
| muet alarme | audio mute | Audio d'alarme uniquement, pas la prévisualisation |
| sirène / son d'alarme / sonner l'alarme / les faire fuir / faire bip | audio siren play [--duration N | --times N] [--wait] | Fort + avec effets secondaires — confirmer d'abord. cmd 263 sonnerie manuelle (le bouton sirène de l'application) ; l'appareil s'arrête tout seul après --duration s, ou audio siren stop. --wait attend la durée puis s'arrête explicitement et rapporte stoppedAt + stopAcknowledged — utilisez-le lorsque vous devez pouvoir dire que la sirène s'est arrêtée, pas seulement qu'elle a commencé. Un 400 d'une caméra à batterie derrière un hub n'est pas une preuve concernant le matériel — un enfant endormi répond 400 exactement comme une commande non implémentée. (Par ailleurs : sur un Home Hub 2, la sirène s'est avérée ne pas sonner du tout même lorsque la commande réussit — voir verified: false ci-dessous. Ne prétendez jamais qu'elle a sonné.) La passerelle réessaie (mesuré : une caméra inactive >2 min nécessite 3 tentatives, ~1.6 s), et attempts dans la réponse vous indique quelle tentative a réussi. Si elle échoue encore, info → channel.loginState = standby l'explique — mais ce champ est en retard, donc il sert à expliquer un échec, pas à vérifier avant. Ne dites jamais à un utilisateur que sa caméra manque d'une fonctionnalité sur la foi d'un 400 ; capabilities est ce qui répond à cela. Même règle pour light spotlight. "sirène quand un mouvement est détecté" est différent — c'est audio siren task (souvent 405 sur les modèles plus récents). |
| armer / désarmer / absent / à la maison / je pars / mode scène / arrêter l'enregistrement pendant que je suis dedans | scene set <id> (scene list pour les ids, scene set --schedule pour rendre la main au planning) | Hub/NVR uniquement. Un seul interrupteur réarme tous les canaux — il ne touche pas à la configuration de détection par caméra. scene show d'abord : currentSceneId 0 signifie que le planning pilote. Détails dans references/scene-mode.md. |
| résolution / débit / ips / images par seconde / h265 / h264 / qualité du flux / réduire la taille du flux | encode set --stream main|sub|third ... | Exécutez encode capability d'abord — une valeur que l'appareil n'annonce pas revient comme un simple 400. stream url n'est pas lié (cela construit uniquement une URL de lecture). |
| détection de personne | detect ai --type person | Vérifier device inventory --capabilities d'abord |
| véhicule | detect ai --type vehicle | Pas tous les modèles |
| activer l'enregistrement | record schedule set --enable | |
| configuration de l'enregistrement / paramètres d'enregistrement / secondes de pré-enregistrement / taille du clip | record config get | Lecture seule ; cycle / pré/post record / temps de paquet |
| carte SD / carte de stockage / capacité / espace libre | storage status | Lecture seule ; totalGB / remainGB / formatted / mounted |
| enregistrement manuel / enregistrer maintenant / démarrer l'enregistrement | — | Non supporté sur les IPC Reolink ; repli sur record schedule set --enable/--disable |
| télécharger hier / télécharger un enregistrement | vod search --since 24h → vod download NAME | |
| télécharger 09:45–09:55 / juste ce clip / une plage horaire | vod download --from 2026-09-02T09:45:00 --to 2026-09-02T09:55:00 | Découpage côté caméra — ne TÉLÉCHARGEZ PAS l'heure entière pour la découper |
| des alarmes / des alarmes aujourd'hui | events query --since 24h | Nécessite la passerelle |
| historique des événements plus loin que le buffer en direct / ce qui s'est passé la semaine dernière / journal des événements du hub | --channel N events history --since 7d [--types people,motion] (hub/NVR uniquement) | Lit le journal des événements enregistré de l'appareil (cmd 516/517), pas le ring en direct de ~500 entrées. Les IPC autonomes 400. Liste vide = aucun événement correspondant ; un hub peut devenir brièvement silencieux après une utilisation intensive, réessayez après une pause. |
| alerte vocale / annonce vocale / annoncer quand quelqu'un arrive / jouer une voix quand une personne est détectée | audio talk (voir references/voice-alert.md) | PCM16 LE mono uniquement ; nécessite capabilities.audioTalk=1 |
| détecter X faire Y / automatisation / déclencheur d'événement / détecter-puis-faire | Doit events monitor init/check/run avec règle TOML. Interdit les boucles bash ad-hoc while + events query — voir references/event-monitor.md. | |
| le moniteur tourne-t-il / une règle a-t-elle été déclenchée / statut du moniteur / qu'est-ce qui a été déclenché récemment | events monitor status (pid + curseur + lastFires + per-rule expired/secondsRemaining) ou events monitor history --last N [--rule NOM] [--since 30m] | Inspecter le démon en cours sans redémarrer. Les filtres s'appliquent avant --last, donc --rule watch --last 20 correspond aux 20 derniers déclenchements de cette règle, pas à ce qui survit à la queue globale. |
| surveiller cette caméra | ||
| ... |