Hola a todos,
Estoy trabajando en una integración externa Gladys para la llave RFPlayer RFP1000 (Ziblue / GCE Electronics, 433 y 868 MHz).
Qué hace
- Sensores escuchados, propuestos en la pestaña Descubrimiento: sondas Oregon (temperatura, humedad, presión, viento, lluvia, UV) y contadores OWL.
- Detectores Visonic, X2D y KD101: alarma, autoprotección, batería baja.
- Mandos a distancia: Chacon/DiO, X10, Somfy RTS, Blyss, X2D, llaves Visonic…
- Actuadores controlados por la llave: enchufes, interruptores, lámparas variables, persianas Somfy RTS (el « my » sirve de parada) y portones.
- Emparejamiento en un clic: el botón « Emparejar un actuador » envía el marco de emparejamiento y añade el dispositivo a la configuración.
- Detección de interferencia de radio de la llave, útil para una alarma inalámbrica.
- Disparadores de escena (Gladys 5.1): mando a distancia presionado, detector activado, batería baja, interferencia.
- Acciones de escena (Gladys 5.1): enviar una orden de radio, simular una interferencia.
- Widget « Radio RFPlayer » en el tablero de control.
- 100 % local, sin ningún cloud.
El problema: la integración no puede acceder al USB
Las integraciones externas funcionan en un contenedor aislado, y este contenedor no recibe ningún puerto serie: ni /dev/ttyUSB*, ni /dev/ttyACM*.
En el manifiesto, las únicas clases de hardware que se pueden solicitar son coral-usb, coral-pcie, gpu y video. Y aún: solo para subcontenedores, no para el contenedor principal.
Resultado: imposible conectar una llave USB serie directamente a una integración externa.
He tenido el mismo problema con una integración Téléinfo. También afectará a las llaves Zigbee y Z-Wave, RFXtrx, EnOcean, Arduino…
La solución actual
Exponemos el puerto serie de la llave en TCP con ser2net (o socat) en la máquina donde está conectada. La integración se conecta luego a IP:port.
Ejemplo de /etc/ser2net.yaml:
connection: &rfplayer
accepter: tcp,4000
enable: on
options:
kickolduser: true
connector: serialdev,/dev/serial/by-id/usb-XXXX-if00-port0,115200n81,local
Luego, en la configuración de la integración: host = IP local de la máquina (no localhost), puerto = 4000.
Funciona, pero no es ideal:
- Un paso técnico más para el usuario: instalar y configurar ser2net. No es el espíritu « un clic » de la tienda.
- No hay contraseña en el puerto TCP: cualquiera en la red local puede controlar los dispositivos de radio. Hay que limitar la escucha a una IP o filtrar con el cortafuegos.
- Un servicio más para vigilar en la máquina anfitriona.
La solicitud está hecha 
He propuesto una clase de hardware serial: la integración la solicita, el usuario elige qué llave darle, y Gladys monta solo ese puerto en el contenedor. La caja de arena sigue siendo segura.
Se necesitan cambios en 3 lugares, una issue para cada uno:
- Núcleo Gladys (montaje del puerto en el contenedor): External integrations: allow access to a USB serial device · Issue #3194 · GladysAssistant/Gladys · GitHub
- Manifiesto / tienda (declarar la clase
serial): External integrations: allow access to a USB serial device · Issue #18 · GladysAssistant/integration-store · GitHub - SDK (leer el puerto concedido, ser notificado de un desconexión): External integrations: allow access to a USB serial device · Issue #39 · GladysAssistant/integration-sdk-js · GitHub
Si os afecta (RFPlayer, Téléinfo, Zigbee, Z-Wave…), poned un
en estas issues o añadid vuestro caso en los comentarios. Ayuda a priorizar.
@pierre-gilles, puedo ayudar a probar tan pronto como haya algo.
Llamada a los probadores
La integración sigue la especificación oficial de la API RFPlayer y está cubierta por pruebas automáticas. Sin embargo, todavía no la he probado en una llave real.
Si tenéis un RFPlayer, vuestros comentarios me ayudan mucho, especialmente en:
- las persianas Somfy RTS: la función « my » y el emparejamiento;
- los enchufes Chacon/DiO: el emparejamiento;
- las sondas Oregon y los detectores Visonic.
La documentación de instalación completa está en francés, incluyendo ser2net: gladys-rfplayer/docs/fr.md at main · prohand/gladys-rfplayer · GitHub
¡Gracias! ![]()