Summary

RS-232 serial control spec for Bose Lifestyle 20/25/30 home entertainment systems. Internal Bose designation for the shared music center is CD20. Control runs over a 3.5 mm stereo phone jack (SER-IN ring, SER-OUT tip) at 5 V TTL levels (not true RS-232 — converter required). Half-duplex TAP mode is the only consumer-relevant protocol.

Transport

# Serial-only device. 5V TTL levels - not true ±12V RS-232.
# Source states "be careful not to connect directly to a PC RS232 port - use a RS232 to TTL converter".
protocols:
  - serial
serial:
  baud_rate: 1200  # source: default and recommended; 9600 selectable but higher bit error rate
  data_bits: 8
  parity: none
  stop_bits: 1
  flow_control: none  # half-duplex, no flow control documented
auth:
  type: none  # inferred: no login/password procedure in source

Traits

powerable: true   # ON/OFF remote code (00h)
levelable: true   # VOL UP/DN, SUR VOL UP/DN, MUTE, MUTE ALL, CENTER, SURROUND, STEREO, STEREO+
routable: true    # VIDEO 1/2, AUX, CD, AM/FM, TAPE input select codes
queryable: false  # no query commands documented; all TAP codes are one-way fire-and-ACK

Actions

# === Serial port mode invocation (Idle mode) ===
# Source: section 4.1. After reset CD20 monitors SER-IN and echoes any char back.
# Three monitored 4-char sequences (CR = 0x0D) switch modes.

- id: invoke_tap
  label: Switch to TAP mode
  kind: action
  command: "TAP\r"  # 4 bytes: 'T' 'A' 'P' 0x0D
  params: []

- id: software_reset
  label: Software reset (RST)
  kind: action
  command: "RST\r"  # 4 bytes: 'R' 'S' 'T' 0x0D
  params: []

- id: invoke_idle
  label: Return to Idle mode
  kind: action
  command: "Bose"  # any-mode -> Idle escape sequence (per source section 4.1.1)
  params: []

# === TAP session control ===
# Source: section 5. TAP mode is invoked from Idle via "TAP\r".
# All subsequent commands follow: send 'a' preamble, wait for 'X' (TAP_ACK) or 'x' (TAP_NAK),
# then send a 3-byte command (cmd, d1, d2), wait for ACK.

- id: tap_preamble
  label: TAP command preamble
  kind: action
  command: "a"  # 0x61 single byte; controller waits for 'X' before sending command
  params: []

- id: tap_exit
  label: Exit TAP mode
  kind: action
  command: "a@@@"  # 4 bytes total: 'a' + 3 placeholder bytes (per source section 5.2)
  params: []

# === TAP zone setup ===
# Source: section 5.4. Hex data byte required; only two zones documented.

- id: select_zone_1
  label: Select Zone 1
  kind: action
  command: "aA\x01@"  # cmd='A' (0x41), d1=0x01, d2=any
  params: []

- id: select_zone_2
  label: Select Zone 2
  kind: action
  command: "aA\x02@"  # cmd='A' (0x41), d1=0x02, d2=any
  params: []

# === TAP_simul_remote command set ===
# Source: section 5.5, Table 2. Format: 'a' preamble, then 3 bytes (cmd='E', d1=remote code char, d2=any).
# d1 bits 7,6,5 are don't-care; bits 4..0 encode the remote code. Visible ASCII equivalents listed.
# Each row of Table 2 enumerated as a distinct action per granularity rule.

- id: power_on_off
  label: Power On/Off (toggle)
  kind: action
  command: "aE@@"  # remote code 00h
  params: []

- id: vol_up
  label: Volume Up
  kind: action
  command: "aEA@"  # remote code 01h
  params: []

- id: skip_rev
  label: Skip Reverse (previous track)
  kind: action
  command: "aEB@"  # remote code 02h
  params: []

- id: play_pause
  label: Play / Pause
  kind: action
  command: "aEC@"  # remote code 03h
  params: []

- id: skip_fwd
  label: Skip Forward (next track)
  kind: action
  command: "aED@"  # remote code 04h
  params: []

- id: vol_dn
  label: Volume Down
  kind: action
  command: "aEE@"  # remote code 05h
  params: []

- id: next_disc
  label: Next Disc
  kind: action
  command: "aEF@"  # remote code 06h
  params: []

- id: select_video_1
  label: Select Input: Video 1
  kind: action
  command: "aEG@"  # remote code 07h
  params: []

- id: select_video_2
  label: Select Input: Video 2
  kind: action
  command: "aEH@"  # remote code 08h
  params: []

- id: select_aux
  label: Select Input: AUX
  kind: action
  command: "aEI@"  # remote code 09h
  params: []

- id: select_cd
  label: Select Input: CD
  kind: action
  command: "aEJ@"  # remote code 0Ah
  params: []

- id: select_am_fm
  label: Select Input: AM/FM (Tuner)
  kind: action
  command: "aEK@"  # remote code 0Bh
  params: []

- id: select_tape
  label: Select Input: Tape
  kind: action
  command: "aEL@"  # remote code 0Ch
  params: []

- id: stop
  label: Stop
  kind: action
  command: "aEM@"  # remote code 0Dh
  params: []

- id: mute
  label: Mute
  kind: action
  command: "aEN@"  # remote code 0Eh
  params: []

- id: mute_all
  label: Mute All Zones
  kind: action
  command: "aEO@"  # remote code 0Fh
  params: []

- id: random
  label: Random (shuffle)
  kind: action
  command: "aEP@"  # remote code 10h
  params: []

- id: sur_vol_up
  label: Surround Volume Up
  kind: action
  command: "aEQ@"  # remote code 11h
  params: []

- id: sur_vol_dn
  label: Surround Volume Down
  kind: action
  command: "aER@"  # remote code 12h
  params: []

- id: surround
  label: Surround (mode cycle)
  kind: action
  command: "aES@"  # remote code 13h
  params: []

- id: stereo_plus
  label: Stereo+ (mode)
  kind: action
  command: "aET@"  # remote code 14h
  params: []

- id: center
  label: Center (level/mode)
  kind: action
  command: "aEU@"  # remote code 15h
  params: []

- id: stereo
  label: Stereo (mode)
  kind: action
  command: "aEV@"  # remote code 16h
  params: []

- id: digit_0
  label: Digit 0
  kind: action
  command: "aEW@"  # remote code 17h (T0)
  params: []

- id: digit_1
  label: Digit 1
  kind: action
  command: "aEX@"  # remote code 18h (T1)
  params: []

- id: digit_2
  label: Digit 2
  kind: action
  command: "aEY@"  # remote code 19h (T2)
  params: []

- id: digit_3
  label: Digit 3
  kind: action
  command: "aEZ@"  # remote code 1Ah (T3)
  params: []

- id: digit_4
  label: Digit 4
  kind: action
  command: "aE[@"  # remote code 1Bh (T4)
  params: []

- id: digit_5
  label: Digit 5
  kind: action
  command: "aE\\@"  # remote code 1Ch (T5)
  params: []

- id: digit_6
  label: Digit 6
  kind: action
  command: "aE]@"  # remote code 1Dh (T6)
  params: []

- id: digit_7
  label: Digit 7
  kind: action
  command: "aE^@"  # remote code 1Eh (T7)
  params: []

- id: digit_8
  label: Digit 8
  kind: action
  command: "aE_@"  # remote code 1Fh (T8)
  params: []

- id: digit_9
  label: Digit 9
  kind: action
  command: "aE`@"  # remote code 20h (T9)
  params: []

- id: play
  label: Play
  kind: action
  command: "aEa@"  # remote code 21h
  params: []

- id: pause
  label: Pause
  kind: action
  command: "aEb@"  # remote code 22h
  params: []

- id: fast_rev
  label: Fast Reverse (search)
  kind: action
  command: "aEc@"  # remote code 23h
  params: []

- id: fast_fwd
  label: Fast Forward (search)
  kind: action
  command: "aEd@"  # remote code 24h
  params: []

Feedbacks

- id: tap_ack
  type: enum
  values: [X]
  description: TAP_ACK (0x58) - command accepted, sent after each TAP command

- id: tap_nak
  type: enum
  values: [x]
  description: TAP_NAK (0x78) - command could not be completed (e.g. CD Play with no disc)

- id: power_up_marker
  type: enum
  values: ["*"]
  description: ASCII '*' (0x2A) emitted ~300 ms after power-up or software reset; used to detect reset/power-break

Variables

# UNRESOLVED: no settable parameter values documented in source beyond discrete
# remote-key actions. No numeric parameter ranges, no enum setters.
[]

Events

- id: power_up_event
  description: Device sends ASCII '*' (0x2A) ~300 ms after hardware reset or RST command; controller uses this to detect reset/power-break
  payload: "*"

- id: tap_ack_event
  description: TAP_ACK 'X' (0x58) returned after every successful TAP command
  payload: "X"

- id: tap_nak_event
  description: TAP_NAK 'x' (0x78) returned when a TAP command cannot be completed
  payload: "x"

Macros

# UNRESOLVED: source does not document any multi-step sequences or named macros.
[]

Safety

confirmation_required_for: []
interlocks: []
# Source contains no safety warnings, interlock procedures, or power-on sequencing requirements.
# The only "safety-adjacent" item is the explicit warning not to connect the 5V TTL
# port directly to a PC RS-232 port (electrical damage to the unit), captured in Notes.

Notes

  • Electrical warning (source, verbatim): "be careful not to connect directly to a PC RS232 port - use a RS232 to TTL converter". The CD20 serial port uses 5 V TTL levels; idle state is 5 V. Direct connection will damage the unit or the PC.
  • Half-duplex only. Source: "the communication is only HALF DUPLEX" (single software timer). Controller must not transmit while expecting an ACK.
  • Default baud is 1200 after power-up. 9600 is selectable but has a higher bit error rate per source.
  • Software reset keypress (for diagnostics): STORE+ERASE+ON on the front panel.
  • Firmware check (front panel, unit OFF): hold Skip Down + Tune Down + Source Select simultaneously. Display should read e.g. "Crev 6.1". Serial remote requires 6.1 or later.
  • TAP_simul_remote d1 bits 7..5 are don't-care. The visible-character column in Table 2 is the convenience mapping; the underlying encoding is the low 5 bits of d1.
  • Zone select is hex (A<0x1>, A<0x2>), unlike the rest of TAP commands which use ASCII data bytes.

Provenance

source_domains:
  - eserviceinfo.com
  - files.remotecentral.com
source_urls:
  - "https://www.eserviceinfo.com/preview_html.php?fileid=60281&previewid=31157"
  - "https://files.remotecentral.com/view/7121-18700-1/bose_t_&_v-class_home_theater_systems.html"
retrieved_at: 2026-05-22T15:53:45.910Z
last_checked_at: 2026-06-02T21:41:06.414Z

Verification Summary

verdict: verified
checked_at: 2026-06-02T21:41:06.414Z
matched_actions: 44
action_count: 44
confidence: medium
summary: "All 44 spec actions match literally with source Table 2 remote codes and section 5 TAP protocol; all transport parameters verified; complete coverage. (6 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "source does not state pinout beyond ring/tip; full mechanical drawings not provided"
- "no settable parameter values documented in source beyond discrete"
- "source does not document any multi-step sequences or named macros."
- "full electrical specs (max cable length, drive current) not in source"
- "ACK timeout value not specified — controller must choose its own wait timeout"
- "behavior when ACK not received within timeout (retry? abort?) not in source"

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