1. Introducción
Industrial Monitor es un sistema completo de monitoreo y control para equipos de refrigeración industrial. Consta de tres componentes:
📡 Hardware ESP32
Controlador con 7 sensores de temperatura DS18B20 (protocolo 1-Wire) y 3 relés para control de compresor, válvula inversora y relé auxiliar. Los sensores monitorean entrada/salida de evaporador, entrada/salida de condensador, descarga del compresor (0 cm y 30 cm), temperatura ambiente y cabeza de motor.
☁️ Backend en la nube
Servidor Express.js + SQLite que recibe telemetría del ESP32 (HTTP), gestiona comandos instantáneos (MQTT), almacena datos históricos y reglas de automatización. Desplegado en Render con broker MQTT en HiveMQ Cloud (TLS).
📱 Aplicación Android
App nativa en Kotlin/Compose que se comunica con el backend vía HTTP. Permite monitoreo en tiempo real, control de relés, visualización de gráficos históricos, reglas de automatización, herramientas de refrigeración (cálculos PT, superheat, subcooling, COP) y tablas de conversión.
Características principales
| 📊 Monitoreo en tiempo real | 7 temperaturas + 2 presiones virtuales cada 3 segundos |
| 🔌 Control de relés | Compresor, válvula inversora, auxiliar — con bloqueo/reset/desbloqueo. Respuesta instantánea vía MQTT. |
| 📈 Historial con gráficos | KPIs (ΔT, ciclos, tiempo compresor), crosshair, eventos, CSV |
| 🤖 Reglas de automatización | Triggers compuestos AND/OR, secuencias de acciones, cooldown |
| 🔧 Herramientas técnico | PT, superheat, subcooling, COP, conversor presión, tabla fracciones↔mm |
| 📶 Configuración WiFi | Por HTTP (comando remoto) o BLE provisioning |
| 🔔 Notificaciones | Push Android cuando se dispara una regla de automatización |
2. Instalación
2.1 Descargar la app
La app está disponible en:
- Cloudflare Pages: industrial-monitor-f2m.pages.dev
- Descarga directa del APK desde el enlace en la página de Cloudflare Pages
Si el APK no se instala, habilitar "Instalar apps de fuentes desconocidas" en Ajustes → Seguridad de Android.
2.2 Primer inicio de sesión
https://industrial-monitor-backend.onrender.com140808AC7100).2.3 Hardware — Conexión de sensores
Los 7 sensores DS18B20 se conectan en bus 1-Wire al GPIO4 del ESP32. Las etiquetas son:
| Etiqueta | Sensor | Ubicación en el equipo |
|---|---|---|
evap_in | Evaporador — Entrada | Tubería de entrada al evaporador |
evap_out | Evaporador — Salida | Tubería de salida del evaporador |
cond_in | Condensador — Entrada | Tubería de entrada al condensador |
cond_out | Condensador — Salida | Tubería de salida del condensador |
desc_0cm | Descarga — 0 cm | Tubería de descarga del compresor |
ambiente | Ambiente | Temperatura ambiente del gabinete |
motor_head | Cabeza de motor | Carcasa del compresor |
3. Dashboard
Pantalla principal. Muestra todos los dispositivos registrados con un resumen de su estado.
Información mostrada
- Nombre/ID del dispositivo — Ej: 140808AC7100
- Estado del compresor — ONLINE, APAGADO o BLOQUEADO
- 3 temperaturas principales — Evap In, Cond In, Desc 0cm (abreviadas en la tarjeta)
- Estado del compresor — ON/OFF
- Presiones estimadas — Succión/Descarga en PSI
Barra superior
| Botón | Función |
|---|---|
| 🔧 Herramientas | Abre la pantalla de herramientas (calculadoras, conversor, tablas) |
| 📶 Configurar WiFi | Abre el diálogo de configuración WiFi por HTTP |
| 🔄 Actualizar | Refresca manualmente los datos del dashboard |
| ⋮ Menú | Opciones: Configurar BLE, cambiar backend, etc. |
Auto-refresh: El dashboard se actualiza automáticamente cada 3 segundos.
4. Pantalla del Dispositivo
Al tocar una tarjeta en el Dashboard, se abre la pantalla de detalle con toda la información del dispositivo.
Secciones (desplazables)
4.1 Estado del Compresor
Muestra el estado actual (ON/OFF), el relay (Normal/Bloqueado/Reseteado) y la intensidad de señal WiFi (RSSI).
4.2 Temperaturas
Los 7 sensores agrupados por zona: Evaporador (entrada/salida), Condensador (entrada/salida), Descarga 0cm, Ambiente y Cabeza de Motor. Cada uno muestra su temperatura en °C.
4.3 Presiones (estimadas)
Presiones de succión y descarga calculadas virtualmente a partir de las temperaturas de saturación. Se muestran en PSI y bar. Incluye switches para alternar entre Absoluta/Manométrica y Burbuja/Rocío.
4.4 Refrigerante
Selector desplegable con 10 refrigerantes (R22, R134a, R404A, R410A, R407C, R507A, R717, R290, R32, R1234yf). El cambio se envía al ESP32 como comando pendiente.
4.5 Controles de relé (barra inferior fija)
| Botón | Acción | Efecto |
|---|---|---|
| Reiniciar | CMD_RESET | Reinicia el compresor (apaga y quita bloqueo si existe) |
| Desbloquear | CMD_UNBLOCK | Quita bloqueo de seguridad |
| Inv. (ON/OFF) | Toggle válvula inversora | Activa/desactiva la válvula de 4 vías |
| Aux | Toggle auxiliar | Activa/desactiva el relé auxiliar |
UI optimista: Los relays cambian visualmente al instante (el botón refleja el nuevo estado), y se confirman cuando el ESP32 responde. Si el comando falla, el estado se revierte.
4.6 Botones de navegación
| 📶 Cambiar WiFi | Abre diálogo para cambiar la red WiFi del ESP32 |
| 📊 Ver Historial y Gráficos | Navega a la pantalla de historial con gráficos interactivos |
| 🤖 Reglas de Automatización | Navega a la pantalla de reglas |
5. Historial y Gráficos
Pantalla de análisis histórico con gráficos interactivos, KPIs y registro de eventos.
5.1 Controles superiores
| Control | Función |
|---|---|
| 📅 Selector de fecha | Elige la fecha del historial. Se posiciona automáticamente en la última fecha con datos. |
| ⏱ Selector de rango | 30 minutos, 1h, 2h, 6h, 12h, 24h. Define la ventana de tiempo del gráfico. |
| 🔘 Sensores | Checkboxes para elegir qué sensores mostrar en el gráfico (máximo 7). |
| 🔄 Auto / Manual | Chip para activar/desactivar actualización automática (Live mode). Verde = refresco cada 5s sin parpadeo. |
| 📥 CSV | Exporta los datos del rango seleccionado a formato CSV. |
5.2 Gráfico interactivo
- Crosshair: Arrastrá el dedo sobre el gráfico para ver el valor exacto de cada sensor en ese instante. Todos los valores se muestran en un tooltip.
- Eje Y: Ajusta automáticamente la escala según los sensores seleccionados.
- Marcadores de eventos: Puntos rojos/naranjas en la línea de tiempo indican alarmas y bloqueos.
- Colores: Cada sensor tiene un color fijo para fácil identificación.
- Soporte dark mode: Gridlines y labels se adaptan al tema del sistema.
5.3 Panel de KPIs
Tarjetas con indicadores clave calculados para el período seleccionado:
| KPI | Descripción |
|---|---|
| 🌡 Temp Mín | Temperatura más baja del período entre todos los sensores |
| 🌡 Temp Máx | Temperatura más alta del período |
| 📊 Temp Prom | Promedio de todas las temperaturas |
| 🔄 ΔT Evap | Diferencia promedio entrada/salida del evaporador |
| 🔄 ΔT Cond | Diferencia promedio entrada/salida del condensador |
| 🔁 Ciclos | Cantidad de arranques del compresor |
| ⏱ Tiempo Compresor | Minutos totales con compresor encendido |
| ⚠ Alarmas | Cantidad de eventos de alarma disparados |
5.4 Registro de Actividad
Línea de tiempo detallada con todos los eventos del período: arranques, bloqueos, resets, alarmas y reinicios del ESP32. Cada evento tiene timestamp, tipo, icono y color.
6. Reglas de Automatización
Sistema de reglas para automatizar acciones en base a condiciones de temperatura, presión, estado de relés o tiempo.
6.1 Estructura de una regla
| Campo | Descripción |
|---|---|
| Nombre | Etiqueta descriptiva (ej: "Alta temp evap") |
| Lógica | AND (todas las condiciones deben cumplirse) o OR (al menos una). Hasta 3 condiciones. |
| Condiciones | Fuente (temperatura, presión, relay, tiempo), sensor, operador (>, <, =) y umbral. |
| Persistencia | Tiempo en ms que la condición debe mantenerse antes de disparar (default: 10s). |
| Cooldown | Tiempo mínimo entre disparos consecutivos (default: 0 = sin cooldown). |
| Acciones | Secuencia de hasta 4 pasos con delay entre cada uno. |
6.2 Acciones disponibles
| Acción | Icono | Efecto |
|---|---|---|
| Notificar | 🔔 | Envía push notification al teléfono + evento al historial |
| Reset | 🔄 | Reinicia el compresor (apaga y quita bloqueo) |
| Bloquear | 🚫 | Bloquea el compresor (no se puede encender hasta desbloquear) |
| Desbloquear | ✅ | Quita el bloqueo del compresor |
| Inv ON | ↔️ | Activa válvula inversora (modo calor) |
| Inv OFF | ↔️ | Desactiva válvula inversora (modo frío) |
| Aux ON | 🔌 | Activa relé auxiliar |
| Aux OFF | 🔌 | Desactiva relé auxiliar |
| Esperar | ⏱ | Pausa entre acciones (delay configurable en ms) |
6.3 Gestión de reglas
- Crear: Botón "+" en la esquina inferior derecha. Abre el builder con todas las opciones.
- Expandir: Tocá una regla para ver las opciones de editar/eliminar.
- Toggle: Switch para activar/desactivar sin entrar al editor.
- Auto-save: Cada cambio (crear, editar, eliminar, toggle) se guarda automáticamente en el backend y se envía al ESP32 como comando pendiente.
- Limpiar todas: Botón al final de la lista para borrar todas las reglas del ESP32.
6.4 Ejemplo de regla compuesta
Nombre: Protección compresor
Lógica: AND
Condición 1: desc_0cm > 120°C
Condición 2: compresor = ON
Persistencia: 30 segundos
Cooldown: 5 minutos
Acciones:
- Notificar (0ms) → push al teléfono
- Bloquear (2000ms) → apaga compresor y lo bloquea
Resultado: Si la descarga supera 120°C por 30s con el compresor andando, se notifica al técnico y se bloquea el compresor.
7. Herramientas
Pantalla con 4 pestañas de utilidades para el técnico refrigerista. Accesible desde el botón 🔧 en el Dashboard.
7.1 Calculadoras (pestaña 1)
Presión — Temperatura
Calcula la presión de saturación a partir de la temperatura. Usá el slider (-40°C a 60°C) o ingresá el valor manualmente. Resultado en PSI y bar. Los switches Rel/Abs y Burb/Rocío ajustan la lectura a manométrica o presión de rocío.
Sobrecalentamiento (Superheat)
SH = Tsucción − Tsaturación. Ingresá la temperatura de succión (°C) y la presión de succión (PSI). Verde = rango ideal (5-15°C), Rojo = fuera de rango.
Subenfriamiento (Subcooling)
SC = Tsaturación − Tlíquido. Ingresá temperatura de líquido y presión de descarga. Verde = 2-12°C.
COP Aproximado (Carnot)
COP = Tevap / (Tcond − Tevap) en Kelvin. Verde ≥ 4.0, Naranja ≥ 2.5, Rojo < 2.5.
Diferencia de Temperatura (ΔT)
Diferencia simple entre dos temperaturas: |T1 − T2|.
7.2 Conversor de Presión (pestaña 2)
Conversión bidireccional entre 4 unidades de presión. Al ingresar un valor en cualquier campo, los otros 3 se actualizan instantáneamente. Arranca con 100 PSI precargados.
| Unidad | Factor |
|---|---|
| PSI | 1 |
| bar | 1 PSI = 0.06895 bar |
| kPa | 1 PSI = 6.89476 kPa |
| kg/cm² | 1 PSI = 0.070307 kg/cm² |
7.3 Tabla PT (pestaña 3)
Tabla completa de presión de saturación para el refrigerante seleccionado, desde −40°C hasta 80°C en pasos de 2°C. Muestra PSI, bar y kPa. Respeta los switches Rel/Abs y Burb/Rocío. Coeficientes Antoine validados contra NIST REFPROP.
7.4 Fracciones ↔ Milímetros (pestaña 4)
Dos secciones:
- Fracciones de pulgada (1/64" a 1"): 64 filas con fracción, pulgada decimal (6 decimales) y milímetros (4 decimales). Colores alternados para legibilidad.
- Equivalencias 1" a 10": 39 filas con medidas comunes en pasos de 1/8" y 1/4", útiles para cañerías y fittings.
Historial flotante
Barra inferior que muestra las últimas 5 operaciones realizadas en las calculadoras (PT, SH, SC, COP, ΔT) con su valor y color.
8. Cambiar WiFi
Hay dos formas de cambiar la red WiFi del ESP32:
8.1 Por HTTP (comando remoto)
Disponible cuando el ESP32 está conectado y online. Desde el botón "Cambiar WiFi" en la pantalla del dispositivo:
Feedback post-envío: Al tocar Conectar, aparece un banner animado "Reiniciando con nueva red WiFi..." que desaparece automáticamente cuando el dispositivo vuelve a estar online.
Problemas de conexión: Si el ESP32 no responde (WiFi inestable), el diálogo muestra un mensaje "¿Sin conexión?" con un botón para usar configuración BLE.
Credenciales incorrectas: Si el ESP32 no puede conectarse a la nueva red, después de ~15 segundos sin respuesta, la app muestra un banner rojo: "Dispositivo sin respuesta. ¿Configurar WiFi por BLE?".
8.2 Por BLE (provisioning)
Para primera configuración o cuando el ESP32 no tiene WiFi. Accesible desde el menú del Dashboard.
- El ESP32 emite una señal BLE con nombre
IND-MONITOR. - La app escanea, se conecta, recibe la lista de redes WiFi y envía credenciales.
- Al recibir las credenciales, el ESP32 las guarda en NVS y se reinicia.
- El fix del error 133 (GATT_ERROR) asegura que el ACK BLE llegue antes del reinicio.
9. Comunicación MQTT (Instantánea)
A partir de la v3.1, el sistema usa una arquitectura híbrida HTTP + MQTT que combina lo mejor de ambos protocolos:
| Dato | Protocolo | Latencia | Motivo |
|---|---|---|---|
| Telemetría (sensores, presiones) | HTTP POST | ~200ms | Confiabilidad — Render permite HTTP sin restricciones |
| Comandos de relay | MQTT | ~50ms | Instantáneo — sin polling, push directo al ESP32 |
| Reglas de automatización | MQTT | ~50ms | Config y disparos van por MQTT |
| Notificaciones de alarma | MQTT + HTTP | ~50-200ms | Evento instantáneo, almacenado por HTTP |
| Escaneo WiFi, refrigerante | MQTT | ~50ms | Comandos de configuración |
| Historial, KPIs, herramientas | HTTP REST | ~200ms | Consultas a la base de datos |
9.1 ¿Por qué híbrido?
HTTP para telemetría: el backend en Render (free tier) solo permite tráfico HTTP/HTTPS saliente. Las telemetrías se envían cada 3 segundos vía POST /api/ingest y se almacenan en SQLite. Es confiable y no depende de puertos no estándar.
MQTT para comandos: el ESP32 se conecta directamente al broker HiveMQ Cloud (0fca7432...s1.eu.hivemq.cloud:8883) con TLS. Cuando tocás un relay en la app, el backend publica el comando en el topic indmon/{deviceId}/cmd y el ESP32 lo recibe al instante — sin esperar ningún ciclo de polling. La confirmación se publica en indmon/{deviceId}/status.
9.2 Arquitectura de topics MQTT
| Topic | Dirección | QoS | Contenido |
|---|---|---|---|
indmon/{id}/telemetry | ESP32 → Backend | 0 | JSON con 7 temperaturas, presiones, relay state, WiFi RSSI, reglas (al boot) |
indmon/{id}/cmd | Backend → ESP32 | 1 | JSON: {"command":"reset","params":{}} |
indmon/{id}/status | ESP32 → Backend | 1 | JSON: {"cmd":"reset","status":"ok"} |
indmon/{id}/event | ESP32 → Backend | 1 | JSON con evento de alarma/regla disparada |
9.3 Broker HiveMQ Cloud
- Cluster:
0fca7432835440d6ab1ecacc38a07eda.s1.eu.hivemq.cloud - Puerto MQTT nativo (TLS): 8883 — usado por el ESP32
- Puerto WebSocket (TLS): 8884 — disponible para el backend
- Plan: Free (100 conexiones, 10 GB/mes)
- Seguridad: TLS en ambos puertos + usuario/contraseña
9.4 Librería en el ESP32
El ESP32 usa PubSubClient sobre WiFiClientSecure (TLS). Reemplaza el polling HTTP anterior (500ms) por una suscripción MQTT permanente. Flash extra usado: ~15 KB. RAM extra: ~8 KB.
En el backend se usa mqtt.js (npm). Todos los endpoints de comando (/api/devices/:id/reset, /block, /unblock, /command) publican al topic MQTT en lugar de insertar en pending_commands.
10. Solución de Problemas
❓ El dispositivo aparece como APAGADO en el dashboard
Causa: El ESP32 no envió telemetría en más de 15 segundos (timeout de conexión).
Solución: Verificar que el ESP32 esté encendido y conectado a WiFi. Revisar la fuente de alimentación (5V, mínimo 1A).
❓ Un sensor muestra −127°C o valor inválido
Causa: Sensor desconectado, cortocircuito o defectuoso.
Solución: Revisar la conexión física del sensor al bus 1-Wire (GPIO4). Verificar que la resistencia pull-up de 4.7kΩ esté presente entre VCC y DATA.
❓ El relay no responde al presionar el botón
Causa: El comando no llegó al ESP32 (WiFi débil) o el relay está bloqueado por una regla de seguridad.
Solución: Verificar el estado del relay en el dispositivo. Si está "Bloqueado", usar "Desbloquear". Revisar que no haya una regla de automatización que esté bloqueando el relay (las reglas tienen prioridad sobre comandos manuales). Los relays son active-LOW (JQC-3FF-S-Z).
❓ La tabla de fracciones se ve lenta o trabada
Causa: Las listas se generaban en cada recomposición en versiones anteriores.
Solución: Actualizar a la última versión del APK (v3.0+). Las listas ahora usan remember con keys estables para scroll fluido.
❓ Error 133 al configurar WiFi por BLE
Causa: El ESP32 se reiniciaba antes de enviar el ACK de confirmación BLE.
Solución: Actualizar el firmware del ESP32 a v3.0+. El fix implementa un restart diferido (el BLE envía el ACK, y el ESP32 se reinicia 2 segundos después en el loop principal).
❓ Las reglas de automatización no se disparan
Causa: La regla puede estar desactivada (switch OFF), en cooldown, o la persistencia no se cumplió.
Solución: Verificar que el switch de la regla esté verde (ON). Revisar que las condiciones tengan valores realistas (ej: un umbral de 200°C nunca se alcanzará). Asegurarse de que la regla se haya guardado (auto-save al editar).
❓ El backend no responde (Render)
Causa: Render puede suspender instancias gratuitas después de inactividad.
Solución: Esperar ~30 segundos a que Render despierte la instancia. El health endpoint de UptimeRobot mantiene el servicio activo durante horas pico.