Alexa Einbindung in Musicserver4Lox

Einleitung

Da wir uns im Rahmen der Smart-Home Planung unter Anderem für Loxone entschieden haben und Multi-Room Audio ebenfalls ein Thema im neuen Eigenheim werden soll, habe ich mir das Projekt musicserver4lox von hismastersvoice angeschaut. An dieser Stelle einmal vielen vielen Dank für deine Arbeit an diesem Projekt!

Die folgende Anleitung bezieht sich auf die Integration von Amazon Echo (Alexa) Lautsprechern in den musicserver4lox. Eine vollständige Installation von Ubuntu Server 16.04 LTS und ein vollständig  konfigurierter musicserver4lox wird dabei vorausgesetzt. Eine Installationsanleitung kann der Projekthomepage entnommen werden.

Ziel dieser Anleitung soll die Einbindung der Echo Geräte  in die Multi-Room Musikanlage sein. Sobald “Alexa” Musik abspielt, soll diese über die Lautsprecher der Anlage ertönen. Normale Sprachdialoge sollen allerdings über den Echo Lautsprecher direkt erfolgen. Der Anschluss via Audio-(Klinke) Kabel fällt also schon mal weg. Sobald ein Kabel mit dem Echo Lautsprecher verbunden wird, spielt dieser sämtliche Audio-Ausgaben über diesen Ausgang. Der interne Lautsprecher wird deaktiviert. Dies gilt ebenfalls für eine dauerhafte Bluetooth Verbindung. Ich musste also einen Weg finden um den Lautsprecher nur im Falle von Musik zu einer Bluetooth Verbindung zu bewegen und nach der Musikwiedergabe die Bluetooth Verbindung entsprechend trennen. Nebenbei möchte ich erwähnen, dass die Soundqualität mangels AptX auf Seiten der Echo Lautsprecher nicht perfekt ist. Es ist also sicher nichts für die Audiophilen unter euch. Der musicserver4lox lässt sich natürlich auch weiterhin noch via Tablet Bedienen. Die Audioausgabe über Alexa ist lediglich für spontane Musikwünsche gedacht. 

Der Plan ist also jeweils einen Bluetooth Empfänger mittels CAT6 Verlängerung in die Nähe der einzubindenden Alexa zu bringen. In meinem Falle werden es wohl insgesamt 6 oder 7 Echo Lautsprecher im ganzen Haus werden. 

Beispielverbindung musicserver4lox <-> USB CAT Verlängerung <-> Bluetooth Dongle

Folgende Komponenten werden benötigt:

  • Bluetooth USB Dongle
  • USB CAT Verlängerung (optional)
  • Bluez-Alsa
  • Node-Red (Mangels Python Kenntnissen 😳 )

Der grobe Verbindungsaufbau läuft folgendermaßen ab:

  1.  Via Lötzimmer-Skript (Bash Skript zur Abfrage von Echo Geräten) wird der aktuelle Status des jeweiligen Echo Lautsprechers abgefragt
  2. Mit Hilfe von Node-Red wird die Ausgabe des Skripts in JSON geparst und gemäß Inhalt ausgewertet. Sofern das Ergebnis Musik ist, wird ebenfalls via Skript eine  Bluetoothverbindung am jeweiligen Echo Lautsprecher angestoßen
  3. Mittels UDEV Regel wird am Musicserver die Verbindung des Echo Lautsprechers erkannt und ein Bluez-Alsa Player gestartet
  4. Die Musik ertönt nun aus den Lautsprechern
  5. Nach Beendigung der Musikwiedergabe, wird die Bluetoothverbindung getrennt und der Player beendet

Es gibt zwei Möglichkeiten für die Audioausgabe der Echo Lautsprecher:

Variante 1 lädt den Audiostream des Bluetoothmoduls via WaveInput Plugin direkt in den Player der LMS Zone.

Vorteil: Lautstärke lässt sich über Loxone Taster regeln, Signal ist über mehrere Zonen synchronisierbar

Nachteil: Deutliche Verzögerung

Variante 2 legt das Audiosignal mittels eigenem Player parallel zur Ausgabe des Squeezelite Players.

Vorteil: Kaum Verzögerung

Nachteil: Lasutstärke lässt sicvh nur über den Echo Lautsprecher Regeln. Signal ist nicht ohne Weiteres über mehrere Zonen zu verteilen.

Installation von Bluez-Alsa

# Da bluez-alsa nicht Bestandteil des Ubuntu Repository ist, muss zunächst das GIT Repository von Bluez-Alsa auf den musicserver4lox kopiert werden

git clone https://github.com/Arkq/bluez-alsa.git

Klone nach 'bluez-alsa' ...
remote: Enumerating objects: 2665, done.
remote: Total 2665 (delta 0), reused 0 (delta 0), pack-reused 2665
Empfange Objekte: 100% (2665/2665), 1.13 MiB | 624.00 KiB/s, Fertig.
Löse Unterschiede auf: 100% (2063/2063), Fertig.
Prüfe Konnektivität ... Fertig.

# In das bluez-alsa Verzeichnis wechseln

cd bluez-alsa

# Vor dem Kompilieren müssen zunächst folgende Pakete installiert werden:

sudo apt-get install -y bluez
sudo apt-get install -y libbluetooth-dev
sudo apt-get install libglib2.0-dev -y
sudo apt-get install -y libasound2-dev
sudo apt install -y build-essential autoconf
sudo apt-get install -y libbluetooth-dev
sudo apt-get install libtool -y
sudo apt install libsbc-dev -y
sudo apt-get install libdbus-1-dev
sudo autoreconf --install

# Mit dem folgenden Befehl wird das Kompilieren vorbereitet:

sudo ../configure --enable-ofono --enable-debug

# Kompilieren und Installation starten:

sudo make && sudo make install

# Zur Vervollständigung der Installation, sicherheitshalber ein Reboot

sudo reboot

Verbindung mit einem Bluetooth Gerät (Echo Lautsprecher)

# Bluetooth Control Center starten

sudo bluetoothctl

inge_koschmidder@sv-koschmidder-lms01:~/bluez-alsa/build$ sudo bluetoothctl
[NEW] Controller 00:1A:XX:XX:71:13 sv-koschmidder-lms01 #2 [default]
[NEW] Controller 5C:5F:XX:XX:DA:3B sv-koschmidder-lms01
[bluetooth]#

# sv-koschmidder-lms01 ist hierbei der Hostname des musicservers
# Hier werden direkt beide angeschlossenen Bluetooth Sticks angezeigt. Mit dem Befehl Select "MAC ADRESSE" kann ein anderer Stick ausgewählt werden:

select 5C:5F:XX:XX:DA:3B

# Um nun eine Verbindung mit einem Bluetooth Gerät herstellen zu können, muss der musicserver zunächst sichtbar gemacht werden:

discoverable on
pairable on

# Nach diesen Befehlen sollte der musicserver von eurem Bluetooth Gerät gefunden werden. Nach einer erfolgreichen Verbindung, muss dem Bluetooth Gerät vertraut werden:

trust "MAC ADRESSE DES ENDGERÄTES (Echo Lautsprecher)

# Die Bluetoothverwaltung verlassen

exit

# Nun kann für einen ersten Test bluealsa als a2dp Senke gestartet werden:

sudo bluealsa -p a2dp-sink

# In einer weiteren SSH Session kann nun mittels bluealsa Player die Audiowiedergabe gestartet werden:

sudo bluealsa-aplay -d zone_01 -i hci1 A4:50:XX:XX:XX:00

sudo bluealsa-aplay -d zone_01 -i hci1 A4:50:XX:XX:XX:00
[sudo] Passwort für inge_koschmidder:
bluealsa-aplay: ../../utils/../src/shared/ctl-client.c:108: Connecting to socket: /var/run/bluealsa/hci1
bluealsa-aplay: ../../utils/../src/shared/ctl-client.c:108: Connecting to socket: /var/run/bluealsa/hci1
bluealsa-aplay: ../../utils/../src/shared/ctl-client.c:135: Subscribing for events: 111
bluealsa-aplay: ../../utils/aplay.c:522: Creating PCM worker A4:50:XX:XX:XX:00
bluealsa-aplay: ../../utils/aplay.c:711: Starting main loop
bluealsa-aplay: ../../utils/../src/shared/ctl-client.c:108: Connecting to socket: /var/run/bluealsa/hci1
bluealsa-aplay: ../../utils/../src/shared/ctl-client.c:397: Requesting PCM open for A4:50:XX:XX:XX:00
bluealsa-aplay: ../../utils/aplay.c:355: Starting PCM loop


# zone_01 ist hierbei der automatisch vergebene Zonenname. Dieser kann im musicserver Webinterface unter interne Player ausgelesen werden. hci1 steht für das benutzte Bluetooth Device. Der zweite Stick wurde als hci2 erkannt. Das interne Bluetoothmodul des Mini PC als hci0. Die MAC Adresse ist die Adresse des verbundenen Geräts (Echo Lautsprecher).

Blue-Alsa Senke Autostart / Player Start bei Bluetooth Verbindung

# Um die Blue-Alsa Senke bereits bei Systemstart im Hintergrund zu starten, muss die Datei /etc/rc.local mittels Texteditor um folgenden Eintrag erweitert werden (vor exit einfügen):

bluealsa -p a2dp-sink &

# Um einen automatischen Player-Start bei einer erfolgreichen Bluetoothverbindung zu erreichen, muss folgende UDEV Regel hinzugefügt werden:

# In das Verzeichnis wechseln
cd /etc/udev/rules.d
# Datei erstellen
sudo nano 99-bluetooth-udev.rules

SUBSYSTEM=="input", ACTION=="add", ATTRS{name}=="A4:50:XX:XX:XX:00", RUN+="/home/inge_koschmidder/play_1.sh"

# Dieser Eintrag führt dazu, dass sobald ein Bluetooth Gerät mit der MAC Adresse A4:50:XX:XX:XX:00 via Bluetooth verbunden wird, das Skript "play_1.sh" ausgeführt wird.

Der Inhalt der Datei “play_1.sh”:

#!/bin/bash

# Variante 2 / Sound wird parallel abgespielt
sudo bluealsa-aplay -d zone_01 -i hci2 F0:XX:XX:3A:A1:45

# Veriante 1 / Sound wird über SqueezeLite Player abgespielt (benötigt das LMS Plugin Waveinput)
#sleep 3s
#curl -X GET "http://localhost:9000/status.html?player=01:XX:XX:43:da:37&p0=playlist&p1=play&p2=wavin:bluealsa:HCI=hci1,DEV=F0:XX:XX:3A:A1:45,PROFILE=a2dp"
#curl -X GET "http://localhost:9000/status.html?player=01:XX:XX:43:da:37&p0=button&p1=play"

Nach Erstellung der Datei play_1.sh die Datei mittels sudo chmod +x play_1.sh ausführbar machen.

Für weitere Zonen können natürlich analog zu diesem Beispiel weitere Skripte hinzugefügt werden.

Steuerung der Bluetoothverbindung mit Node-Red

Mangels ausreichender Erfahrung mit Python und auf Grund der Tatsache dass ich ohnehin auf dem loxberry mit Node-Red arbeite,  habe ich die Logik der Bluetooth Steuerung mit Node-Red umgesetzt. Ein pfiffiger Python Programmierer hat da sicher in ca. 10 Minuten ein Python Skript nachgebaut.

Prinzipiell wird via Lötzimmer-Skript zyklisch der aktuelle Status des Echo Lautsprechers abgefragt, das Ergebnis in JSON geparst und auf den Pfad playerInfo.state geprüft. Ist der Inhalt des Feldes “PLAYING” so wird via Skript das Echo Gerät zu einer Bluetooth Verbindung aufgefordert. Für den Fall “PAUSED” wird die Bluetooth Verbindung getrennt.

# Befehl zur Statusabfrage (Schlafzimmer ist der Name des Echo Lautsprechers)

sh alexa_remote_control.sh -d Schlafzimmer

# Befehl zur Herstellung der Bluetooth Verbindung ( MAC  Adresse des zu verbindenden Bluetooth Stick

sh alexa_remote_control.sh -d Schlafzimmer -b "5C:XX:XX:43:DA:3B"

Node-Red Code

[{"id":"7e26d396.84dafc","type":"exec","z":"90089149.80a9c","command":"sh /opt/loxberry/alexa_remote_control.sh","addpay":true,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"","x":220,"y":120,"wires":[["3e089b31.fa27d4"],[],[]]},{"id":"692c5800.ad4198","type":"inject","z":"90089149.80a9c","name":"","topic":"","payload":" -d Schlafzimmer -q","payloadType":"str","repeat":"5","crontab":"","once":true,"onceDelay":0.1,"x":160,"y":60,"wires":[["7e26d396.84dafc"]]},{"id":"3e089b31.fa27d4","type":"function","z":"90089149.80a9c","name":"Konvertiere JSON Alexa Queue","func":"var i = msg.payload.indexOf('\\n');\nvar splits = [msg.payload.slice(0,i), msg.payload.slice(i+1)];\nsplits[1] = splits[1].replace(/(\\r\\n|\\n|\\r)/gm,\"\");\n\n//PlayerInfo\nvar y = splits[1].indexOf(\"}{\");\nvar playerinfo = splits[1].slice(0,y+1);\n\n//Domain\nvar x = splits[1].indexOf(\"}{\",y+1);\nvar domain = splits[1].slice(y+1,x+1);\n\n//QueueInfo\nvar queue = splits[1].slice(x+1);\n\nreturn [JSON.parse(playerinfo),JSON.parse(domain),JSON.parse(queue)];","outputs":3,"noerr":0,"x":550,"y":120,"wires":[["e61a23d7.2e3ca"],[],[]],"outputLabels":["PlayerInfo","ClientID","QueueInfo"],"icon":"font-awesome/fa-headphones"},{"id":"e61a23d7.2e3ca","type":"switch","z":"90089149.80a9c","name":"","property":"playerInfo.state","propertyType":"msg","rules":[{"t":"eq","v":"PLAYING","vt":"str"},{"t":"eq","v":"PAUSED","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":3,"x":750,"y":120,"wires":[["e4b79040.4720b"],["d399f8b7.191148"],["d399f8b7.191148"]]},{"id":"8079877f.0c8e08","type":"exec","z":"90089149.80a9c","command":"sh /opt/loxberry/alexa_remote_control.sh","addpay":true,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"","x":1440,"y":120,"wires":[[],[],[]]},{"id":"e4b79040.4720b","type":"template","z":"90089149.80a9c","name":"Connect to LMS","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"-d Schlafzimmer -b \"5C:XX:XX:43:DA:3B\"","output":"str","x":920,"y":100,"wires":[["747632ed.fb775c"]]},{"id":"d399f8b7.191148","type":"template","z":"90089149.80a9c","name":"Disconnect from LMS","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"-d Schlafzimmer -b","output":"str","x":940,"y":140,"wires":[["747632ed.fb775c"]]},{"id":"747632ed.fb775c","type":"rbe","z":"90089149.80a9c","name":"","func":"rbe","gap":"","start":"","inout":"out","property":"payload","x":1170,"y":120,"wires":[["8079877f.0c8e08"]]}]

Sofern alles geklappt hat, sollte nun wenige Sekunden nach dem Abspielen von Musik auf dem Echo Lautsprecher automatisch eine Bluetoothverbindung hergestellt werden. Ebenso sollte automatisch der Player starten und der Ton aus den Lautsprechern der programmierten Zone kommen. Nach dem Stoppen der Musik wird die Verbindung nach kurzer Zeit getrennt.

5 Gedanken zu “Alexa Einbindung in Musicserver4Lox

  1. Hallo,

    zunächst danke für die Veröffentlichung der Anleitung. Habe versucht einen EchoDot mit dem fix verbauten Bluetooth Controller meines Intel Nuc zu verbinden. Leider meldet meine Alexa App dass keine Verbindung hergestellt werden kann. Ein Tipp woran es liegen könnte?

    1. Hallo Christian, oft sind bei den Onboard Controllern bzw. deren Treibern die Profile für Audio Senken nicht dabei. Hast du die Anleitung durchgearbeitet? Den Stick auf discoverable gestellt? Oder versuchst du es unter Windows?

  2. Welche Version von Bluealsa verwendest du? Ich verwende 1.4.0 und erhalte folgende Meldung:
    music@ubuntu:~$ sudo bluealsa-aplay -d zone_01 -i hci1 00:21:5C:E1:F3:92
    [sudo] password for music:
    bluealsa-aplay: invalid option — ‘i’
    Try ‘bluealsa-aplay –help’ for more information.

    Bluealsa-aplay unterstützt die Option -d während Bluealsa -i unterstützt laut Hilfe

    Könnte es sich um einen Fehler in der Anleitung handeln?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.