Hola a todos,
Tras el cierre de la issue de GitHub #18 (« discutámoslo en el foro »), propongo la funcionalidad aquí.
La necesidad
Las integraciones externas se ejecutan en un contenedor aislado, que no tiene acceso a los puertos serie USB.
Hoy, el manifiesto permite solicitar solo estas clases de hardware: coral-usb, coral-pcie, gpu, video. Y solo para los subcontenedores (containers[]), no para el contenedor principal de la integración.
Resultado: imposible leer directamente una clave USB serie.
Las integraciones afectadas
He desarrollado dos integraciones que lo necesitan:
Pero la necesidad es más amplia: claves Zigbee, Z-Wave, EnOcean, módems, etc.
La solución actual (no ideal)
Pasar por ser2net (o socat) en la máquina anfitriona, que expone el puerto serie en TCP.
Los problemas:
- Hay que instalar y configurar ser2net manualmente, por SSH → no adecuado para el público de Gladys.
- Abre un puerto de red sin autenticación en la red local.
- Un componente más para mantener y que puede fallar.
Lo que propongo
Añadir una clase serial, que sigue exactamente las mismas reglas que las clases existentes:
- Solicitada en el manifiesto:
"devices": ["serial"], también para el contenedor principal. - Autorizada por el usuario en la interfaz (interruptor en la instalación, retirable en cualquier momento).
- Montada solo si está presente en la máquina.
Algunas ideas adicionales:
- El usuario elige la clave en una lista de puertos serie detectados (se monta solo un dispositivo, no todo
/dev). - Usar la ruta estable
/dev/serial/by-id/...para que funcione después de un reinicio o un cambio de puerto USB. - Filtro opcional en el manifiesto (USB vendor/product ID o un etiqueta) para ofrecer solo las claves compatibles.
- Nunca una ruta
/devlibre en el manifiesto, como para las otras clases.
Preguntas abiertas
- ¿Qué hacer si dos integraciones (o una integración nativa como Zigbee2mqtt) quieren la misma clave?
- ¿Cómo manejar la clave desenchufada y enchufada en caliente?
- ¿Un solo puerto serie por integración, o varios?
Issues de GitHub relacionadas
- Núcleo de Gladys (montaje del dispositivo): External integrations: allow access to a USB serial device · Issue #3194 · GladysAssistant/Gladys · GitHub
- Integration store (esquema del manifiesto): External integrations: allow access to a USB serial device · Issue #18 · GladysAssistant/integration-store · GitHub
- SDK JS: External integrations: allow access to a USB serial device · Issue #39 · GladysAssistant/integration-sdk-js · GitHub
Tan pronto como exista la clase, actualizaré mis dos integraciones para eliminar ser2net.
¿Qué os parece? Si os interesa, no dudéis en votar por este tema ![]()