# Walkthrough - Resumen de Mejoras y Correcciones (TotalConnect Client) Este documento resume los cambios y optimizaciones realizados para robustecer el panel de monitoreo centralizado de alarmas. --- ## 🛠️ Cambios Realizados ### 1. Actualización en Tiempo Real del Progreso de Carga * **Problema:** El modal de carga se quedaba en un mensaje estático ("Conectando a los paneles...") y no actualizaba qué sucursal estaba procesando. * **Solución:** * Se configuró la variable global `current_loading_status` para actualizarse en cada paso de `run_update()` (conexión inicial, selección de cuenta y consulta específica de sucursal). * Se agregaron cabeceras anti-caché en la respuesta HTTP (`Cache-Control: no-cache, no-store, must-revalidate`). * Se implementó un sondeo mediante `fetch` periódico (intervalo de 1.5s) que actualiza el texto de forma dinámica sin retrasos. ### 2. Lista de Exclusiones / Excepciones (`exclude`) * **Problema:** El usuario deseaba omitir ciertas sucursales de prueba o fuera de servicio de la visualización global. * **Solución:** * Se agregó soporte para una clave `"exclude": [...]` en el archivo de configuración `credentials.json`. * El script valida de forma inteligente si el ID numérico de la sucursal o su nombre coincide parcialmente con alguno de los elementos a excluir, omitiendo la consulta y el reporte de manera automática. ### 3. Apertura Automática del Navegador * **Problema:** Iniciar el ejecutable requería que el usuario abriera manualmente la página en `http://localhost:8080/`. * **Solución:** * Se integró el uso del módulo nativo `webbrowser` para abrir la pestaña al arrancar en modo servidor. * **Headless-safety:** El script detecta si el host no posee entorno gráfico (ausencia de `DISPLAY` en sistemas Linux/SSH) y desactiva esta apertura de forma segura para evitar cuelgues o warnings. * Se puede personalizar a través de `"open_browser": true/false` en el JSON o usando las banderas `--no-browser` / `-nb` en la CLI. ### 4. Filtrado de Historial de Alarma (Alarm Memory) * **Problema:** Algunas sucursales desarmadas o armadas normalmente mostraban alertas de alarma activas debido a memorias no limpiadas físicamente en el teclado Honeywell. * **Solución:** * Se rediseñó el bucle de validación de zonas. Ahora, una zona **sólo se marca como `ALARMA`** si la partición correspondiente de la sucursal está activamente disparada (`is_triggered`). * Si la sucursal está normal, las zonas cerradas no generan falsas alertas y las abiertas se muestran propiamente como `Abierta/Fallo` (color ámbar). ### 5. Tarjetas Deshabilitadas para Cuentas con Token Revocado * **Problema:** Cuando una cuenta de Total Connect pierde credenciales o se revoca, sus sucursales se cargaban de la caché local pero se visualizaban igual que las sucursales normales de cuentas activas. * **Solución:** * Se añadió la clase CSS `.branch-card-disabled` a las tarjetas cargadas desde la caché local con estatus `REVOKED`. * Esto les otorga un fondo gris medio (`#e2e8f0`), una opacidad del 65% y bloquea los efectos visuales de interacción en hover (sombra y escala), permitiendo distinguir a simple vista qué datos son históricos fuera de línea. ### 6. Diseño Responsivo y Text Wrapping * **Problema:** En zonas activas largas, las horas de disparo quedaban recortadas con puntos suspensivos en la tarjeta. * **Solución:** * Se eliminó el límite fijo de ancho de `.zone-desc` y se desactivó `white-space: nowrap`. * Se aumentó el ancho mínimo de las columnas en el grid responsivo a `290px`. Las descripciones largas ahora realizan un salto de línea natural posicionando la hora debajo de forma sumamente estética. ### 7. Checkboxes de Selección de Cuentas en la UI * **Problema:** El usuario deseaba poder elegir qué cuentas actualizar para evitar demoras innecesarias (por ejemplo, evitar actualizar cuentas revocadas). * **Solución:** * Se implementaron checkboxes en la cabecera que listan dinámicamente las cuentas de `credentials.json`. * Al hacer clic en "Actualizar", la UI envía mediante el cuerpo del POST (JSON) únicamente las etiquetas de las cuentas seleccionadas. ### 8. Persistencia y Mezcla de Estado (`last_state.json`) * **Problema:** Si se actualizaba únicamente una cuenta, el reporte en el frontend sobrescribía el archivo HTML y hacía desaparecer las demás sucursales. * **Solución:** * Se programó la escritura de `last_state.json` al finalizar cualquier consulta exitosa para guardar el último estado de todas las sucursales. * Cuando se realiza una actualización parcial (donde no se seleccionaron todas las cuentas), el backend carga los estados anteriores desde `last_state.json`, los mezcla con los nuevos resultados y genera la vista unificada. ### 9. Priorización de Cuentas Revocadas al Final del Listado * **Problema:** El usuario deseaba ver las cuentas inactivas/revocadas al final de la página para que no interfieran visualmente con las activas. * **Solución:** * Se definió un cuarto nivel de clasificación de prioridad: * `0`: Alarmas Activas (cabeza de página) * `1`: Sucursales Desarmadas * `2`: Sucursales Armadas (Stay, Away, etc.) * `3`: Sucursales Revocadas / Desconectadas (con fondo gris) * Todas las tarjetas dentro de cada categoría mantienen su estricto orden secuencial numérico. ### 10. Polling en Segundo Plano & Controles (Kill-Switch y Circuit Breaker) * **Problema:** El usuario requería monitoreo continuo sin bloqueos de API de Honeywell y con la capacidad de detener el polling manualmente o si Honeywell responde errores de autenticación/rate limit. * **Solución:** * **Motor Poller Daemon (`background_poller_thread`):** Se ejecuta cada 45s en segundo plano en el servidor Python. * **Circuit Breaker:** Si se registran 2 fallos de autenticación seguidos (`401` / `429`), el backend desactiva el polling automático previniendo bloqueos de IP de Honeywell. * **Endpoints Controladores:** Agregados `GET /polling-status` y `POST /toggle-polling`. * **Botonera en UI:** Se agregó el botón interactivo `[ ● Polling: Activo ]` / `[ ○ Polling: Pausado ]` en el encabezado. * **Auto-Focus (`visibilitychange`):** El navegador recarga el estatus automáticamente al regresar a la pestaña tras periodos de inactividad. --- ## 🔬 Verificación y Pruebas * **Compilación y Empaquetado:** Generación exitosa de `totalconnect.exe` en Windows `E:\Software\TotalConnect\dist\totalconnect.exe`. * **Sincronización:** Actualizado y desplegado en segundo plano en la VM de Linux accesible a través del puerto `8080`. * **Validación de Funcionalidad:** Todas las rutas del dashboard, filtros por JSON, exclusiones y endpoints de polling operan correctamente.