Multiroom Audio (Lyrion Music Server)¶
Last Updated: 2026-08-02 Status: ⚠️ Music playback working — Audiobookshelf to kitchen speakers not yet implemented
Purpose¶
Whole-home audio across the kitchen and living room, playing the music library hosted on Lotus. The kitchen runs a wired I2S DAC/amp; the living room is reached over Chromecast because the Sony HT-A9 has no free wired input.
Lyrion Music Server (LMS, formerly Logitech Media Server) is the server and sync engine. It replaced an earlier Music Assistant + Snapcast attempt that was not reliable enough.
Location¶
| Hosted on | Lotus (primary NAS) |
| Container name | Lyrion Music Server |
| Local URL | http://192.168.1.83:9000 |
| External URL | None |
Architecture¶
Lotus — Lyrion Music Server (Docker, br0, 192.168.1.83)
├── Plex plugin → music library at data/media/music
├── Squeezelite client → Kitchen Pi → HiFiBerry MiniAMP → speakers
└── Castbridge plugin → Sony HT-A9 Chromecast (Living Room)
Control
└── Home Assistant Squeezebox integration → media_player entities
└── Kitchen tablet (Surface Go 2, 192.168.1.178) → HA dashboard
| Device | Role | IP | VLAN |
|---|---|---|---|
| LMS container on Lotus | Music server | 192.168.1.83 (br0, its own LAN IP) | Main LAN |
| Kitchen Pi (CM4) | Squeezelite player | 192.168.20.254 | IoT VLAN 20 |
| Sony HT-A9 | Chromecast endpoint | 192.168.20.21 | IoT VLAN 20 |
| Surface Go 2 | Kitchen control tablet | 192.168.1.178 | Main LAN |
Kitchen Pi¶
- Raspberry Pi CM4 in a Waveshare carrier board
- OS: Debian 12 (Bookworm) with the official Raspberry Pi kernel (
rpt-rpi-v8) — not Raspberry Pi OS, but with full Pi firmware support includingconfig.txtanddtoverlay - Audio HAT: HiFiBerry Pi Zero MiniAMP (PCM5102A DAC + TPA3118 amp)
- Network: USB WiFi dongle, locked to the Living Room AP, IoT VLAN 20
Sony HT-A9¶
No wired audio input is available — HDMI is occupied, and there is no optical or analogue input. Chromecast built-in is the only viable endpoint protocol. Sample-accurate sync with the kitchen is therefore not achievable, which is accepted: the rooms are separate and are not heard from the same position.
Configuration¶
LMS container (Lotus)¶
| Network type | br0 with static IP 192.168.1.83 |
| Port | 9000 (no port mappings needed on br0) |
| Appdata | /mnt/cache/appdata/lyrion |
| Music path | data/media/music |
br0 is required, not a preference — bridge/NAT mode breaks mDNS, so Castbridge
cannot discover Chromecast devices. It also avoids the port 9000 clash with Mealie.
Castbridge plugin¶
Not available through the LMS plugin manager — the SourceForge plugin repo URL changed. Install manually, then restart the container:
cd /mnt/cache/appdata/lyrion/cache/Plugins
curl -L https://github.com/philippe44/LMS-Cast/releases/download/2.2.8/CastBridge-2.2.8.zip -o CastBridge.zip
unzip CastBridge.zip && rm CastBridge.zip
In LMS → Manage Plugins → Chromecast bridge:
- Network binding: tick Use LMS interface
- Port starts from:
35000 - LMS Server:
192.168.1.83
The fixed port matters. Castbridge runs its own HTTP server, separate from LMS, to serve audio to Chromecast devices. Left to itself it picks a random high port which the IoT → main LAN firewall blocks, so the Sony connects but plays nothing.
Kitchen Pi — audio overlay¶
/boot/firmware/config.txt:
dtparam=audio=off # disable onboard BCM2835 audio
dtoverlay=hifiberry-dac # MiniAMP is a PCM5102A = hifiberry-dac
# NOT hifiberry-dacplus (that is for the PCM5122)
Kitchen Pi — Squeezelite¶
sudo apt install -y squeezelite
The Debian init script silently ignores SL_OPTIONS in /etc/default/squeezelite
and cannot pass the -s server flag, so use a native unit instead.
/etc/systemd/system/squeezelite.service:
[Unit]
Description=Squeezelite - Lightweight headless Squeezebox emulator
After=network.target sound.target
[Service]
Type=simple
ExecStart=/usr/bin/squeezelite -n Kitchen -o sysdefault:CARD=sndrpihifiberry -s 192.168.1.83 -V ""
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now squeezelite
-V "" is required: the PCM5102A has no hardware ALSA mixer, and without the flag
Squeezelite probes for one, causing instability and volume-control failures.
Kitchen Pi — WiFi power management¶
Disabled to prevent dropouts. /etc/NetworkManager/conf.d/wifi-powersave.conf:
[connection]
wifi.powersave = 2
sudo systemctl restart NetworkManager
Network¶
UniFi firewall rules¶
| Direction | Source | Destination | Ports | Purpose |
|---|---|---|---|---|
| IoT → Main LAN | IoT VLAN 20 | 192.168.1.83 | TCP 9000, 3483, 35000 | Squeezelite + Castbridge audio stream |
| Main LAN → IoT | 192.168.1.83 | 192.168.20.21 | TCP 8009 | Castbridge → Chromecast control |
| Main LAN → IoT | Any | 192.168.20.254 | TCP 22 | SSH to the Pi |
Organised in UniFi as a port group LMS Ports (9000, 3483, 35000) and a device group LMS Server (192.168.1.83).
Source port on these rules must be Any — see the lessons below.
mDNS¶
UniFi mDNS is set to Auto, which handles Chromecast discovery across VLANs.
Home Assistant¶
Settings → Devices & Services → Add Integration → Squeezebox, server
192.168.1.83, port 9000. This creates media_player.kitchen and
media_player.ht_a9 (names may vary).
The kitchen tablet dashboard uses mini-media-player (HACS) per player:
type: custom:mini-media-player
entity: media_player.kitchen
name: Kitchen
artwork: cover
HA's group controls are the better interface for multiroom — LMS's own Stop command stops only the targeted player in a sync group, not the whole group.
Playback Flows¶
Music (multiroom): HA dashboard or LMS web UI → LMS → Squeezelite (Kitchen) + Castbridge → HT-A9 Chromecast (Living Room).
Podcasts and audiobooks: cast from the Audiobookshelf app to the Sony. Reaching the kitchen speakers this way needs a Chromecast receiver running on the Pi — go2rtc is the candidate, and this is not yet implemented.
Data¶
The music library is the existing Plex library on Lotus at data/media/music —
LMS reads it through the Plex plugin and stores no separate copy. LMS's own
state lives in /mnt/cache/appdata/lyrion and is covered by the appdata backup.
The Kitchen Pi's configuration is not backed up — it is the two files documented above plus a package install, and is quicker to recreate than to restore.