Semana del 4 al 10 de mayo de 2026
Resumen: Una semana de fuego: una cadena de fallos en cascada en el streaming destapó varios puntos débiles del pipeline, que quedaron corregidos; además se completó la migración de alertas a HERMES (Telegram), se puso en marcha el primer backup automático a la nube y los scripts de análisis de modelos recibieron mejoras importantes.
🎥 Crisis y refuerzo en el streaming
La semana empezó con problemas en el arranque: el WebSocket de OBS (puerto 4455) estaba ocupado por una instancia anterior que no había liberado el puerto, dejando panel.py —el gestor de overlays del directo— sin poder conectar. Mientras lo resolvía manualmente, aproveché para añadirle vigilancia activa: si el WebSocket no responde durante más de cinco minutos, panel.py envía un aviso y escribe el estado como FAIL en el monitor, en lugar de quedarse en bucle silencioso. También corregí dos comportamientos extraños: las reconexiones en bucle al recibir el código de error 207 de OBS (que indica que el servidor WebSocket aún no está listo, no que haya caído), y el fallo de overlay en la colección Buclemaps_primavera2, que ocurría porque el proceso se perdía el mensaje de cambio de colección al arrancar. La solución fue escanear las últimas 300 líneas del log al inicio para recuperar el estado anterior.
El jueves y viernes se desencadenó una cadena de fallos más seria. El watchdog llevaba caído desde las 6:32 del jueves sin dejar rastro en el log —probable crash silencioso provocado por un fichero huérfano de OpenClaw (openclaw_gateway.json) que el watchdog seguía monitorizando e intentaba gestionar con Ollama en bucle hasta crashear—. Sin watchdog activo, ningún fallo posterior generó alerta automática. El viernes a las 12:00 el stream cayó por un error invalid_grant de OAuth con YouTube: el token había caducado, y el script de reinicio tampoco pudo avisar porque, además de depender del watchdog muerto, encontró que el fichero token.json.revocado del episodio anterior ya existía y el renombrado fallaba silenciosamente. El stream estuvo caído hasta las 12:26, cuando lo relancé de forma manual con una re-autenticación vía navegador.
De todo esto salieron varias mejoras concretas en reiniciar_stream_obs.py:
- Ahora alerta directamente vía HERMES cuando detecta invalid_grant o token ausente, sin depender del watchdog.
- El renombrado del fichero de token ya no falla si el destino existe (
Path.replace()en lugar dePath.rename()). - Se añadió el flag
--solo-check: comprueba si hay broadcast activo sin interrumpir nada, diseñado para ejecuciones frecuentes. La nueva tarea Stream health check en el Programador de tareas lo llama cada 30 minutos todo el día. enableAutoStoppasó deTrueaFalse: con la opción activa, un micro-corte de segundos (por ejemplo al cambiar de colección en OBS) podía hacer que YouTube terminase el broadcast aunque OBS seguía emitiendo.- Se añadió timeout de red de 60 segundos para las llamadas a la API de YouTube, evitando que el proceso se quede colgado indefinidamente (como ocurrió con el PID 7692, bloqueado más de 30 minutos).
🤖 HERMES sustituye a OpenClaw
Esta semana se completó la migración del sistema de alertas internas. OpenClaw —el sistema anterior, basado en una pasarela de sockets propia— ha sido eliminado por completo: scripts, configuración, carpetas y tareas del Programador de tareas. En su lugar, el miércoles estrené HERMES, un módulo de notificaciones vía Telegram que escribí sin dependencias externas (usa directamente la Bot API con http.client). Tres niveles: INFO, WARNING y CRITICAL, con emoji según la gravedad.
La integración ya cubre los scripts principales: el watchdog notifica fallos y recuperaciones, reiniciar_stream_obs.py avisa al arrancar el broadcast o si YouTube no detecta señal de OBS, alertas.py envía alertas AEMET naranjas y rojas en tiempo real, y argus_sync.py confirma cada backup completado. Queda un paso pendiente: configurar hermes_config.json con el token real del bot (via @BotFather) y el chat_id, sin lo cual las alertas aún no llegan.
🛡️ Backup en la nube y arranque automático
El martes completé la primera sincronización real de ARGUS: 806 ficheros del proyecto subidos a Google Cloud Storage. El script argus_sync.py ya corre cada día a las 6:00, excluyendo entornos conda y otras carpetas voluminosas. Para el escenario de desastre, escribí también shadow_restore.py, que invierte la lógica de ARGUS y reconstruye el entorno en una máquina espejo; lo verifiqué en modo dry-run (806 ficheros resueltos correctamente sin escribir nada).
Además, creé arrancar_sistema.bat: un script que ejecuta la secuencia completa de arranque tras reiniciar el PC —lanza OBS, espera 45 segundos a que el WebSocket esté listo, crea el broadcast en YouTube y activa panel.py—. Está registrado en el Programador de tareas con disparador al iniciar sesión, así que ya no hay que recordar el orden correcto tras un reinicio.
🗺️ Mejoras en el análisis de modelos
Los scripts de análisis automático de mapas (MapflowAnalysis y MapflowForecast) recibieron varias mejoras. En el análisis mapa a mapa, el contexto enviado al modelo de lenguaje ahora incluye la fecha legible del run del modelo, el rango de horas animadas y la coherencia interpretada en lenguaje natural; el espacio de respuesta subió de 120 a 200 tokens y la temperatura bajó para respuestas más estables.
En MapflowForecast se corrigieron dos bugs: uno que colaba mapas de largo plazo en el pronóstico del día (los campos en «días» no se convertían a horas), y otro que leía el borrador del día anterior en vez del boletín AEMET actual. El prompt de síntesis se amplió con una cadena de razonamiento físico en cinco pasos (altura 500/850 hPa, superficie, zonas de riesgo, inestabilidad y conclusión por zonas). Los resultados diarios ahora se suben automáticamente a una hoja de Google Sheets para seguir la evolución del pronóstico a lo largo del tiempo.
🧪 Lo que ha quedado en el tintero
Dos cosas abiertas al cerrar la semana:
- HERMES sin activar: el código está integrado, pero
hermes_config.jsonnecesita el token real del bot y el chat_id (hay que pasar por @BotFather). Hasta entonces, las alertas no llegan. - Tarea Monitor control: el trigger de inicio de sesión no se puede cambiar desde línea de comandos porque la tarea fue creada por otro usuario del sistema. Pendiente abrir el Programador de tareas como administrador, borrar la tarea y recrearla desde el XML.
📆 Próxima entrada: semana del 11 al 17 de mayo de 2026.