Introducing Pilot's Deck, a StreamDeck Plugin

PilotsDeck is a Plugin for Elegato’s StreamDeck with the Ability to trigger Cockpit-Controls in different Ways and especially reading & displaying a Control’s State on the StreamDeck as Text, Image, Bar/Arc or a Combination thereof. It is lean & mean, flexible, completely Open-Source and Free-to-Use.

StreamDeck-wise it behaves like any other StreamDeck Plugin: it runs alongside other Plugins and you can Drag, Drop, Copy, Paste the Actions like any other Action in the StreamDeck Software between your Folders, Pages or even different StreamDecks. The Action Configuration is done through the standard “Property Inspector” of the StreamDeck UI (for the “classic” Actions) or it’s own “Action Designer” UI (for the new Composite Action). But regardless of the UI: the Configuration is stored in the StreamDeck Profile - You can create, export and share Profiles with the Plugin’s Actions. On Top of the StreamDeck builtin Copy & Paste, it has also it’s own Mechanic allowing to share single Actions via Text with someone else.

Installation is done through its own Installer which will check all Requirements and installs them for you if necessary. With the included Profile Manager App you can easily install Profile Packages (containing the Profiles, Images and Scripts) and can map your existing StreamDeck Profiles for specific Airplanes or Simulators so that the Plugin automatically switches the Profile(s) on the StreamDeck(s). You can write Scripts to directly read Values from a Function, or trigger a Function as Command - all in its own internal Lua Engine (Credits to: Neolithos for NeoLua!).
The Plugin supports different StreamDeck Models: Mini, Standard/15-Key, XL, Mobile and Plus. Other Models might work, but an indented Support for Non-Display Models is not planned. The Plugin runs only on Windows. There are no Plans for Linux or macOS Support (the first is not supported by StreamDeck at all, both do not run or support all Sims and some essential .NET Libraries are only available on Windows).

Simulator-wise it supports all major Platforms on Windows - MS Flight Simulator, X-Plane and Prepar3D. Depending on the Sim, it either uses SimConnect, FSUIPC or UDP Connection (remote capable). Either way it will connect automatically as soon as a Simulator is running. All Variables and Commands these Connections allow are usable with the Plugin. You can can directly switch from one Sim to another without reconfiguring anything.
For Prepar3D (and theoretically FSX) FSUIPC is a Requirement, for MSFS it is Optional and for X-Plane not used at all. Either Way: you do not need a registered (bought) Copy of FSUIPC to make the Plugin in Work! (Though some old Profiles may require a registered Copy).

It is designed for advanced Sim-Users which “know how to do Stuff”: it does not give you any Lists to select Stuff from. If you know how to read Control-States for your Plane (e.g. which Variables to use) and how to trigger these Controls (e.g. which Command to use), you can quickly define Actions for that on the StreamDeck. Since it does not limit your Selection by a predefined List, you can do everything the Connection/Simulator currently allows :wink:
If you don’t: be eager to read & learn! :sweat_smile: I’ll try to give some Background in the Readme, but you have to take it from there!

Note: PilotsDeck is 100% free and Open-Source. The Software and the Developer do not have any Affiliation to Flight Panels. You basically spend Money instead of Time to let a Power-User create the Profile(s) for you. That is totally fine - IF you knew you had the Option. Choose the Approach that suits you best! :smiley:

Supported Simulator Versions

  • X-Plane 12 / 11 / <=10
    • Requirement: None - does not use XUIPC
  • Flight Simulator 2020 / X / 2004
    • Requirement: FSUIPC 7 & MobiFlight WASM / FSUIPC 4 / FSUIPC 3
  • Prepar3D v5 / v4 / v1-3
    • Requirement: FSUIPC 6 / 5 / 4

Supported is understood as “technical and basically supported by the Connection Method”. Support in Terms of ensured Compatibility, Fixing Issues and giving Support exists only for the latest Version of the three Major Simulators: X-Plane 12, MSFS2020, P3D v5. I’m happy if it works for older Versions, but I won’t make any Effort for them. It is time to go back to the Future! :sweat_smile:
And yes: the latest Version for Prepar3D is still considered v5, since v6 was just DOA with nearly every Addon-Dev announcing to not support it.

Supported Sim-Commands & -Variables

Here a quick Overview of what you can send to the Simulator (“Command”) or from what you can read Values from the Simulator (“Variable”). One of the Things which make the Plugin flexible: Variables can also be used as Commands. For Example to move a Cockpit-Control by writing a different Value to a Variable.
How Commands and Variables are configured and the different Options how they can be executed is described under 2.1 - Defining Commands & Variables.

  • MACRO | Command | MSFS, P3D, FSX

    • Execute any Macro known to FSUIPC
  • SCRIPT | Command | MSFS, P3D, FSX

    • Run any Lua-Code known to FSUIPC
  • CONTROL | Command | MSFS, P3D, FSX, FS9

    • Send any SimEvent defined by its numerical ID (also known as FS-Controls, Control-Codes. Numerical Variant of a K-Variable/K-Event)
  • LVAR | Command & Variable | MSFS, P3D, FSX

    • Read from / Write to any L-Var (“Local Variable”)
  • OFFSET | Command & Variable | MSFS, P3D, FSX, FS9

    • Read from / Write to any FSUIPC Offset
  • VJOY | Command | MSFS, P3D, FSX

    • Toggle/Clear/Set a Button of a virtual Joystick from FSUIPC
  • VJOYDRV | Command | ALL

    • Toggle/Clear/Set a Button of a virtual Joystick from the known vJoy Device Driver (if installed, not required)
  • AVAR | Command & Variable | MSFS

    • Read from / Write to any Simulation Variable (also known as A-Var)
  • KVAR | Command | MSFS

    • Send / Write to any Event-ID (also known as K-Var / SimConnect Event)
  • HVAR | Command | MSFS

    • Trigger any HTML Event in the Simulator (also know as H-Var)
  • BVAR | Command (& Variable)* | MSFS

    • Trigger InputEvents (also known as B-Var) - but only those that MSFS enumerates via SimConnect
  • CALCULATOR | Command & Variable** | MSFS

    • Run any Calculator/Gauge Code in the Simulator - either direct RPN Code or as Template for Increasing/Decreasing L-Vars
  • XPCMD | Command | XP

    • Send any Command known to X-Plane (as command_once)
  • XPWREF | Command & Variable | XP

    • Read from / Write to any X-Plane DataRef
  • LUAFUNC | Command & Variable | All

    • Run a Lua Function in the Plugin’s own Lua Engine
  • INTERNAL | Command & Variable | All

    • Read from / Write to an internal Variable (available everwhere within the Plugin)
  • = Per Default, B-Vars treated as Command-only Type - only some B-Var have an actual Value to read.
    ** = While you can read the Result from a RPN Expression, you can not write to it (like with other Variable Types).
    !! Please mind that the Command Types Script, Macro, Lvar (non MSFS) and vJoy can only work with a registered Version of FSUIPC!
    !! Both vJoy Command Types are independent of each other and are two different Things! “VJOY” can only be assigned within FSUIPC (and not in the Simulator). The “VJOYDRV” can be assigned by anything which understands a Joystick Button (Simulator, FSUIPC, Addons, …).

Available StreamDeck Actions

All Actions work on the Keypads (the normal/square StreamDeck Buttons). The Dial/Touchpad (aka Encoder) on the SD+ is supported by most Actions.

How these Actions can be configured and customized is described under 2.3 - Action specific Options.

  • Display Value (Keypad / Encoder)

    • Display a Sim Variable as Number or Text (display “ON” instead of “1”). You can scale/round/format the Value as needed and customize the Font-Settings.
  • Simple Button (Keypad)

    • Can only send Commands and always shows the same (configurable) Image. Supported in StreamDeck Multi-Actions!
  • Dynamic Button (Keypad / Encoder)

    • This Action dynamically changes the displayed Image based on a Variable (in Addition to sending Commands). Different Values trigger different Images.
  • Korry Button (Keypad / Encoder)

    • Intended for Korry-Switches in the Cockpit: the Action displays two “Sub-Images” independently of each other. They are shown/hidden based on their own Variable, but will not change the Image based on the Value.
  • COM Radio (Keypad / Encoder)

    • Intended for Com Frequencies: the Action shows two different Variables which can be independently scaled/rounded/formatted but share the same Font-Settings.
  • Display Gauge (Keypad / Encoder)

    • This Actions renders the Value dynamically on a Bar or Arc. Size, Color, Position and Font-Settings can be tweaked. It can optionally send Commands.
  • Display Gauge (Dual) (Keypad)

    • As before, but it renders two Values dynamically on the same Bar or Arc.
  • Composite Action (Keypad / Encoder)

    • Not a fixed Template as the other Actions, more a Canvas to draw on: you can add and freely configure different “Elements” (like Text, a Value, an Image) which can be dynamically altered via “Manipulators” on certain “Conditions”. Configured in it’s own dedicated “Action Designer” UI.
  • Profile Switcher (Keypad)

    • This not a “real” Action like the others, it only serves to enable/disable Profile Switching.

Installation & Requirements

Just Download & Run the Installer Binary! It will check and install all Requirements and installs/updates the Plugin (or remove it).

It is highly likely that you need to Unblock/Exclude the Installer & Plugin from BitDefender and other AV-/Security-Software. It’s the number one Reason for “the Plugin is not working”-Issues because either the Binary is blocked from running or is blocked when connecting to the StreamDeck Software.

DO NOT run the Installer, Plugin or StreamDeck Software “as Admin”. It is not recommended to MSFS or FSUIPC7 “as Admin” - it might work, it might fail.
If it still does not work right or at all, please check 4.2 - Troubleshooting.

The Requirements for the Plugin to run:

  • Windows 10 or 11 (updated)
  • StreamDeck Software v6.5 and above - The StreamDeck Software will be installed/updated by the Installer, if necessary.
  • .NET 8 - The x64 Desktop Runtime will be installed/updated by the Installer, if necessary. Reboot recommended when the Runtime was installed for the first Time.
  • IF used for MSFS/P3D/FSX: The latest Release of the FSUIPC Major Version specific to your Simulator (e.g. FSUIPC 6 for Prepar3D v4/5) - will be installed/updated by the Installer, if necessary.
  • IF used for MSFS: The latest Release of the WASM-Module from MobiFlight - will be installed/updated by the Installer, if necessary.
  • Optional: If you want to use VJOYDRV Commands you need the BrunnerInnovations Fork of the vJoy Driver - the installer will check the State, and offers to optionally install/update it for you.

The Plugin will be installed to:
%appdata%\Elgato\StreamDeck\Plugins\com.extension.pilotsdeck.sdPlugin

It is automatically started with the StreamDeck Software. It will spawn its own Icon in the System-Tray / Notification Area. Use this Icon to see if an Plugin Update is available, to access the Developer UI or open the Profile Manager to configure Profile Switching.

​Note: Since FSUIPC is only a “secondary” Connector for MSFS, you do not need to have it installed anymore (for MSFS). If you not plan to install/run FSUIPC7, please set the Parameter UseFsuipcForMSFS to false in the Plugin Configuration File (PluginConfig.json) after Installation!
But be aware that some older Profiles might still use Commands and Variables from FSUIPC and might not fully work then.

Installing Profile Packages (.ppp Files)

Starting with Version 0.8.0, the Plugin greatly improves Distribution and Installation of Profiles:

  1. Use the Profile Manager App found in the Plugin Directory to install Profile Packages: Open it via Plugin Icon in the System-Tray / Notification Area and drop the Package File to be installed on the big Arrow (or navigate to Package File’s Location).

  2. The Package File will be read and the Description (from the Author) will be displayed - check the Notes for additional Steps.

  3. If you already have Profiles with the same Name (as shown in the StreamDeck UI), the App will remove the old Profiles (and update existing Profile Mappings to the new ones). If want to keep the old Profiles, uncheck ‘Remove old Profiles’.
    If you want to keep the extracted Package Contents, check Keep extracted Files … The Contents will be kept in Profiles Sub-Folder of the Plugin (named after the Package Name).

  4. Click Install. Note that the StreamDeck Software will be automatically started and stopped as needed.

  5. The App will extract and copy the Images and Scripts to the Plugin Directory for you.
    The Profiles need to be installed through the StreamDeck UI: Click on the Link displayed in the Profile Manager App, wait for the StreamDeck UI to come up and the select the correct StreamDeck to install the clicked Profile to. Repeat for each Profile.
    You need to click every Link for the Installation to finish successfully. If you do not want or need one of the Profiles, just Cancel the Installation in the StreamDeck UI!

6)If selected, the App will now remove the old Profiles (if your updating existing Profiles), remove the “Copy” from the Profile Name (of the new ones) and update the Profile Mappings (if there are existing Mappings).
NOTE: The Update-Mechanic will only work, if you keep the Profile Name.

  1. The Package Author can include additional Files you might to install/use the Profiles. If so, you will find a Folder on your Desktop (named after the Package’s Name) with these additional Files.

See 3.6 - Profile Packages on how to create a Profile Packages to share your own Profiles!

README

The full Readme is available on GitHub - be sure to check it out!

11 Likes

Thank you very much for this one.. Due to RL® I didn’t have the time to install and tinker with it, but I read the docs on git + subscribed overthere. Should be a great tool!

Version Bump

v0.7.1 released:

  • Added some new Korry-Images for Busses
  • Added a black and round Switch Image
  • “Display Gauge” can now trigger Sim-Actions / can be mapped as other Buttons (both Single and Dual Gauges)
  • The Base Color of the Bar/Arc can be now changed based on another Variable/Value

Version Bump

v0.7.2 released:

  • Possible Workaround for SU10 Beta Lvar Issues
  • Fixed Gauge PIs: Input Fields for On/Off Value not showing up when Action Type LVAR is selected

For the Lvar Workaround: Change the Option “Fsuipc7LegacyLvars” to “true” in the PilotsDeck.dll.config File (and restart the StreamDeck Software). When a fixed/compatible Version of FSUIPC7 was released, change it back to “false”.

Version Bump

Version 0.7.3 Released!

MSFS SU10 Compatibility:

  • Compiled against FSUIPC 7.3.9h Beta (available in the FSUIPC Forum)

X-Plane Support:

  • The Plugin now connects directly to X-Plane via WebSocket
  • DataRefs can directly be entered (Commands, Value Access for read/write)
  • Profile Switching is supported based on the Livery Path

Comparisons:

  • Value Mappings now support multiple Comparisons (greater/lesser) and can be mixed with discrete Mappings (equality)
  • Values used for Image display can also be expressed as a comparison, e.g. “>=0.3”

Fenix PilotsDeck Integration:

  • Added more Switches & Buttons
  • Updated to new Icons (Black/Round)
  • GSX Integration
  • Updated for SU10

Version Bump

Version 0.7.4 Released:

  • Updated C# Client to current Version (should fix some connections Issues)
  • Bugfix for DataRefs not updating on the Deck when used more than once

Hey @Fraggie84 ! Love the plugin but I’m tearing my hair out - using Lvars I can get it to display the current state, it updates state fine when I flick a switch in-game but I can’t seem to get the streamdeck keypress to change the state. Where should I go for help with this please?

I should note - running 0.7.6, logs seem to show it all doing the right things e.g.:

streamdeck log excerpt:
20:07:19.815 StreamDeck ESDActionsGridViewModel::onKeyPressed(): Key 8 pressed: com.extension.pilotsdeck.action.display.switch
20:07:19.965 StreamDeck ESDActionsGridViewModel::onKeyReleased(): Key 8 released: com.extension.pilotsdeck.action.display.switch

PD log excerpt:
2022-10-26 20:07:19.958 [DBG] ActionBase:OnKeyDown CC0196110A502E197EA86125A26F1EA2 | “” [HandlerDisplaySwitch] Read: SWS_Kodiak_TankSelector_1 | Write: SWS_Kodiak_TankSelector_1| LongWrite: False -
2022-10-26 20:07:20.158 [DBG] ActionBase:OnKeyUp CC0196110A502E197EA86125A26F1EA2 | “” [HandlerDisplaySwitch] Read: SWS_Kodiak_TankSelector_1 | Write: SWS_Kodiak_TankSelector_1| LongWrite: False - | Ticks: 7508
2022-10-26 20:07:20.159 [DBG] GetValue: Returning empty Value for Variable SwitchStateLong
2022-10-26 20:07:20.159 [DBG] HandlerSwitch: Value toggled 0 → 1
2022-10-26 20:07:20.159 [DBG] IPCTools: Writing to SWS_Kodiak_TankSelector_1

Resolved: FSUIPC / WASM Version was too old

Version Bump

Version 0.7.7 Released:

  • Toggle Switch Option for Control and XP-Commands added (toggle a Switch with two different Controls/Commands)
  • XP-Commands can now be chained
  • HVars can now be chained
  • Updated Libraries (full SU11 Compatibility). Now requires .NET 7!
  • Now compiled for .NET 7 (Update your Runtime!)
  • Improved Sim-Connection/-State Handling
  • Fixed Bug with XP-DataRefs where they would not update when a DataRef is used multiple times on one Profile/Folder
  • Fixed Bug with Profile Switching with XP12
  • Fixed Bug with Comparisons/Value Matching
  • Fixed Bug where Actions would stay in Error State

Great work. Thnx.

Could you help me with an issue ?

So the Garmin GTN gauges (in the flight simulator cockpit) have soft keys where you can toggle GPS or Vloc mode for Nav. A CDi switch I think it’s called.

This usually syncs with the GPS/NAV switch in the cockpit.

I have not found one Stream deck profile yet that allows for these to be accessed.

Has anyone got any ideas …?

BTW, I am specifically using Axis and Ohs and the TDS GTN 750.

And I have both the 3x5 Mk2 and the 32 key XL.

Well, I can’t help you with AAO obviously :sweat_smile:

The basic “Rule” for my Plugin: when you can manipulate a Switch with FSUIPC, you can also manipulate it with my Plugin. (MSFS, P3D, FSX)

And I just made a quick-look in the Controls List Text-File of FSUIPC - it is in your My Documents\FSUIPC7 Folder.
There are several Controls (aka SimConnect Events) for G1000 Softkeys (like G1000_PFD_SOFTKEY1 or G1000_MFD_SOFTKEY6 for example) - are these the ones you are searching for?

Can’t tell you how to use these in AAO. For my Plugin:
Have a look at that Text-File and copy out the (numeric) Event ID for what you need and use it as Action Address in PilotsDeck (with Action Type “Control” of course).

1 Like

Could the Streamdeck pedals be programmed to use as rudder pedals?

Ehm … No. It is not possible and will never be. It does just not make sense:

  1. They are just “Feet-Buttons”, anyone would be far better of with the cheapest Rudder-Pedals buyable.
  2. They do not display anything (the basic Point of the Plugin is to also visualize the State of a Control).
  3. The Plugin does not have any thing to do with Joystick-Axis’s (and will never).

If you really want to have digital Brakes or Rudder (either full off or full on) you could also use the StreamDeck-Plugin which triggers vJoy Buttons (GitHub - ashupp/Streamdeck-vJoy: Map elgato stream deck buttons to vJoy buttons).
It may also work with my Plugin (since it is also able to trigger vJoy Buttons), but I just never considered the SD Pedals while coding.

1 Like

Version Bump

The Release with a big Plus :D

Version 0.7.8:

  • Added Support for the SD Plus!
    • The Actions “Display Value with Switch”, “COM Radio” and “Display Gauge” are also available on the Encoders
    • You can set separate Commands for Left, Right and TouchTap (no Hold or Long-Touch)
    • The Normal/Long Press (called Main and Second Command now) are mapped to pressing the Dial
    • Besides having more Commands to set, they behave the same as their KeyPad Variant
  • Simple “Value Manipulations” possible on all Variables used as Command
    • Increasing/Decreasing by a defined Step with an optional Limit
    • Sending a Sequence of Values
    • The Calculator Command now understands two Templates for increasing/decreasing L-Vars and triggering K-Vars (SimEvents) without the Need to write full RPN Code. Especially the Template for inc/decreasing is very useful on the Encoders for Left & Right (on L-Var based Aircraft. Else prefer Controls/K-Vars).
  • “Toggle Switch” now available on all Actions and all non-Variable based Commands (except vJoys)
    • A separate Variable to Monitor can now be configured
    • But still only available for the Main Command
  • Reset Value renamed to “Reset Switch.” Available on all Variable-based Commands (except vJoys) and all Actions
  • A new Option called “Hold Switch” available on all Commands except vJoys. Because it will act like a vJoy! With that Option but you can directly configure the Commands (or Values) for down/pressed and up/unpressed in the StreamDeck UI!
  • The Dynamic Button now allows to define an “Image Map”. It works roughly like the Value-to-Text Mappings: You can map Values to Images, as many as you like (so more than 3 States are possible now!)
  • The Format options now also allows to add leading Zeros
  • The Plugin now has an Installer as the recommended Way to install it. It will check the basic Requirements and informs which are missing.
  • The Plugin now uses the WASM Module from Mobi-Flight (Requirement now)
    • Situations where new L-Vars could not be read because FSUIPC ran into its Limit are gone now!
    • That also enables the Plugin to read any A-Var (SimVar) -they can be accessed without the Need for the myOffsets File. And generally accessing them by Name instead of an arbitrary Hex-Number - but you have to get the Units right, though.
    • FSUIPC is still the main Connection Method (and thus Requirement) for anything but X-Plane.
    • The Plugin is just using something else in the Background for LVars, HVars and Calculator. Nothing to reconfigure in your Profiles.
  • The Plugin now includes ImportProfiles Tool to make it a little bit easier to use your own/downloaded Profiles for Switching
    • It asks for the DeckType and imports every Profile from the \Profiles Subfolder to the Plugin manifest
    • The selections are saved on each run. It will only ask for new Profiles (handy on Plugin Updates)
    • The old empty and preconfigured Profiles Whiskey, X-Ray and so on are not needed anymore. They can be deleted if never used.
  • Some Improvements in the Property Inspector
    • Added a small Image Preview in the Property Inspector for every Image Selection
    • Renamed and Reordered some Options so that there is a bit more commonality, e.g. using the Terms Command and Variable throughout
    • Tried to improve the Appearance a little bit, but my CSS-Skills are just INOP ^^
  • The Default Image drawn when not connected is now closer to the current Configuration so that changes can be better previewed. A Value of 0 is assumed.
  • The Readme was completely overhauled … which is hopefully an Improvement!
  • Much Rewrites/Refactors in the Background and Bugs I found on the Way ;D
  • Airbus Profiles/Integrations with the new Features: FSLabs, Fenix, ToLiss. The FBW too, within the possibilities given …

Version Bump

Just a little Maintenance
Name User GIF

Version 0.7.9

  • L-Var Names can now contain Colons : and Dots .
    (For Names like A32NX_ENGINE_N1:1 or A320.audio.1.tone)
  • Version-Checks for the Installer improved, i.e. does not fail with StreamDeck SW 6.1
  • Requirements increased: FSUIPC 7.3.19, NET 7.0.4
  • Libraries updated

Hi @Fraggie84 !! Thanks a lot for your work on this plugin.
I am starting to use it and looks like the tool I was looking for for my StreamDeckPlus.
So my first question is: Do you know any Youtube video of someone using the plugin?
And second: Are the profiles (AppData\Roaming\Elgato\StreamDeck\Plugins\com.extension.pilotsdeck.sdPlugin\Profiles) working? They look empty to me.
Thanks!

Hello Jimmy, thanks!

I’m not aware of any YouTube Videos I’m afraid. The hardest Part in defining Actions is to know how a State of a Control can be read and manipulated, and that is widely different between Airplanes even in the same Sim. And that is hard to cover in a Video.
The Readme is quite extensive though.

Yeah sure, the Profiles are meant to be empty. They are only relevant for the Profile-Switching Feature. So that there is a Default Profile to switch to if that Feature is enabled. Profiles from that Folder should not be installed manually by the way.
That Profile-Switching is bit more advanced (since not really intended by Elgato) - start with the Basics first. :slight_smile:

1 Like

Awesome, thanks for the info.

I still would find very positive to provide a finished small profile as example and a link to a quick video tutorial.
Your Readme is great but took me quite some time to understand how the plugin works.
Very happy when I finished my first dial that changes the camera FOV. :slight_smile:

Good job!

Version Bump

Version 0.7.10

  • Fixed: DataRefs containing only 1 Character long Names where not recognized (The first Name in the Path still needs to be at least 2 Character long!)
  • Fixed: Offset-Addresses where sometimes registered as L-Var (and thus a L-Var with that Name was created)
  • Fixed: Links in the Installer pointed to the wrong minimum .NET Version (listed for completeness, was * already fixed in the 0.7.9 Binary after the 3rd April)