Integraciones externas: acceso a una llave USB serie (RFPlayer, Téléinfo, Zigbee…)

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:

  1. Solicitada en el manifiesto: "devices": ["serial"], también para el contenedor principal.
  2. Autorizada por el usuario en la interfaz (interruptor en la instalación, retirable en cualquier momento).
  3. 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 /dev libre 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

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 :slightly_smiling_face: