Changement inopiné port USB clé ZWave

Bonjour à tous,

J’ai eu le même souci en utilisant plusieurs clés en même temps (RF Player, Aeotec Gen 5 Z-Wave et Huawei 3G). J’ai changé les câbles usb, j’ai testé avec un hub alimenté ou pas, en direct sur le Pi 3, avec des alim de 3A (une pour le Pi et une autre pour le hub), j’ai mesuré les courants pour vérifier.

En configurant les ports en Auto ou autrement, ça fonctionne au début, mais ça ne tient pas dans le temps. Par défaut les numéros de ports sont attribués dans l’ordre de connexion ttyUSB0 ttyUSB1 ttyUSB2… Dès fois, ils se déconnectent tout seul puis se reconnectent avec un nouveau numéro, le pire, c’est la clé 3G qui prend 3 ports mais seul le 1er fonctionne. Une des clé change de port et prend le numéro d’un autre déjà occupé, résultat, ça plante : les 3 protocoles 433MHz, Z-Wave et 3G tombaient en rade de façon aléatoire. Cela ne tenait pas plus de 3 jours et avec tous les voyants ‹ Santé › au vert dans Jeedom. Un redémarrage et tout rentrait dans l’ordre.
Bref, c’était une vrai galère qui a duré plusieurs semaines !

Une solution est de fixer les ports USB pour que lorsqu’ils se reconnectent, ils reprennent leurs numéros. J’ai encore la clé 3G qui est un peu capricieuse mais c’est rare et elle ne fait plus planter les 2 autres réseaux. Depuis, je suis tranquille.

Pour fixer les ports USB, il faut d’abord déterminer les identifiants des clés avec les commandes suivantes
sudo dmesg | grep 'idVendor\|idProduct\|iProduct\|iSerial'
ou
sudo lsusb -v | grep 'idVendor\|idProduct\|iProduct\|iSerial'

On obtient quelque chose comme ceci

  idVendor           0x0658 Sigma Designs, Inc.
  idProduct          0x0200 Aeotec Z-Stick Gen5 (ZW090) - UZB

  idVendor           0x0403 Future Technology Devices International, Ltd
  idProduct          0x6001 FT232 Serial (UART) IC

  idVendor           0x12d1 Huawei Technologies Co., Ltd.
  idProduct          0x1001 E161/E169/E620/E800 HSDPA Modem

Ensuite, il faut créer un fichier 99-usb-serial.rules en mode administrateur dans le répertoire /etc/udev/rules.d/ comme ceci

sudo nano /etc/udev/rules.d/99-usb-serial.rules

On écrit dedans les lignes suivantes,

SUBSYSTEM=="tty", ATTRS{idVendor}=="0658", ATTRS{idProduct}=="0200", SYMLINK+="ttyACM-ZW090"
SUBSYSTEM=="tty", ATTRS{idVendor}=="1cf1", ATTRS{idProduct}=="0030", SYMLINK+="ttyACM-CONBEE2", ATTRS{serial}=="DE2xxxxxx"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6015", SYMLINK+="ttyUSB-TIC"    , ATTRS{serial}=="DA1xxxxx"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="ttyUSB-RFP1000", ATTRS{serial}=="A1xxxxxx"
SUBSYSTEM=="tty", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1001", SYMLINK+="ttyUSB-GSM"    , ENV{ID_USB_INTERFACE_NUM}=="00"

Les identifiants sont à adapter avec vos résultats obtenus précédemment, un redémarrage est nécessaire ou pas avec les commandes suivantes (c’est la dernière qui marche surtout)

sudo udevadm control --reload
sudo udevadm control --reload-rules
sudo udevadm trigger

De plus, les commandes ‹ udevadm info -a -n /dev/ttyUSBx › ou ‹ udevadm info -n /dev/ttyUSBx › permettent d’obtenir beaucoup d’info pratique

Pour voir les ports série utilisés, il faut taper ls -al /dev/serial/by-id/*, on obtient ceci

/dev/serial/by-id/usb-0658_0200-if00 -> ../../ttyACM1
/dev/serial/by-id/usb-Cartelectronic_Interface_USB_1_TIC_DA1xxxxx-if00-port0 -> ../../ttyUSB0
/dev/serial/by-id/usb-HUAWEI_HUAWEI_Mobile-if00-port0 -> ../../ttyUSB2
/dev/serial/by-id/usb-HUAWEI_HUAWEI_Mobile-if01-port0 -> ../../ttyUSB3
/dev/serial/by-id/usb-HUAWEI_HUAWEI_Mobile-if02-port0 -> ../../ttyUSB4
/dev/serial/by-id/usb-Ziblue_RFPLAYER_A1xxxxxx-if00-port0 -> ../../ttyUSB1
/dev/serial/by-id/usb-dresden_elektronik_ingenieurtechnik_GmbH_ConBee_II_DE2xxxxxx-if00 -> ../../ttyACM0

En fixant les ports, cela fonctionnait pour toutes les clé USB sauf la clé GSM qui a 3 interfaces (3 ports). À chaque déconnexion, le bon port de la clé alternait entre ttyUSB2, ttyUSB3 et ttyUSB4. Et donc mon lien symbolique « ttyUSB-GSM » ne fonctionnait pas à tous les coups (1 chance sur 3). Après moult recherches sur le net, j’espère avoir trouvé la commande magique avec ENV{ID_USB_INTERFACE_NUM}=="00" qui permet de sélectionner la première interface de la clé une bonne fois pour toute.

Le plus simple, je pense, serait de pouvoir choisir le port directement dans la liste donnée par /dev/serial/by-id/ pour le plugin au lieu de /dev/ttyUSB* et /dev/ttyACM* que de se prendre la tête à refaire des liens.

J’espère que ceci vous aidera.

16 « J'aime »