Summary
The Rotel RCX-1500 is a CD receiver with FM/DAB/iRadio/network/USB sources, controlled over RS-232C using an ASCII text protocol (no device ID, no checksum). Every command and most responses are terminated with a single ! byte; variable-length display data responses use a 2- or 3-digit byte count prefix instead. Hardware flow control is not supported.
Transport
protocols:
- serial
serial:
baud_rate: 115200
data_bits: 8
parity: none
stop_bits: 1
flow_control: none
auth:
type: none # inferred: no auth procedure in source; protocol has no device ID, no checksum, no login
Traits
- powerable # power_on!, power_off!, power_toggle!
- levelable # volume_up/down/max/min/n, mute_on/off/toggle
- routable # cd/iradio/network/aux1_coax/aux1_opt/aux2/fm/dab/usb source select
- queryable # get_* feedback command list (Section 2)
- playable # play/stop/pause/track_fwd/track_back/fast_fwd/fast_back/random/repeat
Actions
- id: power_on
label: Power On
kind: action
command: "power_on!"
params: []
- id: power_off
label: Power Off
kind: action
command: "power_off!"
params: []
- id: power_toggle
label: Power Toggle
kind: action
command: "power_toggle!"
params: []
- id: volume_up
label: Volume Up
kind: action
command: "volume_up!"
params: []
- id: volume_down
label: Volume Down
kind: action
command: "volume_down!"
params: []
- id: volume_max
label: Set Volume to Max
kind: action
command: "volume_max!"
params: []
- id: volume_min
label: Set Volume to Min
kind: action
command: "volume_min!"
params: []
- id: volume_set
label: Set Volume to level n
kind: action
command: "volume_{n}!"
params:
- name: n
type: integer
description: Volume level (1-86)
- id: mute_toggle
label: Mute Toggle
kind: action
command: "mute!"
params: []
- id: mute_on
label: Mute On
kind: action
command: "mute_on!"
params: []
- id: mute_off
label: Mute Off
kind: action
command: "mute_off!"
params: []
- id: source_cd
label: Source CD
kind: action
command: "cd!"
params: []
- id: source_iradio
label: Source iRadio
kind: action
command: "iradio!"
params: []
- id: source_network
label: Source Network
kind: action
command: "network!"
params: []
- id: source_aux1_coax
label: Source Aux 1 Coax
kind: action
command: "aux1_coax!"
params: []
- id: source_aux1_opt
label: Source Aux 1 Optical
kind: action
command: "aux1_opt!"
params: []
- id: source_aux2
label: Source Aux 2
kind: action
command: "aux2!"
params: []
- id: source_fm
label: Source FM
kind: action
command: "fm!"
params: []
- id: source_dab
label: Source DAB
kind: action
command: "dab!"
params: []
- id: source_usb
label: Source USB
kind: action
command: "usb!"
params: []
- id: source_aux1_toggle
label: Source Aux 1 Coax/Opt Toggle
kind: action
command: "aux1!"
params: []
- id: play
label: Play Source
kind: action
command: "play!"
params: []
- id: stop
label: Stop Source
kind: action
command: "stop!"
params: []
- id: pause
label: Pause Source
kind: action
command: "pause!"
params: []
- id: track_fwd
label: Track Forward / Tune Up
kind: action
command: "track_fwd!"
params: []
- id: track_back
label: Track Backward / Tune Down
kind: action
command: "track_back!"
params: []
- id: fast_fwd
label: Fast Forward / Search Forward
kind: action
command: "fast_fwd!"
params: []
- id: fast_back
label: Fast Backward / Search Backward
kind: action
command: "fast_back!"
params: []
- id: eject
label: Eject CD
kind: action
command: "eject!"
params: []
- id: random_toggle
label: Random Play Mode Toggle
kind: action
command: "random!"
params: []
- id: repeat_toggle
label: Repeat Play Mode Toggle
kind: action
command: "repeat!"
params: []
- id: menu
label: Display the Menu
kind: action
command: "menu!"
params: []
- id: exit
label: Exit Key
kind: action
command: "exit!"
params: []
- id: cursor_up
label: Cursor Up
kind: action
command: "up!"
params: []
- id: cursor_down
label: Cursor Down
kind: action
command: "down!"
params: []
- id: cursor_left
label: Cursor Left
kind: action
command: "left!"
params: []
- id: cursor_right
label: Cursor Right
kind: action
command: "right!"
params: []
- id: enter
label: Enter Key
kind: action
command: "enter!"
params: []
- id: enter_long
label: Long Press for Enter Key
kind: action
command: "enter_long!"
params: []
- id: num_1
label: Number Key 1
kind: action
command: "1!"
params: []
- id: num_2
label: Number Key 2
kind: action
command: "2!"
params: []
- id: num_3
label: Number Key 3
kind: action
command: "3!"
params: []
- id: num_4
label: Number Key 4
kind: action
command: "4!"
params: []
- id: num_5
label: Number Key 5
kind: action
command: "5!"
params: []
- id: num_6
label: Number Key 6
kind: action
command: "6!"
params: []
- id: num_7
label: Number Key 7
kind: action
command: "7!"
params: []
- id: num_8
label: Number Key 8
kind: action
command: "8!"
params: []
- id: num_9
label: Number Key 9
kind: action
command: "9!"
params: []
- id: num_0
label: Number Key 0
kind: action
command: "0!"
params: []
- id: num_10_plus
label: Number Key 10+
kind: action
command: "10_plus!"
params: []
- id: preset_memory
label: Select Memory for Saving Presets
kind: action
command: "memory!"
params: []
- id: call_iradio_preset
label: Recall iRadio Preset n
kind: action
command: "call_iradio_preset_{n}!"
params:
- name: n
type: integer
description: Preset number (01-30), zero-padded two digits
- id: call_fm_preset
label: Recall FM Preset n
kind: action
command: "call_fm_preset_{n}!"
params:
- name: n
type: integer
description: Preset number (01-30), zero-padded two digits
- id: call_dab_preset
label: Recall DAB Preset n
kind: action
command: "call_dab_preset_{n}!"
params:
- name: n
type: integer
description: Preset number (01-30), zero-padded two digits
- id: cd_scan
label: CD Title Scan
kind: action
command: "scan!"
params: []
- id: cd_time_toggle
label: Toggle CD Time Display
kind: action
command: "time!"
params: []
- id: dimmer_toggle
label: Toggle Display Dimmer
kind: action
command: "dimmer!"
params: []
- id: display_update_auto
label: Set Display Update to Auto
kind: action
command: "display_update_auto!"
params: []
- id: display_update_manual
label: Set Display Update to Manual
kind: action
command: "display_update_manual!"
params: []
- id: get_display
label: Request entire display
kind: query
command: "get_display!"
params: []
- id: get_display1
label: Request display line 1
kind: query
command: "get_display1!"
params: []
- id: get_display2
label: Request display line 2
kind: query
command: "get_display2!"
params: []
- id: get_display3
label: Request display line 3
kind: query
command: "get_display3!"
params: []
- id: get_display4
label: Request display line 4
kind: query
command: "get_display4!"
params: []
- id: get_product_type
label: Request product type
kind: query
command: "get_product_type!"
params: []
- id: get_product_version
label: Request main CPU software version
kind: query
command: "get_product_version!"
params: []
- id: get_display_size
label: Request display size
kind: query
command: "get_display_size!"
params: []
- id: get_display_update
label: Request display update mode
kind: query
command: "get_display_update!"
params: []
- id: get_current_power
label: Request current power status
kind: query
command: "get_current_power!"
params: []
- id: get_current_source
label: Request current source
kind: query
command: "get_current_source!"
params: []
- id: get_current_preset
label: Request current preset
kind: query
command: "get_current_preset!"
params: []
- id: get_iradio_preset
label: Request saved iRadio station info for preset n
kind: query
command: "get_iradio_preset_{n}!"
params:
- name: n
type: integer
description: Preset number (1-30)
- id: get_allpreset_iradio
label: Request all saved iRadio station info [1..30]
kind: query
command: "get_allpreset_iradio!"
params: []
- id: get_fm_preset
label: Request saved FM station info for preset n
kind: query
command: "get_fm_preset_{n}!"
params:
- name: n
type: integer
description: Preset number (1-30)
- id: get_allpreset_fm
label: Request all saved FM station info [1..30]
kind: query
command: "get_allpreset_fm!"
params: []
- id: get_dab_preset
label: Request saved DAB station info for preset n
kind: query
command: "get_dab_preset_{n}!"
params:
- name: n
type: integer
description: Preset number (1-30)
- id: get_allpreset_dab
label: Request all saved DAB station info [1..30]
kind: query
command: "get_allpreset_dab!"
params: []
- id: get_cd_tray_status
label: Request CD tray status
kind: query
command: "get_cd_tray_status!"
params: []
- id: get_cd_play_status
label: Request CD play status
kind: query
command: "get_cd_play_status!"
params: []
- id: get_play_status
label: Request play status (non-CD source playback)
kind: query
command: "get_play_status!"
params: []
- id: get_volume
label: Request current volume value
kind: query
command: "get_volume!"
params: []
- id: get_volume_max
label: Request max volume value
kind: query
command: "get_volume_max!"
params: []
- id: get_volume_min
label: Request min volume value
kind: query
command: "get_volume_min!"
params: []
Feedbacks
- id: power_state
type: enum
values: [on, standby]
- id: mute_state
type: enum
values: [on, off]
- id: volume_level
type: integer
description: Current volume (2 digits)
- id: volume_max_value
type: integer
description: Max volume (2 digits)
- id: volume_min_value
type: integer
description: Min volume (always 0 per source)
- id: source
type: enum
values: [cd, iradio, network, aux1, aux2, usb, fm, dab]
- id: cd_tray_status
type: enum
values: [open, close, loading]
- id: play_status
type: enum
values: [play, stop, pause]
- id: display_update_mode
type: enum
values: [auto, manual]
- id: display_size
type: string
description: "Columns and rows on current display, e.g. '20,04'"
- id: display_text
type: string
description: Full display text (3-digit length prefix, comma, text)
- id: display_line1
type: string
description: Display line 1 (2-digit length prefix, comma, text)
- id: display_line2
type: string
description: Display line 2 (2-digit length prefix, comma, text)
- id: display_line3
type: string
description: Display line 3 (2-digit length prefix, comma, text)
- id: display_line4
type: string
description: Display line 4 (2-digit length prefix, comma, text)
- id: product_type
type: string
description: Rotel product type name (2-digit length prefix, comma, text)
- id: product_version
type: string
description: Main CPU software version (2-digit length prefix, comma, text)
- id: current_preset
type: string
description: Current preset station, prefixed by type (preset_iradio / preset_fm / preset_dab), 2 digits
- id: iradio_preset
type: string
description: Saved iRadio preset (2-digit length prefix, comma, text)
- id: fm_preset
type: string
description: Saved FM preset (2-digit length prefix, comma, text)
- id: dab_preset
type: string
description: Saved DAB preset (2-digit length prefix, comma, text)
- id: track_info
type: string
description: Current track and total, e.g. "track=05, T12"
- id: playback_time
type: string
description: Current playback time, format "##:##:##"
- id: dimmer_level
type: string
description: Dimmer level, format "dimmer_#"
Variables
# UNRESOLVED: no continuous/parameter variables documented beyond discrete commands. Section omitted.
Events
# In automatic display update mode, the device sends unsolicited display line(s) on every display change.
# Format: "display=###,text" (full) or "display1=##,text" through "display4=##,text" (per line)
# No terminating "!" character for variable-length text data.
- id: display_update_auto
description: "Unsolicited display line(s) sent on display change when display_update_auto! is set."
# UNRESOLVED: exact trigger cadence and ordering of multi-line updates not stated in source.
Macros
# UNRESOLVED: source does not document any multi-step macro sequences.
Safety
confirmation_required_for: []
interlocks: []
# UNRESOLVED: source contains no safety warnings, interlock procedures, or power-on sequencing requirements.
Notes
- All commands and most responses are terminated with a single
!byte (0x21). Do NOT append CR or LF after the!. - Variable-length display/preset data uses a byte-count prefix (2 or 3 digits) followed by
,and the text; no terminating!for those responses. The byte count covers only the text payload, not the count digits themselves or the comma. - Protocol is ASCII text only; no device ID, no checksum. RS-232 hardware does not support flow control — application must pace send/receive to avoid packet loss.
- The discrete
aux1_coax!,aux1_opt!, andpower=...(viaget_current_power!) commands were added in protocol version 1.02 / main software V1.1.7. - The "recall preset" commands originally omitted a
!terminator; this was corrected in protocol version 1.21. - Special character mapping: some display glyphs are encoded as 2-3 byte sequences starting with
EE 82 ...(see source Section 3). Decoders must handle these multi-byte glyphs when parsing display text. volume_n!accepts 1-86;volume_max!andvolume_min!snap to the device-defined extremes (queried viaget_volume_max!/get_volume_min!).- Preset indices in the
call_*_preset_n!recall commands are zero-padded two digits (01-30), while theget_*_preset_n!query uses unpadded (1-30) per the source's prose.
Provenance
source_domains:
- rotel.com
source_urls:
- "https://rotel.com/sites/default/files/product/rs232/RCX1500%20Protocol.pdf"
retrieved_at: 2026-05-22T15:27:30.889Z
last_checked_at: 2026-06-02T17:23:55.685Z
Verification Summary
verdict: verified
checked_at: 2026-06-02T17:23:55.685Z
matched_actions: 83
action_count: 83
confidence: medium
summary: "All 83 spec commands matched literally in source with identical wire tokens, shapes, and parameter ranges. One-to-one coverage with transport fully verified. (5 unresolved item(s) noted in Known Gaps.)"
Known Gaps
- "max cable length, electrical interface (true RS-232 vs TTL), and rear-panel DB9/DB25 pinout not stated in source."
- "no continuous/parameter variables documented beyond discrete commands. Section omitted."
- "exact trigger cadence and ordering of multi-line updates not stated in source."
- "source does not document any multi-step macro sequences."
- "source contains no safety warnings, interlock procedures, or power-on sequencing requirements."
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0