¿Cómo reparar los puertos USB en un mini-PC?

Hola,
Ya ha ocurrido varias veces que los puertos USB1 y USB0 se invierten al reiniciar, después de que el interruptor automático haya saltado. En el puerto USB0 tengo conectada mi llave Zigbee y en el puerto USB1 mi Rflink, y por lo tanto cada vez el sistema inicializa la llave Zigbee en USB1 y el Rflink en USB0.
Ya intenté instalar esta configuración, pero en Node Red cuando el Rflink está en USB0 no se conecta. Por lo tanto, cada vez restablezco: llave Zigbee en USB0 y Rflink en USB1. Ya tenía este problema en el RPI y @VonOx, antes resolvió este problema

docker run -d \
--log-opt max-size=10m \
--restart=always \
--network=host \
--name node_red \
-u node-red:dialout \
--device=/dev/ttyUSB0 \
--device=/dev/ttyUSB1 \
--label com.centurylinklabs.watchtower.enable=false \
-v /var/lib/node-red:/data \
nodered/node-red

Todo funciona actualmente y no me apetece reinstalar todo Node-red con este comando.
Por lo tanto, quería saber si se puede fijar el estado de los puertos USB, o si debo insistir en invertir los puertos USB?
Gracias por su ayuda

Puedes fijar la asignación de los puertos USB con reglas udev :slight_smile:

Le pedí a ChatGPT que escribiera una pequeña guía, aquí está lo que me da (me parece bien):

1. Usar reglas udev para asignar nombres persistentes a los dispositivos USB

Los puertos /dev/ttyUSB0 y /dev/ttyUSB1 se asignan dinámicamente al iniciar el sistema, lo que puede provocar la inversión aleatoria de los dispositivos. Con udev, puedes asignar un nombre único y persistente a cada dispositivo según sus características (como su ID de producto, fabricante o número de serie).

Estos son los pasos:

  1. Identificar los dispositivos USB:

Usa el siguiente comando para encontrar la información de cada dispositivo:

udevadm info -q all -n /dev/ttyUSB0

udevadm info -q all -n /dev/ttyUSB1

Busca atributos como ID_VENDOR_ID, ID_MODEL_ID o ID_SERIAL.

  1. Crear una regla udev:

Edita o crea un archivo en /etc/udev/rules.d/ (por ejemplo /etc/udev/rules.d/99-usb-serial.rules) y añade una regla para cada dispositivo:

SUBSYSTEM==« tty », ATTRS{idVendor}==« XXXX », ATTRS{idProduct}==« YYYY », SYMLINK+=« zigbee_adapter »

SUBSYSTEM==« tty », ATTRS{idVendor}==« ZZZZ », ATTRS{idProduct}==« WWWW », SYMLINK+=« rflink_adapter »

Reemplaza XXXX, YYYY, ZZZZ y WWWW con los valores correspondientes encontrados en el paso anterior.

  1. Reiniciar el servicio udev:

Aplica las reglas reiniciando udev:

sudo udevadm control --reload-rules

sudo udevadm trigger

  1. Actualizar el comando Docker:

Modifica tu comando Docker para apuntar a los nuevos nombres persistentes (/dev/zigbee_adapter y /dev/rflink_adapter):

docker run -d \

–log-opt max-size=10m \

–restart=always \

–network=host \

–name node_red \

-u node-red:dialout \

–device=/dev/zigbee_adapter \

–device=/dev/rflink_adapter \

–label com.centurylinklabs.watchtower.enable=false \

-v /var/lib/node-red:/data \

nodered/node-red

2. Usar las opciones de Docker para especificar los dispositivos a través de su ruta estable

Si no quieres usar udev, puedes especificar directamente los dispositivos a través de su ruta física estable, accesible en /dev/serial/by-id/.

  1. Listar los dispositivos USB:

Ejecuta el siguiente comando para identificar los nombres estables:

ls -l /dev/serial/by-id/

Verás enlaces simbólicos como:

usb-1a86_USB2.0-Serial-if00-port0 → ../../ttyUSB0

usb-0403_6001_RFLINK-if00-port0 → ../../ttyUSB1

  1. Actualizar el comando Docker:

Modifica el comando Docker para usar estas rutas:

docker run -d \

–log-opt max-size=10m \

–restart=always \

–network=host \

–name node_red \

-u node-red:dialout \

–device=/dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0 \

–device=/dev/serial/by-id/usb-0403_6001_RFLINK-if00-port0 \

–label com.centurylinklabs.watchtower.enable=false \

-v /var/lib/node-red:/data \

nodered/node-red

Resumen

• Solución recomendada: Usar reglas udev para asignar nombres persistentes, lo cual es flexible e independiente de Docker.

• Alternativa rápida: Usar las rutas /dev/serial/by-id/ directamente en el comando Docker.

Estas soluciones garantizarán que tus dispositivos USB no se inviertan, incluso después de un reinicio o un corte de energía.