Skip to main content

Lyrion Music Server (Squeezebox)

Control a Lyrion Music Server — the community-maintained successor to Logitech Media Server (LMS) / Squeezebox Server — and every player attached to it directly on the LAN. One GEM device represents the server (a controller); each player becomes a GEM zone you can power, transport, and set volume on.

This is the right driver for retrofits where a house already runs a Squeezebox / piCorePlayer / squeezelite ecosystem and the owner wants those rooms to appear in GEM alongside lighting, shades, and video. It talks the same JSON-RPC "CLI over HTTP" API that the Material skin, iPeng, and every community integration use, so it works against Logitech Media Server 7.x/8.x and modern Lyrion 8.x/9.x alike.

Driver name

lyrion_music_server — set this as the device driver when adding the server in Devices.

Prerequisites

  • A running Lyrion Music Server (or legacy Logitech Media Server 7.9+) reachable from the GEM host. Confirm the web UI opens at http://<server-ip>:9000.
  • The server on a stable IP — add a DHCP reservation so the address the device row points at does not move.
  • At least one player connected to the server. Players can be hardware (Squeezebox Touch/Radio/Boom, Transporter) or software (squeezelite, piCorePlayer, SqueezeLite-ESP32, Ropieee).
  • If Password Protection is enabled under Settings → Advanced → Security, the web-UI username and password.

Setup steps

  1. Open http://<server-ip>:9000 from a browser on the same network to confirm the server is reachable and note its IP.
  2. In GEM go to DevicesAdd Device and choose the Lyrion Music Server (Squeezebox) driver.
  3. Enter the server IP Address. Leave Port at 9000 unless you changed it.
  4. If the server requires a login, fill in Username and Password. Leave both blank for the common open-LAN setup.
  5. Save. Within a few seconds the device should show connected.
  6. Run the get_players command (from the device command panel or a macro). The result lists every player with its playerid (MAC), name, model, and connected/power state.
  7. For each player you want to control, create a zone whose address is that player's MAC id.

Attribute reference

Device attributes

AttributeRequiredTypePurpose
ipyesstringLAN IP / hostname of the Lyrion server.
portnointWeb/CLI port. Default 9000.
usernamenostringOnly if Password Protection is enabled.
passwordnostring (secure)Only if Password Protection is enabled. Stored encrypted.
status_intervalnointPer-player poll interval in ms. Default 5000.
volume_incrementnointStep for volume_up / volume_down. Default 5.
request_timeoutnointHTTP request timeout in ms. Default 8000.

Zone attributes (published by the poll loop)

AttributeTypeMeaning
statestringon when powered, off in standby.
power_statestringSame as state.
play_statestringTransport mode: play, pause, or stop.
volumeintVolume 0–100 (absolute value; see the mute quirk below).
mute_statestringmute_on / mute_off.
track_title / track_artist / track_albumstringNow-playing metadata (read-only).

Zone address format

zone.address is the player's MAC id as returned by get_players, e.g. 00:04:20:12:34:56. A player name (e.g. Kitchen) also works — the driver resolves it to the MAC from the last discovery — but the MAC is the stable choice because names can be reused when hardware is swapped.

Commands

CommandArgsNotes
on / off / power_toggleaddressPower / standby.
play / pause / stopaddressTransport.
next_track / previous_trackaddressPlaylist skip.
volumeaddress, levelAbsolute 0–100.
volume_up / volume_downaddressStep by volume_increment.
mute_on / mute_off / mute_toggleaddressMute control.
get_players / get_devicesDiscovery: list players + MAC ids.
get_statusaddressRead one player and refresh its zone attributes.

Under the hood every command is a JSON-RPC POST to /jsonrpc.js:

{"id":1,"method":"slim.request","params":["00:04:20:12:34:56",["mixer","volume",40]]}

Known limitations

  • Server discovery is not automated. The server IP must be entered manually. Player discovery within a known server is automatic via get_players.
  • The muted-volume sign quirk. Lyrion reports a muted player's volume as a negative number (-35 = "muted, would be 35"). The driver publishes the absolute value as volume and sets mute_state from the sign, so a muted player still shows its would-be level rather than 0.
  • Asleep / disconnected players. A software player that has lost the server or gone to sleep shows connected:0 in get_players; Lyrion silently drops commands to it. Wake the player at the hardware or restart the player process.
  • Favorites, library browse, and playlist loading are not exposed in this driver — it covers transport, volume, power, and now-playing read-back. Deep browse/queue control remains on the roadmap.
  • Synced groups. Lyrion can sync players into a group; this driver controls each player independently. Commanding a synced follower may reflect the group leader's state. Group create/break is not surfaced yet.

Troubleshooting

SymptomLikely cause / fix
Device never connectshttp://<ip>:9000 is unreachable from the GEM host — usually a VLAN/firewall boundary. Confirm the web UI opens from the GEM machine.
Every request returns HTTP 401Password Protection is on but the credentials are blank/wrong. Set username/password, or disable protection in Settings → Security.
get_players is emptyNo players attached, or all are asleep. Confirm at least one player is listed and connected in the web UI.
One zone won't respondThat player is offline/asleep (connected:0). Wake it or restart the player.
volume shows a value while the player is silentThe player is muted — check mute_state. The volume shown is the level it will return to when unmuted.

Protocol reference

The JSON-RPC endpoint is documented in the Lyrion / Logitech Media Server "CLI" help (the same command tokens the Telnet CLI on port 9090 accepts). See the in-server help at Settings → Information → Technical Information, or the Lyrion community documentation. The MQTT / broadcast discovery path on UDP 3483 is not used by this driver.