Saltar a contenido

Simulacion de Sensores

El sistema de simulacion permite ejecutar el pipeline completo sin hardware I2C conectado. Reemplaza los sensores reales con generadores de datos sinteticos que implementan la misma interfaz read_*().

Como Funciona

flowchart TB
    subgraph Simulacion
        SS[SimulatedSensors<br/>Ornstein-Uhlenbeck] --> |read_co2, read_ph...| M[Monitores Reales]
    end
    subgraph Produccion
        RS[Sensores EZO<br/>smbus2 I2C] --> |read_co2, read_ph...| M2[Monitores Reales]
    end
    M --> MQTT[MQTT Pipeline]
    M2 --> MQTT

Los sensores simulados se inyectan via el patron de dependency injection existente:

# El monitor acepta sensor opcional
CO2Monitor(lower, upper, input_EZO_CO2Sensor=SimulatedCO2Sensor())

Modelo de Datos: Ornstein-Uhlenbeck

Cada sensor simulado usa un proceso estocastico de mean reversion que genera datos realistas:

  • Media: valor objetivo alrededor del cual fluctua
  • Desviacion estandar: magnitud del ruido
  • Tasa de reversion: que tan rapido vuelve a la media (0-1)
  • Ciclo diurno: sinusoide de 24h (opcional)
  • Anomalias: spikes aleatorios (probabilidad configurable)
  • Fallas: retorna NaN simulando desconexion (probabilidad configurable)

Escenarios Disponibles

Escenario Descripcion
normal Operacion normal con fluctuaciones naturales
heat_wave Temperatura alta, humedad baja, estres de oxigeno
nutrient_imbalance pH y EC fuera de rango, degradacion de nutrientes
sensor_failure Lecturas NaN aleatorias simulando fallas hardware
anomaly_spikes Spikes extremos ocasionales en multiples sensores
night_cycle Condiciones nocturnas: CO2 alto, humedad alta, temp baja
stress Todos los parametros cerca de sus limites

Uso

# Listar escenarios
make dev-raspberry-i2c-sim-scenarios

# Ejecutar simulacion normal
make dev-raspberry-i2c-sim

# Escenario especifico con intervalo custom
SCENARIO=heat_wave INTERVAL=10 make dev-raspberry-i2c-sim

# Via Python directo
cd apps/raspberry
.venv/bin/python3 -m src.main \
    --orchestrator-mode indoor \
    --simulate \
    --scenario nutrient_imbalance \
    --sim-interval 15 \
    --debug

Salida de Ejemplo

======================================================================
  SIMULATION [heat_wave]  --  14:23:15
======================================================================
  CO2:                                  537.91 ppm
  Humedad:                               38.22 %
  Temperatura (solucion):                30.46 C
  pH:                                     6.26
  EC:                                  1800.18 uS/cm
  TDS:                                 1206.68 mg/L
  DO:                                     4.54 mg/L
  ORP:                                  366.14 mV

  ALERTS:
  !! Humidity below lower bound (40)
======================================================================