ttyUSB-Geräte mit festem Namen versehen

PDF Dokumente für Informationen im Detail, sowie Bauanleitungen.

Moderatoren: Ulrich, TeamO

Online
TeamO
Beiträge: 332
Registriert: Mo 22. Jun 2020, 08:58
Hat sich bedankt: 3 Mal
Danksagung erhalten: 59 Mal

ttyUSB-Geräte mit festem Namen versehen

Beitrag von TeamO »

Wenn man mehrere Geräte (Multi-Regler-Installation) hat, welche als ttyUSB0 bis ttyUSBx erkannt werden, ist es ganz sinnvoll diesen Geräten einen individuellen Namen zu vergeben, damit bei einem Neustart nicht versehentlich die Geräte vertauscht werden und dadurch die Daten in eine falsche Datenbank geschrieben werden.

Für die, die sich etwas genauer damit beschäftigen möchten hier noch eine kurze Erklärung dazu:
Die USB-Geräte werden über sogenannte udev Rules als Symlink erzeugt, damit in den Konfigurationen auch nach einem Neustart die Geräte unter der gleichen Adresse angesprochen werden können.

Hier eine Anleitung, wie Ihr den einzelnen Geräten anhand der USB-Seriennummer einen festen Namen vergeben könnt.
Es ist hier eigentlich egal, ob ihr schon mehrere Geräte angeshclossen habt und eine funktionierende Solaranzeige betreibt oder erst mit einem Gerät beginnt. Ich versuche es so zu erlären damit jeder damit zurecht kommt.

Mit

Code: Alles auswählen

lsusb
werden die angeschlossenen USB-Geräte angezeigt

z.B.

Code: Alles auswählen

pi@solaranzeige:~ $ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP2102/CP2109 UART Bridge Controller [CP210x family]
Bus 001 Device 003: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP2102/CP2109 UART Bridge Controller [CP210x family]
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
mit

Code: Alles auswählen

ls -la /dev/serial/by-id/
seht ihr, welches Gerät über welchen ttyUSB angesprochen wird

Code: Alles auswählen

pi@solaranzeige:~ $ ls -la /dev/serial/by-id/
insgesamt 0
drwxr-xr-x 2 root root 80 Jun  2 16:42 .
drwxr-xr-x 4 root root 80 Jun  2 16:42 ..
lrwxrwxrwx 1 root root 13 Jun  2 16:42 usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_0006-if00-port0 -> ../../ttyUSB1
lrwxrwxrwx 1 root root 13 Jun  2 16:42 usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_0007-if00-port0 -> ../../ttyUSB0
Ist nur ein Gerät angeschlossen, habt ihr natürlich nur eins mit ttyUSB0 und es ist klar, welches Gerät ihr gerade festlegen wollt.
Habt ihr bereits mehrere angeschlossen und verwendet die Multi-Regler-Version, ist meistens ttyUSB0 das Gerät in der 1.user.config.php, ttyUSB1 in 2.user.config.php usw. Aber das könnt ihr ja in den Dateien nochmal nachschauen.

Um den einzelnen Geräten nun eine feste Bezeichnung vergeben zu können, benötigen wir die Seriennummern der einzelnen USB-Geräte, da diese einmalig sein sollte.

Mit

Code: Alles auswählen

udevadm info -a -n /dev/ttyUSB0 | grep '{serial}' | head -n1
bekommt ihr die Seriennummmer des Gerätes ttyUSB0 und analog mit

Code: Alles auswählen

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

z.B.

Code: Alles auswählen

pi@solaranzeige:~ $ udevadm info -a -n /dev/ttyUSB0 | grep '{serial}' | head -n1
    ATTRS{serial}=="0007"
pi@solaranzeige:~ $ udevadm info -a -n /dev/ttyUSB1 | grep '{serial}' | head -n1
    ATTRS{serial}=="0006"
Damit wir nun anhand der ermittelten Seriennummern den USB-Geräten feste Namen zuweisen können, wird eine Datei 99-usb-serial.rules benötigt

Code: Alles auswählen

sudo mcedit /etc/udev/rules.d/99-usb-serial.rules
In dieser Datei wird pro Zeile ein Namen einem USB-Gerät zugewiesen.
Der Aufbau einer solchen Zeile ist folgender:

Code: Alles auswählen

SUBSYSTEM=="tty", ATTRS{serial}=="SERIENNUMMER", SYMLINK+="WUNSCHNAME", OWNER="pi"
Beim Eintrag ATTRS{serial} muss die jeweils ermittelte Seriennummer eingetragen werden.
Bei SYMLINK die Info, wohin der Systemlink zeigen soll.
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.


in meinem Beispiel würde es dann so aussehen

Code: Alles auswählen

SUBSYSTEM=="tty", ATTRS{serial}=="0006", SYMLINK+="Geraet1", OWNER="pi"
SUBSYSTEM=="tty", ATTRS{serial}=="0007", SYMLINK+="Geraet2", OWNER="pi"
Jetzt noch einen reboot ausführen:

Code: Alles auswählen

sudo reboot
und mit

Code: Alles auswählen

ls -l /dev/Geraet1
testen

Code: Alles auswählen

pi@solaranzeige:~ $ ls -l /dev/Geraet1
lrwxrwxrwx 1 root root 7 Jun  2 16:42 /dev/EZ -> ttyUSB0
pi@solaranzeige:~ $ ls -l /dev/Geraet2
lrwxrwxrwx 1 root root 7 Jun  2 16:42 /dev/2RZ -> ttyUSB1
Somit kann in der 1.user.config.php unter $USBDevice folgendes eingetragen werden:

Code: Alles auswählen

$USBDevice = "/dev/Geraet1";
und in der 2.user.config.php unter $USBDevice folgendes eingetragen werden:

Code: Alles auswählen

$USBDevice = "/dev/Geraet2";
Ab jetzt werden nach einem Neustart die Geräte automatisch anhand der Seriennummern den Namen zugewiesen und mit dem Namen der richtigen x.user.config.php und es kann zu keinem Vertauschen mehr kommen.

Falls Fragen sind, gerne mirstellen und ich versuche Sie zu beantworten.

tuxflo
Beiträge: 74
Registriert: So 17. Mai 2020, 21:48
Hat sich bedankt: 16 Mal
Danksagung erhalten: 17 Mal

Re: ttyUSB-Geräte mit festem Namen versehen

Beitrag von tuxflo »

Ich möchte noch anmerken, dass es je nach verwendeten Geräten vorkommen kann, dass noch keine Serialnummern vergeben sind. Das Problem hatte ich bei meinen IR-Schreib/Leseköpfen die am solaranzeige Rapsi hängen. Aber auch hier kann man sich abhilfe schaffen, indem man eine Seriennummer auf den FDTI Chip flasht. Wie das geht wird z.B. bei AZ Delivery erklärt: https://www.az-delivery.de/a/s/blogs/az ... und-andern
Für Linux gibt es auch entsprechnde Tools.
Kostal Pico Wechselrichter
SMA Tripower Wechselrichter

go-E Wallbox

per IR-Schreib/Lesekopf werden auch Zählerdaten erfasst

Raspi 4 über PoE HAT betrieben

Gtal
Beiträge: 13
Registriert: Do 13. Mai 2021, 07:46

Re: ttyUSB-Geräte mit festem Namen versehen

Beitrag von Gtal »

Hallo Zusammen,

vielen Dank für die Anleitung!!

Habe es entsprechend so gemacht, jedoch das Problem, dass zwei Geräten (meist) der gleiche USB Port zugewiesen wird.

Konstellation bei mir:
RaspPi 3B mit SSD
RS485USB Adapter mit einem Huawei KTL30-M3 dran (funktioniert tadellos mit Solaranzeige)
IR Schreib/Lesekopf

Das Ergebnis sieht so aus:

************
lrwxrwxrwx 1 root root 7 Jul 21 13:34 iozaehler -> ttyUSB1
lrwxrwxrwx 1 root root 7 Jul 21 13:34 rs485_30ktl -> ttyUSB1
crw------- 1 pi root 188, 0 Jul 21 13:34 ttyUSB0
crw------- 1 pi root 188, 1 Jul 21 13:34 ttyUSB1
pi@solaranzeige:/dev $ sudo udevadm trigger
pi@solaranzeige:/dev $ ls -l |grep USB*
lrwxrwxrwx 1 root root 7 Jul 21 13:34 iozaehler -> ttyUSB1
lrwxrwxrwx 1 root root 7 Jul 21 13:34 rs485_30ktl -> ttyUSB0
crw------- 1 pi root 188, 0 Jul 21 13:34 ttyUSB0
crw------- 1 pi root 188, 1 Jul 21 13:34 ttyUSB1
***********

In 75% der Fälle nach reboot oder trigger-Befehl hängen beide auf dem gleichen ttyUSB* . Ab und zu ist es OK.
Die Folge davon ist, dass der Lesekopf nach einiger Zeit aussteigt und erst nach einem Reboot wieder beginnt zu arbeiten.
Habe in der crontab schon eine Zeile eingebaut, die im Bootvorgang Unsinn verhindern soll, scheint aber nicht zu wirken.

Hat jemand einen Tipp für mich?
VG Gtal

Online
TeamO
Beiträge: 332
Registriert: Mo 22. Jun 2020, 08:58
Hat sich bedankt: 3 Mal
Danksagung erhalten: 59 Mal

Re: ttyUSB-Geräte mit festem Namen versehen

Beitrag von TeamO »

was steht in Deiner 99-usb-serial.rules ?

Gtal
Beiträge: 13
Registriert: Do 13. Mai 2021, 07:46

Re: ttyUSB-Geräte mit festem Namen versehen

Beitrag von Gtal »

TeamO hat geschrieben:
Mi 21. Jul 2021, 14:31
was steht in Deiner 99-usb-serial.rules ?
dies:

SUBSYSTEM=="tty", ATTRS{serial}=="D308JVYT", SYMLINK+="iozaehler", OWNER="pi"
SUBSYSTEM=="tty", ATTRS{serial}=="3f980000.usb", SYMLINK+="rs485_30ktl", OWNER="pi"

Online
TeamO
Beiträge: 332
Registriert: Mo 22. Jun 2020, 08:58
Hat sich bedankt: 3 Mal
Danksagung erhalten: 59 Mal

Re: ttyUSB-Geräte mit festem Namen versehen

Beitrag von TeamO »

Und was kommt bei

Code: Alles auswählen

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

Code: Alles auswählen

udevadm info -a -n /dev/ttyUSB1 | grep '{serial}' | head -n1
Könnte eventuell an dem . bei der SN liegen

Gtal
Beiträge: 13
Registriert: Do 13. Mai 2021, 07:46

Re: ttyUSB-Geräte mit festem Namen versehen

Beitrag von Gtal »

TeamO hat geschrieben:
Mi 21. Jul 2021, 15:49
Und was kommt bei

Code: Alles auswählen

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

Code: Alles auswählen

udevadm info -a -n /dev/ttyUSB1 | grep '{serial}' | head -n1
Könnte eventuell an dem . bei der SN liegen
Danke Dir
Das ist das Ergebnis - die Seriennummer ist mit dem "."

pi@solaranzeige:/var/www/html $ udevadm info -a -n /dev/ttyUSB0 | grep '{serial}' | head -n1
ATTRS{serial}=="D308JVYT"
pi@solaranzeige:/var/www/html $ udevadm info -a -n /dev/ttyUSB1 | grep '{serial}' | head -n1
ATTRS{serial}=="3f980000.usb"

Gtal
Beiträge: 13
Registriert: Do 13. Mai 2021, 07:46

Re: ttyUSB-Geräte mit festem Namen versehen

Beitrag von Gtal »

Ich glaube ich habe es nun hin bekommen.

Der Hinweis mit dem "." war der entscheidende Tip.
3f980000.usb wird zwar als Seriennummer rausgeworfen, jedoch mit einem tiefen Blick durch
udevadm info --attribute-walk --path=/sys/bus/usb-serial/devices/ttyUSB0
war dann keine Seriennummer vorhanden.
Habe nun ein anderes ATTRS Attribut genommen - und damit geht es.
Danke TeamO!

Online
TeamO
Beiträge: 332
Registriert: Mo 22. Jun 2020, 08:58
Hat sich bedankt: 3 Mal
Danksagung erhalten: 59 Mal

Re: ttyUSB-Geräte mit festem Namen versehen

Beitrag von TeamO »

Na also. Wichtig ist ja jetzt, dass es geht :D

rhrh11
Beiträge: 33
Registriert: Do 1. Nov 2018, 21:30
Danksagung erhalten: 1 Mal

Re: ttyUSB-Geräte mit festem Namen versehen

Beitrag von rhrh11 »

Hallo,
da würde ich gerne nochmal nachfragen, welches Attribut hast Du genommen.
Ich habe zu dem

looking at device '/devices/platform/soc/20980000.usb/usb1/1-1/1-1.5/1-1.5:1.0 /ttyUSB0':
KERNEL=="ttyUSB0"
SUBSYSTEM=="usb-serial"
DRIVER=="ch341-uart"
ATTR{port_number}=="0"

noch viele " parent device", etwa von dem KERNELS=="20980000.usb"

Gruß Reinald

Antworten