Summary

Barco F70 W8 laser phosphor projector controlled via the Pulse API, a JSON-RPC 2.0 protocol available over TCP/IP (port 9090) and RS-232 serial (19200 8N1). HTTP file endpoints under /api support upload/download of warp grids, blend masks, and black level masks. This spec covers power, source selection, illumination/laser power, picture settings, optics, DMX, environment monitoring, and introspection.

Transport

protocols:
  - tcp
  - serial
  - http
addressing:
  port: 9090  # TCP - Pulse JSON-RPC service
  base_url: "http://{projector-ip}/api"  # HTTP file endpoints only (warp/blend/blacklevel transfer)
serial:
  baud_rate: 19200
  data_bits: 8
  parity: none
  stop_bits: 1
  flow_control: none
auth:
  # Optional passcode: required only for access level above normal end user.
  # Request: {"jsonrpc": "2.0", "method": "authenticate", "params": {"code": <passcode>}}
  type: passcode  # inferred: optional authenticate method documented; no credential format stated

Traits

traits:
  - powerable    # inferred: system.poweron / system.poweroff methods
  - queryable    # inferred: property.get, image.source.list, environment.getcontrolblocks
  - routable     # inferred: image.window.main.source selection
  - levelable    # inferred: illumination.sources.laser.power, image.brightness, image.contrast

Actions

# JSON-RPC 2.0 requests. Parameter order does not matter (all params passed by name).
- id: power_on
  label: Power On
  kind: action
  command: '{"jsonrpc": "2.0", "method": "system.poweron"}'
  params: []
  notes: "Result is null on success. No-op if already on or transitioning."

- id: power_off
  label: Power Off
  kind: action
  command: '{"jsonrpc": "2.0", "method": "system.poweroff"}'
  params: []
  notes: "Result is null on success. No-op if already off or transitioning."

- id: eco_wake_serial
  label: Wake from ECO Mode (serial)
  kind: action
  command: ':POWR1\r'
  params: []
  notes: "ASCII bytes sent on RS-232 port to wake projector in ECO mode. Alternatives: Wake-on-LAN with MAC address, remote/keypad power button."

- id: authenticate
  label: Authenticate
  kind: action
  command: '{"jsonrpc": "2.0", "method": "authenticate", "params": {"code": {passcode}}}'
  params:
    - name: passcode
      type: integer
      description: Secret pass code; sets user access level
  notes: "Only needed above normal end user level. Response result is true."

- id: select_input
  label: Select Input Source
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "image.window.main.source", "value": "{source}"}}'
  params:
    - name: source
      type: string
      description: "Source name from image.source.list, e.g. DVI 1, DVI 2, DisplayPort 1, DisplayPort 2, Dual DVI, Dual DisplayPort, Dual Head DVI, Dual Head DisplayPort, HDBaseT, HDMI, SDI (list varies by model)"

- id: set_property
  label: Set Property (generic)
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "{property}", "value": {value}}}'
  params:
    - name: property
      type: string
      description: Property name in dot notation
    - name: value
      type: any
      description: Value to set
  notes: "Wait for confirmation before setting the same property again; flooding degrades performance."

- id: get_property
  label: Get Property (generic)
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": {"property": "{property}"}}'
  params:
    - name: property
      type: string
      description: Property name, or array of property names for multi-read

- id: subscribe_property
  label: Subscribe to Property Changes
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.subscribe", "params": {"property": "{property}"}}'
  params:
    - name: property
      type: string
      description: Property name or array of property names

- id: unsubscribe_property
  label: Unsubscribe from Property Changes
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.unsubscribe", "params": {"property": "{property}"}}'
  params:
    - name: property
      type: string
      description: Property name or array of property names

- id: subscribe_signal
  label: Subscribe to Signal
  kind: query
  command: '{"jsonrpc": "2.0", "method": "signal.subscribe", "params": {"signal": "{signal}"}}'
  params:
    - name: signal
      type: string
      description: Signal name or array of signal names, e.g. modelupdated, image.processing.warp.gridchanged

- id: unsubscribe_signal
  label: Unsubscribe from Signal
  kind: query
  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 Metadata
  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: "true (default): full metadata; false: list object names one level"
  notes: "Equivalent array form: params [\"foo\", true]."

- id: list_sources
  label: List Available Sources
  kind: query
  command: '{"jsonrpc": "2.0", "method": "image.source.list"}'
  params: []

- id: list_connectors
  label: List Available Connectors
  kind: query
  command: '{"jsonrpc": "2.0", "method": "image.connector.list"}'
  params: []

- id: list_source_connectors
  label: List Connectors Used by Source
  kind: query
  command: '{"jsonrpc": "2.0", "method": "image.source.{sourceobject}.listconnectors"}'
  params:
    - name: sourceobject
      type: string
      description: "Source object name: strip non-word chars from source name, lowercase (e.g. 'DisplayPort 1' -> 'displayport1')"
  notes: "Returns array of {gridposition {row,column,plane}, name}."

- id: set_laser_power
  label: Set Laser Power
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "illumination.sources.laser.power", "value": {level}}}'
  params:
    - name: level
      type: float
      description: Target power in percent (between minpower and maxpower; dynamic, lens-dependent)

- id: set_brightness
  label: Set Brightness
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "image.brightness", "value": {value}}}'
  params:
    - name: value
      type: float
      description: "Normalized: -1..1, 0 default, precision 0.01"

- id: set_warp_enable
  label: Enable/Disable Warp
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "image.processing.warp.enable", "value": {enabled}}}'
  params:
    - name: enabled
      type: boolean

- id: select_warp_file
  label: Select Warp File
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "image.processing.warp.file.selected", "value": "{filename}"}}'
  params:
    - name: filename
      type: string
      description: Uploaded warp grid file name, e.g. warp.xml

- id: set_warp_file_enable
  label: Enable File Warp
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "image.processing.warp.file.enable", "value": {enabled}}}'
  params:
    - name: enabled
      type: boolean

- id: select_blend_file
  label: Select Blend Mask File
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "image.processing.blend.file.selected", "value": "{filename}"}}'
  params:
    - name: filename
      type: string
      description: Uploaded blend mask file name, e.g. mask.png

- id: set_blend_file_enable
  label: Enable Blend Mask
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "image.processing.blend.file.enable", "value": {enabled}}}'
  params:
    - name: enabled
      type: boolean

- id: select_blacklevel_file
  label: Select Black Level Mask File
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "image.processing.blacklevel.file.selected", "value": "{filename}"}}'
  params:
    - name: filename
      type: string
      description: Uploaded black level mask file name, e.g. blacklevel.png

- id: set_blacklevel_file_enable
  label: Enable Black Level Mask
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "image.processing.blacklevel.file.enable", "value": {enabled}}}'
  params:
    - name: enabled
      type: boolean

- id: upload_warp_file
  label: Upload Warp Grid File
  kind: action
  command: 'curl -F file=@warpgrid.xml http://{projector-ip}/api/image/processing/warp/file/transfer'
  params:
    - name: projector-ip
      type: string
      description: Projector IP address
  notes: "HTTP multipart POST. Warp file format same as MCM500/400."

- id: upload_blend_mask
  label: Upload Blend Mask
  kind: action
  command: 'curl -F file=@mask.png http://{projector-ip}/api/image/processing/blend/file/transfer'
  params:
    - name: projector-ip
      type: string
  notes: "Grayscale PNG (up to 16 bit), JPEG, or TIFF. Mask size must match blend layer resolution (WUXGA 1920x1200; WQXGA/4K 1280x800; 4K Cinemascope 1280x540). Color images: only blue channel used."

- id: upload_blacklevel_mask
  label: Upload Black Level Mask
  kind: action
  command: 'curl -F file=@blacklevel.png http://{projector-ip}/api/image/processing/blacklevel/file/transfer'
  params:
    - name: projector-ip
      type: string
  notes: "Same format/size rules as blend masks."

- id: blink_led
  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: e.g. systemstatus
    - name: color
      type: string
      description: e.g. red
    - name: period
      type: integer
      description: e.g. 42

- 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, Filter, Controller, Actuator, Alarm, or 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, or Any"
  notes: "Returns dictionary of sensor-name -> float value (e.g. environment.fan.ar1.tacho: 1800)."

- 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: dmx_listchannels
  label: List DMX Channels
  kind: query
  command: '{"jsonrpc": "2.0", "method": "dmx.listchannels"}'
  params: []
  notes: Returns list of available channel names.

- id: dmx_listmodes
  label: List DMX Modes
  kind: query
  command: '{"jsonrpc": "2.0", "method": "dmx.listmodes"}'
  params: []
  notes: Returns list of all modes.

- id: firmware_listcomponents
  label: List Firmware Components
  kind: query
  command: '{"jsonrpc": "2.0", "method": "firmware.listcomponents"}'
  params: []
  notes: Returns names of all managed firmware components.

- id: firmware_listcomponentversionstatus
  label: List Firmware Version Status
  kind: query
  command: '{"jsonrpc": "2.0", "method": "firmware.listcomponentversionstatus"}'
  params: []
  notes: "Returns components with {name, versions {available, running}, status}: Unknown/OK/Upgradable."

- id: firmware_schedulecomponentupgrade
  label: Schedule Component Upgrade
  kind: action
  command: '{"jsonrpc": "2.0", "method": "firmware.schedulecomponentupgrade"}'
  params: []
  notes: Forces a component upgrade at next 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 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.

- id: color_copypresettocustom
  label: Copy Color Preset to Custom
  kind: action
  command: '{"jsonrpc": "2.0", "method": "image.color.p7.custom.copypresettocustom", "params": {"presetname": "{presetname}"}}'
  params:
    - name: presetname
      type: string

- id: color_resetpreset
  label: Reset Color Preset
  kind: action
  command: '{"jsonrpc": "2.0", "method": "image.color.p7.custom.resetpreset", "params": {"presetname": "{presetname}"}}'
  params:
    - name: presetname
      type: string
  notes: Resets preset to default values.

- id: color_resettonative
  label: Reset Color to Native
  kind: action
  command: '{"jsonrpc": "2.0", "method": "image.color.p7.custom.resettonative"}'
  params: []

- id: color_nextrgbmode
  label: Next RGB Mode
  kind: action
  command: '{"jsonrpc": "2.0", "method": "image.color.rgbmode.nextrgbmode"}'
  params: []
  notes: Cycles through all possible RGB modes.

Feedbacks

- id: property_changed
  type: object
  description: 'Unsolicited notification: {"jsonrpc": "2.0", "method": "property.changed", "params": {"property": [{"objectname.propertyname": value}, ...]}} - array of property/value pairs.'

- id: signal_callback
  type: object
  description: 'Unsolicited notification: {"jsonrpc": "2.0", "method": "signal.callback", "params": {"signal": [{"objectname.signalname": {args}}, ...]}} - array of signal/argument-list pairs.'

- id: system_state
  type: enum
  values: [boot, eco, standby, ready, conditioning, on, service, deconditioning, error]
  description: Queried via property.get on system.state; changes pushed via property.changed.

- id: illumination_state
  type: enum
  values: [on, off]
  description: Queried via property.get on illumination.state ("On"/"Off").

- id: active_source
  type: string
  description: Queried via property.get on image.window.main.source.

- id: source_list
  type: array
  description: Result of image.source.list - array of source name strings, varies by model.

- id: connector_list
  type: array
  description: Result of image.connector.list - array of connector name strings.

- id: detectedsignal
  type: object
  description: 'image.connector.[name].detectedsignal: {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 (int), horizontal_frequency, vertical_frequency (float), pixel_rate int, scan enum (Progressive), bits_per_component int, color_space enum (RGB), 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 bool, stereo_mode enum (None, Sequential, FramePacked, TopBottom, SideBySide)}. If active is false, disregard rest.'

- id: environment_alarmstate
  type: enum
  values: [fatal, error, alert, warning, ok]
  description: environment.alarmstate property.

- id: network_state
  type: enum
  values: [connected, disconnected]
  description: network.device.lan.state property.

Variables

- id: system.state
  type: enum
  values: [boot, eco, standby, ready, conditioning, on, service, deconditioning, error]
  access: read

- id: system.standby.enable
  type: boolean
  access: write
  description: Enable/disable use of standby state. Check availability first.

- id: system.eco.enable
  type: boolean
  access: write
  description: Enable/disable use of ECO state. Check availability first.

- id: illumination.state
  type: enum
  values: ["On", "Off"]
  access: read

- id: illumination.sources.laser.power
  type: float
  access: read_write
  description: Target laser power in percent.

- id: illumination.sources.laser.minpower
  type: float
  access: read
  description: Minimum power in percent; dynamic (lens type/position affect).

- id: illumination.sources.laser.maxpower
  type: float
  access: read
  description: Maximum power in percent; dynamic (lens type/position affect).

- id: image.window.main.source
  type: string
  access: read_write

- id: image.window.main.position
  type: object
  access: read_write
  description: "{x int, y int}"

- id: image.window.main.size
  type: object
  access: read_write
  description: "{width int, height int}"

- id: image.window.main.scalingmode
  type: enum
  values: [Fill, OneToOne, FillScreen, Stretch]
  access: read_write

- id: image.brightness
  type: float
  access: read_write
  constraints: {min: -1, max: 1, step_size: 1, precision: 0.01}
  description: Normalized; 0 default, 1 is 100% offset.

- id: image.contrast
  type: float
  access: read_write
  constraints: {min: 0, max: 2, step_size: 1, precision: 0.01}
  description: Normalized; 1 default.

- id: image.gamma
  type: float
  access: read_write
  constraints: {min: 1, max: 3, step_size: 1, precision: 0.1}
  description: Default 2.2.

- id: image.saturation
  type: float
  access: read_write
  constraints: {min: 0, max: 2, step_size: 1, precision: 0.01}
  description: Normalized; 1 default.

- id: image.sharpness
  type: integer
  access: read_write
  constraints: {min: -2, max: 8, step_size: 1, precision: 1}
  description: Normalized.

- id: image.orientation
  type: enum
  values: [DESKTOP_FRONT, DESKTOP_REAR, CEILING_FRONT, CEILING_REAR]
  access: read_write

- id: image.connector.l1hdmi.detectedsignal
  type: object
  access: read
  description: See detectedsignal feedback for full structure.

- id: image.processing.warp.enable
  type: boolean
  access: read_write

- id: image.processing.warp.file.enable
  type: boolean
  access: read_write

- id: image.processing.warp.file.selected
  type: string
  access: read_write

- id: image.processing.blend.file.enable
  type: boolean
  access: read_write

- id: image.processing.blend.file.selected
  type: array
  access: read_write
  description: Array of selected file names.

- id: image.processing.blacklevel.file.enable
  type: boolean
  access: read_write

- id: image.processing.blacklevel.file.selected
  type: string
  access: read_write

- id: dmx.mode
  type: string
  access: read_write

- id: dmx.startchannel
  type: integer
  access: read_write
  constraints: {min: 1, max: 512}

- id: dmx.shutdown
  type: boolean
  access: read_write

- id: network.device.lan.ip4config
  type: object
  access: read
  description: "{Address string, Mask string, Gateway string, NameServers string}"

- id: network.device.lan.state
  type: enum
  values: [CONNECTED, DISCONNECTED]
  access: read

- id: optics.shutter.position
  type: enum
  values: [Open, Closed]
  access: read

- id: optics.shutter.target
  type: enum
  values: [Open, Closed]
  access: read_write

- id: optics.zoom.position
  type: integer
  access: read_write

- id: optics.focus.position
  type: integer
  access: read_write

- id: optics.lensshift.horizontal.position
  type: integer
  access: read_write

- id: optics.lensshift.vertical.position
  type: integer
  access: read_write

- id: environment.alarmstate
  type: enum
  values: [Fatal, Error, Alert, Warning, Ok]
  access: read

Events

- id: property.changed
  description: Pushed on any subscribed property value change; array of property/value pairs. No id, no response to return.

- id: signal.callback
  description: Pushed when a subscribed signal emits; array of signal/argument-list pairs. No response to return.

- id: modelupdated
  description: Introspection signal triggered when object structure changes (objects added/removed). Subscribe via signal.subscribe; callback delivers introspect.objectchanged with {object string, isnew bool}.

Macros

- id: apply_warp_grid
  name: Apply Warp Grid File
  steps:
    - 'curl -F file=@warp.xml http://{projector-ip}/api/image/processing/warp/file/transfer (upload)'
    - 'property.set image.processing.warp.file.selected = "warp.xml" (select/activate)'
    - 'property.set image.processing.warp.file.enable = true (enable grid file warp)'
  notes: Source documents this exact three-step sequence.

- id: apply_blend_mask
  name: Apply Blend Mask
  steps:
    - 'curl -F file=@mask.png http://{projector-ip}/api/image/processing/blend/file/transfer (upload)'
    - 'property.set image.processing.blend.file.selected = "mask.png" (select)'
    - 'property.set image.processing.blend.file.enable = true (enable)'
  notes: Source documents this exact three-step sequence.

- id: apply_blacklevel_mask
  name: Apply Black Level Mask
  steps:
    - 'curl -F file=@blacklevel.png http://{projector-ip}/api/image/processing/blacklevel/file/transfer (upload)'
    - 'property.set image.processing.blacklevel.file.selected = "blacklevel.png" (select)'
    - 'property.set image.processing.blacklevel.file.enable = true (enable)'
  notes: Source documents this exact three-step sequence.

Safety

confirmation_required_for: []
interlocks:
  - "Power on: verify system.state is standby or ready before issuing system.poweron; command no-ops if already on or transitioning (source: programmers guide good practice)."
  - "Power off: verify system.state is on before issuing system.poweroff; command no-ops if already off or transitioning (source: programmers guide good practice)."

Notes

  • Protocol is JSON-RPC 2.0 over TCP 9090 or RS-232; identical commands on all connection types.
  • Serial cable: 9-pin female (host) to 9-pin male (projector); pin 2→2, 3→3, 5→5.
  • All params passed by name; parameter order irrelevant.
  • Wait for property.set confirmation before re-setting the same property — flooding the server degrades performance.
  • Source change delivers two property.changed notifications (deselect old, select new).
  • Subscriptions only push on change; use property.get for current value.
  • API is dynamic: parts depend on peripherals/configuration (e.g. no motorized zoom lens → zoom API absent; DMX extended mode exposes more channels). Runtime introspection is the authoritative API listing.
  • ECO wake: Wake-on-LAN (MAC), remote/keypad power button, or serial ":POWR1\r".
  • File downloads via browser or curl at /api endpoints; some endpoints require explicit filename (e.g. .../transfer/warpgrid.xml).
  • File endpoints support download of current file only where endpoint supports it.

Provenance

source_domains:
  - audiogeneral.com
source_urls:
  - "https://www.audiogeneral.com/barco/UDX%20Series/JSON_ReferenceGuide.pdf"
retrieved_at: 2026-08-30T10:29:36.426Z
last_checked_at: 2026-08-30T22:16:49.006Z

Verification Summary

verdict: verified
checked_at: 2026-08-30T22:16:49.006Z
matched_actions: 41
action_count: 41
confidence: medium
summary: "All 41 spec actions map to documented JSON-RPC methods or the serial :POWR1 command; transport params (9090, 19200 8N1, /api) verified verbatim. (5 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "full property/method catalogue is dynamic per projector configuration; source recommends runtime introspection. Firmware version compatibility not stated."
- "firmware version compatibility not stated in source"
- "full runtime API surface dynamic; introspection required per unit"
- "DMX channel mapping in extended mode not enumerated in source"
- "authentication passcode format/value beyond example integer 98765 not stated"

From the AI4AV catalog (https://ai4av.net) · ODbL-1.0