Summary
Rotel C8/C8+ is a multi-zone (4-zone) audio distribution amplifier controlled via ASCII RS-232 and TCP/IP. Spec covers power, volume, mute, source selection, tone (bass/treble), balance, dimmer, RS232 update mode, plus status query feedbacks.
Transport
protocols:
- tcp
- serial
addressing:
port: 9596
serial:
baud_rate: 115200
data_bits: 8
parity: none
stop_bits: 1
flow_control: none
auth:
type: none # inferred: no auth procedure in source
Traits
traits:
- powerable # inferred: power on/off/toggle commands present
- routable # inferred: zone + source selection commands present
- queryable # inferred: power?/input?/volume?/etc. query commands present
- levelable # inferred: volume/bass/treble/balance level controls present
Actions
# All commands terminated with literal "!" char. Zone prefix z#: optional (z1: z2: z3: z4:);
# if omitted, command applies to all zones. No spaces, no CR/LF after command.
# Responses terminated with "$" char and return comma-separated 4-zone state.
# Granularity note: source lists each row separately; not collapsed to parameterized enums.
# POWER & VOLUME
- 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: zone_volume_up
label: Zone Volume Up
kind: action
command: "z{zone}:vol_up!"
params:
- name: zone
type: integer
description: "Zone number 1-4 (optional prefix)"
- id: zone_volume_down
label: Zone Volume Down
kind: action
command: "z{zone}:vol_dwn!"
params:
- name: zone
type: integer
description: "Zone number 1-4 (optional prefix)"
- id: zone_volume_set
label: Zone Set Volume
kind: action
command: "z{zone}:vol_{level}!"
params:
- name: zone
type: integer
description: "Zone number 1-4 (optional prefix)"
- name: level
type: integer
description: "Volume level 00-96"
- id: zone_mute_toggle
label: Zone Mute Toggle
kind: action
command: "z{zone}:mute!"
params:
- name: zone
type: integer
description: "Zone number 1-4 (optional prefix)"
- id: zone_mute_on
label: Zone Mute On
kind: action
command: "z{zone}:mute_on!"
params:
- name: zone
type: integer
description: "Zone number 1-4 (optional prefix)"
- id: zone_mute_off
label: Zone Mute Off
kind: action
command: "z{zone}:mute_off!"
params:
- name: zone
type: integer
description: "Zone number 1-4 (optional prefix)"
# SOURCE SELECTION
- id: zone_source_a
label: Zone Source Input A
kind: action
command: "z{zone}:input_a!"
params:
- name: zone
type: integer
description: "Zone number 1-4 (optional prefix)"
- id: zone_source_b
label: Zone Source Input B
kind: action
command: "z{zone}:input_b!"
params:
- name: zone
type: integer
description: "Zone number 1-4 (optional prefix)"
- id: zone_source_c
label: Zone Source Input C
kind: action
command: "z{zone}:input_c!"
params:
- name: zone
type: integer
description: "Zone number 1-4 (optional prefix)"
- id: zone_source_d
label: Zone Source Input D
kind: action
command: "z{zone}:input_d!"
params:
- name: zone
type: integer
description: "Zone number 1-4 (optional prefix)"
# TONE CONTROL - BASS
- id: zone_bass_up
label: Zone Bass Up
kind: action
command: "z{zone}:bass_up!"
params:
- name: zone
type: integer
description: "Zone number 1-4 (optional prefix)"
- id: zone_bass_down
label: Zone Bass Down
kind: action
command: "z{zone}:bass_down!"
params:
- name: zone
type: integer
description: "Zone number 1-4 (optional prefix)"
- id: zone_bass_set_neg
label: Zone Set Bass Negative
kind: action
command: "z{zone}:bass_-{level}!"
params:
- name: zone
type: integer
description: "Zone number 1-4 (optional prefix)"
- name: level
type: integer
description: "Bass level 01-10"
- id: zone_bass_set_flat
label: Zone Set Bass Flat
kind: action
command: "z{zone}:bass_000!"
params:
- name: zone
type: integer
description: "Zone number 1-4 (optional prefix)"
- id: zone_bass_set_pos
label: Zone Set Bass Positive
kind: action
command: "z{zone}:bass_+{level}!"
params:
- name: zone
type: integer
description: "Zone number 1-4 (optional prefix)"
- name: level
type: integer
description: "Bass level 01-10"
# TONE CONTROL - TREBLE
- id: zone_treble_up
label: Zone Treble Up
kind: action
command: "z{zone}:treble_up!"
params:
- name: zone
type: integer
description: "Zone number 1-4 (optional prefix)"
- id: zone_treble_down
label: Zone Treble Down
kind: action
command: "z{zone}:treble_down!"
params:
- name: zone
type: integer
description: "Zone number 1-4 (optional prefix)"
- id: zone_treble_set_neg
label: Zone Set Treble Negative
kind: action
command: "z{zone}:treble_-{level}!"
params:
- name: zone
type: integer
description: "Zone number 1-4 (optional prefix)"
- name: level
type: integer
description: "Treble level 01-10"
- id: zone_treble_set_flat
label: Zone Set Treble Flat
kind: action
command: "z{zone}:treble_000!"
params:
- name: zone
type: integer
description: "Zone number 1-4 (optional prefix)"
- id: zone_treble_set_pos
label: Zone Set Treble Positive
kind: action
command: "z{zone}:treble_+{level}!"
params:
- name: zone
type: integer
description: "Zone number 1-4 (optional prefix)"
- name: level
type: integer
description: "Treble level 01-10"
# BALANCE CONTROL
- id: zone_balance_right
label: Zone Balance Right
kind: action
command: "z{zone}:balance_r!"
params:
- name: zone
type: integer
description: "Zone number 1-4 (optional prefix)"
- id: zone_balance_left
label: Zone Balance Left
kind: action
command: "z{zone}:balance_l!"
params:
- name: zone
type: integer
description: "Zone number 1-4 (optional prefix)"
- id: zone_balance_set_left
label: Zone Set Balance Left
kind: action
command: "z{zone}:balance_l{level}!"
params:
- name: zone
type: integer
description: "Zone number 1-4 (optional prefix)"
- name: level
type: integer
description: "Balance level 01-10"
- id: zone_balance_set_center
label: Zone Set Balance Center
kind: action
command: "z{zone}:balance_000!"
params:
- name: zone
type: integer
description: "Zone number 1-4 (optional prefix)"
- id: zone_balance_set_right
label: Zone Set Balance Right
kind: action
command: "z{zone}:balance_r{level}!"
params:
- name: zone
type: integer
description: "Zone number 1-4 (optional prefix)"
- name: level
type: integer
description: "Balance level 01-10"
# DIMMER
- id: dimmer_toggle
label: Toggle Display Dimmer
kind: action
command: "dimmer!"
params: []
- id: dimmer_set_0
label: Set Dimmer Brightest
kind: action
command: "dimmer_0!"
params: []
- id: dimmer_set_1
label: Set Dimmer Level 1
kind: action
command: "dimmer_1!"
params: []
- id: dimmer_set_2
label: Set Dimmer Level 2
kind: action
command: "dimmer_2!"
params: []
- id: dimmer_set_3
label: Set Dimmer Level 3
kind: action
command: "dimmer_3!"
params: []
- id: dimmer_set_4
label: Set Dimmer Dimmest
kind: action
command: "dimmer_4!"
params: []
# RS232 UPDATE MODE
- id: rs232_update_on
label: Set RS232 Update Auto On
kind: action
command: "rs232_update_on!"
params: []
- id: rs232_update_off
label: Set RS232 Update Manual Off
kind: action
command: "rs232_update_off!"
params: []
# STATUS QUERIES (Section 2)
- id: query_power
label: Query Power Status
kind: query
command: "power?"
params: []
- id: query_input
label: Query Source Selection
kind: query
command: "input?"
params: []
- id: query_volume
label: Query Volume
kind: query
command: "volume?"
params: []
- id: query_mute
label: Query Mute Status
kind: query
command: "mute?"
params: []
- id: query_bass
label: Query Bass Level
kind: query
command: "bass?"
params: []
- id: query_treble
label: Query Treble Level
kind: query
command: "treble?"
params: []
- id: query_balance
label: Query Balance Setting
kind: query
command: "balance?"
params: []
- id: query_freq
label: Query Digital Source Frequency
kind: query
command: "freq?"
params: []
- id: query_dimmer
label: Query Front Display Dimmer
kind: query
command: "dimmer?"
params: []
- id: query_version
label: Query Main CPU Software Version
kind: query
command: "version?"
params: []
- id: query_ip
label: Query IP Address
kind: query
command: "ip?"
params: []
- id: query_mac
label: Query MAC Address
kind: query
command: "mac?"
params: []
- id: query_model
label: Query Model Number
kind: query
command: "model?"
params: []
- id: query_discover
label: Discover Device On Network
kind: query
command: "discover?"
params: []
Feedbacks
# Each query returns comma-separated 4-zone (z1,z2,z3,z4) state terminated with "$".
- id: power_state
type: enum
values: [on, standby]
response_format: "power={on|standby}$"
- id: input_state
type: enum
values: [a, b, c, d]
response_format: "input={a|b|c|d},{a|b|c|d},{a|b|c|d},{a|b|c|d}$"
- id: volume_state
type: integer
range: "00-96"
response_format: "volume=##,##,##,##$"
- id: mute_state
type: enum
values: [on, off]
response_format: "mute={on|off},{on|off},{on|off},{on|off}$"
- id: bass_state
type: string
range: "+01-10, -01-10, 000"
response_format: "bass=###,###,###,###$"
- id: treble_state
type: string
range: "+01-10, -01-10, 000"
response_format: "treble=###,###,###,###$"
- id: balance_state
type: string
range: "l01-10, r01-10, 000"
response_format: "balance=###,###,###,###$"
- id: freq_state
type: enum
values: [none, "44.1", "48", "88.2", "96", "176.4", "192"]
response_format: "freq={none|44.1|48|88.2|96|176.4|192},...$"
- id: dimmer_state
type: integer
range: "0-4"
response_format: "dimmer={0|1|2|3|4}$"
- id: version_info
type: string
response_format: "version=#.##$"
- id: ip_address
type: string
response_format: "ip=###.###.###.###$"
- id: mac_address
type: string
response_format: "mac=############$"
- id: model_info
type: string
response_format: "model=text$"
- id: discover_info
type: string
response_format: "discover=ip=###.###.###.### port=#### mac=############$"
- id: update_mode
type: enum
values: [auto]
response_format: "update_mode=auto$"
Variables
# Volume, bass, treble, balance, dimmer are settable continuous parameters
# represented as discrete actions above. No additional variables required.
Events
# When rs232_update_on command issued, device transmits unsolicited status
# updates on any state change (terminated with "$"). When OFF, no feedback
# unless polled.
- id: auto_status_update
description: "Unsolicited status broadcast when RS232 update mode ON"
trigger: "Any unit state change"
enable_command: "rs232_update_on!"
disable_command: "rs232_update_off!"
Macros
# UNRESOLVED: no explicit multi-step sequences described in source
Safety
confirmation_required_for: []
interlocks: []
# UNRESOLVED: no safety warnings, interlock procedures, or power-on
# sequencing requirements stated in source.
Notes
- Dual transport: RS-232 (no flow control, 115200/8/N/1) and TCP port 9596. Command/response format identical across both.
- Source notes RS232 hardware does NOT support flow control — care needed to avoid packet loss.
- All commands terminate with literal
!; no spaces, no CR/LF. - All responses terminate with
$. - Zone prefix
z1:/z2:/z3:/z4:optional. If omitted, applies to all zones. Responses always return all 4 zones comma-separated regardless. - Source selection only effective if zone configured as "Matrix" via front panel setup. If zone locked to specific input via setup, source commands no-op for that zone.
Provenance
source_domains:
- rotel.com
source_urls:
- "https://www.rotel.com/sites/default/files/product/rs232/C8%26C8%2B%20Protocol.pdf"
- https://www.rotel.com/manuals-resources/rs232-protocols
- https://www.rotel.com/products/c8
- https://www.rotel.com/manuals-resources
retrieved_at: 2026-06-30T16:14:57.327Z
last_checked_at: 2026-07-07T12:29:48.958Z
Verification Summary
verdict: verified
checked_at: 2026-07-07T12:29:48.958Z
matched_actions: 50
action_count: 50
confidence: medium
summary: "All 50 spec commands match source tokens exactly; all transport parameters confirmed; complete bidirectional coverage. (7 unresolved item(s) noted in Known Gaps.)"
Known Gaps
- "voltage/current/power specs not stated in source. Firmware version compatibility not stated."
- "no explicit multi-step sequences described in source"
- "no safety warnings, interlock procedures, or power-on"
- "device power specifications, voltage, current not stated in source"
- "firmware version compatibility range not stated"
- "protocol version number not stated"
- "tone control valid range boundaries (e.g. min/max before clamp) not specified"
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0