Reorganizar documentacion operativa
parent
bdc8c2f5ad
commit
10c53dd8b8
@ -1,113 +1,195 @@
|
|||||||
# Estado del Proyecto
|
# Estado del Proyecto
|
||||||
|
|
||||||
## Estado actual
|
## Resumen
|
||||||
|
|
||||||
El dashboard integra monitoreo en vivo, alarmas configurables, tendencias,
|
El proyecto implementa un dashboard web para monitoreo de fotobiorreactor con
|
||||||
exportación CSV/Excel, consola EZO y calibración. La adquisición puede operar en
|
Raspberry Pi y circuitos Atlas Scientific EZO. La aplicacion puede trabajar en
|
||||||
modo demo o en Raspberry Pi mediante `/dev/i2c-1`.
|
modo demo para desarrollo sin hardware y en modo hardware usando `/dev/i2c-1`.
|
||||||
|
|
||||||
## Arquitectura operativa
|
## 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.
|
||||||
|
- 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 |
|
| Componente | Responsabilidad |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `api/server.js` | API, históricos, configuración y comandos EZO |
|
| `frontend/` | Dashboard, graficas, controles, exportaciones y consola EZO |
|
||||||
| `api/acquisition.js` | Ciclo continuo de adquisición |
|
| `api/server.js` | API HTTP, configuracion, historicos, comandos y seguridad |
|
||||||
| `api/acquisition-service.js` | Escritura atómica de JSON/CSV y configuración |
|
| `api/acquisition.js` | Proceso continuo de adquisicion |
|
||||||
| `sensors/EZOCommand/EZO_ACQUIRE` | Lectura agrupada de los cuatro EZO |
|
| `api/acquisition-service.js` | Lectura, escritura atomica, alarmas y retencion |
|
||||||
| `sensors/EZOCommand/EZO_COMMAND` | Comandos y calibración de un circuito |
|
| `api/notification-service.js` | Webhook y Telegram |
|
||||||
| `frontend/` | Dashboard, gráficas, alarmas, exportación y consola |
|
| `sensors/EZOCommand/EZO_ACQUIRE` | Lectura agrupada de sensores EZO |
|
||||||
|
| `sensors/EZOCommand/EZO_COMMAND` | Comandos individuales EZO |
|
||||||
Los dos helpers C usan `/tmp/photobioreactor-i2c.lock`. El recolector inicia la
|
| `config/*.json` | Configuracion operativa |
|
||||||
conversión de los cuatro sensores antes de esperar, por lo que comparte una sola
|
| `deployment/` | Servicios systemd, Nginx y variables de entorno |
|
||||||
ventana de procesamiento en vez de bloquear un segundo por sensor.
|
| `scripts/install-raspberry-pi.sh` | Instalacion automatizada en Raspberry Pi |
|
||||||
|
|
||||||
## Funciones implementadas
|
## Sensores
|
||||||
|
|
||||||
- Lecturas de RTD, pH, DO y EC con publicación en `data/*.json`.
|
| Sensor | Direccion esperada | Estado en software |
|
||||||
- Históricos normalizados como `logs/temperature.csv`, `ph.csv`, `do.csv` y
|
|---|---:|---|
|
||||||
`ec.csv`, todos con formato `timestamp,value`.
|
| EZO-RTD | `0x66` | Implementado |
|
||||||
- Escritura atómica de JSON y estado `online: false` ante fallos globales o
|
| EZO-pH | `0x63` | Implementado |
|
||||||
lecturas individuales inválidas.
|
| EZO-DO | `0x61` | Implementado |
|
||||||
- Detección de datos obsoletos con tolerancia proporcional a la frecuencia.
|
| EZO-EC | `0x64` | Implementado |
|
||||||
- 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.
|
El sistema tambien puede detectar otros EZO en el bus, por ejemplo ORP, pero el
|
||||||
- Verificación automática `Cal,?` después de una calibración enviada desde web.
|
dashboard actual solo modela RTD, pH, DO y EC.
|
||||||
- Chart.js 4.5.1 y SheetJS 0.20.3 instalados localmente.
|
|
||||||
- Servicios systemd, configuración Nginx e instalador para Raspberry Pi.
|
## Modos De Operacion
|
||||||
|
|
||||||
## Configuracion parcial de sensores
|
| Modo | Uso |
|
||||||
|
|---|---|
|
||||||
- `config/runtime.json` guarda `enabledSensors`.
|
| `EZO_MODE=demo` | Desarrollo sin Raspberry ni sensores |
|
||||||
- Los sensores deshabilitados se muestran como `DESHABILITADO`.
|
| `EZO_MODE=auto` | Usa hardware si esta disponible; si no, demo |
|
||||||
- Un sensor deshabilitado no cuenta como `OFFLINE`, alarma ni riesgo global.
|
| `EZO_MODE=hardware` | Produccion estricta; no simula datos |
|
||||||
|
|
||||||
## Seguridad operativa
|
En Raspberry Pi de produccion se usa `EZO_MODE=hardware`.
|
||||||
|
|
||||||
- `API_AUTH_TOKEN` protege endpoints criticos cuando esta configurado.
|
## Datos
|
||||||
- El dashboard envia el token como `X-API-Token` desde almacenamiento local del
|
|
||||||
navegador.
|
Lecturas actuales:
|
||||||
- La API compara tokens en tiempo constante y emite headers defensivos basicos.
|
|
||||||
- Los POST criticos usan rate limit configurable en memoria.
|
- `data/EZORTD.json`
|
||||||
- Sin `API_AUTH_TOKEN`, el modo desarrollo permanece sin autenticacion.
|
- `data/EZOPH.json`
|
||||||
|
- `data/EZODO.json`
|
||||||
## Bitacora de alarmas
|
- `data/EZOEC.json`
|
||||||
|
|
||||||
- `logs/alarms.csv` registra transiciones a `WARNING`, `CRITICAL`, `OFFLINE` y
|
Historicos:
|
||||||
recuperaciones `RECOVERY`.
|
|
||||||
- `GET /api/alarms` expone los eventos para dashboard y futuras notificaciones.
|
- `logs/temperature.csv`
|
||||||
- Los sensores `DISABLED` no generan eventos de alarma.
|
- `logs/ph.csv`
|
||||||
|
- `logs/do.csv`
|
||||||
## Umbrales configurables
|
- `logs/ec.csv`
|
||||||
|
|
||||||
- `GET /api/config/alarms` expone los limites actuales.
|
Formato:
|
||||||
- `POST /api/config/alarms` valida y persiste cambios en `config/alarms.json`.
|
|
||||||
- El dashboard permite editar min/max por sensor; guardar requiere token si
|
```csv
|
||||||
`API_AUTH_TOKEN` esta activo.
|
timestamp,value
|
||||||
|
2026-07-07T17:26:13.459Z,25.132
|
||||||
## Retencion historica
|
```
|
||||||
|
|
||||||
- `historyRetentionDays` en `config/runtime.json` controla poda automatica de
|
Las graficas muestran el dia actual. Los CSV conservan el periodo configurado
|
||||||
CSV.
|
por `historyRetentionDays`.
|
||||||
- Valores permitidos: 7, 30, 90, 365 o 0 para retencion indefinida.
|
|
||||||
- La poda conserva los nombres actuales de archivos para no romper graficas ni
|
## Alarmas
|
||||||
exportaciones.
|
|
||||||
- Las graficas filtran visualmente el dia actual; los CSV mantienen todos los
|
Los umbrales viven en:
|
||||||
registros disponibles dentro de la retencion configurada.
|
|
||||||
|
```text
|
||||||
|
config/alarms.json
|
||||||
|
```
|
||||||
|
|
||||||
|
Estados:
|
||||||
|
|
||||||
|
- `NORMAL`
|
||||||
|
- `WARNING`
|
||||||
|
- `CRITICAL`
|
||||||
|
- `OFFLINE`
|
||||||
|
- `DISABLED`
|
||||||
|
|
||||||
|
Los eventos se guardan en:
|
||||||
|
|
||||||
|
```text
|
||||||
|
logs/alarms.csv
|
||||||
|
```
|
||||||
|
|
||||||
|
Los sensores deshabilitados no generan alarma ni riesgo global.
|
||||||
|
|
||||||
## Notificaciones
|
## Notificaciones
|
||||||
|
|
||||||
- `config/notifications.json` permite activar webhook y Telegram.
|
Configuracion:
|
||||||
- `GET /api/config/notifications` devuelve configuracion redactada.
|
|
||||||
- `POST /api/config/notifications` valida y persiste canales con token.
|
```text
|
||||||
- El recolector despacha notificaciones desde eventos de `logs/alarms.csv`.
|
config/notifications.json
|
||||||
- `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:
|
||||||
|
|
||||||
## Modos
|
- Pruebas automatizadas Node.
|
||||||
|
- Modo demo.
|
||||||
|
- Dashboard por HTTP local.
|
||||||
|
- Chart.js y SheetJS locales.
|
||||||
|
- Comandos EZO simulados.
|
||||||
|
- Configuracion de alarmas y notificaciones.
|
||||||
|
|
||||||
- `EZO_MODE=demo`: adquisición y comandos simulados.
|
Validacion en Raspberry:
|
||||||
- `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.
|
|
||||||
|
|
||||||
## Verificación realizada
|
- I2C mediante `/dev/i2c-1`.
|
||||||
|
- Servicios `systemd`.
|
||||||
|
- Lecturas reales parciales cuando los sensores estan conectados.
|
||||||
|
|
||||||
- 16 pruebas automáticas aprobadas.
|
La calibracion metrologica y la estabilidad final deben verificarse siempre con
|
||||||
- Validación sintáctica de todos los JavaScript modificados.
|
sondas reales, soluciones de referencia y operacion continua.
|
||||||
- Dashboard, Chart.js, SheetJS y comando pH comprobados por HTTP en modo demo.
|
|
||||||
- `npm audit --omit=dev`: cero vulnerabilidades conocidas.
|
|
||||||
|
|
||||||
La compilación ARM, el bus I2C, la estabilidad de las sondas y las calibraciones
|
## Trabajo Pendiente Recomendado
|
||||||
metrológicas solo pueden verificarse en la Raspberry Pi con hardware real.
|
|
||||||
|
|
||||||
## Trabajo pendiente en hardware
|
- Prueba continua de 8 a 24 horas en Raspberry.
|
||||||
|
- 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.
|
||||||
|
|
||||||
1. Ejecutar `i2cdetect -y 1` y confirmar `0x61`, `0x63`, `0x64` y `0x66`.
|
## Documentos Relacionados
|
||||||
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.
|
|
||||||
|
|
||||||
Consulte `docs/RASPBERRY_PI_DEPLOYMENT.md` para el procedimiento completo.
|
- `README.md`
|
||||||
|
- `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`
|
||||||
|
|||||||
@ -0,0 +1,163 @@
|
|||||||
|
# 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,116 +1,303 @@
|
|||||||
# Despliegue y validación en Raspberry Pi
|
# Despliegue En Raspberry Pi
|
||||||
|
|
||||||
## Prueba sin hardware
|
Guia para instalar, validar y operar el dashboard en Raspberry Pi.
|
||||||
|
|
||||||
En una computadora de desarrollo:
|
## 1. Preparar Raspberry Pi OS
|
||||||
|
|
||||||
|
Actualice el sistema:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt update
|
||||||
|
sudo apt upgrade -y
|
||||||
|
```
|
||||||
|
|
||||||
|
Instale herramientas base:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
npm ci
|
sudo apt install -y git build-essential i2c-tools nginx nodejs npm
|
||||||
npm test
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Para ejecutar el sistema completo en demo, use dos terminales:
|
Habilite I2C:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
EZO_MODE=demo npm run acquire
|
sudo raspi-config
|
||||||
EZO_MODE=demo npm start
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Abra `http://localhost:3000/frontend/index.html`. El recolector genera JSON y
|
Ruta:
|
||||||
CSV de prueba; la consola y el panel de calibración muestran transporte DEMO.
|
|
||||||
|
|
||||||
## Preparación del bus I2C
|
```text
|
||||||
|
Interface Options -> I2C -> Enable
|
||||||
|
```
|
||||||
|
|
||||||
En Raspberry Pi OS:
|
Reinicie:
|
||||||
|
|
||||||
```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
|
||||||
```
|
```
|
||||||
|
|
||||||
El mapa esperado es:
|
Mapa esperado:
|
||||||
|
|
||||||
| Circuito | Dirección |
|
| Sensor | Direccion |
|
||||||
|---|---|
|
|---|---:|
|
||||||
| EZO-DO | `0x61` |
|
| EZO-DO | `0x61` |
|
||||||
| EZO-pH | `0x63` |
|
| EZO-pH | `0x63` |
|
||||||
| EZO-EC | `0x64` |
|
| EZO-EC | `0x64` |
|
||||||
| EZO-RTD | `0x66` |
|
| EZO-RTD | `0x66` |
|
||||||
|
|
||||||
No continúe con calibraciones si falta una dirección, aparece una dirección
|
Si aparece `0x62` y responde `?I,ORP,...`, ese modulo es ORP, no DO.
|
||||||
inesperada o el barrido del bus es inestable.
|
|
||||||
|
|
||||||
## Instalación
|
No calibre sensores hasta confirmar que la comunicacion I2C es estable.
|
||||||
|
|
||||||
Desde el repositorio clonado:
|
## 3. Clonar El Repositorio
|
||||||
|
|
||||||
|
```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 copia la aplicación a `/opt/photobioreactor`, instala
|
El instalador:
|
||||||
dependencias, compila `EZO_COMMAND` y `EZO_ACQUIRE`, crea el usuario de servicio,
|
|
||||||
activa los dos servicios systemd y configura Nginx en el puerto 80.
|
- Copia el proyecto a `/opt/photobioreactor`.
|
||||||
|
- 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.
|
||||||
|
|
||||||
Validación:
|
## 5. Verificar Servicios
|
||||||
|
|
||||||
|
```bash
|
||||||
|
systemctl status photobioreactor-api --no-pager
|
||||||
|
systemctl status photobioreactor-acquisition --no-pager
|
||||||
|
systemctl status nginx --no-pager
|
||||||
|
```
|
||||||
|
|
||||||
|
Ver modo:
|
||||||
|
|
||||||
```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
|
||||||
```
|
```
|
||||||
|
|
||||||
La respuesta de producción debe informar `hardware` tanto para comandos como
|
En produccion debe indicar `hardware`.
|
||||||
para adquisición. `EZO_MODE=hardware` evita que una instalación incompleta
|
|
||||||
caiga silenciosamente a valores simulados.
|
## 6. Abrir Dashboard
|
||||||
|
|
||||||
|
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,?
|
||||||
|
```
|
||||||
|
|
||||||
La API escucha únicamente en `127.0.0.1` y se publica mediante Nginx. El
|
Cambie la direccion segun el sensor:
|
||||||
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.
|
|
||||||
|
|
||||||
## Validación previa a calibración
|
| Sensor | Direccion |
|
||||||
|
|---|---:|
|
||||||
|
| DO | `0x61` |
|
||||||
|
| pH | `0x63` |
|
||||||
|
| EC | `0x64` |
|
||||||
|
| RTD | `0x66` |
|
||||||
|
|
||||||
Desde la consola web, pruebe individualmente:
|
Reinicie adquisicion despues:
|
||||||
|
|
||||||
|
```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
|
||||||
i
|
Ctrl + C
|
||||||
Status
|
|
||||||
R
|
|
||||||
Cal,?
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Compruebe que cada lectura coincide con el medio físico y que los archivos de
|
Recomendacion de tiempo:
|
||||||
`data/` cambian. El helper agrupado envía `R` a los cuatro circuitos, espera una
|
|
||||||
sola ventana de conversión y recoge las respuestas bajo el mismo bloqueo usado
|
| Duracion | Uso |
|
||||||
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
|
||||||
|
|
||||||
## Calibración
|
Use soluciones de referencia vigentes y espere estabilizacion fisica de cada
|
||||||
|
sonda.
|
||||||
|
|
||||||
Realice cada procedimiento con soluciones de referencia vigentes y espere la
|
Resumen:
|
||||||
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`, `Cal,low,4.00`, `Cal,high,10.00`.
|
- pH: `Cal,mid,7.00`, luego `Cal,low,4.00`, luego `Cal,high,10.00`.
|
||||||
- DO de dos puntos: `Cal,0` y después `Cal`; configure antes las compensaciones.
|
- DO: `Cal,0` y luego `Cal`.
|
||||||
- EC: configure `K`, ejecute `Cal,dry` y después uno o dos puntos húmedos.
|
- EC: `K,<valor>`, `Cal,dry`, luego puntos humedos.
|
||||||
|
|
||||||
Consulte `docs/EZO_COMMANDS.md` para restricciones y comandos de diagnóstico.
|
Detalle completo:
|
||||||
|
|
||||||
## Prueba integral
|
```text
|
||||||
|
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
|
||||||
|
```
|
||||||
|
|
||||||
1. Confirme lecturas, históricos, exportaciones y alarmas.
|
Para apagar Raspberry:
|
||||||
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.
|
|
||||||
|
|
||||||
Las pruebas físicas y la exactitud metrológica no pueden certificarse fuera de
|
```bash
|
||||||
la Raspberry Pi con las sondas y soluciones reales conectadas.
|
sudo shutdown now
|
||||||
|
```
|
||||||
|
|
||||||
|
## 14. Diagnostico
|
||||||
|
|
||||||
|
Si algo falla, consulte:
|
||||||
|
|
||||||
|
```text
|
||||||
|
docs/TROUBLESHOOTING.md
|
||||||
|
```
|
||||||
|
|||||||
@ -0,0 +1,48 @@
|
|||||||
|
# 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
|
||||||
|
```
|
||||||
@ -0,0 +1,180 @@
|
|||||||
|
# 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.
|
||||||
@ -0,0 +1,248 @@
|
|||||||
|
# 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