Summary

Control spec for Barco Freya Mfusion projector via the Barco Pulse API. Source is the Barco Pulse RS232 and Network Command Catalog (JSON-RPC 2.0 over TCP port 9090 and RS-232 19200 8N1). Covers power, sources/inputs, illumination, picture settings, warping, blending, optics, DMX, firmware, environment sensors, and event signals.

Transport

protocols:
  - tcp
  - serial
addressing:
  port: 9090  # TCP service port for Pulse API
serial:
  baud_rate: 19200
  data_bits: 8
  parity: none
  stop_bits: 1
  flow_control: none
auth:
  type: passcode  # source: `method: authenticate` with `params.code` (numeric pass code); can be skipped for normal end-user access

TCP framing is line-delimited JSON-RPC 2.0; no HTTP base URL for the RPC channel. Separate HTTP file endpoints exist under /api/ (e.g. /api/image/processing/warp/file/transfer) but those are file transfer, not the RPC transport.

Traits

# powerable       (system.poweron, system.poweroff present)
# routable        (image.window.main.source selection present)
# queryable       (property.get, property.subscribe present)
# levelable       (image.brightness/contrast/gamma/saturation/sharpness, illumination power, optics zoom/focus/lensshift present)

Actions

# Pulse API is JSON-RPC 2.0; commands below use `command:` to carry the literal
# JSON-RPC payload from the source. `command_template` shown in the `notes:`
# field for parameterized ones (where the source shows the variable part).

# --- Authentication ---
- id: authenticate
  label: Authenticate (set access level)
  kind: action
  command: '{"jsonrpc": "2.0", "method": "authenticate", "params": {"code": 98765}, "id": 1}'
  params:
    - name: code
      type: integer
      description: Secret pass code (source example value: 98765)
  notes: "Optional for normal end-user access. Required only to elevate above normal user level."

# --- System / power ---
- id: power_on
  label: Power On
  kind: action
  command: '{"jsonrpc": "2.0", "method": "system.poweron", "params": {"id": 3, "property": "system.state"}, "id": 3}'
  notes: "Source recommends verifying system.state is `standby` or `ready` before invoking. Returns `result: null` (not an error)."

- id: power_off
  label: Power Off
  kind: action
  command: '{"jsonrpc": "2.0", "method": "system.poweroff", "params": {"id": 4, "property": "system.state"}, "id": 4}'
  notes: "Source recommends verifying system.state is `on` before invoking. Returns `result: null`."

- id: system_state_get
  label: Get System State
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": {"property": "system.state", "id": 1}, "id": 1}'
  notes: "Returns one of: boot, eco, standby, ready, conditioning, on, deconditioning, service, error."

- id: system_state_subscribe
  label: Subscribe to System State Changes
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.subscribe", "params": {"property": "system.state", "id": 2}, "id": 2}'

- id: system_standby_enable_set
  label: Enable/Disable Standby State
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "system.standby.enable", "value": true}, "id": 3}'
  notes: "Check availability first via introspection."

- id: system_eco_enable_set
  label: Enable/Disable ECO State
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "system.eco.enable", "value": true}, "id": 3}'
  notes: "Check availability first via introspection."

# --- LED control (example method call) ---
- id: led_blink
  label: Blink System Status LED
  kind: action
  command: '{"jsonrpc": "2.0", "method": "ledctrl.blink", "params": {"led": "systemstatus", "color": "red", "period": 42, "id": 3}, "id": 3}'
  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

# --- Sources / inputs ---
- id: source_list
  label: List Available Sources
  kind: query
  command: '{"jsonrpc": "2.0", "method": "image.source.list", "params": {"id": 1}, "id": 1}'
  notes: "Returns source name list (varies by model). Source example: DVI 1, DVI 2, DisplayPort 1, DisplayPort 2, Dual DVI, Dual DisplayPort, Dual Head DVI, Dual Head DisplayPort, HDBaseT, HDMI, SDI."

- id: source_active_get
  label: Get Active Source
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": {"property": "image.window.main.source", "id": 0}, "id": 0}'

- id: source_active_set
  label: Set Active Source
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "image.window.main.source", "value": "DisplayPort 1", "id": 2}, "id": 2}'
  params:
    - name: value
      type: string
      description: Source name (e.g. "DisplayPort 1", "HDMI"). Get valid values from `image.source.list`.
  notes: "Source recommends waiting for property.set confirmation before issuing another set on the same property."

- id: source_active_subscribe
  label: Subscribe to Active Source Changes
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.subscribe", "params": {"property": "image.window.main.source", "id": 6}, "id": 6}'

- id: connector_list
  label: List Available Connectors
  kind: query
  command: '{"jsonrpc": "2.0", "method": "image.connector.list", "params": {"id": 3}, "id": 3}'
  notes: "Connector set depends on projector model."

- id: source_connector_list
  label: List Connectors for a Source
  kind: query
  command: '{"jsonrpc": "2.0", "method": "image.source.displayport1.listconnectors", "params": {"id": 4}, "id": 4}'
  notes: "Object name = source name with non-word chars stripped and lowercased (e.g. \"DisplayPort 1\" -> \"displayport1\")."

- id: connector_signal_get
  label: Get Detected Signal on Connector
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": {"property": "image.connector.displayport1.detectedsignal", "id": 5}, "id": 5}'
  notes: "Object name = connector name with non-word chars stripped and lowercased."

- id: connector_signal_subscribe
  label: Subscribe to Connector Signal Changes
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.subscribe", "params": {"property": ["image.connector.displayport1.detectedsignal"], "id": 4}, "id": 4}'

# --- Window layout ---
- id: window_position_set
  label: Set Main Window Position
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "image.window.main.position", "value": {"x": 0, "y": 0}, "id": 3}, "id": 3}'
  params:
    - name: x
      type: integer
      description: X position
    - name: y
      type: integer
      description: Y position

- id: window_size_set
  label: Set Main Window Size
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "image.window.main.size", "value": {"width": 0, "height": 0}, "id": 3}, "id": 3}'
  params:
    - name: width
      type: integer
      description: Width
    - name: height
      type: integer
      description: Height

- id: window_scaling_mode_set
  label: Set Window Scaling Mode
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "image.window.main.scalingmode", "value": "Fill", "id": 3}, "id": 3}'
  params:
    - name: value
      type: string
      description: One of Fill, OneToOne, FillScreen, Stretch

# --- Image / picture settings ---
- id: image_brightness_get
  label: Get Image Brightness
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": {"property": "image.brightness", "id": 7}, "id": 7}'
  notes: "Range -1..1 (float), default 0, precision 0.01, step-size 1."

- id: image_brightness_set
  label: Set Image Brightness
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "image.brightness", "value": 0.15, "id": 9}, "id": 9}'
  params:
    - name: value
      type: number
      description: Brightness offset (float -1..1, default 0)

- id: image_brightness_subscribe
  label: Subscribe to Brightness Changes
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.subscribe", "params": {"property": ["image.brightness"], "id": 8}, "id": 8}'

- id: image_contrast_set
  label: Set Image Contrast
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "image.contrast", "value": 1.0, "id": 3}, "id": 3}'
  params:
    - name: value
      type: number
      description: Contrast gain (float 0..2, default 1, precision 0.01)

- id: image_gamma_set
  label: Set Image Gamma
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "image.gamma", "value": 2.2, "id": 3}, "id": 3}'
  params:
    - name: value
      type: number
      description: Gamma (float 1..3, default 2.2, precision 0.1)

- id: image_saturation_set
  label: Set Image Saturation
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "image.saturation", "value": 1.0, "id": 3}, "id": 3}'
  params:
    - name: value
      type: number
      description: Saturation (float 0..2, default 1, precision 0.01)

- id: image_sharpness_set
  label: Set Image Sharpness
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "image.sharpness", "value": 0, "id": 3}, "id": 3}'
  params:
    - name: value
      type: integer
      description: Sharpness (int -2..8, precision 1)

- id: image_orientation_set
  label: Set Image Orientation
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "image.orientation", "value": "DESKTOP_FRONT", "id": 3}, "id": 3}'
  params:
    - name: value
      type: string
      description: One of DESKTOP_FRONT, DESKTOP_REAR, CEILING_FRONT, CEILING_REAR

- id: rgb_mode_next
  label: Cycle to Next RGB Mode
  kind: action
  command: '{"jsonrpc": "2.0", "method": "image.color.rgbmode.nextrgbmode", "params": {"id": 3}, "id": 3}'

- id: color_p7_custom_copy_to_custom
  label: Copy P7 Color Preset to Custom
  kind: action
  command: '{"jsonrpc": "2.0", "method": "image.color.p7.custom.copypresettocustom", "params": {"presetname": "presetname", "id": 3}, "id": 3}'
  params:
    - name: presetname
      type: string
      description: Name of the preset to copy

- id: color_p7_custom_reset_preset
  label: Reset P7 Color Preset to Default
  kind: action
  command: '{"jsonrpc": "2.0", "method": "image.color.p7.custom.resetpreset", "params": {"presetname": "presetname", "id": 3}, "id": 3}'
  params:
    - name: presetname
      type: string
      description: Name of the preset to reset

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

# --- Warping ---
- id: warp_enable_set
  label: Enable/Disable All Warp Functions
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "image.processing.warp.enable", "value": true, "id": 10}, "id": 10}'
  params:
    - name: value
      type: boolean

- id: warp_file_upload
  label: Upload Warp Grid File (HTTP)
  kind: action
  command: 'curl -X POST -F file=@warp.xml http://192.168.1.100/api/image/processing/warp/file/transfer'
  params:
    - name: host
      type: string
      description: Projector IP/hostname
    - name: filename
      type: string
      description: Local warp grid filename (XML, MCM500/400 format)
  notes: "HTTP POST to /api/image/processing/warp/file/transfer; -X POST is implied by -F."

- id: warp_file_select
  label: Select Uploaded Warp File
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "image.processing.warp.file.selected", "value": "warp.xml", "id": 11}, "id": 11}'
  params:
    - name: value
      type: string
      description: Filename to activate

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

# --- Blending ---
- id: blend_file_upload
  label: Upload Blend Mask (HTTP)
  kind: action
  command: 'curl -X POST -F file=@mask.png http://192.168.1.100/api/image/processing/blend/file/transfer'
  params:
    - name: host
      type: string
      description: Projector IP/hostname
    - name: filename
      type: string
      description: Local blend mask filename (PNG/JPEG/TIFF, grayscale 8 or 16 bit; size must match blend layer resolution per projector mode: WUXGA 1920x1200, WQXGA/4K 1280x800, 4K Cinemascope 1280x540)

- id: blend_file_select
  label: Select Blend Files
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "image.processing.blend.file.selected", "value": ["mask.png"], "id": 13}, "id": 13}'
  params:
    - name: value
      type: array
      description: Array of filenames to activate

- id: blend_file_enable_set
  label: Enable/Disable File Blend
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "image.processing.blend.file.enable", "value": true, "id": 14}, "id": 14}'
  params:
    - name: value
      type: boolean

# --- Black level ---
- id: blacklevel_file_upload
  label: Upload Black Level Mask (HTTP)
  kind: action
  command: 'curl -X POST -F file=@blacklevel.png http://192.168.1.100/api/image/processing/blacklevel/file/transfer'
  params:
    - name: host
      type: string
      description: Projector IP/hostname
    - name: filename
      type: string
      description: Local black level mask filename (PNG/JPEG/TIFF, grayscale 8 or 16 bit; size per projector mode as in blend)

- id: blacklevel_file_select
  label: Select Black Level File
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "image.processing.blacklevel.file.selected", "value": "blacklevel.png", "id": 15}, "id": 15}'
  params:
    - name: value
      type: string
      description: Filename to activate

- id: blacklevel_file_enable_set
  label: Enable/Disable Black Level Correction
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "image.processing.blacklevel.file.enable", "value": true, "id": 16}, "id": 16}'
  params:
    - name: value
      type: boolean

# --- Illumination ---
- id: illumination_state_get
  label: Get Illumination State
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": {"property": "illumination.state", "id": 0}, "id": 0}'
  notes: "Returns On or Off."

- id: illumination_state_subscribe
  label: Subscribe to Illumination State Changes
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.subscribe", "params": {"property": "illumination.state", "id": 1}, "id": 1}'

- id: illumination_sources_introspect
  label: Introspect Illumination Sources
  kind: query
  command: '{"jsonrpc": "2.0", "method": "introspect", "params": {"object": "illumination.sources", "recursive": false, "id": 2}, "id": 2}'
  notes: "Discovers which illumination sources exist (e.g. laser, LED, UHP, xenon)."

- id: illumination_laser_power_get
  label: Get Laser Power
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": {"property": "illumination.sources.laser.power", "id": 3}, "id": 3}'
  notes: "Power as percent. Read min/max with `illumination.sources.laser.minpower` and `illumination.sources.laser.maxpower`."

- id: illumination_laser_power_set
  label: Set Laser Power
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "illumination.sources.laser.power", "value": 40, "id": 5}, "id": 5}'
  params:
    - name: value
      type: number
      description: Target power in percent (float, RW)

- id: illumination_laser_power_subscribe
  label: Subscribe to Laser Power Changes
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.subscribe", "params": {"property": ["illumination.sources.laser.power"], "id": 4}, "id": 4}'

- id: illumination_laser_minpower_get
  label: Get Laser Min Power
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": {"property": "illumination.sources.laser.minpower", "id": 6}, "id": 6}'

- id: illumination_laser_maxpower_get
  label: Get Laser Max Power
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": {"property": "illumination.sources.laser.maxpower", "id": 5}, "id": 5}'

- id: illumination_clo_engage
  label: Engage CLO at Current Light Level
  kind: action
  command: '{"jsonrpc": "2.0", "method": "illumination.clo.engage", "params": {"id": 3}, "id": 3}'

- id: illumination_laser_get_serial
  label: Get Laser Serial Number
  kind: query
  command: '{"jsonrpc": "2.0", "method": "illumination.laser.getserialnumber", "params": {"id": 3}, "id": 3}'

# --- Optics ---
- id: shutter_position_get
  label: Get Shutter Position
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": {"property": "optics.shutter.position", "id": 3}, "id": 3}'
  notes: "Returns Open or Closed."

- id: shutter_target_set
  label: Set Shutter Target
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "optics.shutter.target", "value": "Open", "id": 3}, "id": 3}'
  params:
    - name: value
      type: string
      description: Open or Closed

- id: optics_zoom_position_get
  label: Get Zoom Position
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": {"property": "optics.zoom.position", "id": 3}, "id": 3}'

- id: optics_focus_position_get
  label: Get Focus Position
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": {"property": "optics.focus.position", "id": 3}, "id": 3}'

- id: optics_lensshift_horizontal_get
  label: Get Horizontal Lens Shift
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": {"property": "optics.lensshift.horizontal.position", "id": 3}, "id": 3}'

- id: optics_lensshift_vertical_get
  label: Get Vertical Lens Shift
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": {"property": "optics.lensshift.vertical.position", "id": 3}, "id": 3}'

# --- DMX ---
- id: dmx_mode_set
  label: Set DMX Mode
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "dmx.mode", "value": "basic", "id": 3}, "id": 3}'
  params:
    - name: value
      type: string

- id: dmx_mode_get
  label: Get DMX Mode
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": {"property": "dmx.mode", "id": 3}, "id": 3}'

- id: dmx_startchannel_set
  label: Set DMX Start Channel
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "dmx.startchannel", "value": 1, "id": 3}, "id": 3}'
  params:
    - name: value
      type: integer
      description: 1..512

- id: dmx_startchannel_get
  label: Get DMX Start Channel
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": {"property": "dmx.startchannel", "id": 3}, "id": 3}'

- id: dmx_shutdown_set
  label: Set DMX Shutdown
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": {"property": "dmx.shutdown", "value": false, "id": 3}, "id": 3}'
  params:
    - name: value
      type: boolean

- id: dmx_listchannels
  label: List DMX Channel Names
  kind: query
  command: '{"jsonrpc": "2.0", "method": "dmx.listchannels", "params": {"id": 3}, "id": 3}'

- id: dmx_listmodes
  label: List DMX Modes
  kind: query
  command: '{"jsonrpc": "2.0", "method": "dmx.listmodes", "params": {"id": 3}, "id": 3}'

# --- Network ---
- id: network_lan_ip4config_get
  label: Get LAN IPv4 Configuration
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": {"property": "network.device.lan.ip4config", "id": 3}, "id": 3}'
  notes: "Returns object with Address, Mask, Gateway, NameServers."

- id: network_lan_state_get
  label: Get LAN State
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": {"property": "network.device.lan.state", "id": 3}, "id": 3}'
  notes: "Returns CONNECTED or DISCONNECTED."

# --- Environment ---
- id: environment_temperatures_get
  label: Get All Temperature Sensors
  kind: query
  command: '{"jsonrpc": "2.0", "method": "environment.getcontrolblocks", "params": {"type": "Sensor", "valuetype": "Temperature", "id": 18}, "id": 18}'

- id: environment_fan_speeds_get
  label: Get All Fan Speeds
  kind: query
  command: '{"jsonrpc": "2.0", "method": "environment.getcontrolblocks", "params": {"type": "Sensor", "valuetype": "Speed", "id": 19}, "id": 19}'

- id: environment_getcontrolblocks
  label: Get Environment Control Blocks (Generic)
  kind: query
  command: '{"jsonrpc": "2.0", "method": "environment.getcontrolblocks", "params": {"type": "Sensor", "valuetype": "Temperature", "id": 3}, "id": 3}'
  notes: "Sensor types: Sensor, Filter, Controller, Actuator, Alarm, GenericBlock. Sensor 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, State, Pump, Resistance, Simulation, Constant, Manual, Range, Any."

- id: environment_getalarminfo
  label: Get Alarm Info
  kind: query
  command: '{"jsonrpc": "2.0", "method": "environment.getalarminfo", "params": {"id": 3}, "id": 3}'

- id: environment_alarmstate_get
  label: Get Environment Alarm State
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": {"property": "environment.alarmstate", "id": 3}, "id": 3}'
  notes: "Returns one of: Fatal, Error, Alert, Warning, Ok."

# --- Firmware ---
- id: firmware_listcomponents
  label: List Firmware Components
  kind: query
  command: '{"jsonrpc": "2.0", "method": "firmware.listcomponents", "params": {"id": 3}, "id": 3}'

- id: firmware_listcomponentversionstatus
  label: List Firmware Component Versions and Status
  kind: query
  command: '{"jsonrpc": "2.0", "method": "firmware.listcomponentversionstatus", "params": {"id": 3}, "id": 3}'
  notes: "Status enum: Unknown, OK, Upgradable."

- id: firmware_schedulecomponentupgrade
  label: Schedule Firmware Component Upgrade on Next Reboot
  kind: action
  command: '{"jsonrpc": "2.0", "method": "firmware.schedulecomponentupgrade", "params": {"id": 3}, "id": 3}'

# --- Introspection ---
- id: introspect_recursive
  label: Introspect Object Tree (Recursive)
  kind: query
  command: '{"jsonrpc": "2.0", "method": "introspect", "params": {"object": "foo", "recursive": true, "id": 1}, "id": 1}'
  params:
    - name: object
      type: string
      description: Object name in dot notation (empty introspects everything)
    - name: recursive
      type: boolean
      description: If false, only one level of objects is listed

- id: introspect_non_recursive
  label: Introspect Object Tree (Non-Recursive)
  kind: query
  command: '{"jsonrpc": "2.0", "method": "introspect", "params": {"object": "motors", "recursive": false, "id": 2}, "id": 2}'

# --- Subscriptions / signals ---
- id: property_get_multiple
  label: Get Multiple Property Values
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": {"property": ["image.brightness", "image.contrast"], "id": 5}, "id": 5}'
  notes: "Returns dictionary keyed by full property name."

- id: property_subscribe_multiple
  label: Subscribe to Multiple Properties
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.subscribe", "params": {"property": ["image.brightness", "image.contrast"], "id": 7}, "id": 7}'

- id: property_unsubscribe_one
  label: Unsubscribe from One Property
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.unsubscribe", "params": {"property": "image.brightness", "id": 8}, "id": 8}'

- id: property_unsubscribe_multiple
  label: Unsubscribe from Multiple Properties
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.unsubscribe", "params": {"property": ["image.brightness", "image.contrast"], "id": 9}, "id": 9}'

- id: signal_subscribe_one
  label: Subscribe to One Signal
  kind: action
  command: '{"jsonrpc": "2.0", "method": "signal.subscribe", "params": {"signal": "modelupdated", "id": 10}, "id": 10}'

- id: signal_subscribe_multiple
  label: Subscribe to Multiple Signals
  kind: action
  command: '{"jsonrpc": "2.0", "method": "signal.subscribe", "params": {"signal": ["modelupdated", "image.processing.warp.gridchanged"], "id": 11}, "id": 11}'

- id: signal_unsubscribe_one
  label: Unsubscribe from One Signal
  kind: action
  command: '{"jsonrpc": "2.0", "method": "signal.unsubscribe", "params": {"signal": "modelupdated", "id": 12}, "id": 12}'

- id: signal_unsubscribe_multiple
  label: Unsubscribe from Multiple Signals
  kind: action
  command: '{"jsonrpc": "2.0", "method": "signal.unsubscribe", "params": {"signal": ["modelupdated", "image.processing.warp.gridchanged"], "id": 13}, "id": 13}'

# --- ECO wake (serial) ---
- id: eco_wake_serial
  label: Wake Projector from ECO Mode via Serial
  kind: action
  command: ":POWR1\r"
  notes: "ASCII sent on RS-232 serial port. Other wake methods: Wake-on-LAN (MAC), remote power button, keypad power button."

Feedbacks

- id: system_state
  type: enum
  values: [boot, eco, standby, ready, conditioning, on, deconditioning, service, error]
- id: illumination_state
  type: enum
  values: [On, Off]
- id: image_window_main_source
  type: string
- id: image_window_main_scalingmode
  type: enum
  values: [Fill, OneToOne, FillScreen, Stretch]
- 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: illumination_sources_laser_power
  type: float
  unit: percent
- id: illumination_sources_laser_minpower
  type: float
  unit: percent
- id: illumination_sources_laser_maxpower
  type: float
  unit: percent
- 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: dmx_mode
  type: string
- id: dmx_startchannel
  type: integer
  range: [1, 512]
- id: dmx_shutdown
  type: boolean
- id: network_device_lan_state
  type: enum
  values: [CONNECTED, DISCONNECTED]
- id: network_device_lan_ip4config
  type: object
  properties: [Address, Mask, Gateway, NameServers]
- id: environment_alarmstate
  type: enum
  values: [Fatal, Error, Alert, Warning, Ok]
- id: environment_temperatures
  type: object
  description: Dictionary of temperature sensor readings (e.g. environment.laser.board0.bank0.temperature)
- id: environment_fan_speeds
  type: object
  description: Dictionary of fan tachometer readings (e.g. environment.fan.ar1.tacho)
- id: firmware_component_status
  type: enum
  values: [Unknown, OK, Upgradable]
- id: image_connector_detectedsignal
  type: object
  description: Signal descriptor (active, name, resolutions, frequencies, scan, color_space, chroma, gamma, etc.)

Variables

# Parameters that are settable scalars but documented as properties. Each maps
# to a property.set action above. Listed here as the conceptual "what can be
# adjusted at runtime" view; the action list is the executable form.
- id: image_brightness
  type: float
  range: [-1, 1]
  property: image.brightness
- id: image_contrast
  type: float
  range: [0, 2]
  property: image.contrast
- id: image_gamma
  type: float
  range: [1, 3]
  property: image.gamma
- id: image_saturation
  type: float
  range: [0, 2]
  property: image.saturation
- id: image_sharpness
  type: integer
  range: [-2, 8]
  property: image.sharpness
- id: illumination_sources_laser_power
  type: float
  unit: percent
  property: illumination.sources.laser.power
- id: image_window_main_position
  type: object
  properties: {x: int, y: int}
  property: image.window.main.position
- id: image_window_main_size
  type: object
  properties: {width: int, height: int}
  property: image.window.main.size

Events

# Server-to-client notifications. JSON-RPC requests from the server have no
# `id` and require no response. Source documents these notification methods
# the client must implement:
- id: property_changed
  description: Emitted when a subscribed property changes value. Params carry an array of {property: value} pairs.
  example: '{"jsonrpc": "2.0", "method": "property.changed", "params": {"property": [{"illumination.state": "On"}]}}'
- id: signal_callback
  description: Emitted when a subscribed signal fires. Params carry an array of {signal: args} pairs.
  example: '{"jsonrpc": "2.0", "method": "signal.callback", "params": {"signal": [{"introspect.objectchanged": {"object": "motors.motor1", "newobject": true}}]}}'
# Known signals (per source):
- id: signal_modelupdated
  description: Triggered when the introspect model changes (objects added or removed)
- id: signal_introspect_objectchanged
  description: Fires with `object` and `isnew` (true=new, false=lost) when objects are added or removed

Macros

# Multi-step procedures described explicitly in source.
- id: warp_grid_upload_and_activate
  label: Upload, Select, and Enable Warp Grid
  steps:
    - action: warp_file_upload
    - action: warp_file_select
    - action: warp_file_enable_set
    - action: warp_enable_set
  notes: "Source sequence for uploading and activating a warp grid file."

- id: blend_mask_upload_and_activate
  label: Upload, Select, and Enable Blend Mask
  steps:
    - action: blend_file_upload
    - action: blend_file_select
    - action: blend_file_enable_set

- id: blacklevel_mask_upload_and_activate
  label: Upload, Select, and Enable Black Level Mask
  steps:
    - action: blacklevel_file_upload
    - action: blacklevel_file_select
    - action: blacklevel_file_enable_set

- id: safe_power_on
  label: Safe Power-On
  steps:
    - action: system_state_get
    - check: "system.state in [standby, ready]"
    - action: power_on

- id: safe_power_off
  label: Safe Power-Off
  steps:
    - action: system_state_get
    - check: "system.state == on"
    - action: power_off

- id: wake_from_eco
  label: Wake Projector from ECO Mode
  steps:
    - action: eco_wake_serial
  notes: "Source lists four wake methods; choose one. Serial ASCII \":POWR1\\r\" is the documented JSON-RPC/serial path."

Safety

confirmation_required_for: []
interlocks: []
# Source advises verifying system.state is `standby` or `ready` before power_on,
# and `on` before power_off (idempotent but no-op during state transitions).
# No explicit interlock, lockout, or hazard procedures in the source.

Notes

  • Protocol: JSON-RPC 2.0 over TCP port 9090; identical commands are also available over RS-232 serial at 19200 8N1. RS-232 also accepts the ASCII wake command :POWR1\r to wake from ECO.
  • Authentication: Optional authenticate request with numeric code; not required for normal end-user access. Pass code shown in source: 98765 (example value only).
  • Property vs Method: Properties are addressable state with property.get/property.set/property.subscribe. Methods are RPC calls without persistent state. The catalog at the end of the document enumerates both.
  • File endpoints: File transfer uses HTTP POST to /api/<path>/file/transfer (e.g. /api/image/processing/warp/file/transfer). This is separate from the JSON-RPC TCP channel.
  • Object naming: Object names use lowercase dot notation; source/connector names are normalized by stripping non-word characters and lowercasing (e.g. DisplayPort 1 -> displayport1).
  • Introspection-first: Per the source, the actual API surface depends on model and peripherals. Use method: introspect to enumerate objects before issuing property/method calls. Lenses without motorized zoom, for example, will not expose optics.zoom.position.
  • DMX modes: Basic DMX exposes 2 channels; extended modes expose more (not enumerated in source).
  • ECO mode: Cannot be reached via the standard power-off command; has dedicated wake-up paths (WOL, remote, keypad, serial :POWR1\r).
  • Source: Barco Pulse API — "RS232 and Network Command Catalog" (refined excerpt at docs/pdfs/barco_freya_mfusion_ip.refined.md).

Provenance

source_domains:
  - audiogeneral.com
source_urls:
  - "https://www.audiogeneral.com/barco/UDX%20Series/JSON_ReferenceGuide.pdf"
retrieved_at: 2026-08-04T06:10:08.958Z
last_checked_at: 2026-08-05T08:02:40.337Z

Verification Summary

verdict: verified
checked_at: 2026-08-05T08:02:40.337Z
matched_actions: 85
action_count: 85
confidence: medium
summary: "All 85 spec actions match source wire tokens verbatim (JSON-RPC methods, property paths, file endpoints, and serial wake command); transport fully verified. (2 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "This spec reflects the Barco Pulse API generally; Freya Mfusion-specific peripherals (e.g. which illumination sources, which connectors, which optics) are not enumerated in the source. Use introspection (`method: introspect`) to discover the actual object tree for a given unit."
- "- Firmware version compatibility / minimum firmware for the listed API not stated in source."

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