Skip to content

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 including config.txt and dtoverlay
  • 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.