Industrial Monitor

Manual de Usuario — Sistema de Monitoreo y Control de Refrigeración Industrial

v3.0 · Julio 2026

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), 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 real7 temperaturas + 2 presiones virtuales cada 3 segundos
🔌 Control de relésCompresor, válvula inversora, auxiliar — con bloqueo/reset/desbloqueo. Respuesta instantánea vía MQTT.
📈 Historial con gráficosKPIs (ΔT, ciclos, tiempo compresor), crosshair, eventos, CSV
🤖 Reglas de automatizaciónTriggers compuestos AND/OR, secuencias de acciones, cooldown
🔧 Herramientas técnicoPT, superheat, subcooling, COP, conversor presión, tabla fracciones↔mm
📶 Configuración WiFiPor HTTP (comando remoto) o BLE provisioning
🔔 NotificacionesPush Android cuando se dispara una regla de automatización

2. Instalación

2.1 Descargar la app

La app está disponible en:

Si el APK no se instala, habilitar "Instalar apps de fuentes desconocidas" en Ajustes → Seguridad de Android.

2.2 Primer inicio de sesión

1
Al abrir la app, ingresá la URL del backend: https://industrial-monitor-backend.onrender.com
2
El ESP32 se auto-registra al enviar su primera telemetría. Aparecerá en el Dashboard con su ID (ej: 140808AC7100).
3
Tocá la tarjeta del dispositivo para ver los detalles y comenzar a usar el sistema.

2.3 Hardware — Conexión de sensores

Los 7 sensores DS18B20 se conectan en bus 1-Wire al GPIO4 del ESP32. Las etiquetas son:

EtiquetaSensorUbicación en el equipo
evap_inEvaporador — EntradaTubería de entrada al evaporador
evap_outEvaporador — SalidaTubería de salida del evaporador
cond_inCondensador — EntradaTubería de entrada al condensador
cond_outCondensador — SalidaTubería de salida del condensador
desc_0cmDescarga — 0 cmTubería de descarga del compresor
ambienteAmbienteTemperatura ambiente del gabinete
motor_headCabeza de motorCarcasa del compresor

3. Firmware del ESP32

Documentación técnica del firmware que corre en el ESP32-DevKitC (WROOM-32). Cubre la asignación de GPIOs, sensores, relés, lógica de reconexión, provisioning BLE y el motor de reglas.

3.1 Pinout de Hardware

GPIOFunciónComponenteNotas
GPIO41-Wire Bus7× DS18B20Resistencia pull-up de 4.7kΩ entre DATA y 3.3V obligatoria
GPIO26Relé CompresorJQC-3FF-S-Z (5V)Active-LOW: LOW = cerrado (ON), HIGH = abierto (OFF)
GPIO25Relé Válvula InversoraJQC-3FF-S-Z (5V)Active-LOW
GPIO27Relé AuxiliarJQC-3FF-S-Z (5V)Active-LOW

3.2 Sensores DS18B20

Los 7 sensores DS18B20 comparten un único bus 1-Wire en GPIO4. Las direcciones físicas se autodescubren en el primer arranque y se persisten en NVS. Las etiquetas son fijas:

ÍndiceEtiquetaSensorUbicación
0evap_inEvaporador — EntradaTubería de entrada al evaporador
1evap_outEvaporador — SalidaTubería de salida del evaporador
2cond_inCondensador — EntradaTubería de entrada al condensador
3cond_outCondensador — SalidaTubería de salida del condensador
4desc_0cmDescarga — 0 cmTubería de descarga del compresor
5ambienteAmbienteTemperatura del gabinete
6motor_headCabeza de MotorCarcasa del compresor

Driver asíncrono: El firmware usa un driver no bloqueante que separa requestConversion() (lanza la conversión y retorna inmediatamente) de readResults() (lee resultados cuando están listos). Esto evita bloqueos de 750ms por ciclo de lectura. Intervalo de lectura: 1 segundo.

Lectura válida: Un sensor devuelve -127°C cuando está desconectado o defectuoso. La app muestra estos valores con indicador de inválido.

3.3 Módulos de Relé (JQC-3FF-S-Z)

Los 3 relés son módulos de 5V con lógica active-LOW: el relé se cierra cuando el GPIO está en LOW (0V) y se abre en HIGH (3.3V).

Estados del relé del compresor

EstadoGPIOEfectoComando
NORMALLOWCompresor funcionando normalmente por termostato
RESETEANDOHIGH (5s)Pulso de apertura de 5 segundos, luego cierra automáticamentereset
BLOQUEADOHIGH (indefinido)Relé abierto por seguridad. Requiere desbloqueo manual o por reglablock / unblock

Los relés de válvula inversora y auxiliar solo tienen estados ON/OFF (sin bloqueo).

3.4 Flasheo del Firmware

1
Instalar PlatformIO (extensión de VS Code) o PlatformIO Core.
2
Clonar el repositorio: firmware/ contiene el proyecto PlatformIO.
3
Conectar el ESP32 por USB (driver CH340). Puerto habitual: COM10 (Windows).
4
Compilar y flashear: pio run -t upload desde el directorio firmware/.
5
Monitorear serial: pio device monitor --port COM10 --baud 115200.

Dependencias (platformio.ini):

LibreríaPropósito
DallasTemperature @ 3.11.0Lectura de sensores DS18B20
OneWire @ 2.3.8Protocolo 1-Wire
PubSubClient @ 2.8.0Cliente MQTT (comandos instantáneos)
ArduinoJson @ 7.4.3Serialización/deserialización JSON
ESP32 BLE ArduinoProvisioning Bluetooth LE
PreferencesPersistencia en NVS (WiFi, reglas, labels)

3.5 Modos de Operación

Modo Normal (WiFi conectado)

El ESP32 lee sensores cada 1s, evalúa reglas, ejecuta secuencias de acciones, y envía telemetría cada 1s por HTTP POST. Los comandos llegan instantáneamente vía MQTT (suscripción a indmon/{id}/cmd). Si WiFi se cae, intenta reconectar 3 veces (cada 30s). Tras 3 fallos, activa automáticamente el modo BLE provisioning.

Modo BLE Provisioning

Cuando no hay WiFi configurada o falla la reconexión, el ESP32 emite una señal BLE con nombre IND-MONITOR. La app Android puede conectarse, escanear redes WiFi disponibles, y enviar credenciales. Al recibirlas, el ESP32 las guarda en NVS y se reinicia (con un delay de 2s para que el GATT ACK llegue antes del reinicio — fix del error 133).

Watchdog

Watchdog de hardware configurado a 60 segundos. Si el loop principal se bloquea por más de 60s, el ESP32 se reinicia automáticamente.

3.6 Motor de Reglas (RuleEngine v2)

El RuleEngine evalúa condiciones compuestas y ejecuta secuencias de acciones. Soporta hasta 16 reglas, cada una con hasta 3 condiciones (AND/OR) y 4 acciones secuenciales.

Fuente de condiciónEjemplo
tempdesc_0cm > 120°C
pressuresuction < 10 PSI
relaycompresor = ON
timeuptime > 3600s (1 hora desde boot)
AcciónEfectoParámetros
notifyEvento al backend + push notification Androiddelay_ms
resetPulso de reset al compresor (5s OFF, luego ON)delay_ms
blockBloquea compresor indefinidamentedelay_ms
unblockDesbloquea compresordelay_ms
reversing_on / reversing_offActiva/desactiva válvula inversoradelay_ms
aux_on / aux_offActiva/desactiva relé auxiliardelay_ms
waitEspera entre acciones (no ejecuta nada)delay_ms

Ciclo de evaluación: Condición → persistencia (debe cumplirse por X ms) → trigger → ejecución de secuencia de acciones → cooldown (no se re-dispara por Y ms). Las reglas se persisten en NVS y sobreviven reinicios.

3.7 Presiones Virtuales

Las presiones de succión y descarga se calculan a partir de las temperaturas de saturación usando coeficientes de Antoine validados contra NIST REFPROP. Como fallback se usa la temperatura de descarga a 0cm. Fórmula: ln(P[bar]) = A − B/(T[K] + C). Soportados 10 refrigerantes con offsets de rocío individuales.

3.8 Persistencia (NVS)

El ESP32 usa Preferences (Non-Volatile Storage) para guardar:

DatoNamespaceSe pierde al flashear?
WiFi SSID / PasswordindmonNo (partición NVS separada)
Estado de relésindmonNo
Labels de sensoresindmonNo
Reglas (JSON)rulesNo
Refrigerante seleccionadoindmonNo

3.9 Configuración de Compilación

Placa: esp32dev (ESP32-DevKitC)
Framework: Arduino (espressif32 @ 5.4.0)
Partición: min_spiffs.csv (SPIFFS para event log)
Flash usado: ~86% (1.69 MB / 1.97 MB)
RAM usado: ~19% (62 KB / 320 KB)
Watchdog: 60s, reseteado en cada iteración del loop
Stack del loop: 8 KB

3.10 Puerto Serial

ParámetroValor
Baudrate115200
Chipset USBCH340 (driver: WCH CH341SER)
Puerto (Windows)COM10
End-of-lineLF

Salida esperada al boot:

  Industrial Monitor v3.0 - 3x Rele
[ID] 140808AC7100
[SENS] 7 DS18B20 detectados
[RELAY] 3 canales OK
[RULES] 7 reglas cargadas
[WiFi] OK
[MQTT] Connecting to HiveMQ Cloud... OK
[MQTT] Subscribed to indmon/140808AC7100/cmd
[+] Listo
[HTTP] Telemetry sent (609 bytes) -> 200

4. Dashboard

Pantalla principal. Muestra todos los dispositivos registrados con un resumen de su estado.

Dashboard
Fig 1. Dashboard con dispositivo AC7100

Información mostrada

Barra superior

BotónFunción
🔧 HerramientasAbre la pantalla de herramientas (calculadoras, conversor, tablas)
📶 Configurar WiFiAbre el diálogo de configuración WiFi por HTTP
🔄 ActualizarRefresca manualmente los datos del dashboard
⋮ MenúOpciones: Configurar BLE, cambiar backend, etc.

Auto-refresh: El dashboard se actualiza automáticamente cada 3 segundos.

5. Pantalla del Dispositivo

Al tocar una tarjeta en el Dashboard, se abre la pantalla de detalle con toda la información del dispositivo.

Detalle del dispositivo
Fig 2. Pantalla de detalle — scroll hacia abajo para ver todas las secciones

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ónAcciónEfecto
ReiniciarCMD_RESETReinicia el compresor (apaga y quita bloqueo si existe)
DesbloquearCMD_UNBLOCKQuita bloqueo de seguridad
Inv. (ON/OFF)Toggle válvula inversoraActiva/desactiva la válvula de 4 vías
AuxToggle auxiliarActiva/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 WiFiAbre diálogo para cambiar la red WiFi del ESP32
📊 Ver Historial y GráficosNavega a la pantalla de historial con gráficos interactivos
🤖 Reglas de AutomatizaciónNavega a la pantalla de reglas

6. Historial y Gráficos

Pantalla de análisis histórico con gráficos interactivos, KPIs y registro de eventos.

Historial y Gráficos
Fig 3. Historial con gráfico, KPIs, selector de sensores y actividad

5.1 Controles superiores

ControlFunción
📅 Selector de fechaElige la fecha del historial. Se posiciona automáticamente en la última fecha con datos.
⏱ Selector de rango30 minutos, 1h, 2h, 6h, 12h, 24h. Define la ventana de tiempo del gráfico.
🔘 SensoresCheckboxes para elegir qué sensores mostrar en el gráfico (máximo 7).
🔄 Auto / ManualChip para activar/desactivar actualización automática (Live mode). Verde = refresco cada 5s sin parpadeo.
📥 CSVExporta los datos del rango seleccionado a formato CSV.

5.2 Gráfico interactivo

5.3 Panel de KPIs

Tarjetas con indicadores clave calculados para el período seleccionado:

KPIDescripción
🌡 Temp MínTemperatura más baja del período entre todos los sensores
🌡 Temp MáxTemperatura más alta del período
📊 Temp PromPromedio de todas las temperaturas
🔄 ΔT EvapDiferencia promedio entrada/salida del evaporador
🔄 ΔT CondDiferencia promedio entrada/salida del condensador
🔁 CiclosCantidad de arranques del compresor
⏱ Tiempo CompresorMinutos totales con compresor encendido
⚠ AlarmasCantidad 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.

7. Reglas de Automatización

Sistema de reglas para automatizar acciones en base a condiciones de temperatura, presión, estado de relés o tiempo.

Reglas de Automatización
Fig 4. Pantalla de reglas — con regla expandida mostrando opciones de editar/eliminar

6.1 Estructura de una regla

CampoDescripción
NombreEtiqueta descriptiva (ej: "Alta temp evap")
LógicaAND (todas las condiciones deben cumplirse) o OR (al menos una). Hasta 3 condiciones.
CondicionesFuente (temperatura, presión, relay, tiempo), sensor, operador (>, <, =) y umbral.
PersistenciaTiempo en ms que la condición debe mantenerse antes de disparar (default: 10s).
CooldownTiempo mínimo entre disparos consecutivos (default: 0 = sin cooldown).
AccionesSecuencia de hasta 4 pasos con delay entre cada uno.

6.2 Acciones disponibles

AcciónIconoEfecto
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)
DesbloquearQuita 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
EsperarPausa entre acciones (delay configurable en ms)

6.3 Gestión de reglas

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:

  1. Notificar (0ms) → push al teléfono
  2. 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.

8. 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)

Herramientas - Calculadoras
Fig 5. Pestaña Calculadoras: PT, superheat, subcooling, COP y ΔT

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)

Herramientas - Conversor
Fig 6. Conversor de presión: PSI ↔ bar ↔ kPa ↔ kg/cm²

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.

UnidadFactor
PSI1
bar1 PSI = 0.06895 bar
kPa1 PSI = 6.89476 kPa
kg/cm²1 PSI = 0.070307 kg/cm²

7.3 Tabla PT (pestaña 3)

Herramientas - Tabla PT
Fig 7. Tabla Presión-Temperatura de −40°C a 80°C

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)

Herramientas - Frac↔mm
Fig 8. Tabla de conversión fracciones de pulgada a mm

Dos secciones:

Historial flotante

Barra inferior que muestra las últimas 5 operaciones realizadas en las calculadoras (PT, SH, SC, COP, ΔT) con su valor y color.

9. 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:

1
Tocá Escanear redes. El comando viaja al ESP32 vía HTTP (polling cada 500ms).
2
El ESP32 escanea redes WiFi cercanas y devuelve la lista con SSID, RSSI (señal) y tipo de seguridad.
3
Seleccioná la red deseada de la lista.
4
Ingresá la contraseña (si la red es protegida).
5
Tocá Conectar. Las credenciales se envían al ESP32 como comando pendiente.
6
El ESP32 guarda las credenciales, se reinicia (~1 minuto) y se conecta a la nueva red.

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.

10. 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:

DatoProtocoloLatenciaMotivo
Telemetría (sensores, presiones)HTTP POST~200msConfiabilidad — Render permite HTTP sin restricciones
Comandos de relayMQTT~50msInstantáneo — sin polling, push directo al ESP32
Reglas de automatizaciónMQTT~50msConfig y disparos van por MQTT
Notificaciones de alarmaMQTT + HTTP~50-200msEvento instantáneo, almacenado por HTTP
Escaneo WiFi, refrigeranteMQTT~50msComandos de configuración
Historial, KPIs, herramientasHTTP REST~200msConsultas 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

TopicDirecciónQoSContenido
indmon/{id}/telemetryESP32 → Backend0JSON con 7 temperaturas, presiones, relay state, WiFi RSSI, reglas (al boot)
indmon/{id}/cmdBackend → ESP321JSON: {"command":"reset","params":{}}
indmon/{id}/statusESP32 → Backend1JSON: {"cmd":"reset","status":"ok"}
indmon/{id}/eventESP32 → Backend1JSON con evento de alarma/regla disparada

9.3 Broker HiveMQ Cloud

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.

11. 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.