A whole-house project converting seven IKEA SYMFONISK and Sonos speakers from proprietary systems to Raspberry Pi-based open-source audio players — escaping vendor lock-in while keeping the original hardware intact.
Source code & docs: github.com/papadopouloskyriakos/opensymf
Why?
Sonos ended support for older speakers, stranding them on a frozen S1 platform with no future updates or integration with newer devices. IKEA SYMFONISK speakers, being Sonos-based internally, face the same fate. Rather than accept planned obsolescence, this project replaces the proprietary brains while keeping the original power supplies, speaker drivers, buttons, and LEDs.
The Fleet
| Qty | Speaker | DAC/Amp | GPIO | Status |
|---|---|---|---|---|
| 4× | IKEA SYMFONISK Bookshelf (Gen 2) | IQaudIO DigiAMP+ SC0370 | Buttons + LEDs | Complete |
| 2× | IKEA SYMFONISK Picture Frame | IQaudIO DigiAMP+ SC0370 | Audio only | Partial |
| 1× | Sonos Play:5 (Gen 1) | HiFiBerry DAC+ | N/A (line-in) | Complete |
All speakers run on a Raspberry Pi Zero 2 WH with piCorePlayer , controlled via Lyrion Music Server and integrated with Home Assistant .
Two Conversion Approaches
SYMFONISK speakers — The original Sonos board handles everything (DAC + amplification), so the IQaudIO DigiAMP+ replaces both functions and drives the passive speaker drivers directly through its screw terminals. Full gut job: the Sonos board comes out, the Pi goes in.
Sonos Play:5 Gen 1 — Already has five Class-D amplifiers, six drivers, and a line-in jack. A RPi Zero + HiFiBerry DAC+ plugged into the line-in was all it needed — the original board is still inside, completely untouched. The simplest conversion of the lot.
Hardware Architecture (Bookshelf Speakers)
┌─────────────────────────────────────────────────────────────────┐
│ IKEA SYMFONISK Shell │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Original Power Supply (retained) │ │
│ └──────────────────────────┬───────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────▼───────────────────────────────┐ │
│ │ IQaudIO DigiAMP+ SC0370 │ │
│ │ (DAC + 2×23W Class-D Amplifier) │ │
│ └──────────────────────────┬───────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────▼───────────────────────────────┐ │
│ │ Raspberry Pi Zero 2 WH │ │
│ │ │ │
│ │ GPIO ────► Front Panel: 3 Buttons + 4 LEDs │ │
│ │ (via FPC breakout board) │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────▼───────────────────────────────┐ │
│ │ Original Speaker Drivers (retained) │ │
│ └──────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
GPIO Mapping
The SYMFONISK Bookshelf Gen 2 front panel uses a WOW B NFC/KEY BOARD P0.3 (16-pin FPC, 1.0mm pitch). None of this is documented by IKEA or Sonos — every pin was traced with a multimeter.
| Component | GPIO | RPi Pin | Function |
|---|---|---|---|
| Green LED | 13 | Pin 33 | Boot health check passed |
| White LED | 5 | Pin 29 | Normal operation |
| Amber LED | 17 | Pin 11 | Squeezelite issue |
| Red LED | 6 | Pin 31 | Server unreachable |
| Play/Pause | 27 | Pin 13 | Player control |
| Volume + | 23 | Pin 16 | Volume up |
| Volume - | 24 | Pin 18 | Volume down |
Full pinout table with wire colors and PCB photos: GPIO_PINOUT.md
LED Status Signaling
Custom scripts give the original four LEDs meaningful status:
On boot — health checks run (disk space, CPU temp, WiFi, internet connectivity). 3× green blink = all systems go.
During operation — continuous 5-second polling:
| LED | Meaning |
|---|---|
| White | Normal — Squeezelite running, server reachable |
| Amber | Warning — Squeezelite not running |
| Red | Error — Lyrion Music Server unreachable |
Self-Healing WiFi Recovery
The biggest operational headache with a fleet of WiFi-connected Pis was connection drops requiring manual power cycling — not practical when speakers are mounted on walls or tucked behind furniture. A progressive recovery system is integrated into the monitoring scripts:
- WiFi power management disabled at startup (
iwconfig wlan0 power off) - After ~1 min of failures →
wpa_cli reassociate - After ~3 min → full WiFi interface restart (
ifdown/ifup) - After ~5 min → system reboot (max 3 attempts — prevents boot loops)
All recovery attempts logged to /tmp/wifi_recovery.log. Since deploying this, zero manual power cycles needed.
Software Stack
| Component | Purpose |
|---|---|
| piCorePlayer | Lightweight audio OS (RAM-based) |
| Lyrion Music Server | Music library and streaming |
| Squeezelite | Audio player client |
| sbpd | Physical button daemon (GPIO → Squeezelite commands) |
| Home Assistant | Automation, TTS, presence-based playback |
Home Assistant Integration
- Presence-based playback (music starts/stops when people arrive/leave)
- Radio station presets triggered by automations
- TTS announcements across specific rooms or whole house
- Volume control via automations and dashboards
Lessons Learned
- piCorePlayer’s RAM-based OS is great for reliability but unforgiving — one bad
taroperation and you’re pulling the SD card for recovery. Alwayspcp buafter changes. - WiFi power management on the Pi is the silent killer of connection stability. Disable it at boot or speakers will silently drop off the network.
- Different speakers need different approaches — the SYMFONISK needed a full board replacement, the Play:5 just needed a cable. Assess what the hardware already provides before ripping things apart.
- The SYMFONISK Picture Frame uses different internal cabling than the bookshelf model — same concept but the ribbon cable dimensions and LED types don’t translate 1:1.
Known Issues
- Picture Frame speakers: ribbon cable incompatible with bookshelf FPC connector, LED appears to be addressable (not simple GPIO). Audio works, button/LED integration pending.
- Multi-room sync: works excellently via native Lyrion Music Server (~2-3ms precision). Music Assistant’s built-in SlimProto does not yet achieve comparable sync quality.
Source Code
Scripts, GPIO pinout documentation, hardware reference, and datasheets:
github.com/papadopouloskyriakos/opensymf
Inspired by MagPi Magazine #139 — “Upcycle a Sonos Play:1” by PJ Evans
