Zum Ende der Metadaten springen
Zum Anfang der Metadaten

Sie zeigen eine alte Version dieser Seite an. Zeigen Sie die aktuelle Version an.

Unterschiede anzeigen Seitenhistorie anzeigen

« Vorherige Version anzeigen Version 3 Nächste Version anzeigen »

Die WLan Lautsprecher von Libratone (Zipp, Zipp Mini, Zipp 2 und Zipp 2 Mini) lassen sich mit UDP Paketen recht simpel steuern. Einige Nachforschungen via Wireshark, Reverse-Engineering der App und simplen Testverfahren, konnte ich bisher einige Befehle herausfinden, die dann via Loxone steuerbar sind. Die Befehle können via Hex-Code als UDP Paket übermittelt werden. Nachfolgend eine Tabelle mit einem Auszug der möglichen Kommandos mit einer kurzen Beschreibung. In Loxone kann ein Libratone Lautsprecher dann via virtuellem Ausgang und Ausgangsbefehlen verwendet werden. Eine Vorlage dazu habe ich dem Artikel weiter unten angehängt.

Voraussetzung zur Nutzung einer Libratone WLan Box via Loxone:

  • Libratone Box ist bereits im gleichen Netzwerk wie Loxone vorhanden (WLan ist bereits eingerichtet)

Auszug einiger Befehle

Nachfolgend befindet sich eine Liste mit möglichen Kommandos, mit denen man die Libratone Box problemlos über WLan steuern kann.

NameBefehl (Hex-Code)Beschreibung
Favorit 1

\x00\x00\x02\x01\x15\x00\x00\x00\x00\x77\x7b\x22\x69\x73\x46\x72\x6f\x6d\x43\x68\x61\x6e\x6e
\x65\x6c\x22\x3a\x66\x61\x6c\x73\x65\x2c\x22\x70\x6c\x61\x79\x5f\x69\x64\x65\x6e\x74\x69\x74
\x79\x22\x3a\x22\x31\x22\x2c\x22\x70\x6c\x61\x79\x5f\x73\x75\x62\x74\x69\x74\x6c\x65\x22\x3a
\x22\x31\x22\x2c\x22\x70\x6c\x61\x79\x5f\x74\x69\x74\x6c\x65\x22\x3a\x22\x63\x68\x61\x6e\x6e
\x65\x6c\x22\x2c\x22\x70\x6c\x61\x79\x5f\x74\x79\x70\x65\x22\x3a\x22\x63\x68\x61\x6e\x6e\x65
\x6c\x22\x2c\x22\x74\x6f\x6b\x65\x6e\x22\x3a\x22\x22\x7d

Wählt den Radiosender, der als erster Favorit gespeichert wurde
Favorit 2\x00\x00\x02\x01\x15\x00\x00\x00\x00\x77\x7b\x22\x69\x73\x46\x72\x6f\x6d\x43\x68\x61\x6e\x6e
\x65\x6c\x22\x3a\x66\x61\x6c\x73\x65\x2c\x22\x70\x6c\x61\x79\x5f\x69\x64\x65\x6e\x74\x69\x74
\x79\x22\x3a\x22\x32\x22\x2c\x22\x70\x6c\x61\x79\x5f\x73\x75\x62\x74\x69\x74\x6c\x65\x22\x3a
\x22\x32\x22\x2c\x22\x70\x6c\x61\x79\x5f\x74\x69\x74\x6c\x65\x22\x3a\x22\x63\x68\x61\x6e\x6e
\x65\x6c\x22\x2c\x22\x70\x6c\x61\x79\x5f\x74\x79\x70\x65\x22\x3a\x22\x63\x68\x61\x6e\x6e\x65
\x6c\x22\x2c\x22\x74\x6f\x6b\x65\x6e\x22\x3a\x22\x22\x7d
Wählt den Radiosender, der als zweiter Favorit gespeichert wurde
...weitere Favoriten in Vorlage (*.xml) vorhanden......
Play\x00\x00\x02\x00\x28\x00\x00\x00\x00\x04\x50\x4c\x41\x59Startet einen Stream, wenn bspw. vorher der Radio-Stream mit Pause gestoppt wurde
Stop/Pause\x00\x00\x02\x00\x28\x00\x00\x00\x00\x04\x53\x54\x4f\x50Pausiert oder stoppt einen gerade laufenden Stream
...weitere Befehle in Vorlage (*.xml) vorhanden......
Standby\x00\x00\x02\x00\x0f\x00\x00\x00\x00\x02\x32\x30Versetzt die Libratone Box sofort in Standby
Standby Timer 15min.\x00\x00\x02\x00\x0f\x00\x00\x00\x00\x04\x32\x39\x30\x30Startet einen internen Timer, der die Box nach 15 Minuten in den Standby versetzt
Standby Timer 30min.\x00\x00\x02\x00\x0f\x00\x00\x00\x00\x05\x32\x31\x38\x30\x30Startet einen internen Timer, der die Box nach 30 Minuten in den Standby versetzt
...weitere Standby Timer in Vorlage (*.xml) vorhanden......
Standby Timer abbrechen\x00\x00\x02\x00\x0f\x00\x00\x00\x00\x02\x46\x30Unterbricht der gerade laufenden Standby Timer
Ton: Neutral\x00\x00\x02\x02\x06\x00\x00\x00\x00\x04\x56\x31\x30\x30Neutrale Grundeinstellung
Ton: Easy Listening\x00\x00\x02\x02\x06\x00\x00\x00\x00\x04\x56\x31\x30\x31Leichter und entspannter Sound
...weitere Toneinstellungen in Vorlage (*.xml) vorhanden......
Raum: Neutral\x00\x00\x02\x02\x07\x00\x00\x00\x00\x07\x6e\x65\x75\x74\x72\x61\x6cNeutrale Grundeinstellung
Raum: Im Freien\x00\x00\x02\x02\x07\x00\x00\x00\x00\x07\x6f\x75\x74\x64\x6f\x6f\x72Optimales Klangfeld, wenn das Produkt im Freien steht
...weitere Raumeinstellungen in Vorlage (*.xml) vorhanden......
LED immer an (on)\x00\x00\x02\x02\x65\x00\x00\x00\x00\x01\x30Die LED Beleuchtung wird auf "immer an" geschalten
LED immer an (off)\x00\x00\x02\x02\x65\x00\x00\x00\x00\x01\x31Die LED Beleuchtung geht nach ein paar Sekunden aus und nur bei Bedienung kurz an
LED Helligkeit 0\x00\x00\x02\x01\x2d\x00\x00\x00\x00\x01\x30LED Helligkeit auf 0% (aus)
LED Helligkeit 1\x00\x00\x02\x01\x2d\x00\x00\x00\x00\x01\x31LED Helligkeit auf 1%
LED Helligkeit 2\x00\x00\x02\x01\x2d\x00\x00\x00\x00\x01\x32LED Helligkeit auf 2%
...weitere LED Helligkeiten in Vorlage (*.xml) vorhanden......
LED Helligkeit 50\x00\x00\x02\x01\x2d\x00\x00\x00\x00\x02\x35\x30LED Helligkeit auf 50%
...weitere LED Helligkeiten in Vorlage (*.xml) vorhanden......
LED Helligkeit 99\x00\x00\x02\x01\x2d\x00\x00\x00\x00\x02\x39\x39LED Helligkeit auf 99%
LED Helligkeit 100\x00\x00\x02\x01\x2d\x00\x00\x04\x00\x03\x31\x30\x30LED Helligkeit auf 100%
Volume 0\x00\x00\x02\x00\x40\x00\x00\x00\x00\x02\x30\x30Lautstärke auf 0% (aus)
Volume 1\x00\x00\x02\x00\x40\x00\x00\x00\x00\x02\x30\x31Lautstärke auf 1%
Volume 2\x00\x00\x02\x00\x40\x00\x00\x00\x00\x02\x30\x32Lautstärke auf 2%
...weitere Volume Einstellungen in Vorlage (*.xml) vorhanden......
Volume 10\x00\x00\x02\x00\x40\x00\x00\x00\x00\x02\x31\x30Lautstärke auf 10%
Volume 11\x00\x00\x02\x00\x40\x00\x00\x00\x00\x02\x31\x31Lautstärke auf 11%
...weitere Volume Einstellungen in Vorlage (*.xml) vorhanden......
Volume 99\x00\x00\x02\x00\x40\x00\x00\x00\x00\x02\x39\x39Lautstärke auf 99%
Volume 100\x00\x00\x02\x00\x40\x00\x00\x00\x00\x03\x31\x30\x30Lautstärke auf 100%
Volume "v"\x00\x00\x02\x00\x40\x00\x00\x00\x00\x02<v>

Die Lautstärke kann durch bspw. einem Schieberegler variable eingestellt werden.
Hierfür ist aber die Logik zu beachten

Die Befehle setzen sich aus Füll-Zeichen (irgendein ASCII Zeichen oder leeren Control Characters wie bspw. \x00), aus Control Characters (\x02 für "STX" = "Start of Text", mehr Details hier: https://en.wikipedia.org/wiki/C0_and_C1_control_codes) und der eigentlichen Anweisung (bspw. STOP, also \x53\x54\x4f\x50) zusammen.

Die "Control Codes" werden sehr wirr und eigentlich nicht für die dafür vorgesehenen Zwecke genutzt. Ein richtiges Muster oder einheitliches Vorgehen konnte ich leider nicht entdecken bei der Verwendung einiger Hex-Codes als Steuerzeichen. Also ist die Referenz auf die Control Codes vermutlich nicht zielführend.

Einrichtung in Loxone Config via virtuellem Ausgang (UDP)

VO_LibratoneZipp.xml

wird noch mit Screenshots und einer fertigen Vorlagen XML Datei von mir nachgereicht...

Nutzungsszenarien der Ausgänge in der Loxone Config

wird noch mit Screenshots von mir nachgereicht...

Multiroom Konfiguration

wird von mir nachgereicht...

Testen via PowerShell

Wer gerne selbst etwas testen möchte und sich mit weiteren Funktionen auseinandersetzen möchte, kann das auch ohne Loxone tun. Ich selbst habe zum Testen und Forschen ein PowerShell Script erstellt und genutzt. Nachfolgend das Script mit ein paar Byte Arrays als Test. Mit der Funktion [System.Text.Encoding]::ASCII.GetString($byteArray) kann der Hex-Code auch in ein ASCII String konvertiert werden, wobei hierbei nicht alle benötigten Zeichen angezeigt werden können (bspw. die Steuerzeichen).

Libratone Command Script
function Send-LibratoneCommand {
    param (
       [string]$toIP = "192.168.xxx.xxx",
       [int]$toUDPPort = 7777,
       [int]$fromUDPPort = 58800,
       $send = ""
    )    
    $IP = [System.Net.Dns]::GetHostAddresses($toIP)
    $Address = [System.Net.IPAddress]::Parse($IP)
    $EndPoints = New-Object System.Net.IPEndPoint($Address, $toUDPPort)
    $Socket = New-Object System.Net.Sockets.UDPClient($fromUDPPort)
    $SendMessage = $Socket.Send($send, $send.count, $EndPoints)
    $Socket.Close()
}

# Favorites
#...{"isFromChannel":false,"play_identity":"1","play_subtitle":"1","play_title":"channel","play_type":"channel","token":""}
[Byte[]] $favorites1 = 0xaa, 0xaa, 0x02, 0x01, 0x15, 0x00, 0x1f, 0xdb, 0x00, 0x77, 0x7b, 0x22, 0x69, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x22, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x31, 0x22, 0x2c, 0x22, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x73, 0x75, 0x62, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x22, 0x3a, 0x22, 0x31, 0x22, 0x2c, 0x22, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x22, 0x3a, 0x22, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x2c, 0x22, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x22, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x2c, 0x22, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x3a, 0x22, 0x22, 0x7d
#...{"isFromChannel":false,"play_identity":"2","play_subtitle":"2","play_title":"channel","play_type":"channel","token":""}
[Byte[]] $favorites2 = 0xaa, 0xaa, 0x02, 0x01, 0x15, 0x00, 0xb7, 0xa2, 0x00, 0x77, 0x7b, 0x22, 0x69, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x22, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x32, 0x22, 0x2c, 0x22, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x73, 0x75, 0x62, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x22, 0x3a, 0x22, 0x32, 0x22, 0x2c, 0x22, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x22, 0x3a, 0x22, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x2c, 0x22, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x22, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x2c, 0x22, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x3a, 0x22, 0x22, 0x7d

# Volume
[Byte[]] $volume11 = 0xaa, 0xaa, 0x02, 0x00, 0x40, 0x00, 0x6e, 0x61, 0x00, 0x02, 0x31, 0x31
[Byte[]] $volume12 = 0xaa, 0xaa, 0x02, 0x00, 0x40, 0x00, 0x6e, 0x61, 0x00, 0x02, 0x31, 0x32
[Byte[]] $volume13 = 0xaa, 0xaa, 0x02, 0x00, 0x40, 0x00, 0x6e, 0x61, 0x00, 0x02, 0x31, 0x33
[Byte[]] $volume23 = 0xaa, 0xaa, 0x02, 0x00, 0x40, 0x00, 0x6e, 0x61, 0x00, 0x02, 0x32, 0x33

# Pause/Stop Streaming
[Byte[]] $stop = 0x00, 0x00, 0x02, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x04, 0x53, 0x54, 0x4f, 0x50
[Byte[]] $play = 0x00, 0x00, 0x02, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x04, 0x50, 0x4c, 0x41, 0x59

# Sending commands to test
Send-LibratoneCommand -toIP "192.168.xxx.xxx" -toUDPPort 7777 -fromUDPPort 58800 -send $favorites1
Send-LibratoneCommand -toIP "192.168.xxx.xxx" -toUDPPort 7777 -fromUDPPort 58800 -send $favorites2
Send-LibratoneCommand -toIP "192.168.xxx.xxx" -toUDPPort 7777 -fromUDPPort 58800 -send $volume12
Send-LibratoneCommand -toIP "192.168.xxx.xxx" -toUDPPort 7777 -fromUDPPort 58800 -send $stop
Send-LibratoneCommand -toIP "192.168.xxx.xxx" -toUDPPort 7777 -fromUDPPort 58800 -send $play

# Convert Byte Arrays to ASCII String to find out more information
[System.Text.Encoding]::ASCII.GetString($favorites1)
[System.Text.Encoding]::ASCII.GetString($favorites2)
[System.Text.Encoding]::ASCII.GetString($stop)
  • Keine Stichwörter