Summary

RS-232 ASCII command set for Planar UltraRes X Series large-format LCD displays. The same command set is also exposed on the USB-B serial port and on TCP and UDP port 57. Commands are case-insensitive ASCII strings terminated by CR, LF, or ;, with =, ?, #, +, -, and execute (no operator) forms. UR8450 and UR9850 are NOT covered by this spec; their RS-232 protocol differs.

Transport

# Source documents serial (DB9), USB-B serial, TCP, and UDP transports with
# the same command set. Auth: no login/password procedure described.
protocols:
  - serial
  - tcp
  - udp
addressing:
  port: 57  # TCP and UDP per source
serial:
  baud_rate: 19200
  data_bits: 8
  parity: none
  stop_bits: 1
  flow_control: none
auth:
  type: none  # inferred: no auth procedure in source

Traits

- powerable  # inferred from DISPLAY.POWER and STDBY.* key codes
- routable   # inferred from SOURCE.SELECT per-zone variants
- queryable  # inferred from `?` and `#` read operators and query-only commands
- levelable  # inferred from AUDIO.VOLUME/TREBLE/BASS/BALANCE, BRIGHTNESS, etc.

Actions

# All opcodes from the Planar UltraRes X RS-232 manual. Each command's
# response is the same opcode followed by `:` and the formatted value
# (e.g. `BRIGHTNESS:55`) unless it is an action (no operator, no operand)
# in which case the response is `<OPCODE>@ACK` (success) or `<OPCODE>^NAK`
# (deferred) or `<OPCODE>!ERR <n>` (error 1-6).
#
# Operators: `=` write, `?` read name, `#` read number, `+` increment,
# `-` decrement, no-op execute. Termination: [CR] (0x0D), [LF] (0x0A), or `;`.
# Modifiers and operands may be omitted; defaults substitute CURRENT zone etc.

- id: cms_advanced_color
  label: Advanced Color
  kind: action
  command: "CMS(ZONE.{zone}, {gamut}, {color_point})={value}"
  params:
    - {name: zone, type: integer, description: "Zone 1-4 (0=ZONE.1 .. 3=ZONE.4) or 255=CURRENT"}
    - {name: gamut, type: string, description: "REC709, SMPTEC, EBU, USER, AUTO, or CURRENT"}
    - {name: color_point, type: string, description: "RED.X, RED.Y, GREEN.X, GREEN.Y, BLUE.X, BLUE.Y, CYAN.X, CYAN.Y, MAGENTA.X, MAGENTA.Y, YELLOW.X, YELLOW.Y, WHITE.X, WHITE.Y"}
    - {name: value, type: integer, description: "0-800 (14 values when all color points set at once)"}

- id: cmsflag_advanced_color_flag
  label: Advanced Color Flag
  kind: query
  command: "CMSFLAG(ZONE.{zone}, {gamut}, {color_point})?"
  params:
    - {name: zone, type: integer, description: "Zone 1-4 or CURRENT"}
    - {name: gamut, type: string, description: "REC709, SMPTEC, EBU, USER, AUTO, or CURRENT"}
    - {name: color_point, type: string, description: "Color point name"}
  notes: "Returns empty string if achievable, \"*\" if not."

- id: osd_allow_popup
  label: Allow Pop Up Messages
  kind: action
  command: "OSD.ALLOW.POPUP={value}"
  params:
    - {name: value, type: string, description: "NO or YES"}

- id: aspect_ratio
  label: Aspect Ratio
  kind: action
  command: "ASPECT(ZONE.{zone})={value}"
  params:
    - {name: zone, type: string, description: "ZONE.1, ZONE.2, ZONE.3, ZONE.4, ALL.INPUT, ALL, ALL.ZONE, or CURRENT (default)"}
    - {name: value, type: string, description: "AUTO, 16X9, 4X3, FILL, NATIVE, or LETTERBOX"}

- id: audio_input
  label: Audio Input
  kind: query
  command: "AUDIO.INPUT?"
  notes: "Returns the source currently playing audio in the zone chosen by Audio Select."

- id: audio_zone
  label: Audio Select
  kind: action
  command: "AUDIO.ZONE={value}"
  params:
    - {name: value, type: string, description: "ZONE.1, ZONE.2, ZONE.3, or ZONE.4"}

- id: audio_settings
  label: Audio Settings
  kind: action
  command: "AUDIO.SETTINGS={zone} {volume} {treble} {bass} {balance} {mute} {speakers}"
  params:
    - {name: zone, type: integer, description: "0=ZONE.1 .. 3=ZONE.4"}
    - {name: volume, type: integer, description: "0-100"}
    - {name: treble, type: integer, description: "0-100"}
    - {name: bass, type: integer, description: "0-100"}
    - {name: balance, type: integer, description: "0-100"}
    - {name: mute, type: integer, description: "0=OFF, 1=ON"}
    - {name: speakers, type: integer, description: "0=OFF, 1=ON"}

- id: auto_on
  label: Auto Power On
  kind: action
  command: "AUTO.ON={value}"
  params:
    - {name: value, type: string, description: "OFF or ON"}
  notes: "Available in standby."

- id: source_scan
  label: Auto Scan Sources
  kind: action
  command: "SOURCE.SCAN={value}"
  params:
    - {name: value, type: string, description: "OFF or ON"}

- id: backlight_intensity
  label: Backlight Intensity
  kind: action
  command: "BACKLIGHT.INTENSITY={value}"
  params:
    - {name: value, type: integer, description: "1-100"}

- id: audio_balance
  label: Balance
  kind: action
  command: "AUDIO.BALANCE={value}"
  params:
    - {name: value, type: integer, description: "0-100"}

- id: audio_bass
  label: Bass
  kind: action
  command: "AUDIO.BASS={value}"
  params:
    - {name: value, type: integer, description: "0-100"}

- id: blank_color
  label: Blank Screen Color
  kind: action
  command: "BLANK.COLOR={value}"
  params:
    - {name: value, type: string, description: "RED, GREEN, BLUE, CYAN, MAGENTA, YELLOW, WHITE, or BLACK"}

- id: brightness
  label: Brightness
  kind: action
  command: "BRIGHTNESS(ZONE.{zone})={value}"
  params:
    - {name: zone, type: string, description: "ZONE.1, ZONE.2, ZONE.3, ZONE.4, ALL.INPUT, ALL, ALL.ZONE, or CURRENT (default)"}
    - {name: value, type: integer, description: "0-100"}

- id: color
  label: Color
  kind: action
  command: "COLOR(ZONE.{zone})={value}"
  params:
    - {name: zone, type: string, description: "ZONE.1, ZONE.2, ZONE.3, ZONE.4, ALL.INPUT, ALL, ALL.ZONE, or CURRENT (default)"}
    - {name: value, type: integer, description: "0-100"}

- id: color_gamut
  label: Color Gamut
  kind: action
  command: "COLOR.GAMUT(ZONE.{zone}, {type}, {gamut})={value}"
  params:
    - {name: zone, type: string, description: "ZONE.1-4 or CURRENT"}
    - {name: type, type: string, description: "SETTING, ACTUAL, COPY, or REVERT"}
    - {name: gamut, type: string, description: "REC709, SMPTE.C, EBU, USER, AUTO, CURRENT, or DISABLE"}
    - {name: value, type: string, description: "For SETTING: REC709, SMPTE.C, EBU, USER, AUTO, or DISABLE"}

- id: colorspace
  label: Color Space
  kind: action
  command: "COLORSPACE(ZONE.{zone}, {value_type})={value}"
  params:
    - {name: zone, type: string, description: "ZONE.1-4 or scope modifier"}
    - {name: value_type, type: string, description: "SETTING or ACTUAL"}
    - {name: value, type: string, description: "REC601, REC709, RGB, RGB.VIDEO, or AUTO"}

- id: color_subsampling
  label: Color Subsampling
  kind: query
  command: "COLOR.SUBSAMPLING(ZONE.{zone})?"
  params:
    - {name: zone, type: string, description: "ZONE.1-4 or CURRENT"}
  notes: "Returns string e.g. \"4:4:4\" or \"4:2:0\"."

- id: color_temperature
  label: Color Temperature
  kind: action
  command: "COLOR.TEMPERATURE(ZONE.{zone})={value}"
  params:
    - {name: zone, type: string, description: "ZONE.1-4, ALL.INPUT, ALL, ALL.ZONE, or CURRENT"}
    - {name: value, type: string, description: "3200K, 5500K, 6500K, 7500K, 9300K, or NATIVE"}

- id: rotate
  label: Content Rotation
  kind: action
  command: "ROTATE(ZONE.{zone})={value}"
  params:
    - {name: zone, type: string, description: "ZONE.1-4, ALL.INPUT, ALL, ALL.ZONE, or CURRENT (default)"}
    - {name: value, type: integer, description: "0=NONE, 90, 180, 270"}

- id: contrast
  label: Contrast
  kind: action
  command: "CONTRAST(ZONE.{zone})={value}"
  params:
    - {name: zone, type: string, description: "ZONE.1-4, ALL.INPUT, ALL, ALL.ZONE, or CURRENT (default)"}
    - {name: value, type: integer, description: "0-100"}

- id: current_zone
  label: Current Zone
  kind: action
  command: "CURRENT.ZONE={value}"
  params:
    - {name: value, type: string, description: "ZONE.1, ZONE.2, ZONE.3, or ZONE.4"}

- id: current_zone_layout
  label: Current Zone Layout
  kind: query
  command: "CURRENT.ZONE.LAYOUT?"
  notes: "Returns layout name (S.1, P.UL.1, Q.1, etc.). See Layouts table for value mapping."

- id: ipv4_gateway
  label: Default Gateway
  kind: action
  command: "IPV4.GATEWAY(STATIC)=\"{value}\""
  params:
    - {name: value, type: string, description: "Dotted-quad IPv4 string"}

- id: network_dhcp
  label: DHCP
  kind: action
  command: "NETWORK.DHCP={value}"
  params:
    - {name: value, type: string, description: "OFF or ON"}
  notes: "Available in standby."

- id: diagnostic_color
  label: Diagnostic Color
  kind: action
  command: "DIAGNOSTIC.COLOR(ZONE.{zone})={value}"
  params:
    - {name: zone, type: string, description: "ZONE.1-4, ALL.INPUT, ALL, ALL.ZONE, or CURRENT (default)"}
    - {name: value, type: string, description: "RED, GREEN, BLUE, or OFF"}

- id: display_name
  label: Display Name
  kind: action
  command: "DISPLAY.NAME=\"{value}\""
  params:
    - {name: value, type: string, description: "Quoted string. Special chars escaped with \\"}
  notes: "Available in standby."

- id: display_power
  label: Display Power
  kind: action
  command: "DISPLAY.POWER={value}"
  params:
    - {name: value, type: string, description: "OFF or ON"}
  notes: "Available in standby."

- id: dp_type
  label: DisplayPort Type
  kind: action
  command: "DP.TYPE={value}"
  params:
    - {name: value, type: string, description: "1.1 or 1.2"}

- id: network_dns1
  label: DNS Server 1
  kind: action
  command: "NETWORK.DNS1(STATIC)=\"{value}\""
  params:
    - {name: value, type: string, description: "Dotted-quad IPv4 string"}

- id: network_dns2
  label: DNS Server 2
  kind: action
  command: "NETWORK.DNS2(STATIC)=\"{value}\""
  params:
    - {name: value, type: string, description: "Dotted-quad IPv4 string"}

- id: edid_timing
  label: EDID Timing
  kind: action
  command: "EDID.TIMING({input}, {param})={value}"
  params:
    - {name: input, type: string, description: "OPS, HDMI.1, HDMI.2, HDMI.3, HDMI.4, DP, or ALL"}
    - {name: param, type: string, description: "UPDATE, HACTIVE, VACTIVE, VREFRESH, FULL.SPEC, PCLK, HBLANK, HFP, HSYNC, VBLANK, VFP, VSYNC, FACTORY, TYPE, or HDR"}
    - {name: value, type: integer, description: "Signed integer; for TYPE: -3=4K60, -2=4K30, -1=1080P"}

- id: edid_selected_connector
  label: EDID Zone
  kind: action
  command: "EDID.SELECTEDCONNECTOR={value}"
  params:
    - {name: value, type: string, description: "OPS, HDMI.1, HDMI.2, HDMI.3, HDMI.4, DP, or ALL"}

- id: audio_speakers
  label: Enable Internal Speakers
  kind: action
  command: "AUDIO.SPEAKERS={value}"
  params:
    - {name: value, type: string, description: "OFF or ON"}

- id: led_enable
  label: Enable Status LED
  kind: action
  command: "LED.ENABLE={value}"
  params:
    - {name: value, type: string, description: "DISABLE or ENABLE"}
  notes: "Available in standby. Write-only (`=` operator only)."

- id: error_log
  label: Error Log
  kind: query
  command: "ERROR.LOG({entry})?"
  params:
    - {name: entry, type: integer, description: "1-65535; entry 1 is most recent"}
  notes: "Returns quoted log string. Empty string means no more entries past that index."

- id: reset
  label: Factory Reset
  kind: action
  command: "RESET({scope})"
  params:
    - {name: scope, type: string, description: "USER or FACTORY1"}
  notes: "Action (no operator, no operand). USER = user reset; FACTORY1 = USER + EDID + network + presets."

- id: firmware_update
  label: Firmware Update
  kind: action
  command: "FIRMWARE.UPDATE({firmware}, {type})"
  params:
    - {name: firmware, type: string, description: "AUTO, VP.AP, or HDMI"}
    - {name: type, type: string, description: "START, PACKET, FINISH, or URL"}
  notes: "Available in standby. Action command."

- id: gain
  label: Gain
  kind: action
  command: "GAIN(ZONE.{zone}, {color})={value}"
  params:
    - {name: zone, type: string, description: "ZONE.1-4, ALL.INPUT, ALL, ALL.ZONE, or CURRENT"}
    - {name: color, type: string, description: "RED, GREEN, BLUE, or ALL"}
    - {name: value, type: integer, description: "0-200 per color. For ALL: three space-separated 0-200 values for R/G/B."}

- id: gamma
  label: Gamma
  kind: action
  command: "GAMMA(ZONE.{zone})={value}"
  params:
    - {name: zone, type: string, description: "ZONE.1-4, ALL.INPUT, ALL, ALL.ZONE, or CURRENT (default)"}
    - {name: value, type: string, description: "1.5, 1.55, 1.6, 1.65, 1.7, 1.75, 1.8, 1.85, 1.9, 1.95, 2.0, 2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65, 2.7, 2.75, or 2.8"}

- id: cec_enable
  label: HDMI CEC
  kind: action
  command: "CEC.ENABLE={value}"
  params:
    - {name: value, type: string, description: "Disable or Enable"}

- id: hdr_content
  label: HDR Content
  kind: action
  command: "HDR.CONTENT={value}"
  params:
    - {name: value, type: string, description: "Off, On, or Auto"}

- id: hdr_metadata
  label: HDR Metadata
  kind: query
  command: "HDR.METADATA({zone})?"
  params:
    - {name: zone, type: integer, description: "0=ZONE.1, 1=ZONE.2, 2=ZONE.3, 3=ZONE.4"}
  notes: "Returns Absent or Present."

- id: help
  label: Help
  kind: action
  command: "HELP={command}"
  params:
    - {name: command, type: string, description: "Opcode name, or FIRST, or NEXT (numeric 0 / 2147483647)"}
  notes: "Available in standby. To list all commands, send HELP(FIRST)? then HELP(NEXT)? repeatedly."

- id: hostname
  label: Host Name
  kind: action
  command: "HOSTNAME=\"{value}\""
  params:
    - {name: value, type: string, description: "Quoted string; no spaces allowed"}
  notes: "Available in standby. Default = \"UltraRes\"."

- id: signal_info
  label: Image Information
  kind: query
  command: "SIGNAL.INFO({zone}, {parameter})?"
  params:
    - {name: zone, type: string, description: "ZONE.1-4 or CURRENT (default)"}
    - {name: parameter, type: string, description: "HACTIVE, VACTIVE, PCLK, HTOTAL, VTOTAL, VREFRESH, HREFRESH, INTERLACE, VFIELDRATE, VREFRESH.X.100, COLORDEPTH, TMDS, or ALL (default)"}

- id: pan
  label: Image Position
  kind: action
  command: "PAN(ZONE.{zone}, {direction})={value}"
  params:
    - {name: zone, type: string, description: "ZONE.1-4, ALL.INPUT, ALL, ALL.ZONE, or CURRENT"}
    - {name: direction, type: string, description: "X, Y, or ALL (default)"}
    - {name: value, type: integer, description: "-1000 to 1000. For ALL: two values X Y."}

- id: ipv4_address
  label: IP Address
  kind: action
  command: "IPV4.ADDRESS(STATIC)=\"{value}\""
  params:
    - {name: value, type: string, description: "Dotted-quad IPv4 string"}
  notes: "Available in standby."

- id: ir_code
  label: IR Code
  kind: action
  command: "IR.CODE={value}"
  params:
    - {name: value, type: integer, description: "0-65535"}
  notes: "Available in standby."

- id: ir_lock
  label: IR Remote Lock
  kind: action
  command: "IR.LOCK={value}"
  params:
    - {name: value, type: string, description: "DISABLE or ENABLE"}
  notes: "Available in standby. Write-only."

- id: key
  label: Key
  kind: action
  command: "KEY={key_name}"
  params:
    - {name: key_name, type: string, description: "See Key Codes table: UP, DOWN, MENU, SOURCE, VOLUME.PLUS, VOLUME.MINUS, EXIT, LEFT, ENTER, PREV, RIGHT, KEY.0-9, MUTE, STDBY.TOGGLE, STDBY.ENTER, STDBY.EXIT, MENU.PREV, TOP, PRESETS, PRESET1-4, ZONE1-4, PIP.MODE, PIP.SWAP, HDMI1-4, DISPLAY.PORT, OPS, WALL, COLOR, MISC, ARROW.LEFT, ARROW.RIGHT, STAR.STAR"}
  notes: "Available in standby."

- id: key_lock
  label: Keypad Lock
  kind: action
  command: "KEY.LOCK={value}"
  params:
    - {name: value, type: string, description: "DISABLE or ENABLE"}
  notes: "Available in standby. Write-only."

- id: layout
  label: Layout
  kind: action
  command: "LAYOUT({view})={value}"
  params:
    - {name: view, type: string, description: "Multi-source view: DUAL, TRIPLE, PIP, CURRENT, or omit"}
    - {name: value, type: string, description: "SINGLE, PIP.UL, PIP.UR, PIP.LL, PIP.LR, DUAL.L, DUAL.T, TRIPLE.L, TRIPLE.R, TRIPLE.T, TRIPLE.B, TRIPLE.M, or QUAD"}

- id: local_dimming
  label: Local Dimming
  kind: action
  command: "LOCAL.DIMMING={value}"
  params:
    - {name: value, type: string, description: "OFF or ON"}

- id: network_mac
  label: MAC Address
  kind: query
  command: "NETWORK.MAC?"
  notes: "Returns MAC string e.g. \"12:34:56:AB:CD:EF\"."

- id: memc_level
  label: MEMC
  kind: action
  command: "MEMC.LEVEL={value}"
  params:
    - {name: value, type: string, description: "OFF, LOW, MEDIUM, or HIGH"}

- id: osd_position
  label: Menu Position
  kind: action
  command: "OSD.POSITION={value}"
  params:
    - {name: value, type: string, description: "CENTER, UPPER.LEFT, UPPER.RIGHT, LOWER.LEFT, or LOWER.RIGHT"}

- id: model_id
  label: Model ID
  kind: query
  command: "MODEL.ID?"
  notes: "Returns model string, e.g. \"UR8451\"."

- id: model_series
  label: Model Series
  kind: query
  command: "MODEL.SERIES?"
  notes: "Always returns \"UltraRes\" for this product."

- id: multi_view
  label: Multi-Source View
  kind: action
  command: "MULTI.VIEW={value}"
  params:
    - {name: value, type: string, description: "SINGLE, DUAL, TRIPLE, QUAD, or PIP"}

- id: audio_mute
  label: Mute
  kind: action
  command: "AUDIO.MUTE={value}"
  params:
    - {name: value, type: string, description: "OFF or ON"}

- id: command_enable
  label: Network Commands
  kind: action
  command: "COMMAND.ENABLE(NETWORK)={value}"
  params:
    - {name: value, type: string, description: "OFF or ON"}
  notes: "Enables/disables TCP port 52 and UDP port 52 (note: differs from the TCP/UDP control port 57)."

- id: network_ping
  label: Network Ping
  kind: action
  command: "NETWORK.PING=\"{value}\""
  params:
    - {name: value, type: string, description: "Hostname or IP string"}
  notes: "Available in standby. Response: \"SUCCESS\" or \"FAILED\"."

- id: network_enable
  label: Network Port
  kind: action
  command: "NETWORK.ENABLE={value}"
  params:
    - {name: value, type: string, description: "OFF or ON"}

- id: source_next
  label: Next Source
  kind: action
  command: "SOURCE.NEXT(ZONE.{zone})"
  params:
    - {name: zone, type: string, description: "ZONE.1, ZONE.2, ZONE.3, ZONE.4, ALL, or CURRENT (default)"}
  notes: "Action (no operator, no operand)."

- id: noise_reduction
  label: Noise Reduction
  kind: action
  command: "NOISE.REDUCTION(ZONE.{zone})={value}"
  params:
    - {name: zone, type: string, description: "ZONE.1-4, ALL.INPUT, ALL, ALL.ZONE, or CURRENT (default)"}
    - {name: value, type: string, description: "OFF, LOW, MEDIUM, or HIGH"}

- id: notification_email
  label: Notification Event
  kind: action
  command: "NOTIFICATION.EMAIL({event})={enable}, \"{recipients}\", \"{message}\""
  params:
    - {name: event, type: string, description: "POWER.STATE.CHANGED, ERROR.OCCURRED, SOURCE.DETECTED, SOURCE.LOST, or SOURCE.SELECTED"}
    - {name: enable, type: string, description: "DISABLE or ENABLE"}
    - {name: recipients, type: string, description: "Quoted email recipient list"}
    - {name: message, type: string, description: "Quoted custom user message"}
  notes: "Available in standby."

- id: network_ntpserver
  label: NTP Server
  kind: action
  command: "NETWORK.NTPSERVER=\"{value}\""
  params:
    - {name: value, type: string, description: "NTP server hostname"}
  notes: "Available in standby. Default = \"0.pool.ntp.org\"."

- id: offset
  label: Offset
  kind: action
  command: "OFFSET(ZONE.{zone}, {color})={value}"
  params:
    - {name: zone, type: string, description: "ZONE.1-4, ALL.INPUT, ALL, ALL.ZONE, or CURRENT"}
    - {name: color, type: string, description: "RED, GREEN, BLUE, or ALL"}
    - {name: value, type: integer, description: "0-100 per color. For ALL: three space-separated 0-100 values for R/G/B."}

- id: ops_power_check
  label: OPS Power Down Check
  kind: action
  command: "OPS.POWER.CHECK={value}"
  params:
    - {name: value, type: string, description: "DISABLE or ENABLE"}
  notes: "Available in standby."

- id: ops_present
  label: OPS Present
  kind: query
  command: "OPS.PRESENT?"
  notes: "Returns FALSE or TRUE."

- id: osd_close
  label: OSD Close
  kind: action
  command: "OSD.CLOSE"
  notes: "Action (no operator, no operand). Closes any on-screen menus or message boxes."

- id: orientation
  label: OSD Rotation
  kind: action
  command: "ORIENTATION={value}"
  params:
    - {name: value, type: string, description: "LANDSCAPE or PORTRAIT"}

- id: osd_status
  label: OSD Status
  kind: query
  command: "OSD.STATUS?"
  notes: "Returns DISABLE or ENABLE indicating whether OSD is currently shown."

- id: osd_timeout
  label: OSD Timeout
  kind: action
  command: "OSD.TIMEOUT={value}"
  params:
    - {name: value, type: string, description: "OFF, 10.SECONDS, 30.SECONDS, 60.SECONDS, 120.SECONDS, or 240.SECONDS. Numeric value in seconds accepted."}

- id: osd_transparency
  label: OSD Transparency
  kind: action
  command: "OSD.TRANSPARENCY={value}"
  params:
    - {name: value, type: integer, description: "0-5"}

- id: overscan
  label: Overscan
  kind: action
  command: "OVERSCAN(ZONE.{zone})={value}"
  params:
    - {name: zone, type: string, description: "ZONE.1-4, ALL.INPUT, ALL, ALL.ZONE, or CURRENT (default)"}
    - {name: value, type: integer, description: "0-20"}

- id: pip_size
  label: PIP Size
  kind: action
  command: "PIP.SIZE={value}"
  params:
    - {name: value, type: string, description: "SMALL, MEDIUM, or LARGE"}

- id: pip_swap
  label: PIP Swap
  kind: action
  command: "PIP.SWAP"
  notes: "Action (no operator, no operand). Swaps main and PIP windows."

- id: pixel_orbit
  label: Pixel Orbit
  kind: action
  command: "PIXEL.ORBIT={value}"
  params:
    - {name: value, type: string, description: "OFF or ON"}

- id: power_down_mode
  label: Power Down Mode
  kind: action
  command: "POWER.DOWN.MODE={value}"
  params:
    - {name: value, type: string, description: "Standby.Mode, Networked.Standby.Mode, or Fast.Startup"}
  notes: "RS-232 only functions in Networked.Standby.Mode or Fast.Startup."

- id: power_on_delay
  label: Power On Delay
  kind: action
  command: "POWER.ON.DELAY={value}"
  params:
    - {name: value, type: number, description: "Unsigned fixed point 0.0-10.0 seconds"}
  notes: "Available in standby."

- id: power_save_delay
  label: Power Saving Delay
  kind: action
  command: "POWER.SAVE.DELAY={value}"
  params:
    - {name: value, type: string, description: "1.MINUTE, 5.MINUTES, 15.MINUTES, 30.MINUTES, 60.MINUTES. Numeric value in seconds accepted."}
  notes: "Available in standby."

- id: power_save_mode
  label: Power Saving Mode
  kind: action
  command: "POWER.SAVE.MODE={value}"
  params:
    - {name: value, type: string, description: "Disable, Power.Down, or Wake.On.Signal"}
  notes: "Available in standby."

- id: preset_count
  label: Preset Count
  kind: query
  command: "PRESET.COUNT?"
  notes: "Returns number of non-empty presets."
  notes_extra: "Available in standby."

- id: preset_delete
  label: Preset Delete
  kind: action
  command: "PRESET.DELETE({preset})"
  params:
    - {name: preset, type: integer, description: "Preset number 1-1000"}
  notes: "Action (no operator, no operand). Available in standby."

- id: preset_full
  label: Preset Full
  kind: query
  command: "PRESET.FULL({preset})?"
  params:
    - {name: preset, type: integer, description: "Preset number 1-1000"}
  notes: "Returns NO or YES. Available in standby."

- id: preset_list
  label: Preset List
  kind: query
  command: "PRESET.LIST({step})?"
  params:
    - {name: step, type: string, description: "FIRST or NEXT (numeric 0 / 2147483647)"}
  notes: "Returns list of preset numbers. Available in standby."

- id: preset_max
  label: Preset Max
  kind: query
  command: "PRESET.MAX?"
  notes: "Returns highest saved preset number. Available in standby."

- id: preset_name
  label: Preset Name
  kind: action
  command: "PRESET.NAME({preset})=\"{value}\""
  params:
    - {name: preset, type: integer, description: "Preset number 1-1000"}
    - {name: value, type: string, description: "Quoted name. Default = \"Preset n\"."}
  notes: "Available in standby."

- id: preset_recall
  label: Preset Recall
  kind: action
  command: "PRESET.RECALL({preset})"
  params:
    - {name: preset, type: integer, description: "Preset number 1-1000"}
  notes: "Action (no operator, no operand)."

- id: preset_save
  label: Preset Save
  kind: action
  command: "PRESET.SAVE({preset})"
  params:
    - {name: preset, type: integer, description: "Preset number 1-1000"}
  notes: "Action (no operator, no operand). Up to 100 presets; numbers need not be contiguous."

- id: system_reboot
  label: Reboot
  kind: action
  command: "SYSTEM.REBOOT"
  notes: "Action (no operator, no operand). Forces system restart."

- id: revert_image_settings
  label: Revert Image Settings
  kind: action
  command: "REVERT.IMAGE.SETTINGS(ZONE.{zone})"
  params:
    - {name: zone, type: string, description: "ZONE.1-4 or CURRENT (default)"}
  notes: "Action (no operator, no operand)."

- id: clone_settings
  label: Save and Restore Settings
  kind: action
  command: "CLONE.SETTINGS({operation}, {location})"
  params:
    - {name: operation, type: string, description: "COPY or PASTE"}
    - {name: location, type: string, description: "USB"}
  notes: "Action (no operator, no operand)."

- id: save_diagnostics
  label: Save Diagnostics
  kind: action
  command: "SAVE.DIAGNOSTICS(USB)"
  notes: "Action (no operator, no operand)."

- id: schedule
  label: Schedule
  kind: action
  command: "SCHEDULE({slot}, {parameter})={value}"
  params:
    - {name: slot, type: integer, description: "Schedule slot 1-20"}
    - {name: parameter, type: string, description: "FREQ, MINUTE, HOUR, DAY, ACTION, DATA, ENABLE, or ALL (default)"}
    - {name: value, type: integer, description: "Unsigned int. Specific values per parameter (see SCHEDULE.ACTION, SCHEDULE.DAY, SCHEDULE.FREQUENCY)"}
  notes: "Available in standby."

- id: schedule_action
  label: Schedule Action
  kind: action
  command: "SCHEDULE.ACTION({slot})={value}"
  params:
    - {name: slot, type: integer, description: "Schedule slot 1-20"}
    - {name: value, type: string, description: "TURN.ON, TURN.OFF, RECALL, or PANEL.BRIGHTNESS"}
  notes: "Available in standby."

- id: schedule_day
  label: Schedule Day
  kind: action
  command: "SCHEDULE.DAY({slot})={value}"
  params:
    - {name: slot, type: integer, description: "Schedule slot 1-20"}
    - {name: value, type: string, description: "MON, TUE, WED, THU, FRI, SAT, or SUN"}
  notes: "Available in standby."

- id: schedule_description
  label: Schedule Description
  kind: query
  command: "SCHEDULE.DESCRIPTION({slot})?"
  params:
    - {name: slot, type: integer, description: "Schedule slot 1-20"}
  notes: "Returns schedule description string. Available in standby."

- id: schedule_frequency
  label: Schedule Frequency
  kind: action
  command: "SCHEDULE.FREQUENCY({slot})={value}"
  params:
    - {name: slot, type: integer, description: "Schedule slot 1-20"}
    - {name: value, type: string, description: "DAILY, WEEKLY, WEEKDAYS, or WEEKENDS"}
  notes: "Available in standby."

- id: serial_device
  label: Serial Device
  kind: action
  command: "SERIAL.DEVICE({port}, BAUD)=\"{value}\""
  params:
    - {name: port, type: string, description: "DB9, USB, or OPS"}
    - {name: value, type: string, description: "Baud rate as quoted string (e.g. \"19200\")"}

- id: serial_number
  label: Serial Number
  kind: query
  command: "SERIAL.NUMBER?"
  notes: "Returns serial number string."

- id: sharpness
  label: Sharpness
  kind: action
  command: "SHARPNESS(ZONE.{zone})={value}"
  params:
    - {name: zone, type: string, description: "ZONE.1-4, ALL.INPUT, ALL, ALL.ZONE, or CURRENT (default)"}
    - {name: value, type: integer, description: "0-100"}

- id: smtp_authentication
  label: SMTP Authentication
  kind: action
  command: "NETWORK.SMTP.AUTHENTICATION={value}"
  params:
    - {name: value, type: string, description: "NONE, AUTO, PLAIN, SCRAM_SHA1, CRAM_MD5, DIGEST_MD5, LOGIN, or NTLM"}
  notes: "Available in standby."

- id: smtp_encryption
  label: SMTP Connection Encryption
  kind: action
  command: "NETWORK.SMTP.ENCRYPTION={value}"
  params:
    - {name: value, type: string, description: "NONE, TLS, or START.TLS"}
  notes: "Available in standby."

- id: smtp_from
  label: SMTP Email From Address
  kind: action
  command: "NETWORK.SMTP.FROM=\"{value}\""
  params:
    - {name: value, type: string, description: "Quoted email address string"}
  notes: "Available in standby."

- id: smtp_password
  label: SMTP Password
  kind: action
  command: "NETWORK.SMTP.PASSWORD=\"{value}\""
  params:
    - {name: value, type: string, description: "Quoted password string"}
  notes: "Available in standby."

- id: smtp_port
  label: SMTP Port
  kind: action
  command: "NETWORK.SMTP.PORT={value}"
  params:
    - {name: value, type: integer, description: "Unsigned int (e.g. 465)"}
  notes: "Available in standby."

- id: smtp_server
  label: SMTP Server
  kind: action
  command: "NETWORK.SMTP.SERVER=\"{value}\""
  params:
    - {name: value, type: string, description: "Quoted server hostname"}
  notes: "Available in standby."

- id: smtp_username
  label: SMTP Username
  kind: action
  command: "NETWORK.SMTP.USERNAME=\"{value}\""
  params:
    - {name: value, type: string, description: "Quoted username string"}
  notes: "Available in standby."

- id: snmp_enable
  label: SNMP
  kind: action
  command: "SNMP.ENABLE={value}"
  params:
    - {name: value, type: string, description: "On or Off"}

- id: source_message
  label: Source Message
  kind: query
  command: "SOURCE.MESSAGE(ZONE.{zone})?"
  params:
    - {name: zone, type: string, description: "ZONE.1-4 or CURRENT (default)"}
  notes: "Returns resolution/refresh string, or \"Searching\" / \"No Signal\"."

- id: source_select
  label: Source Select
  kind: action
  command: "SOURCE.SELECT(ZONE.{zone})={value}"
  params:
    - {name: zone, type: string, description: "ZONE.1, ZONE.2, ZONE.3, ZONE.4, ALL, or CURRENT (default)"}
    - {name: value, type: string, description: "OPS, HDMI.1, HDMI.2, HDMI.3, HDMI.4, or DP"}

- id: splash_screen
  label: Splash Screen
  kind: action
  command: "SPLASH.SCREEN={value}"
  params:
    - {name: value, type: string, description: "DISABLE or ENABLE"}

- id: ipv4_netmask
  label: Subnet Mask
  kind: action
  command: "IPV4.NETMASK(STATIC)=\"{value}\""
  params:
    - {name: value, type: string, description: "Dotted-quad netmask string"}
  notes: "Available in standby."

- id: system_state
  label: System State
  kind: query
  command: "SYSTEM.STATE?"
  notes: "Returns STANDBY, POWERING.ON, ON, POWERING.DOWN, BACKLIGHT.OFF, or FAULT."

- id: smtp_test
  label: Test Email
  kind: action
  command: "NETWORK.SMTP.TEST({event})"
  params:
    - {name: event, type: string, description: "POWER.STATE.CHANGED, ERROR.OCCURRED, SOURCE.DETECTED, SOURCE.LOST, or SOURCE.SELECTED"}
  notes: "Action (no operator, no operand). Available in standby."

- id: test_pattern
  label: Test Pattern
  kind: action
  command: "PATTERN({pattern})"
  params:
    - {name: pattern, type: string, description: "NONE, BLACK, WHITE, GRAY, RED, GREEN, BLUE, CYAN, MAGENTA, YELLOW, GRAYBAR, REDBAR, GREENBAR, BLUEBAR, CHECKERBOARD, or COLORBAR"}
  notes: "Action (no operator, no operand)."

- id: time
  label: Time
  kind: action
  command: "TIME({field})={value}"
  params:
    - {name: field, type: string, description: "YEAR, MONTH, DATE, HOUR, MINUTE, or ALL (default)"}
    - {name: value, type: integer, description: "Unsigned int"}
  notes: "Available in standby."

- id: time_day
  label: Time - Day
  kind: query
  command: "TIME.DAY?"
  notes: "Returns MON, TUE, WED, THU, FRI, SAT, or SUN. Available in standby."

- id: time_month
  label: Time - Month
  kind: action
  command: "TIME.MONTH={value}"
  params:
    - {name: value, type: string, description: "JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, or DECEMBER"}
  notes: "Available in standby."

- id: time_string
  label: Time - String
  kind: query
  command: "TIME.STRING?"
  notes: "Returns ISO-like date/time string. Available in standby."

- id: timezone
  label: Time Zone
  kind: action
  command: "TIMEZONE={value}"
  params:
    - {name: value, type: string, description: "See Timezone Values table (e.g. UTCM0800.PACIFIC.TIME.US.CANADA, UTC.COORDINATED.UNIVERSAL.TIME)"}
  notes: "Available in standby."

- id: tint
  label: Tint
  kind: action
  command: "TINT(ZONE.{zone})={value}"
  params:
    - {name: zone, type: string, description: "ZONE.1-4, ALL.INPUT, ALL, ALL.ZONE, or CURRENT (default)"}
    - {name: value, type: integer, description: "0-100"}

- id: touch_control
  label: Touch Control
  kind: action
  command: "TOUCH.CONTROL={value}"
  params:
    - {name: value, type: string, description: "OPS, EXTERNAL, or AUTO"}
  notes: "Available in standby."

- id: audio_treble
  label: Treble
  kind: action
  command: "AUDIO.TREBLE={value}"
  params:
    - {name: value, type: integer, description: "0-100"}

- id: network_ntp
  label: Use Network Time
  kind: action
  command: "NETWORK.NTP={value}"
  params:
    - {name: value, type: string, description: "OFF or ON"}
  notes: "Available in standby."

- id: build_info
  label: Version Info
  kind: query
  command: "BUILD.INFO({field})?"
  params:
    - {name: field, type: string, description: "DATE.SCP, VERSION.SCP, DATE.VP, VERSION.VP, SRC.INFO.VP, VERSION.HDMI, VERSION.FRC, PKG.DATE, PKG.VERSION, or VERSION.SPM"}
  notes: "Returns version/build string. Available in standby."

- id: audio_volume
  label: Volume
  kind: action
  command: "AUDIO.VOLUME={value}"
  params:
    - {name: value, type: integer, description: "0-100"}

- id: wall
  label: Wall
  kind: action
  command: "WALL({parameter})={value}"
  params:
    - {name: parameter, type: string, description: "ENABLE, WIDTH, HEIGHT, COLUMN, ROW, FRAME.ENABLE, FRAME.WIDTH, or FRAME.HEIGHT"}
    - {name: value, type: integer, description: "0-100"}

- id: password_set
  label: Web UI Password
  kind: action
  command: "PASSWORD.SET=\"{value}\""
  params:
    - {name: value, type: string, description: "Quoted password string (e.g. \"123456\")"}
  notes: "Sets Admin password for the Web UI."

Feedbacks

# Every Action whose operator is `?` or `#` returns the current value as
# `<OPCODE>:<value>`. Action commands (no operator) return:
#   - `<OPCODE>@ACK` on success
#   - `<OPCODE>^NAK` if command received but cannot be processed
#   - `<OPCODE>!ERR <n>` on error, where n is 1=Invalid syntax, 2=Reserved,
#     3=Command not recognized, 4=Invalid modifier, 5=Invalid operands,
#     6=Invalid operator.
# Responses are uppercase. Termination matches the request (CR, LF, or `;`).
- id: error_code
  type: enum
  values: [invalid_syntax, reserved, command_not_recognized, invalid_modifier, invalid_operand, invalid_operator]
  notes: "Source: !ERR 1-6."
- id: network_ping_result
  type: enum
  values: [SUCCESS, FAILED]
  notes: "Response of NETWORK.PING."
- id: ops_present
  type: enum
  values: [FALSE, TRUE]
- id: source_message
  type: string
  notes: "Resolution/refresh string, \"Searching\", or \"No Signal\"."
- id: system_state
  type: enum
  values: [STANDBY, POWERING.ON, ON, POWERING.DOWN, BACKLIGHT.OFF, FAULT]
- id: error_log_entry
  type: string
  notes: "Quoted log string. Empty = no more entries past this index."
- id: osd_status
  type: enum
  values: [DISABLE, ENABLE]
- id: hdr_metadata
  type: enum
  values: [Absent, Present]
- id: model_id
  type: string
  notes: "e.g. UR8451."
- id: model_series
  type: string
  notes: "Always \"UltraRes\" for this product."
- id: serial_number
  type: string
- id: network_mac
  type: string
  notes: "MAC string e.g. \"12:34:56:AB:CD:EF\"."
- id: schedule_description
  type: string
- id: time_string
  type: string
  notes: "ISO-like \"YYYY-MM-DD HH:MM\"."
- id: time_day
  type: enum
  values: [MON, TUE, WED, THU, FRI, SAT, SUN]
- id: preset_full
  type: enum
  values: [NO, YES]
- id: color_subsampling
  type: string
  notes: "e.g. \"4:4:4\" or \"4:2:0\"."
- id: signal_info
  type: integer
  notes: "Integer per-parameter (HACTIVE, VACTIVE, PCLK, VREFRESH, etc.) or quoted ALL block."
- id: build_info
  type: string

Variables

# All action parameters are settable variables. Listed here only when the
# parameter has independent utility beyond triggering a command.
# (Most variables are 1:1 with action operands; refer to the Actions section.)
- id: brightness_level
  type: integer
  range: "0-100"
  notes: "Per-zone (ZONE.1-4, ALL.INPUT, ALL, ALL.ZONE, CURRENT)."
- id: contrast_level
  type: integer
  range: "0-100"
- id: volume
  type: integer
  range: "0-100"
- id: power_on_delay
  type: number
  range: "0.0-10.0"
  unit: seconds
- id: power_down_mode
  type: enum
  values: [Standby.Mode, Networked.Standby.Mode, Fast.Startup]
  notes: "Must be Networked.Standby.Mode or Fast.Startup for RS-232 to work."
- id: timezone
  type: string
  notes: "See source Timezone Values table (105 entries)."
- id: hostname
  type: string
  notes: "Default \"UltraRes\"; spaces not allowed."

Events

# UNRESOLVED: source does not document any unsolicited notifications pushed
# from the display to the controller. SMTP/email notifications are configured
# (NOTIFICATION.EMAIL) but the device itself does not stream events.

Macros

# UNRESOLVED: source does not describe multi-step command sequences. The
# AUDIO.SETTINGS command provides a single-message write of 7 audio parameters
# but is documented as a single action, not a macro.

Safety

confirmation_required_for: []
interlocks: []
# UNRESOLVED: source contains no safety warnings, interlock procedures, or
# power-on sequencing requirements beyond the note that RS-232 requires
# POWER.DOWN.MODE to be Networked.Standby.Mode or Fast.Startup.

Notes

  • Three transports, one command set: DB9 RS-232, USB-B serial (appears as COM port on host), and TCP / UDP port 57. No Telnet encoding on TCP — connect as "Other" raw TCP. UDP requires manual CR appending in most tools (example: DISPLAY.POWER=1[CR] is hex 444953504C41592E504F5745523D310D).
  • Two network ports documented: TCP/UDP port 57 for the serial command set, and TCP/UDP port 52 separately controlled by COMMAND.ENABLE(NETWORK). Port 52 is distinct from port 57.
  • Excluded models: UR8450 and UR9850 are NOT covered; their RS-232 protocol lives in a separate User Manual at planar.com/support.
  • DB9 pinout: Pin 2 Tx, Pin 3 Rx, Pin 5 GND; all others NC. Straight-through cable.
  • USB-B serial uses the same command set as DB9; baud rate for the USB connection is also configurable via SERIAL.DEVICE(USB, BAUD).
  • Operator syntax: = write, ? read name, # read number, +/- increment/decrement, no operator = execute action. ?/# return is <OPCODE>:<value>; actions return @ACK / ^NAK / !ERR n.
  • Terminator: CR (0x0D), LF (0x0A), or ;. Response uses the same.
  • String escaping: Special characters, CR, LF, ", and \ are escaped with backslash inside quoted string operands.
  • All ops are case-insensitive; responses are uppercase. Whitespace flexible.
  • Standby availability: Many commands work in standby (marked "Available in standby" in source). RS-232 itself requires POWER.DOWN.MODE to be Networked.Standby.Mode or Fast.Startup.

## Provenance

```yaml
source_domains:
  - planar.com
source_urls:
  - https://www.planar.com/media/2jtdzv5r/020-1397-00c-ultrares-series-rs232-user-manual.pdf
  - https://www.planar.com/media/tghnvl0f/020-1397-00b_ultrares-x-series_rs232-user-manual-wm.pdf
  - https://www.planar.com/media/v2mototw/020-1397-00c-ultrares-series-rs232-user-manual.pdf
retrieved_at: 2026-05-01T02:08:48.725Z
last_checked_at: 2026-06-02T17:23:50.505Z

Verification Summary

verdict: verified
checked_at: 2026-06-02T17:23:50.505Z
matched_actions: 132
action_count: 132
confidence: medium
summary: "All 132 spec opcodes match source table entries one-to-one; transport values (baud 19200, port 57, 8N1, no flow control) confirmed verbatim in source. (5 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "explicit firmware version compatibility not stated in source"
- "source does not document any unsolicited notifications pushed"
- "source does not describe multi-step command sequences. The"
- "source contains no safety warnings, interlock procedures, or"
- "firmware version compatibility, voltage/current specs, fault"

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