Summary

Network and serial control spec for the Barco Freya Plus Mfusion projector, covering the Pulse JSON-RPC API over TCP/IP (port 9090) and RS-232 (19200 8N1). Includes authentication, power, source selection, illumination, picture settings, warp/blend/blacklevel file upload, and environmental introspection.

Transport

protocols:
  - tcp
  - serial
addressing:
  port: 9090
serial:
  baud_rate: 19200
  data_bits: 8
  parity: none
  stop_bits: 1
  flow_control: none
auth:
  type: passcode  # authenticate method with code param; not required for normal end-user access

Traits

- powerable
- routable
- queryable
- levelable

Actions

- id: authenticate
  label: Authenticate
  kind: action
  command: '{"jsonrpc": "2.0", "method": "authenticate", "params": { "id": 1, "code": 98765 }}'
  params:
    - name: code
      type: integer
      description: Secret pass code; sets the user access level. Skippable for normal end-user access.

- id: system_poweron
  label: Power On
  kind: action
  command: '{"jsonrpc": "2.0", "method": "system.poweron", "params": { "id": 3, "property": "system.state" }}'
  params: []

- id: system_poweroff
  label: Power Off
  kind: action
  command: '{"jsonrpc": "2.0", "method": "system.poweroff", "params": { "id": 4, "property": "system.state" }}'
  params: []

- id: system_state_get
  label: Get System State
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": { "id": 1, "property": "system.state" }}'
  params: []

- id: system_state_subscribe
  label: Subscribe to System State
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.subscribe", "params": { "id": 2, "property": "system.state" }}'
  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: list_available_sources
  label: List Available Sources
  kind: query
  command: '{"jsonrpc": "2.0", "method": "image.source.list", "params": { "id": 1 }}'
  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}" }}'
  params:
    - name: source
      type: string
      description: Source name returned by image.source.list (e.g. "DisplayPort 1", "HDMI", "HDBaseT", "SDI", "DVI 1", "DVI 2", "Dual DVI", "Dual DisplayPort", "Dual Head DVI", "Dual Head DisplayPort").

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

- id: list_source_connectors
  label: List Source Connectors
  kind: query
  command: '{"jsonrpc": "2.0", "method": "image.source.{source}.listconnectors", "params": { "id": 4 }}'
  params:
    - name: source
      type: string
      description: Source object name (e.g. displayport1) derived by lowercasing the source name and stripping non-word characters.

- id: get_connector_signal
  label: Get Connector Detected Signal
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": { "id": 5, "property": "image.connector.{connector}.detectedsignal" }}'
  params:
    - name: connector
      type: string
      description: Connector object name (e.g. l1hdmi, displayport1).

- id: subscribe_source_property
  label: Subscribe to Window Source Property
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.subscribe", "params": { "id": 6, "property": "image.window.main.source" }}'
  params: []

- id: subscribe_connector_signal
  label: Subscribe to Connector Detected Signal
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.subscribe", "params": { "property": "image.connector.{connector}.detectedsignal" }}'
  params:
    - name: connector
      type: string
      description: Connector object name (e.g. l1hdmi).

- id: get_illumination_state
  label: Get Illumination State
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": { "id": 0, "property": "illumination.state" }}'
  params: []

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

- id: introspect_illumination_sources
  label: Introspect Illumination Sources
  kind: query
  command: '{"jsonrpc": "2.0", "method": "introspect", "params": { "property": "illumination.sources", "recursive": false }}'
  params: []

- id: get_laser_power
  label: Get Laser Power
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": { "id": 3, "property": "illumination.sources.laser.power" }}'
  params: []

- id: set_laser_power
  label: Set Laser Power
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": { "id": 5, "property": "illumination.sources.laser.power", "value": {level} }}'
  params:
    - name: level
      type: integer
      description: Target power in percent (within minpower/maxpower range).

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

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

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

- id: get_brightness
  label: Get Brightness
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": { "id": 7, "property": "image.brightness" }}'
  params: []

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

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

- id: set_contrast
  label: Set Contrast
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": { "property": "image.contrast", "value": {value} }}'
  params:
    - name: value
      type: float
      description: Normalized contrast. 1 is default. Range 0..2, step 0.01.

- id: set_gamma
  label: Set Gamma
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": { "property": "image.gamma", "value": {value} }}'
  params:
    - name: value
      type: float
      description: Gamma value. Default 2.2. Range 1..3, step 0.1.

- id: set_saturation
  label: Set Saturation
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": { "property": "image.saturation", "value": {value} }}'
  params:
    - name: value
      type: float
      description: Normalized saturation. 1 is default. Range 0..2, step 0.01.

- id: set_sharpness
  label: Set Sharpness
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": { "property": "image.sharpness", "value": {value} }}'
  params:
    - name: value
      type: integer
      description: Normalized sharpness. Range -2..8, step 1.

- id: set_orientation
  label: Set Orientation
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": { "property": "image.orientation", "value": "{orientation}" }}'
  params:
    - name: orientation
      type: enum
      values: [DESKTOP_FRONT, DESKTOP_REAR, CEILING_FRONT, CEILING_REAR]

- id: set_window_position
  label: Set Window Position
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": { "property": "image.window.main.position", "value": { "x": {x}, "y": {y} } }}'
  params:
    - name: x
      type: integer
    - name: y
      type: integer

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

- id: set_scaling_mode
  label: Set Window Scaling Mode
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": { "property": "image.window.main.scalingmode", "value": "{mode}" }}'
  params:
    - name: mode
      type: enum
      values: [Fill, OneToOne, FillScreen, Stretch]

- id: introspect_image
  label: Introspect Image Service
  kind: query
  command: '{"jsonrpc": "2.0", "method": "introspect", "params": { "object": "image", "recursive": false }}'
  params: []

- id: set_warp_enable
  label: Enable Warp Globally
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": { "id": 10, "property": "image.processing.warp.enable", "value": true }}'
  params: []

- id: upload_warp_file
  label: Upload Warp File
  kind: action
  command: 'curl -X POST -F file=@warp.xml http://{host}/api/image/processing/warp/file/transfer'
  params:
    - name: host
      type: string
      description: Projector IP address (e.g. 192.168.1.100).

- id: select_warp_file
  label: Select 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: enable_warp_file
  label: Enable File Warp
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": { "id": 12, "property": "image.processing.warp.file.enable", "value": true }}'
  params: []

- id: upload_blend_mask
  label: Upload Blend Mask
  kind: action
  command: 'curl -X POST -F file=@mask.png http://{host}/api/image/processing/blend/file/transfer'
  params:
    - name: host
      type: string
      description: Projector IP address.

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

- id: enable_blend_file
  label: Enable File Blend
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": { "id": 14, "property": "image.processing.blend.file.enable", "value": true }}'
  params: []

- id: upload_blacklevel_mask
  label: Upload Black Level Mask
  kind: action
  command: 'curl -X POST -F file=@blacklevel.png http://{host}/api/image/processing/blacklevel/file/transfer'
  params:
    - name: host
      type: string
      description: Projector IP address.

- id: select_blacklevel_file
  label: Select 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: enable_blacklevel_file
  label: Enable File Black Level
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": { "id": 16, "property": "image.processing.blacklevel.file.enable", "value": true }}'
  params: []

- id: get_environment_temperatures
  label: Get Temperature Sensors
  kind: query
  command: '{"jsonrpc": "2.0", "method": "environment.getcontrolblocks", "params": { "id": 18, "type": "Sensor", "valuetype": "Temperature" }}'
  params: []

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

- id: get_environment_controlblocks
  label: Get Environment Control Blocks
  kind: query
  command: '{"jsonrpc": "2.0", "method": "environment.getcontrolblocks", "params": { "type": "{type}", "valuetype": "{valuetype}" }}'
  params:
    - name: type
      type: enum
      values: [Sensor, Filter, Controller, Actuator, Alarm, GenericBlock]
    - name: valuetype
      type: enum
      values: [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_environment_alarm_info
  label: Get Alarm Info
  kind: query
  command: '{"jsonrpc": "2.0", "method": "environment.getalarminfo", "params": {} }'
  params: []

- id: get_environment_alarm_state
  label: Get Environment Alarm State
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": { "property": "environment.alarmstate" }}'
  params: []

- id: set_standby_enable
  label: Set Standby Enable
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": { "property": "system.standby.enable", "value": {value} }}'
  params:
    - name: value
      type: boolean

- id: set_eco_enable
  label: Set ECO Enable
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": { "property": "system.eco.enable", "value": {value} }}'
  params:
    - name: value
      type: boolean

- id: wake_from_eco_serial
  label: Wake From ECO via Serial
  kind: action
  command: ':POWR1\r'
  params: []

- id: set_shutter_target
  label: Set Shutter Target
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": { "property": "optics.shutter.target", "value": "{target}" }}'
  params:
    - name: target
      type: enum
      values: [Open, Closed]

- id: get_shutter_position
  label: Get Shutter Position
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": { "property": "optics.shutter.position" }}'
  params: []

- id: set_optics_zoom
  label: Set Zoom Position
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": { "property": "optics.zoom.position", "value": {position} }}'
  params:
    - name: position
      type: integer

- id: set_optics_focus
  label: Set Focus Position
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": { "property": "optics.focus.position", "value": {position} }}'
  params:
    - name: position
      type: integer

- id: set_optics_lensshift_horizontal
  label: Set Lens Shift Horizontal
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": { "property": "optics.lensshift.horizontal.position", "value": {position} }}'
  params:
    - name: position
      type: integer

- id: set_optics_lensshift_vertical
  label: Set Lens Shift Vertical
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": { "property": "optics.lensshift.vertical.position", "value": {position} }}'
  params:
    - name: position
      type: integer

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

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

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

- id: list_dmx_channels
  label: List DMX Channels
  kind: query
  command: '{"jsonrpc": "2.0", "method": "dmx.listchannels", "params": {} }'
  params: []

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

- id: get_lan_ipv4_config
  label: Get LAN IPv4 Config
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": { "property": "network.device.lan.ip4config" }}'
  params: []

- id: get_lan_state
  label: Get LAN State
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": { "property": "network.device.lan.state" }}'
  params: []

- id: set_lan_ipv4_config
  label: Set LAN IPv4 Config
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": { "property": "network.device.lan.ip4config", "value": { "Address": "{address}", "Mask": "{mask}", "Gateway": "{gateway}", "NameServers": "{nameservers}" } }}'
  params:
    - name: address
      type: string
    - name: mask
      type: string
    - name: gateway
      type: string
    - name: nameServers
      type: string

- id: introspect_recursive
  label: Introspect Recursive (object form)
  kind: query
  command: '{"jsonrpc": "2.0", "method": "introspect", "params": { "object": "{object}", "recursive": true, "id": 1 }}'
  params:
    - name: object
      type: string
      description: Object name in dot notation; empty introspects everything.

- id: introspect_recursive_positional
  label: Introspect Recursive (positional form)
  kind: query
  command: '{"jsonrpc": "2.0", "method": "introspect", "params": ["{object}", true], "id": 1}'
  params:
    - name: object
      type: string

- id: introspect_nonrecursive
  label: Introspect Non-Recursive (object form)
  kind: query
  command: '{"jsonrpc": "2.0", "method": "introspect", "params": { "object": "{object}", "recursive": false, "id": 2 }}'
  params:
    - name: object
      type: string

- id: introspect_nonrecursive_positional
  label: Introspect Non-Recursive (positional form)
  kind: query
  command: '{"jsonrpc": "2.0", "method": "introspect", "params": ["{object}", false], "id": 2}'
  params:
    - name: object
      type: string

- id: subscribe_modelupdated
  label: Subscribe to Model Updated Signal
  kind: action
  command: '{"jsonrpc": "2.0", "method": "signal.subscribe", "params": { "id": 2, "signal": "modelupdated" }}'
  params: []

- id: ledctrl_blink
  label: Blink System Status LED
  kind: action
  command: '{"jsonrpc": "2.0", "method": "ledctrl.blink", "params": { "id": 3, "led": "systemstatus", "color": "{color}", "period": {period} }}'
  params:
    - name: led
      type: string
      description: LED identifier (e.g. systemstatus).
    - name: color
      type: string
      description: Color name (e.g. red).
    - name: period
      type: integer
      description: Blink period.

- id: property_get
  label: Generic Property Get
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": { "id": {id}, "property": "{property}" }}'
  params:
    - name: property
      type: string
    - name: id
      type: integer
      description: Request identifier.

- id: property_set
  label: Generic Property Set
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.set", "params": { "id": {id}, "property": "{property}", "value": {value} }}'
  params:
    - name: property
      type: string
    - name: value
      description: Value to set; type per property.
    - name: id
      type: integer

- id: property_get_multiple
  label: Property Get Multiple
  kind: query
  command: '{"jsonrpc": "2.0", "method": "property.get", "params": { "id": 5, "property": ["{p1}", "{p2}"] }}'
  params:
    - name: properties
      type: string
      description: Array of property names.

- id: property_subscribe
  label: Generic Property Subscribe
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.subscribe", "params": { "id": {id}, "property": "{property}" }}'
  params:
    - name: property
      type: string
    - name: id
      type: integer

- id: property_subscribe_multiple
  label: Property Subscribe Multiple
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.subscribe", "params": { "id": 7, "property": ["{p1}", "{p2}"] }}'
  params:
    - name: properties
      type: string

- id: property_unsubscribe
  label: Generic Property Unsubscribe
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.unsubscribe", "params": { "id": 8, "property": "{property}" }}'
  params:
    - name: property
      type: string

- id: property_unsubscribe_multiple
  label: Property Unsubscribe Multiple
  kind: action
  command: '{"jsonrpc": "2.0", "method": "property.unsubscribe", "params": { "id": 9, "property": ["{p1}", "{p2}"] }}'
  params:
    - name: properties
      type: string

- id: signal_subscribe
  label: Signal Subscribe
  kind: action
  command: '{"jsonrpc": "2.0", "method": "signal.subscribe", "params": { "id": 10, "signal": "{signal}" }}'
  params:
    - name: signal
      type: string

- id: signal_subscribe_multiple
  label: Signal Subscribe Multiple
  kind: action
  command: '{"jsonrpc": "2.0", "method": "signal.subscribe", "params": { "id": 11, "signal": ["{s1}", "{s2}"] }}'
  params:
    - name: signals
      type: string

- id: signal_unsubscribe
  label: Signal Unsubscribe
  kind: action
  command: '{"jsonrpc": "2.0", "method": "signal.unsubscribe", "params": { "id": 12, "signal": "{signal}" }}'
  params:
    - name: signal
      type: string

- id: signal_unsubscribe_multiple
  label: Signal Unsubscribe Multiple
  kind: action
  command: '{"jsonrpc": "2.0", "method": "signal.unsubscribe", "params": { "id": 13, "signal": ["{s1}", "{s2}"] }}'
  params:
    - name: signals
      type: string

- id: firmware_list_components
  label: List Firmware Components
  kind: query
  command: '{"jsonrpc": "2.0", "method": "firmware.listcomponents", "params": {} }'
  params: []

- id: firmware_list_component_version_status
  label: List Firmware Component Version Status
  kind: query
  command: '{"jsonrpc": "2.0", "method": "firmware.listcomponentversionstatus", "params": {} }'
  params: []

- id: firmware_schedule_component_upgrade
  label: Schedule Firmware Component Upgrade
  kind: action
  command: '{"jsonrpc": "2.0", "method": "firmware.schedulecomponentupgrade", "params": { "component": "{component}" }}'
  params:
    - name: component
      type: string

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

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

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

- id: p7_reset_preset
  label: P7 Reset Preset to Defaults
  kind: action
  command: '{"jsonrpc": "2.0", "method": "image.color.p7.custom.resetpreset", "params": { "presetname": "{presetname}" }}'
  params:
    - name: presetname
      type: string

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

- id: rgb_next_mode
  label: Next RGB Mode
  kind: action
  command: '{"jsonrpc": "2.0", "method": "image.color.rgbmode.nextrgbmode", "params": {} }'
  params: []

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: environment_alarm_state
  type: enum
  values: [Fatal, Error, Alert, Warning, Ok]

- id: lan_state
  type: enum
  values: [CONNECTED, DISCONNECTED]

- id: shutter_position
  type: enum
  values: [Open, Closed]

- id: shutter_target
  type: enum
  values: [Open, Closed]

- id: scaling_mode
  type: enum
  values: [Fill, OneToOne, FillScreen, Stretch]

- id: orientation
  type: enum
  values: [DESKTOP_FRONT, DESKTOP_REAR, CEILING_FRONT, CEILING_REAR]

- id: connector_detected_signal
  type: object
  description: Reported via image.connector.{name}.detectedsignal; fields include active, name, 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, bits_per_component, color_space, signal_range, chroma_sampling, gamma_type, color_primaries, mastering_luminance, content_aspect_ratio, is_stereo, stereo_mode.

- id: scanner_scan
  type: enum
  values: [Progressive]

- id: signal_range
  type: enum
  values: ["0-255", "16-235"]

- id: chroma_sampling
  type: enum
  values: ["4:4:4", "4:2:2", "4:2:0"]

- id: gamma_type
  type: enum
  values: [POWER, sRGB, REC_BT1886, SMPTE_ST2084]

- id: color_primaries
  type: enum
  values: [REC709, REC2020, DCI-P3-D65, DCI-P3-Theater]

- id: content_aspect_ratio
  type: enum
  values: ["5:4", "4:3", "16:10", "16:9", "1.85:1", "2.20:1", "2.35:1", "2.37:1", "2.39:1", Unknown]

- id: stereo_mode
  type: enum
  values: [None, Sequential, FramePacked, TopBottom, SideBySide]

- id: firmware_status
  type: enum
  values: [Unknown, OK, Upgradable]

Variables

- id: image_brightness
  type: float
  range: [-1.0, 1.0]
  default: 0.0
  description: Image brightness/offset. 0 is default, 1 is 100% offset.

- id: image_contrast
  type: float
  range: [0.0, 2.0]
  default: 1.0
  description: Image contrast/gain. 1 is default.

- id: image_gamma
  type: float
  range: [1.0, 3.0]
  default: 2.2
  description: Image gamma.

- id: image_saturation
  type: float
  range: [0.0, 2.0]
  default: 1.0
  description: Image color saturation.

- id: image_sharpness
  type: integer
  range: [-2, 8]
  description: Image sharpness.

- id: illumination_laser_power
  type: integer
  unit: percent
  description: Target laser illumination power. Dynamic min/max available via minpower/maxpower.

- id: illumination_laser_minpower
  type: integer
  unit: percent
  read_only: true

- id: illumination_laser_maxpower
  type: integer
  unit: percent
  read_only: true

- 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: window_position
  type: object
  fields:
    - name: x
      type: integer
    - name: y
      type: integer

- id: window_size
  type: object
  fields:
    - name: width
      type: integer
    - name: height
      type: integer

- id: dmx_start_channel
  type: integer
  range: [1, 512]

- id: dmx_shutdown
  type: boolean

- id: dmx_mode
  type: string

- id: standby_enable
  type: boolean

- id: eco_enable
  type: boolean

- id: lan_ipv4_config
  type: object
  fields:
    - name: Address
      type: string
    - name: Mask
      type: string
    - name: Gateway
      type: string
    - name: NameServers
      type: string

Events

- id: property_changed
  description: Notification emitted by the device when a subscribed property value changes. Carries an array of property/value pairs under method property.changed. Must be implemented client-side.

- id: signal_callback
  description: Notification emitted when a subscribed signal fires. Carries an array of signal/argument-list pairs under method signal.callback. Must be implemented client-side.

- id: modelupdated
  description: Signal triggered when the object structure changes (objects added or removed). Subscribe via signal.subscribe with signal "modelupdated".

- id: introspect_objectchanged
  description: Signal payload format for object structure changes: { "object": "<name>", "isnew": <bool> }.

Macros

- id: power_on_with_state_check
  description: Verify projector state is standby or ready before issuing power on.
  steps:
    - property.get system.state
    - if state in {standby, ready}: system.poweron

- id: power_off_with_state_check
  description: Verify projector state is on before issuing power off.
  steps:
    - property.get system.state
    - if state == on: system.poweroff

- id: warp_full_workflow
  description: Enable warp, upload warp grid, select file, enable file warp.
  steps:
    - property.set image.processing.warp.enable = true
    - curl -X POST -F file=@warp.xml http://<host>/api/image/processing/warp/file/transfer
    - property.set image.processing.warp.file.selected = 
    - property.set image.processing.warp.file.enable = true

- id: blend_workflow
  description: Upload blend mask, select file, enable blend.
  steps:
    - curl -X POST -F file=@mask.png http://<host>/api/image/processing/blend/file/transfer
    - property.set image.processing.blend.file.selected = 
    - property.set image.processing.blend.file.enable = true

- id: blacklevel_workflow
  description: Upload black level mask, select file, enable black level.
  steps:
    - curl -X POST -F file=@blacklevel.png http://<host>/api/image/processing/blacklevel/file/transfer
    - property.set image.processing.blacklevel.file.selected = 
    - property.set image.processing.blacklevel.file.enable = true

- id: wake_from_eco
  description: Wake a projector from ECO mode.
  steps:
    - one of: send wake-on-LAN (HW/MAC address); press power button on remote; press power button on keypad; send :POWR1\r on RS-232 serial port.

Safety

confirmation_required_for:
  - system.poweroff
  - firmware.schedulecomponentupgrade
interlocks: []
<!-- UNRESOLVED: source notes that powering on/off a transitioning projector is a no-op and recommends pre-checking system.state, but does not document additional safety interlocks, lockouts, or warning procedures. -->

Notes

The protocol is JSON-RPC 2.0 over TCP/9090 (and RS-232 at 19200 8N1). The same commands are valid on both transports. Parameters may be passed by name; order is not significant. After property.set, wait for confirmation before issuing the same set again to avoid flooding the server. The API is partially dynamic and depends on the projector model, mounted peripherals (e.g. motorized lens), and configuration (e.g. DMX mode). Use introspect to discover the exact API of your device. ECO-mode wake-up requires one of: wake-on-LAN, remote power button, keypad power button, or sending :POWR1\r on the serial port. Authentication is optional for normal end-user access; supply a pass code only when a higher access level is required.

The supported blend mask resolutions are: WUXGA 1920x1200, WQXGA 1280x800, 4K 1280x800, 4K Cinemascope 1280x540. The supported black level mask resolutions match the blend layer: WUXGA 1920x1200, WQXGA 1280x800, 4K 1280x800, 4K Cinemascope 1280x540. Mask file formats: PNG (up to 16-bit), JPEG, TIFF. Only the blue channel is used for color images.

Provenance

source_domains:
  - audiogeneral.com
source_urls:
  - "https://www.audiogeneral.com/barco/UDX%20Series/JSON_ReferenceGuide.pdf"
retrieved_at: 2026-08-04T06:15:57.598Z
last_checked_at: 2026-08-05T08:03:24.094Z

Verification Summary

verdict: verified
checked_at: 2026-08-05T08:03:24.094Z
matched_actions: 91
action_count: 91
confidence: medium
summary: "All 91 spec action-units are wired to JSON-RPC methods/property paths/HTTP endpoints/serial commands documented verbatim in the source; transport values (port 9090, 19200 8N1) verified. (3 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "full list of supported models / firmware versions not stated in source; some APIs are dynamic and may differ per configuration."
- "source notes that powering on/off a transitioning projector is a no-op and recommends pre-checking system.state, but does not document additional safety interlocks, lockouts, or warning procedures."
- "precise firmware version compatibility range for Pulse API; whether all listed properties/methods are present on Freya Plus Mfusion or only on referenced Pulse projector models; full enumeration of dynamic sub-objects (e.g. complete source names, DMX channel counts/modes)."

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