Commit 022cb767 by Lucía Elizo Gómez

readme

parent 3a1d1ad4
...@@ -6,42 +6,47 @@ automáticamente desde una Raspberry Pi y crearlos como Records en la plataforma ...@@ -6,42 +6,47 @@ automáticamente desde una Raspberry Pi y crearlos como Records en la plataforma
## Arquitectura ## Arquitectura
``` ```
Raspberry Pi ──► POST /biaprint/upload ──► Plugin BiaPrint ──► Record en Kadi4Mat Raspberry Pi ──► POST /api/biaprint/folder ──► Plugin BiaPrint ──► Record en Kadi4Mat
(multipart/form-data) + archivos adjuntos (multipart/form-data) + archivos adjuntos
api_token + metadata JSON + extras/metadatos Authorization: Bearer <PAT> + extras/métricas
+ files[] (mp4, stl, …) + Collection + folder_name + etiquetas automáticas
+ files[] (mp4, json, ...) + Collection del año
``` ```
## Instalación en el servidor Kadi4Mat ## Instalación en el servidor Kadi4Mat
```bash ```bash
# Dentro del entorno virtual de Kadi4Mat # Dentro del entorno virtual de Kadi4Mat (source /venv/bin/activate)
pip install -e /ruta/al/kadi_plugin_biaprint/ pip install -e /ruta/al/kadi_plugin_biaprint/
# Verificar que Kadi detecta el plugin # Verificar que Kadi detecta el plugin
flask kadi list-plugins pip show biaprint
``` ```
## Configuración (kadi.cfg) ## Configuración en /opt/kadi/config/kadi.py
```python ```python
# Token que la Pi debe enviar para autenticarse PLUGINS = ["...", "biaprint"]
BIAPRINT_API_TOKEN = "pat_286fd4dd7b415a0448c4d9be052a509adf1ac396494613fb"
# Identifier de la Collection donde se añadirán los Records PLUGIN_CONFIG = {
# (debe existir previamente en Kadi4Mat) "biaprint": {
BIAPRINT_COLLECTION = "biaprint-trabajos" "host": "https://tu-kadi.dominio.com",
"upload_dir": "/tmp/biaprint_uploads",
},
}
```
# Directorio temporal para los archivos durante el upload Reiniciar tras cualquier cambio:
BIAPRINT_UPLOAD_DIR = "/tmp/biaprint_uploads" ```bash
sudo systemctl restart kadi-uwsgi
``` ```
## Endpoints disponibles ## Endpoints disponibles
| Método | Ruta | Descripción | | Método | Ruta | Autenticación | Descripción |
|--------|--------------------|----------------------------------------------| |--------|------------------------|---------------------|------------------------------------------|
| GET | /biaprint/health | Comprobación rápida (sin autenticación) | | GET | /biaprint/health | ninguna | Comprobación de que el plugin está activo|
| POST | /biaprint/upload | Recibe archivos y crea/actualiza un Record | | POST | /api/biaprint/folder | Bearer PAT (Token) | Recibe una sesión y crea el Record |
## Formato del JSON de metadatos ## Formato del JSON de metadatos
...@@ -59,12 +64,84 @@ BIAPRINT_UPLOAD_DIR = "/tmp/biaprint_uploads" ...@@ -59,12 +64,84 @@ BIAPRINT_UPLOAD_DIR = "/tmp/biaprint_uploads"
} }
``` ```
## Qué hace el endpoint /api/biaprint/folder
1. Lee el archivo `session_data.json` incluido en `files[]` y extrae métricas (diccionario)
2. Genera etiquetas según material, temperatura, duración y estado
3. Busca o crea la colección del año actual (ej: "2026")
4. Crea el Record con título, descripción, métricas como metadatos y etiquetas
5. Vincula el Record a la colección
6. Sube todos los archivos al Record, **excluyendo** las fotos de `cam1/` y `cam2/`
## Etiquetas automáticas generadas
|`impresion-3d`, `klipper`|
| Material detectado en nombre del gcode | `PLA`, `PETG`, `ABS`, etc. |
| Modelo de impresora en nombre del gcode | `prusa-mk3s`, `prusa-mk4`, etc. |
| Hotend ≥ 240 °C | `alta-temperatura` |
| Hotend ≤ 200 °C | `baja-temperatura` |
| Cama caliente activa | `cama-caliente` |
| Sin cama caliente | `sin-cama-caliente` |
| Duración < 10 min | `impresion-corta` |
| Duración 10–60 min | `impresion-media` |
| Duración > 60 min | `impresion-larga` |
| `state == "complete"` | `Impresion-completa` |
| `state == "cancelled"` o `"error"` | `Impresion-incompleta` |
## Estructura esperada de la carpeta
```
sesion_2026-05-28/
├── session_data.json ← telemetría de la sesión (lista de samples)
├── video.mp4 ← vídeo de la impresión
├── cam1/ ← fotos de cámara 1 (se excluyen del upload)
│ └── frame_000001.jpg
└── cam2/ ← fotos de cámara 2 (se excluyen del upload)
└── frame_000001.jpg
```
## Formato de session_data.json
Lista de samples, cada uno con esta estructura:
```json
[
{
"wall_time_utc": "2026-05-28T10:00:00+00:00",
"printer": {
"estado": {
"filename": "pieza_0.2mm_PLA_MK3S_1h.gcode",
"state": "complete",
"print_duration_s": 3600,
"filament_used_mm": 1500
},
"hotend": { "temp_c": 215.0, "target_c": 215 },
"cama": { "temp_c": 60.0, "target_c": 60 }
}
}
]
```
## Ejemplo de llamada desde curl ## Ejemplo de llamada desde curl
```bash ```bash
curl -X POST https://kadi.tudominio.com/biaprint/upload \ curl -k -X POST https://kadi.tudominio.com/api/biaprint/folder \
-H "Authorization: Bearer pat_ccc6bfdb17f9ff7c1bb271fe997eafee3b91561c67405ea9" \ -H "Authorization: Bearer pat_xxx..." \
-F "metadata={\"job_name\":\"pieza-test\",\"material\":\"PLA\"}" \ -F "folder_name=sesion-2026-05-28" \
-F "files[]=@/ruta/al/video.mp4" \ -F "files[]=@/ruta/session_data.json" \
-F "files[]=@/ruta/al/config.json" -F "files[]=@/ruta/video.mp4"
```
## Respuesta exitosa (201)
```json
{
"record_identifier": "sesion-2026-05-28",
"record_id": 42,
"collection_title": "2026",
"collection_id": 3,
"collection_created": false,
"files_saved": ["session_data.json", "video.mp4"]
}
``` ```
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment