UDEV rule für Bluetooth Speaker

Hast Du Probleme mit Hardware, die durch die anderen Foren nicht abgedeckt werden? Schau auch in den "Tipps und Tricks"-Bereich.
Antworten
Benutzeravatar
NetFoxy
Beiträge: 107
Registriert: 12.11.2009 17:53:50

UDEV rule für Bluetooth Speaker

Beitrag von NetFoxy » 28.05.2016 12:23:55

Hallo zusammen,

ich möchte Folgendes gerne haben:

Wenn ich meinen Bose Soundlink Mini via Bluetooth verbinde, dann soll Pulsaudio den Lautsprecher als Standard übernehmen. Leider funktioniert das nicht out of the box. Der nötige Befehl dafür lautet

Code: Alles auswählen

pacmd set-default-sink bluez_sink.00_00_00_00_00_00
wobei die korrekte Adresse eingetragen werden muss. Die findet man mit

Code: Alles auswählen

/usr/bin/pacmd list-sinks
Trägt man das in .pulse/default.pa mit

Code: Alles auswählen

set-default-sink bluez_sink.00_00_00_00_00_00
ein, tut nichts mehr, denn der Lautsprecher ist ja nicht standarmäßig verbunden und somit kommen beide Systeme (Pulseaudio und Bluetooth) komplett durcheinander.

Überwacht man die udev events mit

Code: Alles auswählen

udevadm monitor --environment
bekommt man beim Verbinden des Lautsprechers folgende Einträge:

Code: Alles auswählen

KERNEL[2306.360207] add      /devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8.4/1-8.4:1.0/bluetooth/hci0/hci0:71 (bluetooth)
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8.4/1-8.4:1.0/bluetooth/hci0/hci0:71
DEVTYPE=link
SEQNUM=2249
SUBSYSTEM=bluetooth

UDEV  [2306.363546] add      /devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8.4/1-8.4:1.0/bluetooth/hci0/hci0:71 (bluetooth)
.MM_USBIFNUM=00
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8.4/1-8.4:1.0/bluetooth/hci0/hci0:71
DEVTYPE=link
SEQNUM=2249
SUBSYSTEM=bluetooth
SYSTEMD_ALIAS=/sys/subsystem/bluetooth/devices/hci0:71
SYSTEMD_WANTS=bluetooth.target
TAGS=:systemd:
USEC_INITIALIZED=2306361886

KERNEL[2308.740762] add      /devices/virtual/input/input26 (input)
ACTION=add
DEVPATH=/devices/virtual/input/input26
EV=100007
KEY=...
MODALIAS=...
NAME="00:00:00:00:00:00"
PRODUCT=5/0/0/0
PROP=0
REL=0
SEQNUM=2250
SUBSYSTEM=input

KERNEL[2308.740893] add      /devices/virtual/input/input26/event15 (input)
ACTION=add
DEVNAME=/dev/input/event15
DEVPATH=/devices/virtual/input/input26/event15
MAJOR=13
MINOR=79
SEQNUM=2251
SUBSYSTEM=input

UDEV  [2308.742969] add      /devices/virtual/input/input26 (input)
ACTION=add
DEVPATH=/devices/virtual/input/input26
EV=100007
ID_INPUT=1
ID_INPUT_KEY=1
KEY=...
MODALIAS=...
NAME="00:00:00:00:00:00"
PRODUCT=5/0/0/0
PROP=0
REL=0
SEQNUM=2250
SUBSYSTEM=input
TAGS=:seat:
USEC_INITIALIZED=2308742468

UDEV  [2308.788651] add      /devices/virtual/input/input26/event15 (input)
ACTION=add
BACKSPACE=guess
DEVNAME=/dev/input/event15
DEVPATH=/devices/virtual/input/input26/event15
ID_INPUT=1
ID_INPUT_KEY=1
MAJOR=13
MINOR=79
SEQNUM=2251
SUBSYSTEM=input
USEC_INITIALIZED=2308788513
XKBLAYOUT=us
XKBMODEL=pc105
XKBOPTIONS=
XKBVARIANT=
Nun habe ich gedacht, der letzte Eintrag mit der Adresse (NAME="00:00:00:00:00:00") könnte der richtige sein und habe folgende udev Regel geschrieben:

Code: Alles auswählen

SUBSYSTEM=="input", ACTION=="add", NAME=="00:00:00:00:00:00", RUN+="/usr/bin/pacmd set-default-sink bluez_sink.00_00_00_00_00_00"

Code: Alles auswählen

udevadm test /devices/virtual/input/input26
ergibt keinen Fehler in der Regel. Aber ausgeführt wird sie nicht, was der Test wohl auch sagt.

Die alternative Benutzung von DEVNAME hat auch nichts gebracht, weil dass wohl kein gültiges Key-Word für udev rules ist. Ansonsten wäre der aber mit "/dev/input/event15" eindeutig. Bei mir ist der für den Lautsprecher immer 15.

Hat einer eine Idee, was man da machen kann?

Viele Grüße
Andreas

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: UDEV rule für Bluetooth Speaker

Beitrag von smutbert » 28.05.2016 15:34:39

Ein Problem - wobei es natürlich sein könnte, dass du noch gar nicht bis zu diesem Problem gekommen bist :wink: - ist, dass Pulseaudio unter dem angemeldeten Benutzer gestartet wird und läuft und andere Benutzer nur eingeschränkten oder gar keinen Zugriff auf diesen Pulseaudio-Daemon haben.

udev führt diese Regeln aber als root aus. Nun könnte man
  • ein Skript basteln, das pactl oder pacmd als richtiger normaler Benutzer ausführt (ist eine lästige Aufgabe)
  • Pulseaudio als systemweiten Daemon starten, damit auch andere Benutzer (inklusive root) Zugriff darauf haben (die Pulseaudioentwickler raten aber ua aus Sicherheitsgründen davon ab)
  • versuchen das Ganze direkt in pulseaudio zu erledigen. Du könntest zB ausprobieren ob bereits ein vor dem Verbinden als normaler Benutzer ausgeführtes

    Code: Alles auswählen

    $ pactl load-module module-switch-on-connect
    
    zum gewünschten Verhalten führt. (Wenn ja lässt sich das leicht in pulseaudio dauerhaft verankern)

Benutzeravatar
NetFoxy
Beiträge: 107
Registriert: 12.11.2009 17:53:50

Re: UDEV rule für Bluetooth Speaker

Beitrag von NetFoxy » 29.05.2016 14:07:01

Hallo smutbert,

danke für Deine Antwort! Klingt prinzipiell nach einem Problem, dass tatsächlich auch noch auftreten könnte.

Allerdings habe ich das Gefühl, dass ich bis dahin wirklich noch gar nicht gekommen bin. Ich sehe ja die Ausgabe beim Monitorieren von udev. Unabhängig von dem, was die udev-Regel dann machen soll, müsste ich sie doch erstmal dazu bekommen, ausgeführt zu werden. Dies scheint aber nicht der Fall zu sein:
  1. Beim Testen der Regeln für das udev-Ereignis (udevadm test /devices/virtual/input/input26) taucht meine eigene Regel in der Liste mit ausgeführten Regeln nicht auf.
  2. Auch wenn ich keine Pulseaudio-Anweisung in die Regel schreibe, sondern einfach nur ein touch oder Ähnliches, passiert nichts beim Verbinden des Lautsprechers.
Viele Grüße
Andreas

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: UDEV rule für Bluetooth Speaker

Beitrag von smutbert » 29.05.2016 15:49:44

Du könntest den Befehl in ein Skript packen, dann kannst du auch nach Belieben feststellen ob und wann die udev-Regel ausgeführt wird, zB

Code: Alles auswählen

#!/bin/bash

/bin/date >> /tmp/bluetooth-udev.log 
/usr/bin/pactl set-default-sink bluez_sink.00_00_00_00_00_00

Dem 00_00_00_00_00 traue ich nicht über den Weg - es muss doch eine „richtige“ MAC-Adresse geben (?) und die hätte ich für die Regel herangezogen, ungefähr in der Art

Code: Alles auswählen

SUBSYSTEM=="bluetooth", ATTR{address}=="00:11:22:33:44:55", ACTION=="add", RUN+="/usr/local/bin/udev-bluetooth.sh"
weiß aber weder wieso deine Regel nicht funktioniert noch mit Sicherheit ob meine Variante es tut.

Benutzeravatar
NetFoxy
Beiträge: 107
Registriert: 12.11.2009 17:53:50

Re: UDEV rule für Bluetooth Speaker

Beitrag von NetFoxy » 29.05.2016 16:53:43

Ach so, das habe ich vergessen zu erwähnen: Ich habe die Nullen bei der MAC-Adresse als Platzhalter eingesetzt. Die stehen bei mir natürlich so nicht, sondern etwas sinnvolles.

Wie bekomme ich denn die möglichen ATTR-Parameter bei einem Bluetoothgerät? Bei USB ist mir das klar, aber lsbluetooth gibt's ja leider nicht.

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: UDEV rule für Bluetooth Speaker

Beitrag von smutbert » 29.05.2016 18:40:38

Code: Alles auswählen

# udevadm info -a /dev/xyz
oder (falls es keine Gerätedatei gibt)

Code: Alles auswählen

# udevadm info -a -p /sys/class/bluetooth/hci0
(letzteres wäre ein Beispiel, das die Eigenschaften vom Bluetoothcontroller ausgibt, beim Herausfinden des richtigen sysfs-Pfades für ein bestimmtes Gerät stelle ich mich recht patschert an, aber mit den Infos von »udevadm monitor« sollte es kein großes Problem sein.)

Benutzeravatar
NetFoxy
Beiträge: 107
Registriert: 12.11.2009 17:53:50

Re: UDEV rule für Bluetooth Speaker

Beitrag von NetFoxy » 29.05.2016 18:58:48

smutbert hat geschrieben:

Code: Alles auswählen

# udevadm info -a /dev/xyz
Ja, das war's, was mir fehlte. Wo's nun da steht, sieht es eigentlich recht naheliegend aus... :wink: Vielen Dank! Jetzt sagt

Code: Alles auswählen

udevadm test /devices/virtual/input/input22
zumindest, dass meine Regel benutzt wird. Es tut zwar immer noch nicht, also

Code: Alles auswählen

touch /root/Text.txt
im RUN-Teil der Regel erzeugt keine Datei. Aber hier kann ich erstmal selber weiter basteln.

Die Regel sieht jetzt so aus:

Code: Alles auswählen

SUBSYSTEM=="input", ACTION=="add", ATTRS{name}=="00:00:00:00:00:00", RUN+="touch /root/Test.txt"

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: UDEV rule für Bluetooth Speaker

Beitrag von smutbert » 29.05.2016 22:02:20

eventuell ist PATH in der Umgebung, in der udev die Regeln ausführt nicht (vollständig) gesetzt und es daher notwendig den Pfad mit anzugeben?

Code: Alles auswählen

/usr/bin/touch

Benutzeravatar
NetFoxy
Beiträge: 107
Registriert: 12.11.2009 17:53:50

Re: UDEV rule für Bluetooth Speaker

Beitrag von NetFoxy » 29.05.2016 23:59:50

smutbert hat geschrieben:eventuell ist PATH in der Umgebung, in der udev die Regeln ausführt nicht (vollständig) gesetzt und es daher notwendig den Pfad mit anzugeben?

Code: Alles auswählen

/usr/bin/touch
Jepp. Genau so einfach war's. Danke!

Antworten