Compare commits
No commits in common. 'e372c6bfceca39f90aee5989647e449cad69e071' and 'bdc8c2f5ade6bd0b6309c63698291c2f150369cc' have entirely different histories.
e372c6bfce
...
bdc8c2f5ad
@ -1,198 +1,113 @@
|
|||||||
# Estado del Proyecto
|
# Estado del Proyecto
|
||||||
|
|
||||||
## Resumen
|
## Estado actual
|
||||||
|
|
||||||
El proyecto implementa un dashboard web para monitoreo de fotobiorreactor con
|
|
||||||
Raspberry Pi y circuitos Atlas Scientific EZO. La aplicacion puede trabajar en
|
|
||||||
modo demo para desarrollo sin hardware y en modo hardware usando `/dev/i2c-1`.
|
|
||||||
|
|
||||||
## Estado Actual
|
|
||||||
|
|
||||||
Implementado:
|
|
||||||
|
|
||||||
- Dashboard responsive.
|
|
||||||
- Lecturas en vivo desde `data/*.json`.
|
|
||||||
- Adquisicion automatica con `api/acquisition.js`.
|
|
||||||
- Helper C `EZO_ACQUIRE` para lecturas agrupadas.
|
|
||||||
- Helper C `EZO_COMMAND` para comandos y calibracion.
|
|
||||||
- Sintaxis, tiempos y secuencias de calibracion auditados contra datasheets Atlas.
|
|
||||||
- Historial CSV por sensor.
|
|
||||||
- Graficas con Chart.js.
|
|
||||||
- Exportacion CSV y Excel con SheetJS.
|
|
||||||
- Alarmas configurables.
|
|
||||||
- Bitacora de alarmas en `logs/alarms.csv`.
|
|
||||||
- Notificaciones por webhook y Telegram.
|
|
||||||
- Configuracion de sensores habilitados.
|
|
||||||
- Retencion historica configurable.
|
|
||||||
- Servicios `systemd` para API y adquisicion.
|
|
||||||
- Configuracion Nginx.
|
|
||||||
- Instalador para Raspberry Pi.
|
|
||||||
|
|
||||||
## Componentes Principales
|
|
||||||
|
|
||||||
| Componente | Responsabilidad |
|
El dashboard integra monitoreo en vivo, alarmas configurables, tendencias,
|
||||||
|---|---|
|
exportación CSV/Excel, consola EZO y calibración. La adquisición puede operar en
|
||||||
| `frontend/` | Dashboard, graficas, controles, exportaciones y consola EZO |
|
modo demo o en Raspberry Pi mediante `/dev/i2c-1`.
|
||||||
| `api/server.js` | API HTTP, configuracion, historicos, comandos y seguridad |
|
|
||||||
| `api/acquisition.js` | Proceso continuo de adquisicion |
|
|
||||||
| `api/acquisition-service.js` | Lectura, escritura atomica, alarmas y retencion |
|
|
||||||
| `api/notification-service.js` | Webhook y Telegram |
|
|
||||||
| `sensors/EZOCommand/EZO_ACQUIRE` | Lectura agrupada de sensores EZO |
|
|
||||||
| `sensors/EZOCommand/EZO_COMMAND` | Comandos individuales EZO |
|
|
||||||
| `config/*.json` | Configuracion operativa |
|
|
||||||
| `deployment/` | Servicios systemd, Nginx y variables de entorno |
|
|
||||||
| `scripts/install-raspberry-pi.sh` | Instalacion automatizada en Raspberry Pi |
|
|
||||||
|
|
||||||
## Sensores
|
|
||||||
|
|
||||||
| Sensor | Direccion esperada | Estado en software |
|
|
||||||
|---|---:|---|
|
|
||||||
| EZO-RTD | `0x66` | Implementado |
|
|
||||||
| EZO-pH | `0x63` | Implementado |
|
|
||||||
| EZO-DO | `0x61` | Implementado |
|
|
||||||
| EZO-EC | `0x64` | Implementado |
|
|
||||||
|
|
||||||
El sistema tambien puede detectar otros EZO en el bus, por ejemplo ORP, pero el
|
|
||||||
dashboard actual solo modela RTD, pH, DO y EC.
|
|
||||||
|
|
||||||
## Modos De Operacion
|
|
||||||
|
|
||||||
| Modo | Uso |
|
|
||||||
|---|---|
|
|
||||||
| `EZO_MODE=demo` | Desarrollo sin Raspberry ni sensores |
|
|
||||||
| `EZO_MODE=auto` | Usa hardware si esta disponible; si no, demo |
|
|
||||||
| `EZO_MODE=hardware` | Produccion estricta; no simula datos |
|
|
||||||
|
|
||||||
En Raspberry Pi de produccion se usa `EZO_MODE=hardware`.
|
|
||||||
|
|
||||||
## Datos
|
|
||||||
|
|
||||||
Lecturas actuales:
|
|
||||||
|
|
||||||
- `data/EZORTD.json`
|
|
||||||
- `data/EZOPH.json`
|
|
||||||
- `data/EZODO.json`
|
|
||||||
- `data/EZOEC.json`
|
|
||||||
|
|
||||||
Historicos:
|
|
||||||
|
|
||||||
- `logs/temperature.csv`
|
|
||||||
- `logs/ph.csv`
|
|
||||||
- `logs/do.csv`
|
|
||||||
- `logs/ec.csv`
|
|
||||||
|
|
||||||
Formato:
|
|
||||||
|
|
||||||
```csv
|
|
||||||
timestamp,value
|
|
||||||
2026-07-07T17:26:13.459Z,25.132
|
|
||||||
```
|
|
||||||
|
|
||||||
Las graficas muestran el dia actual. Los CSV conservan el periodo configurado
|
|
||||||
por `historyRetentionDays`.
|
|
||||||
|
|
||||||
## Alarmas
|
|
||||||
|
|
||||||
Los umbrales viven en:
|
|
||||||
|
|
||||||
```text
|
|
||||||
config/alarms.json
|
|
||||||
```
|
|
||||||
|
|
||||||
Estados:
|
|
||||||
|
|
||||||
- `NORMAL`
|
|
||||||
- `WARNING`
|
|
||||||
- `CRITICAL`
|
|
||||||
- `OFFLINE`
|
|
||||||
- `DISABLED`
|
|
||||||
|
|
||||||
Los eventos se guardan en:
|
## Arquitectura operativa
|
||||||
|
|
||||||
```text
|
| Componente | Responsabilidad |
|
||||||
logs/alarms.csv
|
|---|---|
|
||||||
```
|
| `api/server.js` | API, históricos, configuración y comandos EZO |
|
||||||
|
| `api/acquisition.js` | Ciclo continuo de adquisición |
|
||||||
Los sensores deshabilitados no generan alarma ni riesgo global.
|
| `api/acquisition-service.js` | Escritura atómica de JSON/CSV y configuración |
|
||||||
|
| `sensors/EZOCommand/EZO_ACQUIRE` | Lectura agrupada de los cuatro EZO |
|
||||||
|
| `sensors/EZOCommand/EZO_COMMAND` | Comandos y calibración de un circuito |
|
||||||
|
| `frontend/` | Dashboard, gráficas, alarmas, exportación y consola |
|
||||||
|
|
||||||
|
Los dos helpers C usan `/tmp/photobioreactor-i2c.lock`. El recolector inicia la
|
||||||
|
conversión de los cuatro sensores antes de esperar, por lo que comparte una sola
|
||||||
|
ventana de procesamiento en vez de bloquear un segundo por sensor.
|
||||||
|
|
||||||
|
## Funciones implementadas
|
||||||
|
|
||||||
|
- Lecturas de RTD, pH, DO y EC con publicación en `data/*.json`.
|
||||||
|
- Históricos normalizados como `logs/temperature.csv`, `ph.csv`, `do.csv` y
|
||||||
|
`ec.csv`, todos con formato `timestamp,value`.
|
||||||
|
- Escritura atómica de JSON y estado `online: false` ante fallos globales o
|
||||||
|
lecturas individuales inválidas.
|
||||||
|
- Detección de datos obsoletos con tolerancia proporcional a la frecuencia.
|
||||||
|
- Frecuencia persistente de 1, 5, 10 o 60 segundos en `config/runtime.json`.
|
||||||
|
- Exportaciones alimentadas por CSV reales, sin generación aleatoria en la API.
|
||||||
|
- Verificación automática `Cal,?` después de una calibración enviada desde web.
|
||||||
|
- Chart.js 4.5.1 y SheetJS 0.20.3 instalados localmente.
|
||||||
|
- Servicios systemd, configuración Nginx e instalador para Raspberry Pi.
|
||||||
|
|
||||||
|
## Configuracion parcial de sensores
|
||||||
|
|
||||||
|
- `config/runtime.json` guarda `enabledSensors`.
|
||||||
|
- Los sensores deshabilitados se muestran como `DESHABILITADO`.
|
||||||
|
- Un sensor deshabilitado no cuenta como `OFFLINE`, alarma ni riesgo global.
|
||||||
|
|
||||||
|
## Seguridad operativa
|
||||||
|
|
||||||
|
- `API_AUTH_TOKEN` protege endpoints criticos cuando esta configurado.
|
||||||
|
- El dashboard envia el token como `X-API-Token` desde almacenamiento local del
|
||||||
|
navegador.
|
||||||
|
- La API compara tokens en tiempo constante y emite headers defensivos basicos.
|
||||||
|
- Los POST criticos usan rate limit configurable en memoria.
|
||||||
|
- Sin `API_AUTH_TOKEN`, el modo desarrollo permanece sin autenticacion.
|
||||||
|
|
||||||
|
## Bitacora de alarmas
|
||||||
|
|
||||||
|
- `logs/alarms.csv` registra transiciones a `WARNING`, `CRITICAL`, `OFFLINE` y
|
||||||
|
recuperaciones `RECOVERY`.
|
||||||
|
- `GET /api/alarms` expone los eventos para dashboard y futuras notificaciones.
|
||||||
|
- Los sensores `DISABLED` no generan eventos de alarma.
|
||||||
|
|
||||||
|
## Umbrales configurables
|
||||||
|
|
||||||
|
- `GET /api/config/alarms` expone los limites actuales.
|
||||||
|
- `POST /api/config/alarms` valida y persiste cambios en `config/alarms.json`.
|
||||||
|
- El dashboard permite editar min/max por sensor; guardar requiere token si
|
||||||
|
`API_AUTH_TOKEN` esta activo.
|
||||||
|
|
||||||
|
## Retencion historica
|
||||||
|
|
||||||
|
- `historyRetentionDays` en `config/runtime.json` controla poda automatica de
|
||||||
|
CSV.
|
||||||
|
- Valores permitidos: 7, 30, 90, 365 o 0 para retencion indefinida.
|
||||||
|
- La poda conserva los nombres actuales de archivos para no romper graficas ni
|
||||||
|
exportaciones.
|
||||||
|
- Las graficas filtran visualmente el dia actual; los CSV mantienen todos los
|
||||||
|
registros disponibles dentro de la retencion configurada.
|
||||||
|
|
||||||
## Notificaciones
|
## Notificaciones
|
||||||
|
|
||||||
Configuracion:
|
- `config/notifications.json` permite activar webhook y Telegram.
|
||||||
|
- `GET /api/config/notifications` devuelve configuracion redactada.
|
||||||
```text
|
- `POST /api/config/notifications` valida y persiste canales con token.
|
||||||
config/notifications.json
|
- El recolector despacha notificaciones desde eventos de `logs/alarms.csv`.
|
||||||
```
|
- `docs/TELEGRAM_BOT_SETUP.md` documenta creacion del bot, obtencion de
|
||||||
|
`chatId`, configuracion, pruebas y diagnostico.
|
||||||
En produccion:
|
|
||||||
|
|
||||||
```text
|
|
||||||
/etc/photobioreactor/notifications.json
|
|
||||||
```
|
|
||||||
|
|
||||||
Canales:
|
|
||||||
|
|
||||||
- Webhook HTTP.
|
|
||||||
- Telegram Bot API.
|
|
||||||
|
|
||||||
El backend redacta secretos cuando envia configuracion al navegador.
|
|
||||||
|
|
||||||
## Seguridad
|
|
||||||
|
|
||||||
Implementado:
|
|
||||||
|
|
||||||
- `API_AUTH_TOKEN` para endpoints criticos.
|
|
||||||
- Header `X-API-Token`.
|
|
||||||
- Comparacion de token en tiempo constante.
|
|
||||||
- Rate limit para acciones criticas.
|
|
||||||
- Headers HTTP defensivos basicos.
|
|
||||||
- API escuchando en `127.0.0.1` detras de Nginx.
|
|
||||||
|
|
||||||
Pendiente si se expone fuera de LAN:
|
|
||||||
|
|
||||||
- HTTPS.
|
|
||||||
- Autenticacion de usuario completa.
|
|
||||||
- Politica de acceso por VPN o red privada.
|
|
||||||
|
|
||||||
## Validacion
|
|
||||||
|
|
||||||
Validado en desarrollo:
|
|
||||||
|
|
||||||
- Pruebas automatizadas Node.
|
## Modos
|
||||||
- Modo demo.
|
|
||||||
- Dashboard por HTTP local.
|
|
||||||
- Chart.js y SheetJS locales.
|
|
||||||
- Comandos EZO simulados.
|
|
||||||
- Pruebas de sintaxis oficial por sensor y tiempos de procesamiento.
|
|
||||||
- Preservacion de bloques hexadecimales para exportar/importar calibracion.
|
|
||||||
- Configuracion de alarmas y notificaciones.
|
|
||||||
|
|
||||||
Validacion en Raspberry:
|
- `EZO_MODE=demo`: adquisición y comandos simulados.
|
||||||
|
- `EZO_MODE=auto`: hardware cuando existen el bus y los helpers; demo en otro
|
||||||
|
caso.
|
||||||
|
- `EZO_MODE=hardware`: producción estricta; un despliegue incompleto falla y no
|
||||||
|
genera valores simulados.
|
||||||
|
|
||||||
- I2C mediante `/dev/i2c-1`.
|
## Verificación realizada
|
||||||
- Servicios `systemd`.
|
|
||||||
- Lecturas reales parciales cuando los sensores estan conectados.
|
|
||||||
|
|
||||||
La calibracion metrologica y la estabilidad final deben verificarse siempre con
|
- 16 pruebas automáticas aprobadas.
|
||||||
sondas reales, soluciones de referencia y operacion continua.
|
- Validación sintáctica de todos los JavaScript modificados.
|
||||||
|
- Dashboard, Chart.js, SheetJS y comando pH comprobados por HTTP en modo demo.
|
||||||
|
- `npm audit --omit=dev`: cero vulnerabilidades conocidas.
|
||||||
|
|
||||||
## Trabajo Pendiente Recomendado
|
La compilación ARM, el bus I2C, la estabilidad de las sondas y las calibraciones
|
||||||
|
metrológicas solo pueden verificarse en la Raspberry Pi con hardware real.
|
||||||
|
|
||||||
- Prueba continua de 8 a 24 horas en Raspberry.
|
## Trabajo pendiente en hardware
|
||||||
- Validacion con los cuatro sensores conectados.
|
|
||||||
- Calibracion real documentada con fecha y soluciones usadas.
|
|
||||||
- Confirmar notificaciones Telegram en la red final.
|
|
||||||
- Evaluar integracion futura de ORP si se decide usar ese sensor.
|
|
||||||
- Mejorar exportaciones para seleccionar rango: dia actual, ultimas 24 horas o
|
|
||||||
todo el historico.
|
|
||||||
|
|
||||||
## Documentos Relacionados
|
1. Ejecutar `i2cdetect -y 1` y confirmar `0x61`, `0x63`, `0x64` y `0x66`.
|
||||||
|
2. Compilar ambos helpers con `make -C sensors/EZOCommand`.
|
||||||
|
3. Validar `i`, `Status`, `R` y `Cal,?` individualmente.
|
||||||
|
4. Realizar las calibraciones con soluciones de referencia.
|
||||||
|
5. Probar desconexiones, reinicio automático y operación continua de varias
|
||||||
|
horas.
|
||||||
|
|
||||||
- `README.md`
|
Consulte `docs/RASPBERRY_PI_DEPLOYMENT.md` para el procedimiento completo.
|
||||||
- `docs/README.md`
|
|
||||||
- `docs/QUICK_START.md`
|
|
||||||
- `docs/RASPBERRY_PI_DEPLOYMENT.md`
|
|
||||||
- `docs/EZO_COMMANDS.md`
|
|
||||||
- `docs/TROUBLESHOOTING.md`
|
|
||||||
- `docs/STORAGE_ESTIMATE.md`
|
|
||||||
- `docs/TELEGRAM_BOT_SETUP.md`
|
|
||||||
- `ARCHITECTURE.md`
|
|
||||||
|
|||||||
@ -1,163 +0,0 @@
|
|||||||
# Inicio Rapido
|
|
||||||
|
|
||||||
Esta guia es para levantar el proyecto sin entrar todavia en todos los detalles
|
|
||||||
tecnicos.
|
|
||||||
|
|
||||||
## Que Necesitas
|
|
||||||
|
|
||||||
Para desarrollo sin sensores:
|
|
||||||
|
|
||||||
- Una computadora con Node.js.
|
|
||||||
- El repositorio clonado.
|
|
||||||
|
|
||||||
Para Raspberry Pi:
|
|
||||||
|
|
||||||
- Raspberry Pi con Raspberry Pi OS.
|
|
||||||
- I2C habilitado.
|
|
||||||
- Modulos Atlas Scientific EZO en modo I2C.
|
|
||||||
- Red local para abrir el dashboard.
|
|
||||||
|
|
||||||
## Probar Sin Sensores
|
|
||||||
|
|
||||||
Instale dependencias:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm ci
|
|
||||||
```
|
|
||||||
|
|
||||||
Ejecute pruebas:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm test
|
|
||||||
```
|
|
||||||
|
|
||||||
Abra dos terminales.
|
|
||||||
|
|
||||||
Terminal 1:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
EZO_MODE=demo npm run acquire
|
|
||||||
```
|
|
||||||
|
|
||||||
Terminal 2:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
EZO_MODE=demo npm start
|
|
||||||
```
|
|
||||||
|
|
||||||
Abra:
|
|
||||||
|
|
||||||
```text
|
|
||||||
http://localhost:3000/frontend/index.html
|
|
||||||
```
|
|
||||||
|
|
||||||
En Windows PowerShell:
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
$env:EZO_MODE = "demo"
|
|
||||||
npm run acquire
|
|
||||||
```
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
$env:EZO_MODE = "demo"
|
|
||||||
npm start
|
|
||||||
```
|
|
||||||
|
|
||||||
## Instalar En Raspberry Pi
|
|
||||||
|
|
||||||
Clone el repositorio:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git clone ssh://git@gitea.itmorelia.com:222/Verano-Delfin-2026/bioreactor-multiparametric-daq-shield.git
|
|
||||||
cd bioreactor-multiparametric-daq-shield
|
|
||||||
```
|
|
||||||
|
|
||||||
Ejecute el instalador:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
chmod +x scripts/install-raspberry-pi.sh
|
|
||||||
sudo ./scripts/install-raspberry-pi.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
Abra el dashboard desde otra computadora:
|
|
||||||
|
|
||||||
```text
|
|
||||||
http://IP_DE_LA_RASPBERRY/frontend/index.html
|
|
||||||
```
|
|
||||||
|
|
||||||
## Verificar Que Esta Corriendo
|
|
||||||
|
|
||||||
```bash
|
|
||||||
systemctl status photobioreactor-api --no-pager
|
|
||||||
systemctl status photobioreactor-acquisition --no-pager
|
|
||||||
systemctl status nginx --no-pager
|
|
||||||
```
|
|
||||||
|
|
||||||
Si todo esta bien, los servicios deben aparecer como `active (running)`.
|
|
||||||
|
|
||||||
## Ver Sensores En I2C
|
|
||||||
|
|
||||||
```bash
|
|
||||||
i2cdetect -y 1
|
|
||||||
```
|
|
||||||
|
|
||||||
Mapa esperado:
|
|
||||||
|
|
||||||
| Direccion | Sensor |
|
|
||||||
|---:|---|
|
|
||||||
| `0x61` | EZO-DO |
|
|
||||||
| `0x63` | EZO-pH |
|
|
||||||
| `0x64` | EZO-EC |
|
|
||||||
| `0x66` | EZO-RTD |
|
|
||||||
|
|
||||||
Si falta un sensor, revise cableado, alimentacion y modo I2C.
|
|
||||||
|
|
||||||
## Habilitar Solo Sensores Conectados
|
|
||||||
|
|
||||||
Edite:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo nano /opt/photobioreactor/config/runtime.json
|
|
||||||
```
|
|
||||||
|
|
||||||
Ejemplo con RTD, pH y EC:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"loggingRateSeconds": 5,
|
|
||||||
"historyRetentionDays": 30,
|
|
||||||
"enabledSensors": [
|
|
||||||
"temperature",
|
|
||||||
"ph",
|
|
||||||
"ec"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Reinicie adquisicion:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo systemctl restart photobioreactor-acquisition
|
|
||||||
```
|
|
||||||
|
|
||||||
## Revisar Datos
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cat /opt/photobioreactor/data/EZORTD.json
|
|
||||||
cat /opt/photobioreactor/data/EZOPH.json
|
|
||||||
cat /opt/photobioreactor/data/EZOEC.json
|
|
||||||
```
|
|
||||||
|
|
||||||
```bash
|
|
||||||
tail /opt/photobioreactor/logs/temperature.csv
|
|
||||||
tail /opt/photobioreactor/logs/ph.csv
|
|
||||||
tail /opt/photobioreactor/logs/ec.csv
|
|
||||||
```
|
|
||||||
|
|
||||||
## Si Algo Falla
|
|
||||||
|
|
||||||
Lea:
|
|
||||||
|
|
||||||
```text
|
|
||||||
docs/TROUBLESHOOTING.md
|
|
||||||
```
|
|
||||||
@ -1,303 +1,116 @@
|
|||||||
# Despliegue En Raspberry Pi
|
# Despliegue y validación en Raspberry Pi
|
||||||
|
|
||||||
Guia para instalar, validar y operar el dashboard en Raspberry Pi.
|
## Prueba sin hardware
|
||||||
|
|
||||||
## 1. Preparar Raspberry Pi OS
|
En una computadora de desarrollo:
|
||||||
|
|
||||||
Actualice el sistema:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo apt update
|
|
||||||
sudo apt upgrade -y
|
|
||||||
```
|
|
||||||
|
|
||||||
Instale herramientas base:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo apt install -y git build-essential i2c-tools nginx nodejs npm
|
npm ci
|
||||||
|
npm test
|
||||||
```
|
```
|
||||||
|
|
||||||
Habilite I2C:
|
Para ejecutar el sistema completo en demo, use dos terminales:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo raspi-config
|
EZO_MODE=demo npm run acquire
|
||||||
|
EZO_MODE=demo npm start
|
||||||
```
|
```
|
||||||
|
|
||||||
Ruta:
|
Abra `http://localhost:3000/frontend/index.html`. El recolector genera JSON y
|
||||||
|
CSV de prueba; la consola y el panel de calibración muestran transporte DEMO.
|
||||||
|
|
||||||
```text
|
## Preparación del bus I2C
|
||||||
Interface Options -> I2C -> Enable
|
|
||||||
```
|
|
||||||
|
|
||||||
Reinicie:
|
En Raspberry Pi OS:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
sudo raspi-config
|
||||||
sudo reboot
|
sudo reboot
|
||||||
```
|
|
||||||
|
|
||||||
## 2. Confirmar I2C
|
|
||||||
|
|
||||||
```bash
|
|
||||||
ls -l /dev/i2c-1
|
ls -l /dev/i2c-1
|
||||||
|
sudo apt install i2c-tools
|
||||||
i2cdetect -y 1
|
i2cdetect -y 1
|
||||||
```
|
```
|
||||||
|
|
||||||
Mapa esperado:
|
El mapa esperado es:
|
||||||
|
|
||||||
| Sensor | Direccion |
|
| Circuito | Dirección |
|
||||||
|---|---:|
|
|---|---|
|
||||||
| EZO-DO | `0x61` |
|
| EZO-DO | `0x61` |
|
||||||
| EZO-pH | `0x63` |
|
| EZO-pH | `0x63` |
|
||||||
| EZO-EC | `0x64` |
|
| EZO-EC | `0x64` |
|
||||||
| EZO-RTD | `0x66` |
|
| EZO-RTD | `0x66` |
|
||||||
|
|
||||||
Si aparece `0x62` y responde `?I,ORP,...`, ese modulo es ORP, no DO.
|
No continúe con calibraciones si falta una dirección, aparece una dirección
|
||||||
|
inesperada o el barrido del bus es inestable.
|
||||||
|
|
||||||
No calibre sensores hasta confirmar que la comunicacion I2C es estable.
|
## Instalación
|
||||||
|
|
||||||
## 3. Clonar El Repositorio
|
Desde el repositorio clonado:
|
||||||
|
|
||||||
```bash
|
|
||||||
git clone ssh://git@gitea.itmorelia.com:222/Verano-Delfin-2026/bioreactor-multiparametric-daq-shield.git
|
|
||||||
cd bioreactor-multiparametric-daq-shield
|
|
||||||
```
|
|
||||||
|
|
||||||
## 4. Instalar El Proyecto
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
chmod +x scripts/install-raspberry-pi.sh
|
chmod +x scripts/install-raspberry-pi.sh
|
||||||
sudo ./scripts/install-raspberry-pi.sh
|
sudo ./scripts/install-raspberry-pi.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
El instalador:
|
El instalador copia la aplicación a `/opt/photobioreactor`, instala
|
||||||
|
dependencias, compila `EZO_COMMAND` y `EZO_ACQUIRE`, crea el usuario de servicio,
|
||||||
- Copia el proyecto a `/opt/photobioreactor`.
|
activa los dos servicios systemd y configura Nginx en el puerto 80.
|
||||||
- Ejecuta instalacion de dependencias.
|
|
||||||
- Compila `EZO_COMMAND` y `EZO_ACQUIRE`.
|
|
||||||
- Crea usuario `photobioreactor`.
|
|
||||||
- Agrega permisos al grupo `i2c`.
|
|
||||||
- Configura `/etc/default/photobioreactor`.
|
|
||||||
- Crea servicios `systemd`.
|
|
||||||
- Configura Nginx.
|
|
||||||
|
|
||||||
## 5. Verificar Servicios
|
|
||||||
|
|
||||||
```bash
|
|
||||||
systemctl status photobioreactor-api --no-pager
|
|
||||||
systemctl status photobioreactor-acquisition --no-pager
|
|
||||||
systemctl status nginx --no-pager
|
|
||||||
```
|
|
||||||
|
|
||||||
Ver modo:
|
Validación:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
systemctl status photobioreactor-api
|
||||||
|
systemctl status photobioreactor-acquisition
|
||||||
|
journalctl -u photobioreactor-acquisition -f
|
||||||
curl http://127.0.0.1:3000/api/system/ezo
|
curl http://127.0.0.1:3000/api/system/ezo
|
||||||
```
|
```
|
||||||
|
|
||||||
En produccion debe indicar `hardware`.
|
La respuesta de producción debe informar `hardware` tanto para comandos como
|
||||||
|
para adquisición. `EZO_MODE=hardware` evita que una instalación incompleta
|
||||||
## 6. Abrir Dashboard
|
caiga silenciosamente a valores simulados.
|
||||||
|
|
||||||
Desde una computadora en la misma red:
|
|
||||||
|
|
||||||
```text
|
|
||||||
http://IP_DE_LA_RASPBERRY/frontend/index.html
|
|
||||||
```
|
|
||||||
|
|
||||||
Para saber la IP:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
hostname -I
|
|
||||||
```
|
|
||||||
|
|
||||||
## 7. Configurar Sensores Habilitados
|
|
||||||
|
|
||||||
Edite:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo nano /opt/photobioreactor/config/runtime.json
|
|
||||||
```
|
|
||||||
|
|
||||||
Tres sensores conectados:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"loggingRateSeconds": 5,
|
|
||||||
"historyRetentionDays": 30,
|
|
||||||
"enabledSensors": [
|
|
||||||
"temperature",
|
|
||||||
"ph",
|
|
||||||
"ec"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Cuatro sensores:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"loggingRateSeconds": 5,
|
|
||||||
"historyRetentionDays": 30,
|
|
||||||
"enabledSensors": [
|
|
||||||
"temperature",
|
|
||||||
"ph",
|
|
||||||
"do",
|
|
||||||
"ec"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Reinicie adquisicion:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo systemctl restart photobioreactor-acquisition
|
|
||||||
```
|
|
||||||
|
|
||||||
## 8. Validar Sensores Individualmente
|
|
||||||
|
|
||||||
Antes de ejecutar comandos manuales, detenga el recolector:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo systemctl stop photobioreactor-acquisition
|
|
||||||
sudo rm -f /tmp/photobioreactor-i2c.lock
|
|
||||||
```
|
|
||||||
|
|
||||||
Identificar pH:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
/opt/photobioreactor/sensors/EZOCommand/EZO_COMMAND /dev/i2c-1 0x63 300 i
|
|
||||||
/opt/photobioreactor/sensors/EZOCommand/EZO_COMMAND /dev/i2c-1 0x63 300 Status
|
|
||||||
/opt/photobioreactor/sensors/EZOCommand/EZO_COMMAND /dev/i2c-1 0x63 1000 R
|
|
||||||
/opt/photobioreactor/sensors/EZOCommand/EZO_COMMAND /dev/i2c-1 0x63 300 Cal,?
|
|
||||||
```
|
|
||||||
|
|
||||||
Cambie la direccion segun el sensor:
|
La API escucha únicamente en `127.0.0.1` y se publica mediante Nginx. El
|
||||||
|
dashboard todavía no implementa autenticación; despliegue esta versión solo en
|
||||||
|
una red local confiable y no exponga el puerto 80 directamente a Internet.
|
||||||
|
|
||||||
| Sensor | Direccion |
|
## Validación previa a calibración
|
||||||
|---|---:|
|
|
||||||
| DO | `0x61` |
|
|
||||||
| pH | `0x63` |
|
|
||||||
| EC | `0x64` |
|
|
||||||
| RTD | `0x66` |
|
|
||||||
|
|
||||||
Reinicie adquisicion despues:
|
Desde la consola web, pruebe individualmente:
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo systemctl start photobioreactor-acquisition
|
|
||||||
```
|
|
||||||
|
|
||||||
## 9. Revisar Datos
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cat /opt/photobioreactor/data/EZORTD.json
|
|
||||||
cat /opt/photobioreactor/data/EZOPH.json
|
|
||||||
cat /opt/photobioreactor/data/EZODO.json
|
|
||||||
cat /opt/photobioreactor/data/EZOEC.json
|
|
||||||
```
|
|
||||||
|
|
||||||
```bash
|
|
||||||
tail /opt/photobioreactor/logs/temperature.csv
|
|
||||||
tail /opt/photobioreactor/logs/ph.csv
|
|
||||||
tail /opt/photobioreactor/logs/do.csv
|
|
||||||
tail /opt/photobioreactor/logs/ec.csv
|
|
||||||
```
|
|
||||||
|
|
||||||
## 10. Prueba De Estabilidad
|
|
||||||
|
|
||||||
Arranque limpio:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo systemctl stop photobioreactor-acquisition
|
|
||||||
sudo rm -f /tmp/photobioreactor-i2c.lock
|
|
||||||
sudo systemctl start photobioreactor-acquisition
|
|
||||||
```
|
|
||||||
|
|
||||||
Revise logs:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
journalctl -u photobioreactor-acquisition --since "10 minutes ago" -l --no-pager
|
|
||||||
```
|
|
||||||
|
|
||||||
Monitoreo en vivo:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
journalctl -u photobioreactor-acquisition -f
|
|
||||||
```
|
|
||||||
|
|
||||||
Salir:
|
|
||||||
|
|
||||||
```text
|
```text
|
||||||
Ctrl + C
|
i
|
||||||
|
Status
|
||||||
|
R
|
||||||
|
Cal,?
|
||||||
```
|
```
|
||||||
|
|
||||||
Recomendacion de tiempo:
|
Compruebe que cada lectura coincide con el medio físico y que los archivos de
|
||||||
|
`data/` cambian. El helper agrupado envía `R` a los cuatro circuitos, espera una
|
||||||
| Duracion | Uso |
|
sola ventana de conversión y recoge las respuestas bajo el mismo bloqueo usado
|
||||||
|---|---|
|
por la consola.
|
||||||
| 15 minutos | Prueba rapida |
|
|
||||||
| 1 hora | Prueba inicial seria |
|
|
||||||
| 4 horas | Estabilidad de bus y alimentacion |
|
|
||||||
| 8 a 12 horas | Prueba fuerte de laboratorio |
|
|
||||||
| 24 horas | Validacion previa a operacion continua |
|
|
||||||
|
|
||||||
## 11. Calibracion
|
|
||||||
|
|
||||||
Use soluciones de referencia vigentes y espere estabilizacion fisica de cada
|
## Calibración
|
||||||
sonda.
|
|
||||||
|
|
||||||
Resumen:
|
Realice cada procedimiento con soluciones de referencia vigentes y espere la
|
||||||
|
estabilización de la sonda. El panel consulta `Cal,?` automáticamente después
|
||||||
|
de cada comando de calibración exitoso.
|
||||||
|
|
||||||
- RTD: `Cal,<temperatura>`.
|
- RTD: `Cal,<temperatura>`.
|
||||||
- pH: `Cal,mid,7.00`, luego `Cal,low,4.00`, luego `Cal,high,10.00`.
|
- pH: `Cal,mid,7.00`, `Cal,low,4.00`, `Cal,high,10.00`.
|
||||||
- DO: `Cal,0` y luego `Cal`.
|
- DO de dos puntos: `Cal,0` y después `Cal`; configure antes las compensaciones.
|
||||||
- EC: `K,<valor>`, `Cal,dry`, luego puntos humedos.
|
- EC: configure `K`, ejecute `Cal,dry` y después uno o dos puntos húmedos.
|
||||||
|
|
||||||
Detalle completo:
|
Consulte `docs/EZO_COMMANDS.md` para restricciones y comandos de diagnóstico.
|
||||||
|
|
||||||
```text
|
## Prueba integral
|
||||||
docs/EZO_COMMANDS.md
|
|
||||||
```
|
|
||||||
|
|
||||||
## 12. Seguridad Minima
|
|
||||||
|
|
||||||
Edite:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo nano /etc/default/photobioreactor
|
|
||||||
```
|
|
||||||
|
|
||||||
Configure:
|
|
||||||
|
|
||||||
```text
|
|
||||||
API_AUTH_TOKEN=un_token_largo_y_privado
|
|
||||||
```
|
|
||||||
|
|
||||||
Reinicie API:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo systemctl restart photobioreactor-api
|
|
||||||
```
|
|
||||||
|
|
||||||
No exponga el dashboard directamente a Internet.
|
|
||||||
|
|
||||||
## 13. Apagado Seguro
|
|
||||||
|
|
||||||
Para detener adquisicion:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo systemctl stop photobioreactor-acquisition
|
|
||||||
```
|
|
||||||
|
|
||||||
Para apagar Raspberry:
|
1. Confirme lecturas, históricos, exportaciones y alarmas.
|
||||||
|
2. Desconecte un sensor: debe aparecer `DESCONECTADO` mientras los demás siguen.
|
||||||
|
3. Detenga el recolector: las lecturas deben pasar a `DESCONECTADO` al superar
|
||||||
|
la tolerancia calculada desde la frecuencia configurada.
|
||||||
|
4. Reinicie la Raspberry y confirme el arranque automático.
|
||||||
|
5. Mantenga el sistema varias horas y revise `journalctl`, tamaño de CSV,
|
||||||
|
estabilidad de valores y recuperación después de comandos de consola.
|
||||||
|
|
||||||
```bash
|
Las pruebas físicas y la exactitud metrológica no pueden certificarse fuera de
|
||||||
sudo shutdown now
|
la Raspberry Pi con las sondas y soluciones reales conectadas.
|
||||||
```
|
|
||||||
|
|
||||||
## 14. Diagnostico
|
|
||||||
|
|
||||||
Si algo falla, consulte:
|
|
||||||
|
|
||||||
```text
|
|
||||||
docs/TROUBLESHOOTING.md
|
|
||||||
```
|
|
||||||
|
|||||||
@ -1,48 +0,0 @@
|
|||||||
# Documentacion
|
|
||||||
|
|
||||||
Indice rapido de documentos del proyecto.
|
|
||||||
|
|
||||||
## Para Empezar
|
|
||||||
|
|
||||||
| Documento | Para que sirve |
|
|
||||||
|---|---|
|
|
||||||
| [Inicio rapido](QUICK_START.md) | Levantar el proyecto sin entrar en detalle tecnico |
|
|
||||||
| [Despliegue en Raspberry Pi](RASPBERRY_PI_DEPLOYMENT.md) | Instalar, activar servicios y validar hardware |
|
|
||||||
| [Diagnostico](TROUBLESHOOTING.md) | Resolver fallas comunes de I2C, servicios y sensores |
|
|
||||||
|
|
||||||
## Operacion
|
|
||||||
|
|
||||||
| Documento | Para que sirve |
|
|
||||||
|---|---|
|
|
||||||
| [Comandos EZO](EZO_COMMANDS.md) | Identificacion, lectura, diagnostico y calibracion |
|
|
||||||
| [Telegram](TELEGRAM_BOT_SETUP.md) | Crear bot, obtener chatId y activar alertas |
|
|
||||||
| [Almacenamiento](STORAGE_ESTIMATE.md) | Calcular uso de microSD y crecimiento de historicos |
|
|
||||||
|
|
||||||
## Referencia Tecnica
|
|
||||||
|
|
||||||
| Documento | Para que sirve |
|
|
||||||
|---|---|
|
|
||||||
| [Arquitectura](../ARCHITECTURE.md) | Capas, flujo de datos, servicios y archivos |
|
|
||||||
| [Estado del proyecto](../PROJECT_STATUS.md) | Funciones implementadas y trabajo pendiente |
|
|
||||||
| [README principal](../README.md) | Entrada general al proyecto |
|
|
||||||
|
|
||||||
## Ruta Recomendada De Lectura
|
|
||||||
|
|
||||||
Para alguien nuevo:
|
|
||||||
|
|
||||||
```text
|
|
||||||
README.md
|
|
||||||
docs/QUICK_START.md
|
|
||||||
docs/RASPBERRY_PI_DEPLOYMENT.md
|
|
||||||
docs/TROUBLESHOOTING.md
|
|
||||||
```
|
|
||||||
|
|
||||||
Para alguien tecnico:
|
|
||||||
|
|
||||||
```text
|
|
||||||
ARCHITECTURE.md
|
|
||||||
PROJECT_STATUS.md
|
|
||||||
docs/EZO_COMMANDS.md
|
|
||||||
docs/STORAGE_ESTIMATE.md
|
|
||||||
docs/TELEGRAM_BOT_SETUP.md
|
|
||||||
```
|
|
||||||
@ -1,180 +0,0 @@
|
|||||||
# Calculo De Almacenamiento
|
|
||||||
|
|
||||||
Este documento estima cuanto espacio ocupan los datos guardados por el sistema.
|
|
||||||
|
|
||||||
## Que Archivos Crecen
|
|
||||||
|
|
||||||
Crecen principalmente:
|
|
||||||
|
|
||||||
```text
|
|
||||||
logs/temperature.csv
|
|
||||||
logs/ph.csv
|
|
||||||
logs/do.csv
|
|
||||||
logs/ec.csv
|
|
||||||
logs/alarms.csv
|
|
||||||
```
|
|
||||||
|
|
||||||
No crecen de forma acumulativa:
|
|
||||||
|
|
||||||
```text
|
|
||||||
data/EZORTD.json
|
|
||||||
data/EZOPH.json
|
|
||||||
data/EZODO.json
|
|
||||||
data/EZOEC.json
|
|
||||||
```
|
|
||||||
|
|
||||||
Los JSON se sobrescriben en cada ciclo.
|
|
||||||
|
|
||||||
## Formato De Una Lectura
|
|
||||||
|
|
||||||
Cada fila CSV usa:
|
|
||||||
|
|
||||||
```csv
|
|
||||||
timestamp,value
|
|
||||||
2026-07-07T17:26:13.459Z,25.132
|
|
||||||
```
|
|
||||||
|
|
||||||
Tamano aproximado por fila:
|
|
||||||
|
|
||||||
```text
|
|
||||||
24 bytes timestamp ISO
|
|
||||||
1 byte coma
|
|
||||||
6 a 10 bytes valor
|
|
||||||
1 byte salto de linea
|
|
||||||
```
|
|
||||||
|
|
||||||
Rango practico:
|
|
||||||
|
|
||||||
```text
|
|
||||||
32 a 36 bytes por lectura
|
|
||||||
```
|
|
||||||
|
|
||||||
Para calculos conservadores se usa:
|
|
||||||
|
|
||||||
```text
|
|
||||||
36 bytes por lectura
|
|
||||||
```
|
|
||||||
|
|
||||||
## Peor Caso Operativo
|
|
||||||
|
|
||||||
Supuestos:
|
|
||||||
|
|
||||||
```text
|
|
||||||
4 sensores
|
|
||||||
1 lectura por segundo
|
|
||||||
30 dias
|
|
||||||
36 bytes por fila
|
|
||||||
```
|
|
||||||
|
|
||||||
Lecturas por sensor al mes:
|
|
||||||
|
|
||||||
```text
|
|
||||||
30 * 24 * 60 * 60 = 2,592,000 lecturas
|
|
||||||
```
|
|
||||||
|
|
||||||
Espacio por sensor:
|
|
||||||
|
|
||||||
```text
|
|
||||||
2,592,000 * 36 = 93,312,000 bytes
|
|
||||||
```
|
|
||||||
|
|
||||||
Resultado:
|
|
||||||
|
|
||||||
```text
|
|
||||||
93.31 MB por sensor por mes
|
|
||||||
88.99 MiB por sensor por mes
|
|
||||||
```
|
|
||||||
|
|
||||||
Cuatro sensores:
|
|
||||||
|
|
||||||
```text
|
|
||||||
93.31 MB * 4 = 373.25 MB por mes
|
|
||||||
```
|
|
||||||
|
|
||||||
Resultado practico:
|
|
||||||
|
|
||||||
```text
|
|
||||||
350 a 375 MB por mes
|
|
||||||
```
|
|
||||||
|
|
||||||
## Tabla Por Sensor
|
|
||||||
|
|
||||||
Con 1 lectura por segundo:
|
|
||||||
|
|
||||||
| Periodo | Por sensor |
|
|
||||||
|---|---:|
|
|
||||||
| 1 dia | ~3.11 MB |
|
|
||||||
| 30 dias | ~93.31 MB |
|
|
||||||
| 1 ano | ~1.14 GB |
|
|
||||||
|
|
||||||
## Tabla Del Sistema Completo
|
|
||||||
|
|
||||||
Con 4 sensores:
|
|
||||||
|
|
||||||
| Frecuencia | Datos por mes |
|
|
||||||
|---|---:|
|
|
||||||
| 1 segundo | ~350 a 375 MB |
|
|
||||||
| 5 segundos | ~70 MB |
|
|
||||||
| 10 segundos | ~35 MB |
|
|
||||||
| 60 segundos | ~6 MB |
|
|
||||||
|
|
||||||
Con 3 sensores:
|
|
||||||
|
|
||||||
| Frecuencia | Datos por mes |
|
|
||||||
|---|---:|
|
|
||||||
| 1 segundo | ~264 a 280 MB |
|
|
||||||
| 5 segundos | ~50 a 53 MB |
|
|
||||||
| 10 segundos | ~25 a 27 MB |
|
|
||||||
| 60 segundos | ~4 a 5 MB |
|
|
||||||
|
|
||||||
## Tiempo Estimado Por MicroSD
|
|
||||||
|
|
||||||
Estimacion teorica solo para datos, sin borrar historicos:
|
|
||||||
|
|
||||||
| MicroSD | Tiempo aproximado con 4 sensores a 1 Hz |
|
|
||||||
|---|---:|
|
|
||||||
| 16 GB | ~3.5 anos |
|
|
||||||
| 32 GB | ~7 anos |
|
|
||||||
| 64 GB | ~14 anos |
|
|
||||||
| 128 GB | ~28 anos |
|
|
||||||
|
|
||||||
Estimacion conservadora, reservando espacio para Raspberry Pi OS, paquetes,
|
|
||||||
logs del sistema y margen libre:
|
|
||||||
|
|
||||||
| MicroSD | Espacio comodo para datos | Tiempo comodo |
|
|
||||||
|---|---:|---:|
|
|
||||||
| 16 GB | ~6 GB | ~16 meses |
|
|
||||||
| 32 GB | ~18 GB | ~4 anos |
|
|
||||||
| 64 GB | ~43 GB | ~9.5 anos |
|
|
||||||
| 128 GB | ~94 GB | ~21 anos |
|
|
||||||
|
|
||||||
## Retencion Historica
|
|
||||||
|
|
||||||
El sistema puede podar historicos con:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"historyRetentionDays": 30
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Con 30 dias de retencion, el uso de CSV no crece indefinidamente. En el peor
|
|
||||||
caso de 4 sensores a 1 Hz se estabiliza alrededor de:
|
|
||||||
|
|
||||||
```text
|
|
||||||
350 a 375 MB
|
|
||||||
```
|
|
||||||
|
|
||||||
## Excel No Cuenta Como Almacenamiento Continuo
|
|
||||||
|
|
||||||
Los reportes Excel pueden pesar mucho porque `.xlsx` almacena celdas, hojas y
|
|
||||||
metadatos. Un dia con 4 sensores a 1 Hz puede tener:
|
|
||||||
|
|
||||||
```text
|
|
||||||
345,600 filas
|
|
||||||
mas de 1,000,000 de celdas si hay 3 columnas
|
|
||||||
```
|
|
||||||
|
|
||||||
Por eso un Excel diario puede pesar decenas de MB. Ese peso solo cuenta si se
|
|
||||||
descarga o guarda el reporte; no es parte del almacenamiento continuo del
|
|
||||||
sistema.
|
|
||||||
@ -1,248 +0,0 @@
|
|||||||
# Diagnostico De Problemas
|
|
||||||
|
|
||||||
Guia practica para resolver fallas comunes en Raspberry Pi, sensores EZO y
|
|
||||||
dashboard.
|
|
||||||
|
|
||||||
## Ver Estado General
|
|
||||||
|
|
||||||
```bash
|
|
||||||
systemctl status photobioreactor-api --no-pager
|
|
||||||
systemctl status photobioreactor-acquisition --no-pager
|
|
||||||
systemctl status nginx --no-pager
|
|
||||||
```
|
|
||||||
|
|
||||||
Logs recientes:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
journalctl -u photobioreactor-api --since "10 minutes ago" -l --no-pager
|
|
||||||
journalctl -u photobioreactor-acquisition --since "10 minutes ago" -l --no-pager
|
|
||||||
```
|
|
||||||
|
|
||||||
## El Dashboard No Abre
|
|
||||||
|
|
||||||
1. Confirme IP de la Raspberry:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
hostname -I
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Confirme Nginx:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
systemctl status nginx --no-pager
|
|
||||||
```
|
|
||||||
|
|
||||||
3. Pruebe localmente:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
curl http://127.0.0.1/frontend/index.html
|
|
||||||
curl http://127.0.0.1/api/system/ezo
|
|
||||||
```
|
|
||||||
|
|
||||||
4. Desde otra computadora abra:
|
|
||||||
|
|
||||||
```text
|
|
||||||
http://IP_DE_LA_RASPBERRY/frontend/index.html
|
|
||||||
```
|
|
||||||
|
|
||||||
## No Aparece Un Sensor En `i2cdetect`
|
|
||||||
|
|
||||||
Detenga adquisicion:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo systemctl stop photobioreactor-acquisition
|
|
||||||
sudo rm -f /tmp/photobioreactor-i2c.lock
|
|
||||||
```
|
|
||||||
|
|
||||||
Revise bus:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
i2cdetect -y 1
|
|
||||||
```
|
|
||||||
|
|
||||||
Direcciones esperadas:
|
|
||||||
|
|
||||||
| Sensor | Direccion |
|
|
||||||
|---|---:|
|
|
||||||
| DO | `0x61` |
|
|
||||||
| pH | `0x63` |
|
|
||||||
| EC | `0x64` |
|
|
||||||
| RTD | `0x66` |
|
|
||||||
|
|
||||||
Si no aparece:
|
|
||||||
|
|
||||||
- Confirme alimentacion.
|
|
||||||
- Confirme GND comun si no hay aislamiento galvanico.
|
|
||||||
- Confirme SDA y SCL.
|
|
||||||
- Confirme que el circuito EZO esta en modo I2C.
|
|
||||||
- Revise que no haya una direccion cambiada.
|
|
||||||
|
|
||||||
## Identificar Que Sensor Hay En Una Direccion
|
|
||||||
|
|
||||||
```bash
|
|
||||||
/opt/photobioreactor/sensors/EZOCommand/EZO_COMMAND /dev/i2c-1 0x63 300 i
|
|
||||||
/opt/photobioreactor/sensors/EZOCommand/EZO_COMMAND /dev/i2c-1 0x63 300 Status
|
|
||||||
/opt/photobioreactor/sensors/EZOCommand/EZO_COMMAND /dev/i2c-1 0x63 1000 R
|
|
||||||
/opt/photobioreactor/sensors/EZOCommand/EZO_COMMAND /dev/i2c-1 0x63 300 Cal,?
|
|
||||||
```
|
|
||||||
|
|
||||||
Cambie `0x63` por la direccion que quiera probar.
|
|
||||||
|
|
||||||
Ejemplos de identificacion:
|
|
||||||
|
|
||||||
```text
|
|
||||||
?I,pH,2.17
|
|
||||||
?I,EC,2.14
|
|
||||||
?I,RTD,2.12
|
|
||||||
?I,DO,2.XX
|
|
||||||
?I,ORP,2.14
|
|
||||||
```
|
|
||||||
|
|
||||||
Si aparece `?I,ORP,...`, ese modulo no es DO.
|
|
||||||
|
|
||||||
## Error: No Se Pudo Bloquear El Bus I2C
|
|
||||||
|
|
||||||
Significa que el helper no pudo tomar:
|
|
||||||
|
|
||||||
```text
|
|
||||||
/tmp/photobioreactor-i2c.lock
|
|
||||||
```
|
|
||||||
|
|
||||||
Solucion rapida:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo systemctl stop photobioreactor-acquisition
|
|
||||||
sudo rm -f /tmp/photobioreactor-i2c.lock
|
|
||||||
sudo systemctl start photobioreactor-acquisition
|
|
||||||
```
|
|
||||||
|
|
||||||
Si sigue fallando:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
ls -ld /tmp
|
|
||||||
id photobioreactor
|
|
||||||
ls -l /dev/i2c-1
|
|
||||||
groups photobioreactor
|
|
||||||
ps -eo pid,user,stat,cmd | grep -E "EZO_ACQUIRE|EZO_COMMAND|acquisition.js" | grep -v grep
|
|
||||||
```
|
|
||||||
|
|
||||||
Prueba directa como usuario de servicio:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo -u photobioreactor /opt/photobioreactor/sensors/EZOCommand/EZO_ACQUIRE /dev/i2c-1 temperature ph ec
|
|
||||||
```
|
|
||||||
|
|
||||||
Si esta prueba responde JSON, el bus y permisos estan bien.
|
|
||||||
|
|
||||||
## Error: EZO_COMMAND No Existe
|
|
||||||
|
|
||||||
Si esta en `~` o en otra carpeta, esta ruta puede fallar:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./sensors/EZOCommand/EZO_COMMAND
|
|
||||||
```
|
|
||||||
|
|
||||||
Use la ruta instalada:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
/opt/photobioreactor/sensors/EZOCommand/EZO_COMMAND
|
|
||||||
```
|
|
||||||
|
|
||||||
O compile desde el repositorio:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
make -C sensors/EZOCommand
|
|
||||||
```
|
|
||||||
|
|
||||||
## El Servicio Dice 1/1, 2/2 O 3/3 Sensores
|
|
||||||
|
|
||||||
Eso significa que solo estan habilitados esos sensores en:
|
|
||||||
|
|
||||||
```text
|
|
||||||
/opt/photobioreactor/config/runtime.json
|
|
||||||
```
|
|
||||||
|
|
||||||
Ejemplo con tres sensores:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"loggingRateSeconds": 5,
|
|
||||||
"historyRetentionDays": 30,
|
|
||||||
"enabledSensors": [
|
|
||||||
"temperature",
|
|
||||||
"ph",
|
|
||||||
"ec"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Despues de editar:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo systemctl restart photobioreactor-acquisition
|
|
||||||
```
|
|
||||||
|
|
||||||
## SSH Se Vuelve Inestable
|
|
||||||
|
|
||||||
Posibles causas:
|
|
||||||
|
|
||||||
- Alimentacion insuficiente.
|
|
||||||
- Bus I2C bloqueado.
|
|
||||||
- Sensor mal cableado.
|
|
||||||
- Frecuencia de adquisicion muy agresiva durante pruebas.
|
|
||||||
- Raspberry reiniciandose.
|
|
||||||
|
|
||||||
Revise:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
dmesg | tail -n 80
|
|
||||||
journalctl -u photobioreactor-acquisition --since "30 minutes ago" -p warning --no-pager
|
|
||||||
vcgencmd get_throttled
|
|
||||||
```
|
|
||||||
|
|
||||||
Si `vcgencmd get_throttled` no devuelve `throttled=0x0`, hay indicios de
|
|
||||||
problemas de alimentacion o temperatura.
|
|
||||||
|
|
||||||
## Excel Pesa Mucho
|
|
||||||
|
|
||||||
Las graficas muestran solo el dia actual, pero Excel exporta el historico
|
|
||||||
disponible en CSV.
|
|
||||||
|
|
||||||
Con 4 sensores a 1 lectura por segundo:
|
|
||||||
|
|
||||||
```text
|
|
||||||
86,400 filas por sensor por dia
|
|
||||||
345,600 filas totales por dia
|
|
||||||
1,036,800 celdas en Excel si son 3 columnas
|
|
||||||
```
|
|
||||||
|
|
||||||
Por eso un Excel diario puede pesar decenas de MB. El CSV es mas eficiente.
|
|
||||||
|
|
||||||
## Prueba De Estabilidad
|
|
||||||
|
|
||||||
Para dejarlo corriendo:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo systemctl stop photobioreactor-acquisition
|
|
||||||
sudo rm -f /tmp/photobioreactor-i2c.lock
|
|
||||||
sudo systemctl start photobioreactor-acquisition
|
|
||||||
```
|
|
||||||
|
|
||||||
Revisar errores:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
journalctl -u photobioreactor-acquisition --since "1 hour ago" -p warning --no-pager
|
|
||||||
journalctl -u photobioreactor-api --since "1 hour ago" -p warning --no-pager
|
|
||||||
```
|
|
||||||
|
|
||||||
Revisar crecimiento de CSV:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
wc -l /opt/photobioreactor/logs/temperature.csv
|
|
||||||
wc -l /opt/photobioreactor/logs/ph.csv
|
|
||||||
wc -l /opt/photobioreactor/logs/ec.csv
|
|
||||||
wc -l /opt/photobioreactor/logs/do.csv
|
|
||||||
```
|
|
||||||
|
|
||||||
Con `loggingRateSeconds` en `5`, cada sensor debe sumar aproximadamente 720
|
|
||||||
filas por hora.
|
|
||||||
Loading…
Reference in New Issue