9.8 KiB
Project Status - Photobioreactor Dashboard v1.0 + Phase 3
Estado general
Este repositorio contiene un sistema de monitoreo local para un fotobiorreactor basado en sensores Atlas Scientific EZO. La arquitectura actual separa la captura de datos en C, los archivos de intercambio en data/, los historiales CSV en logs/ y un dashboard web estatico en frontend/, pensado para desplegarse posteriormente en Raspberry Pi con Nginx.
Arquitectura actual
El flujo principal del sistema es:
- Los sensores Atlas Scientific se comunican por I2C con la Raspberry Pi.
- Los programas en
sensors/leen cada circuito EZO. - Cada lectura actual se escribe como JSON en
data/. - Los historiales se almacenan como CSV en
logs/. - Nginx sirve el repositorio como contenido estatico.
frontend/index.htmlcargadashboard.css, Chart.js ydashboard.js.- El navegador consulta los JSON cada segundo y actualiza las lecturas actuales.
- La seccion
Alarm Summaryevalua umbrales desdeconfig/alarms.json. - La seccion
Historical Trendsconsulta los CSV cada 10 segundos y actualiza las graficas.
No hay backend web ni base de datos en esta version. El filesystem funciona como interfaz entre los daemons de sensores y el frontend.
Sensores y archivos de datos actuales
| Sensor | Variable | Archivo JSON | Unidad |
|---|---|---|---|
| EZO-RTD | Temperatura | data/EZORTD.json |
degC |
| EZO-pH | pH | data/EZOPH.json |
pH |
| EZO-DO | Oxigeno disuelto | data/EZODO.json |
mg/L |
| EZO-EC | Conductividad | data/EZOEC.json |
uS/cm |
Archivos de historial
| Variable | Archivo CSV | Grafica |
|---|---|---|
| Temperatura | logs/temperature.csv |
Temperature vs Time |
| pH | logs/ph.csv |
pH vs Time |
| Oxigeno disuelto | logs/do.csv |
Dissolved Oxygen vs Time |
| Conductividad | logs/ec.csv |
Conductivity vs Time |
Formato CSV soportado:
timestamp,value
1717027200,25.488
El frontend tambien acepta timestamps ISO 8601 en la primera columna.
Archivos utilizados
| Ruta | Proposito |
|---|---|
frontend/index.html |
Estructura del dashboard, seccion System Status y seccion Historical Trends. |
frontend/dashboard.css |
Estilos responsive para metricas, estado del sistema y graficas. |
frontend/dashboard.js |
Lectura periodica de JSON, validacion de datos, lectura CSV y actualizacion de Chart.js. |
data/EZORTD.json |
Lectura actual de temperatura. |
data/EZOPH.json |
Lectura actual de pH. |
data/EZODO.json |
Lectura actual de oxigeno disuelto. |
data/EZOEC.json |
Lectura actual de conductividad. |
logs/temperature.csv |
Historial de temperatura para graficas. |
logs/ph.csv |
Historial de pH para graficas. |
logs/do.csv |
Historial de oxigeno disuelto para graficas. |
logs/ec.csv |
Historial de conductividad para graficas. |
config/sensors.json |
Configuracion declarativa de sensores Atlas Scientific. |
config/alarms.json |
Umbrales configurables para estados NORMAL, WARNING y CRITICAL. |
sensors/EZORTD/ |
Codigo C existente para lectura EZO-RTD. |
sensors/EZOPH/ |
Codigo C existente para lectura EZO-pH. |
sensors/EZODO/ |
Codigo C existente para lectura EZO-DO. |
sensors/EZOEC/ |
Codigo C existente para lectura EZO-EC. |
Funciones implementadas en v1.0
- Dashboard profesional para monitoreo del fotobiorreactor.
- Lectura de temperatura, pH, oxigeno disuelto y conductividad.
- Actualizacion automatica de lecturas actuales cada 1 segundo.
- Fecha y hora de ultima actualizacion.
- Validacion independiente por sensor.
- Estado
OFFLINEcuando un JSON no existe, no responde, contiene JSON invalido o no incluye un valor numerico valido. - Estado global del sistema:
ALL SYSTEMS ONLINE,PARTIAL DATAoSYSTEM OFFLINE. - Seccion inferior
System Status. - Conteo de sensores activos y sensores offline.
- Diseno responsive para escritorio, tablet y movil.
Funciones implementadas en Phase 2 - Historical Trends
- Nueva seccion
Historical Trendsdebajo deSystem Status. - Integracion de Chart.js para graficas de linea.
- Cuatro graficas independientes:
- Temperature vs Time.
- pH vs Time.
- Dissolved Oxygen vs Time.
- Conductivity vs Time.
- Lectura de historiales desde
logs/temperature.csv,logs/ph.csv,logs/do.csvylogs/ec.csv. - Actualizacion automatica de graficas cada 10 segundos.
- Estado visual
No historical data availablecuando un CSV no existe, esta vacio o no contiene datos numericos validos. - Parser CSV reutilizable con soporte principal para
timestamp,valuey compatibilidad adicional con encabezados comotime,date, nombres de variable yreading. - Las instancias Chart.js se conservan en memoria y las actualizaciones cambian datasets existentes con
chart.update("none"). - Configuracion Chart.js para dashboard cientifico:
responsive: true,maintainAspectRatio: falseyanimation: false. - Funciones reutilizables para futuras graficas:
readHistoricalData()parseHistoricalCsv()buildChartDataset()getChartOptions()renderHistoricalChart()updateHistoricalTrends()
- Diseno responsive para dos columnas en escritorio y una columna en movil.
Funciones implementadas en Phase 3 - Alarmas y umbrales configurables
- Archivo
config/alarms.jsonnormalizado con umbrales por variable:- Temperatura: 20 a 30 degC.
- pH: 6.8 a 7.5.
- Oxigeno disuelto: 4.0 a 12.0 mg/L.
- Conductividad: 500 a 2500 uS/cm.
- El frontend lee
../config/alarms.jsondurante el ciclo de actualizacion. - Cada sensor se evalua como:
NORMAL: valor dentro del rango y fuera de la banda de advertencia.WARNING: valor dentro del rango, pero cerca deminomax.CRITICAL: valor por debajo demino por encima demax.OFFLINE: JSON faltante, invalido o sin valor numerico.
- La banda
WARNINGusa el 10% del ancho del rango configurado, definido enWARNING_MARGIN_RATIO. - Las tarjetas cambian visualmente por estado:
- Verde para
NORMAL. - Amarillo para
WARNING. - Rojo para
CRITICAL. - Gris para
OFFLINE.
- Verde para
- Nueva seccion
Alarm Summarycon:Active Critical Alarms.Active Warnings.Offline Sensors.Overall Risk Level.
- Lista activa de sensores en alarma u offline.
- Estructura de eventos de alarma preparada para integraciones futuras:
sensorIdsensorNameseverityvaluemessagecreatedAt
Arquitectura de alarmas
El flujo de alarmas es:
dashboard.jslee los JSON de sensores desdedata/.dashboard.jslee los umbrales desdeconfig/alarms.json.evaluateSensorAlarm()compara cada valor contraminymax.renderSystemStatus()actualiza el estado general.renderAlarmSummary()actualiza conteos, riesgo global y lista de alarmas.
La logica queda encapsulada para que una fase posterior pueda enviar los eventos generados por getAlarmEvents() a correo, Telegram o MQTT sin acoplar esas salidas al renderizado visual.
Dependencias nuevas
| Dependencia | Uso | Carga |
|---|---|---|
| Chart.js | Renderizado de graficas historicas de linea | CDN en frontend/index.html |
Nota de despliegue: Chart.js por CDN requiere conectividad desde el navegador. Para una Raspberry Pi aislada o una red local sin internet, se recomienda descargar una copia local versionada y servirla desde frontend/vendor/.
Nomenclatura de historiales CSV
Se detecto una inconsistencia entre logs/temp.csv y logs/temperature.csv:
frontend/dashboard.jsconsumelogs/temperature.csv.- El archivo presente en
logs/estemperature.csv. - Versiones anteriores de
ARCHITECTURE.mdysensors/EZORTD/ezortd_daemon.capuntaban alogs/temp.csv.
Nomenclatura unica propuesta y aplicada para todo el proyecto:
| Variable | Nombre canonico |
|---|---|
| Temperatura | logs/temperature.csv |
| pH | logs/ph.csv |
| Oxigeno disuelto | logs/do.csv |
| Conductividad | logs/ec.csv |
La razon es mantener nombres descriptivos, consistentes con las etiquetas cientificas del dashboard y faciles de extender en exportaciones futuras.
Proximas fases
-
Historial CSV persistente
- Unificar la escritura de logs en
logs/odata/. - Definir encabezados estables para cada sensor.
- Registrar timestamp ISO y valor numerico por lectura.
- Unificar la escritura de logs en
-
Controles de rango para graficas
- Agregar rangos de tiempo: 5 min, 1 h, 24 h.
- Permitir pausa/reanudacion de actualizacion historica.
- Mostrar minimos, maximos y promedios por ventana.
-
Notificaciones de alarmas
- Enviar eventos de
getAlarmEvents()por correo. - Enviar alertas por Telegram.
- Publicar alarmas por MQTT.
- Preparar salidas GPIO locales para alarmas criticas.
- Enviar eventos de
-
Exportacion CSV
- Descargar historiales por sensor.
- Exportar ventanas de tiempo seleccionadas.
- Mantener compatibilidad con herramientas de analisis cientifico.
-
Exportacion Excel
- Generar archivos
.xlsxcon hojas por sensor. - Incluir metadatos del experimento.
- Preparar tablas y graficas basicas.
- Generar archivos
-
Calibracion Atlas Scientific
- Crear interfaz guiada para rutinas de calibracion.
- Registrar fecha, operador y resultado de calibracion.
- Proteger comandos criticos con confirmaciones.
-
Comandos EZO desde la web
- Agregar una API local para enviar comandos a los circuitos EZO.
- Implementar endpoints seguros para lectura, calibracion y diagnostico.
- Separar permisos de monitoreo y administracion.
Notas de despliegue
Para Raspberry Pi con Nginx, el root del sitio debe apuntar al directorio raiz del repositorio. El dashboard se abre desde:
/frontend/index.html
Desde esa ubicacion, el frontend lee los datos usando rutas relativas hacia ../data/*.json y ../logs/*.csv.
Chart.js se carga desde CDN en esta fase. Para uso sin internet en la Raspberry Pi, la siguiente mejora recomendada es descargar una copia local versionada de Chart.js y servirla desde frontend/vendor/.