BoseFix32 — lokaler SoundTouch-Cloud-Ersatz auf einem ESP32

Begonnen von tostmann, 21 Mai 2026, 00:26:36

Vorheriges Thema - Nächstes Thema

tostmann

Bose hat am 6. Mai 2026 die SoundTouch-Cloud abgeschaltet. Damit gehen auf den Speakern Presets, NowPlaying, Stereo-Pairing, Updates etc. ins Leere. Die Firmware kann nicht gepatcht werden — die Boxen sprechen weiter ihr BMX-Cloud-Protokoll, nur niemand antwortet mehr.

BoseFix32 ist eine Firmware für einen handelsüblichen ESP32. Wer hier mitliest hat vermutlich eh schon einen ESP32 für andere FHEM-Sachen rumliegen — das reicht. Für die nicht-Bastler in der Familie (Mutti, Oma, der Nachbar mit der SoundTouch im Wohnzimmer): jeder 5-€-ESP32 vom Distributor tut's, geflasht wird per Chrome-Browser auf install.busware.de/bosefix/ — einmal "Connect" klicken, dauert ~30 Sekunden, fertig. Wer auch das nicht selbst machen will: ein technik-affiner Bekannter flasht den Stick einmalig, dann läuft er autonom im LAN. Keine Cloud, kein Account, kein Abo. Eine USB-Stromversorgung und WLAN reichen.

Was es kann:
  • SoundTouch 10 / 20 / 30 entdeckt sich via SSDP + Auto-Discovery
  • Migration in einem Klick: rewrite der Cloud-URLs am Speaker via Telnet :17000, Presets bleiben erhalten
  • TuneIn-Stations spielen direkt (Live-Resolver gegen radiotime.com)
  • Custom Stream-URLs als Preset (z.B. Fritzbox-Radio, RadioBrowser-Stationen)
  • DLNA / UPnP / Bluetooth-Presets als Passthrough — Speaker spricht den DLNA-Server eh direkt an, BoseFix32 reicht das ContentItem nur durch
  • Stereo-Pair / Multi-Room-Gruppen, NowPlaying-Telemetrie, Preset-Long-Press-Push
  • Web-UI auf http://bosefix.local/ für alles — discovery, migration, presets, gruppen
  • Diagnostic-Snapshot per Knopfdruck wenn was nicht klappt — JSON-Dump kann direkt an den Maintainer hochgeladen werden

Was es nicht kann:
  • Spotify (technisch möglich über Connect+OAuth, aber eigenes Projekt)
  • Amazon Prime Music (war nie eine eigene BMX-Source, lief nur über die App)
  • Andere Bose-Speaker als SoundTouch 10/20/30 — andere Modelle ungetestet

Installation: https://install.busware.de/bosefix/ — der Webflasher erkennt den ESP automatisch, Chrome / Edge öffnen, "Connect" klicken, fertig. Es geht jeder ESP32 den ihr rumliegen habt: classic, S3, C3, C6 — alle vier Targets werden gebaut und im Webflasher angeboten. Empfehlung wenn ihr neu kauft: ein ESP32-S3-DevKitC-1-N16R8 (~10 €) wegen 16 MB Flash und 8 MB PSRAM, mehr Headroom für künftige Features. Funktioniert aber auch auf einem 4-MB-ESP32 classic aus der Schublade.

Quellen:

Stand: v0.6.0 ist gerade frisch released (DLNA-Passthrough + Diagnostic-Snapshot). OTA-Update von älteren Versionen läuft.

Feedback, Bug-Reports und vor allem Snapshots von Geräten die exotische Source-Types nutzen sind willkommen — der Diagnostic-Snapshot-Knopf im WebUI lädt das direkt an mich hoch (ohne WLAN-Passwort, ohne Tokens — nur Speaker-MAC, FW-Version, Source-XMLs).

So long,
Dirk

P.S.: Ich war doch verwundert wie viele Bose-Nutzer es außer mir gibt und wie eine solche Firma einfach den Schalter umlegen kann — lasst es uns eine Warnung sein ...

tostmann


Antwort auf: https://forum.fhem.de/index.php?topic=144574.msg1363970#msg1363970

Schön, dass das Update durchgelaufen ist und DLNA jetzt wieder funktioniert. Zu deinen Punkten der Reihe nach:

DLNA-Preset NEU anlegen
Aktuell nein. BoseFix32 reicht ein DLNA-ContentItem, das der Speaker schon hatte, 1:1 wieder zurueck — er bringt also seine alten Presets ueber die Migration. Aber: einen DLNA-Server zu browsen (Ordner aufklappen, Track waehlen, als Preset speichern) heisst, einen UPnP/ContentDirectory-Client im ESP32 zu haben. Das ist substantieller Aufwand und steht aktuell nicht auf der Liste — ehrlicher Stand. Was als Workaround geht: wenn du die Stream-URL deines Fritzbox-Webradios oder einer DLNA-Quelle direkt kennst (z.B. aus der Fritzbox-UI rauskopiert), kannst du sie als "Direct stream (URL)" in BoseFix32 als Preset speichern. Das ist dann technisch INTERNET_RADIO, nicht STORED_MUSIC, aber fuer Webradio-Streams ist das identisch von der Funktion.

Spotify
Ehrlich nein. Spotify Connect vom Handy laeuft ja schon — der Speaker spricht da direkt mit dem Spotify-Dienst, BoseFix32 ist gar nicht im Pfad. Damit Playlists als Preset gehen wuerde, brauchen wir Spotify-OAuth + die Spotify-Web-API fuer Playlist-Browsing + die ContentItem-Struktur source="SPOTIFY". Das ist ein eigenes Projekt — kein "kommt naechste Woche". Vorlaeufiger Tipp: in der BoseConnect-/SoundTouch-Hardware-Buttons-1-6 ueber Spotify Connect zu mappen geht ja eh nicht, das funktioniert nur ueber dieses Long-Press am Speaker — und genau das macht BoseFix32 fuer alle anderen Quellen. Spotify ist die Luecke, ja.

bosest 7-20
Bose-Speaker haben hardware-seitig Buttons 1-6. Die Slots 7-20 die das FHEM-Modul "bosest" anbietet sind eine FHEM-Erweiterung — das Modul merkt sich die ContentItems lokal und sendet sie per /select an den Speaker, ohne dass es einen physischen Button-Press dafuer gaebe. Technisch interessant, BoseFix32 macht das aktuell nicht — denkbar als WebUI-Feature ("zusaetzliche Quick-Picks ohne Long-Press"), aber kein konkretes Date.

Amazon Prime Music in Bosman
Danke fuer den Hinweis. Wenn Bosman das hinkriegt waere das eine extra Source. Bei BoseFix32 nicht geplant — Amazon-API ist hostile, OAuth, Geo-Locked, das wird nur zum Frust.

Snapshot — welcher Speaker?
Der beste Snapshot fuer mich ist: ein bereits migrierter Speaker, der ein funktionierendes DLNA-Preset enthaelt. Also genau der, an dem du jetzt nach dem v0.6.0-Update das DLNA-Preset wieder siehst. Da lese ich das echte ContentItem im rohen XML-Format heraus und sehe, wie dein DLNA-Server (Fritzbox?) die UPnP-URL formatiert. Mit diesem Format kann ich beurteilen, ob man eine "DLNA-URL hinterlegen"-UI bauen koennte, ohne einen vollen UPnP-Browser zu implementieren. Snapshot frisch nach Reset oder vor Migration brauchst du nicht zu uebernehmen — frisch zurueckgesetzt hat eh nichts drin und unmigriert hat keine relevanten Daten mehr (Cloud ist aus). Klick einfach im WebUI auf den Speaker, dann auf "Diagnostic snapshot" → "Send to maintainer". Kein Account, kein Token, kein WLAN-Passwort enthalten.

6 von 8 Geraeten — der wichtigste Punkt
Das ist ein echter Bug oder Setup-Problem, dem will ich nachgehen. Was BoseFix32 macht:

  • SSDP-Multicast M-SEARCH auf 239.255.255.250:1900, ST=urn:schemas-upnp-org:device:MediaRenderer:1, 4 Sekunden lauschen
  • Bekannte IPs aus dem NVS (alle frueher gesehenen Speaker) abklopfen
  • Active-Scan ueber /24 wenn entsprechend konfiguriert
  • Manuelle IP: HTTP-GET http://IP:8090/info, erwartet wird ein XML mit "<info deviceID=...>"

Damit ein Speaker NICHT entdeckt wird, muss mindestens einer dieser Punkte fehlschlagen. Diagnose-Schritte die mir helfen wuerden:

  • Welche Bose-Modelle sind die 2 fehlenden? (SoundTouch 10/20/30, Wave SoundTouch, SoundTouch 130/300/520, Wireless Link Adapter, Soundbar, ...)
  • IP-Adressen der 2 fehlenden Speaker — bekommst du die aus deinem Router oder aus FHEM/bosest? Bitte gegen die manuell adden im BoseFix32-WebUI testen.
  • Wenn manuell-add fehlschlaegt: auf einer Shell folgendes absetzen:curl -v http://<fehlende-ip>:8090/infoBekommst du da ein XML zurueck das mit "<info deviceID=..." beginnt? Oder gibt es Connection-Refused / Timeout / anderen Inhalt?
  • Sind alle 8 Geraete im selben Subnetz (gleiches /24)? Multicast/SSDP geht nur innerhalb des Broadcast-Domain.
  • Hast du IGMP-Snooping auf deinem Switch oder Multicast-Filtering auf dem AP? Auf Aruba- oder Unifi-Setups verschluckt das gerne SSDP-Antworten — fuer 6 von 8 Geraeten klappt es dann zufallsverteilt.

Wenn du mir die Modelle der 2 fehlenden Speaker und das curl-Ergebnis vom /info-Endpoint nennst, finden wir die Ursache schnell. Bei einem v.a. Multicast-Problem koennte ich auch nochmal mehr Spam-Logging in den Discovery-Code einbauen — dann sieht man im seriellen Output von BoseFix32 welche IPs auf M-SEARCH antworten und welche nicht.

So long,
Dirk

fred_feuerstein

#2
ZitatDLNA-Preset NEU anlegen
Aktuell nein. BoseFix32 reicht ein DLNA-ContentItem, das der Speaker schon hatte, 1:1 wieder zurueck — er bringt also seine alten Presets ueber die Migration. Aber: einen DLNA-Server zu browsen (Ordner aufklappen, Track waehlen, als Preset speichern) heisst, einen UPnP/ContentDirectory-Client im ESP32 zu haben. Das ist substantieller Aufwand und steht aktuell nicht auf der Liste — ehrlicher Stand. Was als Workaround geht: wenn du die Stream-URL deines Fritzbox-Webradios oder einer DLNA-Quelle direkt kennst (z.B. aus der Fritzbox-UI rauskopiert), kannst du sie als "Direct stream (URL)" in BoseFix32 als Preset speichern. Das ist dann technisch INTERNET_RADIO, nicht STORED_MUSIC, aber fuer Webradio-Streams ist das identisch von der Funktion.

also ich habe hier einen Lautsprecher, der noch nicht migriert ist und die QUelle STORED_MUSIC noch kennt. Er hat 6 Presets, die alle auf den DLNA von der Fritzbox zeigen. Einmal einen MP3 Ordner auf der 1 und dann 2 bis 6 Radiosender von der Fritzbox.
So sieht es aus vor Migration: Bild1
Nach der Migration sieht es so aus: Bild2

im Webif von bosefix32 stehen alle presets drin. Aber wenn ich einen Preset an der Box einschalte, kommt auf dem Display: Preset noch nicht gewählt (oder so ähnlich). Und in der original Bose-App sehe ich auch, dass kein Medienserver zu sehen ist.
Wenn ich auf einen der Presets im Webif von bosefix klicke, um den auf der Box zu speichern kommt der Hinweis: Quelle nicht vorhanden. Also das geht so nicht.
Wüsste auch nicht, welchen Pfad als Direktstream ich eingeben sollte. Per XML curl kann man ja die Presets auch setzen von der Fritzbox als Quelle, aber auch nur wenn bereits der STORED_MUSIC hinterlegt ist. Denke, das ist eines der Hauptprobleme aktuell.
Von dieser Box sende ich Dir jetzt mal den Snapshot. (13:53 Uhr)

Hier muss ich also vorerst entweder Radiosender als direktstream einbinden oder über tunein. tunein lasse ich erstmal aussen vor.
Oder ich muss die Einrichtung der Box über die bosman-App machen und zu deren Server migrieren. In der App kann ich dann auf meine medienserver zugreifen und Quellen von dort setzen. Ziel wäre natürlich die Bosman-App nicht mehr zu benötigen.

ZitatSpotify
soweit verstanden. Ist also evtl. irgendwann mal ein separates Projekt :)

Zitatbosest 7-20
Das war gar nicht meine Erwartung, die SPeicherung von 7- 20 Presets. Hier reicht ja die Möglichkeit in BOSEST-FHEM. Denke in bosefix sollte erstmal der Standard laufen. :)

ZitatAmazon Prime Music in Bosman
Wie gesagt, war nur als Hinweis gedacht. kein momentanes todo etc. :)

ZitatSnapshot — welcher Speaker?
Der beste Snapshot fuer mich ist: ein bereits migrierter Speaker, der ein funktionierendes DLNA-Preset enthaelt. Also genau der, an dem du jetzt nach dem v0.6.0-Update das DLNA-Preset wieder siehst.
Genau so einen Lautsprecher habe ich nicht. Siehe oben. Nach der Migration sind die Presets nicht mehr an der Box verfügbar und der STORED_MUSIC ist weg.

Zitat6 von 8 Geraeten — der wichtigste Punkt
Das ist ein echter Bug oder Setup-Problem, dem will ich nachgehen. ...

  • 1. Welche Bose-Modelle sind die 2 fehlenden? (SoundTouch 10/20/30, Wave SoundTouch, SoundTouch 130/300/520, Wireless Link Adapter, Soundbar, ...)
  • 2. IP-Adressen der 2 fehlenden Speaker — bekommst du die aus deinem Router oder aus FHEM/bosest? Bitte gegen die manuell adden im BoseFix32-WebUI testen.
  • 3. Wenn manuell-add fehlschlaegt: auf einer Shell folgendes absetzen:
    curl -v http://<fehlende-ip>:8090/infoBekommst du da ein XML zurueck das mit "<info deviceID=..." beginnt? Oder gibt es Connection-Refused / Timeout / anderen Inhalt?
  • 4. Sind alle 8 Geraete im selben Subnetz (gleiches /24)? Multicast/SSDP geht nur innerhalb des Broadcast-Domain.
  • 5. Hast du IGMP-Snooping auf deinem Switch oder Multicast-Filtering auf dem AP? Auf Aruba- oder Unifi-Setups verschluckt das gerne SSDP-Antworten — fuer 6 von 8 Geraeten klappt es dann zufallsverteilt.

Wenn du mir die Modelle der 2 fehlenden Speaker und das curl-Ergebnis vom /info-Endpoint nennst, finden wir die Ursache schnell. Bei einem v.a. Multicast-Problem koennte ich auch nochmal mehr Spam-Logging in den Discovery-Code einbauen — dann sieht man im seriellen Output von BoseFix32 welche IPs auf M-SEARCH antworten und welche nicht.

zu 1: also es sind eine Soundtouch Portable und eine Soundtouch 30, die nicht gefunden werden und auch manuell nicht hinzugefügt werden können.
zu 2: die IP Adressen habe ich aus dem Router. Sind aber auch im FHEM BOSEST enthalten und die gleichen.

Der Scan findet sie nicht und manuell über IP geht auch nicht.

zu 3: im Browser oder in einer Shell kommt bei curl -v http://<fehlende-ip>:8090/info ein passendes xml:
<info deviceID="F4844C2FFCAB">
<name>EG_Kueche_ST30</name>
<type>SoundTouch 30</type>
<margeAccountUUID>cmp5q12324523452356325345235oaunh</margeAccountUUID>
<components>
<component>
<componentCategory>SCM</componentCategory>
<softwareVersion>
27.0.6.46330.5043500 epdbuild.trunk.hepdswbld04.2022-08-04T11:20:29
</softwareVersion>
<serialNumber>F81239457239457239457239057235940</serialNumber>
</component>
<component>
<componentCategory>PackagedProduct</componentCategory>
<serialNumber>069447981830183AE</serialNumber>
</component>
</components>
<margeURL>https://server.bosman.app</margeURL>
<networkInfo type="SCM">
<macAddress>F4844C2FFCAB</macAddress>
<ipAddress>192.168.123.191</ipAddress>
</networkInfo>
<networkInfo type="SMSC">
<macAddress>F4844C475155</macAddress>
<ipAddress>192.168.123.191</ipAddress>
</networkInfo>
<moduleType>sm2</moduleType>
<variant>mojo</variant>
<variantMode>normal</variantMode>
<countryCode>GB</countryCode>
<regionCode>GB</regionCode>
</info>
bei der portable kommt auch ein xml Ergebnis.
Und vor allem. In der orig. Bose-App sind alle Boxen zu finden, in fhem sind alle Boxen und in Boseman auch.

zu4: ja sind alle im gleichen Netz. Habe nur ein Subnetz zuhause. Ist zwar recht groß, aber nur ein subnetz.
zu5: das kann ich Dir nicht sagen. Ich habe nur Fritz-Geräte im Einsatz. Da ist zumindest nichts speziell konfiguriert oder speziell abgeschaltet was das betrifft.

Puh. Doch eine längere Nachtricht :)
Gruß, Fred

NEU: FHEM auf Raspberry PI 5, OS: Bookworm, mit Z-Wave RaZberry-Modul, 868CUL (WMBUS), LaCrosseCUL (Temp) und knapp 300 Devices aller Art

tostmann

Danke fuer die zwei Snapshots — sind beide angekommen und ausgewertet. Damit habe ich genau was ich brauchte.

Was im Snapshot vom unmigrierten SoundTouch 10 drin stand
Alle 6 Slots sind STORED_MUSIC mit Pfaden in deine FRITZ!Box als DLNA-Server. Beispiel-ContentItem fuer "Bayern 3":

<ContentItem source="STORED_MUSIC"
             location="4:cont2:615:part22:32"
             sourceAccount="<fritzbox-media-server-uuid>/0"
             isPresetable="true">
  <itemName>Bayern 3</itemName>
</ContentItem>

Wichtigste Erkenntnisse:
  • Das location-Attribut ist eine hierarchische UPnP-ObjectID, Fritzbox-spezifisches Format ("4:cont2:615:part22:32"). Die ist nicht raten, nur der DLNA-Server kennt sie.
  • Das sourceAccount besteht aus der UUID des DLNA-Servers + Slot-Index. Die UUID liefert der Speaker selbst via seinem "/listMediaServers"-Endpoint — bei dir stehen dort 4 Server drin (2× FRITZ!Box, 2× xupnpd).
  • Der Speaker kann ueber seine eigenen BMX-Endpoints ("getMediaServerNavigation", "playMediaServerNavigation") durch den DLNA-Server browsen. Heisst: ein "DLNA-Preset anlegen"-UI in BoseFix32 muss nicht selbst UPnP sprechen — wir lassen den Speaker das machen und reichen das ContentItem nur an /select weiter.

Damit ist STORED_MUSIC-Preset-Anlegen technisch realistisch konzipiert. Ich nehme das auf die Liste fuer eine v0.7 — keine Wochen-Versprechung, aber jetzt mit klarem Plan statt Spekulation.

Wichtige Beobachtung zum migrierten Speaker
Bei dem 2. Snapshot (OG_Bad_ST10weiss) zeigt die "margeServerUrl" auf "https://server.bosman.app". Du hast also einen Teil deiner Speaker schon auf das bosman.app-Projekt migriert, nicht zu BoseFix32. Das ist kein Problem, sehr interessant sogar: bei diesem Speaker sind Slots 2-6 LOCAL_INTERNET_RADIO (json-URLs auf "192.168.123.238"), Slot 1 ist STORED_MUSIC geblieben. Heisst: irgendeine Stelle (bosman.app oder du manuell?) hat die DLNA-Presets durch direkte Stream-URLs ersetzt. Wenn das automatisch passiert ist, ist das schlau — Webradio funktioniert dann ohne DLNA-Abhaengigkeit.

Discovery-Bug: 6 von 8 Geraeten
Diese Diagnose-Frage ist noch offen — im Snapshot stehen nur 2 Speaker drin. Wenn du Lust hast den Forensik-Pfad weiterzugehen:
  • Welche Modelle und IPs haben die restlichen 6 Geraete? Aus dem FHEM-bosest-Modul oder Router-DHCP-Tabelle lesbar.
  • Stehen alle 8 Geraete im gleichen 192.168.123.0/24? Multicast/SSDP geht nur innerhalb /24.
  • Versuche mal von der Pi-Konsole "curl -v http://<fehlende-ip>:8090/info" gegen eine der nicht-gefundenen IPs. Wenn die ein XML mit "<info deviceID=..." zurueckliefert, ist es ein Discovery-Problem; wenn nicht, ist es kein klassischer SoundTouch oder Port 8090 ist gefiltert.

Frage am Rande
Du hattest in deinem Post geschrieben "So sieht es aus:" und vermutlich einen Screenshot angehaengt. Der ist in deinem Posting leer geblieben — kein Anhang sichtbar. Wenn du den nochmal hochlaedst, kann ich gegenpruefen ob bei euch in der WebUI die Presets gleich angezeigt werden wie der Snapshot vermuten laesst.

So long,
Dirk

fred_feuerstein

#4
ah mist Du warst zu schnell oder ich zu langsam mit der Bearbeitung meines Beitrages, ich habe oben im Beitrag noch auf alle Fragen von Dir geantwortet. Schau es Dir oben nochmal an. Auch die Bilder sind jetzt dran.


... und ja, wegen dem Bosman... das ist für mich momentan die einzige Möglichkeit auf meine Medienserver (Fritzbox etc.) zuzugreifen. Deswegen muss ich bis es eine andere Lösung gibt, die Boxen nach den Tests wieder zu Bosman um-migrieren.

... und die Presets auf die json Files sind eine andere Variante, ohne jeglichen Server (bosman, bosefix, soundcork etc.). Hatte ich im anderen Thread bei meinen Tests erwähnt.
Gruß, Fred

NEU: FHEM auf Raspberry PI 5, OS: Bookworm, mit Z-Wave RaZberry-Modul, 868CUL (WMBUS), LaCrosseCUL (Temp) und knapp 300 Devices aller Art

tostmann

Kurzes Status-Update, damit du nicht im Dunkeln sitzt:

Ich habe heute Nachmittag im Lab mit deiner Konstellation nachgespielt — Bosman-App auf dem iPhone, ein lokaler minidlna als DLNA-Server, einer meiner SoundTouch 10 als Versuchsspeaker. Damit konnte ich das Verhalten reproduzieren:

  • Bosman setzt vor dem Speichern eines STORED_MUSIC-Presets ganz spezifisch einen sourceItem-Eintrag beim Speaker an, der die DLNA-Server-UUID als sourceAccount fuehrt und auf "READY" gesetzt ist. Erst dann funktioniert /select.
  • Nach Migration zu BoseFix32 ist genau dieser sourceItem-Eintrag weg — der Speaker faellt zurueck auf seinen Default "StoredMusicUserName", der UNAVAILABLE ist. Folge: dein gemerktes DLNA-ContentItem kommt mit "Quelle nicht vorhanden" beim /select-Versuch.
  • Mein erster Reparatur-Versuch (STORED_MUSIC + STORED_MUSIC_MEDIA_RENDERER in meinem account/full deklarieren, pro DLNA-Server eine eigene Source) wirkt nicht — der Speaker uebernimmt diese Eintraege aus dem account/full einfach nicht. Bosman scheint also nicht ueber account/full den sourceItem zu setzen, sondern ueber einen aktiven Push direkt zur Speaker-API. Genau diesen Push-Mechanismus muss ich noch finden.

Danke fuer deine Geduld und die Snapshots, das war Gold wert. Melde mich ...

So long,
Dirk