Embedded data acquisition system (DAQ) for real-time monitoring of temperature, pH, DO, and EC in photobioreactors using Raspberry Pi and Atlas Scientific EZO modules via galvano-isolated I2C.
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
EMOTIONS-HUNTER 36743ed86b Agregar interfaz de notificaciones 4 weeks ago
api Agregar interfaz de notificaciones 4 weeks ago
config Agregar notificaciones y limite de acciones criticas 4 weeks ago
data Enfoque más profecional uso de codex y cambio a gémini 1 month ago
deployment Agregar notificaciones y limite de acciones criticas 4 weeks ago
docs Integrar adquisición y despliegue en Raspberry Pi 1 month ago
frontend Agregar interfaz de notificaciones 4 weeks ago
images Primer commit: Estructura base del proyecto Implementación de un Sistema de Monitoreo de Temperatura Basado en Raspberry Pi, Sensor EZO™ RTD y Sonda PT1000 Completada 2 months ago
logs Enfoque más profecional uso de codex y cambio a gémini 1 month ago
node_modules Estructura final del dashboard, archivos markdown de documentacion y prompt de fases 1 month ago
scripts Agregar notificaciones y limite de acciones criticas 4 weeks ago
sensors Permitir adquisicion parcial de sensores EZO 1 month ago
test Agregar interfaz de notificaciones 4 weeks ago
.gitignore Integrar adquisición y despliegue en Raspberry Pi 1 month ago
ARCHITECTURE.md Integrar dashboard y control EZO por I2C 1 month ago
PROJECT_STATUS.md Agregar notificaciones y limite de acciones criticas 4 weeks ago
README.md Agregar notificaciones y limite de acciones criticas 4 weeks ago
package-lock.json Integrar adquisición y despliegue en Raspberry Pi 1 month ago
package.json Integrar adquisición y despliegue en Raspberry Pi 1 month ago

README.md

Photobioreactor Dashboard

Sistema de monitoreo para Raspberry Pi y circuitos Atlas Scientific EZO:

Variable Circuito Dirección Unidad
Temperatura EZO-RTD 0x66 °C
pH EZO-pH 0x63 pH
Oxígeno disuelto EZO-DO 0x61 mg/L
Conductividad EZO-EC 0x64 µS/cm

El sistema incluye dashboard responsive, históricos Chart.js, alarmas, exportación CSV/Excel, consola de comandos y panel de calibración.

Arquitectura

EZO por I2C
    |
EZO_ACQUIRE / EZO_COMMAND
    |
Recolector Node ---------> data/*.json
    |                      logs/*.csv
    |
API Express <------------ Dashboard
    ^
    |
Nginx

EZO_ACQUIRE obtiene las cuatro lecturas en un ciclo agrupado. EZO_COMMAND ejecuta comandos interactivos y calibraciones. Ambos comparten el bloqueo /tmp/photobioreactor-i2c.lock.

Desarrollo sin sensores

npm ci
npm test

Ejecute en dos terminales:

EZO_MODE=demo npm run acquire
EZO_MODE=demo npm start

Abra http://localhost:3000/frontend/index.html.

En PowerShell:

$env:EZO_MODE = "demo"
npm run acquire

Y en una segunda terminal:

$env:EZO_MODE = "demo"
npm start

Raspberry Pi

El despliegue de producción usa EZO_MODE=hardware, systemd y Nginx:

chmod +x scripts/install-raspberry-pi.sh
sudo ./scripts/install-raspberry-pi.sh

La guía de preparación, detección I2C, calibración y prueba integral está en docs/RASPBERRY_PI_DEPLOYMENT.md.

Sensores conectados parcialmente

Para pruebas con solo EZO-RTD conectado, limite la adquisicion al sensor de temperatura desde el panel de configuracion o en config/runtime.json:

{
  "loggingRateSeconds": 1,
  "enabledSensors": ["temperature"]
}

Tambien puede forzarlo temporalmente por entorno:

EZO_MODE=hardware EZO_ENABLED_SENSORS=temperature npm run acquire

En produccion puede dejar EZO_ENABLED_SENSORS=temperature en /etc/default/photobioreactor como override. Cuando esten conectados los cuatro circuitos, deje la variable vacia y habilite RTD, pH, DO y EC desde el panel.

Seguridad operativa

En produccion configure API_AUTH_TOKEN en /etc/default/photobioreactor para proteger comandos EZO, calibracion, cambios de configuracion y borrado de historicos. El dashboard incluye un campo "Token API" que guarda el valor solo en el navegador local y lo envia como header X-API-Token. La API aplica comparacion de token en tiempo constante y headers defensivos basicos (nosniff, DENY, same-origin, no-store). Los POST criticos aplican rate limit en memoria mediante API_RATE_LIMIT_WINDOW_MS y API_RATE_LIMIT_MAX.

Bitacora de alarmas

El recolector registra transiciones de alarma en logs/alarms.csv y la API las expone en GET /api/alarms. Se registran entradas a WARNING, CRITICAL y OFFLINE, ademas de recuperaciones a NORMAL.

Retencion historica

config/runtime.json define historyRetentionDays. El valor puede ser 7, 30, 90, 365 o 0 para conservar indefinidamente. El recolector poda filas antiguas de CSV sin cambiar los nombres que usa el dashboard.

Umbrales de alarma

Los limites se guardan en config/alarms.json, se consultan con GET /api/config/alarms y pueden editarse desde el dashboard. Guardar cambios requiere API_AUTH_TOKEN cuando esta configurado.

Notificaciones

config/notifications.json define canales de webhook y Telegram. El recolector envia notificaciones cuando una alarma persistente alcanza minSeverity. La API expone configuracion redactada en GET /api/config/notifications; guardar requiere token y nunca devuelve secretos sin redaccion.

Archivos de datos

  • Lecturas actuales: data/EZORTD.json, EZOPH.json, EZODO.json, EZOEC.json.
  • Históricos: logs/temperature.csv, ph.csv, do.csv, ec.csv.
  • Umbrales: config/alarms.json.
  • Frecuencia de adquisición: config/runtime.json.

Los CSV usan una única nomenclatura y el formato:

timestamp,value
2026-06-22T12:00:00.000Z,25.123

Documentación

No se utiliza un driver personalizado del kernel. Linux ya proporciona la capa I2C mediante /dev/i2c-1; el protocolo ASCII, la adquisición y la calibración se mantienen en espacio de usuario para facilitar mantenimiento y diagnóstico.