Summary
Barco LVC 420 laser projector (Pulse platform) controlled via JSON-RPC 2.0 "Pulse API". Same command set available over TCP/IP (port 9090), RS-232 serial (19200 8N1, no flow control), and HTTP file endpoints (/api/...) for upload/download of warp grids, blend masks, and black level masks.
Transport
protocols:
- tcp
- serial
- http
addressing:
port: 9090
base_url: 'http://{projector-address}/api' # HTTP file endpoints only (warp/blend/blacklevel transfer)
serial:
baud_rate: 19200
data_bits: 8
parity: none
stop_bits: 1
flow_control: none
auth:
type: none # inferred: normal end-user access skips authentication; optional "authenticate" method (secret pass code) exists for elevated access levels
Traits
- powerable # inferred: system.poweron / system.poweroff methods documented
- queryable # inferred: property.get / list / environment query methods documented
- routable # inferred: input source selection via image.window.main.source documented
- levelable # inferred: brightness, contrast, gamma, saturation, sharpness, laser power settable
Actions
# JSON-RPC 2.0 request payloads shown verbatim from source. Parameter order is
# irrelevant (all params passed by name). "id" is an optional request identifier.
- id: power_on
label: Power On
kind: action
command: '{"jsonrpc": "2.0", "method": "system.poweron"}'
params: []
notes: Result is null on success (not an error). No-op if already on or in state transition; good practice to verify state is standby/ready first.
- id: power_off
label: Power Off
kind: action
command: '{"jsonrpc": "2.0", "method": "system.poweroff"}'
params: []
notes: Result is null on success. No-op if already off or in state transition; good practice to verify state is on first.
- id: eco_wake_serial
label: Wake from ECO Mode (serial only)
kind: action
command: ':POWR1\r'
params: []
notes: Special ASCII wake command sent on RS232 port only. ECO wake also possible via wake-on-LAN (MAC address), remote power button, or keypad power button.
- id: select_input
label: Select Main Window Input Source
kind: action
command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "image.window.main.source", "value": "{source}"}}'
params:
- name: source
type: string
description: Source name from image.source.list (e.g. "DisplayPort 1", "HDMI", "DVI 1", "DVI 2", "DisplayPort 2", "Dual DVI", "Dual DisplayPort", "Dual Head DVI", "Dual Head DisplayPort", "HDBaseT", "SDI"); list varies by model
- id: authenticate
label: Authenticate (elevated access)
kind: action
command: '{"jsonrpc": "2.0", "method": "authenticate", "params": {"code": {code}}, "id": 1}'
params:
- name: code
type: integer
description: Secret pass code; sets user access level. Only needed above normal end-user level.
notes: Response {"result": true} on success.
- id: property_get
label: Get Property Value
kind: query
command: '{"jsonrpc": "2.0", "method": "property.get", "params": {"property": "{property}"}, "id": 4}'
params:
- name: property
type: string
description: Property name in dot notation (e.g. "system.state"); array accepted to read multiple properties at once
- id: property_set
label: Set Property Value
kind: action
command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "{property}", "value": {value}}, "id": 3}'
params:
- name: property
type: string
description: Property name in dot notation (e.g. "objectname.propertyname")
- name: value
type: any
description: Value to set; type per property introspection
notes: Wait for confirmation before setting the same property again; flooding the server degrades performance.
- id: property_subscribe
label: Subscribe to Property Changes
kind: action
command: '{"jsonrpc": "2.0", "method": "property.subscribe", "params": {"property": "{property}"}, "id": 6}'
params:
- name: property
type: string
description: Single property name or array of property names
- id: property_unsubscribe
label: Unsubscribe from Property Changes
kind: action
command: '{"jsonrpc": "2.0", "method": "property.unsubscribe", "params": {"property": "{property}"}, "id": 8}'
params:
- name: property
type: string
description: Single property name or array of property names
- id: signal_subscribe
label: Subscribe to Signal
kind: action
command: '{"jsonrpc": "2.0", "method": "signal.subscribe", "params": {"signal": "{signal}"}, "id": 10}'
params:
- name: signal
type: string
description: Signal name or array of signal names (e.g. "modelupdated")
- id: signal_unsubscribe
label: Unsubscribe from Signal
kind: action
command: '{"jsonrpc": "2.0", "method": "signal.unsubscribe", "params": {"signal": "{signal}"}, "id": 12}'
params:
- name: signal
type: string
description: Signal name or array of signal names
- id: introspect
label: Introspect Object Metadata
kind: query
command: '{"jsonrpc": "2.0", "method": "introspect", "params": {"object": "{object}", "recursive": {recursive}}, "id": 1}'
params:
- name: object
type: string
description: Object name in dot notation; empty/default introspects everything
- name: recursive
type: boolean
description: "true (default): full metadata; false: list object names one level only"
notes: Result restricted by authenticated access level. Equivalent positional form: params: ["foo", true].
- id: image_source_list
label: List Available Sources
kind: query
command: '{"jsonrpc": "2.0", "method": "image.source.list", "id": 1}'
params: []
notes: Returns array of source names; contents vary by projector model.
- id: image_connector_list
label: List Available Connectors
kind: query
command: '{"jsonrpc": "2.0", "method": "image.connector.list", "id": 3}'
params: []
- id: image_source_listconnectors
label: List Connectors Used By Source
kind: query
command: '{"jsonrpc": "2.0", "method": "image.source.{objectname}.listconnectors", "id": 4}'
params:
- name: objectname
type: string
description: Source object name = source name with non-word chars removed, lowercased (e.g. "DisplayPort 1" -> "displayport1")
notes: Returns connector name and grid position (row/column/plane).
- id: environment_getcontrolblocks
label: Get Environment Sensor Readings
kind: query
command: '{"jsonrpc": "2.0", "method": "environment.getcontrolblocks", "params": {"type": "{type}", "valuetype": "{valuetype}"}, "id": 18}'
params:
- name: type
type: string
description: 'One of: "Sensor", "Filter", "Controller", "Actuator", "Alarm", "GenericBlock"'
- name: valuetype
type: string
description: 'One of: "Temperature", "Speed", "PWM", "Voltage", "Current", "Power", "Altitude", "Pressure", "Humidity", "ADC", "Coordinate", "Peltier", "Waveform", "Average", "Delay", "Difference", "Interpolation", "Limit", "Median", "Noise", "Weighting", "Comparison", "Threshold", "Formula", "Driver", "PID", "Mode", "State", "Pump", "Resistance", "Simulation", "Constant", "Manual", "Range", "Any"'
notes: Returns dictionary of sensor-name -> float value (temperatures, fan tacho speeds, etc.).
- id: environment_getalarminfo
label: Get Alarm Info
kind: query
command: '{"jsonrpc": "2.0", "method": "environment.getalarminfo"}'
params: []
notes: Returns array of {severity, timestamp, source, description, custommessage}.
- id: dmx_listchannels
label: List DMX Channels
kind: query
command: '{"jsonrpc": "2.0", "method": "dmx.listchannels"}'
params: []
notes: Returns list of available channel names.
- id: dmx_listmodes
label: List DMX Modes
kind: query
command: '{"jsonrpc": "2.0", "method": "dmx.listmodes"}'
params: []
notes: Returns list of all modes.
- id: firmware_listcomponents
label: List Firmware Components
kind: query
command: '{"jsonrpc": "2.0", "method": "firmware.listcomponents"}'
params: []
notes: Returns names of all managed firmware components.
- id: firmware_listcomponentversionstatus
label: List Firmware Component Version Status
kind: query
command: '{"jsonrpc": "2.0", "method": "firmware.listcomponentversionstatus"}'
params: []
notes: Returns array of {name, versions{available, running}, status} where status is "Unknown" | "OK" | "Upgradable".
- id: firmware_schedulecomponentupgrade
label: Schedule Firmware Component Upgrade
kind: action
command: '{"jsonrpc": "2.0", "method": "firmware.schedulecomponentupgrade"}'
params: []
notes: Forces a component upgrade at next reboot.
- id: illumination_clo_engage
label: Engage CLO (Constant Light Output)
kind: action
command: '{"jsonrpc": "2.0", "method": "illumination.clo.engage"}'
params: []
notes: Engages CLO at the current light level.
- id: illumination_laser_getserialnumber
label: Get Laser Serial Number
kind: query
command: '{"jsonrpc": "2.0", "method": "illumination.laser.getserialnumber"}'
params: []
notes: Returns string value.
- id: image_color_p7_custom_copypresettocustom
label: Copy Color Preset To Custom (P7)
kind: action
command: '{"jsonrpc": "2.0", "method": "image.color.p7.custom.copypresettocustom", "params": {"presetname": "{presetname}"}}'
params:
- name: presetname
type: string
description: Name of preset to copy
- id: image_color_p7_custom_resetpreset
label: Reset Color Preset (P7)
kind: action
command: '{"jsonrpc": "2.0", "method": "image.color.p7.custom.resetpreset", "params": {"presetname": "{presetname}"}}'
params:
- name: presetname
type: string
description: Resets preset back to default values
- id: image_color_p7_custom_resettonative
label: Reset Color To Native (P7)
kind: action
command: '{"jsonrpc": "2.0", "method": "image.color.p7.custom.resettonative"}'
params: []
- id: image_color_rgbmode_nextrgbmode
label: Next RGB Mode
kind: action
command: '{"jsonrpc": "2.0", "method": "image.color.rgbmode.nextrgbmode"}'
params: []
notes: Cycles through all possible RGB modes.
- id: ledctrl_blink
label: Blink LED
kind: action
command: '{"jsonrpc": "2.0", "method": "ledctrl.blink", "params": {"led": "{led}", "color": "{color}", "period": {period}}, "id": 3}'
params:
- name: led
type: string
description: LED name (e.g. "systemstatus")
- name: color
type: string
description: Color name (e.g. "red")
- name: period
type: integer
description: Blink period (e.g. 42)
notes: Documented as the worked example of method invocation.
- id: file_download
label: Download File (HTTP endpoint)
kind: query
command: 'GET http://{projector-address}/api/{endpoint}/{filename}'
params:
- name: endpoint
type: string
description: 'File endpoint path, e.g. "image/processing/warp/file/transfer"'
- name: filename
type: string
description: File to download; required for endpoints that do not support downloading the current file (e.g. warpgrid.xml)
notes: Example: curl -O -J http://192.168.1.100/api/image/processing/warp/file/transfer
- id: file_upload
label: Upload File (HTTP endpoint)
kind: action
command: 'curl -F file=@{filename} http://{projector-address}/api/{endpoint}'
params:
- name: filename
type: string
description: Local file to upload (warp grid XML, blend/blacklevel mask PNG/JPEG/TIFF)
- name: endpoint
type: string
description: 'e.g. "image/processing/warp/file/transfer", "image/processing/blend/file/transfer", "image/processing/blacklevel/file/transfer"'
notes: HTTP POST implied by -F.
Feedbacks
- id: system_state
type: enum
values: [boot, eco, standby, ready, conditioning, on, service, deconditioning, error]
query: property.get "system.state"
- id: illumination_state
type: enum
values: ["On", "Off"]
query: property.get "illumination.state"
- id: active_source
type: string
query: property.get "image.window.main.source"
- id: available_sources
type: array
query: image.source.list
- id: available_connectors
type: array
query: image.connector.list
- id: detected_signal
type: object
query: property.get "image.connector.{name}.detectedsignal"
fields: [active, name, vertical_total, horizontal_total, vertical_resolution, horizontal_resolution, vertical_sync_width, vertical_front_porch, vertical_back_porch, horizontal_sync_width, horizontal_front_porch, horizontal_back_porch, horizontal_frequency, vertical_frequency, pixel_rate, scan, bits_per_component, color_space, signal_range, chroma_sampling, gamma_type, color_primaries, mastering_luminance, content_aspect_ratio, is_stereo, stereo_mode]
notes: If active=false, disregard remaining fields.
- id: environment_alarmstate
type: enum
values: [Fatal, Error, Alert, Warning, Ok]
query: property.get "environment.alarmstate"
- id: laser_power
type: float
query: property.get "illumination.sources.laser.power"
- id: laser_minpower
type: float
query: property.get "illumination.sources.laser.minpower"
- id: laser_maxpower
type: float
query: property.get "illumination.sources.laser.maxpower"
Variables
# All set via property.set; read via property.get; ranges from source introspection data.
- id: illumination_sources_laser_power
label: Laser Power (percent)
type: float
access: rw
property: illumination.sources.laser.power
- id: image_window_main_source
label: Main Window Source
type: string
access: rw
property: image.window.main.source
- id: image_window_main_position
label: Main Window Position
type: object
access: rw
property: image.window.main.position
fields: {x: int, y: int}
- id: image_window_main_size
label: Main Window Size
type: object
access: rw
property: image.window.main.size
fields: {width: int, height: int}
- id: image_window_main_scalingmode
label: Main Window Scaling Mode
type: enum
access: rw
property: image.window.main.scalingmode
values: [Fill, OneToOne, FillScreen, Stretch]
- id: image_brightness
label: Brightness
type: float
access: rw
property: image.brightness
constraints: {min: -1, max: 1, step_size: 1, precision: 0.01}
notes: Normalized; 0 default, 1 is 100% offset.
- id: image_contrast
label: Contrast
type: float
access: rw
property: image.contrast
constraints: {min: 0, max: 2, step_size: 1, precision: 0.01}
notes: Normalized; 1 default.
- id: image_gamma
label: Gamma
type: float
access: rw
property: image.gamma
constraints: {min: 1, max: 3, step_size: 1, precision: 0.1}
notes: Default 2.2.
- id: image_saturation
label: Saturation
type: float
access: rw
property: image.saturation
constraints: {min: 0, max: 2, step_size: 1, precision: 0.01}
notes: Normalized; 1 default.
- id: image_sharpness
label: Sharpness
type: int
access: rw
property: image.sharpness
constraints: {min: -2, max: 8, step_size: 1, precision: 1}
notes: Normalized.
- id: image_orientation
label: Image Orientation
type: enum
access: rw
property: image.orientation
values: [DESKTOP_FRONT, DESKTOP_REAR, CEILING_FRONT, CEILING_REAR]
- id: image_processing_warp_enable
label: Warp Enable (global)
type: boolean
access: rw
property: image.processing.warp.enable
- id: image_processing_warp_file_enable
label: File Warp Enable
type: boolean
access: rw
property: image.processing.warp.file.enable
- id: image_processing_warp_file_selected
label: Selected Warp File
type: string
access: rw
property: image.processing.warp.file.selected
- id: image_processing_blend_file_enable
label: File Blend Enable
type: boolean
access: rw
property: image.processing.blend.file.enable
- id: image_processing_blend_file_selected
label: Selected Blend Files
type: array
access: rw
property: image.processing.blend.file.selected
- id: image_processing_blacklevel_file_enable
label: Black Level Correction Enable
type: boolean
access: rw
property: image.processing.blacklevel.file.enable
- id: image_processing_blacklevel_file_selected
label: Selected Black Level File
type: string
access: rw
property: image.processing.blacklevel.file.selected
- id: dmx_mode
label: DMX Mode
type: string
access: rw
property: dmx.mode
- id: dmx_startchannel
label: DMX Start Channel
type: int
access: rw
property: dmx.startchannel
constraints: {min: 1, max: 512}
- id: dmx_shutdown
label: DMX Shutdown Enable
type: boolean
access: rw
property: dmx.shutdown
- id: network_device_lan_ip4config
label: LAN IPv4 Config
type: object
access: r
property: network.device.lan.ip4config
fields: {Address: string, Mask: string, Gateway: string, NameServers: string}
- id: network_device_lan_state
label: LAN State
type: enum
access: r
property: network.device.lan.state
values: [CONNECTED, DISCONNECTED]
- id: optics_shutter_position
label: Shutter Position
type: enum
access: r
property: optics.shutter.position
values: [Open, Closed]
- id: optics_shutter_target
label: Shutter Target
type: enum
access: rw
property: optics.shutter.target
values: [Open, Closed]
- id: optics_zoom_position
label: Zoom Position
type: int
access: rw
property: optics.zoom.position
- id: optics_focus_position
label: Focus Position
type: int
access: rw
property: optics.focus.position
- id: optics_lensshift_horizontal_position
label: Horizontal Lens Shift Position
type: int
access: rw
property: optics.lensshift.horizontal.position
- id: optics_lensshift_vertical_position
label: Vertical Lens Shift Position
type: int
access: rw
property: optics.lensshift.vertical.position
- id: system_standby_enable
label: Standby State Enable
type: boolean
access: rw
property: system.standby.enable
notes: Check availability first.
- id: system_eco_enable
label: ECO State Enable
type: boolean
access: rw
property: system.eco.enable
notes: Check availability first.
Events
- id: property_changed
description: Server notification when a subscribed property value changes. Client must implement this method.
payload: '{"jsonrpc": "2.0", "method": "property.changed", "params": {"property": [{"{objectname.propertyname}": {value}}]}}'
notes: Notifications carry no id and require no response. Source-change on image.window.main.source delivers two notifications (deselect then select). Only sent on actual value change; subscribing does not return current value.
- id: signal_callback
description: Server notification when a subscribed signal is emitted. Client must implement this method.
payload: '{"jsonrpc": "2.0", "method": "signal.callback", "params": {"signal": [{"{objectname.signalname}": {args}}]}}'
- id: modelupdated
description: Signal triggered when object structure changes (objects added or removed). Subscribe via signal.subscribe.
payload: '{"jsonrpc": "2.0", "method": "signal.callback", "params": {"signal": [{"introspect.objectchanged": {"object": "motors.motor1", "newobject": true}}]}}'
notes: Callback arg "newobject" true = object added, false = object lost.
Macros
- id: activate_warp_grid
label: Upload and Activate Warp Grid
steps:
- property.set image.processing.warp.enable = true
- 'HTTP upload: curl -F file=@warp.xml http://{projector-address}/api/image/processing/warp/file/transfer'
- property.set image.processing.warp.file.selected = "warp.xml"
- property.set image.processing.warp.file.enable = true
notes: Warp file format same as MCM500/400.
- id: activate_blend_mask
label: Upload and Activate Blend Mask
steps:
- 'HTTP upload: curl -F file=@mask.png http://{projector-address}/api/image/processing/blend/file/transfer'
- property.set image.processing.blend.file.selected = "mask.png"
- property.set image.processing.blend.file.enable = true
notes: 'Mask must match blend layer resolution: WUXGA 1920x1200, WQXGA 1280x800, 4K 1280x800, 4K Cinemascope 1280x540. Grayscale 8/16-bit; color images use blue channel only. PNG (up to 16 bit), JPEG, TIFF supported.'
- id: activate_blacklevel_mask
label: Upload and Activate Black Level Mask
steps:
- 'HTTP upload: curl -F file=@blacklevel.png http://{projector-address}/api/image/processing/blacklevel/file/transfer'
- property.set image.processing.blacklevel.file.selected = "blacklevel.png"
- property.set image.processing.blacklevel.file.enable = true
Safety
confirmation_required_for: []
interlocks: []
# UNRESOLVED: source contains no explicit safety warnings or interlock procedures.
Notes
- Serial cable: 9-pin female to host, 9-pin male to projector; pin 2-2, 3-3, 5-5 (straight-through).
- Same JSON-RPC command set over all connection types (TCP 9090, serial, and via HTTP file endpoints for transfers).
- All parameters passed by name; parameter order irrelevant.
- Best practice: wait for property.set confirmation before re-setting the same property (flooding degrades server performance).
- Good practice: verify state standby/ready before power on, on before power off. Power commands are no-ops in transitions.
- ECO-mode wake requires wake-on-LAN, remote/keypad power button, or serial
:POWR1\r. - API is dynamic: availability depends on peripherals and configuration (e.g. no motorized zoom API without motorized lens; DMX extended mode exposes more channels). Use introspection for exact per-unit API.
- Source-name to object-name translation: strip non-word characters, lowercase ("DisplayPort 1" -> "displayport1").
- Notifications only delivered on actual value change; use property.get for current values.
Provenance
source_domains:
- audiogeneral.com
source_urls:
- "https://www.audiogeneral.com/barco/UDX%20Series/JSON_ReferenceGuide.pdf"
retrieved_at: 2026-08-18T18:10:03.042Z
last_checked_at: 2026-08-19T08:56:50.356Z
Verification Summary
verdict: verified
checked_at: 2026-08-19T08:56:50.356Z
matched_actions: 31
action_count: 31
confidence: medium
summary: "All 31 spec actions map to documented JSON-RPC methods, properties, or serial/curl commands in the refined source; transport parameters (port 9090, 19200 8N1) are verbatim. (4 unresolved item(s) noted in Known Gaps.)"
Known Gaps
- "source is a generic Pulse API catalog; model-specific command availability varies (dynamic API — introspection recommended). Firmware compatibility not stated."
- "source contains no explicit safety warnings or interlock procedures."
- "firmware version compatibility not stated in source"
- "full enumeration of laser/LED illumination source properties beyond laser not stated; requires introspection of illumination object"
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0