Loading...
LiveUpdate
This module provides real-time integration with Disguise Designer via the LiveUpdate API, allowing you to monitor properties and control your show directly from Companion.
This module uses Feedbacks to subscribe to Disguise properties. Each feedback creates a module variable that updates in real-time. You can then use these variables anywhere in Companion - in button text, expressions, triggers, or other modules.
fps (or any name you choose)subsystem:MonitoringManager.findLocalMonitor("fps")object.seriesAverage("Actual", 1)1000 (milliseconds, or 0 for real-time)$(liveupdate:fps)In your button text, use:
FPS: $(liveupdate:fps)
Or with expressions for formatting:
FPS: ${toFixed($(liveupdate:fps), 1)}
Use Companion's expression system to change button colors based on values:
Button Background Color Expression:
$(liveupdate:fps) < 30 ? rgb(200,0,0) :
$(liveupdate:fps) < 60 ? rgb(200,150,0) :
rgb(0,150,0)
This changes the button:
Use the "Set to Disguise" actions to change properties:
10.5 (can use variables like $(internal:custom_my_value))screen2:surface_1object.offset.xCreates a live-updating variable that tracks a Disguise property.
Options:
Examples:
| What to Monitor | Object Path | Property Path |
|---|---|---|
| Track length | track:track_1 | object.lengthInBeats |
| FPS | subsystem:MonitoringManager.findLocalMonitor("fps") | object.seriesAverage("Actual", 1) |
| Screen name | screen2:surface_1 | object.mesh.description |
| Transport playhead | transportManager:default | object.player.tRender |
| Screen offset (vector) | ledscreen:myledscreen | object.offset |
Note: This feedback manages the subscription lifecycle. For visual feedback based on the variable value, use Companion's expression system.
Indicates whether the module is connected to Disguise Designer.
Set a Disguise property with a string value.
Use for: Text properties (e.g., description, name)
Options:
Example: Set track description
My Track Nametrack:track_1object.descriptionSet a Disguise property with a numeric value.
Use for: Numbers (e.g., offset.x, length, timing)
Options:
Example: Set screen X offset
10.5screen2:surface_1object.offset.xSet a Disguise property with a true/false value.
Use for: Boolean properties (e.g., enabled, visible)
Example: Enable a track
Truetrack:track_1object.enabledSet a Disguise property with a complex JSON object.
Use for: Complex objects (e.g., vectors, arrays)
Example: Set screen offset vector
{"x": 4.0, "y": 3.0, "z": 0.0}screen2:surface_1object.offsetShows the current connection status (Connected or Disconnected).
Module variables are automatically created for each active subscription. The variable name matches what you specified in the feedback.
Example: If you created a subscription with variable name fps, use: $(liveupdate:fps)
Add "Subscribe to Disguise Property" feedback to a button:
fpssubsystem:MonitoringManager.findLocalMonitor("fps")object.seriesAverage("Actual", 1)1000Set button text:
FPS\n${toFixed($(liveupdate:fps), 1)}
Set button background expression:
$(liveupdate:fps) < 30 ? rgb(200,0,0) : rgb(0,150,0)
Add "Subscribe to Disguise Property" feedback:
track_lengthtrack:track_1object.lengthInBeatsSet button text with formatting:
Track 1\nLength\n${secondsToTimestamp($(liveupdate:track_length))}
Add "Subscribe to Disguise Property" feedback:
screen_offsetscreen2:surface_1object.offsetDisplay the value in button text:
X: ${toFixed(jsonparse(parseVariables('$(liveupdate:screen_offset)')['x'], 2)}
Y: ${toFixed(jsonparse(parseVariables('$(liveupdate:screen_offset)')['y'], 2)}
Create buttons to adjust offset:
$(liveupdate:screen_offset) + 1 (use custom variable)screen2:surface_1object.offset.xAdd "Subscribe to Disguise Property" feedback:
playheadtransportManager:defaultobject.player.tRender100Display in button:
Playhead\n${secondsToTimestamp($(liveupdate:playhead))}
The module automatically handles subscription errors:
PATH_ERROR (unsubscribed) to indicate the issueIf subscriptions are dropped (e.g., connection loss, WebSocket errors):
When you edit feedback options (object path, property path):
Disguise uses "Designer expressions" to find objects:
| Object Type | Example |
|---|---|
| Track | track:track_1 |
| Screen (v2) | screen2:surface_1 |
| LED Screen | ledscreen:myledscreen |
| Transport Manager | transportManager:default |
| Monitoring (FPS) | subsystem:MonitoringManager.findLocalMonitor("fps") |
| Monitoring (Custom) | subsystem:MonitoringManager.findLocalMonitor("my_monitor") |
Property paths use Python-style expressions to access object properties:
| Property | Example |
|---|---|
| Simple property | object.description |
| Numeric property | object.lengthInBeats |
| Nested property | object.mesh.description |
| Vector component | object.offset.x |
| Full vector | object.offset |
| Method call | object.seriesAverage("Actual", 1) |
| Player property | object.player.tRender |
0 for real-time updates, or higher values (in milliseconds) to reduce network trafficFor detailed information about the LiveUpdate API and available objects/properties, visit:
For questions about Disguise Designer integration:
For general Disguise support: