Logitech Media Server / Squeezebox Player steuern
Information:
LoxBerry-Benutzer sollten für die Einrichtung das Squeezelite Player Plugin einsetzen. Dieses erstellt automatisch Eingangs- und Ausgangs-Templates für deine bestehende LMS-Umgebung. Das Plugin bietet auch die Rückmeldung von Stati der Zonen.
Einsatzbeispiele der virtuellen Ausgangs-Befehle
Abspielen eines bestimmten MP3s
Abspielen eines bestimmten Ordners
Abspielen eines Türgongs (temporäres Aussetzen einer Playlist)
Rückmeldungen des LMS an Loxone
LMS: Aktivieren des xAP Plugins
Loxone: Virtueller UDP Eingang
Virtuelle UDP Eingangs-Befehle anlegen
Playerstatus (Playing, Paused, Stopped, Off)
Problematik: Einschalt-Lautstärke und 0%-Werte beim Dimmer
Playlist-Status bzw. Titeländerung (z.B. nächster Song)
Der Logitech Media Server (LMS) kann über ein CLI (Command Line Interface) ferngesteuert werden.
Adresse zum Verbinden: tcp://<IP-Adresse>:9090 <Befehle>
Die Befehlsreferenz der CLI ist immer am Logitech Media Server abrufbar unter folgender Adresse
http://<IP-Adresse>:9000/html/docs/cli-api.html
Eine von mir erstellte Kopie der CLI findest du hier, diese kann sich aber je nach installierter Version ändern!
Wichtig: Für dieses Tutorial muss der Logitech Media Server auf einem Server installiert sein! (dies kann auch auf einem Raspberry der Fall sein, auf dem auch ein Player läuft)
Konzeptionell schaut die Squeezebox-Lösung so aus:
Die Loxone verhält sich wie eine Remote und muss mit dem Logitech Media Server kommunizieren.
Jeder Player wird über die MAC-Adresse eindeutig identifiziert. Daher ist es erforderlich, sich die MAC-Adressen aller Player zu organisieren (beispielsweise direkt am Gerät, oder am WLAN-Router).
In der Befehlssequenz wird immer die MAC-Adresse mitgesendet, daher ist es “Best Practice”, sich für jeden Player einen eigenen virtuellen Ausgang zu erstellen. Dann kann man danach die Befehle einfach kopieren.
Wichtige Information zu den virtuellen Ausgängen in der folgenden Beschreibung:
In dieser Dokumentation wird beschrieben, dass “Befehl bei Verbindungsaufbau” die MAC-Adresse mit Leerzeichen, und in jedem Virtuellen Ausgangs-Befehl nur der Befehl (z.B. “play\n”) verwendet werden soll. Bei einer Fehlersuche stellte ich fest, dass beim schnellen Senden (z.B. Lautstärke) vom Miniserver der “Befehl bei Verbindungsaufbau” verloren geht, und dadurch der einzelne Befehl (ohne MAC) an die Standard-Zone (1. Zone) gesendet wird. Das führt zu sehr sonderbarem und unerklärlichem Verhalten.
Lösung ist:
Das Squeezelite Player Plugin erstellt die Templates entsprechend dieser Erkenntnis.
Folgenden virtuellen Ausgang erstellen:
Adresse: tcp://<IP-Adresse LMS>:9090
Befehl bei Verbindungsaufbau: <MAC-Adresse des Players>
Verbindung nach Senden schließen: Ja
Hinweis 1: Nach der MAC ein Leerzeichen eingeben, damit die nachfolgenden Befehle von der MAC-Adresse getrennt sind.
Hinweis 2: Im Forumsthread gab es Meldungen, dass die Kommunikation zum Player erst klappte, nachdem die Doppelpunkte urlencoded wurden. Sollte es Probleme geben, ersetze im Befehl die Doppelpunkte der MAC jeweils durch %3A (urlcodiert für den Doppelpunkt), also in diesem Beispiel b8%3A27%3Aeb%3A41%3Aca%3Af1
Jedes Command an den Player wird als eigener virtueller Ausgang-Befehl in der Config angelegt.
Hinweis: Jeder Befehl muss mit \n als Zeilenende abgeschlossen werden.
Hier einige Beispiele:
Befehl bei EIN: play \n
Startet die aktuelle Playlist.
Als Digitalausgang verwenden: JA
Befehl bei EIN: mixer volume <v> \n
Als Digitalausgang verwenden: NEIN
Setzt die Lautstärke (leider ist es nicht möglich, die aktuell gesetzte Lautstärke auszulesen)
Befehl bei EIN: playlist play <URL eines Radiosenders>\n
Legt den Stream in die Playlist und spielt diesen ab.
Befehl bei EIN: playlist shuffle 1 \n<MAC des Players> playlist loadalbum * ABBA * \n
Das ist eine Kombination zweier Befehle. Das \n in der Mitte markiert das Ende des ersten Befehls.
playlist shuffle 1 schaltet die Zufallswiedergabe ein
<MAC des Players> muss nochmal angegeben werden, damit der zweite Befehl auch an diesen Player gesendet wird.
playlist loadalbum * ABBA * spielt alle Alben mit Name *, Interpret ABBA, Titelname * ab
Wie die Befehle aufzurufen sind, steht in der CLI Reference.
mixer volume <v> \n mixer volume <-v>\n oder <+v>\n | Lautstärke absolut (0-100) Lautstärke relativ (plus oder minus |
play \n | Wiedergabe starten |
pause \n pause 0 \n pause 1 \n | Wiedergabe pausieren (hin- und herschalten) Wiedergabe pausieren (1) Wiedergabe fortsetzen (0) |
stop \n | Wiedergabe stoppen |
power 0 \n | Player ausschalten (1 = einschalten) |
playlist index +1 \n | Skip/Nächster Titel |
playlist index -1 \n | Skip-Back/Vorheriger Titel |
playlist shuffle 1 \n | Zufallswiedergabe ein (0 = ausschalten, 1 = per Titel, 2 = per Album) |
playlist play <URL> \n | Wiedergabe eines Radiostreams |
playlist loadalbum <genre> <artist> <album> \n | Wiedergabe eines bestimmten Genres, Interpreten und/oder Albums Beispiel: playlist loadalbum * Madonna * |
sleep <sec> \n | Sleep-Timer - nach <sec> Sekunden wird der Player abgeschaltet |
sync <playerid>\n oder -\n | Synchronisiert den aktuellen Player mit dem angegebenen. Bindestrich als Parameter hebt das Sync auf. |
Laustärkenregelung über den Dimmer-Block. In der Visu ist damit ein Slider sichtbar.
Ein virtueller Eingang als “Links-Rechts-Tasten” definiert. Damit erhält man in der Visu in einer Zeile Links-Rechts-Pfeilchen.
Hier habe ich Ausgangsbefehle für einige Radiosender, dann die Suche nach allen ABBA-Titeln (für meine Freundin), dann ein bisschen ItaloDance (für mich) und randomplay für die zufällige Wiedergabe aller Titel der Musiksammlung. Was man hier nicht sieht: An den +/- Tasten des Radiotasten-Blocks hängt ein Lichtschalter im Wohnzimmer (mit Mehrfachklick), um durch die Stationen zu surfen.
Beim Aktivieren der Sauna wird die Lautstärke fix auf 20% gestellt. In der Visu bleibt der Slider bedienbar.
Um ein bestimmtes MP3 abzuspielen, folgenden Command verwenden:
Befehl bei EIN: <MAC des Players> playlist play C:\music\Kalimba.mp3\n
Dabei muss der Pfad nicht einmal innerhalb des Libraries liegen. Das File muss lokal am Server erreichbar sein.
Leerzeichen im Pfad oder im Namen müssen mit %20 ersetzt (codiert) werden, beispielsweise muss der Pfad “C:\Mein Ordner” angegeben werden als “C:\Mein%20Ordner”.
Um einen bestimmten Ordner abzuspielen, folgenden Command verwenden:
Befehl bei EIN: <MAC des Players> playlist play /Pfad/zu/deinem/Ordner\n
Dabei muss der Pfad nicht einmal innerhalb des Libraries liegen. Der Pfad muss lokal am Server erreichbar sein.
Leerzeichen im Pfad oder im Namen müssen mit %20 ersetzt (codiert) werden, beispielsweise muss der Pfad “C:\Mein Ordner” angegeben werden als “C:\Mein%20Ordner”.
Favoriten können per Befehl direkt mit ihrer ID adressiert werden:
Befehl bei EIN: <MAC des Players> favorites playlist play item_id:1
Spielt den Favoriten mit der ID 1
Befehl bei EIN: <MAC des Players> favorites playlist play item_id:2.3
Spielt aus dem Favoritenordner mit ID 2 den Favoriten mit ID 3.
Mit der Maus über den Favoriten fahren. Unten im Browser wird der Link angezeigt. Der enthaltene Parameter index=6 entspricht der Favoriten-ID 6.
Die ID kann auch über das CLI abgefragt werden.
Um eine aktuelle Playlist zu pausieren, zwischendurch ein MP3 abzuspielen (z.B. Türklingel), und dann die ursprüngliche Playlist fortzusetzen, benötigst du folgende Befehlsfolge:
Befehl bei EIN: <MAC des Players> playlist preview url:C:\music\Kalimba.mp3\n
Der Track wird nun abgespielt und auch selbst wiederholt.
Um die Wiedergabe zu stoppen und die alte Playlist fortzusetzen:
Befehl bei EIN: <MAC des Players> playlist preview cmd:stop\n
Befehl bei EIN: <MAC des Players> play\n
Die Wiedergabe setzt am Beginn des Titels fort, wo zuvor aufgehört wurde.
Der play-Befehl startet die Playlist auch dann, wenn zuvor keine Musik gelaufen ist. Um das abzufangen, könnte der Status des Players - siehe unter Playerstatus (Playing, Paused, Stopped, Off) - mit dem Trigger des Türgongs gespeichert werden (z.B. Analogspeicher). Nur dann, wenn der Status 1 war, wird danach der play-Befehl ausgeführt
Das könnte dann so aussehen (hab ich nicht getestet!):
Hinweis:
Das LoxBerry Plugin Squeezelite Player, sowie der Musicserver4Lox (MS4L) bieten eingebaute Funktionen für die Rückmeldung. Die folgende Anleitung ist dann nicht nötig. Bitte die Anleitung des Squeezelite Plugins bzw. des MS4L zu dieser Funktion lesen.
Danke an Peter B, der hier Grundlagenforschung betrieben hat!
xAP ist ein Protokoll zur Kommunikation von Hausautomatisierungsgeräten. Sehr etabliert dürfte der Standard nicht sein, weil selbst die Website nicht mehr vollständig verfügbar ist. Das ist uns aber egal.
Im Baum bei “Virtuelle Eingänge” einen “Virtueller UDP Eingang” erstellen.
Für jeden Wert, den das xAP Plugin sendet und der in Loxone verwendet werden soll, muss ein eigener UDP Eingangsbefehl angelegt werden.
Soll beispielsweise die Lautstärke von drei Playern ausgelesen werden, muss ein Virtueller UDP Eingang und drei Virtueller UDP Eingang Befehl angelegt werden.
Einen Virtuellen UDP Eingang Befehl anlegen und benennen
Befehlserkennung: source=ersp.SlimServer.Homeserver:Wohnk\iLevel=\i\v
Der String Homeserver ist durch deinen Servernamen zu ersetzen.
Der String Wohnk ist durch deinen Raum- bzw. Playernamen zu ersetzen. Umlaute sind UTF-8-codiert, sollten daher der Einfachheit halber im Suchstring vermieden werden.
Den Eingang auf eine Seite ziehen und voilà:
Dies ist etwas tricky, da der Status nur als Text (“DisplayText”) ausgegeben wird. Mit einem kleinen Kniff bekommen wir den Status heraus:
Befehlserkennung: source=ersp.SlimServer.Homeserver:Wohnk\iDisplayText=\i\.\1
(Hintergrund: Wir lesen vom DisplayText den ASCII-Wert des zweiten Zeichens aus.)
Bekannte Displaytexte:
DisplayText | Zweites Zeichen | ASCII-Wert |
Playing | l (kleines L) | 108 |
Paused | a (kleines A) | 97 |
Stopped | t (kleines T) | 116 |
Off | f (kleines F) | 102 |
Mit einem Status-Baustein kann jetzt der Status angezeigt und auch weiterverarbeitet werden.
Der Wert wird im Statusbaustein ausgewertet. Im Beispiel wird der Statustext ausgegeben, und als Statuswert nur dann 1 gesetzt, wenn der Player tatsächlich abspielt. Damit könnte beispielsweise eine Steckdose für einen Verstärker ein- und ausgeschaltet werden.
In der Praxis sind bei mir folgende Probleme mit dem Dimmer und der Lautstärke aufgetreten:
Folgendermaßen habe ich das gelöst:
Status-Baustein Beschaltung:
UDP Monitor einschalten:
Die eingehenden Strings werden in den Textdaten angezeigt:
Danke an JV für den Tipp:
Unter diesem Link gibt es einen Viewer für die XAP-Kommunikation:
http://www.erspearson.com/xAP/xFx/viewer_main.htm
xap-header
{
v=13
hop=1
uid=FF.04646B4E:0003
class=xAP-Audio.Audio.Event
source=ersp.SlimServer.Homeserver:Wohnk.che
}
Audio.Mixer
{
bass=50
treble=50
volume=10
}
Mixer.Cmd
{
command=volume
delta=-32
}
xap-header
{
v=13
hop=1
uid=FF.04646B4E:0003
class=xAP-Audio.Transport.Event
source=ersp.SlimServer.Homeserver:Wohnk.che
}
Audio.Transport
{
Elapsed=02:18
PlayerID=b8:27:eb:41:ca:f1
Remaining=02:01
Repeat=off
Shuffle=none
}
xap-header
{
v=13
hop=1
uid=FF.04646B4E:0003
class=xAP-Audio.Playlist.Event
source=ersp.SlimServer.Homeserver:Wohnk.che
}
Now.Playing
{
Album=Super Italia Fan Edizione
AlbumID=2143
Artist=Ma.Bra. Vs. Klubnoize
Duration=3:12
Genre=ItaloDance
Index=6
Path=file:///E:/Musik/Auswahl Dance/Dance 2007/Super Italia Fan Edizione/13 Ma.Bra. Vs. Klubnoize - We Want to Rock (Ma.Bra. Edit.mp3
Title=We Want to Rock (Ma.Bra. Edit
TrackID=32900
Tracks=56
}
xap-header\n
{\n
v=13\n
hop=1\n
uid=FF.04646B4E:0003\n
class=xAP-Audio.Transport.Event\n
source=ersp.SlimServer.Homeserver:Wohnk\xFCche\n
}\n
Audio.Transport\n
{\n
Elapsed=01:03\n
PlayerID=b8:27:eb:41:ca:f1\n
Remaining=02:09\n
Repeat=off\n
Shuffle=track\n
}
\n
xap-header\n
{\n
v=13\n
hop=1\n
uid=FF.04646B4E:0003\n
class=xAPBSC.Event\n
source=ersp.SlimServer.Homeserver:Wohnk\xFCche\n
}\n
output.state\n
{\n
DisplayText=Playing\n
Level=30/100\n
State=on\n
}\n