Summary

Binary RS-232 / TCP/IP control protocol for the Arcam AVR Series AV receivers (AVR390, AVR550, AVR850, AV860, SR250). All commands and responses share a common framed format (St Zn Cc Dl Data Et) and the same byte-level protocol is presented over both RS-232 and IP. IP control uses TCP port 50000; RS-232 uses 38,400 bps, 8N1, no flow control. AMX Duet discovery is also supported as an ASCII command.

Transport

# Source documents BOTH RS-232 and IP control carrying the same byte protocol.
# IP control: "IP control is via port 50000 of the IP address of the unit"
# RS-232: 38,400 bps, 1 start / 8 data / 1 stop / no parity / no flow control.
protocols:
  - serial
  - tcp
addressing:
  port: 50000
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

# Evidence: power state query/commands present (0x00, RC5 standby/power on/off),
# source/routing commands present (0x0A, 0x0B, 0x1D), query commands returning
# state present (0x00-0x44, 0x1C), volume/level commands present (0x0D, 0x35,
# 0x36, 0x3B, 0x3F, 0x40, 0x45, 0x41, 0x38, 0x39, 0x3A).
- powerable
- routable
- queryable
- levelable

Actions

# Frame: St(0x21) Zn Cc Dl Data Et(0x0D)
# Zones: 0x01 = Zone 1 (master), 0x02 = Zone 2.
# Variable placeholders are shown as {name}.
# "kind: query" indicates the action reads device state; "kind: action" performs a set/control.

# ----- System (0x00 - 0x09) -----
- id: power_query
  label: Power State (Zone)
  kind: query
  command: "0x21 {zone} 0x00 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number (0x01 or 0x02)

- id: display_brightness_query
  label: Display Brightness
  kind: query
  command: "0x21 0x01 0x01 0x01 0xF0 0x0D"
  params: []

- id: headphones_query
  label: Headphones Connected
  kind: query
  command: "0x21 0x01 0x02 0x01 0xF0 0x0D"
  params: []

- id: fm_genre_query
  label: FM Programme Type
  kind: query
  command: "0x21 {zone} 0x03 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number (0x01 or 0x02)

- id: software_version_query
  label: Software Version
  kind: query
  command: "0x21 0x01 0x04 0x01 {subsystem} 0x0D"
  params:
    - name: subsystem
      type: enum
      values: [0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5]
      description: "0xF0=RS232 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_secure_copy
  label: Save/Restore Secure Settings
  kind: action
  command: "0x21 0x01 0x06 0x07 {op} 0x55 0x55 {pin1} {pin2} {pin3} {pin4} 0x0D"
  params:
    - name: op
      type: enum
      values: [0x00, 0x01]
      description: "0x00=Save secure backup, 0x01=Restore secure backup"
    - 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 {rc5_system} {rc5_command} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number (0x01 or 0x02)
    - name: rc5_system
      type: integer
      description: RC5 system code (e.g. 0x10 for main, 0x17 for Zone 2)
    - name: rc5_command
      type: integer
      description: RC5 command code (see RC5 code table in Notes)

- id: display_information_type
  label: Display Information Type
  kind: action
  command: "0x21 {zone} 0x09 0x01 {mode} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number (0x01 or 0x02)
    - name: mode
      type: enum
      values: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0xE0, 0xF0]
      description: |
        Source-dependent. 0x00=Processing (all),
        0xE0=Cycle displayable info, 0xF0=Request current type.
        FM: 0x01=Radio text 0x02=Programme type 0x03=Signal strength.
        DAB (AVR450/750 only): 0x01=Radio text 0x02=Genre 0x03=Signal quality 0x04=Bit rate.
        NET/USB: 0x01=Track 0x02=Artist 0x03=Album 0x04=Audio type 0x05=Rate.

# ----- Input (0x0A - 0x0B) -----
- id: video_selection
  label: Video Selection
  kind: action
  command: "0x21 0x01 0x0A 0x01 {video_source} 0x0D"
  params:
    - name: video_source
      type: enum
      values: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xF0]
      description: "0x00=BD 0x01=SAT 0x02=AV 0x03=PVR 0x04=VCR 0x05=Game 0x06=STB 0xF0=Request current input"

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

# ----- IMAX Enhanced (0x0C) -----
- id: imax_enhanced
  label: IMAX Enhanced
  kind: action
  command: "0x21 {zone} 0x0C 0x01 {mode} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number (0x01 or 0x02)
    - name: mode
      type: enum
      values: [0xF0, 0xF1, 0xF2, 0xF3]
      description: "0xF0=Request current 0xF1=Auto 0xF2=On 0xF3=Off"

# ----- Output / Volume (0x0D - 0x14) -----
- id: set_request_volume
  label: Set / Request Volume
  kind: action
  command: "0x21 {zone} 0x0D 0x01 {level} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number (0x01 or 0x02)
    - name: level
      type: integer
      description: "0x00 (0) to 0x63 (99) to set; 0xF0 to request current"

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

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

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

- id: request_decode_mode_mch
  label: Decode Mode (Multi-channel)
  kind: query
  command: "0x21 0x01 0x11 0x01 0xF0 0x0D"
  params: []

- id: request_rds_information
  label: RDS Information
  kind: query
  command: "0x21 {zone} 0x12 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number (0x01 or 0x02)

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

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

# ----- Tuner / Radio (0x15 - 0x19, 0x23, 0x24) -----
- id: request_tuner_preset
  label: Tuner Preset
  kind: action
  command: "0x21 {zone} 0x15 0x01 {preset} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number (0x01 or 0x02)
    - name: preset
      type: integer
      description: "Preset 0x01-0x32 (1-50) to select; 0xF0 to request current"

- id: tune
  label: Tune (FM)
  kind: action
  command: "0x21 {zone} 0x16 0x01 {direction} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number (0x01 or 0x02)
    - name: direction
      type: enum
      values: [0x00, 0x01, 0xF0]
      description: "0x00=Decrement 0.05MHz 0x01=Increment 0.05MHz 0xF0=Request current"

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

- id: request_prog_type_category
  label: DAB Programme Type / Category
  kind: query
  command: "0x21 {zone} 0x19 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number (0x01 or 0x02)

- id: request_dls_pdt_info
  label: DAB DLS / PDT Information
  kind: query
  command: "0x21 {zone} 0x1A 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number (0x01 or 0x02)

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

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

# ----- Source / Input routing (0x1D, 0x1F) -----
- id: request_current_source
  label: Current Source
  kind: query
  command: "0x21 {zone} 0x1D 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number (0x01 or 0x02)

- id: headphone_override
  label: Headphone Override (Speaker Relays)
  kind: action
  command: "0x21 {zone} 0x1F 0x01 {state} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number (0x01 or 0x02)
    - name: state
      type: enum
      values: [0x00, 0x01]
      description: "0x00=Clear (speakers muted if headphones present) 0x01=Set (speakers unmuted if headphones present)"

# ----- Input naming (0x20) -----
- id: set_request_input_name
  label: Set / Request Input Name
  kind: action
  command: "0x21 0x01 0x20 0x{n} {ascii_bytes} 0x0D"
  params:
    - name: n
      type: integer
      description: "Data length: 0x01 for query (0xF0), 0x02-0x0A for set (1-10 ASCII characters)"
    - name: ascii_bytes
      type: string
      description: "ASCII bytes for the new input name; 0xF0 to query the current name"

# ----- Scan / Maintenance (0x23 - 0x26) -----
- id: fm_scan
  label: FM Scan
  kind: action
  command: "0x21 0x01 0x23 0x01 {direction} 0x0D"
  params:
    - name: direction
      type: enum
      values: [0x01, 0x02]
      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
  kind: action
  command: "0x21 0x01 0x26 0x06 0x52 0x45 0x42 0x4F 0x4F 0x54 0x0D"
  params: []

# ----- Setup adjustments (0x35 - 0x41) -----
- id: treble_equalisation
  label: Treble Equalisation
  kind: action
  command: "0x21 {zone} 0x35 0x01 {value} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number (0x01 or 0x02)
    - name: value
      type: integer
      description: "0x00-0x0C = 0dB to +12dB; 0x81-0x8C = -1dB to -12dB; 0xF0=Request 0xF1=+1dB 0xF2=-1dB"

- id: bass_equalisation
  label: Bass Equalisation
  kind: action
  command: "0x21 {zone} 0x36 0x01 {value} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number (0x01 or 0x02)
    - name: value
      type: integer
      description: "0x00-0x0C = 0dB to +12dB; 0x81-0x8C = -1dB to -12dB; 0xF0=Request 0xF1=+1dB 0xF2=-1dB"

- id: room_equalisation
  label: Room Equalisation
  kind: action
  command: "0x21 {zone} 0x37 0x01 {mode} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number (0x01 or 0x02)
    - name: mode
      type: enum
      values: [0xF0, 0xF1, 0xF2]
      description: "0xF0=Request 0xF1=On 0xF2=Off"

- id: dolby_volume
  label: Dolby Volume
  kind: action
  command: "0x21 {zone} 0x38 0x01 {state} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number (0x01 or 0x02)
    - name: state
      type: enum
      values: [0x00, 0x01, 0xF0]
      description: "0x00=Off 0x01=On 0xF0=Request current"

- id: dolby_leveller
  label: Dolby Leveller
  kind: action
  command: "0x21 {zone} 0x39 0x01 {value} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number (0x01 or 0x02)
    - name: value
      type: integer
      description: "0x00-0x0A = level 0-10; 0xF0=Request 0xF1=Increment 0xF2=Decrement 0xFF=Off"

- id: dolby_volume_calibration_offset
  label: Dolby Volume Calibration Offset
  kind: action
  command: "0x21 {zone} 0x3A 0x01 {value} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number (0x01 or 0x02)
    - name: value
      type: integer
      description: "0x00-0x0F = 0-15dB; 0x80-0x8F = -1 to -15dB; 0xF0=Request 0xF1=+1dB 0xF2=-1dB"

- id: balance
  label: Balance
  kind: action
  command: "0x21 {zone} 0x3B 0x01 {value} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number (0x01 or 0x02)
    - name: value
      type: integer
      description: "0x00-0x06 = 0-6; 0x81-0x86 = -1 to -6; 0xF0=Request 0xF1=+1 0xF2=-1"

- id: subwoofer_trim
  label: Subwoofer Trim
  kind: action
  command: "0x21 {zone} 0x3F 0x01 {value} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number (0x01 or 0x02)
    - name: value
      type: integer
      description: "0x00-0x14 = positive trim in 0.5dB steps; 0x81-0x94 = negative trim in 0.5dB steps; 0xF0=Request 0xF1=+0.5dB 0xF2=-0.5dB"

- id: lipsync_delay
  label: Lipsync Delay
  kind: action
  command: "0x21 {zone} 0x40 0x01 {value} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number (0x01 or 0x02)
    - name: value
      type: integer
      description: "0x00-0x32 = 0-250ms in 5ms steps; 0xF0=Request 0xF1=+5ms 0xF2=-5ms"

- id: compression
  label: Compression
  kind: action
  command: "0x21 {zone} 0x41 0x01 {value} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number (0x01 or 0x02)
    - name: value
      type: enum
      values: [0x00, 0x01, 0x02, 0xF0]
      description: "0x00=Off 0x01=Medium 0x02=High 0xF0=Request"

# ----- Video / audio input info queries (0x42 - 0x44) -----
- id: request_incoming_video_parameters
  label: Incoming Video Parameters
  kind: query
  command: "0x21 {zone} 0x42 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number (0x01 or 0x02)

- id: request_incoming_audio_format
  label: Incoming Audio Format
  kind: query
  command: "0x21 {zone} 0x43 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number (0x01 or 0x02)

- id: request_incoming_audio_sample_rate
  label: Incoming Audio Sample Rate
  kind: query
  command: "0x21 0x01 0x44 0x01 0xF0 0x0D"
  params: []

# ----- Sub stereo trim, OSD, video output (0x45, 0x4E, 0x4F) -----
- id: sub_stereo_trim
  label: Sub Stereo Trim
  kind: action
  command: "0x21 0x01 0x45 0x01 {value} 0x0D"
  params:
    - name: value
      type: integer
      description: "0x00 = 0dB; 0x81-0x94 = -0.5dB to -10dB in 0.5dB steps; 0xF0=Request 0xF1=+0.5dB 0xF2=-0.5dB"

- id: set_request_zone1_osd
  label: Zone 1 OSD On/Off
  kind: action
  command: "0x21 0x01 0x4E 0x01 {mode} 0x0D"
  params:
    - name: mode
      type: enum
      values: [0xF0, 0xF1, 0xF2]
      description: "0xF0=Request 0xF1=On 0xF2=Off"

- id: set_request_video_output_switching
  label: HDMI Video Output Switching
  kind: action
  command: "0x21 0x01 0x4F 0x01 {output} 0x0D"
  params:
    - name: output
      type: enum
      values: [0x02, 0x03, 0x04, 0xF0]
      description: "0x02=HDMI Out 1 0x03=HDMI Out 2 0x04=Both 0xF0=Request current"

# ----- AMX Duet discovery -----
- id: amx_duet_discovery
  label: AMX Duet Discovery
  kind: action
  command: "AMX\r"
  params: []
  notes: "Send ASCII string 'AMX' followed by 0x0D. Device replies with AMXB<...> string identifying make/model/protocol version."

Feedbacks

# Each entry describes the data payload returned by a query command.
# Some values are sent unsolicited when state changes (per source p. 8).

- id: power_state
  type: enum
  values: [standby, on]
  command: "0x00 (response Data byte 0x00=standby, 0x01=on)"

- id: display_brightness
  type: enum
  values: [off, L1, L2]
  command: "0x01 (response Data byte 0x00=off, 0x01=L1, 0x02=L2)"

- id: headphones_connected
  type: enum
  values: [not_connected, connected]
  command: "0x02 (response Data byte 0x00=not connected, 0x01=connected)"

- id: fm_programme_type
  type: string
  command: "0x03 (response Data = ASCII programme type)"

- id: software_version
  type: object
  command: "0x04 (response: Data1=subsystem echo, Data2=major, Data3=minor)"

- id: current_source
  type: enum
  values: [follow_zone_1, cd, bd, av, sat, pvr, vcr, aux, display, tuner_fm, tuner_dab, net, usb, stb, game]
  command: "0x1D (response Data: 0x00=Follow Z1 0x01=CD 0x02=BD 0x03=AV 0x04=SAT 0x05=PVR 0x06=VCR 0x08=AUX 0x09=DISPLAY 0x0B=TUNER(FM) 0x0C=TUNER(DAB; AVR450/750 only) 0x0E=NET 0x0F=USB 0x10=STB 0x11=GAME)"

- id: headphone_override_relay
  type: enum
  values: [clear, set]
  command: "0x1F (response Data1)"

- id: input_name
  type: string
  command: "0x20 (response Data: up to 10 ASCII characters)"

- id: fm_scan_status
  type: enum
  values: [scanning]
  command: "0x23 (response Data1=0xFF while scanning)"

- id: dab_scan_status
  type: enum
  values: [scanning]
  command: "0x24 (response Data1=0xFF while scanning)"

- id: heartbeat_status
  type: enum
  values: [ok]
  command: "0x25 (response Data1=0x00)"

- id: reboot_status
  type: enum
  values: [ok]
  command: "0x26 (response Data1=0x00)"

- id: volume
  type: integer
  command: "0x0D (response Data1 0x00-0x63; units = dB)"

- id: mute_status
  type: enum
  values: [muted, not_muted]
  command: "0x0E (response Data1 0x00=muted 0x01=not muted)"

- id: direct_mode
  type: enum
  values: [off, on]
  command: "0x0F (response Data1 0x00=off 0x01=on)"

- id: decode_mode_2ch
  type: enum
  values: [stereo, dolby_surround, neo6_cinema, neo6_music, five_seven_ch_stereo, dts_neural_x, reserved, dts_virtual_x]
  command: "0x10 (response Data1: 0x01=Stereo 0x04=Dolby Surround 0x07=Neo:6 Cinema 0x08=Neo:6 Music 0x09=5/7 Ch Stereo 0x0A=DTS Neural:X 0x0B=Reserved 0x0C=DTS Virtual:X)"

- id: decode_mode_mch
  type: enum
  values: [stereo_downmix, multichannel, dts_es_neural_x, dolby_surround, reserved, dts_virtual_x]
  command: "0x11 (response Data1: 0x01=Stereo down-mix 0x02=Multi-channel 0x03=DTS-ES/Neural:X 0x06=Dolby Surround 0x0B=Reserved 0x0C=DTS Virtual:X)"

- id: rds_information
  type: string
  command: "0x12 (response Data = RDS text in ASCII)"

- id: video_output_resolution
  type: enum
  values: [sd_progressive, 720p, 1080i, 1080p, preferred, bypass, 4k]
  command: "0x13 (response Data1: 0x02=SD Progressive 0x03=720p 0x04=1080i 0x05=1080p 0x06=Preferred 0x07=Bypass 0x08=4k)"

- id: open_menu
  type: enum
  values: [none, setup, trim, bass, treble, sync, sub, tuner, network, usb]
  command: "0x14 (response Data1: 0x00=None 0x02=Setup 0x03=Trim 0x04=Bass 0x05=Treble 0x06=Sync 0x07=Sub 0x08=Tuner 0x09=Network 0x0A=USB)"

- id: tuner_preset
  type: integer
  command: "0x15 (response Data1: 0xFF=no preset; 0x01-0x32 = preset number)"

- id: fm_frequency
  type: object
  command: "0x16 (response Data1=MHz, Data2=10's of kHz)"

- id: dab_station
  type: string
  command: "0x18 (response Data: 16 bytes ASCII, space padded)"

- id: dab_programme_type
  type: string
  command: "0x19 (response Data: 16 bytes ASCII, space padded)"

- id: dab_dls_pdt
  type: string
  command: "0x1A (response Data: 128 bytes ASCII, space padded)"

- id: preset_details
  type: object
  command: "0x1B (response: preset number, type, frequency, name)"

- id: network_playback
  type: object
  command: "0x1C (response Data1: 0x00=Navigating 0x01=Playing 0x02=Paused 0xFF=Busy; Data2+ = name)"

- id: imax_enhanced_state
  type: enum
  values: [off, on, auto]
  command: "0x0C (response Data1: 0x00=Off 0x01=On 0x02=Auto)"

- id: treble_value
  type: integer
  command: "0x35 (response Data1: 0x00-0x0C = 0dB to +12dB; 0x81-0x8C = -1dB to -12dB)"

- id: bass_value
  type: integer
  command: "0x36 (response Data1: 0x00-0x0C = 0dB to +12dB; 0x81-0x8C = -1dB to -12dB)"

- id: room_eq_state
  type: enum
  values: [off, on, not_calculated]
  command: "0x37 (response Data1: 0x00=Off 0x01=On 0x02=Not calculated/off)"

- id: dolby_volume_state
  type: enum
  values: [off, on]
  command: "0x38 (response Data1: 0x00=Off 0x01=On)"

- id: dolby_leveller_setting
  type: integer
  command: "0x39 (response Data1: 0x00-0x0A = level 0-10; 0xFF = Off)"

- id: dolby_volume_calibration_offset
  type: integer
  command: "0x3A (response Data1: 0x00-0x0F = 0-15dB; 0x80-0x8F = -1 to -15dB)"

- id: balance
  type: integer
  command: "0x3B (response Data1: 0x00-0x06 = 0-6; 0x81-0x86 = -1 to -6)"

- id: subwoofer_trim
  type: integer
  command: "0x3F (response Data1: 0x00-0x14 positive; 0x81-0x94 negative; 0.5dB steps)"

- id: lipsync_delay
  type: integer
  command: "0x40 (response Data1: 0x00-0x32 in 5ms steps)"

- id: compression
  type: enum
  values: [off, medium, high]
  command: "0x41 (response Data1: 0x00=Off 0x01=Medium 0x02=High)"

- id: incoming_video_parameters
  type: object
  command: "0x42 (response: 7 bytes - h-res MSB/LSB, v-res MSB/LSB, refresh, interlaced flag, aspect ratio)"

- id: incoming_audio_format
  type: object
  command: "0x43 (response: 2 bytes - stream format, channel configuration)"

- id: incoming_audio_sample_rate
  type: enum
  values: ["32kHz", "44.1kHz", "48kHz", "88.2kHz", "96kHz", "176.4kHz", "192kHz", unknown, undetected]
  command: "0x44 (response Data1: 0x00=32K 0x01=44.1K 0x02=48K 0x03=88.2K 0x04=96K 0x05=176.4K 0x06=192K 0x07=Unknown 0x08=Undetected)"

- id: sub_stereo_trim
  type: integer
  command: "0x45 (response Data1: 0x00=0dB; 0x81-0x94 = -0.5dB to -10dB)"

- id: zone1_osd_state
  type: enum
  values: [on, off]
  command: "0x4E (response Data1: 0x00=On 0x01=Off)"

- id: hdmi_output
  type: enum
  values: [hdmi_out_1, hdmi_out_2, both]
  command: "0x4F (response Data1: 0x02=HDMI Out 1 0x03=HDMI Out 2 0x04=Both)"

- id: amx_duet_identity
  type: string
  command: "AMX response (e.g. 'AMXB<Device-SDKClass=Receiver><Device-Make=ARCAM><Device-Model=AV860><Device-Revision=x.y.z>\\r')"

Variables

# UNRESOLVED: Settable numeric parameters (volume, treble, bass, balance, etc.) are
# written via discrete set commands (0x0D, 0x35, 0x36, 0x3B, ...) and read back via
# their query variants. They are exposed as integer-typed parameters on the action
# entries rather than as separate abstract Variables.

Events

# Per source: "It is possible that the state of the AV may be changed as a result
# of user input via the front panel buttons or via the IR remote control. Any
# change resulting from these inputs is relayed to the RC using the appropriate
# message type." Examples given: display-brightness change, decode-mode change.
# The exact unsolicited message framing is not described in the source excerpt.
# UNRESOLVED: unsolicited notification format not specified in source.

Macros

# UNRESOLVED: no multi-step macro sequences are described in the source.

Safety

confirmation_required_for:
  # 0x05 requires the 0xAA 0xAA confirmation pattern to avoid accidental restore.
  - id: restore_factory_defaults
    reason: "Source requires Dl=0x02, Data1=0xAA, Data2=0xAA to confirm."
  # 0x06 requires the 0x55 0x55 confirmation pattern plus a 4-digit PIN.
  - id: save_restore_secure_copy
    reason: "Source requires 0x55 0x55 confirmation plus a 4-digit PIN (Data4..Data7)."
  # 0x26 reboot uses a 'REBOOT' ASCII string as confirmation.
  - id: reboot
    reason: "Source requires the literal 'REBOOT' (0x52 0x45 0x42 0x4F 0x4F 0x54) data to confirm."
interlocks:
  # Source notes: "Certain commands cannot be processed when the Setup Menu is
  # being displayed. An answer code of 0x85 will be returned in these
  # circumstances. Also, commands for tuner control cannot be processed when
  # the tuner input is not selected."
  - "Commands that change input/routing return answer code 0x85 while the Setup Menu is open on the OSD."
  - "Tuner control commands (0x03, 0x12, 0x15, 0x16, 0x18, 0x19, 0x1A) return 0x85 when the tuner input is not selected on the addressed zone."
  - "If a save (0x06) is in progress, a second save will fail silently; 0x06 restore returns 0x85 if no secure copy exists."
  - "Commands 0xF0-0xFF are reserved for test functions and must not be transmitted."
  # EU standby / Control enablement:
  - "By default Control (RS-232 / IP) is disabled for minimum standby power. Enable via OSD (A then U on remote) or front-panel DIRECT button held 4 seconds."
  # Heartbeat:
  - "Sending the heartbeat command (0x25) also resets the EuP standby timer."

Notes

The byte-level protocol is identical over both RS-232 and TCP/IP. Each transmission uses a fixed frame:

  • St = 0x21 (!)
  • Zn = zone (0x01 master / 0x02)
  • Cc = command code
  • Dl = number of data bytes following, excluding Et
  • Data = up to 255 bytes
  • Et = 0x0D (carriage return)

Response frames include an Ac answer code byte between Cc and Dl: 0x00 = status update, 0x82 = zone invalid, 0x83 = command not recognised, 0x84 = parameter not recognised, 0x85 = command invalid at this time, 0x86 = invalid data length. The device responds to every command within three seconds.

The AV responds to each command within 3 seconds. The RC may send further commands before a previous response has been received.

RS-232 cable must be wired as a null modem (pin 2 ↔ 3, pin 5 ↔ 5).

RC5 IR command codes (system 0x10 / Zone 2 system 0x17). Each row is system-command; values shown as hex are also the bytes to pass to the simulate_rc5 action's rc5_system and rc5_command parameters.

Function RC5 (dec) RC5 (hex)
Standby 16-12 0x10 0x0C
1 16-1 0x10 0x01
2 16-2 0x10 0x02
3 16-3 0x10 0x03
4 16-4 0x10 0x04
5 16-5 0x10 0x05
6 16-6 0x10 0x06
7 16-7 0x10 0x07
8 16-8 0x10 0x08
9 16-9 0x10 0x09
0 16-0 0x10 0x00
Access Lipsync Delay control 16-50 0x10 0x32
Cycle VFD information panels 16-55 0x10 0x37
Rewind 16-121 0x10 0x79
Fast Forward 16-52 0x10 0x34
Skip Back 16-33 0x10 0x21
Skip Forward 16-11 0x10 0x0B
Stop 16-54 0x10 0x36
Play 16-53 0x10 0x35
Pause 16-48 0x10 0x30
Disc (Record / Trim Menu) 16-90 0x10 0x5A
Menu (system menu) 16-82 0x10 0x52
Navigate Up 16-86 0x10 0x56
Pop Up (Dolby Volume on/off) 16-70 0x10 0x46
Navigate Left 16-81 0x10 0x51
OK 16-87 0x10 0x57
Navigate Right 16-80 0x10 0x50
Audio (Room EQ on/off) 16-30 0x10 0x1E
Navigate Down 16-85 0x10 0x55
RTN (Subwoofer Trim) 16-51 0x10 0x33
HOME 16-43 0x10 0x2B
Mute 16-13 0x10 0x0D
Volume + 16-16 0x10 0x10
MODE (cycle decode modes) 16-32 0x10 0x20
DISP (change VFD brightness) 16-59 0x10 0x3B
Activate DIRECT mode 16-10 0x10 0x0A
Volume - 16-17 0x10 0x11
Red 16-41 0x10 0x29
Green 16-42 0x10 0x2A
Yellow 16-43 0x10 0x2B
Blue 16-55 0x10 0x37
Radio 16-91 0x10 0x5B
Aux 16-99 0x10 0x63
Net 16-92 0x10 0x5C
USB 16-93 0x10 0x5D
AV 16-94 0x10 0x5E
Sat 16-27 0x10 0x1B
PVR 16-96 0x10 0x60
Game 16-97 0x10 0x61
BD 16-98 0x10 0x62
CD 16-118 0x10 0x76
STB 16-100 0x10 0x64
VCR 16-119 0x10 0x77
Display 16-58 0x10 0x3A
Power On 16-123 0x10 0x7B
Power Off 16-124 0x10 0x7C
Next zone 16-95 0x10 0x5F
Cycle output resolutions 16-47 0x10 0x2F
Access Bass control 16-39 0x10 0x27
Access Speaker Trim controls 16-37 0x10 0x25
Access Treble control 16-14 0x10 0x0E
Random 16-76 0x10 0x4C
Repeat 16-49 0x10 0x31
Direct mode On 16-78 0x10 0x4E
Direct mode Off 16-79 0x10 0x4F
Multi Channel 16-106 0x10 0x6A
Stereo 16-107 0x10 0x6B
Dolby Surround 16-110 0x10 0x6E
DTS Neo:6 Cinema 16-111 0x10 0x6F
DTS Neo:6 Music 16-112 0x10 0x70
DTS Neural:X 16-113 0x10 0x71
Reserved 16-114 0x10 0x72
DTS Virtual:X 16-115 0x10 0x73
5/7 Ch Stereo 16-69 0x10 0x45
Dolby D EX 16-23 0x10 0x17
Mute On 16-26 0x10 0x1A
Mute Off 16-120 0x10 0x78
FM 16-28 0x10 0x1C
DAB 16-72 0x10 0x48
Lip Sync +5ms 16-15 0x10 0x0F
Lip sync -5ms 16-101 0x10 0x65
Sub trim +0.5dB 16-105 0x10 0x69
Sub trim -0.5dB 16-108 0x10 0x6C
Display Off 16-31 0x10 0x1F
Display L1 16-34 0x10 0x22
Display L2 16-35 0x10 0x23
Balance left 16-38 0x10 0x26
Balance right 16-40 0x10 0x28
Bass +1 16-44 0x10 0x2C
Bass -1 16-45 0x10 0x2D
Treble +1 16-46 0x10 0x2E
Treble -1 16-102 0x10 0x66
Zone 2 Follow Zone 1 16-20 0x10 0x14
Select HDMI Out 1 16-73 0x10 0x49
Select HDMI Out 2 16-74 0x10 0x4A
Select HDMI Out 1 & 2 16-75 0x10 0x4B
Zone 2 Power On 23-123 0x17 0x7B
Zone 2 Power Off 23-124 0x17 0x7C
Zone 2 Vol+ 23-1 0x17 0x01
Zone 2 Vol- 23-2 0x17 0x02
Zone 2 Mute 23-3 0x17 0x03
Zone 2 Mute On 23-4 0x17 0x04
Zone 2 Mute Off 23-5 0x17 0x05
Zone 2 CD 23-6 0x17 0x06
Zone 2 BD 23-7 0x17 0x07
Zone 2 STB 23-8 0x17 0x08
Zone 2 AV 23-9 0x17 0x09
Zone 2 Game 23-11 0x17 0x0B
Zone 2 Aux 23-13 0x17 0x0D
Zone 2 PVR 23-15 0x17 0x0F
Zone 2 FM 23-14 0x17 0x0E
Zone 2 DAB 23-16 0x17 0x10
Zone 2 USB 23-18 0x17 0x12
Zone 2 NET 23-19 0x17 0x13
Zone 2 SAT 23-20 0x17 0x14
Zone 2 VCR 23-21 0x17 0x15

AMX Duet discovery. On a fresh TCP connection, send the ASCII string AMX followed by 0x0D. Each model responds with AMXB<Device-SDKClass=Receiver><Device-Make=ARCAM><Device-Model={AVR390|AVR550|AVR850|AV860|SR250}><Device-Revision=x.y.z> followed by 0x0D, where x.y.z is the device's RS-232 protocol version (also reachable via command 0x04 subsystem 0xF0).

Source quirks. The Set/Request Zone 1 OSD example in the source (line 1795-1796) shows command code 0x4A rather than 0x4E; the surrounding command definition consistently uses 0x4E. Use 0x4E per the command-code table.

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:49.892Z
last_checked_at: 2026-06-02T21:39:48.585Z

Verification Summary

verdict: verified
checked_at: 2026-06-02T21:39:48.585Z
matched_actions: 51
action_count: 51
confidence: medium
summary: "All 51 spec actions match source command codes verbatim; transport port 50000, baud 38400, 8N1 all confirmed in source. (5 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "firmware version range not stated in source"
- "Settable numeric parameters (volume, treble, bass, balance, etc.) are"
- "unsolicited notification format not specified in source."
- "no multi-step macro sequences are described in the source."
- "firmware version compatibility ranges not stated; AMX Duet supports all five listed models, but per-subsystem feature differences (e.g. DAB on AVR450/750 only) are partially model-dependent and the source does not enumerate the full per-model feature matrix."

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