Skip to main content

Companion Module

The FrenschPress module for Bitfocus Companion reverses the direction: instead of the FrenschPress operating Companion, Companion operates the FrenschPress. One show button in Companion can then start the video and switch the FrenschPress to set B, colour its LEDs or arm a timeline.

RouteWho drives whomDocumented under
Companion Mode / SatelliteThe FrenschPress (and optionally a Stream Deck attached to it) acts as a surface for CompanionCompanion Mode, Stream Deck as a Companion surface
Companion moduleCompanion controls the FrenschPressthis page

You can combine the two: Companion uses one FrenschPress as a surface and controls another as a device.


Installation​

The module comes as a package file (.tgz) for download.

  1. In Companion, open Settings → Modules → Import module package.
  2. Select the .tgz file.

Once the module is in the Bitfocus module store, you no longer need to import it. Searching for FrenschPress is then enough.

note

A version installed from the store takes precedence over an imported one. Once the store version is available, remove the imported build.

Setting up the connection​

Requirement: Companion and the FrenschPress can reach each other on the same network. The module speaks OSC over UDP.

  1. Add a new connection in Companion.
  2. Choose FrenschConnection FrenschPress.
  3. Pick the FrenschPress under Discovered devices, or enter Host and Port by hand.
  4. Save. If the connection stays red, see Troubleshooting.
FieldMeaningDefault
Discovered devicesFrenschPress units announcing themselves on the network. Picking one fills in host and port.–
HostIP address or hostname of the device–
PortThe device's OSC input port53001
HTTP portUsed only to read the device's preset list. No login required.80
Poll device statusQueries the device state at regular intervals. Off: no variables and no feedbacks, the module only sends.–
Poll interval (ms)Time between queries1000
Discovery is optional

The device list comes from mDNS. mDNS does not cross a VLAN boundary and often fails when Companion runs inside a Docker container. Entering host and port by hand is a normal way to set this up, not a workaround.


Actions​

ActionWhat it does
Set modeSwitches between QLab, Custom and Companion
Switch button setSwitches to set A, B or C, optionally for selected buttons only
Apply presetLoads a preset. The list is read from the device; you can also give a preset by name or through a variable. Optionally into a specific set.
Press a FrenschPress buttonFires STOP, GO or PAUSE virtually, as tap, press or release
Run a macroStarts a macro by name or ID. on, off and toggle apply to snapshot macros.
Arm timeline / Disarm timelineArms or disarms one timeline, by number, name or ID
Arm all timelines / Disarm all timelinesThe same for every timeline at once
Set LED colourColours one LED (STOP, GO, PAUSE or all) from the colour picker
Release LED overrideHands the LED back. It then shows its normal colour again.
Stream Deck: press a keyFires a key on the attached Stream Deck by row and column
Stream Deck: set key feedbackSets a deck key's state: a single key, row/column, all keys, or everything back to local
Set device variableWrites a value into a variable on the FrenschPress
Clear device variableClears one variable by name
Clear all device variablesClears all 64 variables at once

The module reads the dropdowns for Apply preset and Arm / Disarm timeline from the device and refreshes them once a minute, so a newly added preset or timeline shows up on its own. Both fields also accept free text: a number, display name, ID or a Companion variable. If the device is unreachable over HTTP, the list stays empty, but a typed value is still sent.

Feedbacks​

FeedbackTrue when
Mode isthe device is in the selected mode
Button set isthe selected set is active, either for the whole FrenschPress or for a single button
QLab has running cuesat least one cue is running in QLab
QLab is pausedQLab is paused
Sync variable to FrenschPressNo visual effect. Continuously mirrors a Companion variable into a device variable.

Setting a device variable from Companion​

The FrenschPress can insert variables into Stream Deck captions: a key reading CUE $cue shows whatever cue currently holds. Companion is the most convenient way to fill those values.

Once, on press: Set device variable​

The action takes a Name and a Value. Both fields accept Companion variables, and Companion resolves them before sending. The FrenschPress always receives a finished string and knows nothing about Companion.

Name: cue
Value: $(internal:time_hms)

A deck key captioned $cue then shows the new value each time the action fires.

RuleValue
Name1–24 characters of A-Z, a-z, 0-9, _
Reserved namesanything starting with sys_ belongs to the device and is refused
Value lengthover 48 characters the device truncates without warning
$$ in a captionreserved, and refused when saving

Continuously: the Sync variable to FrenschPress feedback​

If a value should stay current by itself rather than being tied to a button press, add the feedback to any Companion button. Give it a fixed FrenschPress name and an expression as its value. It does not change how the Companion button looks.

Companion reruns a feedback whenever a variable it references changes. The module coalesces rapid changes and sends at most ten updates per second, always the newest value only.

The module also reasserts its mappings slowly: one per second, and no more often than once every ten seconds per mapping. After a FrenschPress reboot, the device variables are therefore refilled on their own without every mapping going out in one burst.

The feedback is active as long as it exists. Delete it and the mirroring stops.

Clearing​

Clear device variable removes one variable. If a caption references it, only that $name drops out: CUE $cue becomes CUE , and a caption that is only $cue goes blank. The text in the editor is untouched.

Clear all device variables wipes all 64 at once and has no options.

Check older buttons from version ≤ 0.4.0

Up to 0.4.0, "clear all" was the same action as "clear one", triggered by leaving the Name field blank. That was also the default of a freshly added action. A Clear device variable with a blank name now clears nothing. If a button relied on that, switch it to the dedicated Clear all device variables action.


Variables​

The module provides these Companion variables under $(frenschpress:…):

VariableContents
device_name · fw · mac · ipDevice name, firmware version, MAC address, IP address
modeqlab, macro or companion
transport · midimodeQLab transport (osc/msc) and the internal transport code
set_activeActive button set
set_buttonsEight letters, one set per button, in the order stop, go, pause, encoder push, left, right, push+left, push+right
qlab_running · qlab_paused · qlab_subscribedQLab state: running, paused, feedback subscribed
note

After a masked set switch the buttons can sit on different sets. set_active then only reflects the last switch that covered the whole FrenschPress. set_buttons is the accurate value in that case.

These are Companion variables and have nothing to do with the device variables stored on the FrenschPress. To get from one kind to the other, use the action or the feedback described above.

Bundled buttons (presets)​

Ready-made Companion buttons with matching feedbacks: Mode QLab / Macro / Companion, Set A / B / C, STOP / GO / PAUSE, QLab running, QLab paused, plus two LED buttons (hold a colour while pressed, and release).


Troubleshooting​

SymptomCauseFix
No variables, no feedbacksPoll device status is offSwitch it on
Connection stays redWrong host or portThe port must match the device's OSC input port
Preset list emptyWrong HTTP port, or the device is not reachable over HTTPCheck the HTTP port and reachability
State updates sluggishlyPoll interval too longReduce the poll interval, minimum 250 ms
note

The FrenschPress answers status queries at most once every 100 ms per sender, so a poll interval below 250 ms gains you nothing.