Summary

Planar VM Series LCD video wall displays controlled via RS-232 serial or TCP over LAN. The protocol uses a binary SICP-style packet format with a fixed header byte (0xA6 host→display, 0x21 display→host), monitor ID addressing (1–255, with 0 for broadcast), an opcode byte, optional payload bytes, and an XOR checksum.

Transport

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

Traits

- powerable
- queryable
- routable
- levelable

Actions

- id: monitor_information_get
  label: Get Monitor Information (Model / FW / Build Date)
  kind: query
  command: "A6 01 00 00 00 04 01 A1 00 03"   # opcode 0xA1; DATA[1]: 0x00=Model, 0x01=FW, 0x02=Build Date
  params:
    - name: monitor_id
      type: integer
      description: Monitor ID 1-255 (0 = broadcast)
    - name: info_code
      type: enum
      values: [model_number, fw_version, build_date]
      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"   # opcode 0x19
  params:
    - name: monitor_id
      type: integer

- id: power_state_set
  label: Power State Set
  kind: action
  command: "A6 01 00 00 00 04 01 18 {state} {checksum}"   # opcode 0x18; state: 0x01=Off, 0x02=On
  params:
    - name: monitor_id
      type: integer
    - name: state
      type: enum
      values: [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"   # opcode 0x1D
  params:
    - name: monitor_id
      type: integer

- id: ir_remote_lock_status_set
  label: IR Remote Lock Status Set
  kind: action
  command: "A6 01 00 00 00 04 01 1C {status} {checksum}"   # opcode 0x1C
  params:
    - name: monitor_id
      type: integer
    - name: status
      type: enum
      values: [unlock_all, lock_all, lock_all_but_power, lock_all_but_volume, primary, secondary]
      description: 0x01 Unlock All, 0x02 Lock All, 0x03 Lock All but Power, 0x04 Lock All but Volume, 0x05 Primary, 0x06 Secondary

- id: keypad_lock_status_get
  label: Keypad Lock Status Get
  kind: query
  command: "A6 01 00 00 00 03 01 1B BE"   # opcode 0x1B
  params:
    - name: monitor_id
      type: integer

- id: keypad_lock_status_set
  label: Keypad Lock Status Set
  kind: action
  command: "A6 01 00 00 00 04 01 1A {status} {checksum}"   # opcode 0x1A
  params:
    - name: monitor_id
      type: integer
    - name: status
      type: enum
      values: [unlock_all, lock_all, lock_all_but_power, lock_all_but_volume]
      description: 0x01 Unlock All, 0x02 Lock All, 0x03 Lock All but Power, 0x04 Lock All but Volume

- id: power_state_cold_start_get
  label: Power State at Cold Start Get
  kind: query
  command: "A6 01 00 00 00 03 01 A4 01"   # opcode 0xA4
  params:
    - name: monitor_id
      type: integer

- id: power_state_cold_start_set
  label: Power State at Cold Start Set
  kind: action
  command: "A6 01 00 00 00 04 01 A3 {state} {checksum}"   # opcode 0xA3
  params:
    - name: monitor_id
      type: integer
    - 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}"   # opcode 0xAC
  params:
    - name: monitor_id
      type: integer
    - name: source
      type: enum
      values: [vga, hdmi_2, displayport, ops, hdmi_1, dvi_d, hdmi_3, browser, cms, media_player, pdf_player, custom, hdmi_4]
      description: 0x05 VGA, 0x06 HDMI 2, 0x0A DisplayPort, 0x0B OPS, 0x0D HDMI 1, 0x0E DVI-D, 0x0F HDMI 3, 0x10 BROWSER, 0x11 CMS, 0x16 Media Player, 0x17 PDF Player, 0x18 Custom, 0x19 HDMI 4

- id: current_source_get
  label: Current Source Get
  kind: query
  command: "A6 01 00 00 00 03 01 AD 08"   # opcode 0xAD
  params:
    - name: monitor_id
      type: integer

- id: auto_signal_detecting_get
  label: Auto Signal Detecting Get
  kind: query
  command: "0xAF"   # opcode 0xAF (listed in Command Summary §771)
  params:
    - name: monitor_id
      type: integer
  # UNRESOLVED: Auto Signal Detecting Get appears only in the Command Summary table; no dedicated section in source describes packet layout, data bytes, or example.

- id: auto_signal_detecting_set
  label: Auto Signal Detecting Set
  kind: action
  command: "0xAE"   # opcode 0xAE (listed in Command Summary §771)
  params:
    - name: monitor_id
      type: integer
  # UNRESOLVED: Auto Signal Detecting Set appears only in the Command Summary table; no dedicated section in source describes packet layout, data bytes, or example.

- id: video_parameters_get
  label: Video Parameters Get
  kind: query
  command: "A6 01 00 00 00 03 01 33 96"   # opcode 0x33
  params:
    - name: monitor_id
      type: integer

- 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}"   # opcode 0x32
  params:
    - name: monitor_id
      type: integer
    - 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, "2.2", "2.4", d_image_dicom]
      description: 0x01 Native, 0x02 S gamma, 0x03 2.2, 0x04 2.4, 0x05 D-image (DICOM)

- id: color_temperature_get
  label: Color Temperature Get
  kind: query
  command: "A6 01 00 00 00 03 01 35 90"   # opcode 0x35
  params:
    - name: monitor_id
      type: integer

- id: color_temperature_set
  label: Color Temperature Set
  kind: action
  command: "A6 01 00 00 00 04 01 34 {temp} {checksum}"   # opcode 0x34
  params:
    - name: monitor_id
      type: integer
    - name: temp
      type: enum
      values: [user_1, native, "10000K", "9300K", "7500K", "6500K", "5000K", "4000K", "3000K", user_2]
      description: 0x00 User 1, 0x01 Native, 0x03 10000K, 0x04 9300K, 0x05 7500K, 0x06 6500K, 0x09 5000K, 0x0A 4000K, 0x0D 3000K, 0x12 User 2

- id: color_parameters_get
  label: Color Parameters Get
  kind: query
  command: "A6 01 00 00 00 03 01 37 92"   # opcode 0x37
  params:
    - name: monitor_id
      type: integer

- id: color_parameters_set
  label: Color Parameters Set
  kind: action
  command: "A6 01 00 00 00 09 01 36 {red} {green} {blue} 80 80 80 {checksum}"   # opcode 0x36
  params:
    - name: monitor_id
      type: integer
    - name: red
      type: integer
      description: Red color gain 0-255
    - name: green
      type: integer
      description: Green color gain 0-255
    - name: blue
      type: integer
      description: Blue color gain 0-255

- id: zoom_mode_get
  label: Zoom Mode Get
  kind: query
  command: "A6 01 00 00 00 03 01 3B 9E"   # opcode 0x3B
  params:
    - name: monitor_id
      type: integer

- id: zoom_mode_set
  label: Zoom Mode Set
  kind: action
  command: "A6 01 00 00 00 04 01 3A {mode} {checksum}"   # opcode 0x3A
  params:
    - name: monitor_id
      type: integer
    - name: mode
      type: enum
      values: ["4:3", custom, "1:1", full, "21:9"]
      description: 0x00 4:3, 0x01 Custom, 0x02 1:1, 0x03 Full, 0x04 21:9

- id: volume_get
  label: Volume Get
  kind: query
  command: "A6 01 00 00 00 03 01 45 E0"   # opcode 0x45
  params:
    - name: monitor_id
      type: integer

- id: volume_set
  label: Volume Set
  kind: action
  command: "A6 01 00 00 00 04 01 44 {volume} {audio_out_volume} {checksum}"   # opcode 0x44 - note source example uses length 0x04 but documents two volume bytes
  params:
    - name: monitor_id
      type: integer
    - name: volume
      type: integer
      description: Speaker volume 0-100 (%); send 0 to mute without affecting system mute state
    - name: audio_out_volume
      type: integer
      description: Audio Out volume 0-100 (%)

- id: audio_parameters_get
  label: Audio Parameters Get
  kind: query
  command: "A6 01 00 00 00 03 01 43 E6"   # opcode 0x43
  params:
    - name: monitor_id
      type: integer

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

- id: operating_hours_get
  label: Operating Hours (Miscellaneous Info) Get
  kind: query
  command: "A6 01 00 00 00 04 01 0F 02 AF"   # opcode 0x0F; DATA[1]=0x02 Operating Hours
  params:
    - name: monitor_id
      type: integer

- id: auto_adjust_set
  label: Auto Adjust (VGA) Set
  kind: action
  command: "A6 01 00 00 00 05 01 70 40 00 93"   # opcode 0x70; DATA[1]=0x40 Auto Adjust, DATA[2]=0 reserved
  params:
    - name: monitor_id
      type: integer

- id: serial_code_get
  label: Serial Code Get
  kind: query
  command: "A6 01 00 00 00 03 01 15 B0"   # opcode 0x15
  params:
    - name: monitor_id
      type: integer

- id: tiling_get
  label: Tiling Get
  kind: query
  command: "A6 01 00 00 00 03 01 23 86"   # opcode 0x23
  params:
    - name: monitor_id
      type: integer

- id: tiling_set
  label: Tiling Set
  kind: action
  command: "A6 01 00 00 00 07 01 22 {enable} {frame_comp} {position} {v_h_monitors} {checksum}"   # opcode 0x22
  params:
    - name: monitor_id
      type: integer
    - 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 (1-225) position counted left-to-right, top-to-bottom
    - name: v_h_monitors
      type: integer
      description: 0x00 keep previous; encoded value = (V−1)×15 + H; max V=15, max H=15

- id: tiling_preset_set
  label: Tiling Preset Set
  kind: action
  command: "A6 01 00 00 00 05 01 24 {action} {preset} {checksum}"   # opcode 0x24
  params:
    - name: monitor_id
      type: integer
    - name: action
      type: enum
      values: [save, recall]
      description: 0x00 Save, 0x01 Recall
    - name: preset
      type: integer
      description: 0x00 Preset 1 through 0x09 Preset 10

Feedbacks

- id: power_state
  type: enum
  values: [off, on]
  description: Reported by Power State Report (opcode 0x19); DATA[1] 0x01 Off, 0x02 On

- id: ir_remote_lock_status
  type: enum
  values: [unlock_all, lock_all, lock_all_but_power, lock_all_but_volume, primary, secondary]
  description: Reported by IR Remote Lock Status Report (opcode 0x1D)

- id: keypad_lock_status
  type: enum
  values: [unlock_all, lock_all, lock_all_but_power, lock_all_but_volume]
  description: Reported by Keypad Lock Status Report (opcode 0x1B)

- id: power_state_cold_start
  type: enum
  values: [power_off, forced_on, last_status]
  description: Reported by Power State at Cold Start Report (opcode 0xA4)

- id: current_source
  type: enum
  values: [vga, hdmi_2, displayport, ops, hdmi_1, dvi_d, hdmi_3, browser, cms, media_player, pdf_player, custom, hdmi_4]
  description: Reported by Current Source Report (opcode 0xAD)

- id: video_parameters
  type: object
  description: Brightness, Color, Contrast, Sharpness, Tint, Black Level (each 0-100%), Gamma; reported by Video Parameters Report (opcode 0x33)

- id: color_temperature
  type: enum
  values: [user_1, native, "10000K", "9300K", "7500K", "6500K", "5000K", "4000K", "3000K", user_2]
  description: Reported by Color Temperature Report (opcode 0x35)

- id: color_parameters
  type: object
  description: Red/Green/Blue gain 0-255 each; reported by Color Parameters Report (opcode 0x37)

- id: zoom_mode
  type: enum
  values: ["4:3", custom, real, full, "21:9"]
  description: Reported by Zoom Mode Report (opcode 0x3B); note Report values include 0x02 Real whereas Set uses 0x02 1:1

- id: volume
  type: integer
  description: Volume 0-100 (%); reported by Volume Report (opcode 0x45)

- id: audio_parameters
  type: object
  description: Treble and Bass each 0-100 (%); reported by Audio Parameters Report (opcode 0x43)

- id: operating_hours
  type: integer
  description: 16-bit operating-hours counter (DATA[1] MSByte, DATA[2] LSByte); reported by Misc. Info Report (opcode 0x0F)

- id: serial_code
  type: string
  description: 14-character ASCII production serial code; reported by Serial Code Report (opcode 0x15)

- id: monitor_information
  type: string
  description: Model number, FW version, or build date string (up to 36 ASCII chars); reported by Monitor Information Report (opcode 0xA1)

- id: tiling_status
  type: object
  description: Enable, Frame comp., Position, V/H monitors; reported by Tiling Report (opcode 0x23)

- id: command_ack
  type: enum
  values: [ack, nak, nav]
  description: Per §6.1 the display replies with header 0x21 and a status byte in DATA[1] - 0x00 ACK (command well executed), 0x03 NAK (transmission error / corrupt buffer), 0x04 NAV (not available or checksum error)

Variables

# All settable parameters are exposed via the Set actions above (Video Parameters, Color Parameters,
# Color Temperature, Volume, Audio Parameters, Power State at Cold Start, Tiling, etc.).
# UNRESOLVED: no additional standalone settable variables described in source.

Events

# UNRESOLVED: source documents only solicited Report responses to Get/Set commands;
# no unsolicited events are described.

Macros

# UNRESOLVED: no multi-step macro sequences described in source.

Safety

confirmation_required_for: []
interlocks: []
# UNRESOLVED: source contains no safety warnings, interlock procedures, or power-on sequencing
# requirements specific to RS-232/LAN control.

Notes

  • Packet framing (§5): host→display header 0xA6, display→host header 0x21. Every packet carries Monitor ID (1–255; 0 = broadcast, no ACK), Category 0x00, Code0 0x00, Code1 0x00, Length = N + 3 (data control byte + payload + checksum), Data Control 0x01, opcode byte (DATA[0]), optional payload (DATA[1]…DATA[N], up to 36 bytes), and a trailing checksum = XOR of all preceding bytes.
  • ACK/NAK/NAV reply protocol (§6): every valid command yields an ACK reply (DATA[1] = 0x00). Unsupported commands return NAV (0x04), corrupted/transmission-error packets return NAK (0x03). A wrong Monitor ID produces no reply.
  • Timing (§4): do not send a new command until the previous command is acknowledged; if no response within 500 ms a retry may be triggered.
  • LAN control (§4): TCP port 5000; each display must be connected directly to the LAN — serial commands received via LAN are not relayed through the RS-232 OUT connector to daisy-chained monitors.
  • Source-specific quirk: §11 (Input Source Set) and §12 (Current Source Get) in the body use opcodes 0xAC and 0xAD respectively, but the Command Summary table (§771) lists them in reverse. The body-section opcodes (Set=0xAC, Get=0xAD) are used in this spec because they are also confirmed by the example packets in §11.1 and §12.1.
  • Source-specific quirk: Zoom Mode Report (§14.2) defines 0x02 as "Real" while Zoom Mode Set (§14.3) defines 0x02 as "1:1" — values preserved as documented.
  • Input source availability is model-dependent (§11.1 Note): DisplayPort/HDMI 3/HDMI 4 on 65/75/86" models only; DVI-D on 43/55" models only.
  • Volume Set (§15.3) accepts two volume bytes (speaker + audio out) yet the source example shows Length 0x04 with both bytes present — the packet length appears inconsistent with the byte count in the example. Implementers should compute Length per §5 (Length = N + 3) using the actual payload byte count.

Provenance

source_domains:
  - planar.com
source_urls:
  - https://www.planar.com/media/440918/020-1359-03a_vm_series_rs232_manual.pdf
retrieved_at: 2026-04-30T04:27:34.098Z
last_checked_at: 2026-06-02T17:23:51.981Z

Verification Summary

verdict: verified
checked_at: 2026-06-02T17:23:51.981Z
matched_actions: 31
action_count: 31
confidence: medium
summary: "All 31 spec actions match their source opcodes with correct parameter shapes; transport parameters verified (port 5000, baud 9600, serial config). (7 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "Auto Signal Detecting Get appears only in the Command Summary table; no dedicated section in source describes packet layout, data bytes, or example."
- "Auto Signal Detecting Set appears only in the Command Summary table; no dedicated section in source describes packet layout, data bytes, or example."
- "no additional standalone settable variables described in source."
- "source documents only solicited Report responses to Get/Set commands;"
- "no multi-step macro sequences described in source."
- "source contains no safety warnings, interlock procedures, or power-on sequencing"
- "firmware version compatibility ranges, Auto Signal Detecting (0xAE/0xAF) packet layout, power-on/cold-start timing tolerances."

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