Rename: the app is vehicle-agnostic, so 'ford-obd' was wrong. Rebranded all code/docs/profile authors to OBDash; Gitea repo renamed justin/ford-obd -> justin/obdash (remote + description updated). Ford the make and the ford-6.0-powerstroke profile are unchanged (that vehicle really is a Ford). Multi-axis upgrade (per request): - MultiAxisPlot now gives each METRIC its own Y axis, each axis colored to match its line; the primary metric owns the LEFT axis, others stack right. - Click a line to promote it to the left axis (sigClicked -> set_primary). - Cleaner teardown (no removeItem warnings); axis label no longer doubles the unit; Normalize round-trips. Validated headless: colored per-metric axes, promote-to-left, gauge view, normalize toggle, profile switch; obdcore + diagnostics tests pass. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016yT89n4zR4qbrySoSiEyZs
Vehicle Profiles
Each *.json file here is a vehicle profile — pure data that makes the
OBDash app vehicle-agnostic. A profile defines a vehicle's PIDs (with safe
scaling formulas), DTC meanings, and named presets. Load one in the app via
Profile → Load, or drop a new file in this folder and it appears in the list.
Contributions welcome — add a profile for your vehicle and open a PR.
Current profiles
| File | Vehicle | Notes |
|---|---|---|
ford-6.0-powerstroke.json |
Ford 6.0L Power Stroke (2003–2007) | Verified Mode-22 PIDs (ICP, FICM, EBP, MAP/BARO, EOT, …) + DTCs |
jeep-wrangler-4.0-1997.json |
1997 Jeep Wrangler TJ 4.0L I6 | ISO 9141-2; speed-density (MAP), single-bank trims, Chrysler P1xxx DTCs |
ford-mustang-cobra-4.6-1996.json |
1996 Mustang SVT Cobra 4.6 DOHC 32V | EEC-V, SAE J1850 PWM, MAF, Ford P1xxx DTCs |
ford-mustang-gt-4.6-1996.json |
1996 Mustang GT 4.6 SOHC 2V | EEC-V, SAE J1850 PWM, MAF, Ford P1xxx DTCs |
mercury-mountaineer-4.6-2006.json |
2006 Mercury Mountaineer 4.6 V8 | EEC-V, MAF, Ford P1xxx DTCs (verify PWM-vs-CAN on the vehicle) |
generic-obd2.json |
Any OBD-II vehicle (1996+) | Standard SAE Mode-01 PIDs only — a base to fork from |
Profiles for the four 1996–2006 vehicles were built from web research (standard SAE PIDs + manufacturer DTCs), validated through the loader, but not yet read on the actual vehicles — confidence reflects sourcing, not bench confirmation.
Schema (schema: 1)
{
"schema": 1,
"meta": {
"name": "Ford 6.0L Power Stroke", // shown in the Profile menu
"make": "Ford", "model": "...", "years": "2003-2007",
"engine": "6.0L Power Stroke diesel",
"author": "you", "version": "1.0.0",
"protocol": "auto", // ELM ATSP target, or "auto"
"notes": "provenance / confidence policy / caveats"
},
"presets": { "crank": ["ICP","FICM_M","BATT","RPM"], "...": [] },
"pids": [ /* see below */ ],
"dtcs": [ {"code":"P0087","desc":"...","system":"fuel","no_start":true,"causes":""} ]
}
PID fields
| Field | Meaning |
|---|---|
key |
short unique id used in presets/derived (e.g. ICP) |
name |
display name |
mode |
01 (generic SAE), 22 (manufacturer-enhanced), atrv (adapter pin voltage), derived (computed from other PIDs) |
pid |
request id hex — 0C (mode 01) or 1446 (mode 22) |
nbytes |
expected data bytes in the response |
formula |
scaling expression (see below) |
round |
display rounding: omit = raw, 0 = integer, 2 = 2 dp |
unit, group |
display unit; group = fuel|ficm|air|engine|driveline|power|misc |
vmin,vmax |
range (used for gauges + the Normalize overlay) |
confidence |
verified (multi-source / read on a real vehicle), doc (sourced, unconfirmed), tentative (single-source / disputed) |
deps |
for derived: the PID keys the formula references |
notes |
freeform; surfaced as a tooltip |
Formula language
Arithmetic over data-byte variables A, B, C, … (byte 0, 1, 2, …) — the
same convention as Torque/FORScan/ScanGauge:
(A*256+B)*0.57 # 16-bit * scale (ICP psi)
A-40 # 8-bit temp
(A>>1)&1 # a status bit
A//2 # integer divide (gear)
For derived PIDs the variables are other PID keys: "MAP - BARO" with
"deps": ["MAP","BARO"].
Formulas are evaluated by a safe AST evaluator (obdcore/formula.py):
only numbers, the declared variables, arithmetic/bitwise operators, and
min/max/abs/round/int/float are allowed. Anything else (names, attribute
access, arbitrary calls) is rejected at load — so a community profile cannot
execute code.
Caveats worth recording in notes
- Manufacturer-enhanced (
22) PIDs vary by model year and PCM strategy. - Some signals aren't on the OBD stream at all (e.g. the 6.0 has no EGT or lube-oil-pressure PID — only ICP and EOT). Don't invent them.
- Mark single-source numbers
tentativeand say so innotes.