From 33e50ca2743d11193c4961a07368c6d3ed6d7996 Mon Sep 17 00:00:00 2001 From: minguezsanzjuanjose Date: Sun, 2 Aug 2026 22:46:40 +0200 Subject: [PATCH] superguardado: README + AGENTS + lecciones aprendidas vigilancia (26 lecciones) --- AGENTS.md | 2 + README.md | 90 +++++++++++++++++-------- docs/lecciones_aprendidas_vigilancia.md | 73 ++++++++++++++++++++ 3 files changed, 137 insertions(+), 28 deletions(-) create mode 100644 docs/lecciones_aprendidas_vigilancia.md diff --git a/AGENTS.md b/AGENTS.md index f476804..c3eec30 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -90,6 +90,7 @@ Start-Process powershell -WindowStyle Hidden -ArgumentList '-Command', 'python C | `ejecuta alarma Twilio` | Modo interactivo: pedir credenciales (o usar .env), 2 telefonos, estrategia (secuencial/paralelo/solo 1/solo 2), ejecutar llamada Twilio con AMD y reportar resultado. Ejecutar con: `python alarma_twilio/cli.py` en cualquier equipo con el repo clonado. | | `!alarma +numero` desde Telegram | Enviar `!alarma +34657866417` al bot @? (token en .env) desde el iPad/móvil → el VPS lo escucha vía Bot API y ejecuta la alarma. También funciona desde Saved Messages via watcher local. | | `sync-vaults` | Sincronizar vaults Obsidian: Remotely Save sync → copiar archivos nuevos/actualizados del portátil a sobremesa → forzar OneDrive sync. Ver [[07-Conocimiento/protocolo-sync-vaults-obsidian.md]]. | +| `tv "mensaje"` | Enviar un mensaje urgente a la tele Google (enciende → sirena → mensaje → apagado ADB): `python vigilancia/tv_mensaje.py "mensaje"`. Desde fuera de la WiFi: `curl http://:8600/tv/mensaje?texto=...` | | `tv "mensaje"` | Enviar un mensaje urgente a la tele Google (enciende → 15s → sirena emergencia → mensaje → apagado ADB): `python vigilancia/tv_mensaje.py "mensaje"`. Desde fuera de la WiFi: `curl http://:8600/tv/mensaje?texto=...` | --- @@ -441,6 +442,7 @@ Ejemplo: `22-jul: [conocimiento] Plan diario Jefe Desarrollo + protocolo guardad | `sync-vaults` | Sincronizar vaults Obsidian | | `consumo` | Ver consumo OpenCode.ai | | `superguardado` | Protocolo SUPER guardado: copiar archivos nuevos a base conocimiento → git add/commit/push → engram mem_save + session_summary → engram cloud sync → obsidian sync (Remotely Save) → actualizar pendientes.json si procede | +| `tv "mensaje"` | Enviar un mensaje urgente a la tele Google (enciende → sirena → mensaje → apagado ADB): `python vigilancia/tv_mensaje.py "mensaje"`. Desde fuera de la WiFi: `curl http://:8600/tv/mensaje?texto=...` | --- diff --git a/README.md b/README.md index a9bac81..581b1c0 100644 --- a/README.md +++ b/README.md @@ -1,41 +1,75 @@ # Biblioteca de Conocimiento — Laboratorio -Repositorio de **laboratorio / pruebas** (test de laboratorio) con la misma estructura y características que `biblioteca_negocio_prolongo`, pero con **contenido vacío**. +Repositorio de **laboratorio / pruebas** con la misma estructura que `biblioteca_negocio_prolongo`. -## Propósito +## Proyecto principal: Sistema de Vigilancia -- Entorno aislado para hacer tests de laboratorio sin tocar la base de conocimiento real. -- Misma configuración de asistentes IA (AGENTS.md), MCP servers y sincronización. -- Se irán añadiendo proyectos de prueba conforme se necesiten. +Cerebro de casa 24/7 en **Raspberry Pi 3** (`minipc`, 192.168.50.187/251). -## Estructura +### Funcionalidades -| Carpeta | Contenido previsto | -|---------|-------------------| -| `conocimiento_prolongo_faccsa/` | (vacío — en producción: esquemas BBDD, catálogo artículos, glosario ERP) | -| `guardias/` | (vacío — en producción: manuales, catálogo equipos, wiki errores, extensiones) | -| `planificacion/` | (vacío — planning, pendientes) | -| `powerbi/` | (vacío — conocimiento Power BI) | -| `docs/` | (vacío — documentación arquitectura, integraciones) | -| `config/` | `opencode.jsonc` (MCP: engram, obsidian, telegram, image-vision, context7, fetch, etc.) + `CLAUDE.md` | -| `scripts/` | Scripts de automatización (a rellenar) | +| Función | Comando / Descripción | +|---------|----------------------| +| **Estado de la Pi** | `estado` (temp, RAM, disco, IPs) | +| **Temperatura** | `temperatura` | +| **Mensaje a la tele** | `tv ` (enciende → habla → apaga) | +| **Alarma completa** | `alarma ` (sirena Protección Civil → mensaje x3 → texto 30s → apagado) | +| **YouTube** | `youtube ` (reproduce video → apaga al terminar) | +| **Panorámica** | `panorama` (fotos de cámaras → Telegram IDD) | +| **Reconocimiento** | Identifica a INES/CAROLINA por cara y cuerpo (80%) | +| **Acceso remoto** | `ssh minipc` vía VPS (ProxyJump) o `tv_api.py:8600` | -## Características (idénticas al repo de producción) +### Bot de Telegram -- **AGENTS.md**: mismas reglas e instrucciones para asistentes IA (protocolo RE, memoria absoluta, Engram cloud, sync bidireccional, comandos rápidos) -- **Engram**: conexión al mismo Engram local + cloud (`biblioteca_conocimiento_laboratorio` como proyecto) -- **Obsidian**: conexión al vault vía Local REST API (MCP obsidian) -- **MCP servers**: engram, image-vision, context7, fetch, sequential-thinking, duckduckgo-search, obsidian, telegram (config/opencode.jsonc) -- **.env**: credenciales locales (NO se sube al repo, está en .gitignore) +- **@juanjer_casa_bot** — bot dedicado (sin competir con el de la VPS) +- Comandos: `estado`, `temperatura`, `tv `, `alarma `, `youtube `, `panorama` -## Configuración +### Apagado de la tele -Copiar `.env.example` a `.env` y rellenar con valores reales (o copiar el `.env` del repo de producción si se quiere acceso completo). +- **AndroidTVRemote2** (protocolo oficial Google): emparejamiento por PIN, certificado persistente +- Sin ADB, sin VoiceMonkey — funciona siempre -## Notas +### Acceso remoto (Opción C: túnel SSH vía VPS) -- Las carpetas están vacías a propósito: es un entorno de pruebas. -- Convenciones de nomenclatura: ver AGENTS.md (faccsa con doble C+S-A, programas con guiones 8-4-8, PCs con prefijo+numero VC0012). +- **Pi → VPS**: túnel inverso autossh (`-R 2222:localhost:22 -R 8600:localhost:8600`) +- **Portátil → VPS → Pi**: `ssh minipc` (ProxyJump) +- **API remota**: `curl http://:8600/tv/mensaje?texto=...` +- **Telegram**: `@juanjer_casa_bot` con comandos `tv`/`alarma`/`youtube`/`panorama` ---- -*Creado: 01/08/2026 — Laboratorio* +### Estructura del proyecto + +``` +vigilancia/ +├── pi_bot.py # Bot de Telegram (estado, tv, alarma, youtube, panorama) +├── tv_api.py # API HTTP para control de la tele +├── voz.py # Generación de voz, sirena, teleprompter, YouTube, apagado TV +├── panorama.py # Snapshots de cámaras a Telegram IDD +├── config.py # Configuración del sistema +├── tv_mensaje.py # CLI para mensajes a la tele +├── tv_adb.py # ADB (legacy, ahora usa AndroidTVRemote2) +├── reconocedor.py # Reconocimiento facial (YuNet + ArcFace + ResNet18) +├── enroll.py # Registro por webcam +├── notificador.py # Telegram, Alexa (VoiceMonkey) +├── detector_persona.py # Detección YOLO +├── main.py # Orquestador de vigilancia +├── test_prueba.py # Suite de pruebas (18/18) +├── test_alerta.py # Prueba de alerta E2E +├── adb-tools/ # ADB + AndroidTVRemote2 +├── modelos/ # Modelos YuNet + ArcFace +└── conocidos/ # Embeddings de INES/CAROLINA +``` + +### Lecciones aprendidas + +Ver `docs/lecciones_aprendidas_vigilancia.md` — 26 lecciones cubriendo hardware, red, SSH, Telegram, TV, audio y despliegue. + +### Infraestructura + +| Componente | Detalle | +|-----------|---------| +| **Pi** | 192.168.50.187 (eth0) / 192.168.50.251 (wlan0) | +| **VPS** | 185.187.169.109 (Contabo, Docker) | +| **TV** | 192.168.50.16 (AndroidTVRemote2, PIN emparejado) | +| **Cámara** | 192.168.50.227 (Tapo, RTSP + ffmpeg) | +| **SSH** | `ssh minipc` (ProxyJump vps) → Pi | +| **Telegram** | @juanjer_casa_bot (bot dedicado) | diff --git a/docs/lecciones_aprendidas_vigilancia.md b/docs/lecciones_aprendidas_vigilancia.md new file mode 100644 index 0000000..ba135d4 --- /dev/null +++ b/docs/lecciones_aprendidas_vigilancia.md @@ -0,0 +1,73 @@ +# Lecciones Aprendidas — Sistema de Vigilancia + +## Fecha: 02 agosto 2026 + +### Hardware + +1. **Raspberry Pi 3 NO soporta USB gadget** — eso es solo Pi Zero/Zero 2/CM4. La Pi 3 necesita red (WiFi/Ethernet) para acceso remoto. + +2. **Undervoltage en Pi 3**: LED rojo parpadeante = cargador insuficiente. Necesita **5V/2.5A** dedicado. Un cargador de móvil débil puede causar inestabilidad, reinicios y fallos en WiFi/USB. + +3. **numpy 2.5 no compila en ARM (Pi 3)**: Las extensiones C fallan en armhf. Solución: usar `math` puro de Python para generar audio, o instalar numpy desde apt (`python3-numpy` si está disponible). + +4. **OpenCV-python no compila en ARM**: pip instala opencv-python-headless pero numpy roto impide su uso. Solución: usar **ffmpeg** (apt install ffmpeg) para capturar frames y procesar multimedia sin dependencias Python pesadas. + +### Red y WiFi + +5. **DHCP por WiFi puede fallar en Pi 3**: Aunque el router da DHCP en eth0, wlan0 puede quedarse en link-local (169.254.x.x). Solución: **IP fija por nmcli** (`nmcli connection modify ipv4.method manual ipv4.addresses 192.168.50.251/24`). + +6. **netplan SÍ se aplica en Raspberry Pi OS Trixie**: Las configuraciones de `/etc/netplan/*.yaml` son generadas por cloud-init y NetworkManager. La config `network-config` del boot partition se aplica. + +7. **PEP 668 en Raspberry Pi OS**: pip install requiere `--break-system-packages` o usar un venv. + +### SSH y Acceso Remoto + +8. **ProxyJump SSH**: Desde el portátil, `ssh minipc` conecta vía VPS (`ProxyJump vps`) → Pi. Config en `~/.ssh/config`. El VPS usa la llave `C:\Users\juanm\Documents\GitHub\contabo`. + +9. **Autossh tunnel inverso**: `autossh -M 0 -N -R 2222:localhost:22 -R 8600:localhost:8600 root@VPS`. Necesita `ServerAliveInterval 30` y `ExitOnForwardFailure yes`. + +10. **Clave SSH de la Pi en el VPS**: La línea completa `ssh-ed25519 ` debe estar en `/root/.ssh/authorized_keys`. Si solo se pone el base64 sin el prefijo, la autenticación falla. + +### Telegram Bot + +11. **Canal IDD vs bot privado**: Si hay múltiples bots usando el mismo token, compiten por `getUpdates`. Solución: **bot dedicado** para la Pi (`@juanjer_casa_bot`). + +12. **Canal de Telegram vs bot**: Los mensajes en canales llegan como `channel_post`, no `message`. El bot debe manejar ambos: `upd.get("message") or upd.get("channel_post")`. + +13. **systemd y stdout de threads**: El stdout de threads daemon no siempre aparece en `journalctl`. Para debugging: logear a un archivo (`bot.log`). + +### TV y AndroidTVRemote + +14. **ADB no funciona en TCL Smart TV Pro**: No muestra el aviso de autorización por red (wireless debugging). Se revocaron autorizaciones, se toggled USB debugging, se intentó con claves del portátil — nada. Limitación del modelo. + +15. **AndroidTVRemote2 funciona**: Protocolo oficial de Google (emparejamiento por PIN TLS en puerto 6467). La API es: `remote.is_on` (propiedad), `remote.send_key_command("POWER")` (síncrono, NO async). El certificado se guarda en `tv_cert/` y es persistente (no caduca con reinicios). + +16. **POWER es toggle**: No es unidireccional. Si la TV está encendida se apaga, si está apagada se enciende. Para controlarlo: verificar `is_on` antes de enviar POWER. + +### Sirena y Audio + +17. **numpy roto en ARM → sirena con math**: El pitido de emergencia (wail) se sintetiza con `math.sin` en bucle, sin numpy. Funciona bien. + +18. **pychromecast con netplan**: Las conexiones de netplan usan `netplan-wlan0-*`. El DHCP puede fallar en wlan0. Solución: IP fija o usar eth0. + +19. **ffmpeg funciona en ARM** (paquete apt): Versión 7.1.5 compilada para armhf. Funciona para capturar frames RTSP y procesar multimedia. + +### Despliegue + +20. **systemd en Pi**: La forma fiable de escribir la unidad es via SFTP + `sudo cp` (el `tee` con `sudo -S` consume el stdin y la unidad no se escribe). + +21. **PEP 668**: `pip3 install --user --break-system-packages` necesario en Raspberry Pi OS para instalar paquetes Python. + +22. **cloud-init**: El `user-data` y `network-config` se procesan en el primer arranque. Si el primer arranque ya pasó, hay que re-grabar la SD para que se apliquen los cambios. + +23. **userconf.txt**: Método fiable para crear el usuario `pi` en el primer arranque. Se escribe en la partición boot: `pi:`. Funciona incluso si cloud-init falla. + +### Cámaras + +24. **Panorámica con ffmpeg**: Sin OpenCV en la Pi, se usan `ffmpeg -i -frames:v 1 snapshot.jpg` para capturar frames de las cámaras Tapo. + +### Monitoreo + +25. **Bot de Telegram en la Pi**: Responde a `estado`, `temperatura`, `tv`, `alarma`, `youtube`, `panorama`. Usa `requests` para getUpdates (long polling) y `sendMessage`/`sendPhoto` para responder. + +26. **Alerta de temperatura**: Monitor en background (cada 5 min) que envía alerta si supera el umbral (80°C default).