Summary

Arcam AV860 and related AVR-series audio/video receivers with RS-232 and IP control. Binary protocol using <St><Zn><Cc><Dl><Data><Et> framing (start 0x21, end 0x0D). Supports two zones, power, volume, mute, source selection, decode mode queries, equalisation, tuner control, network playback status, and RC5 IR command simulation.

Transport

protocols:
  - serial
  - tcp
addressing:
  port: 50000  # IP control port stated in source
serial:
  baud_rate: 38400
  data_bits: 8
  parity: none
  stop_bits: 1
  flow_control: none
auth:
  type: none  # inferred: no auth procedure in source

Traits

- powerable    # power on/off/standby commands
- queryable    # extensive query commands for state
- levelable    # volume, treble, bass, balance, sub trim, lipsync
- routable     # source selection, video input selection

Actions

# === SYSTEM COMMANDS ===

- id: power_query
  label: Request Power State
  kind: query
  command: "0x21 {zone} 0x00 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number (0x01=Zone1, 0x02=Zone2)"

- id: display_brightness_query
  label: Request Display Brightness
  kind: query
  command: "0x21 {zone} 0x01 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"

- id: headphones_query
  label: Request Headphone Status
  kind: query
  command: "0x21 {zone} 0x02 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"

- id: fm_genre_query
  label: Request FM Genre
  kind: query
  command: "0x21 {zone} 0x03 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"

- id: software_version_query
  label: Request Software Version
  kind: query
  command: "0x21 0x01 0x04 0x01 {component} 0x0D"
  params:
    - name: component
      type: integer
      description: "0xF0=RS232 version, 0xF1=Host, 0xF2=OSD, 0xF3=DSP, 0xF4=NET, 0xF5=IAP"

- id: restore_factory_defaults
  label: Restore Factory Defaults
  kind: action
  command: "0x21 0x01 0x05 0x02 0xAA 0xAA 0x0D"
  params: []

- id: save_restore_settings
  label: Save/Restore Secure Settings Copy
  kind: action
  command: "0x21 0x01 0x06 0x07 {operation} 0x55 0x55 {pin1} {pin2} {pin3} {pin4} 0x0D"
  params:
    - name: operation
      type: integer
      description: "0x00=Save, 0x01=Restore"
    - name: pin1
      type: integer
      description: "Pin digit 1"
    - name: pin2
      type: integer
      description: "Pin digit 2"
    - name: pin3
      type: integer
      description: "Pin digit 3"
    - name: pin4
      type: integer
      description: "Pin digit 4"

- id: simulate_rc5
  label: Simulate RC5 IR Command
  kind: action
  command: "0x21 {zone} 0x08 0x02 {system_code} {command_code} 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"
    - name: system_code
      type: integer
      description: "RC5 system code"
    - name: command_code
      type: integer
      description: "RC5 command code"

- id: display_info_type_set
  label: Set Display Information Type
  kind: action
  command: "0x21 {zone} 0x09 0x01 {display_type} 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"
    - name: display_type
      type: integer
      description: "0x00=Processing mode, 0xE0=Cycle, 0xF0=Request current, 0x01-0x05 source-specific info"

- id: request_current_source
  label: Request Current Source
  kind: query
  command: "0x21 {zone} 0x1D 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"

- id: headphone_override
  label: Headphone Override
  kind: action
  command: "0x21 {zone} 0x1F 0x01 {state} 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"
    - name: state
      type: integer
      description: "0x00=Clear (speakers muted with headphones), 0x01=Set (speakers unmuted)"

# === INPUT COMMANDS ===

- id: video_selection_set
  label: Set Video Input
  kind: action
  command: "0x21 {zone} 0x0A 0x01 {source} 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"
    - name: source
      type: integer
      description: "0x00=BD, 0x01=SAT, 0x02=AV, 0x03=PVR, 0x04=VCR, 0x05=Game, 0x06=STB, 0xF0=Request current"

- id: video_selection_query
  label: Request Video Input
  kind: query
  command: "0x21 {zone} 0x0A 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"

- id: select_analogue_digital
  label: Select Analogue/Digital Audio
  kind: action
  command: "0x21 {zone} 0x0B 0x01 {audio_type} 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"
    - name: audio_type
      type: integer
      description: "0x00=Analogue, 0x01=Digital, 0x02=HDMI, 0xF0=Request current"

# === OUTPUT COMMANDS ===

- id: set_volume
  label: Set Volume
  kind: action
  command: "0x21 {zone} 0x0D 0x01 {level} 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"
    - name: level
      type: integer
      description: "0x00(0)-0x63(99) volume level, 0xF0=Request current"

- id: request_volume
  label: Request Volume
  kind: query
  command: "0x21 {zone} 0x0D 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"

- id: request_mute_status
  label: Request Mute Status
  kind: query
  command: "0x21 {zone} 0x0E 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"

- id: request_direct_mode
  label: Request Direct Mode Status
  kind: query
  command: "0x21 0x01 0x0F 0x01 0xF0 0x0D"
  params: []

- id: request_decode_mode_2ch
  label: Request Decode Mode 2ch
  kind: query
  command: "0x21 0x01 0x10 0x01 0xF0 0x0D"
  params: []

- id: request_decode_mode_mch
  label: Request Decode Mode MCH
  kind: query
  command: "0x21 0x01 0x11 0x01 0xF0 0x0D"
  params: []

- id: request_rds_info
  label: Request RDS Information
  kind: query
  command: "0x21 {zone} 0x12 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"

- id: request_video_output_resolution
  label: Request Video Output Resolution
  kind: query
  command: "0x21 0x01 0x13 0x01 0xF0 0x0D"
  params: []

# === MENU COMMANDS ===

- id: request_menu_status
  label: Request Menu Status
  kind: query
  command: "0x21 0x01 0x14 0x01 0xF0 0x0D"
  params: []

- id: request_tuner_preset
  label: Request/Set Tuner Preset
  kind: action
  command: "0x21 {zone} 0x15 0x01 {preset} 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"
    - name: preset
      type: integer
      description: "0x01-0x32 (1-50) preset number, 0xF0=Request current"

- id: tune
  label: Tune Frequency
  kind: action
  command: "0x21 {zone} 0x16 0x01 {direction} 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"
    - name: direction
      type: integer
      description: "0x00=Decrement, 0x01=Increment, 0xF0=Request current frequency"

- id: request_dab_station
  label: Request DAB Station
  kind: query
  command: "0x21 {zone} 0x18 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"

- id: request_dab_genre
  label: Request DAB Programme Type
  kind: query
  command: "0x21 {zone} 0x19 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"

- id: request_dls_pdt
  label: Request DLS/PDT Info
  kind: query
  command: "0x21 {zone} 0x1A 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"

- id: request_preset_details
  label: Request Preset Details
  kind: query
  command: "0x21 {zone} 0x1B 0x01 {preset} 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"
    - name: preset
      type: integer
      description: "0x01-0x32 (1-50) preset number"

- id: network_playback_status
  label: Request Network Playback Status
  kind: query
  command: "0x21 {zone} 0x1C 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"

- id: imax_enhanced_set
  label: Set IMAX Enhanced
  kind: action
  command: "0x21 {zone} 0x0C 0x01 {state} 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"
    - name: state
      type: integer
      description: "0xF0=Request, 0xF1=Auto, 0xF2=On, 0xF3=Off"

- id: imax_enhanced_query
  label: Request IMAX Enhanced State
  kind: query
  command: "0x21 {zone} 0x0C 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"

# === SETUP ADJUSTMENT COMMANDS ===

- id: treble_eq_set
  label: Set Treble Equalisation
  kind: action
  command: "0x21 {zone} 0x35 0x01 {value} 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"
    - name: value
      type: integer
      description: "0x00-0x0C=0 to +12dB, 0x81-0x8C=-1 to -12dB, 0xF0=Request, 0xF1=Increment, 0xF2=Decrement"

- id: bass_eq_set
  label: Set Bass Equalisation
  kind: action
  command: "0x21 {zone} 0x36 0x01 {value} 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"
    - name: value
      type: integer
      description: "0x00-0x0C=0 to +12dB, 0x81-0x8C=-1 to -12dB, 0xF0=Request, 0xF1=Increment, 0xF2=Decrement"

- id: room_eq_set
  label: Set Room Equalisation
  kind: action
  command: "0x21 {zone} 0x37 0x01 {state} 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"
    - name: state
      type: integer
      description: "0xF0=Request, 0xF1=On, 0xF2=Off"

- id: dolby_volume_set
  label: Set Dolby Volume
  kind: action
  command: "0x21 {zone} 0x38 0x01 {state} 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"
    - name: state
      type: integer
      description: "0x00=Off, 0x01=On, 0xF0=Request current"

- id: dolby_leveller_set
  label: Set Dolby Leveller
  kind: action
  command: "0x21 {zone} 0x39 0x01 {value} 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"
    - name: value
      type: integer
      description: "0x00-0x0A=0-10, 0xF0=Request, 0xF1=Increment, 0xF2=Decrement, 0xFF=Off"

- id: dolby_volume_calibration_offset_set
  label: Set Dolby Volume Calibration Offset
  kind: action
  command: "0x21 {zone} 0x3A 0x01 {value} 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"
    - name: value
      type: integer
      description: "0x00-0x0F=0-15dB, 0x80-0x8F=-1 to -15dB, 0xF0=Request, 0xF1=Increment, 0xF2=Decrement"

- id: balance_set
  label: Set Balance
  kind: action
  command: "0x21 {zone} 0x3B 0x01 {value} 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"
    - name: value
      type: integer
      description: "0x00-0x06=0-6, 0x81-0x86=-1 to -6, 0xF0=Request, 0xF1=Increment, 0xF2=Decrement"

- id: subwoofer_trim_set
  label: Set Subwoofer Trim
  kind: action
  command: "0x21 {zone} 0x3F 0x01 {value} 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"
    - name: value
      type: integer
      description: "0x00-0x14=positive in 0.5dB steps, 0x81-0x94=negative in 0.5dB steps, 0xF0=Request, 0xF1=Increment, 0xF2=Decrement"

- id: lipsync_delay_set
  label: Set Lipsync Delay
  kind: action
  command: "0x21 {zone} 0x40 0x01 {value} 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"
    - name: value
      type: integer
      description: "0x00-0x32=delay in 5ms steps, 0xF0=Request, 0xF1=Increment, 0xF2=Decrement"

- id: compression_set
  label: Set Dynamic Range Compression
  kind: action
  command: "0x21 {zone} 0x41 0x01 {value} 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"
    - name: value
      type: integer
      description: "0x00=Off, 0x01=Medium, 0x02=High, 0xF0=Request"

- id: request_video_params
  label: Request Incoming Video Parameters
  kind: query
  command: "0x21 {zone} 0x42 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"

- id: request_audio_format
  label: Request Incoming Audio Format
  kind: query
  command: "0x21 {zone} 0x43 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"

- id: request_audio_sample_rate
  label: Request Incoming Audio Sample Rate
  kind: query
  command: "0x21 {zone} 0x44 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"

- id: sub_stereo_trim_set
  label: Set Sub Stereo Trim
  kind: action
  command: "0x21 {zone} 0x45 0x01 {value} 0x0D"
  params:
    - name: zone
      type: integer
      description: "Zone number"
    - name: value
      type: integer
      description: "0x00=0dB, 0x81-0x94=-0.5 to -10dB in 0.5dB steps, 0xF0=Request, 0xF1=Increment, 0xF2=Decrement"

- id: zone1_osd_set
  label: Set Zone 1 OSD On/Off
  kind: action
  command: "0x21 0x01 0x4E 0x01 {state} 0x0D"
  params:
    - name: state
      type: integer
      description: "0xF0=Request, 0xF1=On, 0xF2=Off"

- id: video_output_switching_set
  label: Set HDMI Video Output
  kind: action
  command: "0x21 0x01 0x4F 0x01 {output} 0x0D"
  params:
    - name: output
      type: integer
      description: "0x02=HDMI Out 1, 0x03=HDMI Out 2, 0x04=HDMI Out 1&2, 0xF0=Request current"

- id: set_input_name
  label: Set/Request Input Name
  kind: action
  command: "0x21 0x01 0x20 {length} {name_ascii} 0x0D"
  params:
    - name: length
      type: integer
      description: "0x01 for query, or character count (max 10) for setting"
    - name: name_ascii
      type: string
      description: "Input name in ASCII (max 10 chars), or 0xF0 for query"

- id: fm_scan
  label: FM Scan Up/Down
  kind: action
  command: "0x21 0x01 0x23 0x01 {direction} 0x0D"
  params:
    - name: direction
      type: integer
      description: "0x01=Scan up, 0x02=Scan down"

- id: dab_scan
  label: DAB Scan
  kind: action
  command: "0x21 0x01 0x24 0x01 0xF0 0x0D"
  params: []

- id: heartbeat
  label: Heartbeat
  kind: action
  command: "0x21 0x01 0x25 0x01 0xF0 0x0D"
  params: []

- id: reboot
  label: Reboot Unit
  kind: action
  command: "0x21 0x01 0x26 0x06 0x52 0x45 0x42 0x4F 0x4F 0x54 0x0D"
  params: []

- id: amx_device_discovery
  label: AMX Duet Device Discovery
  kind: query
  command: "AMX\r"
  params: []

Feedbacks

- id: power_state
  type: enum
  values: [standby, on]
  description: "Response to power query (0x00). Data: 0x00=standby, 0x01=on"

- id: display_brightness
  type: enum
  values: [off, L1, L2]
  description: "Response to display brightness query (0x01). Data: 0x00=off, 0x01=L1, 0x02=L2"

- id: headphone_status
  type: enum
  values: [not_connected, connected]
  description: "Response to headphone query (0x02). Data: 0x00=not connected, 0x01=connected"

- id: answer_code
  type: enum
  values: [status_update, zone_invalid, command_not_recognised, parameter_not_recognised, command_invalid_now, invalid_data_length]
  description: "Answer codes in responses: 0x00=OK, 0x82-0x86 errors"

- id: source_state
  type: enum
  values: [follow_zone1, CD, BD, AV, SAT, PVR, VCR, AUX, DISPLAY, FM, DAB, NET, USB, STB, GAME]
  description: "Current source response (0x1D)"

- id: volume_level
  type: integer
  values: [0, 99]
  description: "Volume level 0-99 (0x00-0x63)"

- id: mute_state
  type: enum
  values: [muted, not_muted]
  description: "Mute status (0x0E). 0x00=muted, 0x01=not muted"

- id: direct_mode_state
  type: enum
  values: [off, on]
  description: "Direct mode status (0x0F). 0x00=off, 0x01=on"

- id: decode_mode_2ch
  type: enum
  values: [stereo, dolby_surround, neo6_cinema, neo6_music, 5_7ch_stereo, dts_neural_x, dts_virtual_x]
  description: "2ch decode mode (0x10)"

- id: decode_mode_mch
  type: enum
  values: [stereo_downmix, multichannel, dts_es_neural_x, dolby_surround, dts_virtual_x]
  description: "MCH decode mode (0x11)"

- id: video_output_resolution
  type: enum
  values: [sd_progressive, 720p, 1080i, 1080p, preferred, bypass, 4k]
  description: "Video output resolution (0x13)"

- id: menu_status
  type: enum
  values: [none, setup, trim, bass, treble, sync, sub, tuner, network, usb]
  description: "Open menu state (0x14)"

- id: network_playback_state
  type: enum
  values: [navigating, playing, paused, busy]
  description: "Network playback status (0x1C). 0x00=navigating, 0x01=playing, 0x02=paused, 0xFF=busy"

- id: imax_enhanced_state
  type: enum
  values: [off, on, auto]
  description: "IMAX Enhanced state (0x0C). 0x00=off, 0x01=on, 0x02=auto"

- id: audio_format
  type: enum
  values: [PCM, analogue_direct, dolby_digital, dolby_digital_ex, dolby_digital_surround, dolby_digital_plus, dolby_digital_true_hd, DTS, DTS_96_24, DTS_ES_matrix, DTS_ES_discrete, DTS_ES_matrix_96_24, DTS_ES_discrete_96_24, DTS_HD_master_audio, DTS_HD_high_res, DTS_low_bitrate, DTS_core, PCM_zero, unsupported, undetected, dolby_atmos, DTS_X, IMAX_ENHANCED]
  description: "Incoming audio format (0x43)"

- id: audio_channel_config
  type: enum
  values: [dual_mono, centre_only, stereo_only, stereo_mono_surround, stereo_surround_LR, stereo_surround_LR_mono_back, stereo_surround_LR_back_LR, stereo_surround_LR_matrix_back_LR, stereo_centre, stereo_centre_mono_surround, stereo_centre_surround_LR, stereo_centre_surround_LR_mono_back, stereo_centre_surround_LR_back_LR, stereo_centre_surround_LR_matrix_back_LR, stereo_downmix_LtRt, stereo_only_LoRo]
  description: "Audio channel configuration (0x43 Data2)"

- id: audio_sample_rate
  type: enum
  values: [32kHz, 44_1kHz, 48kHz, 88_2kHz, 96kHz, 176_4kHz, 192kHz, unknown, undetected]
  description: "Incoming audio sample rate (0x44)"

- id: compression_state
  type: enum
  values: [off, medium, high]
  description: "Compression setting (0x41)"

- id: room_eq_state
  type: enum
  values: [off, on, not_calculated]
  description: "Room EQ state (0x37). 0x00=off, 0x01=on, 0x02=not calculated"

- id: dolby_volume_state
  type: enum
  values: [off, on]
  description: "Dolby Volume state (0x38)"

- id: zone1_osd_state
  type: enum
  values: [on, off]
  description: "Zone 1 OSD state (0x4E). 0x00=On, 0x01=Off"

Variables

# UNRESOLVED: variables are implicitly covered by parameterized actions above

Events

# Device sends unsolicited status updates when state changes from front panel or IR input.
# Any state change (volume, source, decode mode, display brightness) is relayed to RC.
# No explicit event subscription mechanism documented.

Macros

# UNRESOLVED: no multi-step sequences explicitly documented in source

Safety

confirmation_required_for:
  - restore_factory_defaults  # requires 0xAA 0xAA confirmation pattern
  - save_restore_settings     # requires 0x55 0x55 confirmation + PIN
  - reboot                    # sends literal "REBOOT" ASCII as confirmation
interlocks: []
# UNRESOLVED: no explicit safety interlock procedures documented in source

Notes

  • Binary protocol: all commands use <0x21><Zone><CC><Dl><Data><0x0D> framing.
  • Zone 1 = 0x01 (master), Zone 2 = 0x02.
  • Commands 0xF0-0xFF reserved for test functions — must not be used.
  • Response format includes answer code: <0x21><Zone><CC><Ac><Dl><Data><0x0D>.
  • Answer codes: 0x00=OK, 0x82=zone invalid, 0x83=command not recognised, 0x84=parameter not recognised, 0x85=command invalid now (e.g. OSD showing), 0x86=invalid data length.
  • AV responds within 3 seconds. RC may send further commands before response received.
  • RC5 IR simulation (0x08) enables any IR function via serial/IP. Full RC5 code table documented.
  • Control disabled by default — enable via front panel (hold DIRECT 4s) or OSD menu.
  • IP control port 50000.
  • AMX Duet discovery: send "AMX\r" to get device class/make/model/revision.

Provenance

source_domains:
  - arcam.co.uk
source_urls:
  - https://www.arcam.co.uk/ugc/tor/avr390/RS232/RS232_860_850_550_390_250_SH274E_D_181018.pdf
retrieved_at: 2026-04-29T08:49:47.446Z
last_checked_at: 2026-06-02T21:39:47.838Z

Verification Summary

verdict: verified
checked_at: 2026-06-02T21:39:47.838Z
matched_actions: 54
action_count: 54
confidence: medium
summary: "All 54 spec actions matched to source command codes with correct opcodes; transport verified. (7 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "exact firmware version compatibility not stated"
- "variables are implicitly covered by parameterized actions above"
- "no multi-step sequences explicitly documented in source"
- "no explicit safety interlock procedures documented in source"
- "firmware version compatibility not stated in source"
- "maximum concurrent connection count not stated"
- "DAB commands reference AVR450/750 models — applicability to AV860 unclear"

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