Operador de Câmera Reolink
Visão Geral
Superfície primária: reolink-cli (JSON no stdout por padrão). Não inicie o servidor MCP a menos que solicitado. Quando o usuário precisar de acesso não-CLI (navegador, curl, outras linguagens), direcione-o para o POST /api do gateway.
Comandos slash (apenas Claude Code) — prefira estes para intenções fixas/ação única; evite a sobrecarga de mapeamento de intenções:
| Slash | Equivalente | Quando usar |
|---|---|---|
/reolink-cli:status | reolink-cli status | usuário pergunta sobre o estado atual / painel / "como estão as coisas" |
/reolink-cli:features | reolink-cli features | usuário pergunta o que o plugin pode fazer / "o que ele pode fazer" |
/reolink-cli:scan | reolink-cli discover | escanear a rede local / "escanear" |
/reolink-cli:devices | reolink-cli device list | listar câmeras registradas |
/reolink-cli:cache-clean | reolink-cli cache clean dry-run→apply | limpar snapshots antigos / "limpar cache" |
/reolink-cli:update | reolink-cli self-update | atualizar para a versão mais recente (verifica GitHub, sem operação se já estiver atualizada) |
/reolink-cli:uninstall | reolink-cli setup --uninstall --purge --no-interactive | desinstalação completa |
Runtime Claude Code: Deve usar o comando slash quando a intenção do usuário corresponder exatamente a uma destas sete — mais rápido (sem latência de LLM), determinístico e descobrível via autocomplete /.
Outros agentes (Codex / Cursor / Copilot / Gemini): essas superfícies não suportam comandos slash definidos por plugins, então a regra "slash-first" não se aplica — vá direto para executar o comando CLI equivalente reolink-cli … diretamente. O mapeamento de intenções orientado pela skill cuida de todo o resto.
Todos os agentes: Recorra ao encadeamento de comandos CLI orientado pela skill para intenções compostas / difusas ("anunciar quando uma pessoa for detectada", "deixar mais claro") que não são cobertas pela lista de slash / sete ações fixas acima.
O gateway é obrigatório para quase todos os comandos de controle. O CLI roteia através de 127.0.0.1:9000 por padrão (definido em config.toml no diretório de configuração da plataforma — ~/.config/reolink-cli/config.toml no Linux, ~/Library/Application Support/reolink-cli/config.toml no macOS, %APPDATA%\reolink-cli\config.toml no Windows — como gateway-addr). Se você vir gateway connect failed: Connection refused, o gateway não está em execução — inicie-o uma vez:
reolink-cli gateway start --addr 127.0.0.1:9000 &
Funciona sem o gateway: device add|list|update|remove|resolve|show, config init, discover, features, doctor, cache status|clean — tudo que lê a configuração local ou se comunica diretamente com a rede. (Verificado executando cada um sem nenhum gateway ouvindo.) Todo o resto (ping, login, info, config get/set, image, osd, ptz, detect, light, audio, preview, snapshot, vod, events, users, system reboot, system upgrade) precisa do gateway ativo.
Envelopes — analise .ok no CLI, .status no gateway:
| Superfície | Sucesso | Erro |
|---|---|---|
| CLI | {ok:true, command, protocol, data} | {ok:false, error:{code, message, retryable}} (stderr) |
| CLI lote | {command, summary, results:[{camera, host, ok, data, error}]} | ok por destino |
Gateway /api | {status:"success", data} | {status:"error", code, message} (HTTP status == code) |
references/ tem arquivos de receitas com escopo por tópico. Deve carregar apenas o que corresponder à sua tarefa — references/index.md é o roteador. references/troubleshooting.md tem árvores de decisão de diagnóstico para falhas.
Verdade Fundamental (Vinculação)
Proibido afirmar ou implicar como factual: acessibilidade do dispositivo, estado de login, valores de configuração, capacidades, tipos de detecção/IA, contagens de eventos, existência de arquivos VOD, contas de usuário ou qualquer estado observável da câmera — exceto quando derivado da saída JSON de um comando reolink-cli executado ou de uma resposta POST /api do gateway dentro da tarefa atual.
Proibido: listas de demonstração, layouts adivinhados, valores sintéticos, sucesso falso após erros/timeouts, prosa/JSON imitando saída CLI sem uma resposta real, ou "o dispositivo tem X" quando nenhum get/info/inventory/capabilities foi executado.
Deve quando os dados estiverem faltando: declarar o que está faltando e a causa (nenhuma câmera registrada, gateway offline, autenticação falhou, dispositivo offline), então dar um passo concreto de recuperação (da tabela de Recuperação de Erros) ou fazer uma única pergunta esclarecedora. Proibido preencher com padrões com aparência plausível.
Interpretação de Intenções
Resolva ambiguidades antes de escolher um comando. Se ainda não estiver claro, pergunte com opções.
| Usuário diz | Comando | Por que / ressalva |
|---|---|---|
| adicionar um usuário | users add | Conta do dispositivo, NÃO uma entrada de câmera no CLI |
| adicionar uma câmera | device add | Entrada de câmera no CLI (~/.config/reolink-cli/aliases.toml), NÃO uma conta de dispositivo |
| mudar senha | users passwd (padrão) OU device update (credenciais CLI) | Pergunte qual |
| luz piscando | light statusled | LED do corpo |
| visão noturna | light ir | LED IR invisível |
| holofote | light spotlight (manual) OU light whiteled (acionado por alarme) | Mesma lâmpada, fiação diferente |
| muito escuro | image tune --bright primeiro, verifique light ir get se for noite | Ajuste de imagem, não holofote |
| de cabeça para baixo | image flip set --flip | Vertical |
| espelhado | image flip set --mirror | Horizontal |
| máscara | privacy mask | Leia as regiões atuais primeiro |
| renomear | osd set --name (na tela) OU config set device-name (app) | Pergunte qual |
| reiniciar / reboot | system reboot | 30–60s offline |
| atualizar / flash firmware / OTA | system upgrade <file.pak> | ⚠️ risco de brick. Corresponda modelo+hw_ver via info; o GATEWAY lê o arquivo LOCAL; janela automática e stop-and-wait. Detalhe em references/admin.md |
| reset de fábrica | — independente; system upgrade --factory-reset redefine durante um flash | Reset independente não está no CLI; peça ao usuário para usar o aplicativo Reolink |
| expulsar | users remove (permanente) OU users passwd + system reboot (encerrar sessão) | Sessões ativas sobrevivem a users remove até o reboot |
| snapshot | snapshot [--file CAMINHO] | JPEG. Diretórios pais são criados automaticamente pelo binário (desde v0.5.0) — NÃO faça mkdir -p no destino com antecedência. O mesmo para vod download e preview capture --file. |
| lento / quanto tempo / tempo gasto / desempenho / latência / benchmark | benchmark [--iterations N] [--phases ...] [--reuse-session] | p50/p95/p99 por fase: connect, login, info, snapshot. --reuse-session para caminho quente. Detalhe em references/index.md. |
| cpu / memória / carga do dispositivo / a câmera está sobrecarregada / gaguejando | config get performance | Leitura ao vivo do dispositivo: cpuUsedPercent, codeRate, netDataRate. Somente leitura e instantânea — duas chamadas com um segundo de diferença legitimamente diferem. Nem todo modelo implementa isso; aqueles que não respondem com uma rejeição em nível de dispositivo. Distinto de benchmark, que mede o tempo de ida e volta do cliente, não da câmera. |
| rtsp / rtmp / flv endereço / URL de stream / HA / Frigate / go2rtc / VLC | stream url [--kind rtsp,rtmp,flv] [--stream main,sub,ext] [--with-auth] | Padrão --kind rtsp --stream main. --with-auth apenas quando o usuário explicitamente quiser uma URL de uso único. NVR: device expand então --tag <nvr>. Detalhe em references/media.md. |
| nvr com 8 canais / sub-câmeras RLN / canal N | device expand <nvr-name> [--yes | --names A,B,C] | Apenas NVR. Registra uma entrada por canal, marcada com o nome do pai. Após: --tag <nvr-name> distribui. |
| comando rejeitado 400 / "modelo não suporta" / câmera com bateria em um hub / primeiro comando após uma pausa | Nada — o gateway já tenta novamente. attempts na resposta diz qual tentativa funcionou (3 é normal após uma pausa, 1 durante uma rajada) | Uma câmera filha com bateria atrás de um hub dorme e então rejeita comandos com um 400 simples, indistinguível de não suportado. Quando ela dorme não é previsível apenas pelo tempo ocioso (as leituras de um dia diziam ~2 min; mais tarde janelas noturnas a encontravam acordada), então não tente antecipá-la. O que é consistente: uma câmera dormindo custa 3 tentativas fixas (~1.6 s) para acordar, e a requisição recusada é ela mesma o despertar. Se ainda falhar após o orçamento, info → channel.loginState = standby explica — mas esse campo está atrasado, então ele explica uma falha, não pode prevenir uma. |
| lente dupla / duas lentes / bullet+PTZ em uma câmera / grande angular e telefoto / segunda lente | info primeiro (channel.views, channel.dualLens), então --view N em comandos de configuração | --view é um terceiro eixo: --channel seleciona a câmera, --view seleciona a lente, --stream seleciona o perfil de codificação dessa lente. Verificado por visualização: encode, privacy mask, detect motion, PTZ. Não por visualização: snapshot (dispositivo responde 400 para view≥1), preview/stream url (protocolo não tem seletor — estes agora rejeitam --view N em vez de retornar silenciosamente a view 0), image/ISP (compartilhado). Padrão 0 = a única visualização que uma câmera comum tem. |
| preview / dar uma olhada / assistir N minutos / assistir ao vivo | preview play (abre janela ffplay) | PADRÃO para play, não capture. O usuário quer uma janela ao vivo, não um arquivo. |
| gravar N segundos / salvar um clipe / salvar | preview capture --packets ≈N×25 | Apenas quando o usuário disser explicitamente salvar / gravar / exportar. Contagem de pacotes, não segundos; ~25 fps main, ~10 fps sub |
| preview de 60 segundos (ambíguo!) | Se o usuário disser "preview por N segundos/minutos" → preview play --packets N×fps. Se o usuário disser "gravar N segundos" → preview capture. Pergunte se realmente não estiver claro. | Padrão para play quando o verbo é "preview/assistir", capture apenas quando o verbo é "gravar/salvar/exportar" |
| volume | audio volume set (mestre) | Pergunte se eles querem dizer mudo: audio mute |
| alarme mudo | audio mute | Apenas áudio do alarme, não preview |
| sirene / som de alarme / tocar o alarme / assustá-los / fazer bip | audio siren play [--duration N | --times N] [--wait] | Alto + com efeito colateral — confirme primeiro. cmd 263 toque manual (o botão de sirene do aplicativo); o dispositivo para sozinho após --duration s, ou audio siren stop. --wait espera pela duração então para explicitamente e relata stoppedAt + stopAcknowledged — use-o quando você precisar ser capaz de dizer que a sirene parou, não apenas que ela começou. Um 400 de uma câmera com bateria atrás de um hub não é evidência sobre o hardware — uma filha dormindo responde 400 exatamente como um comando não implementado. (Separadamente: em um Home Hub 2 a sirene foi medida sem soar mesmo quando o comando tinha sucesso — veja verified: false abaixo. Nunca afirme que ela soou.) O gateway tenta novamente (medido: uma câmera ociosa >2 min precisa de 3 tentativas, ~1.6 s), e attempts na resposta diz qual tentativa funcionou. Se ainda falhar, info → channel.loginState = standby explica — mas esse campo está atrasado, então é para explicar uma falha, não para verificar antes de uma. Nunca diga a um usuário que sua câmera não tem um recurso com base em um 400; capabilities é o que responde a isso. Mesma regra para light spotlight. "sirene quando movimento for detectado" é diferente — isso é audio siren task (frequentemente 405 em modelos mais novos). |
| armar / desarmar / ausente / em casa / estou saindo / modo cena / parar gravação enquanto estou em casa | scene set <id> (scene list para os ids, scene set --schedule para devolver ao cronograma) | Apenas Hub/NVR. Uma chave rearma todos os canais — ela não toca na configuração de detecção por câmera. scene show primeiro: currentSceneId 0 significa que o cronograma está no controle. Detalhe em references/scene-mode.md. |
| resolução / bitrate / fps / taxa de quadros / h265 / h264 / qualidade do stream / tornar o stream menor | encode set --stream main|sub|third ... | Execute encode capability primeiro — um valor que o dispositivo não anuncia retorna como um 400 simples. stream url não está relacionado (isso apenas constrói uma URL de reprodução). |
| detecção de pessoa | detect ai --type person | Verifique device inventory --capabilities primeiro |
| veículo | detect ai --type vehicle | Nem todos os modelos |
| ativar gravação | record schedule set --enable | |
| config de gravação / parâmetros de gravação / segundos de pré-gravação / tamanho do clipe | record config get | Somente leitura; ciclo / pré/pós-gravação / tempo de pacote |
| cartão SD / cartão de armazenamento / capacidade / espaço livre | storage status | Somente leitura; totalGB / remainGB / formatted / mounted |
| gravação manual / gravar agora / iniciar gravação | — | Não suportado em IPCs Reolink; recorra a record schedule set --enable/--disable |
| baixar ontem / baixar gravação | vod search --since 24h → vod download NOME | |
| baixar 09:45–09:55 / apenas aquele clipe / um intervalo de tempo | vod download --from 2026-09-02T09:45:00 --to 2026-09-02T09:55:00 | Corte no lado da câmera — NÃO baixe a hora inteira e corte |
| algum alarme / algum alarme hoje | events query --since 24h | Requer gateway |
| histórico de eventos mais antigo que o buffer ao vivo / o que aconteceu na semana passada / log de eventos do hub | --channel N events history --since 7d [--types people,motion] (apenas hub/NVR) | Lê o log de eventos gravado do dispositivo (cmd 516/517), não o buffer circular ao vivo de ~500 entradas. IPCs independentes retornam 400. Lista vazia = nenhum evento correspondente; um hub pode ficar brevemente quieto após uso intenso, tente novamente após uma pausa. |
| alerta de voz / anúncio de voz / anunciar quando alguém chegar / tocar voz quando uma pessoa for detectada | audio talk (veja references/voice-alert.md) | Apenas PCM16 LE mono; precisa de capabilities.audioTalk=1 |
| detectar X fazer Y / automação / gatilho de evento / detectar-então-fazer | Deve events monitor init/check/run com regra TOML. Proibido loops ad-hoc em bash while + events query — veja references/event-monitor.md. | |
| o monitor está em execução / uma regra disparou / status do monitor / o que disparou recentemente | events monitor status (pid + cursor + lastFires + por regra expired/secondsRemaining) ou events monitor history --last N [--rule NOME] [--since 30m] | Inspecione o daemon em execução sem reiniciar. Filtros são aplicados antes de --last, então --rule watch --last 20 são os últimos 20 disparos dessa regra, não o que sobra do tail global. |
| assistir esta câmera |
Os trechos foram truncados na entrada original, portanto a tradução para markdown termina aqui. Caso o conteúdo completo do SKILL.md precise ser restaurado, será necessário fornecer o texto completo.