Fsuipc Python
Unlocking Flight Simulator Data: A Deep Dive into FSUIPC and Python
For serious flight simulation enthusiasts, moving beyond the joystick and keyboard is a rite of passage. Whether you want to build a custom cockpit instrument panel, log flight data for analysis, or create a sophisticated auto-pilot script, you need a way to reach deep into the simulator’s internal data. This is where FSUIPC (Flight Simulator Universal Inter-process Communication) becomes invaluable. And when you pair it with Python, one of the world’s most accessible and powerful programming languages, you unlock near-limitless potential for automation, data extraction, and hardware integration.
This article explores what FSUIPC is, why Python is an ideal partner for it, and how you can get started reading and writing simulator data.
Read a simple offset: 0x0D80 contains the SIMULATION STATE (4 bytes)
state = fsuipc.read(0x0D80, 4) print(f"Simulator state: state")
fs.close()
Run this while your flight simulator is running. If no errors appear, you’re ready.
Step 2: Basic Connection Script
Let's create a script that connects to the simulator and reads your current Altitude and Speed. fsuipc python
Create a file named read_data.py:
import fsuipc import timedef main(): # 1. Establish connection with FSUIPC # FSUIPC must be running and the Sim must be active try: fsuipc_client = fsuipc.FSUIPC() print("Connected to FSUIPC successfully!") except Exception as e: print(f"Failed to connect: e") return
try: # 2. Prepare read requests # We create a list of data we want to read. # format: (Offset, Type) # Offset 0x0570: Altitude (in meters, as a double/float64) # Offset 0x02BC: Airspeed (in knots, as an int32) # Note: 'd' = double (8 bytes), 'l' = long/int (4 bytes) # You can chain prepare() calls or pass them in a list. # Here we use 'd' for double precision altitude # and 'H' for unsigned short (2 bytes) just to demonstrate types. # Let's use standard documented types for this example: # Altitude: Offset 0x6020 is often easier (Ground Alt), but let's use standard 0x0570 # 0x0570 is 8 bytes (double) data = fsuipc_client.prepare([ (0x0570, 'd'), # Altitude (0x02BC, 'l') # Airspeed ]) # 3. Read the data loop print("Reading data... Press Ctrl+C to stop.") while True: # .read() executes the query and returns a tuple of results altitude, airspeed = fsuipc_client.read() # Altitude from 0x0570 is in meters. Convert to feet. altitude_ft = altitude * 3.28084 print(f"Altitude: altitude_ft:.2f ft | Airspeed: airspeed kts") time.sleep(1) # Wait 1 second before reading again except KeyboardInterrupt: print("\nStopping...") finally: # 4. Close connection fsuipc_client.close() print("Connection closed.")
if name == "main": main()
3. Arduino Button Box via Python
Using pyserial, read physical button presses from an Arduino and send them to the simulator. Unlocking Flight Simulator Data: A Deep Dive into
Arduino code (simple button press on pin 2):
void setup()
Serial.begin(9600);
pinMode(2, INPUT_PULLUP);
void loop()
if (digitalRead(2) == LOW)
Serial.println("GEAR_TOGGLE");
delay(200);
Python FSUIPC bridge:
import fsuipc import serial import timefs = fsuipc.connect() ser = serial.Serial('COM3', 9600)
while True: line = ser.readline().decode().strip() if line == "GEAR_TOGGLE": # Toggle landing gear (offset 0x0BEC, byte 0 = 1 for up, 0 for down) fs.write(0x0BEC, b'\x01') # Toggle event print("Gear toggled") time.sleep(0.1)
The Core Library: pyuipc (or fsuipc)
The bridge between Python and FSUIPC is a third-party library called pyuipc (sometimes referred to as fsuipc.py). Created by enthusiasts, this library wraps the FSUIPC DLL interface, allowing Python to talk directly to the simulator via FSUIPC’s memory-mapped file or network interface.
Note: There are a few variants (e.g.,
pyuipc,fsuipc-python). For this article, we’ll focus on the most commonly used approach usingpyuipcor the FSUIPC SDK’sFSUIPC.pyexample.
Available Data
The following data are available through FSUIPC:
- Aircraft Data
Latitude(float)Longitude(float)Altitude(float)Heading(float)
- Flight Data
Airspeed(float)MachNumber(float)VerticalSpeed(float)
Reading Offsets in Python
import fsuipc import structfs = fsuipc.connect()
Read latitude (offset 0x0560, 8 bytes double)
lat = fs.read_double(0x0560) print(f"Latitude: lat")Run this while your flight simulator is running
📌 Offsets are documented in the FSUIPC Offset Status document.