Summary

The Arcam AVR Series (AVR390, AVR550, AVR850, AV860, SR250) is a line of high-end AV receivers controllable over RS-232 and TCP/IP (port 50000). Communication uses a framed binary protocol with start (0x21), zone, command code, data length, data, end (0x0D) bytes. A Simulate RC5 IR Command (0x08) provides access to all front-panel/IR remote functions, allowing any operation reachable via the IR remote to be invoked over the control link.

Transport

protocols:
  - serial
  - tcp
serial:
  baud_rate: 38400
  data_bits: 8
  parity: none
  stop_bits: 1
  flow_control: none
  cable: null_modem
  pinout:
    connector_a_pin_2: "Rx → Tx"
    connector_a_pin_3: "Tx → Rx"
    connector_a_pin_5: "RS232 Ground"
addressing:
  port: 50000
auth:
  type: none  # inferred: no auth procedure in source

Traits

- powerable  # inferred from power on/off commands (RC5 16-123 / 16-124, 0x00 power state)
- routable   # inferred from input source selection commands (0x0A, 0x1D, RC5 source keys)
- queryable  # inferred from query commands returning state (0x00, 0x0D, 0x0E, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x42, 0x43, 0x44)
- levelable  # inferred from volume (0x0D), bass/treble (0x35, 0x36), sub trim (0x3F, 0x45), balance (0x3B), Dolby volume/leveller/calibration (0x38, 0x39, 0x3A)

Actions

# FRAME FORMAT
#   REQUEST : 0x21 [Zn] [Cc] [Dl] [Data...] 0x0D
#   RESPONSE: 0x21 [Zn] [Cc] [Ac] [Dl] [Data...] 0x0D
#   Zn (Zone): 0x01 = Zone 1 (master), 0x02 = Zone 2
#   Cc (Command code): see per-action
#   Dl (Data length): number of data bytes following
#   Ac (Answer code): 0x00 status update, 0x82 zone invalid, 0x83 cmd not recognised,
#                     0x84 param not recognised, 0x85 invalid at this time, 0x86 invalid data length
#   St (Start) = 0x21; Et (End) = 0x0D
# Device responds within 3 seconds; RC may send further commands before response received.
# Commands 0xF0-0xFF are RESERVED for test functions - must never be used.

# ─────────── System Commands (0x00-0x09) ───────────

- id: power_request
  label: Request Power State
  kind: query
  command: "0x21 0x{zone} 0x00 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number (1 or 2)
  notes: "Response data: 0x00 = standby, 0x01 = powered on"

- id: display_brightness_request
  label: Request Display Brightness
  kind: query
  command: "0x21 0x01 0x01 0x01 0xF0 0x0D"
  notes: "Response data: 0x00 = off, 0x01 = L1, 0x02 = L2"

- id: headphone_connection_request
  label: Request Headphone Connection
  kind: query
  command: "0x21 0x01 0x02 0x01 0xF0 0x0D"
  notes: "Response data: 0x00 = not connected, 0x01 = connected"

- id: fm_program_type_request
  label: Request FM Program Type
  kind: query
  command: "0x21 0x{zone} 0x03 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number
  notes: "Returns error 0x85 if FM not selected. Response data = programme type in ASCII"

- id: software_version_request
  label: Request Software Version
  kind: query
  command: "0x21 0x01 0x04 0x01 0x{subsystem} 0x0D"
  params:
    - name: subsystem
      type: integer
      description: Subsystem to query
      enum:
        - 0xF0  # RS232 protocol version
        - 0xF1  # Host version
        - 0xF2  # OSD version
        - 0xF3  # DSP version
        - 0xF4  # NET version
        - 0xF5  # IAP version
  notes: "Response echoes subsystem byte, then major and minor version bytes"

- id: restore_factory_defaults
  label: Restore Factory Defaults
  kind: action
  command: "0x21 0x01 0x05 0x02 0xAA 0xAA 0x0D"
  notes: "Confirmation data pattern 0xAA 0xAA required to avoid accidental restore"

- id: save_restore_secure_backup
  label: Save/Restore Secure Backup
  kind: action
  command: "0x21 0x01 0x06 0x07 0x{op} 0x55 0x55 0x{p1} 0x{p2} 0x{p3} 0x{p4} 0x0D"
  params:
    - name: op
      type: integer
      description: "0x00 = save secure backup, 0x01 = restore secure backup"
    - name: p1
      type: integer
      description: PIN digit 1 (0-9)
    - name: p2
      type: integer
      description: PIN digit 2 (0-9)
    - name: p3
      type: integer
      description: PIN digit 3 (0-9)
    - name: p4
      type: integer
      description: PIN digit 4 (0-9)
  notes: "Confirmation pattern 0x55 0x55. Returns 0x85 if no secure copy or while command 0x1E is processing"

- id: simulate_rc5_ir
  label: Simulate RC5 IR Command
  kind: action
  command: "0x21 0x{zone} 0x08 0x02 0x{system} 0x{command} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number
    - name: system
      type: integer
      description: RC5 system code (typically 0x10 for AV, 0x17 for Zone 2)
    - name: command
      type: integer
      description: RC5 command code
  notes: "Triggers any IR-remote function. An additional status message is sent in most cases as a result of the IR command."

- id: display_information_type
  label: Set/Request VFD Display Information Type
  kind: action
  command: "0x21 0x{zone} 0x09 0x01 0x{type} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number
    - name: type
      type: integer
      description: "Display type selector; meaning depends on current source"
  notes: "All sources: 0x00=Processing, 0xE0=cycle, 0xF0=request. FM: 0x01=Radio text, 0x02=Programme type, 0x03=Signal strength. DAB: 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 Commands (0x0A-0x0B) ───────────

- id: video_selection
  label: Set/Request Video Input
  kind: action
  command: "0x21 0x01 0x0A 0x01 0x{input} 0x0D"
  params:
    - name: input
      type: integer
      description: Video source
      enum:
        - 0x00  # BD
        - 0x01  # SAT
        - 0x02  # AV
        - 0x03  # PVR
        - 0x04  # VCR
        - 0x05  # Game
        - 0x06  # STB
        - 0xF0  # Request current input
  notes: "Returns invalid 0x85 if OSD setup screen is showing"

- id: audio_input_select
  label: Set/Request Audio Input Type
  kind: action
  command: "0x21 0x{zone} 0x0B 0x01 0x{type} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number
    - name: type
      type: integer
      description: "0x00 = analogue, 0x01 = digital, 0x02 = HDMI, 0xF0 = request current"
  notes: "Returns invalid 0x85 if OSD setup screen is showing"

# ─────────── Output Commands (0x0C-0x13) ───────────

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

- id: volume_set
  label: Set Volume
  kind: action
  command: "0x21 0x{zone} 0x0D 0x01 0x{volume} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number
    - name: volume
      type: integer
      description: "Volume 0-99 (0x00-0x63)"
      range: [0, 99]
  notes: "Returns volume even if zone is in mute. Use 0x0E to discover mute state."

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

- id: mute_status_request
  label: Request Mute Status
  kind: query
  command: "0x21 0x{zone} 0x0E 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number
  notes: "Response: 0x00 = muted, 0x01 = not muted"

- id: direct_mode_request
  label: Request Direct Mode Status
  kind: query
  command: "0x21 0x01 0x0F 0x01 0xF0 0x0D"
  notes: "Response: 0x00 = Direct off, 0x01 = Direct on"

- id: decode_mode_2ch_request
  label: Request Decode Mode (2-channel)
  kind: query
  command: "0x21 0x01 0x10 0x01 0xF0 0x0D"
  notes: "Response: 0x01=Stereo, 0x04=Dolby Surround, 0x07=Neo:6 Cinema, 0x08=Neo:6 Music, 0x09=5/7Ch Stereo, 0x0A=DTS Neural:X, 0x0B=Reserved, 0x0C=DTS Virtual:X"

- id: decode_mode_mch_request
  label: Request Decode Mode (Multi-channel)
  kind: query
  command: "0x21 0x01 0x11 0x01 0xF0 0x0D"
  notes: "Response: 0x01=Stereo down-mix, 0x02=Multi-channel, 0x03=DTS-ES/Neural:X, 0x06=Dolby Surround, 0x0B=Reserved, 0x0C=DTS Virtual:X"

- id: rds_info_request
  label: Request RDS Information (FM)
  kind: query
  command: "0x21 0x{zone} 0x12 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number
  notes: "Returns error 0x85 if FM not selected. Response = RDS text in ASCII"

- id: video_output_resolution_request
  label: Request Video Output Resolution
  kind: query
  command: "0x21 0x01 0x13 0x01 0xF0 0x0D"
  notes: "Response: 0x02=SD Progressive, 0x03=720p, 0x04=1080i, 0x05=1080p, 0x06=Preferred, 0x07=Bypass, 0x08=4k"

# ─────────── Menu Commands (0x14-0x1C) ───────────

- id: menu_status_request
  label: Request Open Menu Status
  kind: query
  command: "0x21 0x01 0x14 0x01 0xF0 0x0D"
  notes: "Response: 0x00=none, 0x02=Set-up, 0x03=Trim, 0x04=Bass, 0x05=Treble, 0x06=Sync, 0x07=Sub, 0x08=Tuner, 0x09=Network, 0x0A=USB"

- id: tuner_preset
  label: Select/Request Tuner Preset
  kind: action
  command: "0x21 0x{zone} 0x15 0x01 0x{preset} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number
    - name: preset
      type: integer
      description: "Preset number 1-50 (0x01-0x32) or 0xF0 to request current"
      range: [1, 50]
  notes: "Returns error 0x85 if tuner not selected. Response: 0xFF=no preset, 0x01-0x32=preset number"

- id: tune
  label: Increment/Decrement/Request Tuner Frequency
  kind: action
  command: "0x21 0x{zone} 0x16 0x01 0x{direction} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number
    - name: direction
      type: integer
      description: "0x00=Decrement, 0x01=Increment, 0xF0=Request"
  notes: "0.05 MHz FM steps. Returns error 0x85 if tuner not selected"

- id: dab_station_request
  label: Request DAB Station
  kind: query
  command: "0x21 0x{zone} 0x18 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number
  notes: "Returns 16-byte ASCII service label padded with 0x20. Returns 0x85 if DAB not selected."

- id: dab_program_type_request
  label: Request DAB Program Type
  kind: query
  command: "0x21 0x{zone} 0x19 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number
  notes: "Returns 16-byte ASCII programme type padded with 0x20. Returns 0x85 if DAB not selected."

- id: dab_dls_request
  label: Request DAB DLS/PDT Information
  kind: query
  command: "0x21 0x{zone} 0x1A 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number
  notes: "Returns 128-byte ASCII DLS text padded with 0x20. Returns 0x85 if DAB not selected."

- id: preset_details_request
  label: Request Tuner Preset Details
  kind: query
  command: "0x21 0x{zone} 0x1B 0x01 0x{preset} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number
    - name: preset
      type: integer
      description: "Preset number 1-50"
      range: [1, 50]
  notes: "Response includes type (0x01=FM freq, 0x02=FM RDS name, 0x03=DAB) and name"

- id: network_playback_status_request
  label: Request Network Playback Status
  kind: query
  command: "0x21 0x{zone} 0x1C 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number
  notes: "Returns 0x85 if network not selected. Response: 0x00=Navigating, 0x01=Playing, 0x02=Paused, 0xFF=Busy/Not Playing; followed by ASCII folder/file name."

# ─────────── Source / Routing (0x1D, 0x1F) ───────────

- id: current_source_request
  label: Request Current Source
  kind: query
  command: "0x21 0x{zone} 0x1D 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number
  notes: "Response: 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
  label: Set/Request Headphone Over-ride (Mute Relays)
  kind: action
  command: "0x21 0x{zone} 0x1F 0x01 0x{state} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number
    - name: state
      type: integer
      description: "0x00 = Clear (speakers muted if headphones present), 0x01 = Set (speakers unmuted if headphones present)"
  notes: "Does not zero the volume"

# ─────────── Input Name / Scans (0x20, 0x23-0x26) ───────────

- id: input_name
  label: Set/Request Input Name
  kind: action
  command: "0x21 0x{zone} 0x20 0x{n} 0x{name_bytes} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number
    - name: n
      type: integer
      description: "Query: 0x01 (1 byte). Set: ASCII byte length, max 10 characters"
    - name: name_bytes
      type: string
      description: "ASCII name bytes; 0xF0 for query"
  notes: "Set Dl must match the byte count of name_bytes. Query response Dl = 0x0A."

- id: fm_scan
  label: FM Scan Up/Down
  kind: action
  command: "0x21 0x01 0x23 0x01 0x{direction} 0x0D"
  params:
    - name: direction
      type: integer
      description: "0x01 = Scan up, 0x02 = Scan down"
  notes: "Only valid if FM input is active. Response: 0xFF = scanning."

- id: dab_scan
  label: DAB Scan Start
  kind: action
  command: "0x21 0x01 0x24 0x01 0xF0 0x0D"
  notes: "Only valid if DAB input is active. Response: 0xFF = scanning."

- id: heartbeat
  label: Heartbeat (Reset EuP Standby Timer)
  kind: action
  command: "0x21 0x01 0x25 0x01 0xF0 0x0D"
  notes: "Confirms unit is still connected"

- id: reboot
  label: Force Reboot
  kind: action
  command: "0x21 0x01 0x26 0x06 0x52 0x45 0x42 0x4F 0x4F 0x54 0x0D"
  notes: "Confirmation pattern 'REBOOT' (0x52 0x45 0x42 0x4F 0x4F 0x54) required"

# ─────────── Setup Adjustments (0x35-0x4F) ───────────

- id: treble_equalisation
  label: Set/Request Treble Equalisation
  kind: action
  command: "0x21 0x{zone} 0x35 0x01 0x{value} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number
    - name: value
      type: integer
      description: "0x00-0x0C = 0..+12 dB; 0x81-0x8C = -1..-12 dB; 0xF0=request, 0xF1=+1dB, 0xF2=-1dB"
  notes: "Response echoes current value"

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

- id: room_equalisation
  label: Set/Request Room Equalisation
  kind: action
  command: "0x21 0x{zone} 0x37 0x01 0x{value} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number
    - name: value
      type: integer
      description: "0xF0=request, 0xF1=On, 0xF2=Off"
  notes: "Response: 0x00=Off, 0x01=On, 0x02=Not calculated (off)"

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

- id: dolby_leveller
  label: Set/Request Dolby Leveller
  kind: action
  command: "0x21 0x{zone} 0x39 0x01 0x{value} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number
    - name: value
      type: integer
      description: "0x00-0x0A=set 0-10; 0xF0=request, 0xF1=increment, 0xF2=decrement, 0xFF=turn off"

- id: dolby_volume_calibration_offset
  label: Set/Request Dolby Volume Calibration Offset
  kind: action
  command: "0x21 0x{zone} 0x3A 0x01 0x{value} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number
    - name: value
      type: integer
      description: "0x00-0x0F=0..+15dB; 0x80-0x8F=-1..-15dB; 0xF0=request, 0xF1=+1dB, 0xF2=-1dB"

- id: balance
  label: Set/Request Balance
  kind: action
  command: "0x21 0x{zone} 0x3B 0x01 0x{value} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number
    - name: value
      type: integer
      description: "0x00-0x06=0..+6; 0x81-0x86=-1..-6; 0xF0=request, 0xF1=+1, 0xF2=-1"

- id: subwoofer_trim
  label: Set/Request Subwoofer Trim
  kind: action
  command: "0x21 0x{zone} 0x3F 0x01 0x{value} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number
    - name: value
      type: integer
      description: "0x00-0x14=+0..+10dB in 0.5dB steps (e.g. 0x02=+1.0dB); 0x81-0x94=-0.5..-10dB; 0xF0=request, 0xF1=+0.5dB, 0xF2=-0.5dB"

- id: lipsync_delay
  label: Set/Request Lipsync Delay
  kind: action
  command: "0x21 0x{zone} 0x40 0x01 0x{value} 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number
    - name: value
      type: integer
      description: "0x00-0x32=set in 5ms steps (e.g. 0x08=40ms); 0xF0=request, 0xF1=+5ms, 0xF2=-5ms"

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

- id: incoming_video_parameters_request
  label: Request Incoming Video Parameters
  kind: query
  command: "0x21 0x{zone} 0x42 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number
  notes: "Response: 7 bytes - H-res MSB, H-res LSB, V-res MSB, V-res LSB, refresh (Hz), interlaced flag (0x00=Prog, 0x01=Int), aspect (0x00=undef, 0x01=4:3, 0x02=16:9)"

- id: incoming_audio_format_request
  label: Request Incoming Audio Format
  kind: query
  command: "0x21 0x{zone} 0x43 0x01 0xF0 0x0D"
  params:
    - name: zone
      type: integer
      description: Zone number
  notes: "Response: 2 bytes - stream format (e.g. 0x02=Dolby Digital, 0x16=Dolby Atmos, 0x17=DTS:X, 0x18=IMAX ENHANCED) + channel config (0x1A = 5.1)"

- id: incoming_audio_sample_rate_request
  label: Request Incoming Audio Sample Rate
  kind: query
  command: "0x21 0x01 0x44 0x01 0xF0 0x0D"
  notes: "Response: 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
  label: Set/Request Sub Stereo Trim
  kind: action
  command: "0x21 0x01 0x45 0x01 0x{value} 0x0D"
  params:
    - name: value
      type: integer
      description: "0x00=0dB; 0x81-0x94=-0.5..-10dB; 0xF0=request, 0xF1=+0.5dB, 0xF2=-0.5dB"
  notes: "Subwoofer trim in stereo mode"

- id: zone1_osd
  label: Set/Request Zone 1 OSD On/Off
  kind: action
  command: "0x21 0x01 0x4E 0x01 0x{value} 0x0D"
  params:
    - name: value
      type: integer
      description: "0xF0=request, 0xF1=On, 0xF2=Off"
  notes: "Response: 0x00=On, 0x01=Off (note inverted vs. command)"

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

# ─────────── AMX Duet Discovery ───────────

- id: amx_duet_discovery
  label: AMX Duet Dynamic Device Discovery
  kind: action
  command: "\"AMX\\r\""
  notes: "ASCII command on RS-232. Response identifies Device-SDKClass=Receiver, Make=ARCAM, Model, and RS-232 protocol revision."

# ─────────── RC5 IR Commands (sent via simulate_rc5_ir 0x08) ───────────
# All RC5 commands use: 0x21 0x{zone} 0x08 0x02 0x{system} 0x{command} 0x0D
# Zone 1 uses RC5 system 0x10, Zone 2 uses RC5 system 0x17.

- id: rc5_standby
  label: Standby (Zone 1)
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x0C 0x0D"
  notes: "RC5 16-12. Toggles standby for Zone 1."

- id: rc5_power_on_zone1
  label: Power On (Zone 1)
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x7B 0x0D"
  notes: "RC5 16-123"

- id: rc5_power_off_zone1
  label: Power Off (Zone 1)
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x7C 0x0D"
  notes: "RC5 16-124"

- id: rc5_volume_up
  label: Volume Up
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x10 0x0D"
  notes: "RC5 16-16"

- id: rc5_volume_down
  label: Volume Down
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x11 0x0D"
  notes: "RC5 16-17"

- id: rc5_mute
  label: Mute Toggle
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x0D 0x0D"
  notes: "RC5 16-13"

- id: rc5_mute_on
  label: Mute On
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x1A 0x0D"
  notes: "RC5 16-26"

- id: rc5_mute_off
  label: Mute Off
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x78 0x0D"
  notes: "RC5 16-120"

- id: rc5_direct_mode
  label: Activate Direct Mode Toggle
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x0A 0x0D"
  notes: "RC5 16-10"

- id: rc5_direct_mode_on
  label: Direct Mode On
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x4E 0x0D"
  notes: "RC5 16-78"

- id: rc5_direct_mode_off
  label: Direct Mode Off
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x4F 0x0D"
  notes: "RC5 16-79"

- id: rc5_mode_cycle
  label: Cycle Decode Mode
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x20 0x0D"
  notes: "RC5 16-32"

- id: rc5_stereo
  label: Decode Mode: Stereo
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x6B 0x0D"
  notes: "RC5 16-107"

- id: rc5_multi_channel
  label: Decode Mode: Multi-Channel
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x6A 0x0D"
  notes: "RC5 16-106"

- id: rc5_dolby_surround
  label: Decode Mode: Dolby Surround
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x6E 0x0D"
  notes: "RC5 16-110"

- id: rc5_dts_neo6_cinema
  label: Decode Mode: DTS Neo:6 Cinema
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x6F 0x0D"
  notes: "RC5 16-111"

- id: rc5_dts_neo6_music
  label: Decode Mode: DTS Neo:6 Music
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x70 0x0D"
  notes: "RC5 16-112"

- id: rc5_dts_neural_x
  label: Decode Mode: DTS Neural:X
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x71 0x0D"
  notes: "RC5 16-113"

- id: rc5_dts_virtual_x
  label: Decode Mode: DTS Virtual:X
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x73 0x0D"
  notes: "RC5 16-115"

- id: rc5_5_7ch_stereo
  label: Decode Mode: 5/7 Channel Stereo
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x45 0x0D"
  notes: "RC5 16-69"

- id: rc5_dolby_d_ex
  label: Decode Mode: Dolby D EX
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x17 0x0D"
  notes: "RC5 16-23"

# Source select (Zone 1)
- id: rc5_source_cd
  label: Source: CD
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x76 0x0D"
  notes: "RC5 16-118"

- id: rc5_source_bd
  label: Source: BD
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x62 0x0D"
  notes: "RC5 16-98"

- id: rc5_source_stb
  label: Source: STB
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x64 0x0D"
  notes: "RC5 16-100"

- id: rc5_source_av
  label: Source: AV
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x5E 0x0D"
  notes: "RC5 16-94"

- id: rc5_source_sat
  label: Source: SAT
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x1B 0x0D"
  notes: "RC5 16-27"

- id: rc5_source_pvr
  label: Source: PVR
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x60 0x0D"
  notes: "RC5 16-96"

- id: rc5_source_game
  label: Source: Game
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x61 0x0D"
  notes: "RC5 16-97"

- id: rc5_source_vcr
  label: Source: VCR
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x77 0x0D"
  notes: "RC5 16-119"

- id: rc5_source_aux
  label: Source: AUX
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x63 0x0D"
  notes: "RC5 16-99"

- id: rc5_source_net
  label: Source: NET
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x5C 0x0D"
  notes: "RC5 16-92"

- id: rc5_source_usb
  label: Source: USB
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x5D 0x0D"
  notes: "RC5 16-93"

- id: rc5_source_fm
  label: Source: FM
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x1C 0x0D"
  notes: "RC5 16-28"

- id: rc5_source_dab
  label: Source: DAB
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x48 0x0D"
  notes: "RC5 16-72"

- id: rc5_source_radio
  label: Source: Radio
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x5B 0x0D"
  notes: "RC5 16-91"

- id: rc5_source_display
  label: Source: Display
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x3A 0x0D"
  notes: "RC5 16-58"

# HDMI output select
- id: rc5_hdmi_out_1
  label: Select HDMI Out 1
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x49 0x0D"
  notes: "RC5 16-73"

- id: rc5_hdmi_out_2
  label: Select HDMI Out 2
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x4A 0x0D"
  notes: "RC5 16-74"

- id: rc5_hdmi_out_1_2
  label: Select HDMI Out 1 & 2
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x4B 0x0D"
  notes: "RC5 16-75"

- id: rc5_cycle_resolution
  label: Cycle Output Resolutions
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x2F 0x0D"
  notes: "RC5 16-47"

# Transport / playback
- id: rc5_play
  label: Play
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x35 0x0D"
  notes: "RC5 16-53"

- id: rc5_pause
  label: Pause
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x30 0x0D"
  notes: "RC5 16-48"

- id: rc5_stop
  label: Stop
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x36 0x0D"
  notes: "RC5 16-54"

- id: rc5_rewind
  label: Rewind
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x79 0x0D"
  notes: "RC5 16-121"

- id: rc5_fast_forward
  label: Fast Forward
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x34 0x0D"
  notes: "RC5 16-52"

- id: rc5_skip_back
  label: Skip Back
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x21 0x0D"
  notes: "RC5 16-33"

- id: rc5_skip_forward
  label: Skip Forward
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x0B 0x0D"
  notes: "RC5 16-11"

- id: rc5_random
  label: Random
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x4C 0x0D"
  notes: "RC5 16-76"

- id: rc5_repeat
  label: Repeat
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x31 0x0D"
  notes: "RC5 16-49"

# Navigation / menu
- id: rc5_menu
  label: Menu (Enter System Menu)
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x52 0x0D"
  notes: "RC5 16-82"

- id: rc5_home
  label: Home
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x2B 0x0D"
  notes: "RC5 16-43 (note: same as Yellow in source table)"

- id: rc5_disc
  label: Disc / Enter Trim Menu
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x5A 0x0D"
  notes: "RC5 16-90"

- id: rc5_rtn
  label: Return (Access Subwoofer Trim)
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x33 0x0D"
  notes: "RC5 16-51"

- id: rc5_nav_up
  label: Navigate Up
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x56 0x0D"
  notes: "RC5 16-86"

- id: rc5_nav_down
  label: Navigate Down
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x55 0x0D"
  notes: "RC5 16-85"

- id: rc5_nav_left
  label: Navigate Left
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x51 0x0D"
  notes: "RC5 16-81"

- id: rc5_nav_right
  label: Navigate Right
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x50 0x0D"
  notes: "RC5 16-80"

- id: rc5_ok
  label: OK
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x57 0x0D"
  notes: "RC5 16-87"

- id: rc5_red
  label: Red
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x29 0x0D"
  notes: "RC5 16-41"

- id: rc5_green
  label: Green
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x2A 0x0D"
  notes: "RC5 16-42"

- id: rc5_yellow
  label: Yellow
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x2B 0x0D"
  notes: "RC5 16-43 (same code as Home - source has the same RC5 code for both)"

- id: rc5_blue
  label: Blue
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x37 0x0D"
  notes: "RC5 16-55 (same as Cycle VFD in source table)"

- id: rc5_popup
  label: Pop Up / Dolby Volume On/Off
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x46 0x0D"
  notes: "RC5 16-70"

- id: rc5_audio
  label: Audio / Room EQ On/Off
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x1E 0x0D"
  notes: "RC5 16-30"

# Display
- id: rc5_disp_brightness
  label: Change VFD Brightness
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x3B 0x0D"
  notes: "RC5 16-59. Cycles Front panel off / L1 / L2."

- id: rc5_display_off
  label: Display Off
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x1F 0x0D"
  notes: "RC5 16-31"

- id: rc5_display_l1
  label: Display L1
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x22 0x0D"
  notes: "RC5 16-34"

- id: rc5_display_l2
  label: Display L2
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x23 0x0D"
  notes: "RC5 16-35"

- id: rc5_cycle_vfd
  label: Cycle VFD Information Panels
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x37 0x0D"
  notes: "RC5 16-55 (same code as Blue)"

# Setup adjustments via RC5
- id: rc5_lipsync_plus5
  label: Lipsync +5 ms
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x0F 0x0D"
  notes: "RC5 16-15"

- id: rc5_lipsync_minus5
  label: Lipsync −5 ms
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x65 0x0D"
  notes: "RC5 16-101"

- id: rc5_sub_trim_plus
  label: Sub Trim +0.5 dB
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x69 0x0D"
  notes: "RC5 16-105"

- id: rc5_sub_trim_minus
  label: Sub Trim −0.5 dB
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x6C 0x0D"
  notes: "RC5 16-108"

- id: rc5_bass_plus
  label: Bass +1
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x2C 0x0D"
  notes: "RC5 16-44"

- id: rc5_bass_minus
  label: Bass −1
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x2D 0x0D"
  notes: "RC5 16-45"

- id: rc5_treble_plus
  label: Treble +1
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x2E 0x0D"
  notes: "RC5 16-46"

- id: rc5_treble_minus
  label: Treble −1
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x66 0x0D"
  notes: "RC5 16-102"

- id: rc5_balance_left
  label: Balance Left
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x26 0x0D"
  notes: "RC5 16-38"

- id: rc5_balance_right
  label: Balance Right
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x28 0x0D"
  notes: "RC5 16-40"

- id: rc5_access_bass
  label: Access Bass Control
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x27 0x0D"
  notes: "RC5 16-39"

- id: rc5_access_treble
  label: Access Treble Control
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x0E 0x0D"
  notes: "RC5 16-14"

- id: rc5_access_speaker_trim
  label: Access Speaker Trim
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x25 0x0D"
  notes: "RC5 16-37"

- id: rc5_access_lipsync
  label: Access Lipsync Delay Control
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x32 0x0D"
  notes: "RC5 16-50"

# Number pad
- id: rc5_num_0
  label: Numeric 0
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x00 0x0D"
  notes: "RC5 16-0"

- id: rc5_num_1
  label: Numeric 1
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x01 0x0D"
  notes: "RC5 16-1"

- id: rc5_num_2
  label: Numeric 2
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x02 0x0D"
  notes: "RC5 16-2"

- id: rc5_num_3
  label: Numeric 3
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x03 0x0D"
  notes: "RC5 16-3"

- id: rc5_num_4
  label: Numeric 4
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x04 0x0D"
  notes: "RC5 16-4"

- id: rc5_num_5
  label: Numeric 5
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x05 0x0D"
  notes: "RC5 16-5"

- id: rc5_num_6
  label: Numeric 6
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x06 0x0D"
  notes: "RC5 16-6"

- id: rc5_num_7
  label: Numeric 7
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x07 0x0D"
  notes: "RC5 16-7"

- id: rc5_num_8
  label: Numeric 8
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x08 0x0D"
  notes: "RC5 16-8"

- id: rc5_num_9
  label: Numeric 9
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x09 0x0D"
  notes: "RC5 16-9"

- id: rc5_next_zone
  label: Change Control to Next Zone
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x5F 0x0D"
  notes: "RC5 16-95"

# ─────────── Zone 2 (RC5 system 0x17) ───────────

- id: rc5_z2_set_follow_z1
  label: Set Zone 2 to Follow Zone 1
  kind: action
  command: "0x21 0x01 0x08 0x02 0x10 0x14 0x0D"
  notes: "RC5 16-20. Sent on Zone 1 (system 0x10); effect is on Zone 2."

- id: rc5_z2_power_on
  label: Zone 2 Power On
  kind: action
  command: "0x21 0x02 0x08 0x02 0x17 0x7B 0x0D"
  notes: "RC5 23-123 (system 0x17)"

- id: rc5_z2_power_off
  label: Zone 2 Power Off
  kind: action
  command: "0x21 0x02 0x08 0x02 0x17 0x7C 0x0D"
  notes: "RC5 23-124"

- id: rc5_z2_volume_up
  label: Zone 2 Volume Up
  kind: action
  command: "0x21 0x02 0x08 0x02 0x17 0x01 0x0D"
  notes: "RC5 23-1"

- id: rc5_z2_volume_down
  label: Zone 2 Volume Down
  kind: action
  command: "0x21 0x02 0x08 0x02 0x17 0x02 0x0D"
  notes: "RC5 23-2"

- id: rc5_z2_mute
  label: Zone 2 Mute Toggle
  kind: action
  command: "0x21 0x02 0x08 0x02 0x17 0x03 0x0D"
  notes: "RC5 23-3"

- id: rc5_z2_mute_on
  label: Zone 2 Mute On
  kind: action
  command: "0x21 0x02 0x08 0x02 0x17 0x04 0x0D"
  notes: "RC5 23-4"

- id: rc5_z2_mute_off
  label: Zone 2 Mute Off
  kind: action
  command: "0x21 0x02 0x08 0x02 0x17 0x05 0x0D"
  notes: "RC5 23-5"

- id: rc5_z2_source_cd
  label: Zone 2 Source: CD
  kind: action
  command: "0x21 0x02 0x08 0x02 0x17 0x06 0x0D"
  notes: "RC5 23-6"

- id: rc5_z2_source_bd
  label: Zone 2 Source: BD
  kind: action
  command: "0x21 0x02 0x08 0x02 0x17 0x07 0x0D"
  notes: "RC5 23-7"

- id: rc5_z2_source_stb
  label: Zone 2 Source: STB
  kind: action
  command: "0x21 0x02 0x08 0x02 0x17 0x08 0x0D"
  notes: "RC5 23-8"

- id: rc5_z2_source_av
  label: Zone 2 Source: AV
  kind: action
  command: "0x21 0x02 0x08 0x02 0x17 0x09 0x0D"
  notes: "RC5 23-9"

- id: rc5_z2_source_game
  label: Zone 2 Source: Game
  kind: action
  command: "0x21 0x02 0x08 0x02 0x17 0x0B 0x0D"
  notes: "RC5 23-11"

- id: rc5_z2_source_aux
  label: Zone 2 Source: AUX
  kind: action
  command: "0x21 0x02 0x08 0x02 0x17 0x0D 0x0D"
  notes: "RC5 23-13"

- id: rc5_z2_source_pvr
  label: Zone 2 Source: PVR
  kind: action
  command: "0x21 0x02 0x08 0x02 0x17 0x0F 0x0D"
  notes: "RC5 23-15"

- id: rc5_z2_source_fm
  label: Zone 2 Source: FM
  kind: action
  command: "0x21 0x02 0x08 0x02 0x17 0x0E 0x0D"
  notes: "RC5 23-14"

- id: rc5_z2_source_dab
  label: Zone 2 Source: DAB
  kind: action
  command: "0x21 0x02 0x08 0x02 0x17 0x10 0x0D"
  notes: "RC5 23-16"

- id: rc5_z2_source_usb
  label: Zone 2 Source: USB
  kind: action
  command: "0x21 0x02 0x08 0x02 0x17 0x12 0x0D"
  notes: "RC5 23-18"

- id: rc5_z2_source_net
  label: Zone 2 Source: NET
  kind: action
  command: "0x21 0x02 0x08 0x02 0x17 0x13 0x0D"
  notes: "RC5 23-19"

- id: rc5_z2_source_sat
  label: Zone 2 Source: SAT
  kind: action
  command: "0x21 0x02 0x08 0x02 0x17 0x14 0x0D"
  notes: "RC5 23-20"

- id: rc5_z2_source_vcr
  label: Zone 2 Source: VCR
  kind: action
  command: "0x21 0x02 0x08 0x02 0x17 0x15 0x0D"
  notes: "RC5 23-21"

Feedbacks

# Answer codes returned in Ac (answer) byte of every response
- id: answer_code
  type: enum
  values:
    - 0x00  # Status update / OK
    - 0x82  # Zone invalid
    - 0x83  # Command not recognised
    - 0x84  # Parameter not recognised
    - 0x85  # Command invalid at this time (e.g. tuner query when tuner not selected)
    - 0x86  # Invalid data length

- id: power_state
  type: enum
  values: [standby, on]  # 0x00 / 0x01

- id: display_brightness
  type: enum
  values: [off, L1, L2]  # 0x00 / 0x01 / 0x02

- id: headphone_connection
  type: enum
  values: [disconnected, connected]  # 0x00 / 0x01

- id: mute_state
  type: enum
  values: [muted, unmuted]  # 0x00 / 0x01

- id: direct_mode_state
  type: enum
  values: [off, on]  # 0x00 / 0x01

- id: decode_mode_2ch
  type: enum
  values: [stereo, dolby_surround, neo6_cinema, neo6_music, "5_7ch_stereo", dts_neural_x, reserved, dts_virtual_x]
  # 0x01 / 0x04 / 0x07 / 0x08 / 0x09 / 0x0A / 0x0B / 0x0C

- id: decode_mode_mch
  type: enum
  values: [stereo_downmix, multichannel, dts_es_neural_x, dolby_surround, reserved, dts_virtual_x]
  # 0x01 / 0x02 / 0x03 / 0x06 / 0x0B / 0x0C

- id: video_output_resolution
  type: enum
  values: [sd_progressive, "720p", "1080i", "1080p", preferred, bypass, "4k"]
  # 0x02 / 0x03 / 0x04 / 0x05 / 0x06 / 0x07 / 0x08

- id: open_menu
  type: enum
  values: [none, setup, trim, bass, treble, sync, sub, tuner, network, usb]
  # 0x00 / 0x02 / 0x03 / 0x04 / 0x05 / 0x06 / 0x07 / 0x08 / 0x09 / 0x0A

- id: source
  type: enum
  values: [follow_z1, cd, bd, av, sat, pvr, vcr, aux, display, tuner_fm, tuner_dab, net, usb, stb, game]
  # 0x00 / 0x01 / 0x02 / 0x03 / 0x04 / 0x05 / 0x06 / 0x08 / 0x09 / 0x0B / 0x0C (AVR450/750 only) / 0x0E / 0x0F / 0x10 / 0x11

- id: imax_enhanced_state
  type: enum
  values: [off, on, auto]  # 0x00 / 0x01 / 0x02

- id: room_eq_state
  type: enum
  values: [off, on, not_calculated]  # 0x00 / 0x01 / 0x02

- id: dolby_volume_state
  type: enum
  values: [off, on]  # 0x00 / 0x01

- id: network_playback_state
  type: enum
  values: [navigating, playing, paused, busy]  # 0x00 / 0x01 / 0x02 / 0xFF

- id: zone1_osd_state
  type: enum
  values: [on, off]  # 0x00 / 0x01 (note: inverted vs. command)

- id: hdmi_output
  type: enum
  values: [out_1, out_2, "out_1_and_2"]  # 0x02 / 0x03 / 0x04

Variables

# Tunable numeric parameters exposed via dedicated 0xNN commands
# Volume is set in 0x0D action. Other continuous levels use 0xNN set command + 0xF0 query.

- id: volume
  type: integer
  range: [0, 99]
  unit: "0-99 (no dB scale stated)"
  command: "0x21 0x{zone} 0x0D 0x01 0x{value} 0x0D"

- id: treble_db
  type: integer
  range: [-12, 12]
  unit: dB
  command: "0x21 0x{zone} 0x35 0x01 0x{encoded} 0x0D"
  notes: "0..+12dB encoded 0x00-0x0C; -1..-12dB encoded 0x81-0x8C"

- id: bass_db
  type: integer
  range: [-12, 12]
  unit: dB
  command: "0x21 0x{zone} 0x36 0x01 0x{encoded} 0x0D"
  notes: "Same encoding as treble"

- id: balance
  type: integer
  range: [-6, 6]
  command: "0x21 0x{zone} 0x3B 0x01 0x{encoded} 0x0D"
  notes: "0..+6 encoded 0x00-0x06; -1..-6 encoded 0x81-0x86"

- id: subwoofer_trim_db
  type: number
  range: [-10.0, 10.0]
  step: 0.5
  unit: dB
  command: "0x21 0x{zone} 0x3F 0x01 0x{encoded} 0x0D"
  notes: "+0..+10dB encoded 0x00-0x14 (0.5dB steps); -0.5..-10dB encoded 0x81-0x94"

- id: sub_stereo_trim_db
  type: number
  range: [-10.0, 0.0]
  step: 0.5
  unit: dB
  command: "0x21 0x01 0x45 0x01 0x{encoded} 0x0D"
  notes: "0dB encoded 0x00; -0.5..-10dB encoded 0x81-0x94"

- id: lipsync_delay_ms
  type: integer
  range: [0, 250]
  step: 5
  unit: ms
  command: "0x21 0x{zone} 0x40 0x01 0x{value} 0x0D"
  notes: "0x00-0x32 (0-250ms) in 5ms steps"

- id: compression
  type: enum
  values: [off, medium, high]  # 0x00 / 0x01 / 0x02
  command: "0x21 0x{zone} 0x41 0x01 0x{value} 0x0D"

- id: dolby_leveller
  type: integer
  range: [0, 10]
  command: "0x21 0x{zone} 0x39 0x01 0x{value} 0x0D"
  notes: "0x00-0x0A, or 0xFF to turn off"

- id: dolby_volume_calibration_offset_db
  type: integer
  range: [-15, 15]
  unit: dB
  command: "0x21 0x{zone} 0x3A 0x01 0x{encoded} 0x0D"
  notes: "0..+15dB encoded 0x00-0x0F; -1..-15dB encoded 0x80-0x8F"

- id: audio_input_type
  type: enum
  values: [analogue, digital, hdmi]  # 0x00 / 0x01 / 0x02
  command: "0x21 0x{zone} 0x0B 0x01 0x{value} 0x0D"

- id: video_input
  type: enum
  values: [bd, sat, av, pvr, vcr, game, stb]  # 0x00-0x06
  command: "0x21 0x01 0x0A 0x01 0x{value} 0x0D"

- id: hdmi_output
  type: enum
  values: [out_1, out_2, out_1_and_2]  # 0x02 / 0x03 / 0x04
  command: "0x21 0x01 0x4F 0x01 0x{value} 0x0D"

- id: zone1_osd
  type: enum
  values: [on, off]  # 0xF1 / 0xF2
  command: "0x21 0x01 0x4E 0x01 0x{value} 0x0D"

- id: vfd_display_type
  type: integer
  description: "Context-dependent on current source (see display_information_type action notes)"
  command: "0x21 0x{zone} 0x09 0x01 0x{type} 0x0D"

- id: input_name
  type: string
  max_length: 10
  command: "0x21 0x{zone} 0x20 0x{n} 0x{name_bytes} 0x0D"

- id: tuner_preset
  type: integer
  range: [1, 50]
  command: "0x21 0x{zone} 0x15 0x01 0x{value} 0x0D"

- id: fm_tune_step
  type: number
  step: 0.05
  unit: MHz
  command: "0x21 0x{zone} 0x16 0x01 0x{direction} 0x0D"
  notes: "direction: 0x00 decrement, 0x01 increment"

Events

# Unsolicited state-change notifications sent by the AV to the RC when state changes
# happen via front panel or IR remote (e.g. display brightness change, decode mode change).
# Same framing as a normal response; see specific 0xNN responses for payload format.
- id: state_change_notification
  description: "When the AV state changes due to front-panel or IR input, the appropriate 0xNN response frame is sent to the RC. Documented examples: display brightness change (0x01), decode mode change (0x10/0x11), source change (0x1D)."

Macros

# UNRESOLVED: source describes no explicit multi-step macro sequences beyond individual
# commands and IR simulation. Power-on sequencing, mode-to-input chains, etc. are not
# described as atomic macros in the source.

Safety

confirmation_required_for:
  - restore_factory_defaults  # 0x05 requires 0xAA 0xAA
  - save_restore_secure_backup  # 0x06 requires 0x55 0x55 + 4-digit PIN
  - reboot  # 0x26 requires ASCII pattern "REBOOT"
interlocks: []
# UNRESOLVED: no explicit electrical safety, interlock, or power-sequencing
# warnings documented in the source. The confirmations above are the only
# destructive-action guards stated.

Notes

RS-232 and IP are separately enabled via OSD Control setting; disabled by default for minimum standby power. RS-232 can be enabled from the front panel by holding DIRECT for 4 seconds. IP control listens on TCP port 50000.

Cable is null-modem (pins 2-3 crossed, pin 5 ground). Frame format uses 38,400 bps, 8N1, no flow control. The device always responds to a command within 3 seconds; the controller may send further commands before a previous response is received. Commands 0xF0-0xFF are reserved for test and must not be used.

The Simulate RC5 IR Command (0x08) makes any IR-remote-reachable function available over the control link. Power On/Off, source selection, volume, transport, decode modes, navigation, and OSD setup are all primarily accessed this way. Most RC5 commands trigger an additional unsolicited status-update frame reflecting the new state.

Source table contains internal inconsistencies flagged in the notes field:

  • RC5 16-43 is listed for both "HOME" and "Yellow"
  • RC5 16-55 is listed for both "Cycle between VFD information panels" and "Blue"

AMX Duet Dynamic Device Discovery is supported by sending ASCII AMX\r; the unit replies with model identifier and RS232 protocol revision. Models covered: AVR390, AVR550, AVR850, AV860, SR250.

DAB-specific commands (0x0C source, 0x18, 0x19, 0x1A) apply to AVR450/AVR750 — this document applies to AVR390/AVR550/AVR850/AV860/SR250; DAB is not stated as supported on these models in the source.

Some commands fail with answer 0x85 when the OSD setup menu is open, or when a source-specific query is issued against an inactive source (e.g. FM query while on BD input).

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

Verification Summary

verdict: verified
checked_at: 2026-06-02T21:39:49.328Z
matched_actions: 167
action_count: 167
confidence: medium
summary: "All 167 spec actions match verbatim source command opcodes and RC5 table entries; transport parameters confirmed. (11 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "firmware version compatibility not stated in source"
- "RS-232 connector type/pinout on chassis not specified beyond null-modem wiring"
- "TCP authentication method (if any) not stated in source; described as port 50000 only"
- "zone 2 commands beyond IR simulation not enumerated as separate 0xNN opcodes; zone 2 source select via 0x1D only"
- "maximum concurrent control connections, keepalive, reconnection behavior not specified"
- "source describes no explicit multi-step macro sequences beyond individual"
- "no explicit electrical safety, interlock, or power-sequencing"
- "complete set of answer-code error conditions per command not enumerated"
- "maximum IP control connection count and behavior on concurrent access not stated"
- "IAP version (0xF5 in 0x04) and 0x1E save-in-progress guard not described in detail"
- "DAB support claim is \"AVR450/750 only\" in source, but spec is for AVR390/550/850/860/SR250 — applicability unverified"

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