Mehrere USB-Geräte unter Linux mit fixem Namen ansprechen

IM EINSATZ?

Dann schau dir UNSEREN LOXKURS an und profitiere von unserem Wissen!

Wer einen Raspberry Pi für die Smart-Home-Steuerung einsetzt, kennt das Problem vermutlich: Es hängen schnell mehrere USB-Geräte am Rechner, deren interne tty-Adresse sich nach dem Aus- und wieder Einstecken einfach ändern kann. Ist das USB-Gerät dann lediglich statisch z.B. per /dev/ttyUSB0 eingebunden, sind die Probleme vorprogrammiert.

Wie sich dieses zeitraubende Problem mit nur wenigen Befehlen in den Griff bekommen lässt und zudem die Übersichtlichkeit gesteigert werden kann, ist Inhalt des nachfolgenden Blogpost.

Problem bereites mit zwei USB-Geräten!?

Bei mir fing das Problem bereits damit an, dass ich – wie in diesem Blogpost vorgestellt – sowohl Smartmeter als auch Fernwärmestation in meine Smart-Home-Steuerung integrieren wollte und entsprechend zwei (identische) IR-Schreib-/Leseköpfe (Affiliate-Link) per USB am Raspberry Pi in Betrieb nahm.

Die vom Linux-Betriebssystem erkannten USB-Sticks wurden direkt jeweils als
“Future Technology Devices International, Ltd FT232 Serial (UART) IC”
erkannt, was sich mit dem Terminal-Befehl

lsusb

in Erfahrung bringen lies.

Mit dem Terminal-Befehl

ls -la /dev/serial/by-id/

lies sich dann ermitteln, dass die Sticks per /ttyUSB0 und /ttyUSB1 erreichbar waren, um sie von der gewünschten Anwendung aus (in diesem Fall Node-RED) ansprechen zu können.

Das Problem ist jedoch, dass diese automatische Zuweisung ins Schwanken gerät, sobald die USB-Devices bspw. bei einer notwendigen Erweiterung durch einen USB-Hub – wie dem von mir genutzten 7fach Multiport USB Verteiler (Affiliate-Link) – umgesteckt werden müssen. Dann stehen die Chancen bei zwei angeschlossenen Geräten nur noch 50/50, dass es weiter funktioniert. Beim Betrieb von weiteren USB-Geräten ist es also wahrscheinlich, dass die direkte Nutzung der Adressen /tty/USB0 etc. nicht sonderlich zielführend ist.

USB-Geräte per UDEV mit fixem Namen einbinden

Glücklichweise gibt es Hilfe in von von UDEV (Wiki-Link), sodass die USB-Geräte mit einem immer gültigen “Namen” wie /dev/stromzaehler und /dev/fernwaerme erreichbar gemacht werden – und das natürlich auch bei späterem mehrfachen Umstecken der USB-Sticks.

Dazu wird erstmal die Seriennummer des ersten erkannten USB-Device “tty/USB0” mit Terminal-Befehl

udevadm info -a -n /dev/ttyUSB0 | grep '{serial}' | head -n1

ausgelesen. In diesem Fall lautet das notwendige Serial “A506KKWI” (ohne Anführungszeichen).

Das zweite USB-Device lässt sich dann analog dazu mit dem Befehl

udevadm info -a -n /dev/ttyUSB1 | grep '{serial}' | head -n1

ermitteln, usw. Die Seriennummer des zweiten USB-Geräts lautet also “AH06GHPU“.

Diese Infos müssen dann nur noch in die Datei /etc/udev/rules.d/99-usb-serial.rules übernommen werden. Also erstmal den nano-Editor anschmeissen:

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

Und folgende Einträge ergänzen, eine Zeile pro USB-Gerät:

SUBSYSTEM=="tty", ATTRS{serial}=="AH06GHPU", SYMLINK+="fernwaerme", OWNER="pi"
SUBSYSTEM=="tty", ATTRS{serial}=="A506KKWI", SYMLINK+="stromzaehler", OWNER="pi"

Beim Eintrag ATTRS{serial} muss die jeweils ermittelte Seriennummer eingetragen werden.

Bei SYMLINK die Info, wohin der Systemlink zeigen soll. Beim Eintrag “stromzaehler” ist das USB-Gerät dann entsprechend per “/dev/stromzaehler” erreichbar, usw.

Mit OWNER dann abschließend noch die Angabe, welcher Benutzer Zugriff erhalten soll. Wer Raspberry Pi OS einsetzt, trägt eben den User “pi” ein.

Die gerade bearbeitete Datei dann noch per “STRG + o” speichern und mit “STRG + x” schließen. Damit die Änderungen vollzogen werden am besten direkt noch ein

sudo reboot

hinterherschicken, um das System neuzustarten.

Sobald wieder erreichbar, erneut per SSH einloggen und das Ergebnis testen mit:

ls -l /dev/stromzaehler

Die Ausgabe sollte dann in etwa so aussehen: lrwxrwxrwx 1 root root 7 Sep 16 15:52 /dev/stromzaehler -> ttyUSB0

Und das war es auch schon, ab sofort sind beide USB-Geräte dauerhaft per /dev/stromzahler und /dev/fernwaerme erreichbar.

Und noch ein Tipp zum Schluss: Am übersichtlichsten ist obiges Vorgehen natürlich aus Anwendersicht, wenn die USB-Geräte der Reihe nach in Betrieb genommen werden. Also erstmal nur einen USB-Stick anschließen, entsprechend der obigen Logik einbinden, danach den zweiten Stick anschließen und einbinden, etc.

Aus meinem täglichen Leben

Eine lange Zeit hat mich diese Thematik überhaupt nicht gejuckt, da meist eh nur ein USB-Device am Raspberry Pi (Affiliate-Link) hing. Hat sich dann doch mal die Zuweisung geändert, habe ich die Anpassung im jeweiligen Programm schnell händisch vorgenommen. Irgendwann hatte ich aber keine Lust mehr dazu und ich kann jedem nur ans Herz legen die oben erklärte, fixe Zuweisung bzw. den Systemlink direkt von Anfang an zu nutzen. Das erspart einem im späteren Produktivbetrieb u.U. viele graue Haare.

Ich bin mittlerweile sogar dazu übergegangen und klebe entsprechende Labels auf die USB-Geräte bzw. deren Stecker, um direkt am USB-Hub nachvollziehen zu können, um welches Gerät es sich handelt.

Am besten sieht das dann natürlich mit einem gedruckten Etikettenlabel aus, wie dem Brother P-Touch QL-500 BW (Affiliate-Link). Und wer eh gerade einen günstigen aktiven USB-Hub sucht, dem kann ich diesen hier nur ans Herz legen: 7fach Multiport USB Verteiler (Affiliate-Link)

8 Kommentare
  1. Eine Möglichkeit würde ich aber trotzdem noch hinzufügen. by-path
    So haben die culs von busware keine Serie, wenn ich mich ich mich noch richtig erinne.
    Solange sich der Port wo der Stick eingesteckt ist nicht ändert ist das eine Alternative.

    1. Hi Robert!
      Danke für deinen Tipp. Nen Cul-Stick hab ich auch noch rumfliegen und werde das bei Gelegenheit mal testen und die Anleitung entsprechend erweitern.

      Grüße
      Jörg

  2. Hallo Danke für die Anleitung , ich habe nur eine schwierigkeit , ich habe zwei identische sticks einen auf usb0 und einen auf usb1 und bei beiden wird die selbe ATTRS Serial ausgegeben , wie kann ich hier dann eine zuordnung machen ?

    1. Dieses Problem habe ich auch : 6 identische Waagen ( seriell auf USB ) und 6 Soundsticks, das Ganze mittels 2 USB – Hubs am Pi. Die Seriennummern jeweils alle gleich. Ich kann nicht mal mit Bestimmtheit sagen, was die geänderte Zuweisung verursacht, höchstwahrscheinlich aber ein Wackler bei Arbeiten im Umfeld, da es eigentlich immer auf ein Hub beschränkt ist. Aus /dev/ttyUSB5 – /dev/ttyUSB7 wird dann unvermittelt /dev/ttyUSB8 – /dev/ttyUSB10 und der Zugriff auf die Geräte geht ins Leere.

  3. Hallo.
    Das gleiche Problem mit derselben Seriennummer bei zwei Geräten hatte ich auch.
    Abhilfe war die Produkt-ID zu nehmen.
    Also streiche: {serial} und setze: {idProduct}
    So funktioniert das bei mir fehlerfrei.
    Vielen Dank für den Artikel!

  4. Ich muss das Thema auch nochmal hochholen, denn die gleichen “Probleme” habe ich im VenusOS auf meinem Raspberry– denn mit jeder Änderung des “Device-Path” ändert sich auch die VRM instance-ID (in meinem Fall vom dbus seriell battery Adapter) und somit auch die MQTT-Topics, die ich abfrage.. ziemlich nervig. Unter VenusOS kann man leider nicht “einfach” entsprechende udev-rules hinzufügen.. werden entweder ignoriert oder es wird gar nichts mehr gefunden.. Kennt wer zufällig dafür eine Lösung?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Das könnte dir auch gefallen