Summary
The Barco Loki Cinemascope is a laser projector controlled via the Barco Pulse API, which uses the JSON-RPC 2.0 protocol over either TCP/IP (port 9090) or RS-232 serial. This spec covers the full JSON-RPC command set including power control, source selection, image adjustments, illumination control, environment monitoring, and warp/blend file management. An ECO-mode wake-up command using a legacy ASCII serial string (:POWR1\r) is also documented.
Transport
protocols:
- tcp
- serial
addressing:
port: 9090
serial:
baud_rate: 19200
data_bits: 8
parity: none
stop_bits: 1
flow_control: none
auth:
type: optional # source states authentication is only required for access levels above "normal end user"; normal end user access can skip authentication
Traits
- powerable # inferred from power on/off command examples
- routable # inferred from source selection commands (image.window.main.source)
- queryable # inferred from property.get / property.subscribe query command examples
- levelable # inferred from illumination power, brightness, contrast, saturation control
Actions
- id: power_on
label: Power On
kind: action
description: Power on the projector. No effect if already on or in state transition.
params: []
wire:
jsonrpc: "2.0"
method: system.poweron
- id: power_off
label: Power Off
kind: action
description: Power off the projector. No effect if already off or in state transition.
params: []
wire:
jsonrpc: "2.0"
method: system.poweroff
- id: eco_wake_serial
label: Wake from ECO Mode (Serial)
kind: action
description: >
Wake a projector in ECO mode via RS-232. Send the ASCII string `:POWR1\r`
on the serial port. Alternative wake methods include Wake-on-LAN, remote
control power button, and keypad power button.
params: []
wire:
raw_ascii: ":POWR1\r"
- id: set_source
label: Select Input Source
kind: action
description: Set the active source for the main window.
params:
- name: source
type: string
description: >
Source name string as returned by image.source.list. Examples:
"DVI 1", "DVI 2", "DisplayPort 1", "DisplayPort 2", "Dual DVI",
"Dual DisplayPort", "Dual Head DVI", "Dual Head DisplayPort",
"HDBaseT", "HDMI", "SDI". Available sources vary by projector model.
wire:
jsonrpc: "2.0"
method: property.set
params:
property: image.window.main.source
value: "{source}"
- id: list_sources
label: List Available Input Sources
kind: action
description: Returns an array of all available source name strings.
params: []
wire:
jsonrpc: "2.0"
method: image.source.list
- id: list_connectors
label: List Physical Connectors
kind: action
description: Returns an array of all physical connector names.
params: []
wire:
jsonrpc: "2.0"
method: image.connector.list
- id: list_source_connectors
label: List Connectors Used by a Source
kind: action
description: >
Returns an array of connector information (name + grid position) for the
connectors that make up a given source. The source object name is derived
from the friendly source name by removing all non-word characters and
lowercasing (e.g. "DisplayPort 1" -> "displayport1").
params:
- name: source_object
type: string
description: >
Source object name in dot notation, e.g. "displayport1". The method
name is constructed as image.source.{source_object}.listconnectors.
wire:
jsonrpc: "2.0"
method: "image.source.{source_object}.listconnectors"
- id: blink_led
label: Blink LED
kind: action
description: >
Drive a status LED. Documented in the source as the canonical method
invocation example for the Pulse API. Returns an integer status.
params:
- name: led
type: string
description: LED identifier (e.g. "systemstatus").
- name: color
type: string
description: LED color (e.g. "red").
- name: period
type: integer
description: Blink period.
wire:
jsonrpc: "2.0"
method: ledctrl.blink
params:
led: "{led}"
color: "{color}"
period: "{period}"
- id: authenticate
label: Authenticate (Elevated Access)
kind: action
description: >
Authenticate with a passcode to gain elevated access level. Not required
for normal end-user control operations.
params:
- name: code
type: integer
description: Numeric passcode for elevated access level.
wire:
jsonrpc: "2.0"
method: authenticate
params:
code: "{code}"
- id: set_property
label: Set Property
kind: action
description: Generic property setter for any writable Pulse API property.
params:
- name: property
type: string
description: Full dot-notation property name (e.g. "image.brightness").
- name: value
type: any
description: Value to set. Type depends on the property.
wire:
jsonrpc: "2.0"
method: property.set
params:
property: "{property}"
value: "{value}"
- id: get_property
label: Get Property
kind: action
description: Generic property getter for any readable Pulse API property. Accepts a single property name or an array of property names.
params:
- name: property
type: string or array of string
description: Full dot-notation property name (e.g. "system.state"), or an array of names to read multiple values in one request.
wire:
jsonrpc: "2.0"
method: property.get
params:
property: "{property}"
- id: subscribe_property
label: Subscribe to Property Changes
kind: action
description: Subscribe to change notifications for one or more properties.
params:
- name: property
type: string or array of string
description: Property name or array of property names.
wire:
jsonrpc: "2.0"
method: property.subscribe
params:
property: "{property}"
- id: unsubscribe_property
label: Unsubscribe from Property Changes
kind: action
params:
- name: property
type: string or array of string
description: Property name or array of property names.
wire:
jsonrpc: "2.0"
method: property.unsubscribe
params:
property: "{property}"
- id: subscribe_signal
label: Subscribe to Signal
kind: action
description: Subscribe to one or more signals (e.g. "modelupdated").
params:
- name: signal
type: string or array of string
description: Signal name or array of signal names.
wire:
jsonrpc: "2.0"
method: signal.subscribe
params:
signal: "{signal}"
- id: unsubscribe_signal
label: Unsubscribe from Signal
kind: action
params:
- name: signal
type: string or array of string
description: Signal name or array of signal names.
wire:
jsonrpc: "2.0"
method: signal.unsubscribe
params:
signal: "{signal}"
- id: introspect
label: Introspect API Object
kind: action
description: Read metadata about available methods, properties, and signals.
params:
- name: object
type: string
description: Object name to introspect (dot notation). Empty string introspects everything.
- name: recursive
type: boolean
description: If true, recursively introspect sub-objects. If false, list only immediate children.
wire:
jsonrpc: "2.0"
method: introspect
params:
object: "{object}"
recursive: "{recursive}"
- id: set_brightness
label: Set Image Brightness
kind: action
params:
- name: value
type: float
description: "Normalized brightness offset. Range: -1.0 to 1.0. 0 is default. Step 0.01."
wire:
jsonrpc: "2.0"
method: property.set
params:
property: image.brightness
value: "{value}"
- id: set_laser_power
label: Set Laser Power
kind: action
params:
- name: value
type: float
description: >
Target laser power level as a percentage. Minimum and maximum values
are dynamic and depend on projector configuration and lens type.
wire:
jsonrpc: "2.0"
method: property.set
params:
property: illumination.sources.laser.power
value: "{value}"
- id: enable_warp
label: Enable Warp Processing
kind: action
params:
- name: enable
type: boolean
description: true to enable warp, false to disable.
wire:
jsonrpc: "2.0"
method: property.set
params:
property: image.processing.warp.enable
value: "{enable}"
- id: select_warp_file
label: Select Warp Grid File
kind: action
params:
- name: filename
type: string
description: Filename of the previously uploaded warp grid XML file (e.g. "warp.xml").
wire:
jsonrpc: "2.0"
method: property.set
params:
property: image.processing.warp.file.selected
value: "{filename}"
- id: enable_warp_file
label: Enable Warp Grid File
kind: action
params:
- name: enable
type: boolean
description: true to activate the selected warp grid file.
wire:
jsonrpc: "2.0"
method: property.set
params:
property: image.processing.warp.file.enable
value: "{enable}"
- id: select_blend_file
label: Select Blend Mask File
kind: action
params:
- name: filename
type: string
description: Filename of the previously uploaded blend mask image (e.g. "mask.png").
wire:
jsonrpc: "2.0"
method: property.set
params:
property: image.processing.blend.file.selected
value: "{filename}"
- id: enable_blend_file
label: Enable Blend Mask File
kind: action
params:
- name: enable
type: boolean
description: true to activate the selected blend mask file.
wire:
jsonrpc: "2.0"
method: property.set
params:
property: image.processing.blend.file.enable
value: "{enable}"
- id: select_blacklevel_file
label: Select Black Level Mask File
kind: action
params:
- name: filename
type: string
description: Filename of the previously uploaded black level mask image.
wire:
jsonrpc: "2.0"
method: property.set
params:
property: image.processing.blacklevel.file.selected
value: "{filename}"
- id: enable_blacklevel_file
label: Enable Black Level Mask File
kind: action
params:
- name: enable
type: boolean
wire:
jsonrpc: "2.0"
method: property.set
params:
property: image.processing.blacklevel.file.enable
value: "{enable}"
- id: get_environment_temperatures
label: Get All Temperature Sensor Readings
kind: action
description: Returns a dictionary of all temperature sensor names and their current values in degrees Celsius.
params: []
wire:
jsonrpc: "2.0"
method: environment.getcontrolblocks
params:
type: Sensor
valuetype: Temperature
- id: get_environment_fan_speeds
label: Get All Fan Speed Readings
kind: action
description: Returns a dictionary of all fan sensor names and their current RPM values.
params: []
wire:
jsonrpc: "2.0"
method: environment.getcontrolblocks
params:
type: Sensor
valuetype: Speed
- id: get_environment_data
label: Get Environment Sensor Data
kind: action
description: >
Generic environment sensor query. Sensor types: Sensor, Filter, Controller,
Actuator, Alarm, GenericBlock. Value types: 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, Simulation,
State, Pump, Resistance, Constant, Manual, Range, Any.
params:
- name: type
type: string
description: Sensor block type (see description).
- name: valuetype
type: string
description: Value type to filter by (see description).
wire:
jsonrpc: "2.0"
method: environment.getcontrolblocks
params:
type: "{type}"
valuetype: "{valuetype}"
Feedbacks
- id: system_state
label: Projector System State
type: enum
values:
- boot # projector is booting up
- eco # projector is in ECO/power save mode
- standby # projector is in standby mode
- ready # projector is in ready mode
- conditioning # projector is warming up
- on # projector is on
- deconditioning # projector is cooling down
wire:
jsonrpc: "2.0"
method: property.get
params:
property: system.state
notification_method: property.changed
notification_property: system.state
- id: illumination_state
label: Illumination State
type: enum
values:
- "On"
- "Off"
wire:
jsonrpc: "2.0"
method: property.get
params:
property: illumination.state
notification_method: property.changed
notification_property: illumination.state
- id: active_source
label: Active Input Source
type: string
description: Name of the currently active source on the main window.
wire:
jsonrpc: "2.0"
method: property.get
params:
property: image.window.main.source
notification_method: property.changed
notification_property: image.window.main.source
- id: laser_power
label: Laser Power Level
type: float
description: Current laser power target as a percentage.
wire:
jsonrpc: "2.0"
method: property.get
params:
property: illumination.sources.laser.power
notification_method: property.changed
notification_property: illumination.sources.laser.power
- id: laser_max_power
label: Laser Maximum Power
type: float
description: Maximum allowed laser power as a percentage (dynamic, read-only).
wire:
jsonrpc: "2.0"
method: property.get
params:
property: illumination.sources.laser.maxpower
- id: laser_min_power
label: Laser Minimum Power
type: float
description: Minimum allowed laser power as a percentage (dynamic, read-only).
wire:
jsonrpc: "2.0"
method: property.get
params:
property: illumination.sources.laser.minpower
- id: laser_is_power_limited
label: Laser Power Limited
type: boolean
wire:
jsonrpc: "2.0"
method: property.get
params:
property: illumination.sources.laser.ispowerlimited
- id: laser_power_limit_reason
label: Laser Power Limit Reason
type: string
wire:
jsonrpc: "2.0"
method: property.get
params:
property: illumination.sources.laser.powerlimitreason
- id: image_brightness
label: Image Brightness
type: float
description: "Normalized brightness offset. Range: -1.0 to 1.0. 0 is default."
wire:
jsonrpc: "2.0"
method: property.get
params:
property: image.brightness
notification_method: property.changed
notification_property: image.brightness
- id: environment_alarm_state
label: Environment Alarm State
type: enum
values:
- Fatal
- Error
- Alert
- Warning
- Ok
wire:
jsonrpc: "2.0"
method: property.get
params:
property: environment.alarmstate
- id: firmware_version
label: Firmware Version
type: string
wire:
jsonrpc: "2.0"
method: property.get
params:
property: firmware.firmwareversion
- id: clo_availability
label: Constant Light Output Availability
type: enum
values:
- Available
- SensorUnavailable
- PendingWarmup
- Unavailable
- Unknown
wire:
jsonrpc: "2.0"
method: property.get
params:
property: illumination.clo.availability
- id: clo_state
label: Constant Light Output State
type: enum
values:
- Ok
- TooDim
- TooBright
wire:
jsonrpc: "2.0"
method: property.get
params:
property: illumination.clo.state
- id: dmx_connection_active
label: DMX/ArtNet Connection Active
type: boolean
description: True if a DMX or ArtNet packet was received in the last 10 seconds.
wire:
jsonrpc: "2.0"
method: property.get
params:
property: dmx.monitor.connectionstate.active
Variables
- id: illumination_clo_enable
label: Constant Light Output Enable
type: boolean
wire_property: illumination.clo.enable
access: RW
- id: illumination_clo_setpoint
label: Constant Light Output Setpoint
type: float
description: Target luminosity of the light source.
wire_property: illumination.clo.setpoint
access: RW
- id: illumination_clo_scale
label: Constant Light Output Scale
type: float
description: Percentage to scale the CLO setpoint by.
wire_property: illumination.clo.scale
access: RW
- id: dmx_artnet_enable
label: ArtNet Enable
type: boolean
wire_property: dmx.artnet
access: RW
- id: dmx_mode
label: DMX Mode
type: string
wire_property: dmx.mode
access: RW
- id: dmx_start_channel
label: DMX Start Channel
type: integer
description: "DMX start channel [1..512]."
wire_property: dmx.startchannel
access: RW
- id: dmx_shutdown_enable
label: DMX Shutdown Enable
type: boolean
wire_property: dmx.shutdown
access: RW
- id: dmx_shutdown_timeout
label: DMX Shutdown Timeout (minutes)
type: integer
wire_property: dmx.shutdowntimeout
access: RW
- id: image_color_p7_white_temperature
label: White Point Temperature
type: integer
description: "Desired white point temperature in Kelvin. Range: 3200-13000, step 100."
wire_property: image.color.p7.custom.whitetemperature
access: RW
- id: image_color_p7_white_mode
label: White Point Mode
type: enum
values:
- Coordinates
- Temperature
wire_property: image.color.p7.custom.whitemode
access: RW
- id: image_contrast
label: Image Contrast
type: float
description: "Image contrast/gain. Normalized, 1 is default. Range: 0-2, step 0.01."
wire_property: image.contrast
access: RW
- id: image_saturation
label: Image Saturation
type: float
description: "Image color saturation. Normalized, 1 is default. Range: 0-2, step 0.01."
wire_property: image.saturation
access: RW
- id: image_gamma
label: Image Gamma
type: float
description: "Image gamma. Default is 2.2. Range: 1-3, step 0.1."
wire_property: image.gamma
access: RW
- id: image_intensity
label: Image Intensity
type: float
description: "Image intensity. Range: 0-1, step 0.1, precision 0.01."
wire_property: image.intensity
access: RW
- id: image_sharpness
label: Image Sharpness
type: integer
description: "Image sharpness. Normalized. Range: -2 to 8, step 1."
wire_property: image.sharpness
access: RW
Events
- id: property_changed
label: Property Changed
description: >
Unsolicited notification sent by the server when a subscribed property changes
value. The client must implement a property.changed handler to receive these.
wire:
jsonrpc: "2.0"
method: property.changed
params:
property:
- objectname.propertyname: <new_value>
- id: signal_callback
label: Signal Callback
description: >
Unsolicited notification sent when a subscribed signal fires. The client must
implement a signal.callback handler.
wire:
jsonrpc: "2.0"
method: signal.callback
params:
signal:
- objectname.signalname:
arg1: <value>
- id: model_updated
label: Model Updated (Object Added/Removed)
description: >
Signal fired when API objects are dynamically added or removed (e.g. when
a lens with motorized zoom is mounted). Subscribe via signal.subscribe with
signal name "modelupdated".
wire:
jsonrpc: "2.0"
method: signal.callback
params:
signal:
- introspect.objectchanged:
object: <object_name>
isnew: <bool>
Macros
- id: upload_and_activate_warp_grid
label: Upload and Activate Warp Grid File
description: >
Three-step sequence to apply a warp grid file. The HTTP upload step
requires direct HTTP access (not available via serial).
steps:
- step: 1
label: Upload warp grid via HTTP POST
notes: >
curl -X POST -F file=@warp.xml http://<projector_ip>/api/image/processing/warp/file/transfer
(HTTP file upload - not a JSON-RPC call)
- step: 2
label: Select the uploaded file
action: select_warp_file
params:
filename: warp.xml
- step: 3
label: Enable warp grid file
action: enable_warp_file
params:
enable: true
- id: upload_and_activate_blend_mask
label: Upload and Activate Blend Mask
steps:
- step: 1
label: Upload blend mask via HTTP POST
notes: >
curl -X POST -F file=@mask.png http://<projector_ip>/api/image/processing/blend/file/transfer
Blend mask for 4K Cinemascope must be 1280 x 540 px grayscale (PNG/JPEG/TIFF, up to 16-bit).
- step: 2
label: Select the uploaded file
action: select_blend_file
params:
filename: mask.png
- step: 3
label: Enable blend mask file
action: enable_blend_file
params:
enable: true
- id: upload_and_activate_blacklevel_mask
label: Upload and Activate Black Level Mask
steps:
- step: 1
label: Upload black level mask via HTTP POST
notes: >
curl -X POST -F file=@blacklevel.png http://<projector_ip>/api/image/processing/blacklevel/file/transfer
Black level mask for 4K Cinemascope must be 1280 x 540 px grayscale.
- step: 2
label: Select the uploaded file
action: select_blacklevel_file
params:
filename: blacklevel.png
- step: 3
label: Enable black level mask file
action: enable_blacklevel_file
params:
enable: true
Safety
confirmation_required_for: []
interlocks:
- id: power_on_state_check
description: >
Source recommends verifying that system.state is "standby" or "ready"
before issuing system.poweron. Issuing power on while the projector is
already on or in a state transition has no effect.
- id: power_off_state_check
description: >
Source recommends verifying that system.state is "on" before issuing
system.poweroff. Issuing power off while already off or in transition
has no effect.
- id: property_set_wait
description: >
It is best practice to wait for confirmation of a property.set response
before setting the same property again. Continuously setting without
waiting may flood the server and reduce performance.
Notes
The Barco Loki Cinemascope uses the Barco Pulse API, a JSON-RPC 2.0 protocol. All commands (power, source, image, illumination) use the same wire format regardless of whether the connection is TCP/IP or RS-232 serial — the only exception is the ECO-mode wake command, which is a raw ASCII string (:POWR1\r) sent over the serial port rather than a JSON-RPC call.
Transport notes:
- TCP/IP connection: port 9090.
- Serial: 9-pin cable, pin 2 to pin 2, pin 3 to pin 3, pin 5 to pin 5 (standard null-modem wiring).
- Authentication is optional for normal end-user access; only elevated access (service/engineering level) requires the
authenticatemethod with a passcode.
API dynamism: The Pulse API is partially dynamic — available objects and properties depend on the installed peripherals (lenses, input cards, etc.). The source documentation explicitly notes that properties shown may not be available on a specific projector configuration. The recommended way to discover the exact API of a given unit is to use the introspect method.
File upload: Warp grid files (XML), blend masks, and black level masks must be uploaded via HTTP POST to the projector's REST file endpoint (http://<ip>/api/<path>/file/transfer). This HTTP transfer is separate from the JSON-RPC channel and requires network connectivity; it is not available over serial.
Blend/black level mask resolution for 4K Cinemascope: 1280 x 540 pixels. Supported image formats: PNG (up to 16-bit), JPEG, TIFF. Color images are accepted but only the blue channel is used; grayscale is recommended.
Notifications: The server only pushes notifications for properties and signals that the client has explicitly subscribed to. Subscribing does not return the current value; use property.get to obtain the initial value before relying on change notifications.
ECO mode: Wake-on-LAN (WoL) targeting the projector's MAC address is an alternative to the serial wake command for networked projectors in ECO mode.
Upgrade done. Added:
list_source_connectorsaction (image.source.{name}.listconnectors)blink_ledaction (ledctrl.blink)- 5 Variables: contrast, saturation, gamma, intensity, sharpness (resolved prior UNRESOLVED)
get_propertyparam widened to accept array (source documents multi-property read)
Preserved all existing IDs/shapes.
Provenance
source_domains:
- audiogeneral.com
source_urls:
- "https://www.audiogeneral.com/barco/UDX%20Series/JSON_ReferenceGuide.pdf"
retrieved_at: 2026-05-19T04:26:24.054Z
last_checked_at: 2026-10-01T08:02:39.371Z
Verification Summary
verdict: verified
checked_at: 2026-10-01T08:02:39.371Z
matched_actions: 28
action_count: 28
confidence: medium
summary: "All 28 spec actions map to JSON-RPC methods or the ECO ASCII command documented verbatim in the source; transport values (port 9090, 19200 8N1) appear verbatim. (4 unresolved item(s) noted in Known Gaps.)"
Known Gaps
- "exact Loki Cinemascope model variant confirmed only by blend/black-level mask resolution table entry \"4K Cinemascope: 1280 x 540\"; the full property list in source covers multiple Barco Pulse projectors (UDX series, etc.) and not all properties are confirmed present on the Loki Cinemascope specifically"
- "lens motor control properties (zoom, focus, shift) referenced as conditional on lens type but property names not documented in source excerpt"
- "DMX channel function values for channels 03-14 depend on DMX mode setting; full enumeration not stated"
- "authentication passcode format and default values not stated in source"
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0