Libratone Zipp WLan Lautsprecher in Loxone einbinden

Ich war lange auf der Suche nach guten Lautsprechern, die sowohl mit einem Akku portabel sind, sich aber auch hervorragend für Multiroom Szenarien eignen würden. Gerne dürften die Lautsprecher über WLan und Bluetooth nutzbar sein und sollten natürlich einfach bedienbar sein. Selbstverständlich wäre das Sahnehäubchen die Integration ins Smart Home (Loxone). Des Weiteren spielt bei dieser Anschaffung natürlich auch der Preis eine Rolle.

Nach einiger Zeit wurde ich endlich fündig und habe die für mich geeignetsten Lautsprecher gefunden: Libratone Zipp bzw. Zipp Mini

Es gibt verschiedene Versionen des Zipp Lautsprechers. Aktuell gibt es die Version 2 in groß und klein. Sparen kann man beim Kauf eines Bundles (2 gleiche Lautsprecher).

Die Spezifikationen können beim Hersteller direkt nachgeschaut werden, durch Firmware Updates kommen auch gerne mal noch weitere Funktionalitäten hinzu. Daher komme ich direkt zur möglichen Integration der Lautsprecher.

Steuerung im lokalen Netzwerk

Zur Steuerung der Boxen gibt es eine App von Libratone. Diese ist sehr schlicht aufgebaut und stellt simple Funktionalitäten zur Verfügung:

  • Favoriten speichern und ausführen (bspw. 5 verschiedene Radiosender)
  • Lautstärke
  • Vordefinierte Equalizer bzw. Raumeinstellungen
  • Standby Timer
  • LED Helligkeit
  • Play/Pause/Stopp/Next/Prev
  • etc.

Diese Befehle gilt es also in Loxone zu übernehmen. Der Libratone Support hat mir auf die Frage der externen Steuerungsmöglichkeiten durch bspw. einer REST API, leider nicht weiterhelfen können. Dies führte dazu, dass ich selbst mit Wireshark, Reverse-Engineering der App und simple Testverfahren herausfinden musste, wie man die Boxen wohl steuern könnte. Folgender Testaufbau führte letztlich zum Erfolg:

  • NoxPlayer Android Emulator zur Ausführung der App auf meinem PC
  • WireShark zum Mitschneiden der Datenpakete im Netzwerk
  • PowerShell zum Testen der herausgefunden Befehle über UDP Pakete

Die Libratone App läuft also im NoxPlayer. Hierüber kann ich die Befehle (bspw. „Play“) abfeuern und im WireShark direkt mitschneiden und auf die IP-Adresse der Box filtern. Die Daten der UDP Pakete im ASCII sind schon einigermaßen Aussagekräftig, werden jedoch als Hex-Code zum Testen und für Loxone benötigt. Dazu einfach die Paketbytes anzeigen lassen und als „C Array“ anzeigen lassen.

In der Byte-Array Ansicht sieht man nun die Hex-Codes der übermittelten Zeichen. Dies verrät uns, dass nicht alle Zeichen in ASCII angezeigt werden können. 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. Nachfolgend das Byte-Array des Befehls „Play“:

char packet_bytes[] = {
0x00, 0x00, 0x02, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x04, 0x50, 0x4c, 0x41, 0x59
};

Befehle testen

Mit folgendem PowerShell Script kann man die herausgefundenen Befehle als Byte-Array auch testen:

# function to create and send UDP Package to Libratone Box
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()
}

# byte array for "play"
[Byte[]] $play = 0x00, 0x00, 0x02, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x04, 0x50, 0x4c, 0x41, 0x59

# use function to send UDP Package with command
Send-LibratoneCommand -toIP "192.168.xxx.xxx" -toUDPPort 7777 -fromUDPPort 58800 -send $play

In Loxone einbinden

In Loxone kann man dann die Befehle als virtuellen UDP Ausgang verwenden und direkt den Hex-Code schicken. Dazu wie nachfolgend auf den Bildern ersichtlich, zunächst die XML-Vorlage mit allen Befehlen importieren und entsprechend anpassen:



VO_LibratoneZipp.xml (789 Downloads )


Danach können die Befehle als normale Ausgänge in Loxone verwendet und beliebig eingebaut werden.

Mehr Infos dazu habe ich im Loxwiki zusammengetragen und veröffentlicht:
https://www.loxwiki.eu/display/LOX/Libratone+Zipp+WLan+Lautsprecher

Die Libratone Boxen kann man somit recht simpel als Multiroom Lösung, Wecker, Einschlafhilfe usw. nutzen.

Multiroom Konfiguration

In der Libratone App lassen sich die WLan Lautsprecher per Drag&Drop miteinander zu einem sogenannten „Link“ verbinden. Danach läuft auf beiden Boxen derselbe Stream.

Screenshot der Libratone App mit zwei verbundenen Lautsprechern.

Beispielhaft habe ich einen Zipp Mini und eine Zipp 2 Box zu einem Link verknüpft (siehe Screenshot). Hier möchte ich kurz die Szenarien beschreiben, auch hinsichtlich der Befehle oben und wie sich die Boxen dann verhalten:

  • Streamänderung: Wenn man bspw. statt Favorit 1, lieber Favorit 3 hören möchte, kann man das an eine beliebige Box innerhalb des Links schicken. Die jeweils andere(n) Box(en) innerhalb des Links werden dann automatisch mit angepasst.
  • Lautstärkeänderung: Die Lautstärke ist immer noch pro Box separat einstellbar.
  • Lautsprecher einzeln ein-/ausschalten: Der Link bleibt bestehen, auch wenn eine einzelne Box vorrübergehend oder dauerhaft ausgeschalten wird. Sofern man dann eine im Link enthaltene Box wieder einschaltet, so wird diese automatisch von den anderen Boxen „informiert“ und passt sich sofort wieder in den Link ein und startet den entsprechenden Stream automatisch.

Statusinformationen abrufen

Theoretisch kann man ein paar Statusinformationen der Libratone Boxen abrufen, allerdings nicht so komfortabel und der Mehrwert der Informationen hält sich auch in Grenzen. Ich habe deshalb nur mal die Möglichkeiten gesammelt und liste diese hier auf:

  • Via HTTP (Webseite): http://192.168.xxx.xxx/cgi?Overview 
    (IP Adresse des Lautsprechers bitte entsprechend anpassen)
  • Via HTTP Port 49152 (XML): http://192.168.xxx.xxx:49152/description.xml 
    (IP Adresse des Lautsprechers bitte entsprechend anpassen)
  • Via UDP Broadcast Paketen auf Port 1800: 
    NOTIFY * HTTP/1.1
    HOST: 239.255.255.250:1800
    PROTOCOL: Version 1.0
    NTS: ssdp-alive
    DeviceName: ZIPPTWOGREY_xxx
    DeviceID: xxx
    DeviceState: F,S,P
    PORT: 7777
    ZoneID: LINK ZippMiniOne_xxx 
    Creator:
    IPAddr: 192.168.xxx.xxx 
    ColorCode: 2010
    FWVersion: 1508;4450,;400,
    StereoPairID:
    ProVersion: 3.0,3.0
    DeviceType: 310
    AiMicStatus: 1
    Characterstic: 2,100,0,15,7,0,DE,de
    WifiInfo: ,-59,51/70 ,-62,48/70 ,-54,56/70 ,-54,56/70 ,-58,52/70
    VolSync: N

Der Vollständigkeit halber hier noch ein Auszug der Befehle für die Box (ausführlich dann in der XML Vorlage definiert):

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\x59
Startet einen Stream, wenn bspw. vorher der Radio-Stream mit Pause gestoppt wurde
Stop\x00\x00\x02\x00\x28\x00\x00\x00\x00\x04
\x53\x54\x4f\x50
Pausiert oder stoppt einen gerade laufenden Stream
weitere Befehle in Vorlage (*.xml) vorhanden…
Standby\x00\x00\x02\x00\x0f\x00\x00\x00\x00\x02
\x32\x30
Versetzt die Libratone Box sofort in Standby
Standby Timer 15min.\x00\x00\x02\x00\x0f\x00\x00\x00\x00\x04
\x32\x39\x30\x30
Startet 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\x30
Startet 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\x30
Unterbricht der gerade laufenden Standby Timer
Ton: Neutral\x00\x00\x02\x02\x06\x00\x00\x00\x00\x04
\x56\x31\x30\x30
Neutrale Grundeinstellung
Ton: Easy Listening\x00\x00\x02\x02\x06\x00\x00\x00\x00\x04
\x56\x31\x30\x31
Leichter 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\x6c
Neutrale Grundeinstellung
Raum: Im Freien\x00\x00\x02\x02\x07\x00\x00\x00\x00\x07
\x6f\x75\x74\x64\x6f\x6f\x72
Optimales 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\x30
LED Helligkeit auf 50%
weitere LED Helligkeiten in Vorlage (*.xml) vorhanden…
LED Helligkeit 99\x00\x00\x02\x01\x2d\x00\x00\x00\x00\x02
\x39\x39
LED Helligkeit auf 99%
LED Helligkeit 100\x00\x00\x02\x01\x2d\x00\x00\x04\x00\x03
\x31\x30\x30
LED Helligkeit auf 100%
Volume 0\x00\x00\x02\x00\x40\x00\x00\x00\x00\x02
\x30\x30
Lautstärke auf 0% (aus)
Volume 1\x00\x00\x02\x00\x40\x00\x00\x00\x00\x02
\x30\x31
Lautstärke auf 1%
Volume 2\x00\x00\x02\x00\x40\x00\x00\x00\x00\x02
\x30\x32
Lautstärke auf 2%
weitere Volume Einstellungen in Vorlage (*.xml) vorhanden…
Volume 10\x00\x00\x02\x00\x40\x00\x00\x00\x00\x02
\x31\x30
Lautstärke auf 10%
Volume 11\x00\x00\x02\x00\x40\x00\x00\x00\x00\x02
\x31\x31
Lautstärke auf 11%
weitere Volume Einstellungen in Vorlage (*.xml) vorhanden…
Volume 99\x00\x00\x02\x00\x40\x00\x00\x00\x00\x02
\x39\x39
Lautstärke auf 99%
Volume 100\x00\x00\x02\x00\x40\x00\x00\x00\x00\x03
\x31\x30\x30
Lautstä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

Nun viel Spaß beim Nachbauen und nutzen der günstigen Mutliroom Lösung mit Libratone Boxen für Loxone. Bei Fragen natürlich gerne jederzeit im Loxforum oder hier als Kommentar.

24 Kommentare


  1. Moin! Danke für das Tutorial! Ich habe die Zipp Classic und die Befehle scheinen nicht zu funktionieren. Kann das sein, dass dies wirklich NUR mit den genannten Zipp Mini/2/etc. funktioniert?

    Antworten

    1. Hi Mo, hm, ich habe leider keine Zipp Classic Lautsprecher zur Verfügung, du könntest es mit etwas technischem Geschick mit Wireshark mal selbst überprüfen. Den Zipp Classic kann man auch über die aktuelle Libratone App über Wifi steuern? – Ich glaube die Software auf den Lautsprechern unterscheidet sich stark, da der Anbieter für die Software-Entwicklung bei Libratone gewechselt hat vor ein paar Jahren.
      Grüße,
      Benni

      Antworten

      1. Moin Benni,
        bin mit der Zipp Classic leider gescheitert. Ich denke, dass du recht hast und es Software bedingt nicht geht. Dennoch vielen Dank für die Anleitung. Habe mir kurzerhand den Nachfolger besorgt und es klappt einwandfrei 🙂
        Beste Grüße und weiter so!

        Antworten

  2. Schöner Blog! Wir bauen in Crailsheim. 🙂

    LG

    Antworten

    1. Hi Domenico, danke! Viel Erfolg beim eigenen Hausbauprojekt. 🙂
      Beste Grüße,
      Benni

      Antworten

  3. Hey! Great tutorial. I have ZIPP 2 and would like to integrate it to Home Assistant.
    I was playing with netcat and could start favorites and set volume, but I could not use play, stop or pause. They are ignored and I don’t know why.
    echo -e „\x00\x00\x02\x00\x28\x00\x00\x00\x00\x05\x50\x41\x55\x53\x45“ | nc -u -w1 192.168.1.152 7777

    this works for volume 11
    echo -e „\x00\x00\x02\x00\x40\x00\x00\x00\x00\x02\x31\x31“ | nc -u -w1 192.168.1.152 7777

    Have codes changed maybe?

    Antworten

    1. Hi Matthew,
      strange, if other codes are working, also Pause, Stop, etc. should work. What would you like to pause or play? Which firmware version is installed on your device?
      Best regards,
      Benni

      Antworten

      1. Hello Benjamin,

        I found the solution. Problem was in echo. I needed to add -n flag and then it works.
        So working solution is
        echo -n -e „\x00\x00\x02\x00\x28\x00\x00\x00\x00\x05\x50\x41\x55\x53\x45“ | nc -u -w1 192.168.1.152 7777

        Works really good in Home Assistant 🙂

        Is there a way to find the current state of the speaker? Like if it is play mode or paused?

        Antworten

        1. Hey Matthew, sounds great! Small change, big effect. 😉

          Unfortunately I have to status information right now. Should be possible, because the app grab this information as well. But I didn’t investigate the UDP packages and how to request them. I thought it’s something simple like a xml via HTTP, but there are only some general information available or I didn’t find the right URL.

          Best regards,
          Benni

          Antworten

        2. Hello Matthew do you have your config in GitHub ? I would Like to see how you integrate the speaker in Homeassistant

          Antworten

          1. Ive thought to add it AS Media Player. The Idea with dlna is good . Thank You


  4. Awesome investigation + write up 🙂 Thanks for doing all the hard work!

    Purchased two of the Zipp Mini’s this week and would love to hook them up to Home Assistant.

    Antworten

  5. Hallo Benjamin!
    Vielen lieben Dank für diesen Artikel-ich hab nun eine viel bessere Integration der Libratones in Home Assistant bauen können.
    Ich wollte dein Reverse Engineering nachvollziehen, bin aber bei der Android Emulation steckengeblieben.
    Ich verwende Memu, das sich Nox bei mir nicht installieren ließ. Die Libratone App zeigt meine beiden Libratones fälschlicherweise als offline an.
    Hattest du dieses Problem bei Nox eventuell auch bzw. fällt dir vielleicht eine Einstellung ein?

    Nochmals vielen Dank und liebe Grüße!

    Antworten

    1. Hi Gernot,
      das Problem hatte ich nicht direkt, aber am besten ist es die Libratone Boxen nochmal neu anlernen zu lassen, also zurücksetzen und dann über die App im Emulator neu finden und hinzufügen. Alternativ hatte ich beim letzten mal via Remote-SSH in Wireshark gearbeitet und mich in meine Ubiquiti Access Points verbunden, um den Traffic vom Smartphone zur Libratone Box zu verfolgen. Das wäre eine Alternative, falls du ebenfalls einen geeigneten Access Point verwendest.
      Genau genommen habe ich noch die Funktionalitäten zur Bedienung der angeschlossenen USB Geräte herausgefunden. Falls das auch dein Ziel ist, dann würde ich demnächst im Blog updaten. 😉
      Viele Grüße,
      Benni

      Antworten

      1. Hi-vielleicht gehts auch mit der Fritzbox und Wireshark! Danke für den Hinweis!
        Abgesehen davon interessiert mich alles was du über die Libratones herausgefunden hast!
        Vielen lieben Dank nochmal!

        Antworten

    2. Hallo Gernot,
      Mir ging es genau so. Die Emulatoren können den Libratone nicht entdecken. Wie konntest du es nun einbinden ? Per dlna ist irgendwie nicht so zufriedenstellend

      Antworten

  6. Hi Benjamin,

    Can I use your XML file in a python package I’m currently programming to have an integration with Home Assistant?

    Thanks,
    Chouffy

    Antworten

      1. Thanks! I managed to create a basic python library https://github.com/Chouffy/python_libratone_zipp and a home assistant integration https://github.com/Chouffy/home_assistant_libratone_zipp

        But before integrating further, I would like to get data from the speaker (play/pause status, …). I see a lot of data exchanged between UDP 7777/7778 and 3334/3333 (send/receive from the perspective of the user device toward the speaker)

        Do you or anybody here has any idea how the communication is done?

        Antworten

        1. Just to close the loop and for anyone that pass by: I figured out how Libratone Zipp communicate from/to the app.
          You’ll find in my python integration a command line client that can send commands and receive notification (basic ones: volume, status, …) – https://github.com/Chouffy/python_libratone_zipp
          And the Home Assistant integration has been updated to take advantage of this – https://github.com/Chouffy/home_assistant_libratone_zipp

          Thanks again Benjamin for the initial research!

          Antworten

          1. Hi Chouffy, yeah, that’s great! Thanks a lot for your work 🙂


  7. Hi Benjamin

    Thanks to your research, I was able to control my Zipp using Node-RED!

    I however miss the functionality to power off the device. Since I cannot find this command in the app either, I assume, that this is not possible, is it?

    Antworten

    1. Perfect, glad to hear that my research was helpful. 🙂 – I don’t think there is a possibility to power off the device but you can use the „stop“ command and after a few minutes, it should be in standby automatically.

      Antworten

Schreiben Sie einen Kommentar

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