Skip to main content

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 mirage to 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

  1. 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).
  2. Go to System → Devices → Add Device and choose the Autonomic Mirage (MMS) driver.
  3. Set MMS IP Address to the server's LAN IP and leave TCP Port at 5004.
  4. Set Player Instance to the player that drives this room — Player_A by 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.
  5. (Optional) Set Client Name (an identifier GEM advertises to the server; defaults to GEM).
  6. 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:

  1. Add a source whose Device is this Mirage device (the one bound to the player you want).
  2. Set the Component field to mirage.
  3. Set AV Type to Audio.
  4. 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.
  5. 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.

Filtering the provider list

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

AttributeTypeDescription
ipstringThe MMS server's LAN IP (the MMS IP Address field).
portintControl-protocol port (the TCP Port field). Defaults to 5004.

Device — optional

AttributeTypeDefaultDescription
instancestringPlayer_AWhich player inside the server this device controls (the Player Instance field) — Player_APlayer_F.
client_namestringGEMIdentifier GEM advertises to the server on connect.
client_versionstring1.0.0.0Client version string GEM advertises on connect.
max_bufferint1048576Largest 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_whitelistjsonOptional 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:

AttributeTypeMeaning
now_playing_stationstringCurrent station / service name.
now_playing_artiststringCurrent artist.
now_playing_albumstringCurrent album.
now_playing_trackstringCurrent track title.
now_playing_guidstringServer id of the now-playing item.
tracktimeintElapsed time of the current track, in seconds.
trackdurationintTotal length of the current track, in seconds.
muteboolWhether the player is muted.
repeatboolWhether repeat is on.
shuffleboolWhether shuffle is on.
thumbsup / thumbsdown / starsintCurrent 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

CommandArgsAction
play pause stop play_pausePlayback transport (play_pause toggles).
next / skip_nextSkip to the next track.
previous / skip_previousSkip to the previous track.
seekpositionSeek to a position in the current track.

Volume and play modes

CommandArgsAction
volume_up volume_downStep the player volume.
muteToggle mute.
set_volumelevelSet absolute volume (players that expose volume).
repeatToggle repeat.
shuffleToggle shuffle.
thumbs_up thumbs_downRate the current track (rating-capable services).
add_to_library remove_from_libraryAdd / remove the current track from the library.

Browse

CommandArgsAction
browse_top_menuBrowse the player's top menu.
browse_albums browse_artists browse_genres browse_playlists browse_favoritesstart, countPage through a music-library category (defaults: start 1, count 10).
browse_now_playingstart, countPage through the now-playing queue.
browse_radio_sourcesList the player's streaming / radio providers.
browse_radio_stations browse_radio_genresstart, countPage stations / genres for the active radio source.
browseaction, start, countRun an arbitrary browse verb with paging — the escape hatch for browse actions without a named command.

Direct play

CommandArgsAction
play_album play_artist play_genre play_playlistguidStart a library item by its server id.
select_item / ack_pick_itemguidChoose an item from a picklist returned by a browse.

Presets and playlists

CommandArgsAction
store_presetnameSave the current state as a preset (omit name for the player's default slot).
recall_presetname or guidRecall a preset by name or id.
delete_presetname or guidDelete a preset.
save_playlistnameSave the now-playing queue as a playlist.
rename_playlistold_name, new_nameRename a playlist.
delete_playlistname or guidDelete a playlist.

Queue

CommandArgsAction
jump_to_trackindexJump to a position in the now-playing queue and play it.
reorder_queuefrom, toMove a queue item from one position to another.
remove_from_queueindexRemove a single item from the queue.
clear_queueClear the now-playing queue.

Status, navigation, and filters

CommandArgsAction
get_statusRequest a full status refresh.
set_instance / set_zoneinstanceRe-point this connection at a different player instance at run time.
backstepsStep back in the on-screen menu (default 1 step).
set_radio_sourcesourceFilter the radio browse to one source.
clear_music_filter clear_radio_filterClear the music / radio browse filter.

Advanced

CommandArgsAction
passthroughcommandSend a raw control-protocol command verbatim — for any verb the named commands don't cover.
recall_preset_guid

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_buffer default 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 passthrough mid-session or browse parsing will break.
  • recall_preset_guid is not implemented — use recall_preset with a guid argument.

Troubleshooting

SymptomCheck
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 mirage panel.
  • AV Zones — route the source into rooms.
  • Devices — adding and configuring devices.
  • Commands — running and scripting device commands.