Communitygithub.com

reolink/reolink-cli

Outil en ligne de commande officiel pour les caméras IP Reolink, sonnettes et NVR — LAN uniquement, sans cloud. Instantanés, PTZ, URL de flux RTSP/RTMP, audio bidirectionnel (talkback/TTS), détection de mouvement et IA, surveillance d'événements, téléchargement VOD. Sortie JSON et serveur MCP intégré. Fonctionne avec Home Assistant, Frigate et go2rtc.

Qu'est-ce que reolink-cli ?

Reolink Camera Operator vous permet de contrôler et d'interroger l'ensemble de votre parc de caméras Reolink, sonnettes et NVR directement depuis la ligne de commande, sans passer par le cloud. Il expose un ensemble riche de commandes pour la gestion des appareils, les instantanés, le contrôle PTZ, la configuration des flux (RTSP/RTMP/FLV), la détection de mouvement et d'événements IA, la gestion de l'audio (y compris sirène et talkback), le téléchargement de séquences VOD, et bien plus encore. Le tout en sortie JSON structurée, idéale pour l'automatisation et l'intégration dans des systèmes comme Home Assistant ou Frigate. Un serveur MCP intégré permet un accès via API POST, et une passerelle locale (par défaut sur `127.0.0.1:9000`) est nécessaire pour la plupart des commandes actives. L'outil gère intelligemment les scénarios complexes comme les caméras à batterie (qui répondent parfois par une erreur 400 en veille) et les objectifs doubles, en fournissant des mécanismes de repli et de réveil automatiques.

Compatible avec✓Claude Code✓Codex CLI✓Cursor✓Gemini CLI
npx skills add reolink/reolink-cli

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

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ÉquivalentQuand l'utiliser
/reolink-cli:statusreolink-cli statusl'utilisateur demande l'état actuel / tableau de bord / "comment ça va"
/reolink-cli:featuresreolink-cli featuresl'utilisateur demande ce que le plugin peut faire / "qu'est-ce que ça peut faire"
/reolink-cli:scanreolink-cli discoverscanner le réseau local / "scan"
/reolink-cli:devicesreolink-cli device listlister les caméras enregistrées
/reolink-cli:cache-cleanreolink-cli cache clean dry-run→applyeffacer les anciens instantanés / "vider le cache"
/reolink-cli:updatereolink-cli self-updatemettre à jour vers la dernière version (vérifie GitHub, ne fait rien si à jour)
/reolink-cli:uninstallreolink-cli setup --uninstall --purge --no-interactivedé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 :

SurfaceSuccèsErreur
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 ditCommandePourquoi / mise en garde
ajouter un utilisateurusers addCompte de l'appareil, PAS une entrée caméra CLI
ajouter une caméradevice addEntrée caméra CLI (~/.config/reolink-cli/aliases.toml), PAS un compte d'appareil
changer le mot de passeusers passwd (par défaut) OU device update (identifiants CLI)Demander lequel
lumière clignotantelight statusledLED du boîtier
vision nocturnelight irLED IR invisible
projecteurlight spotlight (manuel) OU light whiteled (déclenché par alarme)Même ampoule, câblage différent
trop sombreimage tune --bright d'abord, vérifier light ir get si nuitRéglage de l'image, pas le projecteur
à l'enversimage flip set --flipVertical
miroirimage flip set --mirrorHorizontal
masquerprivacy maskLire les zones actuelles d'abord
renommerosd set --name (à l'écran) OU config set device-name (application)Demander lequel
redémarrer / rebootsystem reboot30–60s hors ligne
mise à niveau / flasher le firmware / OTAsystem 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 flashRéinitialisation autonome non dans la CLI ; demander à l'utilisateur d'utiliser l'application Reolink
déconnecterusers 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 / benchmarkbenchmark [--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 / saccadesconfig get performanceLecture 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 / VLCstream 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 Ndevice 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 pauseRien — 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 objectifinfo 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 directpreview 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 / sauvegarderpreview capture --packets ≈N×25Uniquement 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"
volumeaudio volume set (principal)Demander s'ils veulent dire muet : audio mute
muet alarmeaudio muteAudio d'alarme uniquement, pas la prévisualisation
sirène / son d'alarme / sonner l'alarme / les faire fuir / faire bipaudio 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 dedansscene 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 fluxencode 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 personnedetect ai --type personVérifier device inventory --capabilities d'abord
véhiculedetect ai --type vehiclePas tous les modèles
activer l'enregistrementrecord schedule set --enable
configuration de l'enregistrement / paramètres d'enregistrement / secondes de pré-enregistrement / taille du cliprecord config getLecture seule ; cycle / pré/post record / temps de paquet
carte SD / carte de stockage / capacité / espace librestorage statusLecture 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 enregistrementvod search --since 24h → vod download NAME
télécharger 09:45–09:55 / juste ce clip / une plage horairevod download --from 2026-09-02T09:45:00 --to 2026-09-02T09:55:00Découpage côté caméra — ne TÉLÉCHARGEZ PAS l'heure entière pour la découper
des alarmes / des alarmes aujourd'huievents query --since 24hNé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éeaudio 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-faireDoit 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écemmentevents 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
...

Skills associés