# Puente local Morphos (bridge) Lee los analizadores de laboratorio en la LAN de la clínica y reenvía los resultados normalizados a la API de Morphos (que corre en HF Spaces) por HTTPS autenticado. Es un proyecto **uv independiente** del backend: sus dependencias de serie/HL7 no entran en la imagen desplegada. ``` analizador → transporte (serie/MLLP) → parser (ASTM/HL7) → normalizador → reenviador → POST /api/lab/ingesta ``` ## Instalar y ejecutar ```bash cd bridge uv sync cp .env.example .env # edita MORPHOS_BRIDGE_URL, API_KEY y el transporte uv run python -m bridge.main ``` La `API_KEY` debe ser una de las claves configuradas en el backend (`MORPHOS_LAB_API_KEYS`). Ejecutar como servicio: envuelve `uv run python -m bridge.main` en una unidad systemd (o un contenedor) en un equipo de la clínica que esté en la misma red que el analizador. ### Conectar varios equipos a la vez Declara `MORPHOS_BRIDGE_INSTRUMENTOS` como una lista JSON (una línea) — un puente atiende a todos en paralelo, cada uno con su parser por fabricante: ``` MORPHOS_BRIDGE_INSTRUMENTOS=[ {"fabricante":"bionote","transporte":"mllp","instrumento_id":"vcheck-1","puerto":2575}, {"fabricante":"abaxis","transporte":"serie","instrumento_id":"vetscan-1","serie_puerto":"/dev/ttyUSB0"}, {"fabricante":"horiba","transporte":"serie","instrumento_id":"micros-1","serie_puerto":"/dev/ttyUSB1"} ] ``` El `fabricante` selecciona automáticamente el adaptador (Bionote→HL7, Abaxis/Horiba→ASTM) y, en el backend, la tabla `data/lab_mapeos/.json`. En el analizador, configura el destino: los de MLLP apuntan a `IP-del-puente:puerto`; los de serie se cablean al puerto USB/RS-232. ## Equipos soportados (alcance actual) | Equipo | Protocolo | Transporte | Adaptador | |--------|-----------|------------|-----------| | Bionote Vcheck V200 | HL7 v2.6 PCD-01 | MLLP/TCP | `adaptadores/hl7v2.py` | | Abaxis VetScan (VS2) | ASTM E1394 (configurar salida **ASTM**, no ASCII/XML) | serie | `adaptadores/astm_generico.py` | | Scil / Horiba | ASTM E1394 | serie | `adaptadores/astm_generico.py` | IDEXX queda fuera de alcance por ahora. ## Checklist de validación con el equipo real (por analizador) El parseo genérico y las tablas de mapeo se **finalizan con capturas reales** — no se puede cerrar sólo desde código: 1. Capturar 3–5 corridas reales (log del puerto serie, o pcap del MLLP). 2. Confirmar los parámetros: **serie** → baudios/paridad/bits; **MLLP** → IP/puerto y que el equipo espera ACK. 3. Confirmar **qué campo lleva el ID de muestra** (OBR-3 en HL7; O-3 en ASTM) y que coincide con lo que el veterinario teclea/escanea en Morphos. 4. Confirmar las **unidades** reportadas y los **códigos de prueba** (OBX-3 / R-3); añadir los que falten a `data/lab_mapeos/.json` en el backend (mira los `no_mapeados` que devuelve la ingesta). ## Pruebas ```bash uv run pytest # parsers (HL7/ASTM) + fiabilidad del reenviador (spool/retry) ``` Las pruebas usan fixtures capturadas; la corrección final contra el hardware es manual (ver checklist).