Summary
The Barco S34KJr is a Pulse-series projector controllable over TCP/IP (port 9090), RS-232, and HTTP file endpoints via a JSON-RPC 2.0 service. The same command set is exposed over all three transports, with HTTP additionally used for uploading warp grids, blend masks, and black-level files.
Transport
protocols:
- tcp
- serial
- http
addressing:
port: 9090
base_url: "http://<projector-address>/api"
serial:
baud_rate: 19200
data_bits: 8
parity: none
stop_bits: 1
flow_control: none
auth:
type: optional
# Inferred from source: authentication is optional for normal end-user access.
# Elevated access requires an "authenticate" JSON-RPC call with a pass code parameter "code".
Traits
- powerable # inferred from system.poweron / system.poweroff commands
- routable # inferred from image.window.main.source / image.source.list / image.connector.list
- queryable # inferred from property.get / environment.getcontrolblocks examples
- levelable # inferred from image.brightness / image.contrast / illumination.sources.laser.power
Actions
# All JSON-RPC 2.0 methods documented in the source are enumerated as separate actions.
# Each method count is a distinct entry even when its payload is empty.
- id: power_on
label: Power On
kind: action
command: |
{ "jsonrpc": "2.0", "method": "system.poweron", "id": 3 }
params: []
notes: "Result is null. Verify projector state is 'standby' or 'ready' before issuing."
- id: power_off
label: Power Off
kind: action
command: |
{ "jsonrpc": "2.0", "method": "system.poweroff", "id": 4 }
params: []
notes: "Result is null. Verify projector state is 'on' before issuing."
- id: property_set
label: Set Property Value
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.set", "params": { "property": "{property}", "value": {value} }, "id": 9 }
params:
- name: property
type: string
description: "Dot-notation property path, e.g. 'image.window.main.source' or 'illumination.sources.laser.power'"
- name: value
type: string
description: "JSON-typed value (string/number/bool/object) per the target property's type"
notes: "Best practice: wait for confirmation before re-setting the same property to avoid flooding."
- 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: "Dot-notation property path"
- id: property_get_multi
label: Get Multiple Property Values
kind: query
command: |
{ "jsonrpc": "2.0", "method": "property.get", "params": { "property": ["{property1}", "{property2}"] }, "id": 5 }
params:
- name: property1
type: string
- name: property2
type: string
- name: propertyN
type: string
description: "Additional property names; JSON-RPC array form"
- id: property_subscribe
label: Subscribe to One Property
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.subscribe", "params": { "property": "{property}" }, "id": 6 }
params:
- name: property
type: string
description: "Dot-notation property path"
- id: property_subscribe_multi
label: Subscribe to Multiple Properties
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.subscribe", "params": { "property": ["{property1}", "{property2}"] }, "id": 7 }
params:
- name: property1
type: string
- name: property2
type: string
- id: property_unsubscribe
label: Unsubscribe from One Property
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.unsubscribe", "params": { "property": "{property}" }, "id": 8 }
params:
- name: property
type: string
- id: property_unsubscribe_multi
label: Unsubscribe from Multiple Properties
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.unsubscribe", "params": { "property": ["{property1}", "{property2}"] }, "id": 9 }
params:
- name: property1
type: string
- name: property2
type: string
- id: signal_subscribe
label: Subscribe to One Signal
kind: action
command: |
{ "jsonrpc": "2.0", "method": "signal.subscribe", "params": { "signal": "{signal}" }, "id": 10 }
params:
- name: signal
type: string
description: "Signal name in dot notation, e.g. 'modelupdated'"
- id: signal_subscribe_multi
label: Subscribe to Multiple Signals
kind: action
command: |
{ "jsonrpc": "2.0", "method": "signal.subscribe", "params": { "signal": ["{signal1}", "{signal2}"] }, "id": 11 }
params:
- name: signal1
type: string
- name: signal2
type: string
- id: signal_unsubscribe
label: Unsubscribe from One Signal
kind: action
command: |
{ "jsonrpc": "2.0", "method": "signal.unsubscribe", "params": { "signal": "{signal}" }, "id": 12 }
params:
- name: signal
type: string
- id: signal_unsubscribe_multi
label: Unsubscribe from Multiple Signals
kind: action
command: |
{ "jsonrpc": "2.0", "method": "signal.unsubscribe", "params": { "signal": ["{signal1}", "{signal2}"] }, "id": 13 }
params:
- name: signal1
type: string
- name: signal2
type: string
- id: introspect_recursive
label: Introspect Object (Recursive)
kind: query
command: |
{ "jsonrpc": "2.0", "method": "introspect", "params": { "object": "{object}", "recursive": true }, "id": 1 }
params:
- name: object
type: string
description: "Object name (dot notation allowed); default empty introspects everything"
- id: introspect_recursive_positional
label: Introspect Object (Recursive, Positional Params)
kind: query
command: |
{ "jsonrpc": "2.0", "method": "introspect", "params": ["{object}", true], "id": 1 }
params:
- name: object
type: string
- id: introspect_non_recursive
label: Introspect Object (Non-Recursive)
kind: query
command: |
{ "jsonrpc": "2.0", "method": "introspect", "params": { "object": "{object}", "recursive": false }, "id": 2 }
params:
- name: object
type: string
- id: introspect_non_recursive_positional
label: Introspect Object (Non-Recursive, Positional Params)
kind: query
command: |
{ "jsonrpc": "2.0", "method": "introspect", "params": ["{object}", false], "id": 2 }
params:
- name: object
type: string
- id: authenticate
label: Authenticate (Elevated Access)
kind: action
command: |
{ "jsonrpc": "2.0", "method": "authenticate", "params": { "id": 1, "code": {code} } }
params:
- name: code
type: integer
description: "Pass code; required only for access levels above normal end user"
notes: "Optional for normal end-user access; skip when default level is sufficient."
- id: ledctrl_blink
label: Blink an LED
kind: action
command: |
{ "jsonrpc": "2.0", "method": "ledctrl.blink", "params": { "id": 3, "led": "{led}", "color": "{color}", "period": {period} } }
params:
- name: led
type: string
description: "LED name, e.g. 'systemstatus'"
- name: color
type: string
description: "LED color, e.g. 'red'"
- name: period
type: integer
description: "Blink period"
- id: image_source_list
label: List Available Sources
kind: query
command: |
{ "jsonrpc": "2.0", "method": "image.source.list", "id": 1 }
params: []
notes: "Result varies by projector model."
- id: image_connector_list
label: List Available Connectors
kind: query
command: |
{ "jsonrpc": "2.0", "method": "image.connector.list", "id": 3 }
params: []
notes: "Result varies by projector model."
- id: image_source_listconnectors
label: List Connectors for a Source
kind: query
command: |
{ "jsonrpc": "2.0", "method": "image.source.{sourcename}.listconnectors", "id": 4 }
params:
- name: sourcename
type: string
description: "Source object name (e.g. 'displayport1') - derive by lowercasing and stripping non-word characters from the source name"
- 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: "Sensor type, e.g. 'Sensor'"
- name: valuetype
type: string
description: "Value type, e.g. 'Temperature' or 'Speed'"
notes: "Returns a dictionary of sensor-name → value pairs."
- id: environment_getalarminfo
label: Get Environment Alarm Information
kind: query
command: |
{ "jsonrpc": "2.0", "method": "environment.getalarminfo" }
params: []
notes: "Returns array of alarm objects with severity, timestamp, source, description, custommessage."
- id: dmx_listchannels
label: List DMX Channel Names
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: firmware_listcomponents
label: List Managed Firmware Components
kind: query
command: |
{ "jsonrpc": "2.0", "method": "firmware.listcomponents" }
params: []
- id: firmware_listcomponentversionstatus
label: List Firmware Component Versions and Status
kind: query
command: |
{ "jsonrpc": "2.0", "method": "firmware.listcomponentversionstatus" }
params: []
- id: firmware_schedulecomponentupgrade
label: Schedule Component Firmware Upgrade
kind: action
command: |
{ "jsonrpc": "2.0", "method": "firmware.schedulecomponentupgrade" }
params: []
notes: "Forces a component upgrade at the following reboot."
- 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 P7 Preset to Custom
kind: action
command: |
{ "jsonrpc": "2.0", "method": "image.color.p7.custom.copypresettocustom", "params": { "presetname": "{presetname}" } }
params:
- name: presetname
type: string
- id: image_color_p7_custom_resetpreset
label: Reset P7 Custom Preset to Default
kind: action
command: |
{ "jsonrpc": "2.0", "method": "image.color.p7.custom.resetpreset", "params": { "presetname": "{presetname}" } }
params:
- name: presetname
type: string
- id: image_color_p7_custom_resettonative
label: Reset P7 Custom to Native
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: upload_warp_file
label: Upload Warp Grid File (HTTP)
kind: action
command: |
curl -X POST -F file=@{filename} http://{address}/api/image/processing/warp/file/transfer
params:
- name: address
type: string
description: "Projector IP address, e.g. '192.168.1.100'"
- name: filename
type: string
description: "Local path to the warp grid file (e.g. 'warp.xml')"
notes: "Format is the same as on the MCM500/400. Activate after upload with image.processing.warp.file.selected."
- id: download_warp_file
label: Download Current Warp Grid File (HTTP)
kind: action
command: |
curl -O -J http://{address}/api/image/processing/warp/file/transfer
params:
- name: address
type: string
description: "Projector IP address"
- id: upload_blend_mask
label: Upload Blend Mask Image (HTTP)
kind: action
command: |
curl -X POST -F file=@{filename} http://{address}/api/image/processing/blend/file/transfer
params:
- name: address
type: string
- name: filename
type: string
description: "Local path to a PNG/JPEG/TIFF blend mask (grayscale 8 or 16 bit)"
notes: "Mask resolution must match projector blend layer resolution (WUXGA 1920x1200, WQXGA 1280x800, 4K 1280x800, 4K Cinemascope 1280x540)."
- id: upload_blacklevel_mask
label: Upload Black-Level Mask Image (HTTP)
kind: action
command: |
curl -X POST -F file=@{filename} http://{address}/api/image/processing/blacklevel/file/transfer
params:
- name: address
type: string
- name: filename
type: string
description: "Local path to a PNG/JPEG/TIFF black-level mask (grayscale 8 or 16 bit)"
notes: "Mask resolution must match projector black-level layer resolution (WUXGA 1920x1200, WQXGA 1280x800, 4K 1280x800, 4K Cinemascope 1280x540)."
- id: serial_wake_from_eco
label: Wake Projector from ECO (RS-232)
kind: action
command: |
:POWR1\r
params: []
notes: "Send this ASCII string on the RS-232 serial port to wake a projector that is in ECO mode."
Feedbacks
- id: system_state
type: enum
values: [boot, eco, standby, ready, conditioning, on, service, deconditioning, error]
source_property: system.state
- id: illumination_state
type: enum
values: [On, Off]
source_property: illumination.state
- id: image_orientation
type: enum
values: [DESKTOP_FRONT, DESKTOP_REAR, CEILING_FRONT, CEILING_REAR]
source_property: image.orientation
- id: image_window_main_scalingmode
type: enum
values: [Fill, OneToOne, FillScreen, Stretch]
source_property: image.window.main.scalingmode
- id: optics_shutter_position
type: enum
values: [Open, Closed]
source_property: optics.shutter.position
- id: optics_shutter_target
type: enum
values: [Open, Closed]
source_property: optics.shutter.target
- id: network_device_lan_state
type: enum
values: [CONNECTED, DISCONNECTED]
source_property: network.device.lan.state
- id: environment_alarmstate
type: enum
values: [Fatal, Error, Alert, Warning, Ok]
source_property: environment.alarmstate
- id: firmware_status
type: enum
values: [Unknown, OK, Upgradable]
source_property: firmware.listcomponentversionstatus[].status
Variables
- name: image_brightness
property: image.brightness
type: float
range: [-1, 1]
step: 0.01
description: "Image brightness/offset. 0 is default, 1 is 100% offset."
- name: image_contrast
property: image.contrast
type: float
range: [0, 2]
step: 0.01
description: "Image contrast/gain. 1 is default."
- name: image_gamma
property: image.gamma
type: float
range: [1, 3]
step: 0.1
description: "Image gamma. Default is 2.2."
- name: image_saturation
property: image.saturation
type: float
range: [0, 2]
step: 0.01
description: "Image color saturation. 1 is default."
- name: image_sharpness
property: image.sharpness
type: integer
range: [-2, 8]
step: 1
description: "Image sharpness, normalized."
- name: illumination_sources_laser_power
property: illumination.sources.laser.power
type: float
range: [illumination.sources.laser.minpower, illumination.sources.laser.maxpower]
description: "Laser target power in percent. Min and max are dynamic and may change with lens type and lens position."
- name: illumination_sources_laser_minpower
property: illumination.sources.laser.minpower
type: float
read_only: true
description: "Minimum laser power in percent (dynamic)."
- name: illumination_sources_laser_maxpower
property: illumination.sources.laser.maxpower
type: float
read_only: true
description: "Maximum laser power in percent (dynamic)."
- name: image_window_main_source
property: image.window.main.source
type: string
description: "Active source name. See image.source.list for available values."
- name: image_window_main_position
property: image.window.main.position
type: object
fields: { x: int, y: int }
description: "Window position."
- name: image_window_main_size
property: image.window.main.size
type: object
fields: { width: int, height: int }
description: "Window size."
- name: optics_zoom_position
property: optics.zoom.position
type: integer
description: "Current zoom position."
- name: optics_focus_position
property: optics.focus.position
type: integer
description: "Current focus position."
- name: optics_lensshift_horizontal_position
property: optics.lensshift.horizontal.position
type: integer
description: "Current horizontal lens-shift position."
- name: optics_lensshift_vertical_position
property: optics.lensshift.vertical.position
type: integer
description: "Current vertical lens-shift position."
- name: dmx_mode
property: dmx.mode
type: string
description: "Current DMX mode."
- name: dmx_startchannel
property: dmx.startchannel
type: integer
range: [1, 512]
description: "DMX start channel."
- name: dmx_shutdown
property: dmx.shutdown
type: boolean
description: "DMX shutdown enabled or not."
- name: system_standby_enable
property: system.standby.enable
type: boolean
description: "Enable/disable use of the standby state. Check availability first."
- name: system_eco_enable
property: system.eco.enable
type: boolean
description: "Enable/disable use of the ECO state. Check availability first."
- name: image_processing_warp_enable
property: image.processing.warp.enable
type: boolean
description: "Enable/disable all warp functions."
- name: image_processing_warp_file_enable
property: image.processing.warp.file.enable
type: boolean
description: "Enable/disable file-based warp."
- name: image_processing_warp_file_selected
property: image.processing.warp.file.selected
type: string
description: "Currently selected warp file (e.g. 'warp.xml')."
- name: image_processing_blend_file_enable
property: image.processing.blend.file.enable
type: boolean
description: "Enable/disable file-based blend."
- name: image_processing_blend_file_selected
property: image.processing.blend.file.selected
type: array
items: string
description: "Currently selected blend files."
- name: image_processing_blacklevel_file_enable
property: image.processing.blacklevel.file.enable
type: boolean
description: "Enable/disable black level correction."
- name: image_processing_blacklevel_file_selected
property: image.processing.blacklevel.file.selected
type: string
description: "Currently selected black-level file (e.g. 'blacklevel.png')."
- name: network_device_lan_ip4config
property: network.device.lan.ip4config
type: object
fields: { Address: string, Mask: string, Gateway: string, NameServers: string }
description: "Current IPv4 configuration."
- name: image_connector_detectedsignal
property: image.connector.{name}.detectedsignal
type: object
description: |
Detected signal information for a connector. Includes active, name, vertical/horizontal
total/resolution/sync widths, front/back porch, frequencies, 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.
Events
- id: property_changed
description: "Server-pushed notification when a subscribed property value changes. Client must implement the property.changed method."
example: |
{ "jsonrpc": "2.0", "method": "property.changed", "params": { "property": [ { "system.state": "ready" } ] } }
- id: signal_callback
description: "Server-pushed notification when a subscribed signal is emitted. Client must implement the signal.callback method."
example: |
{ "jsonrpc": "2.0", "method": "signal.callback", "params": { "signal": [ { "introspect.objectchanged": { "object": "motors.motor1", "newobject": true } } ] } }
- id: modelupdated
description: "Introspect signal triggered when the object structure changes (objects added or removed). Subscribe via signal.subscribe."
signal: modelupdated
Macros
# Source describes the following explicit multi-step sequences.
- id: enable_file_warp
label: Enable File-Based Warp (Upload → Select → Enable)
steps:
- action: upload_warp_file
- action: property_set
args: { property: "image.processing.warp.file.selected", value: "{filename}" }
- action: property_set
args: { property: "image.processing.warp.file.enable", value: true }
notes: "Warp must be globally enabled separately via image.processing.warp.enable."
- id: enable_file_blend
label: Enable File-Based Blend (Upload → Select → Enable)
steps:
- action: upload_blend_mask
- action: property_set
args: { property: "image.processing.blend.file.selected", value: "{filename}" }
- action: property_set
args: { property: "image.processing.blend.file.enable", value: true }
- id: enable_blacklevel_mask
label: Enable Black-Level Mask (Upload → Select → Enable)
steps:
- action: upload_blacklevel_mask
- action: property_set
args: { property: "image.processing.blacklevel.file.selected", value: "{filename}" }
- action: property_set
args: { property: "image.processing.blacklevel.file.enable", value: true }
- id: subscribe_connector_signal
label: Subscribe to Source-Connector Signal Changes
steps:
- action: image_source_list
- action: property_set
notes: "For each source name, lower-case and strip non-word characters to get the source object name."
- action: image_source_listconnectors
notes: "Call image.source.<objectname>.listconnectors for each source."
- action: property_subscribe
args: { property: "image.connector.<objectname>.detectedsignal" }
notes: "For each discovered connector, subscribe to its detectedsignal property."
Safety
confirmation_required_for: []
interlocks: []
# UNRESOLVED: source contains no explicit safety warnings, interlocks, or power-on sequencing
# requirements. It only advises verifying the system.state is 'standby' or 'ready' before
# poweron, and 'on' before poweroff, plus waking from ECO via WOL / remote / keypad / :POWR1\r.
# These are operational best-practices, not safety interlocks.
Notes
JSON-RPC parameter order does not matter — parameters are passed by name. Subscribing to a property does not return the current value; use property.get for that. Notifications are only sent on actual change. Some API parts are dynamic and depend on installed peripherals (e.g. motorized zoom lenses, DMX extended mode); the best way to discover the exact API of a given unit is to introspect. The pulse serial wake string is :POWR1\r. Same JSON-RPC commands are available on all three transports (TCP/serial/HTTP file endpoints).
Provenance
source_domains:
- audiogeneral.com
- docs
source_urls:
- "https://www.audiogeneral.com/barco/UDX%20Series/JSON_ReferenceGuide.pdf"
retrieved_at: 2026-05-14T20:24:52.276Z
last_checked_at: 2026-06-03T06:19:10.111Z
Verification Summary
verdict: verified
checked_at: 2026-06-03T06:19:10.111Z
matched_actions: 40
action_count: 40
confidence: medium
summary: "Complete match: 40/40 actions present in source; transport values consistent with documented API specification (3 unresolved item(s) noted in Known Gaps.)"
Known Gaps
- "firmware version compatibility not stated in source; the source notes that some API parts are dynamic and depend on installed peripherals."
- "source contains no explicit safety warnings, interlocks, or power-on sequencing"
- "firmware version compatibility not stated in source; voltage/current/power specs not stated; fault behavior / error recovery sequences not stated; DMX channel payload semantics and the full set of available channels in extended mode not enumerated in source."
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0