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.

Zusammenfassung

Einrichtung Loxone

Virtueller Ausgang

Virtueller Ausgang Befehl

Häufig benötigte Befehle

Einsatzbeispiele der virtuellen Ausgangs-Befehle

Mit dem Radiotastenblock kann man sich die Lieblingssender/Playlists programmieren (nicht verwirren lassen von den vielen Linien).

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

Lautstärke (Volume)

Playerstatus (Playing, Paused, Stopped, Off)

Problematik: Einschalt-Lautstärke und 0%-Werte beim Dimmer

Interne Anmerkungen

Troubleshooting

UDP Monitor

xFx Viewer

xAP Protokoll Beispiele (RAW)

Änderung der Lautstärke

Status/Transport des Players

Playlist-Status bzw. Titeländerung (z.B. nächster Song)

Status Play

Zusammenfassung

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:

  • Remotes (z.B. iPeng App unter iOS, Squeezebox App, Webinterface) verbinden zum Server
  • Player (z.B. echte Squeezebox, SqueezePlay App auf Android, SqueezePlug am Raspberry) verbinden ebenfalls zum Server
  • Befehle der Remotes werden zum Server gesendet, Server sendet Befehle weiter an den entsprechenden Player

Die Loxone verhält sich wie eine Remote und muss mit dem Logitech Media Server kommunizieren.

Einrichtung Loxone

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.

Virtueller Ausgang

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:

  1. “Befehl bei Verbindungsaufbau”: <leer>
  2. In jedem virtuellen Ausgangsbefehl beim “Befehl bei EIN” die MAC-Adresse davorstellen.

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

Virtueller Ausgang Befehl

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.

Häufig benötigte Befehle

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.

Einsatzbeispiele der virtuellen Ausgangs-Befehle

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.


Mit dem Radiotastenblock kann man sich die Lieblingssender/Playlists programmieren (nicht verwirren lassen von den vielen Linien).

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.

Abspielen eines bestimmten MP3s

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”.

Abspielen eines bestimmten Ordners

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”.

Abspielen von Favoriten

Favoriten können per Befehl direkt mit ihrer ID adressiert werden:

Beispiele

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.

ID über das Webinterface herausfinden

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.

Abspielen eines Türgongs (temporäres Aussetzen einer Playlist)

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!):


Rückmeldungen des LMS an Loxone

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!

LMS: Aktivieren des xAP Plugins

  • In den LMS Servereinstellungen das Plugin “xAP Home Automation” aktivieren

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.

Loxone: Virtueller UDP Eingang

Im Baum bei “Virtuelle Eingänge” einen “Virtueller UDP Eingang” erstellen.

  • Bezeichnung z.B. “Logitech Media Server”
  • UDP Eingangsport: 3639
  • Die Senderadresse kann frei bleiben, sollte zur Sicherheit jedoch die IP-Adresse des Logitech Media Servers haben (damit blockiert der Miniserver Pakete von anderen Netzwerkgeräten)

Virtuelle UDP Eingangs-Befehle anlegen

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.

Lautstärke (Volume)

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à:

Playerstatus (Playing, Paused, Stopped, Off)

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.

Problematik: Einschalt-Lautstärke und 0%-Werte beim Dimmer

In der Praxis sind bei mir folgende Probleme mit dem Dimmer und der Lautstärke aufgetreten:

  1. Nach Neustarts des LMS-Players oder des Miniservers war der virtuelle Eingang manchmal auf 0, wodurch der Dimmer 0% an den LMS gesendet hat.
  2. Drückt jemand bei der Dimmer-Visu auf den Ein-Schalter, geht die Volume direkt auf 100%.

Folgendermaßen habe ich das gelöst:

  • Der Dimmerausgang hängt an einem Status-Baustein.
  • Beide Ausgänge (Statustext und Statuswert) werden als Wert-Ausgang genutzt, was glücklicherweise funktioniert!
  • Ist die Eingangslautstärke 0, dann limitiere den Dimmer auf 25 (verhindert 0->100% beim Einschalten über Visu), und gib 25 bei der Volume aus (0% nicht zulassen).
  • Bei jeder anderen Lautstärke limitiere Max auf 100% und reiche die Lautstärke des Dimmers durch.

Status-Baustein Beschaltung:

  • TQ hängt am Dimmer Max
  • AQ hängt am virtuellen Ausgang der LMS-Volume

Interne Anmerkungen

Troubleshooting

UDP Monitor

UDP Monitor einschalten:

Die eingehenden Strings werden in den Textdaten angezeigt:

xFx Viewer

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 Protokoll Beispiele (RAW)

Änderung der Lautstärke

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

}

Status/Transport des Players

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

}

Playlist-Status bzw. Titeländerung (z.B. nächster Song)

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

Status Play

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