No Android 10+ sem localizacao o networkId vem -1, mas o RSSI e valido. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Carinha Control Panel
Robô de mesa: o rosto roda num Galaxy S10 (app Android), o servidor num Orange Pi Zero 3 (Python, só biblioteca padrão) e o painel em qualquer navegador da rede. O mesmo servidor comanda um braço de 7 articulações por um PCA9685 (I²C) e conversa por Gemini ou Qwen local.
Painel: http://192.168.1.35:8100/
PC / celular (navegador) Orange Pi :8100 Galaxy S10 (app)
┌──────────────────────┐ HTTP ┌──────────────────────┐ HTTP ┌──────────────────┐
│ painel Svelte (web/) │ ───────► │ kiosk-server.py │ ◄─────── │ carinha.html │
│ 1 EventSource │ ◄─SSE─── │ /eventos /estado │ ──SSE──► │ (rosto) │
│ WebRTC ◄────────────┼──────────┼── sinalização /rtc ──┼──────────┼─► câmera │
└──────────────────────┘ │ braço · servos (I²C) │ └──────────────────┘
│ conversa · reações │
└──────────────────────┘
O painel
Quatro áreas + ajustes, todas alimentadas por um fluxo SSE (/eventos), sem polling:
| Área | O que tem |
|---|---|
| Ao vivo | Câmera do celular (WebRTC) e rosto lado a lado, gestos favoritos, aparência, sensores, IA local, acontecimentos |
| Conversa | Chat com voz, motor de IA, memória (lembranças + rotina) |
| Reações | Biblioteca (criar, editar, desfazer), criar com Gemini, todos os gestos, diário |
| Movimento | Braço com homem-morto, sequências, posturas, calibração e diagnóstico do PCA9685 |
| Ajustes | Celular (agrupado, com busca), IA e chave Gemini, token, sistema |
Controles que valem em qualquer tela:
- Parar tudo (botão vermelho,
Shift+EspaçoouEscduas vezes): desliga todos os servos, para reações e acalma o rosto. Os motores ficam travados até Rearmar. - Ctrl+K: paleta com gestos, rostos, cores, telas, ações e posturas.
- 1–9: gestos favoritos (fixe com a estrela em Reações › Gestos). g + letra navega
(
g vAo vivo,g cConversa,g rReações,g mMovimento,g aAjustes). - O braço só se move enquanto você segura o botão ou o slider; ao soltar, os motores desligam em menos de meio segundo. Detalhes em docs/PAINEL.md.
Usar
iniciar.batconfere o Orange Pi e abre o painel.- No celular, toque longo › Mudar o servidor ›
http://192.168.1.35:8100. - Se a placa tiver token (recomendado, veja docs/SEGURANCA.md): toque longo › Token do servidor no celular, e o painel pede o token uma vez.
Desenvolver
# servidor local (sem I²C ele avisa "PCA9685 indisponível")
python kiosk-server.py --porta 8100
# painel com recarga automática, falando com o servidor local ou com a placa
cd web; npm install
npm run dev # usa http://127.0.0.1:8100
$env:CARINHA_SERVIDOR='http://192.168.1.35:8100'; npm run dev
Publicar na placa: .\deploy.ps1 (compila o painel, faz backup e reinicia o serviço).
Verificações
python -m pytest tests -q --ignore-glob='*browser*' # servidor: token, SSE, E-Stop, trava, módulos
cd web; npm run check; npm test; npm run build; cd .. # tipos, lógica pura e build do painel
python tests/test_painel_web_browser.py # painel de ponta a ponta (Playwright)
python tests/test_rtc_browser.py # WebRTC real com câmera sintética
python tests/test_browser.py # rosto (carinha.html)
node tests/test_qualidade.js # qualidade automática do vídeo
python android/build-apk.py # APK (precisa de keystore e libs nativas)
tests/test_tracking_browser.py precisa dos modelos (python obter-rastreamento.py) e das
imagens de teste em ../work/tracking-fixtures.
Documentos
Painel · Segurança · Orange Pi · Braço · Conversa · IA local · Vídeo · Rastreamento · Repositório · Registro