USB dongle

Añadiendo un adaptador Z-Wave (o un coordinador Zigbee, para el caso)

Si queremos habilitar nuestro controlador domótico para gestionar una red Z-Wave necesitaremos incorporar un dispositivo que actúe como puerta de enlace entre la red y nuestro software de control Openhab. Estos dispositivos suelen venir en forma de «dongle» USB y sea cual sea la manera en que nuestro software se comunique con él, siempre deberemos especificar el puerto serie virtual al que se encuentra conectado. Sabiendo que son muchos los puertos serie virtuales que un sistema linux es capaz de crear, necesitaremos identificar correctamente cuál corresponde al dispositivo que queremos manejar.

Nota: Si bien nuestro propósito es conectar un «dongle» que nos permita gestionar una red domótica inalámbrica, todo el procedimiento aquí descrito es igualmente válido para cualquier dispositivo USB que enchufemos a nuestra máquina.

La manera clásica de hacer esto consiste en listar los dispositivos de este tipo antes y después de enchufar el adaptador y ver qué nueva línea es la que aparece en el listado.

ls -l /dev/tty*

En nuestro caso, acabamos de conectar un dongle Z-Wave Gen5 de la marca Aeotec, y lo que obtenemos es el puerto serie virtual se llama: /dev/ttyACM0

Si ahora, por ejemplo, hacemos lo mismo con el adaptador Zigbee Sonoff mientras está enchufado el anterior, veremos que aparece un segundo puerto: /dev/ttyUSB0

En principio, con estos datos ya tendríamos suficiente. Sin embargo, el problema de que la asignación de puerto se realice dinámicamente es que el puerto serie asignado al adaptador puede variar cada vez que el sistema se reinicie o, incluso, cada vez que el dispositivo se desenchufe, dependiendo de los puertos disponibles, con lo cual la configuración que hayamos ajustado para nuestro software dejará de tener sentido. De hecho, la asignación anterior de puertos podría depender, simplemente, de los puertos USB utilizados o, incluso, del orden en el que se enchufan. Para evitarlo es preciso crear una regla de persistencia.

Lo primero es obtener la información que identifica unívocamente a nuestro adaptador, concretamente dos números hexadecimales llamados «idVendor» e «idProduct». Esto se consigue listando los dispositivos USB reconocidos por el sistema. Y, para evitar confusiones, como antes, mejor hacerlo antes y después de enchufarlo.

Por ejemplo, antes de enchufar ningún adaptador obtenemos esto:

lsusb
Bus 001 Device 003: ID 058f:6254 Alcor Micro Corp. USB Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Todos estos dispositivos corresponden, simplemente, al Hub USB. Sin embargo, si enchufamos el adaptador Z-Wave vemos esto:

lsusb
Bus 001 Device 003: ID 058f:6254 Alcor Micro Corp. USB Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 004: ID 0658:0200 Sigma Designs, Inc. Aeotec Z-Stick Gen5 (ZW090) - UZB
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Y después de enchufar los dos, esto otro:

lsusb
Bus 001 Device 003: ID 058f:6254 Alcor Micro Corp. USB Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 005: ID 10c4:ea60 Silicon Labs CP210x UART Bridge
Bus 004 Device 004: ID 0658:0200 Sigma Designs, Inc. Aeotec Z-Stick Gen5 (ZW090) - UZB
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

En este formato, lo que nos interesa son los dos números hexadecimales que aparecen después de ID, de esta forma <idVendor>:<idProduct>

Ahora creamos el siguiente archivo en el que añadimos una línea por cada dispositivo, especificando los ID’s obtenidos en el paso anterior y un nombre facilmente reconocible:

sudo nano /etc/udev/rules.d/usb-serial.rules
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="0658", ATTRS{idProduct}=="0200", SYMLINK+="ttyUSB-AEON-ZWAVE"
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="10C4", ATTRS{idProduct}=="EA60", SYMLINK+="ttyUSB-SONOFF-ZIGBEE"

Esto creará un enlace simbólico entre el nombre que nosotros especifiquemos para cada dispositivo y el puerto al que se asigne cada vez, independientemente de cuál se trate.

Ahora, si comprobamos el listado de los dispositivos de tipo puerto serie (tras reiniciar):

ls -l /dev/tty*

crw-rw-rw- 1 root tty       5,  0 May 16 19:15 /dev/tty
crw--w---- 1 root tty       4,  0 May 15 22:38 /dev/tty0
crw--w---- 1 root tty       4,  1 May 15 22:39 /dev/tty1
crw--w---- 1 root tty       4,  2 May 15 22:38 /dev/tty2
crw--w---- 1 root tty       4,  3 May 15 22:38 /dev/tty3
crw--w---- 1 root tty       4,  4 May 15 22:38 /dev/tty4
crw--w---- 1 root tty       4,  5 May 15 22:38 /dev/tty5
crw--w---- 1 root tty       4,  6 May 15 22:38 /dev/tty6
crw--w---- 1 root tty       4, 60 May 15 22:38 /dev/tty60
crw--w---- 1 root tty       4, 61 May 15 22:38 /dev/tty61
crw--w---- 1 root tty       4, 62 May 15 22:38 /dev/tty62
crw--w---- 1 root tty       4, 63 May 15 22:38 /dev/tty63
crw--w---- 1 root tty       4,  7 May 15 22:38 /dev/tty7
crw--w---- 1 root tty       4,  8 May 15 22:38 /dev/tty8
crw--w---- 1 root tty       4,  9 May 15 22:38 /dev/tty9
crw-rw---- 1 root dialout 166,  0 May 16 19:25 /dev/ttyACM0
lrwxrwxrwx 1 root root          7 May 15 22:38 /dev/ttyUSB-AEON-ZWAVE -> ttyACM0
lrwxrwxrwx 1 root root          7 May 15 22:38 /dev/ttyUSB-SONOFF-ZIGBEE -> ttyUSB0
crw-rw---- 1 root dialout 188,  0 May 16 18:17 /dev/ttyUSB0
crw------- 1 root root      5,  3 May 15 22:38 /dev/ttyprintk

Podemos comprobar los nombres elegidos por nosotros y los puertos a los que hacen referencia en este momento. Por cierto, también observamos que para acceder a estos puertos es necesario ser root o pertenecer al grupo dialout

Si vamos a manejar los dispositivos desde openhab

Ahora ya podemos indicar al software que vaya a utilizar el dispositivo el puerto serie en cuestión. En el caso de que dicho software sea openhab, necesitaremos que su entorno de configuración reconozca estos nombres para hacerlos disponibles en el contexto del programa. Para ello modificamos el archivo de configuración de entorno en /etc/default/openhab añadiendo la siguiente opción en la sección correspondiente:

sudo nano /etc/default/openhab

EXTRA_JAVA_OPTS="-Dgnu.io.rxtx.SerialPorts=/dev/ttyUSB-AEON-ZWAVE:/dev/ttyUSB-SONOFF-ZIGBEE"

Y ya sólo necesitaríamos configurar los puertos correctos en la interfaz de OpenHab que corresponda al servicio en cuestión. En nuestro ejemplo, los Addons correspondientes a las redes Z-Wave y Zigbee.

Deja una respuesta