mirror of
https://github.com/cheveguerra/TotalConnect.git
synced 2026-08-19 00:46:37 +00:00
4.6 KiB
4.6 KiB
Plan de Implementación y Walkthrough Propuesto: Integración de Eventos en Tiempo Real
Este documento detalla el plan de diseño técnico y la arquitectura de los cambios que se implementarán en el proyecto TotalConnect (index.py) para integrar el monitoreo por eventos en tiempo real.
🎯 Objetivos de la Implementación
- Monitoreo Automático en Segundo Plano: El servidor Python consultará a Honeywell mediante
GetEventscada 45–60 segundos sin requerir la intervención del usuario. - Actualización Ultra-Rápida (Delta Update): En lugar de consultar las 285 sucursales (1-2 minutos), el sistema identificará únicamente las sucursales que registraron eventos nuevos y actualizará el reporte en 1 a 3 segundos.
- Cero Retraso al Abrir la Página (
GET /): La carga inicial seguirá leyendolast_state.jsonde inmediato (< 5 milisegundos). - Control Manual y Circuit Breaker (Botonera & Kill-Switch):
- Botón en la cabecera del dashboard para Pausar / Reanudar Polling.
- Pausa automática inteligente si Honeywell responde errores de autenticación (401) o límite de peticiones (429).
- DOM Patching Silencioso en la Interfaz (JS): Actualización instantánea en el navegador únicamente de los nodos/tarjetas que cambiaron de estado, evitando parpadeos o animaciones molestas.
- Manejo Resiliente Multicuenta y Revocados: Las cuentas fuera de línea se mantendrán clasificadas con prioridad 3 al final del listado con fondo gris.
🏗️ Cambios Arquitectónicos por Componente
1. Backend (index.py)
A. Hilo Demonio de Polling en Segundo Plano (BackgroundPollerThread)
- Se agregará un
threading.Thread(daemon=True)que se ejecuta automáticamente al arrancar el servidor. - Mantiene variables globales en memoria:
polling_enabled(True/False): Estado global del motor de consulta.last_event_ids: Diccionario{ "Ccontrol2020": 850123, "Ccontrol2019": 412099 }con el último ID de evento procesado por cuenta.consecutive_errors: Contador de fallos consecutivos por cuenta.
B. Flujo del Poller (poll_events_cycle()):
- Verificación de Pausa: Si
polling_enabledesFalse, el hilo espera 15 segundos y re-evalúa. - Petición Delta
GetEvents:
Para cada cuenta activa encredentials.json, envía una llamada ligeraGetEventspasandoLastEventIdReceived. - Evaluación de Resultados:
- Sin cambios: Honeywell responde
[]. No se hace nada más. - Con cambios: Extrae los
LocationIDafectados. EjecutafullStatusúnicamente para esos IDs.
- Sin cambios: Honeywell responde
- Actualización de Estado: Consolida la información en
last_state.jsony vuelve a generarstatus.html. - Manejo de Errores (Circuit Breaker): Si una cuenta recibe 2 errores
401o429seguidos, el servidor pausa el polling automático para esa cuenta y notifica a la UI.
C. Endpoints HTTP Nuevos en DashboardHandler
GET /polling-status: Devuelve el estado actual (enabled,last_run,active_errors).POST /toggle-polling: Permite a la interfaz web activar o pausar manualmente el polling.
2. Frontend (status.html / Template en index.py)
A. Botón de Control de Polling en Cabecera
Junto al botón "Actualizar" y al selector de cuentas, se agregará un nuevo botón dinámico:
<button id="toggle-polling-btn" class="btn-polling-active" onclick="togglePolling()">
<span class="polling-indicator">●</span> Polling: Activo
</button>
B. Polling Local JS y DOM Patching
Un script JS en el cliente ejecutará una consulta ultrarrápida a GET /polling-status cada 15 segundos:
- Si la respuesta indica un cambio en el timestamp del último estado, realiza un
fetch('/')silencioso. - Compara los estados de las sucursales y actualiza el HTML únicamente de las tarjetas que cambiaron, manteniendo la posición y el foco del usuario.
- Auto-Check por Visibilidad (
visibilitychange): Al volver a la pestaña tras estar inactivo, el navegador refresca los datos al instante.
📝 Plan de Verificación
- Prueba de Polling en Segundo Plano: Iniciar el servidor, alterar el estado de una sucursal de prueba y verificar en consola que la consulta toma < 2 segundos.
- Prueba de Kill-Switch: Presionar el botón "Pausar Polling" en la interfaz y verificar que cesan las llamadas HTTP a Honeywell.
- Prueba de Circuit Breaker: Simular una credencial inválida y verificar que el servidor desactiva automáticamente el polling tras 2 intentos fallidos.
- Prueba de Rendimiento: Confirmar que la carga inicial
GET /sigue respondiendo en < 5ms.