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

QtySpeakerDAC/AmpGPIOStatus
IKEA SYMFONISK Bookshelf (Gen 2)IQaudIO DigiAMP+ SC0370Buttons + LEDsComplete
IKEA SYMFONISK Picture FrameIQaudIO DigiAMP+ SC0370Audio onlyPartial
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.

ComponentGPIORPi PinFunction
Green LED13Pin 33Boot health check passed
White LED5Pin 29Normal operation
Amber LED17Pin 11Squeezelite issue
Red LED6Pin 31Server unreachable
Play/Pause27Pin 13Player control
Volume +23Pin 16Volume up
Volume -24Pin 18Volume 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:

LEDMeaning
WhiteNormal — Squeezelite running, server reachable
AmberWarning — Squeezelite not running
RedError — 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:

  1. WiFi power management disabled at startup (iwconfig wlan0 power off)
  2. After ~1 min of failures → wpa_cli reassociate
  3. After ~3 min → full WiFi interface restart (ifdown/ifup)
  4. 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

ComponentPurpose
piCorePlayerLightweight audio OS (RAM-based)
Lyrion Music ServerMusic library and streaming
SqueezeliteAudio player client
sbpdPhysical button daemon (GPIO → Squeezelite commands)
Home AssistantAutomation, 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 tar operation and you’re pulling the SD card for recovery. Always pcp bu after 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