[Neues Modul] BOSE SoundTouch

Begonnen von dominik, 05 Januar 2016, 22:28:40

Vorheriges Thema - Nächstes Thema

Prof. Dr. Peter Henning

#720
So, mäßig gute Nachrichten.

Korrektur: geht doch ...

Ab der Firmware 27.xx gibt es keinerlei Telnet-Zugriff mehr auf die BOSE-Geräte. Und zwar weder über die hier beschriebene alte Methode: https://flarn2006.blogspot.com/2014/09/hacking-bose-soundtouch-and-its-linux.html. Noch über den Trick mit einer leeren remote_services-Datei auf einem USB-Stick.

Wenn man also die aktuelle Firmware drauf hat, kann man sich die Installation des Soundcork-Zeugs sparen  :'(

Und da BOSE einen Rollback-Schutz eingebaut hat, geht auch Downgrade der Firmware nicht mehr  >:(  >:(

Die einzige Lösung also: Box so lassen, wie sie ist. Auch nicht den kompletten Internet-Zugang sperren. Sondern nur in der FritzBox (oder was man sonst benutzt) eine Kindersicherung mit "gesperrten Internetseiten" einrichten, und zwar
Zitatstreaming.bose.com
events.api.bosecm.com
content.api.bose.io
worldwide.bose.com
api.bose.com
bose.com
Ich bin noch am Ausprobieren, ob ich mit einem (sowieso vorhandenen) Reverse Proxy die Radiostreams der Fritzbox als lokale dateien maskieren kann. [/s]

LG

pah
Zitat von: betateilchen am 11 Januar 2026, 19:53:41Mangels USB Stick mit microUSB Anschluss komme ich heute nicht mehr weiter...

Zwei ältere USB-Kabel, Seitenschneider, Lötkolben war meine Lösung dafür.

FlatTV

Ich bin enttäuscht  :o
Aber danke für das Feedback.

@betateilchen
welche Version hattest denn du auf deiner Box?
Raspi4 - im wesentlichen mit Phoscon, HomeMatic ( aktuell über debmatic), CUL, BOSE-ST und Alexa (Connector)

FlatTV

#722
Es hat mir jetzt keine Ruhe gelassen.
Bose ST 20 mit Firmware 27.0.6.46330.5043500
Vom FAT32 USB mit der leeren Datei remote_services drauf gebootet.

root@vuduo4kse:~# telnet 192.168.178.21
Connected to 192.168.178.21

Entering character mode
Escape character is '^]'.


... --- ..- -. -.. - --- ..- -.-. ....

        ____  ____  _____ _________
       / __ )/ __ \/ ___// _______/
      / __  / / / /\__ \/ __/
 ____/ /_/ / /_/ /___/ / /___
/_________/\____//____/_____/


spotty login: root
eth0      Link encap:Ethernet  HWaddr B0:D5:CC:AF:B4:16 
lo        Link encap:Local Loopback 
          inet addr:127.0.0.1  Mask:255.0.0.0
usb0      Link encap:Ethernet  HWaddr AA:CC:CB:31:EA:CB 
          inet addr:203.0.113.1  Bcast:0.0.0.0  Mask:255.255.255.252
wlan0     Link encap:Ethernet  HWaddr 5C:F8:21:EE:2F:31 
          inet addr:192.168.178.21  Bcast:192.168.178.255  Mask:255.255.255.0
wlan1     Link encap:Ethernet  HWaddr 5C:F8:21:EE:2F:32 

Thu Jan 15 21:21:11 CET 2026

Device name: "BOSE_Kueche"
Country GB, Region GB

root@spotty:~# cat /opt/Bose/etc/SoundTouchSdkPrivateCfg.xml
<?xml version="1.0" encoding="utf-8"?>
<SoundTouchSdkPrivateCfg>
  <margeServerUrl>https://streaming.bose.com</margeServerUrl>
  <statsServerUrl>https://events.api.bosecm.com</statsServerUrl>
  <swUpdateUrl>https://worldwide.bose.com/updates/soundtouch</swUpdateUrl>
  <usePandoraProductionServer>true</usePandoraProductionServer>
  <isZeroconfEnabled>true</isZeroconfEnabled>
  <saveMargeCustomerReport>false</saveMargeCustomerReport>
  <bmxRegistryUrl>https://content.api.bose.io/bmx/registry/v1/services</bmxRegistryUrl>
</SoundTouchSdkPrivateCfg>
root@spotty:~#
Raspi4 - im wesentlichen mit Phoscon, HomeMatic ( aktuell über debmatic), CUL, BOSE-ST und Alexa (Connector)

Prof. Dr. Peter Henning

#723
Witzig. Ich habe auch 27.0.6.46330.5043500, und vier Versuche haben zu nichts geführt.

Der guten Dinge sind fünf, ich melde mich mit dem Resultat.

Hier ist es: Geht doch. Es fehlte offensichtlich das "bootable"-Flag auf dem USB-Stick, nachdem ich das gesetzt habe, ging es jedenfalls.
I stand corrected.

LG

pah


Prof. Dr. Peter Henning

#724
Ich bin ganz begeistert davon, was man hier sehen kann. Die Datei Sources.xml hat im Original auf der St20 den Inhalt

<?xml version="1.0" encoding="UTF-8" ?>
<sources>
    <source displayName="AUX IN" secret="" secretType="">
        <sourceKey type="AUX" account="AUX" />
    </source>
    <source secret="" secretType="token">
        <sourceKey type="INTERNET_RADIO" account="" />
    </source>
    <source secret="xxx" secretType="token">
        <sourceKey type="LOCAL_INTERNET_RADIO" account="" />
    </source>
    <source displayName="MinimServer[NAS-2]" secret="" secretType="">
        <sourceKey type="STORED_MUSIC" account="xx" />
    </source>
    <source displayName="BeeTwo: minidlna" secret="" secretType="">
        <sourceKey type="STORED_MUSIC" account="xx" />
    </source>
    <source secret="xxx" secretType="token">
        <sourceKey type="TUNEIN" account="" />
    </source>
</sources>
Die erste Frage ist, warum INTERNET_RADIO und LOCAL_INTERNET_RADIO ebenso wie TUNEIN ohne displayName sind.
Und die zweite Frage ist, wie ich das auf die Internet-Radiostationen der Fritzbox umbiegen kann.
LG

pah

Prof. Dr. Peter Henning

Ich habe die Prozedur jetzt für eine ST10 wiederholt.
Mit dem Erfolg, dass nach dem Reboot gar nichts mehr geht. Die Box sucht zwar das WLAN - verbindet sich aber nicht. Drücken von 2 und Vol- sollte sie in den Konfigurationszustand versetzen, tut es aber nicht. Drücken von 1 und Vol- sollte sie auf Werkseinstellungen zurücksetzen, tut es aber nicht.

Sieht so aus, als ob das Teil gebrickt sei...

Möglicherweise mein eigener Fehler, die Box war Teil eines Stereopaars, und ich habe die beiden vorher nicht getrennt.

 :(  :(

LG

pah

fred_feuerstein

Versuche mal das Firmware-Update per USB.
Per USB kannst Du auch downgraden wie du willst. Habe meine portable Testbox schon auf ganz alte Firmware downgegraded zum Test.

Alle Firmwares für mit/ohne Bluetooth Geräte gibts hier:
https://archive.org/download/bose-soundtouch-software-and-firmware/

Anleitung für USB-Update der verschiedenen Gerätevarianten hier:
https://downloads.bose.com/ced/soundtouch/soundtouch_usb/index.html?l=de
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
ALT: FHEM auf Raspberry PI 3B+ im 7Zoll TouchDisplay Gehäuse, OS: Bullseye, mit Z-Wave RaZberry-Modul, 868CUL (WMBUS), LaCrosseCUL (Temp)

Prof. Dr. Peter Henning

OK, Danke für den Hinweis.

Kiste ist wieder ent-brickt. Also sollte man vorsichtig sein, und ein Stereopaar erst trennen, bevor man es hackt. Wie man das später wieder zusammenführt, sei mal dahingestellt.

Jetzt gibt es nur noch eine Million Fehlermeldungen und 404-Errors, wenn die auf den soundcork-server zugreifen. Morgen ist auch noch ein Tag...

LG

pah


FlatTV

bist du eigentlich mit dem soundcork ebenfalls auf Ubuntu unterwegs?
Raspi4 - im wesentlichen mit Phoscon, HomeMatic ( aktuell über debmatic), CUL, BOSE-ST und Alexa (Connector)

Prof. Dr. Peter Henning

#729
Ja, Ubuntu 24.04.

Ich stolpere gerade über Inkonsistenzen zwischen Dokumentation und Realität des soundcork Servers.

Laut Dokumentation unter http://<soundcorkip>:8000/docs funktionieren folgende Aufrufe
Zitathttp://<soundcorkip>:8000/marge/streaming/sourceproviders
OK, liefert eine XML-Datei, allerdings ohne sauberen CONTENT-TYPE:
Zitat<sourceProviders>
<sourceprovider id="1">
<createdOn>2012-09-19T12:43:00.000+00:00</createdOn>
<name>PANDORA</name>
<updatedOn>2012-09-19T12:43:00.000+00:00</updatedOn>
</sourceprovider>
...
</sourceprovider>

Zitathttp://<soundcorkip>:8000/marge/streaming/account/<xxxx>/provider_settings
OK, liefert eine XML-Datei, allerdings ebenfalls ohne sauberen CONTENT-TYPE:

Zitat<providerSettings>
<providerSetting>
<boseId><xxxxx></boseId>
<keyName>ELIGIBLE_FOR_TRIAL</keyName>
<value>true</value>
<providerId>14</providerId>
</providerSetting>
</providerSettings>
Warum allerdings da steht ELIGIBLE_FOR_TRIAL, ist mir undurchsichtig...

Ferner
Zitathttp://<soundcorkip>:8000/marge/streaming/account/<xxxx>/full
==> Liefert einen "Internal Server Error"

Ferner
Zitathttp://<soundcorkip>:8000/marge/streaming/account/<xxxx>/device/<yyyy>/presets
==> Liefert einen "Internal Server Error"

Das sieht also so aus, als ob keine Leseoperationen vom Datenverzeichnis erfolgen können.

Beim Startup liefert mir der soundcork-server
ZitatFastAPI   Starting production server 🚀
 
             Searching for package file structure from directories with __init__.py files
2026-01-17 10:44:01,274 [soundcork.datastore] INFO: Initiating Datastore
             Importing from /root/soundcork
 
    module   📁 soundcork     
             ├── 🐍 __init__.py
             └── 🐍 main.py   
 
      code   Importing the FastAPI app object from the module with the following code:
 
             from soundcork.main import app
 
       app   Using import string: soundcork.main:app
 
    server   Server started at http://0.0.0.0:8000
    server   Documentation at http://0.0.0.0:8000/docs
 
             Logs:
 
      INFO   Started server process [586898]
2026-01-17 10:44:01,451 [uvicorn.error] INFO: Started server process [586898]
      INFO   Waiting for application startup.
2026-01-17 10:44:01,453 [uvicorn.error] INFO: Waiting for application startup.
2026-01-17 10:44:01,455 [soundcork.main] INFO: Starting up soundcork

... Hier diverse Fehlermeldungen von IP-Adressen, die keine BOSE-Boxen sind ...

2026-01-17 10:44:08,674 [soundcork.datastore] INFO: Discovering upnp devices on the network
2026-01-17 10:44:08,675 [soundcork.datastore] INFO: Discovered Bose devices:
- SoundtouchOG
- SoundTouchEG
- SoundTouchDG2
- SoundTouchDG1
2026-01-17 10:44:08,675 [soundcork.main] INFO: done starting up server
      INFO   Application startup complete.
2026-01-17 10:44:08,675 [uvicorn.error] INFO: Application startup complete.
      INFO   Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
2026-01-17 10:44:08,680 [uvicorn.error] INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
      INFO   192.168.0.105:54420 - "GET /marge/streaming/sourceproviders HTTP/1.1" 200
      INFO   192.168.0.105:54422 - "GET /marge/streaming/account/<xxxx>/full HTTP/1.1" 500
     ERROR   Exception in ASGI application
Traceback (most recent call last):
  File "/root/soundcork/.venv/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 986, in run
    result = context.run(func, *args)
             ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/root/soundcork/soundcork/main.py", line 176, in account_full
    xml = account_full_xml(account, datastore)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/root/soundcork/soundcork/marge.py", line 338, in account_full_xml
    for device_id in next(walk(account_dir))[1]:
                     ^^^^^^^^^^^^^^^^^^^^^^^
StopIteration

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/root/soundcork/.venv/lib/python3.12/site-packages/uvicorn/protocols/http/httptools_impl.py", line 416, in run_asgi
    result = await app(  # type: ignore[func-returns-value]
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/root/soundcork/.venv/lib/python3.12/site-packages/uvicorn/middleware/proxy_headers.py", line 60, in __call__
    return await self.app(scope, receive, send)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/root/soundcork/.venv/lib/python3.12/site-packages/fastapi/applications.py", line 1134, in __call__
    await super().__call__(scope, receive, send)
  File "/root/soundcork/.venv/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__
    await self.middleware_stack(scope, receive, send)
  File "/root/soundcork/.venv/lib/python3.12/site-packages/starlette/middleware/errors.py", line 186, in __call__
    raise exc
  File "/root/soundcork/.venv/lib/python3.12/site-packages/starlette/middleware/errors.py", line 164, in __call__
    await self.app(scope, receive, _send)
  File "/root/soundcork/.venv/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 63, in __call__
    await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
  File "/root/soundcork/.venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
    raise exc
  File "/root/soundcork/.venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
    await app(scope, receive, sender)
  File "/root/soundcork/.venv/lib/python3.12/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in __call__
    await self.app(scope, receive, send)
  File "/root/soundcork/.venv/lib/python3.12/site-packages/starlette/routing.py", line 716, in __call__
    await self.middleware_stack(scope, receive, send)
  File "/root/soundcork/.venv/lib/python3.12/site-packages/starlette/routing.py", line 736, in app
    await route.handle(scope, receive, send)
  File "/root/soundcork/.venv/lib/python3.12/site-packages/starlette/routing.py", line 290, in handle
    await self.app(scope, receive, send)
  File "/root/soundcork/.venv/lib/python3.12/site-packages/fastapi/routing.py", line 124, in app
    await wrap_app_handling_exceptions(app, request)(scope, receive, send)
  File "/root/soundcork/.venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
    raise exc
  File "/root/soundcork/.venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
    await app(scope, receive, sender)
  File "/root/soundcork/.venv/lib/python3.12/site-packages/fastapi/routing.py", line 110, in app
    response = await f(request)
               ^^^^^^^^^^^^^^^^
  File "/root/soundcork/.venv/lib/python3.12/site-packages/fastapi/routing.py", line 390, in app
    raw_response = await run_endpoint_function(
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/root/soundcork/.venv/lib/python3.12/site-packages/fastapi/routing.py", line 291, in run_endpoint_function
    return await run_in_threadpool(dependant.call, **values)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/root/soundcork/.venv/lib/python3.12/site-packages/starlette/concurrency.py", line 38, in run_in_threadpool
    return await anyio.to_thread.run_sync(func)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/root/soundcork/.venv/lib/python3.12/site-packages/anyio/to_thread.py", line 63, in run_sync
    return await get_async_backend().run_sync_in_worker_thread(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/root/soundcork/.venv/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 2502, in run_sync_in_worker_thread
    return await future
           ^^^^^^^^^^^^
RuntimeError: coroutine raised StopIteration
...

Das Ding fliegt also genau bei diesem <account>/full auf die Nase. Ich habe das schon in Github gepostet, bisher noch keine Reaktion.

LG

pah