08. Logica de fusion - diegogopa/Challenge-IOT GitHub Wiki

8. Lógica de fusión y clasificación de estados

8.1 Introducción

En el Challenge #1 el estado dependía solo del nivel de agua (OK, SEQUIA, DESBORDE) y las demás variables eran informativas. Esa fue una de las observaciones principales de la retroalimentación.

En la versión v3.2 se implementa una fusión multisensor en dos niveles:

  1. Fusión a nivel de señal (bajo nivel):
    • La temperatura del DHT22 corrige la velocidad del sonido del HC-SR04.
    • Temperatura, humedad y radiación UV se combinan en un índice de evaporación potencial.
  2. Fusión a nivel de decisión (reglas): el nivel filtrado, su tasa de cambio, el índice de evaporación y la tendencia de la presión atmosférica se combinan en reglas que determinan el estado del sistema.

Se eligió una fusión basada en reglas, en lugar de una única puntuación de riesgo ponderada, porque:

  • Cada regla corresponde a un fenómeno físico distinto (sequía, desborde, fuga), con una respuesta distinta de la autoridad.
  • Las reglas son explicables: ante una alarma se puede decir qué variable la disparó.
  • Los umbrales se pueden calibrar y validar uno por uno (sección 11.4).

El sistema contempla cinco estados:

OK · SEQUIA · DESBORDE · FUGA · ERROR_SENSOR

8.2 Variables utilizadas

Variable Origen Unidad Papel en la fusión
Nivel filtrado HC-SR04 (+ T del DHT22) % Variable principal de todas las reglas
Tendencia Nivel cada 10 s ↑ / = / ↓ Informativa (OLED y tablero)
Tasa real Nivel en ventana de 5 min %/h Regla de FUGA
Temperatura DHT22 °C Evaporación y velocidad del sonido
Humedad relativa DHT22 % Evaporación
Índice UV GUVA-S12SD — Evaporación
Índice de evaporación Calculado 0–100 Regla de SEQUIA por riesgo y pérdida esperada para FUGA
Variación de presión ΔP BMP180 en ventana de 3 h hPa Endurece la regla de SEQUIA por riesgo
Contador de fallas del nivel HC-SR04 ciclos Regla de ERROR_SENSOR

8.3 Filtrado y conversión de distancia a nivel

La distancia de cada disparo se calcula con la velocidad del sonido corregida por temperatura:

v (cm/µs) = 0.03313 + 0.0000606 · T(°C)
d (cm)    = t_eco(µs) · v / 2

Se toman 5 disparos, se descartan los que quedan fuera de 3–25 cm y, si hay al menos 3 válidos, se usa su mediana. Luego:

Nivel (%) = (D_vacío − d) / (D_vacío − D_lleno) × 100,   acotado a 0–100 %
D_lleno = 4 cm  (100 %)
D_vacío = 9 cm  (0 %)

Estas distancias corresponden al modelo a escala usado en las pruebas y se ajustan según la geometría del tanque real al instalar.

Se aplica un promedio móvil exponencial:

nivelEMA = 0.5 × nivel_nuevo + 0.5 × nivelEMA_anterior

Con α = 0.5 el filtro atenúa lecturas aisladas, pero el nivel alcanza ≈ 94 % de un cambio escalón en 4 ciclos (≈ 10 s), lo que mantiene bajo el tiempo de alerta.

8.4 Reglas de clasificación

Las reglas se evalúan en orden de prioridad; la primera que se cumple define el estado.

1. ERROR_SENSOR  si 5 ciclos seguidos sin eco válido del HC-SR04 (≈ 12 s)

   (si aún no hay ninguna medición de nivel válida → OK)

2. DESBORDE      si nivel ≥ 95 %
                 o (estado anterior = DESBORDE y nivel ≥ 90 %)

3. FUGA          si tasa válida
                 y tasaReal < 0
                 y pérdidaExtra = tasaReal − pérdidaEsperada ≤ −2.5 %/h

4. SEQUIA        si nivel ≤ 20 %
                 o (estado anterior = SEQUIA y nivel ≤ 25 %)
                 o (nivel ≤ 35 % y evap ≥ umbralEvap)
                    con umbralEvap = 55 si la presión cayó ≥ 2 hPa en 3 h
                                     70 en caso contrario

5. OK            en cualquier otro caso
Regla Variables fusionadas
DESBORDE Nivel
FUGA Nivel + tasa de cambio + temperatura + humedad + UV (vía pérdida esperada)
SEQUIA directa Nivel
SEQUIA por riesgo Nivel + temperatura + humedad + UV + presión
ERROR_SENSOR Calidad de la señal del HC-SR04

8.5 Histéresis

Estado Entrada Salida Banda
DESBORDE nivel ≥ 95 % nivel < 90 % 5 pp
SEQUIA nivel ≤ 20 % nivel > 25 % (y sin riesgo por evaporación) 5 pp

Una oscilación pequeña de la medición alrededor de un umbral no provoca cambios continuos de estado. La histéresis se verificó experimentalmente (sección 11.4).

8.6 ERROR_SENSOR y fallas de otros sensores

  • HC-SR04: es el sensor del que depende la variable principal, por eso su falla cambia el estado a ERROR_SENSOR, el nivel se muestra como ERR y suena la alarma continua. Así el operador distingue una falla del sensor de una condición real del agua.
  • DHT22, BMP180, GUVA-S12SD y OLED: su falla no cambia el estado; activa un bit de falla con aviso en OLED/tablero y chirrido. La lógica se degrada de forma segura:
    • Falla del DHT22: se conservan los últimos valores válidos de T y HR.
    • Falla del BMP180: presionCae = false, la regla de sequía usa el umbral normal (70).
    • Falla del GUVA-S12SD: índice UV = 0 (el índice de evaporación queda subestimado).

8.7 Tendencia y tasa de cambio

Tendencia (cada 10 s):   Δ = nivelEMA − nivelEMA_hace_10s
                         Δ > +1 pp → ↑   ·   Δ < −1 pp → ↓   ·   si no → =

Tasa real (cada 5 min):  tasaReal = (nivelEMA − nivelEMA_inicio_ventana) / horas   [%/h]

Una tasa negativa indica que el nivel baja. La tasa solo es válida después de completar la primera ventana.

8.8 Índice UV

La señal del GUVA-S12SD se promedia sobre 16 lecturas y se valida (dispersión ≤ 150 mV, voltaje ≤ 1.2 V, distinta de 0 mV exactos). La conversión es:

Índice UV = max(0, (V − 0.14 V) / 0.1 V)

donde 0.14 V es el voltaje de oscuridad (UV_V_OFFSET) y 0.1 V/índice la sensibilidad nominal del sensor.

Índice UV Categoría (OMS)
< 3 BAJA
3 – < 6 MEDIA
6 – < 8 ALTA
8 – < 11 MUY ALTA
≥ 11 EXTREMA

8.9 Índice de evaporación potencial

Inspirado en la lógica de Hargreaves-Samani y FAO-56 (más temperatura y radiación, y menos humedad, aumentan la evaporación), adaptado a los sensores disponibles:

T_norm  = (T − 15) / (40 − 15) × 100     acotado a 0–100
UV_norm = UVi / 11 × 100                 acotado a 0–100
HR_norm = 100 − HR

Evap = 0.40 · T_norm + 0.30 · UV_norm + 0.30 · HR_norm      (0–100)

Es un índice relativo, no una tasa física de evaporación en mm/día.

8.10 Lógica de FUGA

La pérdida de nivel esperada por evaporación se modela como proporcional al índice:

pérdidaEsperada = −(Evap / 100) × 4 %/h
pérdidaExtra    = tasaReal − pérdidaEsperada
FUGA si tasaReal < 0 y pérdidaExtra ≤ −2.5 %/h

Ejemplo: con Evap = 80 la pérdida esperada es −3.2 %/h. Si el tanque baja a −4 %/h la pérdida extra es −0.8 %/h → compatible con evaporación, no hay fuga. Si baja a −7 %/h, la pérdida extra es −3.8 %/h → FUGA.

Pérdida real
      │
      ├── explicada por la evaporación esperada → no se considera fuga
      │
      └── exceso ≤ −2.5 %/h → FUGA

8.11 Regla de presión atmosférica

Una caída sostenida de presión suele preceder cambios de tiempo, pero en temporada de El Niño, con baja probabilidad de lluvia, el sistema la usa de forma conservadora: no genera una alarma por sí misma, sino que adelanta la alerta de sequía reduciendo el umbral de evaporación de 70 a 55 cuando el nivel ya está en zona de riesgo (≤ 35 %).

Cada 3 h:  ΔP = P_actual − P_inicio_ventana
           presionCae = (ΔP ≤ −2 hPa)

El criterio de 2 hPa en 3 h corresponde a la convención meteorológica de tendencia barométrica en tres horas; el valor concreto es un parámetro inicial a ajustar con datos de campo.

8.12 Resumen de la fusión

  • El nivel gobierna todas las reglas y su filtrado usa la temperatura.
  • La histéresis estabiliza DESBORDE y SEQUIA.
  • La tasa de cambio, contrastada con la evaporación esperada (T + HR + UV), distingue fuga de evaporación.
  • La evaporación y la presión adelantan la alerta de sequía.
  • La detección de fallas evita que un sensor dañado produzca una clasificación incorrecta.

Como trabajo futuro se plantea complementar las reglas con un puntaje de riesgo continuo o un modelo predictivo entrenado con el histórico (sección 14.3).