Summary
Barco Pulse-family projector (Fs400 N4K) controlled via the Pulse JSON-RPC 2.0 API. Control interface is available over TCP/IP (port 9090) and over a serial RS-232C cable; identical command set on both transports. Covers power, source selection, illumination (laser) power, picture settings, optics, warp/blend/black-level file handling, DMX, environment monitoring, and firmware management.
Transport
protocols:
- tcp
- serial
addressing:
port: 9090
# base_url for file endpoints: http://<projector-ip>/api (used for warp/blend/blacklevel uploads and downloads)
serial:
baud_rate: 19200
data_bits: 8
parity: none
stop_bits: 1
flow_control: none
# Pinout: 9-pin female to host, 9-pin male to projector; pin2-pin2, pin3-pin3, pin5-pin5
auth:
type: UNRESOLVED # source does not state this (was inferred none: normal end-user access requires no auth; higher access levels require a secret pass-code via the `authenticate` method)
Traits
traits:
- powerable # inferred: system.poweron / system.poweroff present
- queryable # inferred: property.get / image.source.list / environment.getcontrolblocks etc.
- routable # inferred: image.window.main.source selection present
- levelable # inferred: brightness/contrast/laser-power set present
Actions
# All requests are JSON-RPC 2.0 over the chosen transport. `id` is a client-chosen
# request identifier (string|number); omitted from templates for brevity. Order of
# named params does not matter. Methods return `result`; errors carry an `error` member.
- id: power_on
label: Power On
kind: action
command: '{"jsonrpc":"2.0","method":"system.poweron"}'
params: []
notes: Returns result null (not an error). If already on or in transition, nothing happens. Verify system.state is standby/ready first.
- id: power_off
label: Power Off
kind: action
command: '{"jsonrpc":"2.0","method":"system.poweroff"}'
params: []
notes: Returns result null. If already off or in transition, nothing happens. Verify system.state is on first.
- id: eco_wake_serial
label: Wake from ECO via RS-232
kind: action
command: ':POWR1\r'
params: []
notes: ASCII characters sent on the RS-232 serial port to wake a projector in ECO mode. ECO wake may also be done via Wake-on-LAN (MAC address), remote, or keypad.
- id: authenticate
label: Authenticate (raise access level)
kind: action
command: '{"jsonrpc":"2.0","method":"authenticate","params":{"code":98765}}'
params:
- name: code
type: integer
description: Secret pass-code. Sets the user access level.
notes: Example code 98765 shown only as illustration. # UNRESOLVED: real pass-code value/format not stated in source. Skippable for normal end-user access.
- id: property_set
label: Set Property
kind: action
command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"{property}","value":{value}}}'
params:
- name: property
type: string
description: Dot-notation property path (e.g. image.window.main.source).
- name: value
type: any
description: Value matching the property type (string|integer|float|boolean|object|array).
notes: Wait for confirmation before setting the same property again (avoids flooding).
- id: property_get
label: Get Property
kind: query
command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"{property}"}}'
params:
- name: property
type: string
description: Dot-notation property path.
- id: property_get_multi
label: Get Multiple Properties
kind: query
command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":["{property1}","{property2}"]}}'
params:
- name: property
type: array
description: Array of dot-notation property paths.
- id: property_subscribe
label: Subscribe to Property Changes
kind: action
command: '{"jsonrpc":"2.0","method":"property.subscribe","params":{"property":"{property}"}}'
params:
- name: property
type: string
description: Dot-notation property path, or array of paths.
- id: property_unsubscribe
label: Unsubscribe from Property Changes
kind: action
command: '{"jsonrpc":"2.0","method":"property.unsubscribe","params":{"property":"{property}"}}'
params:
- name: property
type: string
description: Dot-notation property path, or array of paths.
- id: signal_subscribe
label: Subscribe to Signal
kind: action
command: '{"jsonrpc":"2.0","method":"signal.subscribe","params":{"signal":"{signal}"}}'
params:
- name: signal
type: string
description: Signal name (e.g. modelupdated), or array of signal names.
- id: signal_unsubscribe
label: Unsubscribe from Signal
kind: action
command: '{"jsonrpc":"2.0","method":"signal.unsubscribe","params":{"signal":"{signal}"}}'
params:
- name: signal
type: string
description: Signal name, or array of signal names.
- id: introspect
label: Introspect Object
kind: query
command: '{"jsonrpc":"2.0","method":"introspect","params":{"object":"{object}","recursive":{recursive}}}'
params:
- name: object
type: string
description: Object name in dot notation; empty/default introspects everything.
- name: recursive
type: boolean
description: If false, only object names are listed (one level). Default true.
notes: Returns metadata of methods/properties/signals restricted by access level. Also accepts positional params form ["{object}", {recursive}].
- id: image_source_list
label: List Available Sources
kind: query
command: '{"jsonrpc":"2.0","method":"image.source.list"}'
params: []
notes: Returns array of source-name strings; contents vary by projector model.
- 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 for 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 removed, lowercased (e.g. "DisplayPort 1" -> "displayport1").
notes: Returns array of {gridposition:{row,column,plane}, name}.
- id: environment_getcontrolblocks
label: Get Environment Control Blocks
kind: query
command: '{"jsonrpc":"2.0","method":"environment.getcontrolblocks","params":{"type":"{type}","valuetype":"{valuetype}"}}'
params:
- name: type
type: string
description: Sensor type. Values Sensor, Filter, Controller, Actuator, Alarm, GenericBlock.
- name: valuetype
type: string
description: Value type. Values Temperature, ADC, Median, Simulation, Speed, Coordinate, Noise, State, PWM, Peltier, Weighting, Pump, Voltage, Waveform, Comparison, Resistance, Current, Average, Threshold, Constant, Power, Delay, Formula, Manual, Altitude, Difference, Driver, Range, Pressure, Interpolation, PID, Any, Humidity, Limit, Mode.
notes: Returns dictionary of sensor-name -> reading.
- id: environment_getalarminfo
label: Get Alarm Info
kind: query
command: '{"jsonrpc":"2.0","method":"environment.getalarminfo"}'
params: []
notes: Returns array of {severity, timestamp, source, description, custommessage}.
- id: ledctrl_blink
label: Blink LED
kind: action
command: '{"jsonrpc":"2.0","method":"ledctrl.blink","params":{"led":"{led}","color":"{color}","period":{period}}}'
params:
- name: led
type: string
description: LED identifier (e.g. systemstatus).
- name: color
type: string
description: Color (e.g. red).
- name: period
type: integer
description: Blink period.
- id: dmx_listchannels
label: List DMX Channels
kind: query
command: '{"jsonrpc":"2.0","method":"dmx.listchannels"}'
params: []
notes: Returns array of channel-name strings.
- id: dmx_listmodes
label: List DMX Modes
kind: query
command: '{"jsonrpc":"2.0","method":"dmx.listmodes"}'
params: []
notes: Returns array of mode-name strings.
- id: firmware_listcomponents
label: List Firmware Components
kind: query
command: '{"jsonrpc":"2.0","method":"firmware.listcomponents"}'
params: []
notes: Returns array of managed firmware component names.
- id: firmware_listcomponentversionstatus
label: List Firmware Component Version Status
kind: query
command: '{"jsonrpc":"2.0","method":"firmware.listcomponentversionstatus"}'
params: []
notes: Returns array of {name, versions:{available, running}, status}. status values Unknown, OK, Upgradable.
- id: firmware_schedulecomponentupgrade
label: Schedule Component Upgrade
kind: action
command: '{"jsonrpc":"2.0","method":"firmware.schedulecomponentupgrade"}'
params: [] # UNRESOLVED: component-name parameter not shown in source
notes: Forces a component upgrade at the following reboot.
- id: illumination_clo_engage
label: Engage CLO
kind: action
command: '{"jsonrpc":"2.0","method":"illumination.clo.engage"}'
params: []
notes: Engages Constant Light Output at the current light level.
- id: illumination_laser_getserialnumber
label: Get Laser Serial Number
kind: query
command: '{"jsonrpc":"2.0","method":"illumination.laser.getserialnumber"}'
params: []
notes: Returns string serial number.
- id: image_color_p7_custom_copypresettocustom
label: Copy Color Preset to Custom (P7)
kind: action
command: '{"jsonrpc":"2.0","method":"image.color.p7.custom.copypresettocustom","params":{"presetname":"{presetname}"}}'
params:
- name: presetname
type: string
description: Name of preset to copy.
- id: image_color_p7_custom_resetpreset
label: Reset Color Preset (P7)
kind: action
command: '{"jsonrpc":"2.0","method":"image.color.p7.custom.resetpreset","params":{"presetname":"{presetname}"}}'
params:
- name: presetname
type: string
description: Name of preset to reset.
- id: image_color_p7_custom_resettonative
label: Reset Color to Native (P7)
kind: action
command: '{"jsonrpc":"2.0","method":"image.color.p7.custom.resettonative"}'
params: []
- id: image_color_rgbmode_nextrgbmode
label: Next RGB Mode
kind: action
command: '{"jsonrpc":"2.0","method":"image.color.rgbmode.nextrgbmode"}'
params: []
notes: Cycles to the next RGB mode.
- id: upload_warp_grid
label: Upload Warp Grid
kind: action
command: 'curl -X POST -F file=@warp.xml http://192.168.1.100/api/image/processing/warp/file/transfer'
params: []
notes: Uploads a warp grid file by HTTP POST. The source says -X POST can be omitted when using -F.
- id: upload_blend_mask
label: Upload Blend Mask
kind: action
command: 'curl -X POST -F file=@mask.png http://192.168.1.100/api/image/processing/blend/file/transfer'
params: []
notes: Uploads a blend mask by HTTP POST.
- id: upload_black_level_mask
label: Upload Black Level Mask
kind: action
command: 'curl -X POST -F file=@blacklevel.png http://192.168.1.100/api/image/processing/blacklevel/file/ transfer'
params: []
notes: Uploads a black level mask by HTTP POST. The source example includes a space before transfer.
Feedbacks
# Observable/read state via property.get or subscriptions. Enum-typed states:
- id: system_state
property: system.state
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"system.state"}}'
type: enum
values: [boot, eco, standby, ready, conditioning, on, deconditioning, service, error]
description: Current operation state of the unit.
- id: illumination_state
property: illumination.state
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"illumination.state"}}'
type: enum
values: [On, Off]
- id: environment_alarmstate
property: environment.alarmstate
type: enum
values: [Fatal, Error, Alert, Warning, Ok]
- id: network_device_lan_state
property: network.device.lan.state
type: enum
values: [CONNECTED, DISCONNECTED]
- id: optics_shutter_position
property: optics.shutter.position
type: enum
values: [Open, Closed]
- id: optics_zoom_position
property: optics.zoom.position
type: integer
description: Current zoom position.
- id: optics_focus_position
property: optics.focus.position
type: integer
- id: optics_lensshift_horizontal_position
property: optics.lensshift.horizontal.position
type: integer
- id: optics_lensshift_vertical_position
property: optics.lensshift.vertical.position
type: integer
- id: network_device_lan_ip4config
property: network.device.lan.ip4config
type: object
description: "{Address, Mask, Gateway, NameServers} (strings)."
- id: illumination_sources_laser_minpower
property: illumination.sources.laser.minpower
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"illumination.sources.laser.minpower"}}'
type: float
description: Minimum laser power in percent (read-only, dynamic).
- id: illumination_sources_laser_maxpower
property: illumination.sources.laser.maxpower
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"illumination.sources.laser.maxpower"}}'
type: float
description: Maximum laser power in percent (read-only, dynamic).
- id: connector_detectedsignal
property: image.connector.{name}.detectedsignal
query_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"image.connector.{name}.detectedsignal"}}'
type: object
description: >
Signal info for connector object name (e.g. displayport1, l1hdmi). Object fields:
active(bool), name(string), vertical_total, horizontal_total, vertical_resolution,
horizontal_resolution, vertical_sync_width, vertical_front_porch, vertical_back_porch,
horizontal_sync_width, horizontal_front_porch, horizontal_back_porch, horizontal_frequency,
vertical_frequency, pixel_rate, scan(enum), bits_per_component, 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), is_stereo(bool), stereo_mode(enum: None,Sequential,FramePacked,TopBottom,SideBySide).
Variables
# Settable properties via property.set. Constraints from source introspection tables.
- id: image_window_main_source
property: image.window.main.source
type: string
description: Source displayed in main window. Values come from image.source.list (e.g. DisplayPort 1, HDMI, DVI 1, DVI 2, DisplayPort 2, Dual DVI, Dual DisplayPort, Dual Head DVI, Dual Head DisplayPort, HDBaseT, HDMI, SDI).
- id: image_window_main_scalingmode
property: image.window.main.scalingmode
type: enum
values: [Fill, OneToOne, FillScreen, Stretch]
- id: illumination_sources_laser_power
property: illumination.sources.laser.power
type: float
min: 0 # from example response for minpower
max: 100 # from example response for maxpower
unit: percent
description: Target laser power in percent (read-write). Min/max are dynamic.
- id: image_brightness
property: image.brightness
type: float
min: -1
max: 1
step_size: 1
precision: 0.01
description: Normalized brightness/offset; 0 default, 1 = 100% offset.
- id: image_contrast
property: image.contrast
type: float
min: 0
max: 2
step_size: 1
precision: 0.01
description: Normalized contrast/gain; 1 default.
- id: image_gamma
property: image.gamma
type: float
min: 1
max: 3
step_size: 1
precision: 0.1
description: Image gamma; default 2.2.
- id: image_saturation
property: image.saturation
type: float
min: 0
max: 2
step_size: 1
precision: 0.01
description: Normalized color saturation; 1 default.
- id: image_sharpness
property: image.sharpness
type: integer
min: -2
max: 8
step_size: 1
precision: 1
- id: image_orientation
property: image.orientation
type: enum
values: [DESKTOP_FRONT, DESKTOP_REAR, CEILING_FRONT, CEILING_REAR]
- id: optics_shutter_target
property: optics.shutter.target
type: enum
values: [Open, Closed]
- id: image_processing_warp_enable
property: image.processing.warp.enable
type: boolean
description: Enable/disable all warp functions.
- id: image_processing_warp_file_enable
property: image.processing.warp.file.enable
type: boolean
- id: image_processing_warp_file_selected
property: image.processing.warp.file.selected
type: string
description: Currently selected warp file (e.g. warp.xml). Upload via HTTP POST /api/image/processing/warp/file/transfer.
- id: image_processing_blend_file_enable
property: image.processing.blend.file.enable
type: boolean
- id: image_processing_blend_file_selected
property: image.processing.blend.file.selected
type: array
items: string
description: Currently selected blend files. Upload via HTTP POST /api/image/processing/blend/file/transfer.
- id: image_processing_blacklevel_file_enable
property: image.processing.blacklevel.file.enable
type: boolean
- id: image_processing_blacklevel_file_selected
property: image.processing.blacklevel.file.selected
type: string
description: Upload via HTTP POST /api/image/processing/blacklevel/file/transfer.
- id: dmx_mode
property: dmx.mode
type: string
description: Current DMX mode. Basic mode exposes 2 channels; extended mode exposes more.
- id: dmx_startchannel
property: dmx.startchannel
type: integer
min: 1
max: 512
- id: dmx_shutdown
property: dmx.shutdown
type: boolean
- id: system_standby_enable
property: system.standby.enable
type: boolean
description: Enable/disable standby state; check availability first.
- id: system_eco_enable
property: system.eco.enable
type: boolean
description: Enable/disable ECO state; check availability first.
- id: image_window_main_position
property: image.window.main.position
type: object
description: "{x:int, y:int} window position."
- id: image_window_main_size
property: image.window.main.size
type: object
description: "{width:int, height:int} window size."
Events
# Unsolicited JSON-RPC notifications (no id; client must not respond).
- id: property_changed
method: property.changed
description: Fired on any subscribed property value change. params.property is an array of {objectname.propertyname: value} objects. Note: source-select emits two notifications (deselect old, then select new).
- id: signal_callback
method: signal.callback
description: Fired when a subscribed signal is emitted. params.signal is an array of {objectname.signalname: {arg..}} objects.
- id: modelupdated_signal
method: signal.callback (for signal "modelupdated")
description: Object structure changed (objects added/removed). Callback carries introspect.objectchanged with {object, newobject(bool)}.
Macros
# UNRESOLVED: no explicit multi-step named macros documented as sequences; source only
# describes ad-hoc sequences (e.g. wake-from-ECO, upload-then-select-then-enable warp file).
Safety
confirmation_required_for: []
interlocks:
- practice: Verify system.state is standby or ready before issuing system.poweron (command is a no-op otherwise or during transitions).
- practice: Verify system.state is on before issuing system.poweroff (no-op otherwise).
- practice: Wait for property.set confirmation before setting the same property again (avoids server flooding / performance loss).
# UNRESOLVED: source contains no explicit interlock procedures, power-sequencing lockouts,
# or hard safety warnings beyond the operational notes above. No voltage/current/power
# values documented in the control section.
Notes
- API is JSON-RPC 2.0; identical over TCP (port 9090) and RS-232. Named params, order-independent.
- API is partly dynamic: availability of objects/methods depends on peripherals and configuration (e.g. motorized zoom lens, DMX extended mode). Discover exact API via
introspect. - File transfers (warp grids, blend masks, black-level masks) use HTTP, not JSON-RPC: upload via
curl -F file=@<file> http://<ip>/api/<endpoint>, download via GET on the same URL. Supported image formats PNG (up to 16-bit), JPEG, TIFF; grayscale only (color images use blue channel). - Warp file format identical to MCM500/400.
- Blend/black-level mask resolution must match projector resolution (WUXGA 1920x1200; WQXGA/4K 1280x800; 4K Cinemascope 1280x540).
- ECO-mode wake options: Wake-on-LAN (MAC), remote, keypad, or RS-232 ASCII
:POWR1\r.
## Provenance
```yaml
source_domains:
- audiogeneral.com
source_urls:
- "https://www.audiogeneral.com/barco/UDX%20Series/JSON_ReferenceGuide.pdf"
retrieved_at: 2026-07-29T18:17:22.637Z
last_checked_at: 2026-10-07T20:33:33.788Z
```
## Verification Summary
```yaml
verdict: verified
checked_at: 2026-10-07T20:33:33.788Z
matched_actions: 37
action_count: 37
confidence: medium
summary: "All 37 action units match source methods, curl endpoints and :POWR1 wake; transport (9090, 19200 8N1) confirmed; the source is generic Pulse API. (6 unresolved item(s) noted in Known Gaps.)"
```
## Known Gaps
```yaml
- "exact source/connector set per model varies; full API is dynamic and must be discovered via introspect on the real device. Firmware version compatibility not stated. Auth secret pass-code format not specified beyond an example."
- "real pass-code value/format not stated in source. Skippable for normal end-user access."
- "component-name parameter not shown in source"
- "no explicit multi-step named macros documented as sequences; source only"
- "source contains no explicit interlock procedures, power-sequencing lockouts,"
- "real auth pass-code value/format (only example 98765 shown). Firmware version compatibility ranges not stated. Laser power min/max are dynamic and only exemplified (0/100). Full per-model source/connector list must be read from the device. No voltage/current/power specs in this control document. firmware.schedulecomponentupgrade params not shown."
```
---
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0