Documentation for controlling and preserving Bose SoundTouch devices
Understanding and troubleshooting device identification in SoundTouch service
This guide explains how the SoundTouch service handles device identification through MAC address to serial number mapping, and how to troubleshoot related issues.
The SoundTouch service uses two different identifiers for devices:
A81B6A536A98) - Used in HTTP API requests and UPnP discoveryI6332527703739342000020) - Used for internal file storageThe service automatically maps between these identifiers so that API requests using MAC addresses can access files stored using serial numbers.
1. HTTP Request: GET /streaming/account/3230304/device/A81B6A536A98/presets
2. MAC Resolution: A81B6A536A98 β I6332527703739342000020
3. File Access: accounts/3230304/devices/I6332527703739342000020/Presets.xml
The service extracts MAC addresses from UPnP device descriptions:
<!-- From http://192.168.1.100:8091/XD/BO5EBO5E-F00D-F00D-FEED-A81B6A536A98.xml -->
<root xmlns="urn:schemas-upnp-org:device-1-0">
<device>
<friendlyName>Sound Machinery</friendlyName>
<modelName>SoundTouch 10</modelName>
<serialNumber>A81B6A536A98</serialNumber> <!-- MAC address here -->
</device>
</root>
The mapping is created automatically when the service starts:
data/accounts/{account}/devices/{serial}/The service handles all common MAC address formats automatically:
| Format | Example | Status |
|---|---|---|
| Standard | A81B6A536A98 |
β Supported |
| Lowercase | a81b6a536a98 |
β Supported |
| With Colons | A8:1B:6A:53:6A:98 |
β Supported |
| With Dashes | A8-1B-6A-53-6A-98 |
β Supported |
| Mixed Case | a81B6a536A98 |
β Supported |
| With Spaces | ` A81B6A536A98 ` | β Supported |
Symptoms:
GET /streaming/account/3230304/device/A81B6A536A98/presets
β 500 Internal Server Error
β Log: "open .../devices/A81B6A536A98/Presets.xml: no such file or directory"
Diagnosis:
# Look for device directory
ls data/accounts/3230304/devices/
# Should show serial numbers like: I6332527703739342000020
cat data/accounts/3230304/devices/I6332527703739342000020/DeviceInfo.xml
# Look for <macAddress> field
Solutions:
The mapping is created at startup. Simply restart:
sudo systemctl restart soundtouch-service
Ensure the MAC address is present:
<info deviceID="I6332527703739342000020">
<networkInfo type="SCM">
<macAddress>A81B6A536A98</macAddress> <!-- Must be present -->
<ipAddress>192.168.178.35</ipAddress>
</networkInfo>
</info>
If the device was added manually, ensure proper structure:
# Create device directory using serial number
mkdir -p data/accounts/3230304/devices/I6332527703739342000020
# Create DeviceInfo.xml with MAC address
cat > data/accounts/3230304/devices/I6332527703739342000020/DeviceInfo.xml << EOF
<?xml version="1.0" encoding="UTF-8"?>
<info deviceID="I6332527703739342000020">
<name>My SoundTouch Device</name>
<networkInfo type="SCM">
<macAddress>A81B6A536A98</macAddress>
<ipAddress>192.168.1.100</ipAddress>
</networkInfo>
</info>
EOF
Check UPnP accessibility:
# Test UPnP endpoint directly
curl http://192.168.1.100:8091/XD/BO5EBO5E-F00D-F00D-FEED-A81B6A536A98.xml
# Should return XML with <serialNumber> field
Enable debug logging:
# Check service logs for UPnP activity
journalctl -u soundtouch-service -f | grep UPnP
This should be handled automatically, but you can verify:
Test different formats:
# All of these should work the same:
curl http://localhost:8000/streaming/account/3230304/device/A81B6A536A98/presets
curl http://localhost:8000/streaming/account/3230304/device/a81b6a536a98/presets
curl http://localhost:8000/streaming/account/3230304/device/A8:1B:6A:53:6A:98/presets
The service logs mapping creation at startup:
journalctl -u soundtouch-service | grep "MAC.*serial"
Ensure proper directory organization:
data/
βββ accounts/
βββ 3230304/
βββ devices/
βββ I6332527703739342000020/ # Serial number directory
βββ DeviceInfo.xml # Contains MAC address
βββ Presets.xml
βββ Sources.xml
For developers interested in the technical details:
// MAC addresses are normalized by:
// 1. Removing spaces, colons, and dashes
// 2. Converting to uppercase
// Examples:
// "a8:1b:6a:53:6a:98" β "A81B6A536A98"
// "A8-1B-6A-53-6A-98" β "A81B6A536A98"
// 1. Try exact match first
// 2. If not found, try normalized version
// 3. Return serial number for file access