ttyUSB-Geräte mit festem Namen versehen
Verfasst: Fr 4. Jun 2021, 10:47
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
werden die angeschlossenen USB-Geräte angezeigt
z.B.
mit
seht ihr, welches Gerät über welchen ttyUSB angesprochen wird
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
bekommt ihr die Seriennummmer des Gerätes ttyUSB0 und analog mit
die vom ttyUSB1.
z.B.
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
In dieser Datei wird pro Zeile ein Namen einem USB-Gerät zugewiesen.
Der Aufbau einer solchen Zeile ist folgender:
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
Jetzt noch einen reboot ausführen:
und mit
testen
Somit kann in der 1.user.config.php unter $USBDevice folgendes eingetragen werden:
und in der 2.user.config.php unter $USBDevice folgendes eingetragen werden:
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.
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
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
Code: Alles auswählen
ls -la /dev/serial/by-id/
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
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
Code: Alles auswählen
udevadm info -a -n /dev/ttyUSB1 | grep '{serial}' | head -n1
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"
Code: Alles auswählen
sudo mcedit /etc/udev/rules.d/99-usb-serial.rules
Der Aufbau einer solchen Zeile ist folgender:
Code: Alles auswählen
SUBSYSTEM=="tty", ATTRS{serial}=="SERIENNUMMER", SYMLINK+="WUNSCHNAME", OWNER="pi"
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"
Code: Alles auswählen
sudo reboot
Code: Alles auswählen
ls -l /dev/Geraet1
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
Code: Alles auswählen
$USBDevice = "/dev/Geraet1";
Code: Alles auswählen
$USBDevice = "/dev/Geraet2";
Falls Fragen sind, gerne mirstellen und ich versuche Sie zu beantworten.