HangarControl Stream Deck Plugin
Overview
The HangarControl Stream Deck plugin transforms your Elgato Stream Deck into a fully integrated flight simulator control panel. Fire SimConnect events, write LVars, send keyboard shortcuts, toggle flags, monitor simulator values in real time, and display live data β all directly from your Stream Deck buttons and encoders.
Unlike generic Stream Deck simulator plugins that rely on pre-built profiles, the HangarControl plugin connects to your running instance of HangarControl and has direct access to the full SimConnect catalog, LVar bridge, X-Plane command system, and HangarControl's internal flag and conditional action engines. If HangarControl can do it, your Stream Deck can trigger it.
How It Works
The plugin operates as a bridge between the Elgato Stream Deck software and HangarControl:
- The Stream Deck software loads the HangarControl plugin and provides button/encoder events.
- The plugin connects to HangarControl via a local WebSocket on port
19850. - When you press a button or rotate an encoder, the plugin sends the configured action to HangarControl.
- HangarControl executes the action (fires the SimConnect event, writes the LVar, sends the key, etc.).
- For display and state monitoring, the plugin polls HangarControl at 250ms intervals for live simulator values.
Supported Hardware
| Device | Buttons | Encoders | LCD Touch |
|---|---|---|---|
| Stream Deck Mini | 6 keys | β | β |
| Stream Deck MK.2 | 15 keys | β | β |
| Stream Deck XL | 32 keys | β | β |
| Stream Deck + | 8 keys | 4 rotary encoders | 4 LCD touch strips |
| Stream Deck Neo | 8 keys | β | β |
| Stream Deck Pedal | 3 pedal keys | β | β |
Installation
Requirements
- HangarControl β installed and registered (trial or full license)
- Elgato Stream Deck software β version 6.5 or later, installed and running
- Windows 10 or later β the plugin is Windows only
- A Stream Deck device β any model (Mini, MK.2, XL, +, Neo, Pedal)
The plugin runs on Node.js 20, which the Stream Deck software supplies. There is nothing extra to install.
Installing the Plugin
Launch HangarControl and click β Settings from the Home View sidebar, or use the gear icon in the header.
Scroll down to the STREAM DECK PLUGIN card. You will see the current plugin status and an install button.
Click the Install Plugin button. HangarControl extracts the embedded .streamDeckPlugin package to a temporary location and opens it with the Elgato Stream Deck software.
The Elgato Stream Deck software will display an installation dialog. Click Install to complete the process. The plugin files are deployed to:
%AppData%\Elgato\StreamDeck\Plugins\com.overkillsimulations.hangarcontrol.sdPlugin
After installation, the status in HangarControl Settings should update to Plugin status: Installed β followed by the installed plugin version. The status keeps checking for up to 90 seconds after you click install, so it turns green as soon as you confirm the Stream Deck dialog. In the Stream Deck software, you should see a new HangarControl category in the action list on the right side.
Verifying Installation
To confirm the plugin is installed and working correctly:
- Open the Elgato Stream Deck software.
- In the right-hand action panel, scroll down or search for HangarControl.
- You should see the available action types: SimConnect Event, SimVar Write, Keyboard Shortcut, X-Plane Command, X-Plane DataRef, Flag Control, Conditional Action, SimVar Display, DCS Command, HC Binding, Encoder Control, HC Window Toggle, HC Service Toggle, and Page Sound.
- Encoder Control and SimVar Display only appear when you drag onto a Stream Deck+ dial slot β they cannot be placed on a standard key. HC Binding works on both keys and dials.
- Drag any action onto a button. If the property inspector (right panel) shows a Connected status at the bottom, the plugin is communicating with HangarControl.
Keeping the Plugin Updated
The Stream Deck plugin is bundled inside each HangarControl release. When HangarControl is updated, the bundled plugin may also be updated with new features, action types, or fixes.
Checking the Installed Version
The STREAM DECK PLUGIN card in Settings shows the version of the plugin currently installed in the Stream Deck software. If it is older than the plugin bundled with HangarControl, the status turns orange and shows both versions, for example Plugin status: Update available (v3.7.1 installed, v3.7.2 ready), and the button changes to Update Plugin. Once the update finishes, the status turns green with the new version number, so there is no need to check inside the Stream Deck software.
Automatic Version Check
Starting with HangarControl v1.19, the application automatically checks whether your installed Stream Deck plugin version matches the version bundled with HangarControl. If a mismatch is detected on startup, you will see a notification prompting you to reinstall the plugin.
Reinstalling After an Update
To update the plugin after a HangarControl update:
- Open HangarControl and go to Settings. If you are prompted that your plugin is out of date, simply go to Settings and click Update Plugin. It takes about 10 seconds and your existing Stream Deck layout is completely untouched. The status line confirms the new version once it is installed.
- Confirm the install in the Elgato Stream Deck dialog.
Your existing button configurations and bindings are preserved β reinstalling only updates the plugin code, not your layout or settings.
Getting Started
Adding Actions to Your Stream Deck
Launch the Elgato Stream Deck application. Make sure HangarControl is also running in the background.
In the action list on the right side, look for the HangarControl category. You can also search for "HangarControl" in the search bar.
Drag the desired action type (e.g., SimConnect Event) from the action list and drop it onto any button slot on your Stream Deck layout. For Stream Deck+ encoders, drag an Encoder action onto one of the four dial positions at the bottom of the layout.
When you select the button, the property inspector panel appears below the Stream Deck layout. This is where you configure what the button does, how it looks, and what data it displays. Each action type has its own property inspector with relevant fields.
Connection Status
Every property inspector shows a Status section at the bottom. This indicator shows the real-time connection state between the plugin and HangarControl:
| Status | Meaning |
|---|---|
| Connected | Plugin is communicating with HangarControl. All features are active. |
| Disconnected (Icons OK) | HangarControl is not running. Local icons still display but actions will not fire and live data will not update. |
Property Inspector Overview
The property inspector is the configuration panel that appears when you click on a configured Stream Deck button. While each action type has unique fields, most share a common set of sections:
| Section | Purpose | Available On |
|---|---|---|
| Button Press Action | What happens when you press the button | All button actions |
| State Toggle | Monitor a SimVar and auto-toggle the button's ON/OFF visual state | All button actions |
| Icon (Optional) | Choose a built-in or custom icon for the button face (the ON / default icon) | All actions |
| OFF Icon (Optional) | Choose a separate icon shown when the button is OFF or a condition is FALSE, with a live preview | All actions |
| Button Appearance | Background color, icon size/position | All actions |
| Label Settings | ON/OFF text, font, size, color, position | All button actions |
| Live Display Variables | Stack additional live SimVar readouts on the button face | SimConnect, SimVar, Keyboard, Flag |
| Status | Connection indicator | All actions |
Action Types
The HangarControl plugin provides fourteen distinct action types, each designed for a specific type of simulator interaction. Choose the right action type based on what you want your button to do.
SimConnect Event
The most commonly used action type. Fires a SimConnect key event (K: event) in Microsoft Flight Simulator 2020 or 2024. This is how you trigger cockpit switches, autopilot functions, lighting controls, gear, and virtually any simulator action that has a named event.
Configuration Fields
| Field | Description | Example |
|---|---|---|
| Prefix | Event namespace prefix. Options are None, K: (SimConnect event), L: (LVar write), A: (aircraft variable), B: (MSFS 2024 input event), and H: (third-party HTML event). Leaving it on None dispatches the name as a K: event. |
H:, B:, or None |
| Event | The SimConnect event name. You can type it directly or use the Browse Catalog button to search HangarControl's full event catalog. | TOGGLE_MASTER_BATTERY |
| Value | Numeric value sent with the event. Most toggle events use 0. Some events require a specific value (e.g., setting a radio frequency). |
0 |
| Momentary | Checkbox. When enabled, the button becomes hold-to-run: the event fires with Value on press and with Release Value on release. | Off |
| Release Value | (Momentary only) Value sent when the button is released. Useful for controls that must be held, such as a helicopter starter or an engine crank switch. | 0 |
Quick Setup Presets
The SimConnect action includes a Quick Setup section with a Browse Presets button. This opens a searchable catalog of 85 pre-configured common actions across ten categories: Radio Frequencies, Autopilot Toggles, Autopilot Adjustments, Autopilot Displays, Lighting, Electrical, Anti-Ice / De-Ice, Fuel Systems, Gear & Flaps, and Engine Controls. Selecting a preset auto-fills the event name, value, and usually an icon β saving you from looking up event names manually.
Custom H:Events
Third-party aircraft (FlyByWire A320, Fenix A320, PMDG 737, etc.) often expose custom H:Events. The SimConnect property inspector includes a Custom H:Events section that shows any custom events registered with HangarControl for the currently loaded aircraft. You can also add your own H:Events here with a name, description, and category.
K: events, A: SimVars, L: LVars, B: BVars, H: HTML events, and a dedicated PMDG filter for PMDG airliner variables. On SimVar Write, Conditional Action, SimVar Display, and Encoder Control the picker adds an HC Variables filter for HangarControl's own variables. You can also find event names in your aircraft's documentation or on community resources like the MSFS SDK docs.
SimVar Write
Directly writes to simulator variables. Unlike SimConnect Events which trigger actions, SimVar Write lets you set a variable to a specific value. This is essential for working with LVars (aircraft-specific local variables), AVars (standard SimConnect variables), BVars (MSFS 2024 behavior variables), and JVars (MSFS 2024 JavaScript variables).
Configuration Fields
| Field | Description | Example |
|---|---|---|
| Type | Variable type: LVar (local variable), AVar (aircraft variable), BVar (binary variable), JVar (JavaScript variable), or Custom SimVar for anything you want to address by its full prefixed name. |
LVar |
| Name | The variable name. Browsable via the catalog button. | A32NX_OVHD_ELEC_BAT_1_PB_IS_AUTO |
| Units | SimConnect unit type for the variable | number, bool, percent |
| Action | What to do with the value: Set Value (write), Toggle (flip 0β1), Increment (+), Decrement (β), or Pulse (set the value, then reset it β for variables that expect a momentary trigger). |
Set Value |
| Value | The value to write (for Set action) | 1 |
| Momentary | Turns the key into a hold to run control. The Value is written when you press the key and the Release Value is written when you let go, rather than firing once and latching. Ticking this forces the Action to Set on press, because the other actions have no meaningful release behaviour. | ticked |
| Release Value | Only appears when Momentary is ticked. The value written the moment you release the key. | 0 |
TOGGLE_MASTER_BATTERY). Use SimVar Write when you need to directly write a value to a variable (e.g., setting an LVar to 1 on a third-party aircraft that doesn't expose toggle events). Many third-party aircraft require LVar writes for proper interaction.
Keyboard Shortcut
Sends a keyboard keystroke or key combination to the active simulator window. This is the simplest action type and works with any simulator or application. Useful for DCS World, ATS/ETS2, or any scenario where you need to press a key combo.
Configuration Fields
| Field | Description | Example |
|---|---|---|
| Key Chord | The keyboard shortcut to send. Uses standard modifier notation. Separate modifiers with +. |
Ctrl+Shift+F, G, Esc |
The keyboard action sends a keyDown on button press and keyUp on button release, so you get realistic hold-and-release behavior for keys that respond to hold duration in the simulator.
X-Plane Command
Fires an X-Plane command for X-Plane 11 or X-Plane 12. X-Plane uses a command-based system rather than events, so this action type sends the named command string directly through HangarControl's X-Plane connection.
Configuration Fields
| Field | Description | Example |
|---|---|---|
| Command | The X-Plane command path, typed directly. The property inspector lists common examples underneath the field. There is also an optional State DataRef below, with a threshold, to drive the button's ON/OFF icon from an X-Plane DataRef. | sim/autopilot/heading_sync |
X-Plane DataRef
Writes a value to an X-Plane DataRef. DataRefs are X-Plane's equivalent of SimConnect variables β they represent cockpit switch positions, system states, and more.
Configuration Fields
| Field | Description | Example |
|---|---|---|
| DataRef | The full DataRef path | sim/cockpit/electrical/battery_on |
| Value | Numeric value to write | 1 |
| State DataRef | (Optional) DataRef to watch for the key's ON/OFF state. Leave it empty and the key monitors the DataRef it writes to, which is what you want most of the time. | sim/cockpit/electrical/battery_on |
| Threshold | Value above which the state reads as ON | 0.5 |
Flag Control
Toggles, sets, or clears a HangarControl flag. Flags are internal boolean variables managed by HangarControl that can be used to build complex multi-button logic. A flag can be checked by conditional actions to create state machines, mode selectors, or multi-step workflows.
Configuration Fields
| Field | Description | Example |
|---|---|---|
| Flag Name | Name of the HangarControl flag | ALT_MODE_ACTIVE |
| Action | Toggle, Set (on), or Clear (off) |
Toggle |
| State Var | (Optional) What drives the key's ON/OFF icon. Use FLAG:name to have the key reflect the flag it controls, or any SimVar to drive it from the sim instead. |
FLAG:AP_ACTIVE |
| Units | Units for the state variable | number |
| Threshold | Value above which the state reads as ON | 0.5 |
Flag names are case-insensitive. The State Var field is separate from the flag being controlled, so a key can set one flag while showing the state of something else entirely.
Conditional Action
Evaluates one or more conditions and executes different actions based on the result. This is the "if/else" of the Stream Deck β when you press the button, the plugin checks the conditions and fires the appropriate action.
Configuration Fields
| Field | Description |
|---|---|
| Conditions | One or more conditions to evaluate. Each condition specifies a source β SimVar, LVar, Flag, DCS Data (a DCS cockpit argument or export key), or HC Variable β an operator (=, β , >, <, >=, <=), and a comparison value. SimVar, LVar, and HC Variable conditions also take a units field and have a browse picker; Flag and DCS Data do not use units. |
| Logic | AND (all conditions must be true) or OR (any condition can be true) |
| Action When TRUE | The action to execute when conditions are met. Choose from SimConnect Event, SimVar Write, Keyboard, X-Plane Command, X-Plane DataRef, or Flag. |
| Action When FALSE | (Optional) The action to execute when conditions are NOT met. Same six choices as above, plus No Action. |
Conditions are evaluated at press time. You can add multiple conditions using the + Add Condition button and remove them with the β button on each row.
SimVar Display
Displays live simulator values on a Stream Deck+ LCD touch strip. Use this to show real-time cockpit data like heading, altitude, airspeed, radio frequencies, fuel quantity, or any readable SimVar, plus DCS export variables and cockpit arguments.
Configuration Fields
There are no top-level variable fields on this action. Everything below is configured per text slot, so each of the four slots carries its own copy of these settings.
| Field | Description | Example |
|---|---|---|
| SimVar | The simulator variable to display, with a browse picker. Supports A: (standard), L: (LVar), and B: (BVar) prefixes, and DCS:<arg_id> for a raw DCS cockpit argument. |
AUTOPILOT HEADING LOCK DIR |
| Units | SimConnect unit type | degrees |
| Format | Display format string. Use {value} as placeholder. Supports zero-padding like {value:000}. |
HDG {value:000} |
| Decimals | Number of decimal places, from 0 to 3. | 0 |
| Font / Size / Weight / Color | Independent styling per slot. Weight is Normal or Bold. Font offers the eleven built-in faces plus Custom⦠for anything installed on your system. | Consolas, Bold |
| X Position / Y Position | Where the text sits on the 200Γ100 strip. | 100 / 50 |
Display Text Slots
You can enable up to four text slots on a single LCD strip. Each slot has its own checkbox, SimVar, units, format string, decimals, font settings, color, and X/Y positioning, so you can lay out a multi-line cockpit readout on one strip. A slot can show static text, a live SimVar value, or DCS data.
Format Tokens
{value}β the full value{value:0000}β zero-padded to the given width{digit:N}β the Nth digit of the value, 1-based. This lets you split one value across several slots or several dials. A transponder reading 7200 gives{digit:1}= 7,{digit:2}= 2,{digit:3}= 0,{digit:4}= 0.
DCS Quick Pick
The DCS Quick Pick section gives you a searchable dropdown of DCS export variables. Pick a value, choose which slot to send it to under Apply To, and click Apply β the slot's variable, units, decimals, and format are all filled in for you. For a raw cockpit argument instead, type DCS:<arg_id> into the slot manually (for example DCS:404).
Display Background & Icon
The strip has its own background colour picker, plus an optional icon with ON/OFF variants and the same width, height, X, and Y controls used on keys.
Touch Action (Optional)
You can configure an event that fires when the user taps the LCD area, so the display doubles as an interactive control. Enter a SimConnect event name (the browse picker is right there) and a numeric value. This action is SimConnect only β if you need a DCS command on the tap, use an Encoder Control dial instead, whose Touch Action supports both.
State Toggle
The display strip has its own ON/OFF state, which drives the icon variant. The Mode dropdown offers No State Change, SimVar Monitoring (watch a State Var against a threshold, same as a key), or Toggle on Touch (flip the state each time the strip is tapped).
DCS Command
Sends a cockpit command to a specific aircraft in DCS World. DCS commands are device-based β each switch, button, or lever on an aircraft module is identified by a device ID, command code, and press/release value. The plugin loads DCS aircraft libraries directly from disk, so command browsing works even when HangarControl is not connected.
Configuration Fields
| Field | Description | Example |
|---|---|---|
| Source | Aircraft Library for cockpit controls driven by device ID and command code. Universal iCommand for global commands such as view and camera control, which are sent by name rather than by device. |
Aircraft Library |
| Aircraft | (Aircraft Library only) The DCS aircraft module this command belongs to. | F/A-18C Hornet |
| Press Cmd / Release Cmd | (Universal iCommand only) The iCommand name exactly as it appears in DCS β these are case-sensitive. Release Cmd is optional; leave it blank for fire-and-forget commands. | iCommandViewCockpitZoomIn |
| Command | The specific cockpit command. Use the Browse button to open a searchable picker with category filtering. Commands are loaded from the DCS aircraft library JSON files. | Master Arm Switch - ARM |
| Button Mode | Momentary sends a press on keyDown and a release on keyUp (default). Toggle alternates between the press value and an off value on each press, with no release sent. Step advances one position per press in a fixed direction. Tumbler cycles through a list of values you define. |
Momentary |
| Press Value | Value sent when the command is activated. Most switches use 1. Hidden in Step and Tumbler modes, which take their values from the Values list instead. |
1 |
| Off Value | (Toggle mode only) Value sent on the alternate press to deactivate the command. | 0 |
| Direction | (Step mode only) CW (next) or CCW (previous) β which way the switch advances on each press. |
CW |
| Values | (Step and Tumbler) The comma-separated list of positions the switch moves through. Take these straight from the DCS Lua defineTumb or defineMultipositionSwitch arguments. Both modes need this list β leave it empty and the key sends nothing at all. |
0, 0.5, 1 |
| Wrap | (Step mode only) Whether the sequence loops back to the start after the last position. Tumbler always wraps and has no Wrap control. | No |
Universal iCommands
Setting Source to Universal iCommand switches the action away from the aircraft library and lets you send a named DCS iCommand instead. These are the global commands that are not tied to a specific cockpit device β view and camera control, and similar functions common to every airframe. Enter the command name exactly as DCS spells it, since iCommand names are case-sensitive, and optionally supply a Release Cmd for controls that need a matching release.
State Monitor
A DCS Command key can drive its own ON/OFF icon state from the sim. The State Monitor section has a Source dropdown with two choices:
| Source | Field | Notes |
|---|---|---|
| Cockpit Argument | Argument ID | The cockpit argument number taken from the aircraft's mainpanel_init.lua. This is not the same file as clickabledata.lua, which is where the command itself comes from. |
| DCS Export Variable | Variable | An export key such as GEAR, IAS, or RPM_L. Use the browse button to pick from the export catalog, or type the key directly. |
Either source is compared against a Threshold β a value above the threshold shows the ON state. Most switches sit at 0 and 1, so the default of 0.5 works. Leave the monitor blank for no state tracking.
Command Library
DCS aircraft command libraries are stored as JSON files in your HangarControl data folder at:
%AppData%\HangarControl\DCS\AircraftLibrary
The plugin reads these files directly from disk. When new aircraft modules are added to HangarControl, the corresponding JSON files are deployed automatically and appear in the aircraft dropdown without any extra setup.
HC Binding
HC Binding hands the key over to HangarControl's own binding engine β the same one behind every physical button on your hardware. Instead of one action per key, you get the full press model: short press, long press, double tap, release, hold, and multi-command sequences, with all the same command kinds available to a Honeycomb Bravo button or a WinWing panel switch.
Use this when a single-action key is not enough: a switch that needs one thing on press and another on release, a button that does one job on a short tap and a different job on a long hold, or any key that should run a sequence rather than a single command.
Configuring an HC Binding
Drag HC Binding onto any key or dial. The property inspector is deliberately short β there are no fields to fill in here, because the real editor lives in HangarControl.
Press the Configure Binding in HangarControl⦠button. HangarControl brings up its Stream Deck binding window for that exact key. If HangarControl is not running, the button reports back that it could not connect rather than failing silently.
The binding window owns everything about the key: the press model, the icon, live readouts, state, and β on a dial β rotation behaviour. Clicking Configure on the press model opens the standard HangarControl binding editor, the same dialog used for hardware buttons, so anything you can bind to a physical button you can bind here.
Close the window to save. The key configuration is pushed straight back out to the Stream Deck, so the icon and any readouts update immediately.
Clearing a Binding
The binding window has a Clear Press Model button. Clearing removes what the key does on press but keeps its icon and readouts, so you can strip the actions without rebuilding the appearance.
More Than Two States
The ON/OFF pairing that the standalone action types use tops out at two looks. A key configured through HangarControl is not limited that way: HangarControl can push an ordered list of value bands, each with its own icon, background colour, label text, and label colour. The plugin walks the list and uses the first band whose range contains the current value, with both ends of each range treated as inclusive and an open end meaning no limit in that direction.
This is what a real multi-position switch needs β a five position flap selector or a rotary mode knob that reads UP, 1, 2, 3, DOWN with a different colour at each detent, rather than being forced into a true/false pair. Set the bands up in the HangarControl binding window; there is nothing to configure on the Stream Deck side. If no band matches, the key falls straight back to normal two-state behaviour.
Readout Layout
Each readout in the binding window has an Align setting: Left, Center, or Right. On the LCD strip it decides how the value sits on its X position. Right makes X the right edge, so the last digit stays put when a value grows from two digits to three. On a key, a readout with a free position anchors the same way on its Free X, and a stacked readout sticks to the left or right edge of the key. LCD readouts also have a separate Label align, which follows the value unless you set it.
The Gap setting beside Prefix and Suffix adds up to 10 spaces between them and the value, so ALT and 1500 can read ALT 1500 instead of ALT1500. Existing readouts stay centred with no gap until you change them. Switching a readout to Right moves it, since X now marks the right edge, so nudge X back where you want it.
HC Window Toggle
Restores the HangarControl window from the system tray or minimizes it if it is already visible. This is useful in VR or full-screen simulator setups where you want to quickly surface or hide HangarControl without using alt-tab or the taskbar.
The button state automatically reflects the current visibility of the HangarControl window. When HangarControl is visible, the button shows its ON state. When HangarControl is minimized or hidden to the tray, the button shows its OFF state.
Configuration
The HC Window Toggle action supports full icon and label customization. You can assign an icon from the built-in pack (with ON/OFF state variants), adjust the background color and icon size/position, and configure separate label text and colors for the visible (ON) and hidden (OFF) states. All settings are configured in the property inspector when you select the button.
HC Service Toggle
Starts or stops the HangarControl input service β the same service controlled by the Start/Stop buttons in the HangarControl home view. When the service is running, all hardware inputs, bindings, and axis mappings are active. Stopping the service suspends all input processing without closing HangarControl.
The button state reflects whether the service is currently running. The ON state indicates the service is active. The OFF state indicates the service is stopped. The HC UI Start/Stop buttons update automatically when the service is toggled from the Stream Deck.
Configuration
The HC Service Toggle action supports full icon and label customization. You can assign an icon (with ON/OFF state variants), adjust background color and icon size/position, and configure separate label text and colors for the running (ON) and stopped (OFF) states. The default label colors are green for running and red for stopped, but these can be changed to your preference.
HC Page Sound
Plays an audio beep pattern when you navigate to the Stream Deck page this button lives on. This is designed for VR use β when you flip to a new page on your Stream Deck inside a headset, the beep pattern tells you which page you have landed on without needing to see the display.
Configure a unique beep count per page (e.g., 1 beep for page 1, 2 beeps for page 2) so you can orient yourself by sound alone. The sound fires automatically on page navigation β no button press required for the audio cue.
Sound Configuration
| Field | Description | Default |
|---|---|---|
| Beep Count | Number of beeps to play when the page is navigated to | 1 |
| Frequency | Pitch of the beep tone in Hz | 880 Hz |
| Beep Duration | How long each individual beep lasts in milliseconds | 150 ms |
| Gap | Silence between beeps in milliseconds | 120 ms |
| Sound Enabled | Master toggle to disable the page sound without removing the button | On |
Press Action
Because the sound fires on page navigation rather than button press, the button press itself can be assigned a secondary action so the button is never wasted. There is also a Beep on Press checkbox β when enabled, pressing the button replays the page beep in addition to running the press action below. Configure all of this in the Press Action section:
| Option | Behavior |
|---|---|
| None (beep only) | Button press runs no action. With Beep on Press enabled, pressing still replays the page beep. |
| SimConnect Event | Fires a SimConnect event on press. Enter the event name and optional value β same format as the SimConnect Event action type. |
| Keyboard Shortcut | Sends a keyboard chord on press. Enter the shortcut using standard modifier notation (e.g., Ctrl+Shift+A). |
| DCS Command | Sends a DCS cockpit command on press. Enter the aircraft, command ID, and press value. Sends a momentary press and release. |
| HC Window Toggle | Shows or hides the HangarControl window on press β the same behavior as the HC Window Toggle action. |
| HC Service Toggle | Starts or stops the HangarControl input service on press β the same behavior as the HC Service Toggle action. |
Encoder (Stream Deck+)
Encoder Overview
The Encoder Control action type is specifically designed for Stream Deck+ rotary dials. Each encoder dial supports three distinct interactions: rotation (clockwise/counter-clockwise), press (push the dial), and touch (tap the LCD strip below the dial). This makes encoders ideal for cockpit knobs like heading selectors, altitude setters, radio tuners, and trim wheels.
Encoder Control is a dial-only action β it will not appear as an option when you drag onto a standard key. If you want HangarControl's full press model on a dial as well as rotation, use HC Binding instead, which supports both keys and dials.
Rotation Modes
The rotation behavior is configured via the Mode dropdown in the Rotation Action section:
| Mode | Behavior | Best For |
|---|---|---|
| Adjust SimVar | Directly increments/decrements a SimVar by a configurable step. Supports min/max clamping and wrap-around. | Heading, altitude, VS, trim, brightness |
| Execute Actions (CW/CCW) | Fires a separate action for CW and CCW rotation. Each direction picks its own action type independently β SimConnect Event, SimVar Write, Keyboard Shortcut, X-Plane Command, X-Plane DataRef, DCS Command, or Flag β with its own parameter fields. | Radio tuning, autopilot inc/dec, panel knobs |
| DCS Commands (CW/CCW) | Fires separate DCS cockpit commands for CW and CCW rotation. Each direction has its own aircraft, command, and value. Use the browse picker to select commands from the DCS aircraft library. | DCS rotary knobs, radio dials, cockpit selectors |
| DCS Axis | Controls a DCS axis with incremental encoder rotation. Configurable step size, min/max clamp, wrap-around, and starting position. The axis value is tracked by the plugin and sent to DCS on each tick β it is never read back, so moving that axis in the cockpit leaves the dial's idea of the position out of date until you spin it back. | DCS throttle, brightness, volume, trim wheels |
| Conditional (Multi-Branch) | Evaluates priority-ordered branches of conditions. The first matching branch determines what the dial does. Each branch can use Adjust SimVar or Execute Actions. | Context-sensitive controls (see below) |
Acceleration
Acceleration applies to every rotation mode. When enabled, the increment scales up the faster you spin the dial, so a slow turn stays precise while a fast sweep covers a large range in a few flicks. This is what makes a single dial usable for both fine radio tuning and a climb from 3,000 to 35,000 feet.
| Field | Description | Default |
|---|---|---|
| Enabled | Yes or No. When off, every tick applies the configured increment exactly once. |
No |
| Sensitivity | Low β needs the fastest spin before it engages and tops out at 3Γ, so most normal turning stays at 1:1. Best for fine control. Medium β engages sooner and tops out at 8Γ. High β engages just as soon and tops out at 12Γ, best for altitude and frequency sweeps. |
Medium |
The multiplier is driven by how fast you are turning, measured in detents per second, and steps up through fixed bands rather than scaling smoothly. Roughly:
| Spin speed | Low | Medium | High |
|---|---|---|---|
| 5 / sec | 1Γ | 1.5Γ | 2Γ |
| 10 / sec | 1Γ | 2Γ | 4Γ |
| 18 / sec | 2Γ | 4Γ | 8Γ |
| 30 / sec | 3Γ | 8Γ | 12Γ |
Acceleration resets between spins. Leave a gap of more than a quarter of a second between detents and the next one starts at the base increment again, rather than picking up where the last burst left off.
Target Zone
The Target Zone dropdown lets a dial temporarily hand itself over to a TouchPanel zone:
| Setting | Behavior |
|---|---|
| Normal function only | The dial always does what its Rotation Action says. This is the default. |
| Override to engaged zone | Whenever a TouchPanel Target Zone is engaged, this dial drives that zone instead. The moment no zone is engaged, it falls straight back to its normal rotation function. |
This is how you get one physical dial to serve a whole panel: tap a zone on a TouchPanel to engage it, spin the dial to adjust it, and the dial reverts to its usual job on its own.
Adjust SimVar Fields
| Field | Description | Example |
|---|---|---|
| SimVar | Variable to adjust | AUTOPILOT HEADING LOCK DIR |
| Units | SimConnect units | degrees |
| Increment | Amount to change per tick | 1 |
| Fine Inc. | Amount to change per tick when the dial is pressed and rotated simultaneously | 0.1 |
| Min / Max | Optional value clamps | 0 / 360 |
| Wrap | Wrap around from maxβmin and minβmax | Yes |
Execute Actions Fields
This mode gives you a CLOCKWISE ACTION block and a COUNTER-CLOCKWISE ACTION block. Each starts with an action type dropdown, and the fields below it change to match the type you pick:
- SimConnect Event β event name with browse picker, plus an optional value
- SimVar Write β variable, units, and the value to write
- Keyboard Shortcut β a key chord sent on each detent
- X-Plane Command β command path
- X-Plane DataRef β DataRef path and value
- DCS Command β aircraft, command ID with browse picker, and value
- Flag β set, clear, or toggle a HangarControl flag
The two directions are configured completely separately and do not have to match. Clockwise can fire a SimConnect event while counter clockwise writes an LVar, if that is what the aircraft needs.
The example below shows the common case where both directions use SimConnect events:
| Direction | Fields | Example |
|---|---|---|
| CW Event | Event name + optional value | HEADING_BUG_INC, value 0 |
| CCW Event | Event name + optional value | HEADING_BUG_DEC, value 0 |
DCS Commands Fields
When using the DCS Commands mode, you configure separate CW and CCW commands with their own aircraft selection:
| Direction | Fields | Example |
|---|---|---|
| CW | Aircraft + Command ID + Value | F/A-18C, UFC Option 1 +, value 1 |
| CCW | Aircraft + Command ID + Value | F/A-18C, UFC Option 1 -, value -1 |
Each direction has its own browse picker with category filtering. The CW and CCW commands can be from different aircraft if needed, though typically they target the same module.
Selector Knobs From the Aircraft Library
When the command you pick is a multi position selector from the aircraft library, such as a radio preset channel knob, HangarControl steps through its real positions for you. Pick the same selector for both CW and CCW and each detent moves one position in that direction. The Value fields are ignored for these commands. HangarControl starts counting from the first position, so if the knob in the cockpit is already somewhere else, the first detent snaps it into step and it tracks from there.
Two position switches are sent their value once per detent, and momentary buttons such as increase and decrease commands are pressed and released using the release value from the aircraft library.
Stepped Selector (Optional)
Some DCS rotary selectors ignore the usual +1 and -1 and want an absolute position value instead. Turn one of those with plain CW and CCW commands and the switch sits there doing nothing. The Stepped Selector block at the top of the DCS Commands section handles those: fill it in and the clockwise command is used for both directions, with the plugin tracking which detent the switch is on and sending that position value.
| Field | Description | Example |
|---|---|---|
| Steps | Either a single number, which spreads that many detents evenly from 0 to 1, or an explicit comma-separated list of position values. | 9 or 0, 0.1, 0.2 |
| Wrap | No - stop at the ends or Yes - wrap around. |
No |
| Start | Which detent index the selector begins on. | 0 |
Leave Steps blank for normal +1 / -1 behaviour on both directions. The stepped path needs at least two positions and a clockwise command to be filled in β miss either and the dial quietly reverts to sending the plain CW and CCW commands, with no error to tell you why the switch is not moving. Acceleration applies to stepping too, so a fast spin jumps several detents at once.
DCS Axis Fields
| Field | Description | Example |
|---|---|---|
| Aircraft | DCS aircraft module for the axis | F/A-18C Hornet |
| Axis | The axis to control. Use the browse picker to select from the aircraft's axis catalog. | Brightness - Instrument |
| Step | Amount to change per encoder tick | 0.05 |
| Min / Max | Axis value range. Defaults to -1 and 1 if left empty, which suits centred axes like trim. Set them to 0 and 1 for anything that runs one way only, such as brightness or volume. |
0 / 1 |
| Wrap | When the value passes Max it jumps straight to Min, and vice versa. Leave it off and the value clamps at each end instead. Only sensible for genuinely continuous controls. | No |
| Start Position | Initial axis value when the encoder first loads. Defaults to 0 if left empty. |
0.5 |
Press, Touch & Double-Tap
The encoder press event fires when you push the dial straight down. The Touch Action fires when you tap the LCD strip below the dial. Both have their own Mode dropdown with two choices:
| Mode | Fields |
|---|---|
| SimConnect Event | Event name (with browse picker) and a numeric value. |
| DCS Command | Aircraft, command ID (with browse picker), value, and a button mode of Momentary (sends the press value then releases) or Toggle (alternates between the value and 0). |
Double-Tap Mode
When Double-Tap Mode is enabled, the encoder gains an alternate rotation mode that activates on double-tap:
- Single tap: Fires the press event normally.
- Double tap: Toggles the encoder into alternate mode. While in alt mode, rotation uses a completely separate set of actions/SimVars/events (configurable in the Alt section that appears below).
- Double tap again: Returns to the primary rotation mode.
This is perfect for dual-function knobs. For example, a single encoder could handle both heading and course, or COM1 MHz and COM1 kHz, by double-tapping to switch between them.
Alt mode is a genuinely separate configuration, not just a second variable. It has its own Target Zone dropdown and its own Wrap setting alongside the rotation fields, so the two halves of the dial can behave completely differently β the primary side clamped at its limits while the alt side wraps, for instance. Note that alt mode offers only Adjust SimVar and Execute Actions; the DCS and Conditional modes are primary-only.
Conditional Encoder Branches
The Conditional rotation mode is the most powerful encoder feature. It allows you to define multiple priority-ordered branches, each with its own set of conditions and rotation behavior. When you rotate the dial, HangarControl evaluates each branch from top to bottom and uses the first one whose conditions are met.
Example: G1000 Multi-Function Knob
A real-world example β a single encoder that automatically adjusts the correct value based on the active autopilot mode:
| Branch | Condition | Rotation Behavior |
|---|---|---|
| FLC Mode | AUTOPILOT FLIGHT LEVEL CHANGE = 1 |
Adjust pitch reference speed |
| VS Mode | AUTOPILOT VERTICAL HOLD = 1 |
Adjust vertical speed in 100 fpm steps |
| Default | (no conditions β always matches) | Adjust pitch trim |
Each branch independently supports either Adjust SimVar or Execute Actions mode, with its own increment, fine increment, min/max, and wrap settings. Use the + Add Branch button to add branches, and the β² and βΌ buttons on each branch header to reorder priority (top = highest priority). The default branch is always pinned to the bottom and cannot be moved or removed.
Every branch also has a name field with its own font size and a Show checkbox beside it. Untick Show to hide that branch's name on the strip while keeping it in the editor, so you still know which branch is which. The Default branch can be hidden the same way, or its name cleared entirely. The name is drawn on the LCD strip while that branch is active, so you can see at a glance which mode the dial is currently in β which matters most in the manual cycling modes, where nothing else tells you.
Per Branch LCD Display
Each branch carries its own LCD Display (Optional) block, so the strip can show a different readout depending on which branch is live. A dial cycling COM1, COM2, and NAV1 shows the frequency for whichever radio it is currently driving, with no extra configuration on the main LCD section.
Use + Add Display to add as many readouts as you need to a branch. Each one has:
- Source β
SimVar / LVar,DCS Cockpit Argument, orDCS Export Telemetry - Variable β with a browse picker; the Units field disappears for the two DCS sources, which do not use units
- Format and Decimals β the same format tokens as everywhere else, decimals Auto or 0 to 3
- Value position β font size, colour, X, and Y for the number itself
- Label position β a separate multiline text label with its own size, colour, X, and Y. Shift+Enter inserts a line break.
SimVar, LVar, and Flag. The DCS Data and HC Variable sources available on the key Conditional Action are not offered here. To branch a dial on DCS state, drive a flag from HangarControl and test the flag.
Branch Switching
Conditions are not the only way to choose a branch. The Switching dropdown at the top of the Conditional section decides how the active branch is picked:
| Switching Mode | How the branch is chosen |
|---|---|
| Conditions Only (auto-switch) | Branches are selected automatically from sim state. First match wins. This is the default and the behaviour described above. |
| Press Cycle (manual) | Press the dial to step to the next branch. No conditions are used at all. |
| Touch Cycle (manual) | Tap the LCD strip to step to the next branch. No conditions are used at all. |
| Conditions + Press Cycle | Conditions filter the list down to the branches that currently qualify, then pressing the dial cycles among those matches. |
| Conditions + Touch Cycle | Same filtering, but tapping the LCD strip cycles among the matches. |
Encoder State Toggle
The Encoder Control action has its own State Toggle section that determines how its ON/OFF icon state is decided. It offers one mode that the key actions do not:
- No State Change β the icon never switches state.
- SimVar Monitoring β watch a SimVar against a threshold.
- DCS Monitoring β watch a DCS cockpit argument or export variable against a threshold.
- Toggle on Touch β flip the state each time the LCD strip is tapped.
LCD Display
Stream Deck+ encoders have a 200Γ100 pixel LCD touch strip below each dial. The Encoder Control action splits this across two sections. LCD Display covers the strip's icon and its static label: a multiline Label Text field (Shift+Enter for a line break) with font, size, weight, colour, and X/Y placement, plus a Show Label toggle to switch it off entirely.
Live values come from the Stacked Variables section below it. Unlike the fixed four slots on a SimVar Display dial, this is an open list β press Add Slot for as many readouts as you want, and Remove on any you do not. Each slot has its own on/off switch and:
- Source β
SimVar / LVar,DCS Cockpit Argument(with an aircraft picker), orDCS Export Telemetry - Variable with a browse picker, and Units for SimVar sources
- Format, including the
{digit:N}token for splitting one value across several dials, and Decimals (Auto, or 0 to 3) - Label β a multiline caption for that specific slot, separate from the strip's main label
- X, Y, font size, and colour
Combined with the optional icon, this is what lets you build a real cockpit readout on the strip rather than a single bare number.
Slot labels always render at normal weight and inherit the slot's font family; only the value itself honours the weight setting. When a branch is active on a conditional dial, its name is drawn in bold orange at the top right of the strip, sized by that branch's own name font size field.
Troubleshooting
Common Issues
Buttons Show β Warning
This means the plugin cannot connect to HangarControl. Make sure HangarControl is running. If HangarControl is running but the warning persists, check that no firewall is blocking localhost connections on port 19850.
Icons Display But Actions Don't Fire
Icons are loaded locally from the plugin's icon pack and don't require a HangarControl connection. If icons display but pressing buttons does nothing, check the connection status in the property inspector. It should say Connected, not Disconnected (Icons OK).
Display Shows "---" Instead of Values
This means the SimVar hasn't returned a value yet. Common causes:
- The simulator is not running or not connected to HangarControl
- The SimVar name is misspelled β use the Browse Catalog to verify
- The SimVar requires specific units β try
numberorboolif the specified units don't work - For L:Vars, the aircraft must be fully loaded β some LVars aren't available until the cockpit is initialized
State Toggle Not Updating
If the button's ON/OFF icon state doesn't match the cockpit switch position:
- Verify the State Var name is correct (use Browse Catalog)
- Check the Threshold value β for boolean states, use
0.5. For percent states, adjust the threshold accordingly - Make sure Mode is set to
SimVar Monitoring(notNo State ChangeorToggle on Press) - On an Encoder Control dial watching a DCS value, use
DCS Monitoringrather thanSimVar Monitoring
Encoder Rotation Not Doing Anything
There is no disabled rotation mode, so the dial always has a mode selected β the problem is nearly always an unconfigured one. If using Adjust SimVar, verify the SimVar name and units are correct. If using Execute Actions, verify the CW and CCW event names are filled in. If using Conditional, confirm at least one branch matches β a set of branches that all fail leaves the dial with nothing to do, so always keep a no-condition fallback branch at the bottom.
Also check Target Zone. If it is set to Override to engaged zone and a TouchPanel zone is currently engaged, the dial is driving that zone rather than its own rotation action. That is working as designed β disengage the zone and normal function returns.
H:Events Not Working
Make sure the Prefix is set to H: in the SimConnect Event action. H:Events must include the prefix to be dispatched correctly. Also verify the event name matches exactly (H:Event names are case-sensitive for some aircraft).
Plugin Shows "Not Installed" After Update
After updating HangarControl, the plugin may need to be installed again. Go to Settings β Stream Deck Plugin and click Install Plugin (it reads Update Plugin when an older version is installed). This is expected behavior β the plugin is bundled with each HangarControl release.
HC Binding Key Does Nothing When Pressed
Before version 1.26.04, an HC Binding key could lose its action after a Stream Deck or PC restart while keeping its icon, readouts and state. Some keys picked up the action of the key in the same spot on another profile instead. This mostly hit decks built by duplicating profiles or pages, or by copying keys. Every key now keeps its own settings no matter how many copies of it exist, including keys copied while HangarControl was closed.
Keys that had already lost their action before updating need their action set up once more. After that they stay put.
Connection Problems
Plugin Never Connects
- Confirm HangarControl is running and you can see it in the system tray or taskbar.
- In HangarControl, check that the Stream Deck WebSocket server is active (logged as
SDPS-001in verbose logs). - Verify no other application is using port
19850. - If you run antivirus or firewall software, add an exception for HangarControl on localhost port 19850.
Connection Drops Intermittently
The plugin includes automatic reconnection with exponential backoff β it retries quickly at first (starting around one second) and backs off up to a maximum of ten seconds between attempts. If HangarControl restarts or temporarily loses the WebSocket, buttons will show β briefly and then recover automatically once the connection is re-established. A ping/pong heartbeat runs every 4 seconds and a dead connection is detected within about 12 seconds.
Catalog Browse Shows Empty Results
The event catalog is served from HangarControl. If the browse button opens but shows no results, HangarControl may not be connected to the simulator yet. Start your flight simulator and wait for HangarControl to show Connected in its home view, then try browsing again.
Quick Reference
Display Format Strings
| Format | Input Value | Result |
|---|---|---|
{value} |
247 | 247 |
HDG {value:000} |
5 | HDG 005 |
{value:0000} ft |
350 | 0350 ft |
COM1 {value} |
118.900 | COM1 118.900 |
{value} kts |
250 | 250 kts |
{digit:1} |
7200 | 7 |
{digit:3} |
7200 | 0 |
The {value:000} syntax adds leading-zero padding to the integer portion. The number of zeros determines the minimum digit count.
The {digit:N} token extracts the Nth digit of the value, counting from the left starting at 1. Use it to split a single value across several display slots or across several Stream Deck+ dials β a four-dial transponder readout, for example, where each dial shows one digit and adjusts that digit on rotation.
- Leading zeros are gone. A squawk of 0700 is the number 700, so
{digit:1}gives 7, not 0, and the whole readout shifts one place left. Padding with{value:0000}does not help β the two tokens cannot be combined. - An index past the end renders blank, not a zero. On that same 700,
{digit:4}shows nothing at all. - Decimals and the minus sign are discarded. Digit extraction is integer only.
{digit:N}, any {value} in the same slot is ignored β the digit token is handled first and returns immediately. Use one or the other, never both.
Common SimVar Prefixes
| Prefix | Type | Description |
|---|---|---|
A: |
Standard SimVar | Standard MSFS simulation variables (altitude, heading, etc.) |
L: |
Local Variable | Aircraft-specific variables set by the aircraft developer |
K: |
Key Event | SimConnect events (used in Event field, not display) |
H: |
HTML Event | Custom events from third-party aircraft |
B: |
Behavior Variable | MSFS 2024 input event system |
J: |
JavaScript Variable | MSFS 2024 JavaScript variables, available as a type in SimVar Write |
DCS: |
DCS Cockpit Argument | Used in display slots and conditions to read a raw DCS cockpit argument, e.g. DCS:404. DCS export variables are addressed by their key instead, e.g. GEAR or IAS. |
FLAG: |
HangarControl Flag | Used in a State Var field to drive a button's ON/OFF state from a flag, e.g. FLAG:AP_ACTIVE |
Common SimVar Units
| Unit | Used For |
|---|---|
number |
General numeric values (default) |
bool |
On/off states (0 or 1) |
degrees |
Heading, bearing, angles |
feet |
Altitude, elevation |
knots |
Airspeed, ground speed |
percent |
Throttle position, fuel level, etc. |
Mhz |
Radio frequencies (COM, NAV) |
feet per minute |
Vertical speed |
radians |
Some angular measurements |
pounds |
Weight/fuel quantities |
Keyboard Chord Syntax
| Modifier | Syntax | Example |
|---|---|---|
| Ctrl | Ctrl+ |
Ctrl+G |
| Shift | Shift+ |
Shift+P |
| Alt | Alt+ |
Alt+F4 |
| Combined | Ctrl+Shift+ |
Ctrl+Shift+F |
| Single key | (just the key) | G, Esc, F5 |