Firn
Well-known member
- Thread starter
- #1
I’ve been working on getting better data visibility for my F-150 Lightning. While FORScan and Car Scanner are the gold standards for seeing what’s going on, they are not always the most convenient tool for long-term logging or custom dashboards. I wanted to move that high-level data into Torque, but that requires knowing the exact hex PIDs and the specific math formulas Ford uses—and the current PID list is inadequate.
To solve this, I used Google Gemini Pro as a data science partner. By feeding the AI raw Bluetooth packet logs and comparing them to live app data, I was able to bridge the gap. We aren't "finding" PIDs that didn't exist—FORScan already sees them—but we are deconstructing them so they can be used in other applications.
The Breakthrough: AI-Enabled Correlation
Typically, matching raw hex values to real-world sensor data requires significant experience in signal processing or software engineering. You have to account for clock drift, filter out thousands of background messages, and solve for linear equations (Scale/Offset) manually.
By using Gemini , I was able to upload the raw .pcapng packet logs and the CSV logs from the diagnostic apps directly. The AI performed the time-syncing and regression analysis automatically. You still have to validate the results, in one instance it switched brake pedal travel and LF brake pressure, but to be honest it also identified that the brake pedal travel PID had unusually high precision. This mistake is not surprising, brake pedal travel and pressure exactly matched (truck was parked) so the plots looked near the same.
Note: While I used a paid Gemini account for the massive context window needed for long logs, you can do this with the free version by feeding it smaller snippets of data.
How to Do It Yourself (Instructional Guide)
If you want to help expand our community PID list, here is the pathway to capture the data.
1. The Sniffer Setup (Windows)
Standard Wireshark on Windows can’t see Bluetooth traffic without help. You need the Microsoft Bluetooth Virtual Sniffer (BTVS).
3. The Analysis
Once you have your logs, you can use an AI like Gemini to do the math. Tell it: "I have a Bluetooth log (hex) and a sensor log (decimal). Match the timestamps and find the hex PID and the formula for [Sensor Name]."
What We’ve Mapped So Far
Through this process, I’ve already moved several high-fidelity sensors over to Torque:
Call to Action: Let's Build the List
This is just the start. There are hundreds of PIDs available in the different modules. Tons for the IPC, IPMA, APIM, etc. If you have a favorite sensor or trigger in FORScan that you wish you had in Torque, use the pathway above to capture a log (or give me a shout).
Post your logs or your findings here, and let’s see how large of a "community dictionary" we can build for the Lightning.
Copy into text editor and save as CSV. These need to be validated.
Name,ShortName,ModeAndPID,Equation,Min Value,Max Value,Units,Header,Description
AC Status,AC_STAT,229938,A,0,1,state,733,HVAC: Compressor Status
Blower Speed,BLW_SPD,22995A,A,0,100,%,733,HVAC: Blower Speed (100 is OFF)
Heated Seat Drvr,H_SEAT_L,229801,A,0,3,state,733,HVAC: 0=Off 1=Low 2=Med 3=High
Left Blend Door,L_BLEND,229B02,A,0,100,%,733,HVAC: Left Actuator Pos
Right Blend Door,R_BLEND,229B03,A,0,100,%,733,HVAC: Right Actuator Pos
Evap Temp,EVAP_T,224057,A-15,0,100,°F,733,HVAC: Evaporator Temp
Recirc Door Pos,RECIRC,229B00,A/2.55,0,100,%,733,HVAC: Recirculation Door Position
Cabin Heater Status,HTR_CAB,224836,A,0,255,raw,733,HVAC: Heater Core Status
L DRL Status,L_DRL,2240E7,A,1,2,state,7C4,LDCMA: 1=OFF 2=ON
L High Beam,L_HIBEAM,2242BE,A,1,2,state,7C4,LDCMA: High Beam Status
L Turn Signal,L_TURN,224255,A,1,2,state,7C4,LDCMA: Turn Signal Status
L Low Beam,L_LOBEAM,2242A0,A,1,2,state,7C4,LDCMA: Low Beam Status
L Static Bending,L_SBL,224266,A,1,2,state,7C4,LDCMA: Static Bending Status
High Beam Status,HIBEAM,2242A0,A,1,2,state,7C4,LDCMA: High Beam Output
Tire Press LF,TP_LF,222813,(A*256+B)/20,0,60,psi,726,BCM: Left Front Pressure
Tire Press RF,TP_RF,222814,(A*256+B)/20,0,60,psi,726,BCM: Right Front Pressure
Tire Press LR,TP_LR,222816,(A*256+B)/20,0,60,psi,726,BCM: Left Rear Pressure
Tire Press RR,TP_RR,222815,(A*256+B)/20,0,60,psi,726,BCM: Right Rear Pressure
Tire Temp L,TPM_L_T,22280B,(G*1.8)-40,-40,200,°F,726,BCM: Tire Temperature
Stop Lamp CHMSL,CHMSL,2240F5,A,1,2,state,726,BCM: Center Brake Lamp
Brake Pedal Travel,BRK_TRAV,222823,(A*256+B)/2540,0,5,in,760,ABS: Brake Pedal Position
Brake Pressure LF,BRK_PRES,222B28,(A*256+B)*0.145,0,2000,psi,760,ABS: LF Brake Pressure
Lateral G Force,LAT_G,222B0C,(SIGNED(A*256+B))*0.004,-2,2,G,760,ABS: Lateral Acceleration
Parking Brake Sw,PK_BRK,222B00,A,0,255,state,760,ABS: Parking Brake Status
Steering Angle,STR_ANG,223302,((A*256+B)-7800)/10,-900,900,°,760,ABS: Steering Wheel Angle
Steering Current,STR_CUR,22330C,A*0.2,0,100,A,730,PSCM: Steering Motor Current
Steering Torque 1,STR_TQ1,22EE05,(SIGNED(A*256+B))*0.737,-500,500,ft-lb,7E4,PSCM: Steering Torque 1
Steering Torque 2,STR_TQ2,22EE07,(SIGNED(A*256+B))*0.737,-500,500,ft-lb,7E4,PSCM: Steering Torque 2
Accelerator Pedal,APP,22F449,A*100/255,0,100,%,7E0,PCM: Accelerator Position
Baro Pressure,BARO,22F433,A*0.145,0,20,psi,7E0,PCM: Barometric Pressure
Coolant Temp,ECT,22F405,(A-40)*1.8+32,-40,250,°F,7E0,PCM: Engine Coolant Temp
Vehicle Speed,VSS_MPH,22F40D,A*0.621,0,120,mph,7D0,Vehicle Speed (mph)
Battery Temp High,BATT_T_H,224800,(A-50)*1.8+32,0,150,°F,7E4,BECM: Max Battery Temp
Battery Temp Avg,BATT_T_AVG,22FD70,(B-51)*1.8+32,0,150,°F,7E4,BECM: Avg Battery Temp
Battery Current L,BATT_CUR,22480A,(A*256+B)/336,-100,100,A,7E4,BECM: Low Range Current
Battery Energy Est,BATT_kWh,224848,(A*256+B)*0.002,0,150,kWh,7E4,BECM: Energy Estimate
SOC Actual,SOC_ACT,22F45B,A*100/255,0,100,%,7E4,BECM: Raw SOC
SOC Displayed,SOC_D,224845,A*0.5,0,100,%,7E4,BECM: Dashboard SOC
Charging Power,CHG_PWR,22484E,(A*256+B)*5,0,150000,W,7E4,BECM: Charging Wattage
Charge Status,CHG_STAT,22484D,A,0,5,state,7E4,BECM: Charge Status Flags
Coolant Inlet Temp,COOL_IN,224846,(A-50)*1.8+32,0,150,°F,7E4,BECM: Cooling Loop Inlet
Coolant Temp 2,ECT2,22483A,(A-40)*1.8+32,0,150,°F,7E4,BECM: Secondary Coolant Temp
Conv High Current,CONV_HI,220582,(A*256+B)*0.05,0,500,A,7E4,BECM: DC/DC High Current
Conv Low Current,CONV_LO,22D118,(A*256+B)*0.01,0,100,A,7E4,BECM: DC/DC Low Current
L Headlamp Swivel,L_SWIV,227102,(A*256+B)/6.4,0,360,deg,734,HCM: Left Swivel Angle
R Headlamp Swivel,R_SWIV,227104,(A*256+B)/6.4,0,360,deg,734,HCM: Right Swivel Angle
ECU Delta Temp,ECU_DT,22DD81,A-18,0,100,°F,7E4,BECM: ECU Temp Delta
Cell Voltage Var,CELL_VAR,22483F,(A*256+B)/400,0,1,V,7E4,BECM: Cell Variation
Current Range HG,CUR_HG,22FD39,A,0,255,range,7E4,BECM: Current Range High
Current Range LW,CUR_LW,22FD38,A,0,255,range,7E4,BECM: Current Range Low
BECM Info 02,BECM_I02,22F800,A,0,255,flags,7E4,BECM: Info Flags
Power Remaining,BATT_REM,224801,(A*256+B)/500,0,100,%,7E4,BECM: Remaining Capacity %
Motor Torque Pri,MTR_TQ1,22481C,((SIGNED(A*256+B))*0.1),-1000,1000,Nm,7E6,Inverter: Primary Motor Torque
Motor Torque Sec,MTR_TQ2,224822,((SIGNED(A*256+B))*0.1),-1000,1000,Nm,7E7,Inverter: Secondary Motor Torque
Motor Speed Pri,MTR_SPD1,221E2C,(SIGNED(A*256+B)),-6000,12000,RPM,7E6,Inverter: Primary Motor Speed
Motor Speed Sec,MTR_SPD2,224821,(SIGNED(A*256+B)),-6000,12000,RPM,7E7,Inverter: Secondary Motor Speed
Motor Inv Temp Pri,INV_T1,22481D,((SIGNED(A*256+B))*1.8+32),-40,300,°F,7E6,Inverter: Primary Temp
Motor Inv Temp Sec,INV_T2,22481E,((SIGNED(A*256+B))*1.8+32),-40,300,°F,7E7,Inverter: Secondary Temp
Charger AC Volt,CHG_AC_V,22485E,(A*256+B)*0.01,0,300,V,7E2,Charger: AC Input Voltage
Charger AC Curr,CHG_AC_I,22485F,A,0,100,A,7E2,Charger: AC Input Current
Charger AC Freq,CHG_AC_F,224860,A*0.5,30,90,Hz,7E2,Charger: AC Frequency
Charger DC Coup T,CHG_DC_T,22D00C,(A-40)*1.8+32,-40,400,°F,7E2,Charger: DC Coupler Temp
To solve this, I used Google Gemini Pro as a data science partner. By feeding the AI raw Bluetooth packet logs and comparing them to live app data, I was able to bridge the gap. We aren't "finding" PIDs that didn't exist—FORScan already sees them—but we are deconstructing them so they can be used in other applications.
The Breakthrough: AI-Enabled Correlation
Typically, matching raw hex values to real-world sensor data requires significant experience in signal processing or software engineering. You have to account for clock drift, filter out thousands of background messages, and solve for linear equations (Scale/Offset) manually.
By using Gemini , I was able to upload the raw .pcapng packet logs and the CSV logs from the diagnostic apps directly. The AI performed the time-syncing and regression analysis automatically. You still have to validate the results, in one instance it switched brake pedal travel and LF brake pressure, but to be honest it also identified that the brake pedal travel PID had unusually high precision. This mistake is not surprising, brake pedal travel and pressure exactly matched (truck was parked) so the plots looked near the same.
Note: While I used a paid Gemini account for the massive context window needed for long logs, you can do this with the free version by feeding it smaller snippets of data.
How to Do It Yourself (Instructional Guide)
If you want to help expand our community PID list, here is the pathway to capture the data.
1. The Sniffer Setup (Windows)
Standard Wireshark on Windows can’t see Bluetooth traffic without help. You need the Microsoft Bluetooth Virtual Sniffer (BTVS).
- Download: Get the "Bluetooth Test Platform" from Microsoft.
- The Shortcut: Navigate to the folder containing btvs.exe. Click into the Address Bar of your File Explorer, type cmd, and hit Enter.
- Launch: In the command window, type btvs.exe -Mode Wireshark. This will open Wireshark and start piping your Bluetooth traffic into it.
- Laptop Method: Run FORScan and select 5–10 PIDs you want to map. Start your Wireshark capture and perform a specific action (e.g., sweep the steering wheel or plug in a charger).
- Android Method: Enable "Bluetooth HCI Snoop Log" in Developer Options. Run CarScanner or similar, do your test, and then pull the log via a Bug Report.
3. The Analysis
Once you have your logs, you can use an AI like Gemini to do the math. Tell it: "I have a Bluetooth log (hex) and a sensor log (decimal). Match the timestamps and find the hex PID and the formula for [Sensor Name]."
What We’ve Mapped So Far
Through this process, I’ve already moved several high-fidelity sensors over to Torque:
| Sensor | PID | Equation | Header |
| High-Res SOC | 224801 | (A*256+B)/500 | 7E4 |
| Brake Pressure (LF) | 222B28 | (A*256+B)/6.89 | 760 |
| Charging Power (W) | 22484E | (A*256+B)*5 | 7E4 |
| Energy to Empty (kWh) | 224848 | (A*256+B)/500 | 7E4 |
Call to Action: Let's Build the List
This is just the start. There are hundreds of PIDs available in the different modules. Tons for the IPC, IPMA, APIM, etc. If you have a favorite sensor or trigger in FORScan that you wish you had in Torque, use the pathway above to capture a log (or give me a shout).
Post your logs or your findings here, and let’s see how large of a "community dictionary" we can build for the Lightning.
Copy into text editor and save as CSV. These need to be validated.
Name,ShortName,ModeAndPID,Equation,Min Value,Max Value,Units,Header,Description
AC Status,AC_STAT,229938,A,0,1,state,733,HVAC: Compressor Status
Blower Speed,BLW_SPD,22995A,A,0,100,%,733,HVAC: Blower Speed (100 is OFF)
Heated Seat Drvr,H_SEAT_L,229801,A,0,3,state,733,HVAC: 0=Off 1=Low 2=Med 3=High
Left Blend Door,L_BLEND,229B02,A,0,100,%,733,HVAC: Left Actuator Pos
Right Blend Door,R_BLEND,229B03,A,0,100,%,733,HVAC: Right Actuator Pos
Evap Temp,EVAP_T,224057,A-15,0,100,°F,733,HVAC: Evaporator Temp
Recirc Door Pos,RECIRC,229B00,A/2.55,0,100,%,733,HVAC: Recirculation Door Position
Cabin Heater Status,HTR_CAB,224836,A,0,255,raw,733,HVAC: Heater Core Status
L DRL Status,L_DRL,2240E7,A,1,2,state,7C4,LDCMA: 1=OFF 2=ON
L High Beam,L_HIBEAM,2242BE,A,1,2,state,7C4,LDCMA: High Beam Status
L Turn Signal,L_TURN,224255,A,1,2,state,7C4,LDCMA: Turn Signal Status
L Low Beam,L_LOBEAM,2242A0,A,1,2,state,7C4,LDCMA: Low Beam Status
L Static Bending,L_SBL,224266,A,1,2,state,7C4,LDCMA: Static Bending Status
High Beam Status,HIBEAM,2242A0,A,1,2,state,7C4,LDCMA: High Beam Output
Tire Press LF,TP_LF,222813,(A*256+B)/20,0,60,psi,726,BCM: Left Front Pressure
Tire Press RF,TP_RF,222814,(A*256+B)/20,0,60,psi,726,BCM: Right Front Pressure
Tire Press LR,TP_LR,222816,(A*256+B)/20,0,60,psi,726,BCM: Left Rear Pressure
Tire Press RR,TP_RR,222815,(A*256+B)/20,0,60,psi,726,BCM: Right Rear Pressure
Tire Temp L,TPM_L_T,22280B,(G*1.8)-40,-40,200,°F,726,BCM: Tire Temperature
Stop Lamp CHMSL,CHMSL,2240F5,A,1,2,state,726,BCM: Center Brake Lamp
Brake Pedal Travel,BRK_TRAV,222823,(A*256+B)/2540,0,5,in,760,ABS: Brake Pedal Position
Brake Pressure LF,BRK_PRES,222B28,(A*256+B)*0.145,0,2000,psi,760,ABS: LF Brake Pressure
Lateral G Force,LAT_G,222B0C,(SIGNED(A*256+B))*0.004,-2,2,G,760,ABS: Lateral Acceleration
Parking Brake Sw,PK_BRK,222B00,A,0,255,state,760,ABS: Parking Brake Status
Steering Angle,STR_ANG,223302,((A*256+B)-7800)/10,-900,900,°,760,ABS: Steering Wheel Angle
Steering Current,STR_CUR,22330C,A*0.2,0,100,A,730,PSCM: Steering Motor Current
Steering Torque 1,STR_TQ1,22EE05,(SIGNED(A*256+B))*0.737,-500,500,ft-lb,7E4,PSCM: Steering Torque 1
Steering Torque 2,STR_TQ2,22EE07,(SIGNED(A*256+B))*0.737,-500,500,ft-lb,7E4,PSCM: Steering Torque 2
Accelerator Pedal,APP,22F449,A*100/255,0,100,%,7E0,PCM: Accelerator Position
Baro Pressure,BARO,22F433,A*0.145,0,20,psi,7E0,PCM: Barometric Pressure
Coolant Temp,ECT,22F405,(A-40)*1.8+32,-40,250,°F,7E0,PCM: Engine Coolant Temp
Vehicle Speed,VSS_MPH,22F40D,A*0.621,0,120,mph,7D0,Vehicle Speed (mph)
Battery Temp High,BATT_T_H,224800,(A-50)*1.8+32,0,150,°F,7E4,BECM: Max Battery Temp
Battery Temp Avg,BATT_T_AVG,22FD70,(B-51)*1.8+32,0,150,°F,7E4,BECM: Avg Battery Temp
Battery Current L,BATT_CUR,22480A,(A*256+B)/336,-100,100,A,7E4,BECM: Low Range Current
Battery Energy Est,BATT_kWh,224848,(A*256+B)*0.002,0,150,kWh,7E4,BECM: Energy Estimate
SOC Actual,SOC_ACT,22F45B,A*100/255,0,100,%,7E4,BECM: Raw SOC
SOC Displayed,SOC_D,224845,A*0.5,0,100,%,7E4,BECM: Dashboard SOC
Charging Power,CHG_PWR,22484E,(A*256+B)*5,0,150000,W,7E4,BECM: Charging Wattage
Charge Status,CHG_STAT,22484D,A,0,5,state,7E4,BECM: Charge Status Flags
Coolant Inlet Temp,COOL_IN,224846,(A-50)*1.8+32,0,150,°F,7E4,BECM: Cooling Loop Inlet
Coolant Temp 2,ECT2,22483A,(A-40)*1.8+32,0,150,°F,7E4,BECM: Secondary Coolant Temp
Conv High Current,CONV_HI,220582,(A*256+B)*0.05,0,500,A,7E4,BECM: DC/DC High Current
Conv Low Current,CONV_LO,22D118,(A*256+B)*0.01,0,100,A,7E4,BECM: DC/DC Low Current
L Headlamp Swivel,L_SWIV,227102,(A*256+B)/6.4,0,360,deg,734,HCM: Left Swivel Angle
R Headlamp Swivel,R_SWIV,227104,(A*256+B)/6.4,0,360,deg,734,HCM: Right Swivel Angle
ECU Delta Temp,ECU_DT,22DD81,A-18,0,100,°F,7E4,BECM: ECU Temp Delta
Cell Voltage Var,CELL_VAR,22483F,(A*256+B)/400,0,1,V,7E4,BECM: Cell Variation
Current Range HG,CUR_HG,22FD39,A,0,255,range,7E4,BECM: Current Range High
Current Range LW,CUR_LW,22FD38,A,0,255,range,7E4,BECM: Current Range Low
BECM Info 02,BECM_I02,22F800,A,0,255,flags,7E4,BECM: Info Flags
Power Remaining,BATT_REM,224801,(A*256+B)/500,0,100,%,7E4,BECM: Remaining Capacity %
Motor Torque Pri,MTR_TQ1,22481C,((SIGNED(A*256+B))*0.1),-1000,1000,Nm,7E6,Inverter: Primary Motor Torque
Motor Torque Sec,MTR_TQ2,224822,((SIGNED(A*256+B))*0.1),-1000,1000,Nm,7E7,Inverter: Secondary Motor Torque
Motor Speed Pri,MTR_SPD1,221E2C,(SIGNED(A*256+B)),-6000,12000,RPM,7E6,Inverter: Primary Motor Speed
Motor Speed Sec,MTR_SPD2,224821,(SIGNED(A*256+B)),-6000,12000,RPM,7E7,Inverter: Secondary Motor Speed
Motor Inv Temp Pri,INV_T1,22481D,((SIGNED(A*256+B))*1.8+32),-40,300,°F,7E6,Inverter: Primary Temp
Motor Inv Temp Sec,INV_T2,22481E,((SIGNED(A*256+B))*1.8+32),-40,300,°F,7E7,Inverter: Secondary Temp
Charger AC Volt,CHG_AC_V,22485E,(A*256+B)*0.01,0,300,V,7E2,Charger: AC Input Voltage
Charger AC Curr,CHG_AC_I,22485F,A,0,100,A,7E2,Charger: AC Input Current
Charger AC Freq,CHG_AC_F,224860,A*0.5,30,90,Hz,7E2,Charger: AC Frequency
Charger DC Coup T,CHG_DC_T,22D00C,(A-40)*1.8+32,-40,400,°F,7E2,Charger: DC Coupler Temp
Sponsored
Last edited: