OTA Firmware Management (Nexus Energy)¶
Este documento describe la arquitectura, flujo de trabajo y pasos operativos para la gestión de actualizaciones OTA (Over‑The‑Air) de firmware de los dispositivos ESP32 dentro de la plataforma Nexus Energy.
1. Visión General¶
- Objetivo: Permitir a los platform_admins subir versiones de firmware, asignarlas a sitios y notificar a los dispositivos ESP32 cuando exista una actualización disponible.
- Componentes clave:
- D1 tables (
firmware_versions,firmware_assignments,firmware_update_logs). - R2 bucket (
nexus-firmware) para almacenar los binarios.bin. - Endpoints:
POST /api/v1/ingest– punto de entrada de telemetría de los gateways. Detecta la versión reportada y devuelve instrucciones OTA si corresponde.GET /api/v1/firmware/{semver}/download– descarga pública del binario desde R2.
- UI admin – pestaña OTA Firmware en la sección de administración de la plataforma, con formularios de subida, asignación y tablas de estado.
2. Modelo de Datos (D1)¶
| Tabla | Campos principales | Descripción |
|---|---|---|
firmware_versions |
id, semver, name, changelog, file_size, sha256, r2_key, created_at |
Metadatos de cada release. |
firmware_assignments |
site_id (PK), firmware_version_id, assigned_at |
Relación 1‑1 sitio → versión asignada. |
firmware_update_logs |
id, site_id, device_identifier, from_version, to_version, status, error_message, created_at, updated_at |
Historial de intentos OTA (pending, downloading, success, failed). |
El campo sites.current_firmware_version almacena la última versión que el sitio reportó.
3. Flujo OTA (del dispositivo)¶
- POST a
/api/v1/ingestcon payload JSON estándar. Nuevo campofirmware_version(ej."1.0.0"). - El endpoint:
- Guarda toda la telemetría como siempre.
- Busca la asignación de firmware del sitio.
- Si la versión asignada difiere de
firmware_version→ crea (o reutiliza) un registropendingenfirmware_update_logsy responde: - Si ambas versiones coinciden → actualiza
sites.current_firmware_version, marca logssuccessy respondeupdate_available: false. - El ESP32 descarga el binario desde la URL proporcionada, verifica el SHA‑256 y realiza la instalación.
- Tras una instalación exitosa el dispositivo envía de nuevo su
firmware_versionen la siguiente telemetría; el backend marca el log comosuccess. - Si el dispositivo informa
update_status: "failed"el backend marca el logfailedy guarda el mensaje de error.
4. Subida de Firmware (admin UI)¶
- Formulario (
?/uploadFirmware): - Campos:
semver,firmware_name,changelog, archivo.bin. - Validación de semver (
X.Y.Z). - Calcula SHA‑256 con Web Crypto API.
- Sube el binario a R2 bajo la clave
firmware/v{semver}/nexus-firmware-{semver}.bin. -
Persiste metadatos en
firmware_versions. -
Asignación (
?/assignFirmware): - Selección de versión y multi‑select de sitios.
- Inserta/actualiza
firmware_assignments(ON CONFLICT → update). - Los sitios sin asignación permanecen en estado Sin asignar.
5. Interfaz de Estado (admin UI)¶
- Versiones de Firmware – tabla con SemVer, nombre, tamaño, SHA‑256, fecha.
- Estado por Sitio – muestra versión asignada vs versión reportada y badge de estado (
Al día,Pendiente,Sin asignar). - Historial OTA – lista de logs con sitio, dispositivo, versiones
de → a, estado (Éxito,Fallido,Pendiente) y timestamp.
6. Operación y Mantenimiento¶
- Subir nueva versión:
- Navega a la pestaña OTA Firmware → Subir Firmware.
- Completa los campos y pulsa Subir Firmware.
- Asignar a sitios:
- En la misma pestaña, elige la versión recién creada y los sitios objetivo.
- Pulsa Asignar.
- Monitorear actualizaciones:
- Revisa la tabla Historial de Actualizaciones OTA para detectar fallos o dispositivos que no han actualizado.
- Los logs
failedpueden re‑intentarse borrando el registro o reasignando la versión. - Rollback (opcional):
- Subir una nueva versión con un número inferior al actual o re‑asignar la versión anterior a los sitios afectados.
7. Pruebas Manuales¶
7.1. Simular Telemetría con curl¶
curl -X POST https://nexus-energy.pages.dev/api/v1/ingest \
-H "Content-Type: application/json" \
-H "X-Nexus-Token: <site-token>" \
-d '{
"gateway_id": "site-123",
"firmware_version": "1.0.0", # versión actual del ESP32
"devices": []
}'
1.2.0):
{"update_available":true,"firmware":{"version":"1.2.0","url":"https://.../api/v1/firmware/1.2.0/download","sha256":"<hash>","size":123456}}
7.2. Verificar Descarga¶
curl -O -L "https://nexus-energy.pages.dev/api/v1/firmware/1.2.0/download"
sha256sum 1.2.0.bin # debe coincidir con el hash registrado
7.3. Simular fallo de actualización¶
curl -X POST https://nexus-energy.pages.dev/api/v1/ingest \
-H "Content-Type: application/json" \
-H "X-Nexus-Token: <site-token>" \
-d '{
"gateway_id": "site-123",
"firmware_version": "1.0.0",
"update_status": "failed",
"update_error": "Checksum mismatch",
"target_version": "1.2.0",
"devices": []
}'
status: "failed" y el mensaje de error visible en la tabla Historial de Actualizaciones OTA.
8. Seguridad y Buenas Prácticas¶
- R2 bucket está configurado como privado; solo se expone mediante la URL firmada por Cloudflare Workers.
- SHA‑256 se verifica en el dispositivo antes de aplicar el binario.
- Todos los endpoints requieren el token de sitio (
X‑Nexus‑Token) y la autorización deplatform_adminpara operaciones de gestión. - Los logs OTA se purgan automáticamente después de 30 días mediante una tarea cron (no incluida aquí, pero recomendable).
9. Referencias de Código¶
src/lib/db/types.ts– tiposFirmwareVersion,FirmwareAssignment,FirmwareUpdateLog.src/lib/db/index.ts– factory con métodosgetFirmwareVersions,insertFirmwareVersion,assignFirmwareToSites,getSiteFirmwareAssignment,insertUpdateLog,resolveUpdateLog,getUpdateLogs,updateSiteCurrentFirmware.src/routes/api/v1/firmware/[semver]/download/+server.ts– endpoint público de descarga.src/routes/api/v1/ingest/+server.ts– lógica OTA integrada.src/routes/app/admin/platform/+page.server.tsy+page.svelte– UI y acciones de administración.
Este documento debe incluirse en la navegación de MkDocs bajo la sección de Gestión (Administración).