Autonomic Mirage (MMS)
Autonomic Mirage / MMS music servers (the eMMS, MMS-1e/2e/5e and related models from
Autonomic / Snap One) are controlled over the MMS control protocol on TCP port 5004 — short
text commands terminated by a carriage-return/line-feed. One player instance inside the
server — Player_A, Player_B, … — becomes one GEM device, so a single server that streams
several rooms is represented by several GEM devices, one per player.
This driver creates no zones. A Mirage player is a source: you expose each player as an AV source that a user selects on a touchpanel, and route its audio to rooms through your matrix or amplifier the same way you would any other audio source. What you get on screen:
- Streaming source & station browsing — the player's radio/streaming providers (Spotify, Pandora, SiriusXM, internet radio, and whatever the server has accounts for), their stations, genres, favorites, and the music library (albums, artists, genres, playlists).
- Live now-playing — station, artist, album, and track for what the player is currently streaming, plus track time and duration, pushed to the source panel as it changes.
- Full transport and play modes — play / pause / stop / skip, volume, mute, repeat, shuffle, and thumbs up / down where the streaming provider supports rating.
- Presets, playlists, and queue management — store and recall presets, save / rename / delete playlists, and reorder, jump within, or clear the now-playing queue.
What it does
- Transport: play, pause, stop, play/pause toggle, skip next / previous, and seek to a position.
- Volume: volume up / down, mute, and absolute set-volume (where the player exposes volume).
- Play modes: repeat and shuffle toggles; thumbs up / down and add / remove from library for services that rate tracks.
- Browse: the streaming/radio sources, stations, and genres; the music library (albums, artists, genres, playlists); favorites; and the live now-playing queue.
- Direct play: start an album, artist, genre, or playlist by its server id (GUID).
- Presets: store, recall, and delete presets by name or id.
- Playlists: save the current queue as a playlist, rename a playlist, and delete one.
- Queue: jump to a track, reorder, remove a single item, or clear the now-playing queue.
- Live now-playing written back as device attributes (station / artist / album / track, track time and duration) so it feeds the source panel and can drive widgets and triggers.
- A dedicated Mirage source view for end users (browse providers/stations + now-playing +
transport). Set the AV source's Component to
mirageto get it.
Prerequisites
- An Autonomic Mirage / MMS server reachable on the same LAN as GEM, with its control protocol enabled (it listens on TCP 5004 by default).
- A static IP or a DHCP reservation for the server so its address never moves — a moved address means GEM can no longer reach it.
- For each room you want to control independently, a distinct player instance configured on
the MMS (
Player_A,Player_B, …). You will create one GEM device per player.
Setup
Open Devices
- Confirm the MMS server's control protocol is reachable on port 5004 (the default; enable it in the server's configuration if it has been turned off).
- Go to System → Devices → Add Device and choose the Autonomic Mirage (MMS) driver.
- Set MMS IP Address to the server's LAN IP and leave TCP Port at 5004.
- Set Player Instance to the player that drives this room —
Player_Aby default. This is the single most important field: every command this device sends targets that one player, so it must match the player the server has assigned to the room. - (Optional) Set Client Name (an identifier GEM advertises to the server; defaults to
GEM). - Save and enable the device. On connect GEM runs its start-up sequence (announce client, set the server host, switch the server to list/UTF-8 mode, select the configured player, and subscribe to event pushes) and then reads current status. Within a few seconds the device shows connected.
For a multi-room server, add one GEM device per player instance — same IP and port on each,
with a different Player Instance (Player_A, Player_B, Player_C, …). Do not point two GEM
devices at the same player instance: the server binds a player to the most recent connection and
drops the earlier one, so the two devices will fight and the connection will flap.
Using a Mirage player as an AV source
Open AV Sources
To put a player on a touchpanel as a selectable source with the browse + now-playing panel, create an AV source for it:
- Add a source whose Device is this Mirage device (the one bound to the player you want).
- Set the Component field to
mirage. - Set AV Type to Audio.
- Mark it Global source (not zone-specific) if every room should be able to select it, or assign it to a single AV zone for a one-room player.
- Save. When a user selects that source, GEM draws the Mirage panel:
- the Browse side lists the player's streaming/radio sources and their stations, with a search box;
- the Now Playing side shows the current station / artist / album / track with cover art and the transport, volume, repeat / shuffle, and thumbs controls. When a browse drill-down lands on a station or track list, this side displays that list instead and is relabeled Stations or Tracks (on phones, where the two sides become tabs, the tab name follows what the pane is showing).
If you create one source per player and mark each global, every room can pick any player. To route the player's audio to a room, give the source an On Macro that switches your matrix or amplifier input — see AV Sources for the source editor (Device, Component, Global, routing macros) and AV Zones for routing the source into rooms.
To limit which streaming/radio providers appear in the Browse panel, set the optional
provider_whitelist attribute on the device to a JSON list of provider names (for example
["Spotify", "Pandora"]). When set, the source view shows only those providers; leave it empty to
show everything the server offers.
How now-playing works
As the player streams, the server pushes metadata events and GEM writes the current station, artist, album, and track, along with track time and track duration, back onto the device as attributes. Cover art is fetched from the MMS server's own web service (the server reports its base URL; it defaults to port 5005 on the same IP). GEM proxies that image through the server rather than loading it directly in the browser, so cover art displays correctly on secured (HTTPS) touchpanels without being blocked as mixed content — the trade-off is that port 5005 must be reachable from the GEM server, not from each client.
Unlike some source drivers, these now-playing fields are stored as device attributes, so they can drive now-playing widgets and be used as attribute-trigger conditions — for example, an automation that fires when a particular station starts playing.
Attributes
Device — required
| Attribute | Type | Description |
|---|---|---|
ip | string | The MMS server's LAN IP (the MMS IP Address field). |
port | int | Control-protocol port (the TCP Port field). Defaults to 5004. |
Device — optional
| Attribute | Type | Default | Description |
|---|---|---|---|
instance | string | Player_A | Which player inside the server this device controls (the Player Instance field) — Player_A … Player_F. |
client_name | string | GEM | Identifier GEM advertises to the server on connect. |
client_version | string | 1.0.0.0 | Client version string GEM advertises on connect. |
max_buffer | int | 1048576 | Largest single response GEM will buffer, in bytes. Browse responses for large libraries (a full Spotify album list can exceed 60 KB) need a big buffer; the 1 MB default covers most catalogs — raise it for unusually large libraries. |
provider_whitelist | json | — | Optional list of provider names to show in the Mirage source view's Browse panel (for example ["Spotify"]). Empty shows all providers. |
Device — live state (written by the driver)
The driver writes the player's current state back onto the device as it changes. These names are stable, so you can bind widgets to them and build attribute triggers:
| Attribute | Type | Meaning |
|---|---|---|
now_playing_station | string | Current station / service name. |
now_playing_artist | string | Current artist. |
now_playing_album | string | Current album. |
now_playing_track | string | Current track title. |
now_playing_guid | string | Server id of the now-playing item. |
tracktime | int | Elapsed time of the current track, in seconds. |
trackduration | int | Total length of the current track, in seconds. |
mute | bool | Whether the player is muted. |
repeat | bool | Whether repeat is on. |
shuffle | bool | Whether shuffle is on. |
thumbsup / thumbsdown / stars | int | Current rating state reported by the streaming service. |
The driver also publishes transport-availability flags — play_pause__available,
skip_next__available, skip_prev__available, repeat__available, shuffle__available,
seek__available (booleans, with the double underscore exactly as shown) — indicating which
controls the current stream actually offers, plus a back boolean for whether menu-back navigation
is available.
This driver creates no zones, so there are no zone attributes. Mirage devices have no entries in the attribute autocomplete catalog, so type these attribute names exactly as shown when referencing them.
Commands
Driver-declared commands appear on the device's Commands tab and can be used in macros, triggers, and on UI buttons. Browse and direct-play commands are mainly consumed by the source view, but they are equally available to macros.
Transport
| Command | Args | Action |
|---|---|---|
play pause stop play_pause | — | Playback transport (play_pause toggles). |
next / skip_next | — | Skip to the next track. |
previous / skip_previous | — | Skip to the previous track. |
seek | position | Seek to a position in the current track. |
Volume and play modes
| Command | Args | Action |
|---|---|---|
volume_up volume_down | — | Step the player volume. |
mute | — | Toggle mute. |
set_volume | level | Set absolute volume (players that expose volume). |
repeat | — | Toggle repeat. |
shuffle | — | Toggle shuffle. |
thumbs_up thumbs_down | — | Rate the current track (rating-capable services). |
add_to_library remove_from_library | — | Add / remove the current track from the library. |
Browse
| Command | Args | Action |
|---|---|---|
browse_top_menu | — | Browse the player's top menu. |
browse_albums browse_artists browse_genres browse_playlists browse_favorites | start, count | Page through a music-library category (defaults: start 1, count 10). |
browse_now_playing | start, count | Page through the now-playing queue. |
browse_radio_sources | — | List the player's streaming / radio providers. |
browse_radio_stations browse_radio_genres | start, count | Page stations / genres for the active radio source. |
browse | action, start, count | Run an arbitrary browse verb with paging — the escape hatch for browse actions without a named command. |
Direct play
| Command | Args | Action |
|---|---|---|
play_album play_artist play_genre play_playlist | guid | Start a library item by its server id. |
select_item / ack_pick_item | guid | Choose an item from a picklist returned by a browse. |
Presets and playlists
| Command | Args | Action |
|---|---|---|
store_preset | name | Save the current state as a preset (omit name for the player's default slot). |
recall_preset | name or guid | Recall a preset by name or id. |
delete_preset | name or guid | Delete a preset. |
save_playlist | name | Save the now-playing queue as a playlist. |
rename_playlist | old_name, new_name | Rename a playlist. |
delete_playlist | name or guid | Delete a playlist. |
Queue
| Command | Args | Action |
|---|---|---|
jump_to_track | index | Jump to a position in the now-playing queue and play it. |
reorder_queue | from, to | Move a queue item from one position to another. |
remove_from_queue | index | Remove a single item from the queue. |
clear_queue | — | Clear the now-playing queue. |
Status, navigation, and filters
| Command | Args | Action |
|---|---|---|
get_status | — | Request a full status refresh. |
set_instance / set_zone | instance | Re-point this connection at a different player instance at run time. |
back | steps | Step back in the on-screen menu (default 1 step). |
set_radio_source | source | Filter the radio browse to one source. |
clear_music_filter clear_radio_filter | — | Clear the music / radio browse filter. |
Advanced
| Command | Args | Action |
|---|---|---|
passthrough | command | Send a raw control-protocol command verbatim — for any verb the named commands don't cover. |
A recall_preset_guid command appears in the command list but is not wired up — recalling by id is
done with recall_preset and a guid argument instead, so use recall_preset for both name- and
id-based recall.
Known limitations
- One connection per player. Each GEM device controls a single MMS player instance. For
multi-room, create one device per
Player_X, and never point two GEM devices at the same player — the server keeps only the newest connection to a player, so they will fight and the link will flap. - No zones. A Mirage player is one device and creates no GEM zones — route it to rooms at the AV-source / AV-zone layer, like any other source.
- Large browse responses. Big catalogs (a full Spotify album list, large playlists) can exceed
60 KB; the 1 MB
max_bufferdefault covers most cases — raise it for unusually large libraries. - List/UTF-8 mode is fixed on connect. GEM puts the server into list mode and UTF-8 encoding at
start-up; don't override those with
passthroughmid-session or browse parsing will break. recall_preset_guidis not implemented — userecall_presetwith aguidargument.
Troubleshooting
| Symptom | Check |
|---|---|
| Commands are accepted but the wrong room reacts. | The Player Instance is wrong. Confirm the Player_A / Player_B / … value matches the player the MMS has assigned to that room. |
| The connection flaps up and down on the dashboard. | Two GEM devices are targeting the same player instance — the server drops the earlier session whenever a new one binds the same player. Make sure each device uses a distinct Player_X. |
| Browse responses are truncated or never resolve. | Raise Max Response Buffer (max_buffer) above 1 MB for very large libraries, and confirm nothing has overridden the server's list mode mid-session. |
| The Browse panel is missing providers. | The provider_whitelist attribute may be filtering them out. Clear it to show every provider, or add the provider's name to the list. |
| Now-playing or cover art is blank. | Confirm the device is connected and the player is actually streaming; cover art is served by the MMS web service (port 5005 by default), which GEM proxies through the server — so that port must be reachable from the GEM server, not from the client browser. |
See also
- AV Sources — add a Mirage player as a selectable source and pick the
miragepanel. - AV Zones — route the source into rooms.
- Devices — adding and configuring devices.
- Commands — running and scripting device commands.