Communitygithub.com

reolink/reolink-cli

Ferramenta oficial de linha de comando para câmeras IP Reolink, campainhas e NVRs — apenas LAN, sem nuvem. Snapshots, PTZ, URLs de stream RTSP/RTMP, áudio bidirecional (talkback/TTS), detecção de movimento e IA, monitoramento de eventos, download de VOD. Saída JSON e um servidor MCP embutido. Funciona com Home Assistant, Frigate e go2rtc.

O que é reolink-cli?

O Reolink Camera Operator é uma skill que fornece uma interface de linha de comando completa e um servidor MCP (Model Context Protocol) para controlar dispositivos Reolink (câmeras IP, campainhas, NVRs) puramente em rede local, sem dependência de nuvem. Ele permite executar operações como captura de snapshots, controle PTZ, obtenção de URLs de stream (RTSP/RTMP/FLV), áudio bidirecional (talkback/sirene), detecção de movimento e IA, consulta e download de eventos/VOD, e muito mais. A skill é projetada para agentes de IA como Claude Code, Codex, Cursor, Copilot e Gemini, com suporte a comandos slash no Claude Code para ações rápidas e determinísticas, enquanto para outros agentes ela executa os comandos CLI equivalentes diretamente. Um gateway local (padrão em 127.0.0.1:9000) é necessário para a maioria dos comandos de controle, exceto para operações de configuração e descoberta. A saída é sempre em JSON, facilitando a integração com outras ferramentas. A skill também inclui um roteador de intenções baseado em documentação, que ajuda a resolver ambiguidades e mapear solicitações do usuário para os comandos corretos, garantindo que nenhum estado do dispositivo seja inferido sem uma execução real de comando.

Funciona com✓Claude Code✓Codex CLI✓Cursor✓Gemini CLI
npx skills add reolink/reolink-cli

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

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:

SlashEquivalenteQuando usar
/reolink-cli:statusreolink-cli statususuário pergunta sobre o estado atual / painel / "como estão as coisas"
/reolink-cli:featuresreolink-cli featuresusuário pergunta o que o plugin pode fazer / "o que ele pode fazer"
/reolink-cli:scanreolink-cli discoverescanear a rede local / "escanear"
/reolink-cli:devicesreolink-cli device listlistar câmeras registradas
/reolink-cli:cache-cleanreolink-cli cache clean dry-run→applylimpar snapshots antigos / "limpar cache"
/reolink-cli:updatereolink-cli self-updateatualizar para a versão mais recente (verifica GitHub, sem operação se já estiver atualizada)
/reolink-cli:uninstallreolink-cli setup --uninstall --purge --no-interactivedesinstalaçã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ícieSucessoErro
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 dizComandoPor que / ressalva
adicionar um usuáriousers addConta do dispositivo, NÃO uma entrada de câmera no CLI
adicionar uma câmeradevice addEntrada de câmera no CLI (~/.config/reolink-cli/aliases.toml), NÃO uma conta de dispositivo
mudar senhausers passwd (padrão) OU device update (credenciais CLI)Pergunte qual
luz piscandolight statusledLED do corpo
visão noturnalight irLED IR invisível
holofotelight spotlight (manual) OU light whiteled (acionado por alarme)Mesma lâmpada, fiação diferente
muito escuroimage tune --bright primeiro, verifique light ir get se for noiteAjuste de imagem, não holofote
de cabeça para baixoimage flip set --flipVertical
espelhadoimage flip set --mirrorHorizontal
máscaraprivacy maskLeia as regiões atuais primeiro
renomearosd set --name (na tela) OU config set device-name (app)Pergunte qual
reiniciar / rebootsystem reboot30–60s offline
atualizar / flash firmware / OTAsystem 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 flashReset independente não está no CLI; peça ao usuário para usar o aplicativo Reolink
expulsarusers remove (permanente) OU users passwd + system reboot (encerrar sessão)Sessões ativas sobrevivem a users remove até o reboot
snapshotsnapshot [--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 / benchmarkbenchmark [--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 / gaguejandoconfig get performanceLeitura 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 / VLCstream 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 Ndevice 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 pausaNada — 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 lenteinfo 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 vivopreview 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 / salvarpreview capture --packets ≈N×25Apenas 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"
volumeaudio volume set (mestre)Pergunte se eles querem dizer mudo: audio mute
alarme mudoaudio muteApenas áudio do alarme, não preview
sirene / som de alarme / tocar o alarme / assustá-los / fazer bipaudio 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 casascene 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 menorencode 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 pessoadetect ai --type personVerifique device inventory --capabilities primeiro
veículodetect ai --type vehicleNem todos os modelos
ativar gravaçãorecord schedule set --enable
config de gravação / parâmetros de gravação / segundos de pré-gravação / tamanho do cliperecord config getSomente leitura; ciclo / pré/pós-gravação / tempo de pacote
cartão SD / cartão de armazenamento / capacidade / espaço livrestorage statusSomente 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çãovod search --since 24h → vod download NOME
baixar 09:45–09:55 / apenas aquele clipe / um intervalo de tempovod download --from 2026-09-02T09:45:00 --to 2026-09-02T09:55:00Corte no lado da câmera — NÃO baixe a hora inteira e corte
algum alarme / algum alarme hojeevents query --since 24hRequer 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 detectadaaudio 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-fazerDeve 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 recentementeevents 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.

Habilidades Relacionadas