Commit 24b7fc9a by Lucía Elizo Gómez

Plugin biaprint

parent 58123b41
# kadi-plugin-biaprint
Plugin de **Kadi4Mat** que expone un endpoint HTTP para recibir archivos
automáticamente desde una Raspberry Pi y crearlos como Records en la plataforma.
Plugin de **Kadi4Mat** que expone un endpoint HTTPS para recibir archivos
automáticamente desde Raspberry Pi, analizarlos y subirlos a la plataforma.
## Arquitectura
```
Raspberry Pi ──► POST /api/biaprint/folder ──► Plugin BiaPrint ──► Record en Kadi4Mat
Raspberry Pi (Transfer.py) ──► POST /api/biaprint/folder ──► Plugin BiaPrint ──► Record en Kadi4Mat
(multipart/form-data) + archivos adjuntos
Authorization: Bearer <PAT> + extras/métricas
+ folder_name + etiquetas automáticas
+ files[] (mp4, json, ...) + Collection del año
+ files[] (mp4, json, ...) + Collection (año actual)
```
## Configuracion en /kadi_plugin_biaprint/pyproject.toml (registro de endpoint)
## Instalación en el servidor Kadi4Mat
```python
[project]
name = "biaprint"
version = "0.1.0"
description = "Kadi4Mat plugin for 3D printing sessions"
requires-python = ">=3.10"
dependencies = [
"kadi"
]
```bash
# Dentro del entorno virtual de Kadi4Mat (source /venv/bin/activate)
pip install -e /ruta/al/kadi_plugin_biaprint/
[project.entry-points."kadi_plugins"]
biaprint = "kadi_plugin_biaprint.plugin"
```
## Configuracion en /kadi_plugin_biaprint/setup.py
# Verificar que Kadi detecta el plugin
pip show biaprint
```python
from setuptools import setup, find_packages
setup(
name="kadi_plugin_biaprint",
version="0.1.0",
packages=find_packages(),
entry_points={
"kadi_plugins": [
"biaprint = kadi_plugin_biaprint.plugin",
],
},
)
```
## Configuración en /opt/kadi/config/kadi.py
......@@ -30,23 +52,42 @@ PLUGINS = ["...", "biaprint"]
PLUGIN_CONFIG = {
"biaprint": {
"host": "https://tu-kadi.dominio.com",
"host": "https://192.168.128.44",
"api_token": "TU_TOKEN",
"upload_dir": "/tmp/biaprint_uploads",
},
}
```
## Instalación en el servidor Kadi4Mat
```bash
# Dentro del entorno virtual de Kadi4Mat (source /venv/bin/activate)
pip install -e /ruta/al/kadi_plugin_biaprint/
# Verificar que Kadi detecta el plugin
pip show biaprint
```
Reiniciar tras cualquier cambio:
Reiniciar servicios tras cualquier cambio:
```bash
sudo systemctl restart kadi-uwsgi
sudo systemctl restart kadi-uwsgi apache2
```
## Endpoints disponibles
| Método | Ruta | Autenticación | Descripción |
|--------|------------------------|---------------------|------------------------------------------|
| GET | /biaprint/health | ninguna | Comprobación de que el plugin está activo|
| POST | /api/biaprint/folder | Bearer PAT (Token) | Recibe una sesión y crea el Record |
| GET | /biaprint/health | ninguna | Comprobacion de que el plugin esta activo|
| POST | /api/biaprint/folder | Bearer PAT (Token) | Recibe una sesion y crea el Record |
## 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/`
## Formato del JSON de metadatos
......@@ -64,15 +105,6 @@ sudo systemctl restart kadi-uwsgi
}
```
## 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
......@@ -92,12 +124,12 @@ sudo systemctl restart kadi-uwsgi
## Estructura esperada de la carpeta
```
sesion_2026-05-28/
sesion_2026-05-20/
├── 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)
├── cam1/ ← fotos de cámara 1 (se excluyen)
│ └── frame_000001.jpg
└── cam2/ ← fotos de cámara 2 (se excluyen del upload)
└── cam2/ ← fotos de cámara 2 (se excluyen)
└── frame_000001.jpg
```
......
......@@ -252,7 +252,7 @@ def _get_or_create_collection(host: str, pat: str, year_title: str):
session.headers["Authorization"] = f"Bearer {pat}"
session.verify = False # ajustar segun entorno
# Busqueda
# Busqueda con .get
r = session.get(
f"{host}/api/v1/collections",
params={"query": f'"{year_title}"', "per_page": 10},
......@@ -262,7 +262,7 @@ def _get_or_create_collection(host: str, pat: str, year_title: str):
if col.get("title") == year_title:
return col, False
# Creacion
# Creacion con .post
identifier = _make_identifier(year_title)
r = session.post(
f"{host}/api/v1/collections",
......
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