Summary
Barco Pulse-based projector controlled via Pulse JSON-RPC API. Source documents TCP/IP control on port 9090 and RS-232 serial at 19200 baud. Covers power on/off, source selection, illumination, picture settings, warp/blend/black-level file handling, environment telemetry, DMX, optics (shutter/zoom/focus/lens shift), firmware management, and JSON-RPC introspection/subscriptions.
Transport
protocols:
- tcp
- serial
addressing:
port: 9090
serial:
baud_rate: 19200
data_bits: 8
parity: none
stop_bits: 1
flow_control: none
auth:
type: passcode # inferred: source documents `authenticate` method with secret code
# UNRESOLVED: secret passcode value not stated in source
Traits
traits:
- powerable # inferred: system.poweron / system.poweroff methods present
- queryable # inferred: property.get / property.subscribe present
- routable # inferred: image.window.main.source selection present
- levelable # inferred: brightness/contrast/saturation/gamma/sharpness settable
Actions
# Each named JSON-RPC method documented in the source is one action. Literal
# payload (`command:`) carries the documented JSON-RPC body verbatim.
actions:
- id: system_poweron
label: Power On Projector
kind: action
command: '{"jsonrpc":"2.0","method":"system.poweron"}'
params: []
- id: system_poweroff
label: Power Off Projector
kind: action
command: '{"jsonrpc":"2.0","method":"system.poweroff"}'
params: []
- id: authenticate
label: Authenticate (set access level)
kind: action
command: '{"jsonrpc":"2.0","method":"authenticate","params":{"code":98765}}'
params:
- name: code
type: integer
description: Secret pass code; sample value 98765 shown in source. Real value UNRESOLVED.
notes: "Sample code 98765 is the source's example only."
- id: property_set
label: Set Property Value
kind: action
command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"{objectname.propertyname}","value":{value}}}'
params:
- name: property
type: string
description: Dot-notation property path (e.g. image.window.main.source)
- name: value
type: any
description: Value type varies per property
- id: property_get
label: Get Property Value
kind: query
command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"{objectname.propertyname}"}}'
params:
- name: property
type: string
description: Dot-notation property path
- id: property_get_multi
label: Get Multiple Property Values
kind: query
command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":["{prop1}","{prop2}"]}}'
params:
- name: property
type: array
description: Array of property paths
- id: property_subscribe
label: Subscribe To Property Changes
kind: action
command: '{"jsonrpc":"2.0","method":"property.subscribe","params":{"property":"{objectname.propertyname}"}}'
params:
- name: property
type: string
description: Property path or array of property paths
- id: property_unsubscribe
label: Unsubscribe From Property Changes
kind: action
command: '{"jsonrpc":"2.0","method":"property.unsubscribe","params":{"property":"{objectname.propertyname}"}}'
params:
- name: property
type: string
description: Property path or array of property paths
- id: signal_subscribe
label: Subscribe To Signal
kind: action
command: '{"jsonrpc":"2.0","method":"signal.subscribe","params":{"signal":"{signalname}"}}'
params:
- name: signal
type: string
description: Signal name or array of signal names
- id: signal_unsubscribe
label: Unsubscribe From Signal
kind: action
command: '{"jsonrpc":"2.0","method":"signal.unsubscribe","params":{"signal":"{signalname}"}}'
params:
- name: signal
type: string
description: Signal name or array of signal names
- id: introspect_recursive
label: Introspect Object (recursive)
kind: query
command: '{"jsonrpc":"2.0","method":"introspect","params":{"object":"{name}","recursive":true}}'
params:
- name: object
type: string
description: Object name (dot notation); empty introspects everything
- name: recursive
type: boolean
description: true (default) recurses into sub-objects
- id: introspect_nonrecursive
label: Introspect Object (one level)
kind: query
command: '{"jsonrpc":"2.0","method":"introspect","params":["{name}",false]}'
params:
- name: object
type: string
description: Object name (dot notation)
- name: recursive
type: boolean
description: false lists only immediate child object names
- id: image_source_list
label: List Available Sources
kind: query
command: '{"jsonrpc":"2.0","method":"image.source.list"}'
params: []
- id: image_connector_list
label: List Available Connectors
kind: query
command: '{"jsonrpc":"2.0","method":"image.connector.list"}'
params: []
- id: image_source_listconnectors
label: List Connectors Used By Source
kind: query
command: '{"jsonrpc":"2.0","method":"image.source.{name}.listconnectors"}'
params:
- name: name
type: string
description: Source object name = source name with non-word chars stripped and lowercased (e.g. 'displayport1')
- id: set_main_source_displayport1
label: Select DisplayPort 1 As Input Source
kind: action
command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.window.main.source","value":"DisplayPort 1"}}'
params: []
- id: set_main_source_hdmi
label: Select HDMI As Input Source
kind: action
command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.window.main.source","value":"HDMI"}}'
params: []
- id: environment_getcontrolblocks
label: Get Environment Control Blocks
kind: query
command: '{"jsonrpc":"2.0","method":"environment.getcontrolblocks","params":{"type":"{Sensor|Filter|Controller|Actuator|Alarm|GenericBlock}","valuetype":"{Temperature|Speed|Voltage|...}"}}'
params:
- name: type
type: string
description: Sensor/Filter/Controller/Actuator/Alarm/GenericBlock
- name: valuetype
type: string
description: 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
- id: dmx_listchannels
label: List DMX Channels
kind: query
command: '{"jsonrpc":"2.0","method":"dmx.listchannels"}'
params: []
- id: dmx_listmodes
label: List DMX Modes
kind: query
command: '{"jsonrpc":"2.0","method":"dmx.listmodes"}'
params: []
- id: environment_getalarminfo
label: Get Alarm Info
kind: query
command: '{"jsonrpc":"2.0","method":"environment.getalarminfo"}'
params: []
- id: firmware_listcomponents
label: List Firmware Components
kind: query
command: '{"jsonrpc":"2.0","method":"firmware.listcomponents"}'
params: []
- id: firmware_listcomponentversionstatus
label: List Firmware Component Version Status
kind: query
command: '{"jsonrpc":"2.0","method":"firmware.listcomponentversionstatus"}'
params: []
- id: firmware_schedulecomponentupgrade
label: Schedule Component Upgrade At Next Reboot
kind: action
command: '{"jsonrpc":"2.0","method":"firmware.schedulecomponentupgrade"}'
params: []
- id: illumination_clo_engage
label: Engage CLO At Current Light Level
kind: action
command: '{"jsonrpc":"2.0","method":"illumination.clo.engage"}'
params: []
- id: illumination_laser_getserialnumber
label: Get Laser Serial Number
kind: query
command: '{"jsonrpc":"2.0","method":"illumination.laser.getserialnumber"}'
params: []
- 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":"{name}"}}'
params:
- name: presetname
type: string
description: Preset name to copy
- id: image_color_p7_custom_resetpreset
label: Reset Custom Color Preset (p7)
kind: action
command: '{"jsonrpc":"2.0","method":"image.color.p7.custom.resetpreset","params":{"presetname":"{name}"}}'
params:
- name: presetname
type: string
description: Preset name to reset
- id: image_color_p7_custom_resettonative
label: Reset Custom Color To Native (p7)
kind: action
command: '{"jsonrpc":"2.0","method":"image.color.p7.custom.resettonative"}'
params: []
- id: image_color_rgbmode_nextrgbmode
label: Cycle To Next RGB Mode
kind: action
command: '{"jsonrpc":"2.0","method":"image.color.rgbmode.nextrgbmode"}'
params: []
- id: eco_wake_serial
label: Wake From ECO Mode (RS-232 ASCII)
kind: action
command: ':POWR1\r'
params: []
notes: "Serial-port-only wake command per ECO-mode section."
- id: upload_warp_file
label: Upload Warp Grid File (HTTP)
kind: action
command: 'curl -X POST -F file=@warp.xml http://{projector-ip}/api/image/processing/warp/file/transfer'
params:
- name: projector-ip
type: string
description: Projector IP address
- name: file
type: string
description: Local path to warp grid XML
- id: upload_blend_mask
label: Upload Blend Mask (HTTP)
kind: action
command: 'curl -X POST -F file=@mask.png http://{projector-ip}/api/image/processing/blend/file/transfer'
params:
- name: projector-ip
type: string
- name: file
type: string
description: PNG/JPEG/TIFF grayscale mask path
- id: upload_blacklevel_mask
label: Upload Black Level Mask (HTTP)
kind: action
command: 'curl -X POST -F file=@blacklevel.png http://{projector-ip}/api/image/processing/blacklevel/file/transfer'
params:
- name: projector-ip
type: string
- name: file
type: string
description: PNG/JPEG/TIFF grayscale mask path
Feedbacks
feedbacks:
- id: system_state
type: enum
values: ["boot", "eco", "standby", "ready", "conditioning", "on", "service", "deconditioning", "error"]
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"system.state"}}'
- id: illumination_state
type: enum
values: ["On", "Off"]
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"illumination.state"}}'
- id: optics_shutter_position
type: enum
values: ["Open", "Closed"]
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"optics.shutter.position"}}'
- id: network_device_lan_state
type: enum
values: ["CONNECTED", "DISCONNECTED"]
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"network.device.lan.state"}}'
- id: environment_alarmstate
type: enum
values: ["Fatal", "Error", "Alert", "Warning", "Ok"]
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"environment.alarmstate"}}'
- id: active_source
type: string
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"image.window.main.source"}}'
- id: connector_detectedsignal
type: object
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"image.connector.{name}.detectedsignal"}}'
notes: "Returns active, name (e.g. '2560x1600 @ 50.10Hz'), timings, color_space, signal_range, chroma_sampling, gamma_type, etc."
- id: laser_power
type: float
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"illumination.sources.laser.power"}}'
- id: laser_minpower
type: float
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"illumination.sources.laser.minpower"}}'
- id: laser_maxpower
type: float
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"illumination.sources.laser.maxpower"}}'
- id: temperatures
type: object
query_command: '{"jsonrpc":"2.0","method":"environment.getcontrolblocks","params":{"type":"Sensor","valuetype":"Temperature"}}'
- id: fan_speeds
type: object
query_command: '{"jsonrpc":"2.0","method":"environment.getcontrolblocks","params":{"type":"Sensor","valuetype":"Speed"}}'
Variables
variables:
- id: image_brightness
type: float
access: RW
min: -1
max: 1
step_size: 1
precision: 0.01
set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.brightness","value":{value}}}'
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"image.brightness"}}'
- id: image_contrast
type: float
access: RW
min: 0
max: 2
step_size: 1
precision: 0.01
set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.contrast","value":{value}}}'
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"image.contrast"}}'
- id: image_gamma
type: float
access: RW
min: 1
max: 3
step_size: 1
precision: 0.1
set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.gamma","value":{value}}}'
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"image.gamma"}}'
- id: image_saturation
type: float
access: RW
min: 0
max: 2
step_size: 1
precision: 0.01
set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.saturation","value":{value}}}'
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"image.saturation"}}'
- id: image_sharpness
type: int
access: RW
min: -2
max: 8
step_size: 1
precision: 1
set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.sharpness","value":{value}}}'
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"image.sharpness"}}'
- id: laser_power
type: float
access: RW
unit: percent
set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"illumination.sources.laser.power","value":{value}}}'
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"illumination.sources.laser.power"}}'
- id: main_source
type: string
access: RW
set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.window.main.source","value":{value}}}'
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"image.window.main.source"}}'
- id: dmx_mode
type: string
access: RW
set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"dmx.mode","value":{value}}}'
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"dmx.mode"}}'
- id: dmx_startchannel
type: int
access: RW
min: 1
max: 512
set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"dmx.startchannel","value":{value}}}'
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"dmx.startchannel"}}'
- id: dmx_shutdown
type: bool
access: RW
set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"dmx.shutdown","value":{value}}}'
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"dmx.shutdown"}}'
- id: optics_zoom_position
type: int
access: RW
set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"optics.zoom.position","value":{value}}}'
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"optics.zoom.position"}}'
- id: optics_focus_position
type: int
access: RW
set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"optics.focus.position","value":{value}}}'
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"optics.focus.position"}}'
- id: optics_lensshift_horizontal
type: int
access: RW
set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"optics.lensshift.horizontal.position","value":{value}}}'
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"optics.lensshift.horizontal.position"}}'
- id: optics_lensshift_vertical
type: int
access: RW
set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"optics.lensshift.vertical.position","value":{value}}}'
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"optics.lensshift.vertical.position"}}'
- id: optics_shutter_target
type: enum
access: RW
values: ["Open", "Closed"]
set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"optics.shutter.target","value":{value}}}'
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"optics.shutter.target"}}'
- id: system_standby_enable
type: bool
access: RW
set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"system.standby.enable","value":{value}}}'
- id: system_eco_enable
type: bool
access: RW
set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"system.eco.enable","value":{value}}}'
- id: warp_enable
type: bool
access: RW
set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.processing.warp.enable","value":{value}}}'
- id: warp_file_enable
type: bool
access: RW
set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.processing.warp.file.enable","value":{value}}}'
- id: warp_file_selected
type: string
access: RW
set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.processing.warp.file.selected","value":{value}}}'
- id: blend_file_enable
type: bool
access: RW
set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.processing.blend.file.enable","value":{value}}}'
- id: blend_file_selected
type: array
access: RW
set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.processing.blend.file.selected","value":{value}}}'
- id: blacklevel_file_enable
type: bool
access: RW
set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.processing.blacklevel.file.enable","value":{value}}}'
- id: blacklevel_file_selected
type: string
access: RW
set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.processing.blacklevel.file.selected","value":{value}}}'
- id: image_orientation
type: enum
access: RW
values: ["DESKTOP_FRONT", "DESKTOP_REAR", "CEILING_FRONT", "CEILING_REAR"]
set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.orientation","value":{value}}}'
- id: image_scalingmode
type: enum
access: RW
values: ["Fill", "OneToOne", "FillScreen", "Stretch"]
set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.window.main.scalingmode","value":{value}}}'
- id: image_window_main_position
type: object
access: RW
fields: [{x: int}, {y: int}]
set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.window.main.position","value":{value}}}'
- id: image_window_main_size
type: object
access: RW
fields: [{width: int}, {height: int}]
set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.window.main.size","value":{value}}}'
- id: network_device_lan_ip4config
type: object
access: RO
fields: [{Address: string}, {Mask: string}, {Gateway: string}, {NameServers: string}]
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"network.device.lan.ip4config"}}'
# UNRESOLVED: many additional properties exist dynamically per projector
# configuration; source states API must be introspected for full enumeration.
Events
events:
- id: property_changed
description: Unsolicited notification pushed when a subscribed property value changes.
payload: '{"jsonrpc":"2.0","method":"property.changed","params":{"property":[{"{name}":{value}}]}}'
notes: "No response must be returned for notifications."
- id: signal_callback
description: Unsolicited notification pushed when a subscribed signal fires.
payload: '{"jsonrpc":"2.0","method":"signal.callback","params":{"signal":[{"{name}":{"arg1":{v}}}...]}}'
- id: modelupdated
description: Signal emitted when object structure changes (objects added/removed); also surfaced via signal.callback.
notes: "Subscribe via signal.subscribe with signal=modelupdated."
Macros
# UNRESOLVED: source documents no explicit multi-step named macros; file-upload
# + select + enable warp/blend/blacklevel workflows are sequences a client must
# chain, but no named macro is defined in source.
Safety
confirmation_required_for: []
interlocks:
- "Power-on: good practice to verify system.state is 'standby' or 'ready' before issuing system.poweron; if already on or transitioning, nothing happens."
- "Power-off: good practice to verify system.state is 'on' before issuing system.poweroff; if already off or transitioning, nothing happens."
- "ECO-mode wake requires wake-on-LAN, remote/keypad power button, or serial ':POWR1\\r' command."
- "property.set: wait for confirmation before re-setting same property to avoid flooding server with requests."
# UNRESOLVED: source states no formal safety interlocks, power-sequencing
# certifications, or hardware interlock procedures. Power/voltage/current
# ratings not stated - never inferred.
Notes
- Pulse API is JSON-RPC 2.0. Parameters passed by name; order does not matter. Notifications have no
idand require no response. - API is partly dynamic; available objects/properties/signals depend on projector configuration (lens type, DMX mode, peripherals). Full enumeration requires runtime introspection via the
introspectmethod. - File transfer uses HTTP at
http://<projector-ip>/api/...endpoints. Warp grid file format is the same as MCM500/400. Blend/black-level masks accept PNG (≤16 bit), JPEG, TIFF; color images are accepted but only the blue channel is used. - RS-232 cable: 9-pin female on host, 9-pin male on projector, pin 2↔2, 3↔3, 5↔5.
- Property subscription delivers a notification only on actual value change; subscribing does NOT return the current value (use
property.get). - Source-select generates two notifications (deselect old, then select new).
Provenance
source_domains:
- audiogeneral.com
source_urls:
- "https://www.audiogeneral.com/barco/UDX%20Series/JSON_ReferenceGuide.pdf"
retrieved_at: 2026-07-18T06:12:07.938Z
last_checked_at: 2026-07-21T20:50:29.299Z
Verification Summary
verdict: verified
checked_at: 2026-07-21T20:50:29.299Z
matched_actions: 46
action_count: 46
confidence: medium
summary: "All 46 spec actions found verbatim in source; transport parameters verified; no shape mismatches. (9 unresolved item(s) noted in Known Gaps.)"
Known Gaps
- "device model family not explicitly named \"Ac Ds01\" in source text (source generic to \"Pulse projectors\"); product variants not enumerated."
- "secret passcode value not stated in source"
- "many additional properties exist dynamically per projector"
- "source documents no explicit multi-step named macros; file-upload"
- "source states no formal safety interlocks, power-sequencing"
- "device model \"Ac Ds01\" not explicitly named in source text; source is the generic Pulse projector API reference."
- "auth passcode value not stated (source uses 98765 as example only)."
- "HTTP base URL host must be supplied at runtime; only path pattern stated."
- "firmware/protocol version compatibility not stated."
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0