Summary

Media server (MMS) supporting TCP socket/telnet control on port 5004 and an HTTP JSON API at http://ipOrNameOfServer/api/. Commands terminated with CRLF. Controls playback, browsing of local and online media libraries, presets, scenes, playlists, triggers, and service account selection. No authentication required.

Transport

protocols:
  - tcp
  - http
addressing:
  port: 5004          # TCP socket/telnet port stated in source
  base_url: "http://ipOrNameOfServer/api/"  # HTTP JSON API base URL stated in source
auth:
  type: none          # inferred: no auth procedure in source

Traits

- queryable    # inferred from GetStatus, Browse commands, event subscription
- levelable    # inferred from SetVolume command (0-50 range stated)

Actions

# --- Connection preamble ---

- id: SetClientType
  label: Set Client Type
  kind: action
  command: "SetClientType {clientName}"
  params:
    - name: clientName
      type: string
      description: Client identifier string (e.g. DemoClient)

- id: SetClientVersion
  label: Set Client Version
  kind: action
  command: "SetClientVersion {version}"
  params:
    - name: version
      type: string
      description: Version in MAJOR.MINOR.BUILD.REVISION format (e.g. 1.0.0.0)

- id: SetHost
  label: Set Host Address
  kind: action
  command: "SetHost {address}"
  params:
    - name: address
      type: string
      description: Client IP address used to connect to MMS (e.g. 192.168.0.100)

- id: SetXmlMode
  label: Set XML Mode
  kind: action
  command: "SetXmlMode {mode}"
  params:
    - name: mode
      type: string
      enum: [None, Lists]

- id: SetEncoding
  label: Set Encoding
  kind: action
  command: "SetEncoding {encoding}"
  params:
    - name: encoding
      type: integer
      description: Encoding code (65001 = UTF-8)

- id: SetInstance
  label: Set Instance
  kind: action
  command: "SetInstance {instanceName}"
  params:
    - name: instanceName
      type: string
      description: Target instance name (e.g. Player_A)

- id: SubscribeEvents
  label: Subscribe to Events
  kind: action
  command: "SubscribeEvents {filter}"
  params:
    - name: filter
      type: string
      description: "Optional: boolean true/false or comma-delimited event list; omit for all events"

- id: GetStatus
  label: Get Status
  kind: query
  command: "GetStatus"
  params: []

- id: SetOption
  label: Set Option
  kind: action
  command: "SetOption {option}={value}"
  params:
    - name: option
      type: string
      description: "Option name (e.g. supports_playnow, supports_inputbox, supports_urls)"
    - name: value
      type: string
      description: "Option value (e.g. true)"

# --- Playback control ---

- id: Play
  label: Play
  kind: action
  command: "Play"
  params: []

- id: Pause
  label: Pause
  kind: action
  command: "Pause"
  params: []

- id: PlayPause
  label: Play/Pause Toggle
  kind: action
  command: "PlayPause"
  params: []

- id: Seek
  label: Seek
  kind: action
  command: "Seek {position}"
  params:
    - name: position
      type: integer
      description: "Seconds from start (0 to TrackDuration) or from end (negative: -1 to -1*TrackDuration)"

- id: SkipNext
  label: Skip Next
  kind: action
  command: "SkipNext"
  params: []

- id: SkipPrevious
  label: Skip Previous
  kind: action
  command: "SkipPrevious"
  params: []

- id: ThumbsUp
  label: Thumbs Up Toggle
  kind: action
  command: "ThumbsUp"
  params: []

- id: ThumbsDown
  label: Thumbs Down Toggle
  kind: action
  command: "ThumbsDown"
  params: []

- id: SetVolume
  label: Set Volume
  kind: action
  command: "SetVolume {volume}"
  params:
    - name: volume
      type: integer
      description: Volume level 0-50; output must be in variable gain mode

- id: SetStars
  label: Set Stars Rating
  kind: action
  command: "SetStars {rating}"
  params:
    - name: rating
      type: integer
      description: "-1 (disabled) or 0-5"

# --- Navigation ---

- id: Back
  label: Navigate Back
  kind: action
  command: "Back {pages}"
  params:
    - name: pages
      type: integer
      description: Number of pages to go back; navigation stack begins with 0 (current page)

- id: AckButtonContext
  label: Acknowledge Context Button (TuneBridge)
  kind: action
  command: "AckButton CONTEXT"
  params: []

# --- Browse commands ---

- id: BrowseArtists
  label: Browse Artists
  kind: query
  command: "BrowseArtists {start} {count}"
  params:
    - name: start
      type: integer
      description: 1-based start index
    - name: count
      type: integer
      description: Max items to return

- id: BrowseAlbums
  label: Browse Albums
  kind: query
  command: "BrowseAlbums {start} {count}"
  params:
    - name: start
      type: integer
    - name: count
      type: integer

- id: BrowseComposers
  label: Browse Composers
  kind: query
  command: "BrowseComposers {start} {count}"
  params:
    - name: start
      type: integer
    - name: count
      type: integer

- id: BrowseGenres
  label: Browse Genres
  kind: query
  command: "BrowseGenres {start} {count}"
  params:
    - name: start
      type: integer
    - name: count
      type: integer

- id: BrowseTitles
  label: Browse Titles
  kind: query
  command: "BrowseTitles {start} {count}"
  params:
    - name: start
      type: integer
    - name: count
      type: integer

- id: BrowseFavorites
  label: Browse Favorites/Presets
  kind: query
  command: "BrowseFavorites {start} {count}"
  params:
    - name: start
      type: integer
    - name: count
      type: integer

- id: BrowsePresets
  label: Browse Presets (alias for BrowseFavorites)
  kind: query
  command: "BrowsePresets {start} {count}"
  params:
    - name: start
      type: integer
    - name: count
      type: integer

- id: BrowsePlaylists
  label: Browse Playlists
  kind: query
  command: "BrowsePlaylists {start} {count}"
  params:
    - name: start
      type: integer
    - name: count
      type: integer

- id: BrowseNowPlaying
  label: Browse Now Playing Queue
  kind: query
  command: "BrowseNowPlaying {start} {count}"
  params:
    - name: start
      type: integer
    - name: count
      type: integer

- id: BrowseRadioSources
  label: Browse Radio Sources
  kind: query
  command: "BrowseRadioSources {start} {count}"
  params:
    - name: start
      type: integer
    - name: count
      type: integer

- id: BrowsePicklist
  label: Browse Picklist
  kind: query
  command: "BrowsePicklist {start} {count}"
  params:
    - name: start
      type: integer
    - name: count
      type: integer

- id: BrowseTopMenu
  label: Browse Top Menu
  kind: query
  command: "BrowseTopMenu"
  params: []

- id: BrowseTopMenuChild
  label: Browse Top Menu Child Node
  kind: query
  command: "BrowseTopMenu itemGuid={itemGuid}"
  params:
    - name: itemGuid
      type: string
      description: GUID of child node to use as root

- id: BrowseServiceAccounts
  label: Browse Service Accounts
  kind: query
  command: "BrowseServiceAccounts"
  params: []

- id: AckPickItem
  label: Acknowledge Pick Item
  kind: action
  command: "AckPickItem {guid}"
  params:
    - name: guid
      type: string
      description: GUID of the picklist item to select

# --- Service account selection ---

- id: SetServiceAccount
  label: Set Service Account
  kind: action
  command: "SetServiceAccount {serviceGuid} {accountGuid}"
  params:
    - name: serviceGuid
      type: string
      description: GUID of the streaming service (from BrowseRadioSources)
    - name: accountGuid
      type: string
      description: GUID of the account (from BrowseServiceAccounts)

- id: SetServiceAccountLatched
  label: Set Service Account (Latched Per Output)
  kind: action
  command: "SetServiceAccount {serviceGuid} {accountGuid} False"
  params:
    - name: serviceGuid
      type: string
    - name: accountGuid
      type: string

- id: SetServiceAccountClearService
  label: Clear Latched Service Account for a Service
  kind: action
  command: "SetServiceAccount {service} Clear False"
  params:
    - name: service
      type: string
      description: Name or GUID of the streaming service

- id: SetServiceAccountClearAll
  label: Clear All Latched Service Accounts
  kind: action
  command: "SetServiceAccount Clear Clear False"
  params: []

# --- Initiating playback ---

- id: PlayAlbum
  label: Play Album
  kind: action
  command: "PlayAlbum {albumGuid} {verb}"
  params:
    - name: albumGuid
      type: string
    - name: verb
      type: string
      description: "Optional: Next, Now, Replace, AddToQueue, AddToPlaylist"

- id: PlayArtist
  label: Play Artist
  kind: action
  command: "PlayArtist {artistGuid} {verb}"
  params:
    - name: artistGuid
      type: string
    - name: verb
      type: string
      description: "Optional: Next, Now, Replace, AddToQueue, AddToPlaylist"

- id: PlayComposer
  label: Play Composer
  kind: action
  command: "PlayComposer {composerGuid} {verb}"
  params:
    - name: composerGuid
      type: string
    - name: verb
      type: string
      description: "Optional: Next, Now, Replace, AddToQueue, AddToPlaylist"

- id: PlayGenre
  label: Play Genre
  kind: action
  command: "PlayGenre {genreGuid} {verb}"
  params:
    - name: genreGuid
      type: string
    - name: verb
      type: string
      description: "Optional: Next, Now, Replace, AddToQueue, AddToPlaylist"

- id: PlayPlaylist
  label: Play Playlist
  kind: action
  command: "PlayPlaylist {nameOrId} {verb}"
  params:
    - name: nameOrId
      type: string
      description: Name or GUID of the playlist
    - name: verb
      type: string
      description: "Optional: Next, Now, Replace, AddToQueue, AddToPlaylist"

- id: PlayPreset
  label: Play Preset
  kind: action
  command: "PlayPreset {nameOrId} {verb}"
  params:
    - name: nameOrId
      type: string
    - name: verb
      type: string
      description: "Optional: Next, Now, Replace, AddToQueue, AddToPlaylist"

- id: PlayScene
  label: Play Scene
  kind: action
  command: "PlayScene {nameOrId}"
  params:
    - name: nameOrId
      type: string

- id: PlayTitle
  label: Play Title
  kind: action
  command: "PlayTitle {titleGuid} {verb}"
  params:
    - name: titleGuid
      type: string
    - name: verb
      type: string
      description: "Optional: Next, Now, Replace, AddToQueue, AddToPlaylist"

- id: ClarifyTitleIntent
  label: Clarify Title Intent
  kind: action
  command: "ClarifyTitleIntent {guid} {verb}"
  params:
    - name: guid
      type: string
      description: GUID from listAction=ClarifyTitleIntent item
    - name: verb
      type: string
      description: "Optional: Next, Now, Replace, AddToQueue, AddToPlaylist"

# --- Presets ---

- id: StorePreset
  label: Store Preset (prompt for name)
  kind: action
  command: "StorePreset"
  params: []

- id: StorePresetNamed
  label: Store Named Preset
  kind: action
  command: "StorePreset \"{name}\""
  params:
    - name: name
      type: string
      description: Double-quoted preset name (e.g. "Party Time")

- id: RecallPreset
  label: Recall Preset
  kind: action
  command: "RecallPreset {nameOrId}"
  params:
    - name: nameOrId
      type: string
      description: Double-quoted preset name or unique ID GUID

- id: EditPreset
  label: Edit Preset
  kind: action
  command: "EditPreset {nameOrId}"
  params:
    - name: nameOrId
      type: string

- id: RenamePreset
  label: Rename Preset
  kind: action
  command: "RenamePreset {nameOrId} {newName}"
  params:
    - name: nameOrId
      type: string
    - name: newName
      type: string

- id: DeletePreset
  label: Delete Preset
  kind: action
  command: "DeletePreset {nameOrId}"
  params:
    - name: nameOrId
      type: string

# --- Scenes ---

- id: StoreScene
  label: Store Scene (prompt for name)
  kind: action
  command: "StoreScene"
  params: []

- id: StoreSceneNamed
  label: Store Named Scene
  kind: action
  command: "StoreScene \"{name}\""
  params:
    - name: name
      type: string
      description: Double-quoted scene name (e.g. "Party Time")

- id: RecallScene
  label: Recall Scene
  kind: action
  command: "RecallScene {nameOrId}"
  params:
    - name: nameOrId
      type: string
      description: Double-quoted scene name or unique ID GUID

- id: DeleteScene
  label: Delete Scene
  kind: action
  command: "DeleteScene {nameOrId}"
  params:
    - name: nameOrId
      type: string

# --- Playlists ---

- id: RenamePlaylist
  label: Rename Playlist
  kind: action
  command: "RenamePlaylist {oldName} {newName}"
  params:
    - name: oldName
      type: string
    - name: newName
      type: string

- id: DeletePlaylist
  label: Delete Playlist
  kind: action
  command: "DeletePlaylist {nameOrId}"
  params:
    - name: nameOrId
      type: string

- id: ReorderPlaylist
  label: Reorder Playlist Track
  kind: action
  command: "ReorderPlaylist {playlistId} {srceTrackId} {destTrackId}"
  params:
    - name: playlistId
      type: string
    - name: srceTrackId
      type: string
    - name: destTrackId
      type: string

# --- Now Playing queue ---

- id: JumpToNowPlayingItem
  label: Jump to Now Playing Item
  kind: action
  command: "JumpToNowPlayingitem {index}"
  params:
    - name: index
      type: integer
      description: 1-based index of item to jump to

- id: ReorderNowPlaying
  label: Reorder Now Playing
  kind: action
  command: "ReorderNowPlaying {indexToMove} {indexToMoveTo}"
  params:
    - name: indexToMove
      type: integer
      description: 1-based index of track to move
    - name: indexToMoveTo
      type: integer
      description: 1-based destination index

- id: RemoveNowPlayingItem
  label: Remove Now Playing Item
  kind: action
  command: "RemoveNowPlayingItem {index}"
  params:
    - name: index
      type: integer
      description: 1-based index of track to remove

- id: ClearNowPlaying
  label: Clear Now Playing (preserve stations)
  kind: action
  command: "ClearNowPlaying"
  params: []

- id: ClearNowPlayingStopStations
  label: Clear Now Playing (stop station content)
  kind: action
  command: "ClearNowPlaying False"
  params: []

# --- Triggers ---

- id: SetOutputTrigger
  label: Set Output Trigger
  kind: action
  command: "SetOutputTrigger {triggerIndex} {enabled}"
  params:
    - name: triggerIndex
      type: integer
      description: "1-based trigger index in trigger order (e.g. Trigger Out A = 1)"
    - name: enabled
      type: boolean
      description: "true to turn on, false to turn off"

# --- HTTP API filter helpers (seen in HTTP examples) ---

- id: SetMusicFilter
  label: Set Music Filter
  kind: action
  command: "SetMusicFilter {value}"
  params:
    - name: value
      type: string
      description: Filter value (e.g. Clear)

- id: SetRadioFilter
  label: Set Radio Filter
  kind: action
  command: "SetRadioFilter {value}"
  params:
    - name: value
      type: string
      description: Filter value (e.g. Clear)

# --- HTTP-only script command ---

- id: Script
  label: Execute Ordered Script (HTTP API only)
  kind: action
  command: "http://ipOrNameOfServer/api/Script/{urlEncodedCmd1}/{urlEncodedCmd2}/..."
  params:
    - name: commands
      type: string
      description: URL-encoded command chain; each sub-command URL-encoded as a path segment

Feedbacks

- id: PlayState
  type: enum
  values: [Playing, Paused, Stopped]

- id: MediaControl
  type: enum
  values: [Play, Pause, Stop]

- id: TrackTime
  type: integer
  description: Current track position in seconds (non-negative)

- id: TrackDuration
  type: integer
  description: Total track duration in seconds (0 for live streams with no time info)

- id: MetaData1
  type: string
  description: Generally reserved for radio station name or track count data

- id: MetaData2
  type: string
  description: Generally reserved for artist name

- id: MetaData3
  type: string
  description: Generally reserved for album name

- id: MetaData4
  type: string
  description: Generally reserved for track name

- id: MetaLabel1
  type: string
  description: Label for MetaData1

- id: MetaLabel2
  type: string
  description: Label for MetaData2

- id: MetaLabel3
  type: string
  description: Label for MetaData3

- id: MetaLabel4
  type: string
  description: Label for MetaData4

- id: NowPlayingGuid
  type: string
  description: "Unique ID of now playing item (e.g. {20dd901a-b092-3386-dc16-6b56f38a811e})"

- id: MediaArtChanged
  type: boolean
  description: "Art changed for current item (always true when sent); triggers art refresh"

- id: BaseWebUrl
  type: string
  description: "Protocol, address, and port for art retrieval (e.g. http://192.168.0.59:5005)"

- id: Back
  type: boolean
  description: "Navigation stack has items; if true, use Back <int> to jump back"

- id: BrowseNowPlayingAvailable
  type: boolean
  description: Queue has items available to browse

- id: ContextMenu
  type: boolean
  description: "AckButton CONTEXT is valid; TuneBridge button should be shown"

- id: Mute
  type: boolean
  description: Selected instance is muted

- id: PlayPauseAvailable
  type: boolean
  description: Play, Pause, and PlayPause commands are valid

- id: RepeatAvailable
  type: boolean
  description: Repeat command is valid; Repeat button should be shown

- id: Repeat
  type: boolean
  description: Repeat is enabled

- id: SeekAvailable
  type: boolean
  description: Seek command is valid; scrubbing thumb should be shown

- id: ShuffleAvailable
  type: boolean
  description: Shuffle command is valid; Shuffle button should be shown

- id: Shuffle
  type: boolean
  description: Shuffle is enabled

- id: SkipNextAvailable
  type: boolean
  description: SkipNext command is valid; Skip Next button should be shown

- id: SkipPrevAvailable
  type: boolean
  description: SkipPrevious command is valid; Skip Previous button should be shown

- id: ThumbsUp
  type: enum
  values: [-1, 0, 1]
  description: "-1=disabled/unavailable, 0=enabled not set, 1=enabled and set"

- id: ThumbsDown
  type: enum
  values: [-1, 0, 1]
  description: "-1=disabled/unavailable, 0=enabled not set, 1=enabled and set"

- id: Stars
  type: integer
  description: "-1=disabled; 0-5=enabled with star count shown; governs SetStars availability"

- id: FavoritesChanged
  type: boolean
  description: "A preset changed (always true when sent); rebrowse presets"

- id: FavoritesCount
  type: integer
  description: "Number of presets; sent only when count changes (add/delete)"

- id: ScenesChanged
  type: boolean
  description: "A scene changed (always true when sent); rebrowse scenes"

- id: ScenesCount
  type: integer
  description: Number of scenes; sent only when count changes

- id: PlaylistsChanged
  type: boolean
  description: "A playlist changed (always true when sent); rebrowse playlists"

- id: PlaylistCount
  type: integer
  description: "Number of playlists; sent only when count changes (add/delete)"

- id: LocalQueueOptions
  type: array
  description: Available queue modification options communicated to the client

- id: TriggerIn1
  type: boolean
  description: Input trigger 1 state; true when voltage applied to input pin

# TriggerIn2 through TriggerIn<x> follow the same pattern per source ("TriggerIn1 through TriggerIn<x>")

Events

# Server pushes events to connected TCP client.
# Format: EventReason Source Event=Value
# Examples:
#   StateChanged Player_A TrackTime=121
#   ReportState Player_A MetaData2=Stevie Ray Vaughan
#
# EventReason values: StateChanged, ReportState
# Source: instance name (e.g. Player_A)
# Events are the same names as Feedbacks above.
# Subscription via SubscribeEvents; GetStatus triggers immediate push of all current state.

Macros

# Initialization sequence from source:
# 1. SetClientType DemoClient
# 2. SetClientVersion 1.0.0.0
# 3. SetHost 192.168.0.100
# 4. SetXmlMode Lists
# 5. SetEncoding 65001
# 6. SetInstance Player_A
# 7. SubscribeEvents
# 8. GetStatus
#
# Optional options (SetOption during preamble):
#   SetOption supports_playnow=true    (advanced queue modification)
#   SetOption supports_inputbox=true   (Input and Message Box UI events)
#   SetOption supports_urls=true       (Page type Navigate URL events)
#
# Album art URL construction:
#   {BaseWebUrl}/getart?guid={NowPlayingGuid}&instance={instance}&fmt=jpg
#   Port may be omitted; requests on port 80 are processed the same as port 5005.

Safety

confirmation_required_for: []
interlocks: []
# Note: Input triggers accept 5-24V AC/DC; Output triggers supply 12VDC 100mA max.
# These are hardware specifications, not protocol safety requirements.
# UNRESOLVED: no software safety warnings or interlock procedures in source

Notes

TCP socket commands terminated with CRLF (\r\n). HTTP JSON API endpoint: http://ipOrNameOfServer/api/ — send commands as GET requests with spaces replaced by / (e.g. GET /api/SubscribeEvents/True). Include clientId=<UUID> query string on all HTTP requests to prevent inter-client cross talk. HTTP commands are not guaranteed to be processed in order (different sockets); use the Script command to force ordered execution. Browse indexes are 1-based. BrowseTopMenu can take itemGuid=<guid> to navigate to a child node. Picklist items without a listAction are selected with AckPickItem <guid>. AckButton CONTEXT is available when the ContextMenu event is true. JumpToNowPlayingitem uses a lowercase i in item as shown in source. SetVolume requires the output to be in variable gain mode (configured on device System tab). Presets were formerly called Snapshots. Trigger indexing is order-based independent of label (Trigger Out A = index 1).

Provenance

source_domains:
  - autonomic.atlassian.net
source_urls:
  - https://autonomic.atlassian.net/wiki/spaces/ASKB/pages/1509556225/Autonomic+Media+Server+Control+Protocol
  - https://autonomic.atlassian.net/wiki/spaces/ASKB/pages/1596620801/Control+Protocols
  - https://autonomic.atlassian.net/wiki/spaces/ASKB/pages/1694990337/Control+System+Integration+Features
  - https://autonomic.atlassian.net/wiki/spaces/ASKB/pages/1696792577/Crestron
  - https://autonomic.atlassian.net/wiki/spaces/ASKB/pages/1696137217/Control4
retrieved_at: 2026-05-19T21:41:08.007Z
last_checked_at: 2026-06-02T21:40:18.250Z

Verification Summary

verdict: verified
checked_at: 2026-06-02T21:40:18.250Z
matched_actions: 71
action_count: 71
confidence: medium
summary: "All 71 spec actions have literal counterparts in the source and transport parameters are confirmed verbatim. (6 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "power on/off commands not found in source"
- "Shuffle, Repeat, Mute commands referenced by flag events but no literal payload shown in source beyond command name"
- "no software safety warnings or interlock procedures in source"
- "Shuffle, Repeat, Mute command syntax — referenced as valid commands by their flag events but no standalone payload shown in source beyond the command name"
- "firmware version compatibility not stated in source"
- "total trigger count not specified in source"

From the AI4AV catalog (https://ai4av.net) · ODbL-1.0