Summary

RS-232 (and LAN-over-TCP on port 5000) control protocol for the Planar VM Series large-format displays. Covers power, input source, video/audio parameters, volume, tiling, lock functions, and device information using a fixed-header SICP-style packet format with XOR checksums.

Transport

protocols:
  - serial
  - tcp
serial:
  baud_rate: 9600
  data_bits: 8
  parity: none
  stop_bits: 1
  flow_control: none
addressing:
  port: 5000
auth:
  type: none  # inferred: no auth procedure in source

Traits

# - powerable       # inferred from power state get/set (0x19/0x18)
# - routable        # inferred from input source set / current source get (0xAC/0xAD)
# - queryable       # inferred from broad set of "Get" commands
# - levelable       # inferred from volume set, brightness/contrast/color/tint/sharpness/black-level set

Actions

# Packet envelope (per source §5):
#   Header=0xA6 | MonitorID | 0x00 (Cat) | 0x00 (Page/Code0) | 0x00 (Code1) | Length (= N+3) | 0x01 (Data Control) | Data[0..N] | Checksum
#   Checksum = XOR of all bytes except checksum itself.
# LAN framing per source §4 note: same commands accepted on TCP port 5000.

- id: model_info_get
  label: Model Number / FW Version / Build Date Get
  kind: query
  command: "A6 01 00 00 00 04 01 A1 {subcode} {checksum}"
  params:
    - name: subcode
      type: enum
      description: "0x00 = Model Number, 0x01 = FW version, 0x02 = Build Date"

- id: power_state_get
  label: Power State Get
  kind: query
  command: "A6 01 00 00 00 03 01 19 BC"

- id: power_state_set
  label: Power State Set
  kind: action
  command: "A6 01 00 00 00 04 01 18 {state} {checksum}"
  params:
    - name: state
      type: enum
      values: [power_off, on]
      description: "0x01 = Power Off, 0x02 = On"

- id: ir_remote_lock_status_get
  label: IR Remote Lock Status Get
  kind: query
  command: "A6 01 00 00 00 03 01 1D B8"

- id: ir_remote_lock_status_set
  label: IR Remote Lock Status Set
  kind: action
  command: "A6 01 00 00 00 04 01 1C {mode} {checksum}"
  params:
    - name: mode
      type: enum
      values: [unlock_all, lock_all, lock_all_but_power, lock_all_but_volume, primary, secondary]
      description: "0x01..0x06 per source"

- id: keypad_lock_status_get
  label: Keypad Lock Status Get
  kind: query
  command: "A6 01 00 00 00 03 01 1B BE"

- id: keypad_lock_status_set
  label: Keypad Lock Status Set
  kind: action
  command: "A6 01 00 00 00 04 01 1A {mode} {checksum}"
  params:
    - name: mode
      type: enum
      values: [unlock_all, lock_all, lock_all_but_power, lock_all_but_volume]
      description: "0x01..0x04 per source"

- id: cold_start_power_state_get
  label: Power State at Cold Start Get
  kind: query
  command: "A6 01 00 00 00 03 01 A4 01"

- id: cold_start_power_state_set
  label: Power State at Cold Start Set
  kind: action
  command: "A6 01 00 00 00 04 01 A3 {state} {checksum}"
  params:
    - name: state
      type: enum
      values: [power_off, forced_on, last_status]
      description: "0x00=Power Off, 0x01=Forced On, 0x02=Last Status"

- id: input_source_set
  label: Input Source Set
  kind: action
  command: "A6 01 00 00 00 07 01 AC {source} 00 00 00 {checksum}"
  params:
    - name: source
      type: enum
      values: [vga, hdmi2, displayport, ops, hdmi1, dvi_d, hdmi3, browser, cms, media_player, pdf_player, custom, hdmi4]
      description: "0x05=VGA, 0x06=HDMI2, 0x0A=DisplayPort, 0x0B=OPS, 0x0D=HDMI1, 0x0E=DVI-D, 0x0F=HDMI3, 0x10=BROWSER, 0x11=CMS, 0x16=Media Player, 0x17=PDF Player, 0x18=Custom, 0x19=HDMI4. Some sources only on specific models (per source §11 note)."

- id: current_source_get
  label: Current Source Get
  kind: query
  command: "A6 01 00 00 00 03 01 AD 08"

- id: video_parameters_get
  label: Video Parameters Get
  kind: query
  command: "A6 01 00 00 00 03 01 33 96"

- id: video_parameters_set
  label: Video Parameters Set
  kind: action
  command: "A6 01 00 00 00 0A 01 32 {brightness} {color} {contrast} {sharpness} {tint} {black_level} {gamma} {checksum}"
  params:
    - name: brightness
      type: integer
      description: 0-100 (%)
    - name: color
      type: integer
      description: 0-100 (%)
    - name: contrast
      type: integer
      description: 0-100 (%)
    - name: sharpness
      type: integer
      description: 0-100 (%)
    - name: tint
      type: integer
      description: 0-100 (%)
    - name: black_level
      type: integer
      description: 0-100 (%)
    - name: gamma
      type: enum
      values: [native, s_gamma, g2_2, g2_4, d_image]
      description: "0x01=Native, 0x02=S gamma, 0x03=2.2, 0x04=2.4, 0x05=D-image"

- id: color_temperature_get
  label: Color Temperature Get
  kind: query
  command: "A6 01 00 00 00 03 01 35 90"

- id: color_temperature_set
  label: Color Temperature Set
  kind: action
  command: "A6 01 00 00 00 04 01 34 {ct} {checksum}"
  params:
    - name: ct
      type: enum
      values: [user1, native, ct_10000k, ct_9300k, ct_7500k, ct_6500k, ct_5000k, ct_4000k, ct_3000k, user2]
      description: "0x00=User1, 0x01=Native, 0x03=10000K, 0x04=9300K, 0x05=7500K, 0x06=6500K, 0x09=5000K, 0x0A=4000K, 0x0D=3000K, 0x12=User2"

- id: color_parameters_get
  label: Color Parameters Get (RGB Gain)
  kind: query
  command: "A6 01 00 00 00 03 01 37 92"

- id: color_parameters_set
  label: Color Parameters Set (RGB Gain)
  kind: action
  command: "A6 01 00 00 00 09 01 36 {red} {green} {blue} 00 00 00 {checksum}"
  params:
    - name: red
      type: integer
      description: 0-255
    - name: green
      type: integer
      description: 0-255
    - name: blue
      type: integer
      description: 0-255

- id: zoom_mode_get
  label: Zoom Mode Get
  kind: query
  command: "A6 01 00 00 00 03 01 3B 9E"

- id: zoom_mode_set
  label: Zoom Mode Set
  kind: action
  command: "A6 01 00 00 00 04 01 3A {mode} {checksum}"
  params:
    - name: mode
      type: enum
      values: [r4_3, custom, real, full, r21_9]
      description: "0x00=4:3, 0x01=Custom, 0x02=1:1 (Set) / Real (Report), 0x03=Full, 0x04=21:9"

- id: volume_get
  label: Volume Get
  kind: query
  command: "A6 01 00 00 00 03 01 45 E0"

- id: volume_set
  label: Volume Set (Speaker + Audio Out)
  kind: action
  command: "A6 01 00 00 00 04 01 44 {speaker_vol} {audio_out_vol} {checksum}"
  params:
    - name: speaker_vol
      type: integer
      description: 0-100 (%). Source notes: setting Volume=0 mutes the display without overwriting system mute state.
    - name: audio_out_vol
      type: integer
      description: 0-100 (%)

- id: audio_parameters_get
  label: Audio Parameters Get (Treble, Bass)
  kind: query
  command: "A6 01 00 00 00 03 01 43 E6"

- id: audio_parameters_set
  label: Audio Parameters Set (Treble, Bass)
  kind: action
  command: "A6 01 00 00 00 05 01 42 {treble} {bass} {checksum}"
  params:
    - name: treble
      type: integer
      description: 0-100 (%)
    - name: bass
      type: integer
      description: 0-100 (%)

- id: operating_hours_get
  label: Operating Hours Get
  kind: query
  command: "A6 01 00 00 00 04 01 0F 02 AF"
  params:
    - name: item
      type: enum
      values: [operating_hours]
      description: "DATA[1]=0x02 selects Operating Hours (other values reserved)"

- id: auto_adjust_set
  label: Auto Adjust Set (VGA)
  kind: action
  command: "A6 01 00 00 00 05 01 70 40 00 93"

- id: serial_code_get
  label: Serial Code Get (14-digit production code)
  kind: query
  command: "A6 01 00 00 00 03 01 15 B0"

- id: tiling_get
  label: Tiling Get
  kind: query
  command: "A6 01 00 00 00 03 01 23 86"

- id: tiling_set
  label: Tiling Set
  kind: action
  command: "A6 01 00 00 00 07 01 22 {enable} {frame_comp} {position} {vh_monitors} {checksum}"
  params:
    - name: enable
      type: enum
      values: [no, yes]
      description: "0x00=No, 0x01=Yes"
    - name: frame_comp
      type: enum
      values: [no, yes, keep_previous]
      description: "0x00=No, 0x01=Yes, 0x02=don't overwrite"
    - name: position
      type: integer
      description: "0x00=keep previous, 0x01..0xE1 (max 225) for tile position"
    - name: vh_monitors
      type: integer
      description: "0x00=keep previous; else (V-1)*15 + H, with V,H each 1..15"

- id: tiling_preset_set
  label: Tiling Preset Set (Save/Recall)
  kind: action
  command: "A6 01 00 00 00 05 01 24 {action} {preset} {checksum}"
  params:
    - name: action
      type: enum
      values: [save, recall]
      description: "0x00=Save, 0x01=Recall"
    - name: preset
      type: enum
      values: [preset1, preset2, preset3, preset4, preset5, preset6, preset7, preset8, preset9, preset10]
      description: "0x00..0x09 → Preset1..Preset10"

- id: auto_signal_detecting_get
  label: Auto Signal Detecting Get
  kind: query
  command: "A6 01 00 00 00 03 01 AF {checksum}"
  # UNRESOLVED: full byte sequence and checksum not shown in body - only summary entry references code 0xAF.

- id: auto_signal_detecting_set
  label: Auto Signal Detecting Set
  kind: action
  command: "A6 01 00 00 00 04 01 AE {value} {checksum}"
  # UNRESOLVED: full byte sequence and checksum not shown in body - only summary entry references code 0xAE; Data[1] value not documented.

Feedbacks

- id: power_state
  type: enum
  values: [power_off, on]
  description: "0x01=Power Off, 0x02=On. Reported by device with header 0x21, Data[0]=0x19."

- id: ir_remote_lock_status
  type: enum
  values: [unlock_all, lock_all, lock_all_but_power, lock_all_but_volume, primary, secondary]
  description: "Reported with Data[0]=0x1D."

- id: keypad_lock_status
  type: enum
  values: [unlock_all, lock_all, lock_all_but_power, lock_all_but_volume]
  description: "Reported with Data[0]=0x1B."

- id: cold_start_power_state
  type: enum
  values: [power_off, forced_on, last_status]
  description: "Reported with Data[0]=0xA4."

- id: current_source
  type: enum
  values: [vga, hdmi2, displayport, ops, hdmi1, dvi_d, hdmi3, browser, cms, media_player, pdf_player, custom, hdmi4]
  description: "Reported with Data[0]=0xAD; full Data[1] table per input source set."

- id: video_parameters
  type: object
  description: "Brightness, Color, Contrast, Sharpness, Tint, Black Level (each 0-100), Gamma Selection. Reported with Data[0]=0x33."

- id: color_temperature
  type: enum
  values: [user1, native, ct_10000k, ct_9300k, ct_7500k, ct_6500k, ct_5000k, ct_4000k, ct_3000k, user2]
  description: "Reported with Data[0]=0x35."

- id: color_parameters
  type: object
  description: "Red/Green/Blue gain values (0-255 each). Reported with Data[0]=0x37."

- id: zoom_mode
  type: enum
  values: [r4_3, custom, real, full, r21_9]
  description: "Reported with Data[0]=0x3B."

- id: volume
  type: integer
  description: "0-100 (%). Reported with Data[0]=0x45."

- id: audio_parameters
  type: object
  description: "Treble, Bass (each 0-100). Reported with Data[0]=0x43."

- id: operating_hours
  type: integer
  description: "16-bit wide value, MSByte first (DATA[1]) then LSByte (DATA[2]). Reported with Data[0]=0x0F."

- id: serial_code
  type: string
  description: "14 ASCII characters (production code). Reported with Data[0]=0x15."

- id: tiling_status
  type: object
  description: "Enable, Frame comp., Position, V/H monitor count. Reported with Data[0]=0x23."

Variables

# Per-byte fields inside composite actions/feedbacks that an integrator must compute at runtime.
# Treat these as named slots rather than separate actions.
- id: monitor_id
  description: "Range 1..255 (per source §5). 0 = Broadcast Mode (no ACK/Report expected)."
- id: length
  description: "Length = N + 3, where N is the number of Data bytes (0..36). Per source §5."
- id: checksum
  description: "XOR of all bytes in the message except the checksum itself; result masked to 0..0xFF."

Events

# Reports from the device share the standard Message Report envelope (header 0x21):
# Header | Monitor ID | Category=0x00 | Page=0x00 | MsgLen | Control=0x01 | Data[0] (echo of command code) | Data[1..N] (response payload) | Checksum.
- id: command_ack
  description: "Header 0x21, Data[1]=0x00. Command executed successfully."
- id: command_nak
  description: "Header 0x21, Data[1]=0x03. Command buffer corrupt (transmission error)."
- id: command_nav
  description: "Header 0x21, Data[1]=0x04. Command valid but not supported in current implementation, or checksum error."

Macros

# No multi-step macros described in source. UNRESOLVED: remove section if not applicable.

Safety

confirmation_required_for: []
interlocks: []
# Source contains no explicit safety warnings, interlocks, or power-on sequencing requirements beyond the documented Cold Start behavior.

Notes

  • All RS-232 commands use the same packet envelope: 0xA6 | MonitorID | 0x00 | 0x00 | 0x00 | Length | 0x01 | Data[…] | Checksum. Length = N+3. Checksum is XOR of all preceding bytes.
  • Reports use a mirrored envelope with header 0x21 and Data[0] echoing the command code.
  • Monitor ID range: 1..255. ID=0 = Broadcast (no ACK/Report expected). Wrong ID → no reply.
  • Do not send a new command before the previous one is acknowledged. Retry allowed if no response within 500 ms.
  • LAN control uses TCP port 5000 and accepts the same serial commands. Serial commands received via LAN are NOT relayed through the RS-232 out connector to daisy-chained monitors.
  • Input source availability varies by model (e.g. DisplayPort, HDMI3, HDMI4 only on 65/75/86-inch; DVI-D only on 43/55-inch).
  • Auto Signal Detecting commands (0xAF/0xAE) appear in the Command Summary table but their detailed packet examples are not present in the refined source — flagged UNRESOLVED above.
  • Daisy-chain "RS232 out" connector is mentioned only in the LAN-control note; pinout for it is not in this document.

Provenance

source_domains:
  - planar.com
source_urls:
  - https://www.planar.com/media/440918/020-1359-03a_vm_series_rs232_manual.pdf
retrieved_at: 2026-09-02T16:39:26.097Z
last_checked_at: 2026-09-18T22:16:59.199Z

Verification Summary

verdict: verified
checked_at: 2026-09-18T22:16:59.199Z
matched_actions: 31
action_count: 31
confidence: medium
summary: "All 31 spec actions match source wire tokens (opcodes 0xA1, 0x19, 0x18, 0x1C-0x1D, 0x1A-0x1B, 0xA3-0xA4, 0xAC-0xAD, 0xAF, 0xAE, 0x33-0x37, 0x3A-0x3B, 0x42-0x45, 0x0F, 0x70, 0x15, 0x22-0x24) with correct shapes and transport parameters (9600/8N1, port 5000). (4 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "per-model matrix of which input sources apply (DP/HDMI3/HDMI4: 65/75/86 only; DVI-D: 43/55 only) is described only in narrative form."
- "full byte sequence and checksum not shown in body - only summary entry references code 0xAF."
- "full byte sequence and checksum not shown in body - only summary entry references code 0xAE; Data[1] value not documented."
- "remove section if not applicable."

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