Comment déterminer quel câble est relié à quel appareil ?

Oui, lorsque l’on a un onduleur et des batteries style Pylontech, il faut bien les relier au Raspberry pour pouvoir les commander.
Mais que se passe-t-il si on a 2 fois le même câble ?

Eh bien Linux va être incapable de savoir qui est qui si on ne l’aide pas.
Dans la version actuelle de Smartphoton, je contrôle les Vendeur ID et le Product ID. Si ce sont 2 câbles différents, les valeurs seront différentes.
Pour exemple :

chez moi j’ai 2 câbles (pour être précis, 2 chipsets) différents, donc aucun soucis pour moi de déterminer qui est connecté à qui.
Cela se fait dans le menu «System»

Le câble avec l’ ID 10c4:ea60 est le câble qui est relié à l’onduleur
Le câble avec l’ ID 067b:23a3 est le câble qui est relié aux batteries.
Absolument aucunes ambiguïtés ! Facile !

Maintenant prenons l’exemple qui coince. Cas de figure réel !!!
L’utilisateur à 2 câbles série totalement identiques. Voici ce que voit Linux de ces 2 câbles (commande lsusb) :

lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 067b:23a3 Prolific Technology, Inc. ATEN USB to Serial Bridge
Bus 001 Device 003: ID 067b:23a3 Prolific Technology, Inc. ATEN USB to Serial Bridge

Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

On voit que les 2 câbles ont exactement la même identification. Donc impossible de déterminer qui est qui. Voilà le problème posé.

En utilisant la commande suivante ls -l /dev/serial/by-path/
La réponse est la suivante :

4 jun 11:47 platform-fd500000.pcie-pci-0000:01:00.0-usb-0:1.2:1.0-port0 -> ../../ttyUSB0
4 jun 12:04 platform-fd500000.pcie-pci-0000:01:00.0-
usb-0:1.3:1.0
-port0 -> ../../ttyUSB1

On voit qu’il y a 2 interfaces, 1 sur le path usb-0:1.2:1.0 qui est donc l’interface ttyUSB0 et l’autre sur le path usb-0:1.3:1.0
Ce qui du coup me donne l’information de qui est où, Ghislain m’avait dit que l’onduleur était sur ttyUSB1, donc les batteries seront sur ttyUSB0.

Maintenant, il faut fixer ceci pour que lors du prochain redémarrage, cela soit toujours le cas !

Donc sur Linux on utilise des fichiers spéciaux qui donnent ce genre d’ordres.
Il s’agit du fichier /etc/udev/rules.d/99-usb-serial.rules
par exemple, dans celui-ci, j’ai introduis les lignes sous cette forme :

SUBSYSTEM=="tty",ENV{ID_PATH}=="platform-fd500000.pcie-pci-0000:01:00.0-usb-0:1.2:1.0",SYMLINK+="tty-pylontech"
SUBSYSTEM=="tty",ENV{ID_PATH}=="platform-fd500000.pcie-pci-0000:01:00.0-usb-0:1.3:1.0",SYMLINK+="tty-onduleur"

tty-onduleur et tty-pylontech sont utilisés dans mon programme justement pour m’affranchir des ports USB donnés aléatoirement par Linux.

Du coup lorsque Linux démarre je vais avoir ceci avec la commande
suivante ls -l /dev/tty-onduleur et ls -l /dev/tty-pylontech

4 jun 14:36 /dev/tty-pylontech -> ttyUSB0
4 jun 14:36 /dev/tty-onduleur -> ttyUSB1

Et donc Smartphoton va pouvoir gérer à la fois l’onduleur et les batteries sans confusions. Ce qui était le but à atteindre Smile

Pour l’heure, je dois éditer le fichier en mode manuel, mais je regarderai pour que cela soit possible pour l’utilisateur par la suite.

C’était un long exposé, mais je pense qu’il sera utile pour de nombreux «Linuxien» qui comme moi ont lutés pour trouver ce genre d’informations assez obscures tout de même.

Pour information importante, j’ai trouvé la variable {ID_PATH} ci dessus via cette commande :

sudo udevadm info --query=all –name=/dev/ttyUSB0
et
sudo udevadm info --query=all –name=/dev/ttyUSB1

Qui me donne les résultats suivants. Je les mets en comparatifs dans un tableau pour lecture facilitée