openv / openv

:fire: OpenV Wiki
https://github.com/openv/openv/wiki
254 stars 29 forks source link

vcontrold: cannot open /dev/bus/usb/001/004:Permission denied #519

Closed bubumania closed 3 years ago

bubumania commented 3 years ago

Guten Morgen,

ich habe den source code hier herunter geladen entpackt und installiert. System ist ein Raspberry Pi3 mit frisch installierten Debian. Das Optolink-Kabel (frisch bestellt bei wolf-online-shop.de) wird erkannt, Ausgabe von lsusb:

Bus 001 Device 004: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Device ist auch vorhanden: /dev/bus/usb/001/004

und eingetragen in der /etc/vcontrold/vcontrold.xml:

      <serial>
        <tty>/dev/bus/usb/001/004</tty>
      </serial>

ich starte mit "vcontrold -n &"

[1115] Fri Oct  8 10:15:10 2021 : started vcontrold version unknown
[1115] Fri Oct  8 10:15:11 2021 : TCP socket 3002 opened

versuche ein erstes vclient mit "vclient -c getTempA"

[1115] Fri Oct  8 10:15:22 2021 : Client connected 127.0.0.1:58710 (FD:5)
[1115] Fri Oct  8 10:15:22 2021 : cannot open /dev/bus/usb/001/004:Permission denied
[1116] Fri Oct  8 10:15:22 2021 : exit with count=0
[1116] Fri Oct  8 10:15:22 2021 : Error communicating with the server
[1]+  Exit 1                  vcontrold -n

Ausgabe von /var/log/vcontrold.log:

[1115] Fri Oct  8 10:15:11 2021 : TCP socket 3002 opened
[1115] Fri Oct  8 10:15:22 2021 : Client connected 127.0.0.1:58710 (FD:5)
[1115] Fri Oct  8 10:15:22 2021 : cannot open /dev/bus/usb/001/004:Permission denied

Was mache ich falsch? Hab schon "überall" gesucht und nix gefunden. Ich dachte, die Probleme fangen erst später an, aber doch nicht schon beim Zugriff auf den USB Port! Ob mit oder ohne sudo hat auch nichts geholfen. Hat jemand eine Idee?

Gruß und Dank

Burkhard

speters commented 3 years ago

vcontrold bzw. der Benutzer, mit dessen Rechten dieser läuft, muss Zugriffsrechte zum Lesen und Schreiben des seriellen Ports des Optolink Adapters haben.

Unter Linux kann man das durch Anlegen einer entsprechenden udev Regel hinbekommen. In einer z.B. /etc/udev/rules.d/85-optolink genannten Konfigurationsdatei legt man fest, dass das USB-Gerät mit der o.g. Kennung von der Gruppe plugdev (ggf. anpassen) les- und schreibbar sein soll:

ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE="0660", GROUP="plugdev"

Nun die Regel noch mit sudo udevadm control --reload-rules && sudo udevadm trigger aktivieren und Optolink erneut einstöpseln.

bubumania commented 3 years ago

Vielen Dank, das ging ja schnell.

hmm, funktioiert aber leider trotzdem nicht. muss ich in die 85-optolink noch etwas anderes schreiben, außer der einen Zeile?

Ich habe es jetzt ein paar Mal probiert. Habe auch an ein erneutes lsusb gedacht und die vcontrold.xml angepasst, Mal mit mal ohne sudo. Immer die gleiche Fehlermeldung wie vorher. Auch nach einem reboot. Zwischendurch hatte ich einmal eine andere Fehlermeldung: [1009] Fri Oct 8 19:03:59 2021 : error tcgetattr /dev/bus/usb/001/006:Inappropriate ioctl for device

danach wieder die "gewohnte" Fehlermeldung mit dem "Permission denied"

der device ist jetzt in der gruppe plugdev, das hat funktioniert:

ls -l /dev/bus/usb/001/
crw-rw---- 1 root plugdev 189, 3 Okt  8 19:19 004

und der User pi ist auch in der Gruppe plugdev

groups
pi adm dialout cdrom sudo audio video plugdev games users input netdev gpio i2c spi

daran kann es dann leider nicht liegen

zwischenzeitlich habe ich noch ein NAME="vitoir0" in der udev-rule 85-optolink hinzugefügt, ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE="0660", GROUP="plugdev", NAME="vitoir0"

der Optolink wird aber nicht als /dev/vitoir0 angezeigt, sondern immer noch als /dev/bus/usb/001/00x

ich dachte immer, die udev brauche ich nur, wenn ich immer mit dem gleichen /dev/xxx auf das Gerät zugreifen möchte. Daher hatte ich mir das noch nicht angesehen. Aber root müsste doch immer rechte haben. warum geht es dann mit sudo nicht? Mit der udev regel klappt es ja leider auch als pi nicht. morgen habe ich keine Zeit, vermutlich installiere ich am Sonntag nochmal neu und dann mal sehen...

speters commented 3 years ago

Verwende statt NAME mal SYMLINK+. Das Device sollte ohne beides als /dev/ttyUSB0 (bzw. 1...) erscheinen, mit dem SYMLINK als /dev/vitoir0. In der /etc/vcontrold/vcontrold.xml Konfiguration verwendest Du dann den jeweiligen Devicenamen (nicht /dev/bus/usb/001/004, entschuldige bitte, dass ich das vorher überlesen hatte).

bubumania commented 3 years ago

Mit dem NAME="vitoir0" hatte ich einfach falsch kopiert. Mit dem SYMLINK+="vitoir0" hat es funktioniert und ich finde den optolik immer unter /dev/vitoir0 Danke!

aber der Fehler bleibt. Ich konnte inzwischen feststellen, dass ich die Programme einmal unter /usr/bin + /usr/sbin und einmal unter /usr/loval/bin + /usr/local/sbin installiert hatte. Nachdem ich alle Versionen unter /usr/local/... gelöscht habe, erhalte ich nicht mehr die Fehlermeldung "Permission Denied" sondern immer wieder diese wunderschöne Fehlermeldung

[3240] Sun Oct 10 19:48:17 2021 : Client connected 127.0.0.1:41426 (FD:5)
[3240] Sun Oct 10 19:48:17 2021 : error tcgetattr /dev/vitoir0:Inappropriate ioctl for device
[3241] Sun Oct 10 19:48:17 2021 : exit with count=0
[3241] Sun Oct 10 19:48:17 2021 : Error communicating with the server
[1]+  Exit 1                  vcontrold -n

Ich habe dann heute nochmal das System komplett neu aufgesetzt (debian image auf sd-karte, update+upgrade+...) . einmal kompiliert und installiert. Hat leider auch nichts gebracht. Die Fehlermeldung bleibt.

Muss ich vielleicht noch irgendwelche Programmpakete installieren, vielleicht libxxxx-dev? Irgendetwas, was beim kompilieren keine Fehlermeldung ausgibt, aber was doch zu Problemen führt? Von welchen Paketen wäre die installierte Version interessant?

speters commented 3 years ago

Kanst du mal mit einem anderen Programm testen, ob du die serielle Schnittstelle des Optolink ansprechen kannst? Einfach mal um den vcontrold als mögliche Ursache auszuschliessen. Also z.B. screen /dev/vitoir0 4800, dann ggf. noch IR-Diode und IR-Transitor des Optolink optisch kurzschliessen (Reflektion) und ein paar Zeichen senden.

bubumania commented 3 years ago

Was soll passieren? es gibt leider nur die Aussage und dann bin ich wieder beim prompt

pi@lms00:~ $ screen /dev/vitoir0 4800
[screen is terminating]
pi@lms00:~ $ 
speters commented 3 years ago

screen kann offenbar auch nicht den seriellen Port öffnen.

Bevor du bei vcontrold weitermachst, musst du erstmal den Optolink-Adapter korrekt einbinden. Was da genau im Argen ist, kann ich dir leider nicht sagen. Zu erwarten wäre, dass der Adapter nach dem Einstecken eine serielle Schnittstelle unter /dev/ttyUSBx (bei anderen Adaptern /dev/ttyACMx) zur Verfügung stellt und diese nach den obigen udev-Einstellungen zusätzlich nach /dev/vitoir0 symbolisch verlinkt. Die Zugriffsrechte sollten in der o.g. Weise dann ebenfalls eingestellt sein.

Scheinbar wird der Optolink aber nicht als serielle Schnittstelle erkannt. Du kannst in den Log-Ausgaben von dmesg und journalctl mal nachsehen, was beim Ein-/Ausstöpseln des Gerätes passiert, ausserdem mal gucken, ob das Kernelmodul zum ch34x auch korrekt geladen wird (lsmod).

Unter https://learn.sparkfun.com/tutorials/how-to-install-ch340-drivers/linux steht was im Zusammenhang von CH34x Treibern und Raspbian, ist vielleicht ein Start. Ist der Optolink mit dem ch34x ein Original von Viessman? Dieser Typ von Schnittstellenbaustein ist typisch für die allerbilligsten Boards aus China (Arduino-Clones, ESP, ...) und ist eigentlich unter Linux recht unproblematisch.

Vielleicht meldet sich ja noch jemand anderes mit einer Idee, die weiterhilft...

philverh commented 3 years ago

In my ".rules" statement, I have an additional parameter : SUBSYSTEM=="tty", to indicate I wish to use it as a serial device instead of a "/bus/usb" or raw device. Could this be the differentiator ? Some of the messages you get above seem to indicate there are protocol issues to talk to the IR device. When I issue "ls -l /dev/vitoir" on my system, I get an answer back that the device is attached to ttyUSB0. When issuing "udevadm info --name=/dev/vitoir --attribute-walk" in one of the first output lines it tells me about the tty subsystem, itself linked to "usb-serial", which is linked to "usb" and so on.

Try adding the SUBSYSTEM=="tty" parameter in your rules file, and re-process it. Let us know if it makes a difference.

bubumania commented 3 years ago

Thank you very much - both of you!

Now it works and I can go on, playing with mqtt to get all data into home assistant :-)

From begin to end i did:

  1. lsusbto get the device idVendor and idProduct
  2. adding udev-rule with sudo nano /etc/udev/rules/85-optolink.rules SUBSYSTEM=="TTY", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE="0660", GROUP="plugdev"
  3. sudo udevadm control --reload-rules && sudo udevadm trigger
  4. changing the part in the vcontrold.xml to /dev/ttyUSB0

starting vcontrold, testing vclient:

vclient -c getTempA
[885] Tue Oct 12 14:45:39 2021 : Client connected 127.0.0.1:55136 (FD:5)
getTempA:
11.300000 Grad Celsius

And everything works fine. Problem is solved!