Summary
Barco SLM R12plus projector using the Pulse API platform. Control interface is JSON-RPC 2.0 over TCP port 9090 and an equivalent RS-232 serial connection, plus HTTP file endpoints under /api/... for uploading warp grids, blend masks, and black-level masks. The same JSON-RPC command set is exposed over both transports.
Transport
protocols:
- tcp
- serial
- http # used only for file transfer endpoints (warp, blend, blacklevel)
addressing:
port: 9090
base_url: "http://<projector-address>/api" # file endpoint base; projector IP/hostname substituted by client
serial:
baud_rate: 19200
data_bits: 8
parity: none
stop_bits: 1
flow_control: none
auth:
type: passcode # source describes optional auth: end-user access allowed without code; elevated access via authenticate method with numeric code
notes: "Optional. End-user access permitted without authentication. To access higher levels, send an `authenticate` JSON-RPC method with `params: { id: <int>, code: <secret pass code> }` and await `result: true`. Pass code value is not documented in the source."
Traits
- powerable # inferred from system.poweron / system.poweroff methods
- routable # inferred from image.window.main.source selection
- queryable # inferred from property.get / property.subscribe API
- levelable # inferred from illumination.sources.laser.power and image.brightness/contrast/gamma/saturation/sharpness
Actions
# Authentication (optional, for elevated access level)
- id: authenticate
label: Authenticate (elevated access)
kind: action
command: |
{ "jsonrpc": "2.0", "method": "authenticate", "params": { "id": 1, "code": <pass_code> } }
params:
- name: code
type: integer
description: Secret pass code; not documented in source - must be supplied by integrator
notes: "Optional. Skip for normal end-user access."
# Power
- id: power_on
label: Power On
kind: action
command: |
{ "jsonrpc": "2.0", "method": "system.poweron" }
params: []
notes: "Verify system.state is 'standby' or 'ready' before issuing. No-op if already on or transitioning."
- id: power_off
label: Power Off
kind: action
command: |
{ "jsonrpc": "2.0", "method": "system.poweroff" }
params: []
notes: "Verify system.state is 'on' before issuing. No-op if already off or transitioning."
- id: power_state_get
label: Get Power State
kind: query
command: |
{ "jsonrpc": "2.0", "method": "property.get", "params": { "id": 1, "property": "system.state" } }
params: []
- id: power_state_subscribe
label: Subscribe to Power State Changes
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.subscribe", "params": { "id": 2, "property": "system.state" } }
params: []
# Source selection
- id: list_sources
label: List Available Sources
kind: query
command: |
{ "jsonrpc": "2.0", "method": "image.source.list", "id": 1 }
params: []
notes: "Returned list varies by projector model."
- id: list_connectors
label: List Available Connectors
kind: query
command: |
{ "jsonrpc": "2.0", "method": "image.connector.list", "id": 3 }
params: []
- id: get_active_source
label: Get Active Source
kind: query
command: |
{ "jsonrpc": "2.0", "method": "property.get", "params": { "id": 0, "property": "image.window.main.source" } }
params: []
- id: set_active_source
label: Set Active Source
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.set", "params": { "property": "image.window.main.source", "value": "<source_name>" } }
params:
- name: source_name
type: string
description: One of the names returned by image.source.list (e.g. "DisplayPort 1", "HDMI", "DVI 1", "SDI", "HDBaseT", ...).
notes: "Best practice: wait for confirmation of the previous property.set before issuing the same property.set again."
- id: subscribe_active_source
label: Subscribe to Active Source Changes
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.subscribe", "params": { "id": 6, "property": "image.window.main.source" } }
params: []
# Generic property get/set/subscribe/unsubscribe
- id: property_get
label: Get Property Value
kind: query
command: |
{ "jsonrpc": "2.0", "method": "property.get", "params": { "id": <n>, "property": "<objectname.propertyname>" } }
params:
- name: id
type: integer
description: Request identifier (any client-chosen string or number)
- name: property
type: string
description: Dot-notation property path (e.g. "image.brightness")
- id: property_set
label: Set Property Value
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.set", "params": { "id": <n>, "property": "<objectname.propertyname>", "value": <value> } }
params:
- name: property
type: string
description: Dot-notation property path
- name: value
type: string
description: Value matching the property's type/constraints (see Variables section)
notes: "Wait for confirmation before re-issuing the same property.set to avoid flooding the server."
- id: property_get_multi
label: Get Multiple Property Values
kind: query
command: |
{ "jsonrpc": "2.0", "method": "property.get", "params": { "id": <n>, "property": ["<prop1>", "<prop2>"] } }
params:
- name: property
type: array
description: List of dot-notation property paths
- id: property_subscribe
label: Subscribe to Property Change
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.subscribe", "params": { "id": <n>, "property": "<objectname.propertyname>" } }
params:
- name: property
type: string
description: Dot-notation property path
- id: property_subscribe_multi
label: Subscribe to Multiple Property Changes
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.subscribe", "params": { "id": <n>, "property": ["<prop1>", "<prop2>"] } }
params:
- name: property
type: array
description: List of dot-notation property paths
- id: property_unsubscribe
label: Unsubscribe from Property Change
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.unsubscribe", "params": { "id": <n>, "property": "<objectname.propertyname>" } }
params:
- name: property
type: string
description: Dot-notation property path
- id: property_unsubscribe_multi
label: Unsubscribe from Multiple Property Changes
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.unsubscribe", "params": { "id": <n>, "property": ["<prop1>", "<prop2>"] } }
params:
- name: property
type: array
description: List of dot-notation property paths
# Signal subscription
- id: signal_subscribe
label: Subscribe to Signal
kind: action
command: |
{ "jsonrpc": "2.0", "method": "signal.subscribe", "params": { "id": <n>, "signal": "<signalname>" } }
params:
- name: signal
type: string
description: Signal name (e.g. "modelupdated")
- id: signal_subscribe_multi
label: Subscribe to Multiple Signals
kind: action
command: |
{ "jsonrpc": "2.0", "method": "signal.subscribe", "params": { "id": <n>, "signal": ["<signal1>", "<signal2>"] } }
params:
- name: signal
type: array
description: List of signal names
- id: signal_unsubscribe
label: Unsubscribe from Signal
kind: action
command: |
{ "jsonrpc": "2.0", "method": "signal.unsubscribe", "params": { "id": <n>, "signal": "<signalname>" } }
params:
- name: signal
type: string
description: Signal name
- id: signal_unsubscribe_multi
label: Unsubscribe from Multiple Signals
kind: action
command: |
{ "jsonrpc": "2.0", "method": "signal.unsubscribe", "params": { "id": <n>, "signal": ["<signal1>", "<signal2>"] } }
params:
- name: signal
type: array
description: List of signal names
# Introspection
- id: introspect
label: Introspect Object Metadata
kind: query
command: |
{ "jsonrpc": "2.0", "method": "introspect", "params": { "object": "<objectname>", "recursive": true }, "id": <n> }
params:
- name: object
type: string
description: Dot-notation object name; empty/omitted introspects everything
- name: recursive
type: boolean
description: When false, only top-level object names are listed (one level deep)
# LED control
- id: led_blink
label: Blink System Status LED
kind: action
command: |
{ "jsonrpc": "2.0", "method": "ledctrl.blink", "params": { "id": 3, "led": "systemstatus", "color": "red", "period": 42 } }
params:
- name: led
type: string
description: LED identifier (e.g. "systemstatus")
- name: color
type: string
description: LED color
- name: period
type: integer
description: Blink period (units not stated in source)
# Illumination
- id: illumination_state_get
label: Get Illumination State
kind: query
command: |
{ "jsonrpc": "2.0", "method": "property.get", "params": { "id": 0, "property": "illumination.state" } }
params: []
- id: illumination_state_subscribe
label: Subscribe to Illumination State Changes
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.subscribe", "params": { "id": 1, "property": "illumination.state" } }
params: []
- id: laser_power_get
label: Get Laser Power (%)
kind: query
command: |
{ "jsonrpc": "2.0", "method": "property.get", "params": { "id": 3, "property": "illumination.sources.laser.power" } }
params: []
- id: laser_power_set
label: Set Laser Power (%)
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.set", "params": { "id": 5, "property": "illumination.sources.laser.power", "value": <percent> } }
params:
- name: percent
type: integer
description: Target power in percent; bounded by current minpower/maxpower
- id: laser_power_subscribe
label: Subscribe to Laser Power Changes
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.subscribe", "params": { "id": 4, "property": "illumination.sources.laser.power" } }
params: []
- id: laser_minpower_get
label: Get Laser Minimum Power (%)
kind: query
command: |
{ "jsonrpc": "2.0", "method": "property.get", "params": { "id": 6, "property": "illumination.sources.laser.minpower" } }
params: []
- id: laser_maxpower_get
label: Get Laser Maximum Power (%)
kind: query
command: |
{ "jsonrpc": "2.0", "method": "property.get", "params": { "id": 5, "property": "illumination.sources.laser.maxpower" } }
params: []
- id: clo_engage
label: Engage CLO at Current Light Level
kind: action
command: |
{ "jsonrpc": "2.0", "method": "illumination.clo.engage" }
params: []
- id: laser_get_serial
label: Get Laser Serial Number
kind: query
command: |
{ "jsonrpc": "2.0", "method": "illumination.laser.getserialnumber" }
params: []
# Image / picture settings
- id: brightness_get
label: Get Image Brightness
kind: query
command: |
{ "jsonrpc": "2.0", "method": "property.get", "params": { "id": 7, "property": "image.brightness" } }
params: []
- id: brightness_set
label: Set Image Brightness
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.set", "params": { "id": 9, "property": "image.brightness", "value": <float> } }
params:
- name: value
type: float
description: Range -1..1; 0 default, 1 = 100% offset; step 0.01
- id: brightness_subscribe
label: Subscribe to Brightness Changes
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.subscribe", "params": { "id": 8, "property": "image.brightness" } }
params: []
- id: contrast_set
label: Set Image Contrast
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.set", "params": { "property": "image.contrast", "value": <float> } }
params:
- name: value
type: float
description: Range 0..2; 1 default; step 0.01
- id: gamma_set
label: Set Image Gamma
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.set", "params": { "property": "image.gamma", "value": <float> } }
params:
- name: value
type: float
description: Range 1..3; default 2.2; step 0.1
- id: saturation_set
label: Set Image Saturation
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.set", "params": { "property": "image.saturation", "value": <float> } }
params:
- name: value
type: float
description: Range 0..2; 1 default; step 0.01
- id: sharpness_set
label: Set Image Sharpness
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.set", "params": { "property": "image.sharpness", "value": <int> } }
params:
- name: value
type: integer
description: Range -2..8; step 1
- id: orientation_set
label: Set Image Orientation
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.set", "params": { "property": "image.orientation", "value": "<orientation>" } }
params:
- name: value
type: string
description: One of "DESKTOP_FRONT", "DESKTOP_REAR", "CEILING_FRONT", "CEILING_REAR"
# Window geometry
- id: window_position_set
label: Set Window Position
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.set", "params": { "property": "image.window.main.position", "value": { "x": <int>, "y": <int> } } }
params:
- name: x
type: integer
- name: y
type: integer
- id: window_size_set
label: Set Window Size
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.set", "params": { "property": "image.window.main.size", "value": { "width": <int>, "height": <int> } } }
params:
- name: width
type: integer
- name: height
type: integer
- id: scaling_mode_set
label: Set Window Scaling Mode
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.set", "params": { "property": "image.window.main.scalingmode", "value": "<mode>" } }
params:
- name: value
type: string
description: One of "Fill", "OneToOne", "FillScreen", "Stretch"
# Warp
- id: warp_enable_set
label: Enable/Disable All Warp Functions
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.set", "params": { "id": 10, "property": "image.processing.warp.enable", "value": <bool> } }
params:
- name: value
type: boolean
- id: warp_file_upload
label: Upload Warp Grid File
kind: action
command: |
curl -X POST -F file=@<file> http://<projector-address>/api/image/processing/warp/file/transfer
params:
- name: file
type: string
description: Local path to the warp grid XML (MCM500/400-compatible format)
- name: projector-address
type: string
description: Projector IP or hostname
- id: warp_file_select
label: Select Active Warp File
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.set", "params": { "id": 11, "property": "image.processing.warp.file.selected", "value": "<filename>" } }
params:
- name: filename
type: string
- id: warp_file_enable_set
label: Enable/Disable File Warp
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.set", "params": { "id": 12, "property": "image.processing.warp.file.enable", "value": <bool> } }
params:
- name: value
type: boolean
# Blend
- id: blend_mask_upload
label: Upload Blend Mask
kind: action
command: |
curl -X POST -F file=@<file> http://<projector-address>/api/image/processing/blend/file/transfer
params:
- name: file
type: string
description: PNG/JPEG/TIFF, 8- or 16-bit grayscale; resolution must match blend layer
- name: projector-address
type: string
notes: |
Mask resolutions per projector native resolution:
WUXGA 1920x1200, WQXGA 1280x800, 4K 1280x800, 4K Cinemascope 1280x540.
Colour images accepted but only the blue channel is used.
- id: blend_file_select
label: Select Active Blend Files
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.set", "params": { "id": 13, "property": "image.processing.blend.file.selected", "value": ["<filename>"] } }
params:
- name: filename
type: array
description: Array of file name strings
- id: blend_file_enable_set
label: Enable/Disable File Blend
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.set", "params": { "id": 14, "property": "image.processing.blend.file.enable", "value": <bool> } }
params:
- name: value
type: boolean
# Black level
- id: blacklevel_mask_upload
label: Upload Black-Level Mask
kind: action
command: |
curl -X POST -F file=@<file> http://<projector-address>/api/image/processing/blacklevel/file/transfer
params:
- name: file
type: string
description: PNG/JPEG/TIFF, 8- or 16-bit grayscale; resolution must match black-level layer
- name: projector-address
type: string
notes: |
Mask resolutions per projector native resolution:
WUXGA 1920x1200, WQXGA 1280x800, 4K 1280x800, 4K Cinemascope 1280x540.
Colour images accepted but only the blue channel is used.
- id: blacklevel_file_select
label: Select Active Black-Level File
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.set", "params": { "id": 15, "property": "image.processing.blacklevel.file.selected", "value": "<filename>" } }
params:
- name: filename
type: string
- id: blacklevel_file_enable_set
label: Enable/Disable Black-Level Correction
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.set", "params": { "id": 16, "property": "image.processing.blacklevel.file.enable", "value": <bool> } }
params:
- name: value
type: boolean
# Network
- id: lan_ip4config_get
label: Get LAN IPv4 Configuration
kind: query
command: |
{ "jsonrpc": "2.0", "method": "property.get", "params": { "property": "network.device.lan.ip4config" } }
params: []
- id: lan_state_get
label: Get LAN Connection State
kind: query
command: |
{ "jsonrpc": "2.0", "method": "property.get", "params": { "property": "network.device.lan.state" } }
params: []
# Optics
- id: shutter_position_get
label: Get Shutter Position
kind: query
command: |
{ "jsonrpc": "2.0", "method": "property.get", "params": { "property": "optics.shutter.position" } }
params: []
- id: shutter_target_set
label: Set Shutter Target
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.set", "params": { "property": "optics.shutter.target", "value": "<Open|Closed>" } }
params:
- name: value
type: string
description: "Open" or "Closed"
- id: zoom_position_get
label: Get Zoom Position
kind: query
command: |
{ "jsonrpc": "2.0", "method": "property.get", "params": { "property": "optics.zoom.position" } }
params: []
notes: "Lens must support motorized zoom; otherwise property is absent (verify via introspection)."
- id: focus_position_get
label: Get Focus Position
kind: query
command: |
{ "jsonrpc": "2.0", "method": "property.get", "params": { "property": "optics.focus.position" } }
params: []
notes: "Lens must support motorized focus; otherwise property is absent."
- id: lensshift_h_get
label: Get Horizontal Lens Shift Position
kind: query
command: |
{ "jsonrpc": "2.0", "method": "property.get", "params": { "property": "optics.lensshift.horizontal.position" } }
params: []
- id: lensshift_v_get
label: Get Vertical Lens Shift Position
kind: query
command: |
{ "jsonrpc": "2.0", "method": "property.get", "params": { "property": "optics.lensshift.vertical.position" } }
params: []
# System state toggles
- id: standby_enable_set
label: Enable/Disable Standby State
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.set", "params": { "property": "system.standby.enable", "value": <bool> } }
params:
- name: value
type: boolean
notes: "Confirm property is present via introspection before setting."
- id: eco_enable_set
label: Enable/Disable ECO State
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.set", "params": { "property": "system.eco.enable", "value": <bool> } }
params:
- name: value
type: boolean
notes: "Confirm property is present via introspection before setting."
# ECO wake via serial
- id: eco_wake_serial
label: Wake From ECO Mode (RS-232)
kind: action
command: ":POWR1\r"
transport: serial
params: []
notes: "Send these exact ASCII characters on the serial port. Alternative wake methods: Wake-on-LAN to projector's MAC, or the projector's power button (remote or keypad)."
# Environment
- id: get_environment_controlblocks
label: Get Environment Sensor Readings
kind: query
command: |
{ "jsonrpc": "2.0", "method": "environment.getcontrolblocks", "params": { "type": "Sensor", "valuetype": "Temperature" }, "id": <n> }
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: get_alarm_info
label: Get Environment Alarm Info
kind: query
command: |
{ "jsonrpc": "2.0", "method": "environment.getalarminfo" }
params: []
- id: alarm_state_get
label: Get Environment Alarm State
kind: query
command: |
{ "jsonrpc": "2.0", "method": "property.get", "params": { "property": "environment.alarmstate" } }
params: []
# Firmware
- id: firmware_list_components
label: List Firmware Component Names
kind: query
command: |
{ "jsonrpc": "2.0", "method": "firmware.listcomponents" }
params: []
- id: firmware_list_component_version_status
label: List Firmware Component Version Status
kind: query
command: |
{ "jsonrpc": "2.0", "method": "firmware.listcomponentversionstatus" }
params: []
- id: firmware_schedule_component_upgrade
label: Schedule Firmware Component Upgrade at Next Reboot
kind: action
command: |
{ "jsonrpc": "2.0", "method": "firmware.schedulecomponentupgrade", "params": { "component": "<name>" } }
params:
- name: component
type: string
description: Component name (from firmware.listcomponents)
notes: "Component parameter schema inferred - source documents the method but does not list param keys explicitly."
# Color management (P7 / RGB)
- id: p7_copy_preset_to_custom
label: Copy P7 Preset to Custom
kind: action
command: |
{ "jsonrpc": "2.0", "method": "image.color.p7.custom.copypresettocustom", "params": { "presetname": "<name>" } }
params:
- name: presetname
type: string
- id: p7_reset_preset
label: Reset P7 Custom Preset to Default
kind: action
command: |
{ "jsonrpc": "2.0", "method": "image.color.p7.custom.resetpreset", "params": { "presetname": "<name>" } }
params:
- name: presetname
type: string
- id: p7_reset_to_native
label: Reset P7 Color to Native
kind: action
command: |
{ "jsonrpc": "2.0", "method": "image.color.p7.custom.resettonative" }
params: []
- id: rgbmode_next
label: Cycle to Next RGB Mode
kind: action
command: |
{ "jsonrpc": "2.0", "method": "image.color.rgbmode.nextrgbmode" }
params: []
# DMX
- id: dmx_list_channels
label: List DMX Channels
kind: query
command: |
{ "jsonrpc": "2.0", "method": "dmx.listchannels" }
params: []
- id: dmx_list_modes
label: List DMX Modes
kind: query
command: |
{ "jsonrpc": "2.0", "method": "dmx.listmodes" }
params: []
- id: dmx_mode_set
label: Set DMX Mode
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.set", "params": { "property": "dmx.mode", "value": "<mode>" } }
params:
- name: value
type: string
- id: dmx_startchannel_set
label: Set DMX Start Channel
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.set", "params": { "property": "dmx.startchannel", "value": <int> } }
params:
- name: value
type: integer
description: 1..512
- id: dmx_shutdown_set
label: Enable/Disable DMX Shutdown
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.set", "params": { "property": "dmx.shutdown", "value": <bool> } }
params:
- name: value
type: boolean
# Source / connector helpers
- id: list_source_connectors
label: List Connectors for a Source
kind: query
command: |
{ "jsonrpc": "2.0", "method": "image.source.<source_object_name>.listconnectors", "id": <n> }
params:
- name: source_object_name
type: string
description: Source name with non-word chars stripped and lowercased (e.g. "DisplayPort 1" -> "displayport1")
notes: "Source object name must be derived from the source name; the method name is constructed per source."
- id: get_connector_signal
label: Get Detected Signal on Connector
kind: query
command: |
{ "jsonrpc": "2.0", "method": "property.get", "params": { "id": 5, "property": "image.connector.<connector_object_name>.detectedsignal" } }
params:
- name: connector_object_name
type: string
description: Lowercased connector name with non-word chars stripped (e.g. "DisplayPort 1" -> "displayport1", "l1hdmi" shown in source example)
# Subscribing to source/connector signal changes
- id: subscribe_connector_signal
label: Subscribe to Connector Signal Changes
kind: action
command: |
{ "jsonrpc": "2.0", "method": "property.subscribe", "params": { "property": "image.connector.<connector_object_name>.detectedsignal" } }
params:
- name: connector_object_name
type: string
description: Lowercased connector name with non-word chars stripped
Feedbacks
- id: system_state
type: enum
values:
- boot
- eco
- standby
- ready
- conditioning
- on
- service
- deconditioning
- error
- id: illumination_state
type: enum
values:
- "On"
- "Off"
- id: image_window_main_source
type: string
description: Active source name (e.g. "DisplayPort 1", "HDMI", ...)
- id: illumination_sources_laser_power
type: integer
description: Current laser power in percent
- id: illumination_sources_laser_minpower
type: integer
description: Minimum laser power in percent (read-only; dynamic; depends on lens type/position)
- id: illumination_sources_laser_maxpower
type: integer
description: Maximum laser power in percent (read-only; dynamic; depends on lens type/position)
- id: image_brightness
type: float
range: [-1, 1]
- id: image_contrast
type: float
range: [0, 2]
- id: image_gamma
type: float
range: [1, 3]
- id: image_saturation
type: float
range: [0, 2]
- id: image_sharpness
type: integer
range: [-2, 8]
- id: image_orientation
type: enum
values:
- DESKTOP_FRONT
- DESKTOP_REAR
- CEILING_FRONT
- CEILING_REAR
- id: image_window_main_position
type: object
fields:
x: integer
y: integer
- id: image_window_main_size
type: object
fields:
width: integer
height: integer
- id: image_window_main_scalingmode
type: enum
values:
- Fill
- OneToOne
- FillScreen
- Stretch
- id: optics_shutter_position
type: enum
values:
- Open
- Closed
- id: optics_shutter_target
type: enum
values:
- Open
- Closed
- id: optics_zoom_position
type: integer
- id: optics_focus_position
type: integer
- id: optics_lensshift_horizontal_position
type: integer
- id: optics_lensshift_vertical_position
type: integer
- id: image_processing_warp_enable
type: boolean
- id: image_processing_warp_file_selected
type: string
- id: image_processing_warp_file_enable
type: boolean
- id: image_processing_blend_file_selected
type: array
items: string
- id: image_processing_blend_file_enable
type: boolean
- id: image_processing_blacklevel_file_selected
type: string
- id: image_processing_blacklevel_file_enable
type: boolean
- id: system_standby_enable
type: boolean
- id: system_eco_enable
type: boolean
- id: environment_alarmstate
type: enum
values:
- Fatal
- Error
- Alert
- Warning
- Ok
- id: network_device_lan_ip4config
type: object
fields:
Address: string
Mask: string
Gateway: string
NameServers: string
- id: network_device_lan_state
type: enum
values:
- CONNECTED
- DISCONNECTED
- id: dmx_mode
type: string
- id: dmx_startchannel
type: integer
range: [1, 512]
- id: dmx_shutdown
type: boolean
- id: image_connector_detectedsignal
type: object
fields:
active: boolean
name: string
vertical_total: integer
horizontal_total: integer
vertical_resolution: integer
horizontal_resolution: integer
vertical_sync_width: integer
vertical_front_porch: integer
vertical_back_porch: integer
horizontal_sync_width: integer
horizontal_front_porch: integer
horizontal_back_porch: integer
horizontal_frequency: float
vertical_frequency: float
pixel_rate: integer
scan: enum [Progressive]
bits_per_component: integer
color_space: enum
signal_range: enum [0-255, 16-235]
chroma_sampling: enum [4:4:4, 4:2:2, 4:2:0]
gamma_type: enum [POWER, sRGB, REC_BT1886, SMPTE_ST2084]
color_primaries: enum [REC709, REC2020, DCI-P3-D65, DCI-P3-Theater]
mastering_luminance: float
content_aspect_ratio: enum [5:4, 4:3, 16:10, 16:9, 1.85:1, 2.20:1, 2.35:1, 2.37:1, 2.39:1, Unknown]
is_stereo: boolean
stereo_mode: enum [None, Sequential, FramePacked, TopBottom, SideBySide]
Variables
# JSON-RPC transport: id field in request/response
- id: request_id
type: string_or_integer
description: Client-chosen request identifier; mirrored in response (omitted in notifications)
# Notifications are sent without an id and require no response
Events
- id: property_changed
description: |
Server -> client notification when a subscribed property changes value.
Client must implement `property.changed` listener.
Example payload:
{ "jsonrpc": "2.0", "method": "property.changed", "params": { "property": [ { "system.state": "ready" } ] } }
- id: signal_callback
description: |
Server -> client notification when a subscribed signal is emitted.
Client must implement `signal.callback` listener.
Example payload:
{ "jsonrpc": "2.0", "method": "signal.callback", "params": { "signal": [ { "modelupdated": { ...args } } ] } }
- id: modelupdated_signal
description: |
Emitted when the introspection object model changes (objects added or removed). Subscribe via signal.subscribe "modelupdated".
- id: introspect_objectchanged
description: |
Argument of modelupdated signal. Object: <object name>; isnew: <bool> (true = new, false = removed).
Example payload:
{ "jsonrpc": "2.0", "method": "signal.callback", "params": { "signal": [ { "introspect.objectchanged": { "object": "motors.motor1", "newobject": true } } ] } }
Macros
# Multi-step sequences described in source
- id: upload_and_activate_warp
description: |
1. HTTP POST the warp grid file:
curl -X POST -F file=@<file> http://<projector>/api/image/processing/warp/file/transfer
2. Set property "image.processing.warp.file.selected" to the uploaded filename.
3. Set property "image.processing.warp.file.enable" to true.
4. (Optionally) set property "image.processing.warp.enable" to true to globally enable warp.
- id: upload_and_activate_blend
description: |
1. HTTP POST the blend mask:
curl -X POST -F file=@<mask> http://<projector>/api/image/processing/blend/file/transfer
2. Set property "image.processing.blend.file.selected" to the uploaded filename.
3. Set property "image.processing.blend.file.enable" to true.
- id: upload_and_activate_blacklevel
description: |
1. HTTP POST the black-level mask:
curl -X POST -F file=@<mask> http://<projector>/api/image/processing/blacklevel/file/transfer
2. Set property "image.processing.blacklevel.file.selected" to the uploaded filename.
3. Set property "image.processing.blacklevel.file.enable" to true.
- id: wake_from_eco
description: |
Possible methods to wake a projector in ECO mode:
1. Wake-on-LAN to projector's MAC address, OR
2. Press the projector's power button (remote or keypad), OR
3. Send the ASCII string ":POWR1\r" on the RS-232 serial port.
- id: power_on_safe
description: |
1. property.get "system.state".
2. If value is "standby" or "ready", issue system.poweron.
(No-op otherwise; the source explicitly recommends this guard.)
Safety
confirmation_required_for: []
interlocks: []
# UNRESOLVED: no explicit safety warnings, interlocks, or power-on sequencing
# requirements are documented in the source. The source recommends verifying
# system.state before poweron/poweroff and notes that nothing happens if the
# device is already in the target state, but these are operational guidelines,
# not formal safety interlocks.
Notes
- Protocol is JSON-RPC 2.0. The same method set is exposed over both TCP port 9090 and RS-232. Parameters are passed by name; ordering within
paramsdoes not matter. - All
idvalues in the request/response examples are client-chosen; the projector mirrors them in the response. Notifications omit theidand require no reply. result: nullonsystem.poweron/system.poweroffis documented as a non-error (the method returns no result). Errors are returned via the JSON-RPCerrormember.- Authentication: end-user access is allowed without a pass code. Elevated access levels require the
authenticatemethod with a numericcode. The actual pass code is not documented in the source. property.setis synchronous but the source recommends awaiting the result before re-issuing the same property to avoid flooding the server.- Source object names for
image.source.<name>.listconnectorsand connector property paths are derived by lowercasing the source/connector name and stripping non-word characters (e.g. "DisplayPort 1" -> "displayport1"; "L1HDMI" example -> "l1hdmi"). - Property availability depends on hardware/peripheral configuration (e.g. motorized lens, DMX mode, illumination source type). Use the
introspectmethod to confirm presence before issuing a get/set/subscribe. - The source notes that part of the API is dynamic and may not be complete for a given projector configuration; introspection is the canonical way to discover the actual API surface.
- File endpoints (warp, blend, blacklevel) accept only the formats listed (PNG up to 16-bit, JPEG, TIFF). For colour images, only the blue channel is used.
- HTTP file downloads are also supported at the same
/api/...paths; e.g.http://192.168.1.100/api/image/processing/warp/file/transfer/warpgrid.xml. - ECO mode wake on serial is an ASCII literal — the source spells the string as
:POWR1\r.
Provenance
source_domains:
- audiogeneral.com
- docs
source_urls:
- "https://www.audiogeneral.com/barco/UDX%20Series/JSON_ReferenceGuide.pdf"
retrieved_at: 2026-05-14T11:53:45.394Z
last_checked_at: 2026-06-03T06:19:11.396Z
Verification Summary
verdict: verified
checked_at: 2026-06-03T06:19:11.396Z
matched_actions: 82
action_count: 82
confidence: medium
summary: "Spec is fully grounded in source. All 82 actions match documented Pulse API methods, properties, signals, and file endpoints (3 unresolved item(s) noted in Known Gaps.)"
Known Gaps
- "per-property minimum/firmware version constraints not stated; DMX, CLO, and P7 custom color features may not exist on every configuration — presence must be confirmed by introspection."
- "no explicit safety warnings, interlocks, or power-on sequencing"
- "Pass code value, default DMX mode, default DMX start channel, exact list of available connectors per chassis variant, firmware version compatibility ranges, and any safety interlocks are not stated in the source."
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0