Operador de Cámaras Reolink
Resumen
Superficie principal: reolink-cli (salida JSON por defecto). No inicies el servidor MCP a menos que se te pida explícitamente. Cuando el usuario necesite acceso que no sea por CLI (navegador, curl, otros lenguajes), indícale que use POST /api de la puerta de enlace.
Comandos de barra (solo Claude Code) — prefiérelos para intenciones fijas/de acción única; omite la sobrecarga de mapeo de intenciones:
| Barra | Equivalente | Cuándo usarlo |
|---|---|---|
/reolink-cli:status | reolink-cli status | el usuario pregunta sobre el estado actual / panel de control / "cómo van las cosas" |
/reolink-cli:features | reolink-cli features | el usuario pregunta qué puede hacer el plugin / "qué puede hacer" |
/reolink-cli:scan | reolink-cli discover | escanear la red local / "escanear" |
/reolink-cli:devices | reolink-cli device list | listar cámaras registradas |
/reolink-cli:cache-clean | reolink-cli cache clean dry-run→apply | limpiar instantáneas antiguas / "limpiar caché" |
/reolink-cli:update | reolink-cli self-update | actualizar a la última versión (verifica GitHub, no hace nada si está actualizado) |
/reolink-cli:uninstall | reolink-cli setup --uninstall --purge --no-interactive | desinstalación completa |
Entorno de ejecución de Claude Code: Debe usar el comando de barra cuando la intención del usuario coincida exactamente con una de estas siete opciones — más rápido (sin latencia de LLM), determinista y detectable mediante autocompletado con /.
Otros agentes (Codex / Cursor / Copilot / Gemini): estas superficies no admiten comandos de barra definidos por plugins, por lo que la regla de "primero la barra" no aplica — pasa directamente a ejecutar el comando CLI reolink-cli … equivalente directamente. El mapeo de intenciones basado en el skill se encarga de todo lo demás.
Todos los agentes: Recurre a la cadena de comandos CLI basada en el skill para intenciones compuestas/difusas ("anunciar cuando se detecte una persona", "hacerlo más brillante") que no estén cubiertas por la lista de barras / las siete acciones fijas anteriores.
La puerta de enlace es obligatoria para casi todos los comandos de control. El CLI se enruta a través de 127.0.0.1:9000 por defecto (configurado en config.toml dentro del directorio de configuración de la plataforma — ~/.config/reolink-cli/config.toml en Linux, ~/Library/Application Support/reolink-cli/config.toml en macOS, %APPDATA%\reolink-cli\config.toml en Windows — como gateway-addr). Si ves gateway connect failed: Connection refused, la puerta de enlace no está en ejecución — iníciala una vez:
reolink-cli gateway start --addr 127.0.0.1:9000 &
Funciona sin la puerta de enlace: device add|list|update|remove|resolve|show, config init, discover, features, doctor, cache status|clean — todo lo que lee la configuración local o se comunica directamente con la red. (Verificado ejecutando cada uno sin ninguna puerta de enlace escuchando). Todo lo demás (ping, login, info, config get/set, image, osd, ptz, detect, light, audio, preview, snapshot, vod, events, users, system reboot, system upgrade) necesita que la puerta de enlace esté activa.
Envolventes — analiza .ok en el CLI, .status en la puerta de enlace:
| Superficie | Éxito | Error |
|---|---|---|
| CLI | {ok:true, command, protocol, data} | {ok:false, error:{code, message, retryable}} (stderr) |
| CLI por lotes | {command, summary, results:[{camera, host, ok, data, error}]} | ok por objetivo |
Puerta de enlace /api | {status:"success", data} | {status:"error", code, message} (código HTTP == código) |
references/ contiene archivos de recetas específicos por tema. Debes cargar solo el que coincida con tu tarea — references/index.md es el enrutador. references/troubleshooting.md contiene árboles de decisión de diagnóstico para fallos.
Verdad Fundamental (Vinculación)
Prohibido afirmar o dar a entender como hecho: la accesibilidad del dispositivo, el estado de inicio de sesión, los valores de configuración, las capacidades, los tipos de detección/IA, los recuentos de eventos, la existencia de archivos VOD, las cuentas de usuario o cualquier estado observable de la cámara — excepto cuando se deriven de la salida JSON de un comando reolink-cli ejecutado o de una respuesta POST /api de la puerta de enlace dentro de la tarea actual.
Prohibido: listas de demostración, diseños supuestos, valores sintéticos, éxito falso después de errores/tiempos de espera, prosa/JSON que imite la salida del CLI sin una respuesta real, o "el dispositivo tiene X" cuando no se haya ejecutado ningún get/info/inventory/capabilities.
Debes cuando falten datos: indicar qué falta y la causa (ninguna cámara registrada, puerta de enlace caída, autenticación fallida, dispositivo fuera de línea), luego tomar un paso de recuperación concreto (de la tabla de Recuperación de Errores) o hacer una única pregunta aclaratoria. Prohibido rellenar con valores predeterminados que parezcan plausibles.
Interpretación de Intenciones
Resuelve la ambigüedad antes de elegir un comando. Si aún no está claro, pregunta con opciones.
| El usuario dice | Comando | Por qué / advertencia |
|---|---|---|
| agregar un usuario | users add | Cuenta del dispositivo, NO una entrada de cámara del CLI |
| agregar una cámara | device add | Entrada de cámara del CLI (~/.config/reolink-cli/aliases.toml), NO una cuenta de dispositivo |
| cambiar contraseña | users passwd (predeterminado) O device update (credenciales del CLI) | Pregunta cuál |
| luz parpadeante | light statusled | LED del cuerpo |
| visión nocturna | light ir | LED IR invisible |
| foco | light spotlight (manual) O light whiteled (activado por alarma) | Misma bombilla, cableado diferente |
| demasiado oscuro | image tune --bright primero, verifica light ir get si es de noche | Ajuste de imagen, no foco |
| al revés | image flip set --flip | Vertical |
| imagen reflejada | image flip set --mirror | Horizontal |
| máscara | privacy mask | Lee las regiones actuales primero |
| renombrar | osd set --name (en pantalla) O config set device-name (app) | Pregunta cuál |
| reiniciar / rearrancar | system reboot | 30–60s fuera de línea |
| actualizar / flashear firmware / OTA | system upgrade <file.pak> | ⚠️ Riesgo de brick. Coincide modelo+hw_ver a través de info; la PUERTA DE ENLACE lee el archivo LOCAL; ventana automática/stop-and-wait. Detalle en references/admin.md |
| restablecer valores de fábrica | — independiente; system upgrade --factory-reset restablece durante un flasheo | El restablecimiento independiente no está en el CLI; pide al usuario que use la app de Reolink |
| echar fuera | users remove (permanente) O users passwd + system reboot (desalojar sesión) | Las sesiones activas sobreviven a users remove hasta el reinicio |
| instantánea | snapshot [--file RUTA] | JPEG. Los directorios padre se crean automáticamente por el binario (desde v0.5.0) — NO hagas mkdir -p en el destino. Lo mismo para vod download y preview capture --file. |
| lento / cuánto tiempo / tiempo empleado / rendimiento / latencia / benchmark | benchmark [--iterations N] [--phases ...] [--reuse-session] | p50/p95/p99 por fase: connect, login, info, snapshot. --reuse-session para ruta cálida. Detalle en references/index.md. |
| cpu / memoria / carga del dispositivo / está sobrecargada la cámara / tartamudeo | config get performance | Lectura en vivo del dispositivo: cpuUsedPercent, codeRate, netDataRate. Solo lectura e instantánea: dos llamadas separadas por un segundo difieren legítimamente. No todos los modelos lo implementan; los que no, responden con un rechazo a nivel de dispositivo. Distinto de benchmark, que mide el tiempo de ida y vuelta del cliente, no de la cámara. |
| rtsp / rtmp / flv address / stream URL / HA / Frigate / go2rtc / VLC | stream url [--kind rtsp,rtmp,flv] [--stream main,sub,ext] [--with-auth] | Por defecto --kind rtsp --stream main. --with-auth solo cuando el usuario quiera explícitamente una URL de un solo uso para pegar. NVR: device expand luego --tag <nvr>. Detalle en references/media.md. |
| nvr con 8 canales / subcámaras RLN / canal N | `device expand [--yes | --names A,B,C]` |
| comando rechazado 400 / "el modelo no lo soporta" / cámara de batería en un hub / primer comando después de una pausa | Nada — la puerta de enlace ya reintenta. attempts en la respuesta indica qué intento tuvo éxito (3 es normal después de una pausa, 1 durante una ráfaga) | Un hijo de batería detrás de un hub duerme y luego rechaza comandos con un simple 400, indistinguible de no soportado. Cuándo duerme no es predecible solo por el tiempo de inactividad (las lecturas de un día decían ~2 min; más tarde, ventanas nocturnas lo encontraron despierto), así que no intentes adelantarte. Lo que es consistente: una cámara dormida cuesta 3 intentos fijos (~1.6 s) para despertarse, y la solicitud rechazada es en sí misma el despertador. Si aún falla después del presupuesto, info → channel.loginState = standby lo explica — pero ese campo va con retraso, por lo que explica un fallo, no puede prevenir uno. |
| doble lente / dos lentes / bala+PTZ en una cámara / gran angular y telefoto / segunda lente | info primero (channel.views, channel.dualLens), luego --view N en comandos de configuración | --view es un tercer eje: --channel selecciona la cámara, --view selecciona la lente, --stream selecciona el perfil de codificación de esa lente. Verificado por vista: encode, privacy mask, detect motion, PTZ. No por vista: snapshot (el dispositivo responde 400 para vista ≥1), preview/stream url (el protocolo no tiene selector — estos ahora rechazan --view N en lugar de devolver silenciosamente la vista 0), image/ISP (compartido). Por defecto 0 = la única vista que tiene una cámara normal. |
| preview / echar un vistazo / ver N minutos / ver en vivo | preview play (abre una ventana de ffplay) | POR DEFECTO a play, no a capture. El usuario quiere una ventana en vivo, no un archivo. |
| grabar N segundos / guardar un clip / guardarlo | preview capture --packets ≈N×25 | Solo cuando el usuario diga explícitamente guardar / grabar / exportar. Recuento de paquetes, no segundos; ~25 fps main, ~10 fps sub |
| vista previa de 60 segundos (¡ambiguo!) | Si el usuario dice "vista previa durante N segundos/minutos" → preview play --packets N×fps. Si el usuario dice "grabar N segundos" → preview capture. Pregunta si realmente no está claro. | Por defecto play cuando el verbo es "preview/watch", capture solo cuando el verbo es "record/save/export" |
| volumen | audio volume set (maestro) | Pregunta si se refieren a silenciar: audio mute |
| silenciar alarma | audio mute | Solo audio de alarma, no vista previa |
| sirena / sonido de alarma / hacer sonar la alarma / asustarlos / hacer que pite | **`audio siren play [--duration N | --times N] [--wait]`** |
| armar / desarmar / ausente / en casa / me voy / modo escena / dejar de grabar mientras estoy dentro | scene set <id> (scene list para los ids, scene set --schedule para devolver al horario) | Solo Hub/NVR. Un solo interruptor rearma cada canal — no toca la configuración de detección por cámara. scene show primero: currentSceneId 0 significa que el horario está activo. Detalle en references/scene-mode.md. |
| resolución / bitrate / fps / velocidad de fotogramas / h265 / h264 / calidad de flujo / hacer el flujo más pequeño | **`encode set --stream main | sub |
| detección de personas | detect ai --type person | Verifica device inventory --capabilities primero |
| vehículo | detect ai --type vehicle | No todos los modelos |
| activar grabación | record schedule set --enable | |
| configuración de grabación / parámetros de grabación / pre-grabar segundos / tamaño del clip | record config get | Solo lectura; ciclo / pre/post record / tiempo de paquete |
| tarjeta SD / tarjeta de almacenamiento / capacidad / espacio libre | storage status | Solo lectura; totalGB / remainGB / formatted / mounted |
| grabación manual / grabar ahora / iniciar grabación | — | No compatible en IPCs Reolink; recurre a record schedule set --enable/--disable |
| descargar ayer / descargar grabación | vod search --since 24h → vod download NOMBRE | |
| descargar 09:45–09:55 / solo ese clip / un rango de tiempo | vod download --from 2026-09-02T09:45:00 --to 2026-09-02T09:55:00 | Corte del lado de la cámara — NO descargues la hora completa y recortes |
| alguna alarma / alguna alarma hoy | events query --since 24h | Requiere puerta de enlace |
| historial de eventos más atrás que el búfer en vivo / qué pasó la semana pasada / registro de eventos del hub | --channel N events history --since 7d [--types people,motion] (solo hub/NVR) | Lee el registro de eventos grabados del dispositivo (cmd 516/517), no el anillo en vivo de ~500 entradas. Los IPCs independientes responden 400. Lista vacía = no hay eventos coincidentes; un hub puede quedarse en silencio brevemente después de un uso intensivo, reintenta después de una pausa. |
| alerta de voz / anuncio de voz / anunciar cuando alguien llegue / reproducir voz cuando se detecte una persona | audio talk (consulta references/voice-alert.md) | Solo PCM16 LE mono; necesita capabilities.audioTalk=1 |
| detectar X hacer Y / automatización / disparador de eventos / detectar-luego-hacer | Debe events monitor init/check/run con regla TOML. Prohibido bucles bash while + events query ad-hoc — consulta references/event-monitor.md. | |
| el monitor está en ejecución / se ha disparado una regla / estado del monitor / qué se disparó recientemente | events monitor status (pid + cursor + lastFires + por regla expired/secondsRemaining) o events monitor history --last N [--rule NOMBRE] [--since 30m] | Inspecciona el demonio en ejecución sin reiniciarlo. Los filtros se aplican antes de --last, por lo que --rule watch --last 20 son las últimas 20 activaciones de esa regla, no lo que sobrevive al tail global. |
| ver esta cámara |