Gerät nach Reboot von FHEM nicht mehr gefunden: ttyUSB# oder ttyACM# falsch

Begonnen von CaptBlaubaer, 08 November 2013, 01:30:56

Vorheriges Thema - Nächstes Thema

CaptBlaubaer

Hallo liebe FHEM Freunde,

nach einem Reboot hat sich die tty Nummer des Gerätes geändert. Aus diesem Grund funktionieren jetzt die defines aus der fhem.cfg nicht mehr oder zeigen auf das falsche Gerät.
Vor dem Reboot war mein Arduino MEGA auf .../ttyACM1 gemounted
Zitatroot@iconnect:~# ls -al /dev/serial/by-id
total 0
drwxr-xr-x 2 root root 60 Nov  8 00:59 .
drwxr-xr-x 4 root root 80 Nov  7 21:05 ..
lrwxrwxrwx 1 root root 13 Nov  8 00:58 usb-Arduino__www.arduino.cc__Arduino_Mega_2560_741363339323517040D0-if00 -> ../../ttyACM1
Nach dem Reboot jetzt auf .../ttyACM0
Zitat
root@iconnect:~# reboot
Broadcast message from root@iconnect (pts/2) (Fri Nov  8 00:59:48 2013):
The system is going down for reboot NOW!
root@iconnect:~#
Linux iconnect 3.12.0-iconnect #1 Mon Nov 4 13:59:38 CET 2013 armv5tel

root@iconnect:~# ls -al /dev/serial/by-id
total 0
drwxr-xr-x 2 root root 60 Nov  8 01:00 .
drwxr-xr-x 4 root root 80 Nov  8 01:00 ..
lrwxrwxrwx 1 root root 13 Nov  8 01:00 usb-Arduino__www.arduino.cc__Arduino_Mega_2560_741363339323517040D0-if00 -> ../../ttyACM0
Mir ist klar, dass das durch ein- und ausstecken der USB Geräte in unterschiedlicher Reihenfolge und dadurch automatische Nummerierung durch das udev System kommt.
Meine Rechechen haben ergeben, dass es udev Regeln gibt.
Allerdings habe ich noch keine gefunden die eine feste Zuordnung zu ttyUSB# oder ttyACM#.

Vielleicht hat ja von Euch schon jemand eine Lösung am laufen die ich auf meine Geräte anpassen könnte?

Dieses Verhalten tritt auf meinem Hirmbeerchen und auf meinem iConnect gleichermassen auf.

Und wie ich VendorID und SerialNummer bekomme weiss ich auch schon
Zitatroot@iconnect:~# usb-devices

T:  Bus=01 Lev=02 Prnt=02 Port=03 Cnt=02 Dev#=  4 Spd=12  MxCh= 0
D:  Ver= 1.10 Cls=02(commc) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1
P:  Vendor=2341 ProdID=0010 Rev=00.01
S:  Manufacturer=Arduino (www.arduino.cc)
S:  Product=Arduino Mega 2560
S:  SerialNumber=741363339323517040D0
C:  #Ifs= 2 Cfg#= 1 Atr=c0 MxPwr=100mA
I:  If#= 0 Alt= 0 #EPs= 1 Cls=02(commc) Sub=02 Prot=01 Driver=cdc_acm
I:  If#= 1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=cdc_acm
Best regards und viele Gruesse,
CaptBlaubaer (CBR)
_________________________________
FHEM 5.5 Raspberry Pi (B), IOMEGA iConnect, Firmata Arduinos USB/LAN, Gembird USB/LAN, ToDo: FHEM auf FritzBox 7390, 7270

Joachim

FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

CaptBlaubaer

Hallo Joachim,

vielen Dank für die schnelle Rückmeldung. Über die Links bin ich bei meinen Recherchen auch gestolpert.
Soweit ich die Rules verstanden habe wird dabei aber ein neues Device außerhalb der Standard Nomenklatur erstellt.
Zitat$ ls -l /dev/ttyU*
crw-rw---- 1 root dialout 188, 0  1. Jun 07:50 /dev/ttyUSB0                                   
lrwxrwxrwx 1 root root         7  1. Jun 07:50 /dev/ttyUSB_MeinGeraet -> ttyUSB0
Dieses neue Device kann dann mal auf ttyUSB0 oder nach einem Reboot und je nach angesteckten Geräten auch mal auf ttyUSB1 verweisen.

Da FHEM aber diese proprietäten Devicenamen nicht in den Automatismen (usb scan) verwenden kann suche ich nach einer Lösung, dass das Mapping auf die Standard Nomenklatur ttyUSBx bzw. ttyACMx funktioniert. Vielleicht habe ich das in den Anleitungen ja auch nur überlesen.

Was ich auch nicht gefunden habe, wie die feste Zuordnung automatisch angelegt werden kann. Gibt's dafür evtl. schon ne Lösung?

Unter Windows macht mir das das Betriebssystem, egal wann oder wo ich meinen Arduino Mega1 anschliesse er bekommt immer COM5: zugewiesen, mein Mega2 bekommt immer die COM6:.
Best regards und viele Gruesse,
CaptBlaubaer (CBR)
_________________________________
FHEM 5.5 Raspberry Pi (B), IOMEGA iConnect, Firmata Arduinos USB/LAN, Gembird USB/LAN, ToDo: FHEM auf FritzBox 7390, 7270

betateilchen

Zitat von: CaptBlaubaer am 08 November 2013, 08:20:11dass das Mapping auf die Standard Nomenklatur ttyUSBx bzw. ttyACMx funktioniert. Vielleicht habe ich das in den Anleitungen ja auch nur überlesen.

Die "persistente Namensvergabe in udev" (tipp: google) kannst Du Dir selber anlegen. Bei mir stehen die z.B. in der Datei

/etc/udev/rules.d/70-persistent-net.rules

dort weise ich z.B. der Netzwerkschnittstelle immer "eth0" zu.

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

Die Funktionsweise von udev hier zu erklären, würde vermutlich den Rahmen dieses Threads sprengen. Dafür gibt es hervorragende Dokus im Internet.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

ntruchsess

die Lösung mit dem automatischen Erstellen der Symlinks ist doch prima. Symlink heißt doch, es gibt den originalen Devicenamen ja trotzdem, so dass autocreate erst mal funktioniert und das FRM-device anlegt wird.
Das kann man dann per modify nach Belieben auf den Symlink umbiegen. Mir persöhnlich gefällt diese Lösung besser, als die /tty/USBxxx-namen fest auf die SerialNumber des FTDI-chips zu verdrahten (was natürlich prinzipiell auch ginge, allerdings müsste man dann sicher dafür sorgen, dass diese nummern nicht vergeben werden, wenn man ein anderes - bisher unbekanntes - usb-gerät mit FTDI-chip anschließt).
Abgesehen davon schließt der Symlink mechanismus nicht grundsätzlich aus, die Devices per autocreate zu finden - man könnte sie z.B. /dev/ttyUSB<SerialNumber> nennen und autocreate entsprechend anpassen (und erkennt, dass es symlinks auf ein bestehendes USB-device sind, welches dann zu ignorieren ist).

Ich fände es prima, wenn Du Deine Ergebnisse im FHEM-wiki dokumentieren würdest.
while (!asleep()) {sheep++};

Joachim

Moin CaptBlaubaer,

schon mal versucht, beim SYMLINK+ folgendes einzustellen:
SYMLINK+="ttyUSB20",
so wie ich UDEV verstanden habe, sollte das gehen.

Gruß Joachim
FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

CaptBlaubaer

Hallo liebe FHEM Freunde,

vielen Dank für die vielen Hinweise. Ich weise meinen Megas jetzt mit der Anleitung des folgenden Links und dem Hinweis von Joachim die symlinks zu.
Zitat von: Joachim am 08 November 2013, 07:17:08
http://wiki.siduction.de/index.php?title=Symlink_zur_eindeutigen_Erkennung_mittels_udev-Regel

schon mal versucht, beim SYMLINK+ folgendes einzustellen:
SYMLINK+="ttyUSB20",
Die rules Datei unter /etc/udev/rules.d sieht folgendermassen aus:
# Datei: /etc/udev/rules.d/20_MeinUSBGeraet.rules
# Gerät Arduino
SUBSYSTEM=="tty", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="0010", ATTRS{serial}=="741363339323517040D0", SYMLINK+="ttyACM20"
SUBSYSTEM=="tty", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="0010", ATTRS{serial}=="74132343530351017111", SYMLINK+="ttyACM21"

Egal in welcher Reihenfolge ich jetzt meine Megas einstecke die ttyACM20+21 zeigen jetzt immer auf das, mit der Seriennummer festgelegte, Gerät.
root@iconnect:~# ls -al /dev/serial/by-id
total 0
drwxr-xr-x 2 root root 80 Nov  9 02:43 .
drwxr-xr-x 4 root root 80 Nov  9 02:37 ..
lrwxrwxrwx 1 root root 13 Nov  9 02:43 usb-Arduino__www.arduino.cc__Arduino_Mega_2560_74132343530351017111-if00 -> ../../ttyACM0
lrwxrwxrwx 1 root root 13 Nov  9 02:37 usb-Arduino__www.arduino.cc__Arduino_Mega_2560_741363339323517040D0-if00 -> ../../ttyACM1
root@iconnect:~# ls -al /dev|grep ttyA
crw-rw----  1 root dialout 166,   0 Nov  9 02:43 ttyACM0
crw-rw----  1 root dialout 166,   1 Nov  9 02:37 ttyACM1
lrwxrwxrwx  1 root root           7 Nov  9 02:37 ttyACM20 -> ttyACM1
lrwxrwxrwx  1 root root           7 Nov  9 02:43 ttyACM21 -> ttyACM0

Je nachdem wie die Geräte eingesteckt wurden kann jetzt ttyACM20 mal auf ttyACM1 oder auch auf ttyACM0 verlinken.

Soweit, so gut. Für meine Spiele mit FHEM reicht mir das.
Als Windows Verwöhnter bin ich natürlich mit dieser Art der "Automatisierung" reproduzierbarer Devicenamen nicht wirklich glücklich.
Zumal ich das jetzt auf allen meinen FHEM Systemen umsetzen muss.
Wenn demnächst mein nächster Mega ankommt, dann darf ich das Ganze wieder anpacken.

Bitte versteht das nicht als Kritik. Ich stelle mir nur vor welche Anforderungen aktuell noch an einen FHEM System Integrator(TBD) bestehen um sich all diese UNIX, PERL, ... Kenntnisse anzueignen um ein zuverlässiges Home Automation System aufzusetzen. Das schränkt IMHO die Anzahl der Nutzer leider noch stark ein.

Aber wenn wir die Grenzen kennen, dann gelingt es uns auch irgendwann sie gemeinsam zu erweitern.

Nochmals vielen Dank für die ganzen Infos.

-CBR


Best regards und viele Gruesse,
CaptBlaubaer (CBR)
_________________________________
FHEM 5.5 Raspberry Pi (B), IOMEGA iConnect, Firmata Arduinos USB/LAN, Gembird USB/LAN, ToDo: FHEM auf FritzBox 7390, 7270

Joachim

Moin CaptBlaubaer,

das wird schon, frei nach dem Motto:
Was lange gährt,
wird endlich Wut.

Gruß Joachim
FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

ntruchsess

Zitat von: CaptBlaubaer am 09 November 2013, 05:54:54
SYMLINK+="ttyACM20"
grade probiert:
SYMLINK+="ttyACM$attr{serial}"
hängt die Seriennummer hinten an. So kann man auch mehr als 20 Arduinos anschließen und muss das nicht für jeden einzeln eintragen :-)

- Norbert
while (!asleep()) {sheep++};

CaptBlaubaer

Da fällt mir nur A.I.M.N.I.F. ein :D
Zitat von: ntruchsess am 09 November 2013, 11:18:59
SYMLINK+="ttyACM$attr{serial}

Norbert, das gefällt mir, aber jetzt werd' ich auch noch gierig.

Geht das auch auch mit den letzten 4 Zeichen der SNr?
Also z.B. nur ttyACM7111 statt ttyACM74132343530351017111
Best regards und viele Gruesse,
CaptBlaubaer (CBR)
_________________________________
FHEM 5.5 Raspberry Pi (B), IOMEGA iConnect, Firmata Arduinos USB/LAN, Gembird USB/LAN, ToDo: FHEM auf FritzBox 7390, 7270

ntruchsess

nun, Du kannst aus udev-rules auch externe scripte aufrufen und da sowas machen. In der Rule selber sind die Möglichkeiten relativ eingeschränkt. Such mal hier nach 'RUN' und 'substitution'

Ich seh das so: Namen sind Schall und Rauch... bei Devices sollten die eindeutig und reproduzierbar, aber nicht notwendigerweise schön sein.

- Norbert
while (!asleep()) {sheep++};