From 94d0526da58e50da611fabbdbb76a546486848ee Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 29 Jun 2025 14:55:50 -0600 Subject: [PATCH 01/84] Add LR Params Using this https://obdb.community/#/vehicles/Land/Rover --- signalsets/v3/default.json | 61 +++++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 7176ccf..b445cb0 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -1,4 +1,63 @@ { "commands": [ - +{ "hdr": "732", "dbg": true, "cmd": {"22": "D928"}, "freq": 1, + "signals": [ + {"id": "LANDROVER_PARKED", "path": "Movement", "fmt": {"bix": 7, "len": 1, "max": 1, "unit": "noyes" }, "name": "Parked?"} + ]}, +{ "hdr": "733", "dbg": true, "cmd": {"22": "9924"}, "freq": 30, + "signals": [ + {"id": "LANDROVER_AAT", "path": "Climate", "fmt": { "len": 8, "max": 87.5, "min": -40, "div": 2, "add": -40, "unit": "celsius" }, "name": "Outside temperature"} + ]}, +{ "hdr": "751", "dbg": true, "cmd": {"22": "2076"}, "freq": 5, + "signals": [ + {"id": "LANDROVER_TP_FL", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "unit": "bars" }, "name": "Front left tire pressure", "suggestedMetric": "frontLeftTirePressure"} + ]}, +{ "hdr": "751", "dbg": true, "cmd": {"22": "2077"}, "freq": 5, + "signals": [ + {"id": "LANDROVER_TP_FR", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "unit": "bars" }, "name": "Front right tire pressure", "suggestedMetric": "frontRightTirePressure"} + ]}, +{ "hdr": "751", "dbg": true, "cmd": {"22": "2078"}, "freq": 5, + "signals": [ + {"id": "LANDROVER_TP_RR", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "unit": "bars" }, "name": "Rear right tire pressure", "suggestedMetric": "rearRightTirePressure"} + ]}, +{ "hdr": "751", "dbg": true, "cmd": {"22": "2079"}, "freq": 5, + "signals": [ + {"id": "LANDROVER_TP_RL", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "unit": "bars" }, "name": "Rear left tire pressure", "suggestedMetric": "rearLeftTirePressure"} + ]}, +{ "hdr": "7E4", "dbg": true, "cmd": {"22": "4903"}, "freq": 5, + "signals": [ + {"id": "LANDROVER_HVB_CELL_V_MAX", "path": "Battery", "fmt": { "len": 16, "max": 32767, "unit": "millivolts" }, "name": "Maximum Cell Voltage"} + ]}, +{ "hdr": "7E4", "dbg": true, "cmd": {"22": "4904"}, "freq": 5, + "signals": [ + {"id": "LANDROVER_HVB_CELL_V_MIN", "path": "Battery", "fmt": { "len": 16, "max": 32767, "unit": "millivolts" }, "name": "Minimum Cell Voltage"} + ]}, +{ "hdr": "7E4", "dbg": true, "cmd": {"22": "4907"}, "freq": 5, + "signals": [ + {"id": "LANDROVER_HVB_T", "path": "Battery", "fmt": { "len": 8, "max": 87.5, "min": -40, "div": 2, "add": -40, "unit": "celsius" }, "name": "Battery temperature"} + ]}, +{ "hdr": "7E4", "dbg": true, "cmd": {"22": "490C"}, "freq": 5, + "signals": [ + {"id": "LANDROVER_HVB_CURR", "path": "Battery", "fmt": { "len": 16, "max": 1000, "min": -500, "div": 40, "sign": true, "unit": "amps" }, "name": "Current"} + ]}, +{ "hdr": "7E4", "dbg": true, "cmd": {"22": "490F"}, "freq": 5, + "signals": [ + {"id": "LANDROVER_HVB_V", "path": "Battery", "fmt": { "len": 16, "max": 450, "div": 100, "unit": "volts" }, "name": "High voltage battery voltage"} + ]}, +{ "hdr": "7E4", "dbg": true, "cmd": {"22": "4910"}, "freq": 5, + "signals": [ + {"id": "LANDROVER_SOC", "path": "Battery", "fmt": { "len": 16, "max": 100, "div": 100, "unit": "percent" }, "name": "State of charge", "suggestedMetric": "stateOfCharge"} + ]}, +{ "hdr": "7E4", "dbg": true, "cmd": {"22": "4918"}, "freq": 3600, + "signals": [ + {"id": "LANDROVER_HVB_SOH", "path": "Battery", "fmt": { "len": 8, "max": 100, "div": 2, "unit": "percent" }, "name": "Battery state of health (average)", "suggestedMetric": "stateOfHealth"} + ]}, +{ "hdr": "7E4", "dbg": true, "cmd": {"22": "DD01"}, "freq": 5, + "signals": [ + {"id": "LANDROVER_ODOMETER", "path": "Movement", "fmt": { "len": 24, "max": 1000000, "unit": "kilometers" }, "name": "Odometer", "suggestedMetric": "odometer"} + ]}, +{ "hdr": "7E4", "dbg": true, "cmd": {"22": "DD09"}, "freq": 0.1, + "signals": [ + {"id": "LANDROVER_VSS", "path": "Movement", "fmt": { "len": 8, "max": 255, "unit": "kilometersPerHour" }, "name": "Vehicle Speed", "suggestedMetric": "speed"} + ]} ] } From 633d3704c1bbd29120939030a1ba3e45648858a7 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 29 Jun 2025 17:02:59 -0500 Subject: [PATCH 02/84] squash craziness --- signalsets/v3/default.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index b445cb0..0f98f4a 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -1,4 +1,18 @@ { "commands": [ +{ "commands": [ +{ "hdr": "7E8", "dbg": true, "cmd": {"22": "0146"}, "freq": 30, + "signals": [ + {"id": "LANDROVER_AAT", "path": "Climate", "fmt": { "len": 8, "max": 87.5, "min": -40, "div": 2, "add": -40, "unit": "celsius" }, "name": "Outside temperature"} + ]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"22": "015C"}, "freq": 5, + "signals": [ + {"id": "LANDROVER_OIL_TEMP", "path": "Engine", "fmt": { "len": 24, "max": 1000000, "unit": "kilometers" }, "name": "Odometer", "suggestedMetric": "odometer"} + ]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"22": "010D"}, "freq": 0.1, + "signals": [ + {"id": "LANDROVER_VSS", "path": "Movement", "fmt": { "len": 8, "max": 255, "unit": "kilometersPerHour" }, "name": "Vehicle Speed", "suggestedMetric": "speed"} + ]} +]}, { "hdr": "732", "dbg": true, "cmd": {"22": "D928"}, "freq": 1, "signals": [ {"id": "LANDROVER_PARKED", "path": "Movement", "fmt": {"bix": 7, "len": 1, "max": 1, "unit": "noyes" }, "name": "Parked?"} From 3c812e8c1a3bec6899655e659e2ca89577fd74bf Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Fri, 18 Jul 2025 22:46:48 -0500 Subject: [PATCH 03/84] update signalset --- signalsets/v3/default.json | 884 +++++++++++++++++++++++++++++++++---- 1 file changed, 808 insertions(+), 76 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 0f98f4a..62c68d2 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -1,77 +1,809 @@ -{ "commands": [ -{ "commands": [ -{ "hdr": "7E8", "dbg": true, "cmd": {"22": "0146"}, "freq": 30, - "signals": [ - {"id": "LANDROVER_AAT", "path": "Climate", "fmt": { "len": 8, "max": 87.5, "min": -40, "div": 2, "add": -40, "unit": "celsius" }, "name": "Outside temperature"} - ]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"22": "015C"}, "freq": 5, - "signals": [ - {"id": "LANDROVER_OIL_TEMP", "path": "Engine", "fmt": { "len": 24, "max": 1000000, "unit": "kilometers" }, "name": "Odometer", "suggestedMetric": "odometer"} - ]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"22": "010D"}, "freq": 0.1, - "signals": [ - {"id": "LANDROVER_VSS", "path": "Movement", "fmt": { "len": 8, "max": 255, "unit": "kilometersPerHour" }, "name": "Vehicle Speed", "suggestedMetric": "speed"} - ]} -]}, -{ "hdr": "732", "dbg": true, "cmd": {"22": "D928"}, "freq": 1, - "signals": [ - {"id": "LANDROVER_PARKED", "path": "Movement", "fmt": {"bix": 7, "len": 1, "max": 1, "unit": "noyes" }, "name": "Parked?"} - ]}, -{ "hdr": "733", "dbg": true, "cmd": {"22": "9924"}, "freq": 30, - "signals": [ - {"id": "LANDROVER_AAT", "path": "Climate", "fmt": { "len": 8, "max": 87.5, "min": -40, "div": 2, "add": -40, "unit": "celsius" }, "name": "Outside temperature"} - ]}, -{ "hdr": "751", "dbg": true, "cmd": {"22": "2076"}, "freq": 5, - "signals": [ - {"id": "LANDROVER_TP_FL", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "unit": "bars" }, "name": "Front left tire pressure", "suggestedMetric": "frontLeftTirePressure"} - ]}, -{ "hdr": "751", "dbg": true, "cmd": {"22": "2077"}, "freq": 5, - "signals": [ - {"id": "LANDROVER_TP_FR", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "unit": "bars" }, "name": "Front right tire pressure", "suggestedMetric": "frontRightTirePressure"} - ]}, -{ "hdr": "751", "dbg": true, "cmd": {"22": "2078"}, "freq": 5, - "signals": [ - {"id": "LANDROVER_TP_RR", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "unit": "bars" }, "name": "Rear right tire pressure", "suggestedMetric": "rearRightTirePressure"} - ]}, -{ "hdr": "751", "dbg": true, "cmd": {"22": "2079"}, "freq": 5, - "signals": [ - {"id": "LANDROVER_TP_RL", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "unit": "bars" }, "name": "Rear left tire pressure", "suggestedMetric": "rearLeftTirePressure"} - ]}, -{ "hdr": "7E4", "dbg": true, "cmd": {"22": "4903"}, "freq": 5, - "signals": [ - {"id": "LANDROVER_HVB_CELL_V_MAX", "path": "Battery", "fmt": { "len": 16, "max": 32767, "unit": "millivolts" }, "name": "Maximum Cell Voltage"} - ]}, -{ "hdr": "7E4", "dbg": true, "cmd": {"22": "4904"}, "freq": 5, - "signals": [ - {"id": "LANDROVER_HVB_CELL_V_MIN", "path": "Battery", "fmt": { "len": 16, "max": 32767, "unit": "millivolts" }, "name": "Minimum Cell Voltage"} - ]}, -{ "hdr": "7E4", "dbg": true, "cmd": {"22": "4907"}, "freq": 5, - "signals": [ - {"id": "LANDROVER_HVB_T", "path": "Battery", "fmt": { "len": 8, "max": 87.5, "min": -40, "div": 2, "add": -40, "unit": "celsius" }, "name": "Battery temperature"} - ]}, -{ "hdr": "7E4", "dbg": true, "cmd": {"22": "490C"}, "freq": 5, - "signals": [ - {"id": "LANDROVER_HVB_CURR", "path": "Battery", "fmt": { "len": 16, "max": 1000, "min": -500, "div": 40, "sign": true, "unit": "amps" }, "name": "Current"} - ]}, -{ "hdr": "7E4", "dbg": true, "cmd": {"22": "490F"}, "freq": 5, - "signals": [ - {"id": "LANDROVER_HVB_V", "path": "Battery", "fmt": { "len": 16, "max": 450, "div": 100, "unit": "volts" }, "name": "High voltage battery voltage"} - ]}, -{ "hdr": "7E4", "dbg": true, "cmd": {"22": "4910"}, "freq": 5, - "signals": [ - {"id": "LANDROVER_SOC", "path": "Battery", "fmt": { "len": 16, "max": 100, "div": 100, "unit": "percent" }, "name": "State of charge", "suggestedMetric": "stateOfCharge"} - ]}, -{ "hdr": "7E4", "dbg": true, "cmd": {"22": "4918"}, "freq": 3600, - "signals": [ - {"id": "LANDROVER_HVB_SOH", "path": "Battery", "fmt": { "len": 8, "max": 100, "div": 2, "unit": "percent" }, "name": "Battery state of health (average)", "suggestedMetric": "stateOfHealth"} - ]}, -{ "hdr": "7E4", "dbg": true, "cmd": {"22": "DD01"}, "freq": 5, - "signals": [ - {"id": "LANDROVER_ODOMETER", "path": "Movement", "fmt": { "len": 24, "max": 1000000, "unit": "kilometers" }, "name": "Odometer", "suggestedMetric": "odometer"} - ]}, -{ "hdr": "7E4", "dbg": true, "cmd": {"22": "DD09"}, "freq": 0.1, - "signals": [ - {"id": "LANDROVER_VSS", "path": "Movement", "fmt": { "len": 8, "max": 255, "unit": "kilometersPerHour" }, "name": "Vehicle Speed", "suggestedMetric": "speed"} - ]} -] +{ + "commands": [ + { + "hdr": "7E8", + "cmd": { + "01": "0D" + }, + "freq": 1, + "signals": [ + { + "id": "LANDROVER_VSS", + "path": "Movement", + "fmt": { + "len": 8, + "max": 255, + "unit": "kilometersPerHour", + "min": 0 + }, + "name": "Vehicle Speed", + "suggestedMetric": "speed" + } + ] + }, + { + "hdr": "7E8", + "cmd": { + "01": "0C" + }, + "freq": 1, + "signals": [ + { + "id": "LANDROVER_ENGINE_RPM", + "path": "Engine", + "fmt": { + "len": 16, + "div": 4, + "max": 16383, + "unit": "rpm", + "min": 0 + }, + "name": "Engine RPM" + } + ] + }, + { + "hdr": "7E8", + "cmd": { + "01": "05" + }, + "freq": 1, + "signals": [ + { + "id": "LANDROVER_COOLANT_TEMP", + "path": "Engine", + "fmt": { + "len": 8, + "add": -40, + "max": 215, + "unit": "celsius", + "min": 0 + }, + "name": "Coolant Temperature" + } + ] + }, + { + "hdr": "732", + "cmd": { + "22": "D928" + }, + "freq": 1, + "signals": [ + { + "id": "LANDROVER_PARKED", + "path": "Movement", + "fmt": { + "bix": 7, + "len": 1, + "max": 1, + "unit": "noyes", + "min": 0 + }, + "name": "Parked?" + } + ] + }, + { + "hdr": "7E8", + "cmd": { + "01": "04" + }, + "freq": 1, + "signals": [ + { + "id": "LANDROVER_ENGINE_LOAD", + "path": "Engine", + "fmt": { + "len": 8, + "max": 100, + "unit": "percent", + "min": 0 + }, + "name": "Engine Load" + } + ] + }, + { + "hdr": "7E8", + "cmd": { + "01": "0F" + }, + "freq": 1, + "signals": [ + { + "id": "LANDROVER_IAT", + "path": "Engine", + "fmt": { + "len": 8, + "add": -40, + "unit": "celsius", + "max": 255, + "min": 0 + }, + "name": "Intake Air Temperature" + } + ] + }, + { + "hdr": "7E8", + "cmd": { + "01": "10" + }, + "freq": 1, + "signals": [ + { + "id": "LANDROVER_MAF", + "path": "Engine", + "fmt": { + "len": 16, + "div": 100, + "unit": "gramsPerSecond", + "max": 255, + "min": 0 + }, + "name": "Mass Air Flow" + } + ] + }, + { + "hdr": "7E8", + "cmd": { + "01": "1F" + }, + "freq": 1, + "signals": [ + { + "id": "LANDROVER_TIME_SINCE_ENGINE_START", + "path": "Stats", + "fmt": { + "len": 16, + "unit": "seconds", + "max": 65535, + "min": 0 + }, + "name": "Time Since Engine Start" + } + ] + }, + { + "hdr": "7E0", + "cmd": { + "22": "F300" + }, + "freq": 5, + "signals": [ + { + "id": "LANDROVER_ENGINE_OIL_TEMP", + "path": "Engine", + "fmt": { + "len": 8, + "add": -40, + "unit": "celsius", + "max": 255, + "min": 0 + }, + "name": "Engine Oil Temp" + } + ] + }, + { + "hdr": "7E0", + "cmd": { + "22": "F200" + }, + "freq": 5, + "signals": [ + { + "id": "LANDROVER_ENGINE_OIL_VOL", + "path": "Engine", + "fmt": { + "len": 8, + "div": 10, + "unit": "liters", + "max": 255, + "min": 0 + }, + "name": "Engine Oil Volume" + } + ] + }, + { + "hdr": "7E0", + "cmd": { + "22": "033E" + }, + "freq": 5, + "signals": [ + { + "id": "LANDROVER_BOOST", + "path": "Engine", + "fmt": { + "len": 8, + "unit": "kilopascal", + "max": 255, + "min": 0 + }, + "name": "Boost" + } + ] + }, + { + "hdr": "7E0", + "cmd": { + "22": "5200" + }, + "freq": 5, + "signals": [ + { + "id": "LANDROVER_IAT2", + "path": "Engine", + "fmt": { + "len": 8, + "unit": "celsius", + "max": 255, + "min": 0 + }, + "name": "IAT2" + } + ] + }, + { + "hdr": "7E8", + "cmd": { + "01": "03" + }, + "freq": 1, + "signals": [ + { + "id": "LANDROVER_FUEL_SYS_STATUS", + "path": "Engine", + "fmt": { + "len": 8, + "unit": "scalar", + "max": 255, + "min": 0 + }, + "name": "Fuel System Status" + } + ] + }, + { + "hdr": "7E8", + "cmd": { + "01": "06" + }, + "freq": 1, + "signals": [ + { + "id": "LANDROVER_SHORT_TERM_FUEL_TRIM_B1", + "path": "Engine", + "fmt": { + "len": 8, + "unit": "percent", + "max": 100, + "min": -100 + }, + "name": "Short Term Fuel Trim Bank 1" + } + ] + }, + { + "hdr": "7E8", + "cmd": { + "01": "07" + }, + "freq": 1, + "signals": [ + { + "id": "LANDROVER_LONG_TERM_FUEL_TRIM_B1", + "path": "Engine", + "fmt": { + "len": 8, + "unit": "percent", + "max": 100, + "min": -100 + }, + "name": "Long Term Fuel Trim Bank 1" + } + ] + }, + { + "hdr": "7E8", + "cmd": { + "01": "0A" + }, + "freq": 1, + "signals": [ + { + "id": "LANDROVER_FUEL_PRESSURE", + "path": "Engine", + "fmt": { + "len": 8, + "unit": "kilopascal", + "max": 765, + "min": 0 + }, + "name": "Fuel Pressure" + } + ] + }, + { + "hdr": "7E8", + "cmd": { + "01": "11" + }, + "freq": 1, + "signals": [ + { + "id": "LANDROVER_THROTTLE_POS", + "path": "Engine", + "fmt": { + "len": 8, + "unit": "percent", + "max": 100, + "min": 0 + }, + "name": "Throttle Position" + } + ] + }, + { + "hdr": "7E8", + "cmd": { + "01": "13" + }, + "freq": 1, + "signals": [ + { + "id": "LANDROVER_O2_SENSOR_1_VOLT", + "path": "Engine", + "fmt": { + "len": 8, + "unit": "volts", + "max": 1.275, + "min": 0 + }, + "name": "O2 Sensor 1 Voltage" + } + ] + }, + { + "hdr": "7E8", + "cmd": { + "01": "1C" + }, + "freq": 1, + "signals": [ + { + "id": "LANDROVER_OBD_STANDARDS", + "path": "Details", + "fmt": { + "len": 8, + "unit": "scalar", + "max": 255, + "min": 0 + }, + "name": "OBD Standards" + } + ] + }, + { + "hdr": "7E8", + "cmd": { + "01": "1D" + }, + "freq": 1, + "signals": [ + { + "id": "LANDROVER_DIST_MIL_ON", + "path": "Stats", + "fmt": { + "len": 16, + "unit": "kilometers", + "max": 65535, + "min": 0 + }, + "name": "Distance with MIL On" + } + ] + }, + { + "hdr": "7E8", + "cmd": { + "01": "21" + }, + "freq": 1, + "signals": [ + { + "id": "LANDROVER_DIST_SINCE_CODES_CLEARED", + "path": "Stats", + "fmt": { + "len": 16, + "unit": "kilometers", + "max": 65535, + "min": 0 + }, + "name": "Distance Since Codes Cleared", + "suggestedMetric": "distanceSinceDTCsCleared" + } + ] + }, + { + "hdr": "7E8", + "cmd": { + "01": "2F" + }, + "freq": 1, + "signals": [ + { + "id": "LANDROVER_FUEL_LEVEL", + "path": "Fuel", + "fmt": { + "len": 8, + "unit": "percent", + "max": 100, + "min": 0 + }, + "name": "Fuel Level Input", + "suggestedMetric": "fuelTankLevel" + } + ] + }, + { + "hdr": "7E8", + "cmd": { + "01": "33" + }, + "freq": 1, + "signals": [ + { + "id": "LANDROVER_BARO_PRESSURE", + "path": "Engine", + "fmt": { + "len": 8, + "unit": "kilopascal", + "max": 255, + "min": 0 + }, + "name": "Barometric Pressure" + } + ] + }, + { + "hdr": "7E8", + "cmd": { + "01": "42" + }, + "freq": 1, + "signals": [ + { + "id": "LANDROVER_CONTROL_MODULE_VOLTAGE", + "path": "Electrical", + "fmt": { + "len": 16, + "unit": "volts", + "max": 655.35, + "min": 0 + }, + "name": "Control Module Voltage" + } + ] + }, + { + "hdr": "7E8", + "cmd": { + "01": "46" + }, + "freq": 1, + "signals": [ + { + "id": "LANDROVER_AMBIENT_AIR_TEMP", + "path": "Climate", + "fmt": { + "len": 8, + "unit": "celsius", + "max": 215, + "min": -40 + }, + "name": "Ambient Air Temperature" + } + ] + }, + { + "hdr": "7E8", + "cmd": { + "01": "4D" + }, + "freq": 1, + "signals": [ + { + "id": "LANDROVER_COMMANDED_THROTTLE_ACTUATOR", + "path": "Engine", + "fmt": { + "len": 8, + "unit": "percent", + "max": 100, + "min": 0 + }, + "name": "Commanded Throttle Actuator" + } + ] + }, + { + "hdr": "7E8", + "cmd": { + "01": "5C" + }, + "freq": 1, + "signals": [ + { + "id": "LANDROVER_ENGINE_OIL_TEMP_STD", + "path": "Engine", + "fmt": { + "len": 8, + "add": -40, + "unit": "celsius", + "max": 215, + "min": -40 + }, + "name": "Engine Oil Temperature (Std)" + } + ] + }, + { + "hdr": "7E0", + "cmd": { + "22": "D900" + }, + "freq": 5, + "signals": [ + { + "id": "LANDROVER_FRONT_LEFT_TIRE_PRESSURE", + "path": "Tires", + "fmt": { + "len": 8, + "unit": "psi", + "max": 255, + "min": 0 + }, + "name": "Front Left Tire Pressure", + "suggestedMetric": "frontLeftTirePressure" + } + ] + }, + { + "hdr": "7E0", + "cmd": { + "22": "D901" + }, + "freq": 5, + "signals": [ + { + "id": "LANDROVER_FRONT_RIGHT_TIRE_PRESSURE", + "path": "Tires", + "fmt": { + "len": 8, + "unit": "psi", + "max": 255, + "min": 0 + }, + "name": "Front Right Tire Pressure", + "suggestedMetric": "frontRightTirePressure" + } + ] + }, + { + "hdr": "7E0", + "cmd": { + "22": "D902" + }, + "freq": 5, + "signals": [ + { + "id": "LANDROVER_REAR_LEFT_TIRE_PRESSURE", + "path": "Tires", + "fmt": { + "len": 8, + "unit": "psi", + "max": 255, + "min": 0 + }, + "name": "Rear Left Tire Pressure", + "suggestedMetric": "rearLeftTirePressure" + } + ] + }, + { + "hdr": "7E0", + "cmd": { + "22": "D903" + }, + "freq": 5, + "signals": [ + { + "id": "LANDROVER_REAR_RIGHT_TIRE_PRESSURE", + "path": "Tires", + "fmt": { + "len": 8, + "unit": "psi", + "max": 255, + "min": 0 + }, + "name": "Rear Right Tire Pressure", + "suggestedMetric": "rearRightTirePressure" + } + ] + }, + { + "hdr": "7E0", + "cmd": { + "22": "D904" + }, + "freq": 5, + "signals": [ + { + "id": "LANDROVER_SPARE_TIRE_PRESSURE", + "path": "Tires", + "fmt": { + "len": 8, + "unit": "psi", + "max": 255, + "min": 0 + }, + "name": "Spare Tire Pressure" + } + ] + }, + { + "hdr": "7E0", + "cmd": { + "22": "D910" + }, + "freq": 5, + "signals": [ + { + "id": "LANDROVER_FRONT_LEFT_TIRE_TEMP", + "path": "Tires", + "fmt": { + "len": 8, + "add": -40, + "unit": "celsius", + "max": 215, + "min": -40 + }, + "name": "Front Left Tire Temperature" + } + ] + }, + { + "hdr": "7E0", + "cmd": { + "22": "D911" + }, + "freq": 5, + "signals": [ + { + "id": "LANDROVER_FRONT_RIGHT_TIRE_TEMP", + "path": "Tires", + "fmt": { + "len": 8, + "add": -40, + "unit": "celsius", + "max": 215, + "min": -40 + }, + "name": "Front Right Tire Temperature" + } + ] + }, + { + "hdr": "7E0", + "cmd": { + "22": "D912" + }, + "freq": 5, + "signals": [ + { + "id": "LANDROVER_REAR_LEFT_TIRE_TEMP", + "path": "Tires", + "fmt": { + "len": 8, + "add": -40, + "unit": "celsius", + "max": 215, + "min": -40 + }, + "name": "Rear Left Tire Temperature" + } + ] + }, + { + "hdr": "7E0", + "cmd": { + "22": "D913" + }, + "freq": 5, + "signals": [ + { + "id": "LANDROVER_REAR_RIGHT_TIRE_TEMP", + "path": "Tires", + "fmt": { + "len": 8, + "add": -40, + "unit": "celsius", + "max": 215, + "min": -40 + }, + "name": "Rear Right Tire Temperature" + } + ] + }, + { + "hdr": "7E8", + "cmd": { + "01": "31" + }, + "freq": 1, + "signals": [ + { + "id": "LANDROVER_DISTANCE_TRAVELED", + "path": "Stats", + "fmt": { + "len": 16, + "unit": "kilometers", + "max": 6553500, + "min": 0, + "mul": 100 + }, + "name": "Distance Traveled", + "suggestedMetric": "odometer" + } + ] + }, + { + "hdr": "7E8", + "cmd": { + "01": "A6" + }, + "freq": 1, + "signals": [ + { + "id": "LANDROVER_ODOMETER", + "path": "Stats", + "fmt": { + "len": 24, + "unit": "kilometers", + "max": 1677721500, + "min": 0, + "mul": 100 + }, + "name": "Odometer", + "suggestedMetric": "odometer" + } + ] + }, + { + "hdr": "7E8", + "cmd": { + "01": "A7" + }, + "freq": 1, + "signals": [ + { + "id": "LANDROVER_ODOMETER_MILES", + "path": "Stats", + "fmt": { + "len": 24, + "unit": "miles", + "max": 1677721500, + "min": 0, + "mul": 100 + }, + "name": "Odometer (Miles)", + "suggestedMetric": "odometer" + } + ] + } + ] } From f162b753f29175005950cd4c76c37ace1134e585 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sat, 19 Jul 2025 19:52:45 -0500 Subject: [PATCH 04/84] reverting to pre-squash --- signalsets/v3/default.json | 584 ++++++++++++++++++++++++------------- 1 file changed, 374 insertions(+), 210 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 62c68d2..4f75ebf 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -38,7 +38,8 @@ "unit": "rpm", "min": 0 }, - "name": "Engine RPM" + "name": "Engine RPM", + "suggestedMetric": "engineRPM" } ] }, @@ -59,28 +60,8 @@ "unit": "celsius", "min": 0 }, - "name": "Coolant Temperature" - } - ] - }, - { - "hdr": "732", - "cmd": { - "22": "D928" - }, - "freq": 1, - "signals": [ - { - "id": "LANDROVER_PARKED", - "path": "Movement", - "fmt": { - "bix": 7, - "len": 1, - "max": 1, - "unit": "noyes", - "min": 0 - }, - "name": "Parked?" + "name": "Coolant Temperature", + "suggestedMetric": "engineCoolantTemp" } ] }, @@ -100,7 +81,8 @@ "unit": "percent", "min": 0 }, - "name": "Engine Load" + "name": "Engine Load", + "suggestedMetric": "engineLoad" } ] }, @@ -121,7 +103,8 @@ "max": 255, "min": 0 }, - "name": "Intake Air Temperature" + "name": "Intake Air Temperature", + "suggestedMetric": "intakeAirTemp" } ] }, @@ -139,112 +122,53 @@ "len": 16, "div": 100, "unit": "gramsPerSecond", - "max": 255, + "max": 655, "min": 0 }, - "name": "Mass Air Flow" + "name": "Mass Air Flow", + "suggestedMetric": "massAirflow" } ] }, { "hdr": "7E8", "cmd": { - "01": "1F" + "01": "11" }, "freq": 1, "signals": [ { - "id": "LANDROVER_TIME_SINCE_ENGINE_START", - "path": "Stats", - "fmt": { - "len": 16, - "unit": "seconds", - "max": 65535, - "min": 0 - }, - "name": "Time Since Engine Start" - } - ] - }, - { - "hdr": "7E0", - "cmd": { - "22": "F300" - }, - "freq": 5, - "signals": [ - { - "id": "LANDROVER_ENGINE_OIL_TEMP", - "path": "Engine", - "fmt": { - "len": 8, - "add": -40, - "unit": "celsius", - "max": 255, - "min": 0 - }, - "name": "Engine Oil Temp" - } - ] - }, - { - "hdr": "7E0", - "cmd": { - "22": "F200" - }, - "freq": 5, - "signals": [ - { - "id": "LANDROVER_ENGINE_OIL_VOL", - "path": "Engine", - "fmt": { - "len": 8, - "div": 10, - "unit": "liters", - "max": 255, - "min": 0 - }, - "name": "Engine Oil Volume" - } - ] - }, - { - "hdr": "7E0", - "cmd": { - "22": "033E" - }, - "freq": 5, - "signals": [ - { - "id": "LANDROVER_BOOST", + "id": "LANDROVER_THROTTLE_POS", "path": "Engine", "fmt": { "len": 8, - "unit": "kilopascal", - "max": 255, + "unit": "percent", + "max": 100, "min": 0 }, - "name": "Boost" + "name": "Throttle Position", + "suggestedMetric": "throttlePosition" } ] }, { - "hdr": "7E0", + "hdr": "7E8", "cmd": { - "22": "5200" + "01": "1F" }, - "freq": 5, + "freq": 1, "signals": [ { - "id": "LANDROVER_IAT2", + "id": "LANDROVER_TIME_SINCE_ENGINE_START", "path": "Engine", "fmt": { - "len": 8, - "unit": "celsius", - "max": 255, + "len": 16, + "unit": "seconds", + "max": 65535, "min": 0 }, - "name": "IAT2" + "name": "Time Since Engine Start", + "suggestedMetric": "runTime" } ] }, @@ -264,7 +188,8 @@ "max": 255, "min": 0 }, - "name": "Fuel System Status" + "name": "Fuel System Status", + "suggestedMetric": "fuelSystemStatus" } ] }, @@ -284,7 +209,8 @@ "max": 100, "min": -100 }, - "name": "Short Term Fuel Trim Bank 1" + "name": "Short Term Fuel Trim Bank 1", + "suggestedMetric": "shortTermFuelTrim" } ] }, @@ -304,7 +230,8 @@ "max": 100, "min": -100 }, - "name": "Long Term Fuel Trim Bank 1" + "name": "Long Term Fuel Trim Bank 1", + "suggestedMetric": "longTermFuelTrim" } ] }, @@ -320,31 +247,13 @@ "path": "Engine", "fmt": { "len": 8, + "mul": 3, "unit": "kilopascal", "max": 765, "min": 0 }, - "name": "Fuel Pressure" - } - ] - }, - { - "hdr": "7E8", - "cmd": { - "01": "11" - }, - "freq": 1, - "signals": [ - { - "id": "LANDROVER_THROTTLE_POS", - "path": "Engine", - "fmt": { - "len": 8, - "unit": "percent", - "max": 100, - "min": 0 - }, - "name": "Throttle Position" + "name": "Fuel Pressure", + "suggestedMetric": "fuelPressure" } ] }, @@ -360,31 +269,13 @@ "path": "Engine", "fmt": { "len": 8, + "div": 200, "unit": "volts", "max": 1.275, "min": 0 }, - "name": "O2 Sensor 1 Voltage" - } - ] - }, - { - "hdr": "7E8", - "cmd": { - "01": "1C" - }, - "freq": 1, - "signals": [ - { - "id": "LANDROVER_OBD_STANDARDS", - "path": "Details", - "fmt": { - "len": 8, - "unit": "scalar", - "max": 255, - "min": 0 - }, - "name": "OBD Standards" + "name": "O2 Sensor 1 Voltage", + "suggestedMetric": "o2SensorVoltage" } ] }, @@ -404,7 +295,8 @@ "max": 65535, "min": 0 }, - "name": "Distance with MIL On" + "name": "Distance with MIL On", + "suggestedMetric": "distanceWithMILOn" } ] }, @@ -441,6 +333,7 @@ "path": "Fuel", "fmt": { "len": 8, + "div": 2.55, "unit": "percent", "max": 100, "min": 0 @@ -453,40 +346,43 @@ { "hdr": "7E8", "cmd": { - "01": "33" + "01": "31" }, "freq": 1, "signals": [ { - "id": "LANDROVER_BARO_PRESSURE", - "path": "Engine", + "id": "LANDROVER_DISTANCE_TRAVELED", + "path": "Stats", "fmt": { - "len": 8, - "unit": "kilopascal", - "max": 255, - "min": 0 + "len": 16, + "unit": "kilometers", + "max": 6553500, + "min": 0, + "mul": 100 }, - "name": "Barometric Pressure" + "name": "Distance Traveled", + "suggestedMetric": "odometer" } ] }, { "hdr": "7E8", "cmd": { - "01": "42" + "01": "33" }, "freq": 1, "signals": [ { - "id": "LANDROVER_CONTROL_MODULE_VOLTAGE", - "path": "Electrical", + "id": "LANDROVER_BARO_PRESSURE", + "path": "Engine", "fmt": { - "len": 16, - "unit": "volts", - "max": 655.35, + "len": 8, + "unit": "kilopascal", + "max": 255, "min": 0 }, - "name": "Control Module Voltage" + "name": "Barometric Pressure", + "suggestedMetric": "barometricPressure" } ] }, @@ -495,18 +391,21 @@ "cmd": { "01": "46" }, - "freq": 1, + "freq": 30, "signals": [ { "id": "LANDROVER_AMBIENT_AIR_TEMP", "path": "Climate", "fmt": { "len": 8, - "unit": "celsius", - "max": 215, - "min": -40 + "max": 87.5, + "min": -40, + "div": 2, + "add": -40, + "unit": "celsius" }, - "name": "Ambient Air Temperature" + "name": "Ambient Air Temperature", + "suggestedMetric": "ambientAirTemp" } ] }, @@ -526,7 +425,8 @@ "max": 100, "min": 0 }, - "name": "Commanded Throttle Actuator" + "name": "Commanded Throttle Actuator", + "suggestedMetric": "commandedThrottleActuator" } ] }, @@ -547,7 +447,160 @@ "max": 215, "min": -40 }, - "name": "Engine Oil Temperature (Std)" + "name": "Engine Oil Temperature (Standard)", + "suggestedMetric": "engineOilTemp" + } + ] + }, + { + "hdr": "7E8", + "cmd": { + "01": "A6" + }, + "freq": 1, + "signals": [ + { + "id": "LANDROVER_ODOMETER", + "path": "Stats", + "fmt": { + "len": 24, + "unit": "kilometers", + "max": 1677721500, + "min": 0, + "mul": 100 + }, + "name": "Odometer", + "suggestedMetric": "odometer" + } + ] + }, + { + "hdr": "7E8", + "cmd": { + "01": "A7" + }, + "freq": 1, + "signals": [ + { + "id": "LANDROVER_ODOMETER_MILES", + "path": "Stats", + "fmt": { + "len": 24, + "unit": "miles", + "max": 1677721500, + "min": 0, + "mul": 100 + }, + "name": "Odometer (Miles)", + "suggestedMetric": "odometer" + } + ] + }, + { + "hdr": "7E0", + "cmd": { + "22": "F300" + }, + "freq": 5, + "signals": [ + { + "id": "LANDROVER_ENGINE_OIL_TEMP", + "path": "Engine", + "fmt": { + "len": 8, + "add": -40, + "unit": "celsius", + "max": 255, + "min": 0 + }, + "name": "Engine Oil Temperature", + "suggestedMetric": "engineOilTemp" + } + ] + }, + { + "hdr": "7E0", + "cmd": { + "22": "F200" + }, + "freq": 5, + "signals": [ + { + "id": "LANDROVER_ENGINE_OIL_VOL", + "path": "Engine", + "fmt": { + "len": 8, + "div": 10, + "unit": "liters", + "max": 255, + "min": 0 + }, + "name": "Engine Oil Volume", + "suggestedMetric": "engineOilLevel" + } + ] + }, + { + "hdr": "7E0", + "cmd": { + "22": "033E" + }, + "freq": 5, + "signals": [ + { + "id": "LANDROVER_BOOST", + "path": "Engine", + "fmt": { + "len": 8, + "unit": "kilopascal", + "max": 255, + "min": 0 + }, + "name": "Turbo Boost Pressure", + "suggestedMetric": "turboBoostPressure" + } + ] + }, + { + "hdr": "7E0", + "cmd": { + "22": "5200" + }, + "freq": 5, + "signals": [ + { + "id": "LANDROVER_IAT2", + "path": "Engine", + "fmt": { + "len": 8, + "unit": "celsius", + "max": 255, + "min": 0 + }, + "name": "Intake Air Temperature 2", + "suggestedMetric": "intakeAirTemp2" + } + ] + }, + { + "hdr": "732", + "cmd": { + "22": "D928" + }, + "freq": 1, + "signals": [ + { + "id": "LANDROVER_PARKED", + "path": "Movement", + "fmt": { + "bix": 7, + "len": 1, + "max": 1, + "unit": "noyes", + "min": 0 + }, + "name": "Vehicle Parked Status", + "suggestedMetric": "parkedStatus" } ] }, @@ -651,7 +704,8 @@ "max": 255, "min": 0 }, - "name": "Spare Tire Pressure" + "name": "Spare Tire Pressure", + "suggestedMetric": "spareTirePressure" } ] }, @@ -672,7 +726,8 @@ "max": 215, "min": -40 }, - "name": "Front Left Tire Temperature" + "name": "Front Left Tire Temperature", + "suggestedMetric": "frontLeftTireTemp" } ] }, @@ -693,7 +748,8 @@ "max": 215, "min": -40 }, - "name": "Front Right Tire Temperature" + "name": "Front Right Tire Temperature", + "suggestedMetric": "frontRightTireTemp" } ] }, @@ -714,7 +770,8 @@ "max": 215, "min": -40 }, - "name": "Rear Left Tire Temperature" + "name": "Rear Left Tire Temperature", + "suggestedMetric": "rearLeftTireTemp" } ] }, @@ -735,73 +792,180 @@ "max": 215, "min": -40 }, - "name": "Rear Right Tire Temperature" + "name": "Rear Right Tire Temperature", + "suggestedMetric": "rearRightTireTemp" } ] }, { - "hdr": "7E8", + "hdr": "7E0", "cmd": { - "01": "31" + "22": "D920" }, - "freq": 1, + "freq": 10, "signals": [ { - "id": "LANDROVER_DISTANCE_TRAVELED", - "path": "Stats", + "id": "LANDROVER_TRANSMISSION_TEMP", + "path": "Transmission", + "fmt": { + "len": 8, + "add": -40, + "unit": "celsius", + "max": 215, + "min": -40 + }, + "name": "Transmission Fluid Temperature", + "suggestedMetric": "transmissionTemp" + } + ] + }, + { + "hdr": "7E0", + "cmd": { + "22": "D921" + }, + "freq": 10, + "signals": [ + { + "id": "LANDROVER_GEAR_POSITION", + "path": "Transmission", + "fmt": { + "len": 8, + "unit": "scalar", + "max": 15, + "min": 0 + }, + "name": "Current Gear Position", + "suggestedMetric": "gearPosition" + } + ] + }, + { + "hdr": "7E0", + "cmd": { + "22": "D930" + }, + "freq": 5, + "signals": [ + { + "id": "LANDROVER_BATTERY_VOLTAGE", + "path": "Electrical", "fmt": { "len": 16, - "unit": "kilometers", - "max": 6553500, - "min": 0, - "mul": 100 + "div": 1000, + "unit": "volts", + "max": 18, + "min": 6 }, - "name": "Distance Traveled", - "suggestedMetric": "odometer" + "name": "Battery Voltage", + "suggestedMetric": "batteryVoltage" } ] }, { - "hdr": "7E8", + "hdr": "7E0", "cmd": { - "01": "A6" + "22": "D931" }, - "freq": 1, + "freq": 5, "signals": [ { - "id": "LANDROVER_ODOMETER", - "path": "Stats", + "id": "LANDROVER_ALTERNATOR_DUTY", + "path": "Electrical", "fmt": { - "len": 24, - "unit": "kilometers", - "max": 1677721500, - "min": 0, - "mul": 100 + "len": 8, + "unit": "percent", + "max": 100, + "min": 0 }, - "name": "Odometer", - "suggestedMetric": "odometer" + "name": "Alternator Duty Cycle", + "suggestedMetric": "alternatorDuty" } ] }, { - "hdr": "7E8", + "hdr": "7E0", "cmd": { - "01": "A7" + "22": "D940" }, - "freq": 1, + "freq": 2, "signals": [ { - "id": "LANDROVER_ODOMETER_MILES", - "path": "Stats", + "id": "LANDROVER_AC_COMPRESSOR_STATUS", + "path": "Climate", "fmt": { - "len": 24, - "unit": "miles", - "max": 1677721500, - "min": 0, - "mul": 100 + "bix": 0, + "len": 1, + "unit": "noyes", + "max": 1, + "min": 0 }, - "name": "Odometer (Miles)", - "suggestedMetric": "odometer" + "name": "AC Compressor Status", + "suggestedMetric": "acCompressorStatus" + } + ] + }, + { + "hdr": "7E0", + "cmd": { + "22": "D941" + }, + "freq": 2, + "signals": [ + { + "id": "LANDROVER_CABIN_TEMP", + "path": "Climate", + "fmt": { + "len": 8, + "add": -40, + "unit": "celsius", + "max": 87.5, + "min": -40 + }, + "name": "Cabin Temperature", + "suggestedMetric": "cabinTemp" + } + ] + }, + { + "hdr": "7DF", + "cmd": { + "22": "F190" + }, + "freq": 30, + "signals": [ + { + "id": "LANDROVER_VIN", + "path": "Vehicle", + "fmt": { + "len": 136, + "unit": "ascii", + "max": 17, + "min": 17 + }, + "name": "Vehicle Identification Number", + "suggestedMetric": "vin" + } + ] + }, + { + "hdr": "7E0", + "cmd": { + "22": "F186" + }, + "freq": 30, + "signals": [ + { + "id": "LANDROVER_ECU_SERIAL", + "path": "Vehicle", + "fmt": { + "len": 64, + "unit": "ascii", + "max": 8, + "min": 8 + }, + "name": "ECU Serial Number", + "suggestedMetric": "ecuSerial" } ] } From ee5133c8cc1be2d78c00b1230386a5a5b064b7c9 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sat, 19 Jul 2025 20:01:28 -0500 Subject: [PATCH 05/84] trying some jag codes --- signalsets/v3/default.json | 1018 ++---------------------------------- 1 file changed, 46 insertions(+), 972 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 4f75ebf..db3361a 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -1,973 +1,47 @@ -{ - "commands": [ - { - "hdr": "7E8", - "cmd": { - "01": "0D" - }, - "freq": 1, - "signals": [ - { - "id": "LANDROVER_VSS", - "path": "Movement", - "fmt": { - "len": 8, - "max": 255, - "unit": "kilometersPerHour", - "min": 0 - }, - "name": "Vehicle Speed", - "suggestedMetric": "speed" - } - ] - }, - { - "hdr": "7E8", - "cmd": { - "01": "0C" - }, - "freq": 1, - "signals": [ - { - "id": "LANDROVER_ENGINE_RPM", - "path": "Engine", - "fmt": { - "len": 16, - "div": 4, - "max": 16383, - "unit": "rpm", - "min": 0 - }, - "name": "Engine RPM", - "suggestedMetric": "engineRPM" - } - ] - }, - { - "hdr": "7E8", - "cmd": { - "01": "05" - }, - "freq": 1, - "signals": [ - { - "id": "LANDROVER_COOLANT_TEMP", - "path": "Engine", - "fmt": { - "len": 8, - "add": -40, - "max": 215, - "unit": "celsius", - "min": 0 - }, - "name": "Coolant Temperature", - "suggestedMetric": "engineCoolantTemp" - } - ] - }, - { - "hdr": "7E8", - "cmd": { - "01": "04" - }, - "freq": 1, - "signals": [ - { - "id": "LANDROVER_ENGINE_LOAD", - "path": "Engine", - "fmt": { - "len": 8, - "max": 100, - "unit": "percent", - "min": 0 - }, - "name": "Engine Load", - "suggestedMetric": "engineLoad" - } - ] - }, - { - "hdr": "7E8", - "cmd": { - "01": "0F" - }, - "freq": 1, - "signals": [ - { - "id": "LANDROVER_IAT", - "path": "Engine", - "fmt": { - "len": 8, - "add": -40, - "unit": "celsius", - "max": 255, - "min": 0 - }, - "name": "Intake Air Temperature", - "suggestedMetric": "intakeAirTemp" - } - ] - }, - { - "hdr": "7E8", - "cmd": { - "01": "10" - }, - "freq": 1, - "signals": [ - { - "id": "LANDROVER_MAF", - "path": "Engine", - "fmt": { - "len": 16, - "div": 100, - "unit": "gramsPerSecond", - "max": 655, - "min": 0 - }, - "name": "Mass Air Flow", - "suggestedMetric": "massAirflow" - } - ] - }, - { - "hdr": "7E8", - "cmd": { - "01": "11" - }, - "freq": 1, - "signals": [ - { - "id": "LANDROVER_THROTTLE_POS", - "path": "Engine", - "fmt": { - "len": 8, - "unit": "percent", - "max": 100, - "min": 0 - }, - "name": "Throttle Position", - "suggestedMetric": "throttlePosition" - } - ] - }, - { - "hdr": "7E8", - "cmd": { - "01": "1F" - }, - "freq": 1, - "signals": [ - { - "id": "LANDROVER_TIME_SINCE_ENGINE_START", - "path": "Engine", - "fmt": { - "len": 16, - "unit": "seconds", - "max": 65535, - "min": 0 - }, - "name": "Time Since Engine Start", - "suggestedMetric": "runTime" - } - ] - }, - { - "hdr": "7E8", - "cmd": { - "01": "03" - }, - "freq": 1, - "signals": [ - { - "id": "LANDROVER_FUEL_SYS_STATUS", - "path": "Engine", - "fmt": { - "len": 8, - "unit": "scalar", - "max": 255, - "min": 0 - }, - "name": "Fuel System Status", - "suggestedMetric": "fuelSystemStatus" - } - ] - }, - { - "hdr": "7E8", - "cmd": { - "01": "06" - }, - "freq": 1, - "signals": [ - { - "id": "LANDROVER_SHORT_TERM_FUEL_TRIM_B1", - "path": "Engine", - "fmt": { - "len": 8, - "unit": "percent", - "max": 100, - "min": -100 - }, - "name": "Short Term Fuel Trim Bank 1", - "suggestedMetric": "shortTermFuelTrim" - } - ] - }, - { - "hdr": "7E8", - "cmd": { - "01": "07" - }, - "freq": 1, - "signals": [ - { - "id": "LANDROVER_LONG_TERM_FUEL_TRIM_B1", - "path": "Engine", - "fmt": { - "len": 8, - "unit": "percent", - "max": 100, - "min": -100 - }, - "name": "Long Term Fuel Trim Bank 1", - "suggestedMetric": "longTermFuelTrim" - } - ] - }, - { - "hdr": "7E8", - "cmd": { - "01": "0A" - }, - "freq": 1, - "signals": [ - { - "id": "LANDROVER_FUEL_PRESSURE", - "path": "Engine", - "fmt": { - "len": 8, - "mul": 3, - "unit": "kilopascal", - "max": 765, - "min": 0 - }, - "name": "Fuel Pressure", - "suggestedMetric": "fuelPressure" - } - ] - }, - { - "hdr": "7E8", - "cmd": { - "01": "13" - }, - "freq": 1, - "signals": [ - { - "id": "LANDROVER_O2_SENSOR_1_VOLT", - "path": "Engine", - "fmt": { - "len": 8, - "div": 200, - "unit": "volts", - "max": 1.275, - "min": 0 - }, - "name": "O2 Sensor 1 Voltage", - "suggestedMetric": "o2SensorVoltage" - } - ] - }, - { - "hdr": "7E8", - "cmd": { - "01": "1D" - }, - "freq": 1, - "signals": [ - { - "id": "LANDROVER_DIST_MIL_ON", - "path": "Stats", - "fmt": { - "len": 16, - "unit": "kilometers", - "max": 65535, - "min": 0 - }, - "name": "Distance with MIL On", - "suggestedMetric": "distanceWithMILOn" - } - ] - }, - { - "hdr": "7E8", - "cmd": { - "01": "21" - }, - "freq": 1, - "signals": [ - { - "id": "LANDROVER_DIST_SINCE_CODES_CLEARED", - "path": "Stats", - "fmt": { - "len": 16, - "unit": "kilometers", - "max": 65535, - "min": 0 - }, - "name": "Distance Since Codes Cleared", - "suggestedMetric": "distanceSinceDTCsCleared" - } - ] - }, - { - "hdr": "7E8", - "cmd": { - "01": "2F" - }, - "freq": 1, - "signals": [ - { - "id": "LANDROVER_FUEL_LEVEL", - "path": "Fuel", - "fmt": { - "len": 8, - "div": 2.55, - "unit": "percent", - "max": 100, - "min": 0 - }, - "name": "Fuel Level Input", - "suggestedMetric": "fuelTankLevel" - } - ] - }, - { - "hdr": "7E8", - "cmd": { - "01": "31" - }, - "freq": 1, - "signals": [ - { - "id": "LANDROVER_DISTANCE_TRAVELED", - "path": "Stats", - "fmt": { - "len": 16, - "unit": "kilometers", - "max": 6553500, - "min": 0, - "mul": 100 - }, - "name": "Distance Traveled", - "suggestedMetric": "odometer" - } - ] - }, - { - "hdr": "7E8", - "cmd": { - "01": "33" - }, - "freq": 1, - "signals": [ - { - "id": "LANDROVER_BARO_PRESSURE", - "path": "Engine", - "fmt": { - "len": 8, - "unit": "kilopascal", - "max": 255, - "min": 0 - }, - "name": "Barometric Pressure", - "suggestedMetric": "barometricPressure" - } - ] - }, - { - "hdr": "7E8", - "cmd": { - "01": "46" - }, - "freq": 30, - "signals": [ - { - "id": "LANDROVER_AMBIENT_AIR_TEMP", - "path": "Climate", - "fmt": { - "len": 8, - "max": 87.5, - "min": -40, - "div": 2, - "add": -40, - "unit": "celsius" - }, - "name": "Ambient Air Temperature", - "suggestedMetric": "ambientAirTemp" - } - ] - }, - { - "hdr": "7E8", - "cmd": { - "01": "4D" - }, - "freq": 1, - "signals": [ - { - "id": "LANDROVER_COMMANDED_THROTTLE_ACTUATOR", - "path": "Engine", - "fmt": { - "len": 8, - "unit": "percent", - "max": 100, - "min": 0 - }, - "name": "Commanded Throttle Actuator", - "suggestedMetric": "commandedThrottleActuator" - } - ] - }, - { - "hdr": "7E8", - "cmd": { - "01": "5C" - }, - "freq": 1, - "signals": [ - { - "id": "LANDROVER_ENGINE_OIL_TEMP_STD", - "path": "Engine", - "fmt": { - "len": 8, - "add": -40, - "unit": "celsius", - "max": 215, - "min": -40 - }, - "name": "Engine Oil Temperature (Standard)", - "suggestedMetric": "engineOilTemp" - } - ] - }, - { - "hdr": "7E8", - "cmd": { - "01": "A6" - }, - "freq": 1, - "signals": [ - { - "id": "LANDROVER_ODOMETER", - "path": "Stats", - "fmt": { - "len": 24, - "unit": "kilometers", - "max": 1677721500, - "min": 0, - "mul": 100 - }, - "name": "Odometer", - "suggestedMetric": "odometer" - } - ] - }, - { - "hdr": "7E8", - "cmd": { - "01": "A7" - }, - "freq": 1, - "signals": [ - { - "id": "LANDROVER_ODOMETER_MILES", - "path": "Stats", - "fmt": { - "len": 24, - "unit": "miles", - "max": 1677721500, - "min": 0, - "mul": 100 - }, - "name": "Odometer (Miles)", - "suggestedMetric": "odometer" - } - ] - }, - { - "hdr": "7E0", - "cmd": { - "22": "F300" - }, - "freq": 5, - "signals": [ - { - "id": "LANDROVER_ENGINE_OIL_TEMP", - "path": "Engine", - "fmt": { - "len": 8, - "add": -40, - "unit": "celsius", - "max": 255, - "min": 0 - }, - "name": "Engine Oil Temperature", - "suggestedMetric": "engineOilTemp" - } - ] - }, - { - "hdr": "7E0", - "cmd": { - "22": "F200" - }, - "freq": 5, - "signals": [ - { - "id": "LANDROVER_ENGINE_OIL_VOL", - "path": "Engine", - "fmt": { - "len": 8, - "div": 10, - "unit": "liters", - "max": 255, - "min": 0 - }, - "name": "Engine Oil Volume", - "suggestedMetric": "engineOilLevel" - } - ] - }, - { - "hdr": "7E0", - "cmd": { - "22": "033E" - }, - "freq": 5, - "signals": [ - { - "id": "LANDROVER_BOOST", - "path": "Engine", - "fmt": { - "len": 8, - "unit": "kilopascal", - "max": 255, - "min": 0 - }, - "name": "Turbo Boost Pressure", - "suggestedMetric": "turboBoostPressure" - } - ] - }, - { - "hdr": "7E0", - "cmd": { - "22": "5200" - }, - "freq": 5, - "signals": [ - { - "id": "LANDROVER_IAT2", - "path": "Engine", - "fmt": { - "len": 8, - "unit": "celsius", - "max": 255, - "min": 0 - }, - "name": "Intake Air Temperature 2", - "suggestedMetric": "intakeAirTemp2" - } - ] - }, - { - "hdr": "732", - "cmd": { - "22": "D928" - }, - "freq": 1, - "signals": [ - { - "id": "LANDROVER_PARKED", - "path": "Movement", - "fmt": { - "bix": 7, - "len": 1, - "max": 1, - "unit": "noyes", - "min": 0 - }, - "name": "Vehicle Parked Status", - "suggestedMetric": "parkedStatus" - } - ] - }, - { - "hdr": "7E0", - "cmd": { - "22": "D900" - }, - "freq": 5, - "signals": [ - { - "id": "LANDROVER_FRONT_LEFT_TIRE_PRESSURE", - "path": "Tires", - "fmt": { - "len": 8, - "unit": "psi", - "max": 255, - "min": 0 - }, - "name": "Front Left Tire Pressure", - "suggestedMetric": "frontLeftTirePressure" - } - ] - }, - { - "hdr": "7E0", - "cmd": { - "22": "D901" - }, - "freq": 5, - "signals": [ - { - "id": "LANDROVER_FRONT_RIGHT_TIRE_PRESSURE", - "path": "Tires", - "fmt": { - "len": 8, - "unit": "psi", - "max": 255, - "min": 0 - }, - "name": "Front Right Tire Pressure", - "suggestedMetric": "frontRightTirePressure" - } - ] - }, - { - "hdr": "7E0", - "cmd": { - "22": "D902" - }, - "freq": 5, - "signals": [ - { - "id": "LANDROVER_REAR_LEFT_TIRE_PRESSURE", - "path": "Tires", - "fmt": { - "len": 8, - "unit": "psi", - "max": 255, - "min": 0 - }, - "name": "Rear Left Tire Pressure", - "suggestedMetric": "rearLeftTirePressure" - } - ] - }, - { - "hdr": "7E0", - "cmd": { - "22": "D903" - }, - "freq": 5, - "signals": [ - { - "id": "LANDROVER_REAR_RIGHT_TIRE_PRESSURE", - "path": "Tires", - "fmt": { - "len": 8, - "unit": "psi", - "max": 255, - "min": 0 - }, - "name": "Rear Right Tire Pressure", - "suggestedMetric": "rearRightTirePressure" - } - ] - }, - { - "hdr": "7E0", - "cmd": { - "22": "D904" - }, - "freq": 5, - "signals": [ - { - "id": "LANDROVER_SPARE_TIRE_PRESSURE", - "path": "Tires", - "fmt": { - "len": 8, - "unit": "psi", - "max": 255, - "min": 0 - }, - "name": "Spare Tire Pressure", - "suggestedMetric": "spareTirePressure" - } - ] - }, - { - "hdr": "7E0", - "cmd": { - "22": "D910" - }, - "freq": 5, - "signals": [ - { - "id": "LANDROVER_FRONT_LEFT_TIRE_TEMP", - "path": "Tires", - "fmt": { - "len": 8, - "add": -40, - "unit": "celsius", - "max": 215, - "min": -40 - }, - "name": "Front Left Tire Temperature", - "suggestedMetric": "frontLeftTireTemp" - } - ] - }, - { - "hdr": "7E0", - "cmd": { - "22": "D911" - }, - "freq": 5, - "signals": [ - { - "id": "LANDROVER_FRONT_RIGHT_TIRE_TEMP", - "path": "Tires", - "fmt": { - "len": 8, - "add": -40, - "unit": "celsius", - "max": 215, - "min": -40 - }, - "name": "Front Right Tire Temperature", - "suggestedMetric": "frontRightTireTemp" - } - ] - }, - { - "hdr": "7E0", - "cmd": { - "22": "D912" - }, - "freq": 5, - "signals": [ - { - "id": "LANDROVER_REAR_LEFT_TIRE_TEMP", - "path": "Tires", - "fmt": { - "len": 8, - "add": -40, - "unit": "celsius", - "max": 215, - "min": -40 - }, - "name": "Rear Left Tire Temperature", - "suggestedMetric": "rearLeftTireTemp" - } - ] - }, - { - "hdr": "7E0", - "cmd": { - "22": "D913" - }, - "freq": 5, - "signals": [ - { - "id": "LANDROVER_REAR_RIGHT_TIRE_TEMP", - "path": "Tires", - "fmt": { - "len": 8, - "add": -40, - "unit": "celsius", - "max": 215, - "min": -40 - }, - "name": "Rear Right Tire Temperature", - "suggestedMetric": "rearRightTireTemp" - } - ] - }, - { - "hdr": "7E0", - "cmd": { - "22": "D920" - }, - "freq": 10, - "signals": [ - { - "id": "LANDROVER_TRANSMISSION_TEMP", - "path": "Transmission", - "fmt": { - "len": 8, - "add": -40, - "unit": "celsius", - "max": 215, - "min": -40 - }, - "name": "Transmission Fluid Temperature", - "suggestedMetric": "transmissionTemp" - } - ] - }, - { - "hdr": "7E0", - "cmd": { - "22": "D921" - }, - "freq": 10, - "signals": [ - { - "id": "LANDROVER_GEAR_POSITION", - "path": "Transmission", - "fmt": { - "len": 8, - "unit": "scalar", - "max": 15, - "min": 0 - }, - "name": "Current Gear Position", - "suggestedMetric": "gearPosition" - } - ] - }, - { - "hdr": "7E0", - "cmd": { - "22": "D930" - }, - "freq": 5, - "signals": [ - { - "id": "LANDROVER_BATTERY_VOLTAGE", - "path": "Electrical", - "fmt": { - "len": 16, - "div": 1000, - "unit": "volts", - "max": 18, - "min": 6 - }, - "name": "Battery Voltage", - "suggestedMetric": "batteryVoltage" - } - ] - }, - { - "hdr": "7E0", - "cmd": { - "22": "D931" - }, - "freq": 5, - "signals": [ - { - "id": "LANDROVER_ALTERNATOR_DUTY", - "path": "Electrical", - "fmt": { - "len": 8, - "unit": "percent", - "max": 100, - "min": 0 - }, - "name": "Alternator Duty Cycle", - "suggestedMetric": "alternatorDuty" - } - ] - }, - { - "hdr": "7E0", - "cmd": { - "22": "D940" - }, - "freq": 2, - "signals": [ - { - "id": "LANDROVER_AC_COMPRESSOR_STATUS", - "path": "Climate", - "fmt": { - "bix": 0, - "len": 1, - "unit": "noyes", - "max": 1, - "min": 0 - }, - "name": "AC Compressor Status", - "suggestedMetric": "acCompressorStatus" - } - ] - }, - { - "hdr": "7E0", - "cmd": { - "22": "D941" - }, - "freq": 2, - "signals": [ - { - "id": "LANDROVER_CABIN_TEMP", - "path": "Climate", - "fmt": { - "len": 8, - "add": -40, - "unit": "celsius", - "max": 87.5, - "min": -40 - }, - "name": "Cabin Temperature", - "suggestedMetric": "cabinTemp" - } - ] - }, - { - "hdr": "7DF", - "cmd": { - "22": "F190" - }, - "freq": 30, - "signals": [ - { - "id": "LANDROVER_VIN", - "path": "Vehicle", - "fmt": { - "len": 136, - "unit": "ascii", - "max": 17, - "min": 17 - }, - "name": "Vehicle Identification Number", - "suggestedMetric": "vin" - } - ] - }, - { - "hdr": "7E0", - "cmd": { - "22": "F186" - }, - "freq": 30, - "signals": [ - { - "id": "LANDROVER_ECU_SERIAL", - "path": "Vehicle", - "fmt": { - "len": 64, - "unit": "ascii", - "max": 8, - "min": 8 - }, - "name": "ECU Serial Number", - "suggestedMetric": "ecuSerial" - } - ] - } - ] +{ "commands": [ +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "0D"}, "freq": 1, "signals": [{"id": "LANDROVER_VSS", "path": "Movement", "fmt": {"len": 8, "max": 255, "unit": "kilometersPerHour", "min": 0}, "name": "Vehicle Speed", "suggestedMetric": "speed"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "0C"}, "freq": 1, "signals": [{"id": "LANDROVER_ENGINE_RPM", "path": "Engine", "fmt": {"len": 16, "div": 4, "max": 16383, "unit": "rpm", "min": 0}, "name": "Engine RPM"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "05"}, "freq": 1, "signals": [{"id": "LANDROVER_COOLANT_TEMP", "path": "Engine", "fmt": {"len": 8, "add": -40, "max": 215, "unit": "celsius", "min": 0}, "name": "Coolant Temperature"}]}, +{ "hdr": "732", "dbg": true, "cmd": {"22": "D928"}, "freq": 1, "signals": [{"id": "LANDROVER_PARKED", "path": "Movement", "fmt": {"bix": 7, "len": 1, "max": 1, "unit": "noyes", "min": 0}, "name": "Parked?"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "04"}, "freq": 1, "signals": [{"id": "LANDROVER_ENGINE_LOAD", "path": "Engine", "fmt": {"len": 8, "max": 100, "unit": "percent", "min": 0}, "name": "Engine Load"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "0F"}, "freq": 1, "signals": [{"id": "LANDROVER_IAT", "path": "Engine", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 255, "min": 0}, "name": "Intake Air Temperature"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "10"}, "freq": 1, "signals": [{"id": "LANDROVER_MAF", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "gramsPerSecond", "max": 255, "min": 0}, "name": "Mass Air Flow"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "1F"}, "freq": 1, "signals": [{"id": "LANDROVER_TIME_SINCE_ENGINE_START", "path": "Clocks", "fmt": {"len": 16, "unit": "seconds", "max": 65535, "min": 0}, "name": "Time Since Engine Start"}]}, +{ "hdr": "7E0", "dbg": true, "cmd": {"22": "F300"}, "freq": 5, "signals": [{"id": "LANDROVER_ENGINE_OIL_TEMP", "path": "Engine", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 255, "min": 0}, "name": "Engine Oil Temp"}]}, +{ "hdr": "7E0", "dbg": true, "cmd": {"22": "F200"}, "freq": 5, "signals": [{"id": "LANDROVER_ENGINE_OIL_VOL", "path": "Engine", "fmt": {"len": 8, "div": 10, "unit": "liters", "max": 255, "min": 0}, "name": "Engine Oil Volume"}]}, +{ "hdr": "7E0", "dbg": true, "cmd": {"22": "33E"}, "freq": 5, "signals": [{"id": "LANDROVER_BOOST", "path": "Engine", "fmt": {"len": 8, "unit": "kilopascal", "max": 255, "min": 0}, "name": "Boost"}]}, +{ "hdr": "7E0", "dbg": true, "cmd": {"22": "5200"}, "freq": 5, "signals": [{"id": "LANDROVER_IAT2", "path": "Engine", "fmt": {"len": 8, "unit": "celsius", "max": 255, "min": 0}, "name": "IAT2"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "03"}, "freq": 1, "signals": [{"id": "LANDROVER_FUEL_SYS_STATUS", "path": "Engine", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Fuel System Status"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "06"}, "freq": 1, "signals": [{"id": "LANDROVER_SHORT_TERM_FUEL_TRIM_B1", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": -100}, "name": "Short Term Fuel Trim Bank 1"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "07"}, "freq": 1, "signals": [{"id": "LANDROVER_LONG_TERM_FUEL_TRIM_B1", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": -100}, "name": "Long Term Fuel Trim Bank 1"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "0A"}, "freq": 1, "signals": [{"id": "LANDROVER_FUEL_PRESSURE", "path": "Engine", "fmt": {"len": 8, "unit": "kilopascal", "max": 765, "min": 0}, "name": "Fuel Pressure"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "11"}, "freq": 1, "signals": [{"id": "LANDROVER_THROTTLE_POS", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Throttle Position"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "13"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_1_VOLT", "path": "Engine", "fmt": {"len": 8, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 1 Voltage"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "1D"}, "freq": 1, "signals": [{"id": "LANDROVER_DIST_MIL_ON", "path": "Stats", "fmt": {"len": 16, "unit": "kilometers", "max": 65535, "min": 0}, "name": "Distance with MIL On"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "21"}, "freq": 1, "signals": [{"id": "LANDROVER_DIST_SINCE_CODES_CLEARED", "path": "Stats", "fmt": {"len": 16, "unit": "kilometers", "max": 65535, "min": 0}, "name": "Distance Since Codes Cleared", "suggestedMetric": "distanceSinceDTCsCleared"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "2F"}, "freq": 1, "signals": [{"id": "LANDROVER_FUEL_LEVEL", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Input", "suggestedMetric": "fuelTankLevel"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "33"}, "freq": 1, "signals": [{"id": "LANDROVER_BARO_PRESSURE", "path": "Engine", "fmt": {"len": 8, "unit": "kilopascal", "max": 255, "min": 0}, "name": "Barometric Pressure"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "46"}, "freq": 30, "signals": [{"id": "LANDROVER_AMBIENT_AIR_TEMP", "path": "Climate", "fmt": {"len": 8, "max": 87.5, "min": -40, "div": 2, "add": -40, "unit": "celsius"}, "name": "Ambient Air Temperature"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "4D"}, "freq": 1, "signals": [{"id": "LANDROVER_COMMANDED_THROTTLE_ACTUATOR", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Commanded Throttle Actuator"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "5C"}, "freq": 1, "signals": [{"id": "LANDROVER_ENGINE_OIL_TEMP_STD", "path": "Engine", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Engine Oil Temperature (Std)"}]}, +{ "hdr": "7E0", "dbg": true, "cmd": {"22": "D900"}, "freq": 5, "signals": [{"id": "LANDROVER_FRONT_LEFT_TIRE_PRESSURE", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Front Left Tire Pressure", "suggestedMetric": "frontLeftTirePressure"}]}, +{ "hdr": "7E0", "dbg": true, "cmd": {"22": "D901"}, "freq": 5, "signals": [{"id": "LANDROVER_FRONT_RIGHT_TIRE_PRESSURE", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Front Right Tire Pressure", "suggestedMetric": "frontRightTirePressure"}]}, +{ "hdr": "7E0", "dbg": true, "cmd": {"22": "D902"}, "freq": 5, "signals": [{"id": "LANDROVER_REAR_LEFT_TIRE_PRESSURE", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Rear Left Tire Pressure", "suggestedMetric": "rearLeftTirePressure"}]}, +{ "hdr": "7E0", "dbg": true, "cmd": {"22": "D903"}, "freq": 5, "signals": [{"id": "LANDROVER_REAR_RIGHT_TIRE_PRESSURE", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Rear Right Tire Pressure", "suggestedMetric": "rearRightTirePressure"}]}, +{ "hdr": "7E0", "dbg": true, "cmd": {"22": "D904"}, "freq": 5, "signals": [{"id": "LANDROVER_SPARE_TIRE_PRESSURE", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Spare Tire Pressure"}]}, +{ "hdr": "7E0", "dbg": true, "cmd": {"22": "D910"}, "freq": 5, "signals": [{"id": "LANDROVER_FRONT_LEFT_TIRE_TEMP", "path": "Tires", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Front Left Tire Temperature"}]}, +{ "hdr": "7E0", "dbg": true, "cmd": {"22": "D911"}, "freq": 5, "signals": [{"id": "LANDROVER_FRONT_RIGHT_TIRE_TEMP", "path": "Tires", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Front Right Tire Temperature"}]}, +{ "hdr": "7E0", "dbg": true, "cmd": {"22": "D912"}, "freq": 5, "signals": [{"id": "LANDROVER_REAR_LEFT_TIRE_TEMP", "path": "Tires", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Rear Left Tire Temperature"}]}, +{ "hdr": "7E0", "dbg": true, "cmd": {"22": "D913"}, "freq": 5, "signals": [{"id": "LANDROVER_REAR_RIGHT_TIRE_TEMP", "path": "Tires", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Rear Right Tire Temperature"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "31"}, "freq": 1, "signals": [{"id": "LANDROVER_DISTANCE_TRAVELED", "path": "Stats", "fmt": {"len": 16, "unit": "kilometers", "max": 6553500, "min": 0, "mul": 100}, "name": "Distance Traveled", "suggestedMetric": "odometer"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "A6"}, "freq": 1, "signals": [{"id": "LANDROVER_ODOMETER", "path": "Stats", "fmt": {"len": 24, "unit": "kilometers", "max": 1677721500, "min": 0, "mul": 100}, "name": "Odometer", "suggestedMetric": "odometer"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "A7"}, "freq": 1, "signals": [{"id": "LANDROVER_ODOMETER_MILES", "path": "Stats", "fmt": {"len": 24, "unit": "miles", "max": 1677721500, "min": 0, "mul": 100}, "name": "Odometer (Miles)", "suggestedMetric": "odometer"}]}, +{ "hdr": "733", "dbg": true, "cmd": {"22": "9924"}, "freq": 30, "signals": [{"id": "JAGUAR_AAT_ALT", "path": "Climate", "fmt": {"len": 8, "max": 87.5, "min": -40, "div": 2, "add": -40, "unit": "celsius"}, "name": "Outside Temperature (Jaguar method)"}]}, +{ "hdr": "751", "dbg": true, "cmd": {"22": "2076"}, "freq": 5, "signals": [{"id": "JAGUAR_TP_FL_ALT", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "unit": "bars"}, "name": "Front Left Tire Pressure (Jaguar method)", "suggestedMetric": "frontLeftTirePressure"}]}, +{ "hdr": "751", "dbg": true, "cmd": {"22": "2077"}, "freq": 5, "signals": [{"id": "JAGUAR_TP_FR_ALT", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "unit": "bars"}, "name": "Front Right Tire Pressure (Jaguar method)", "suggestedMetric": "frontRightTirePressure"}]}, +{ "hdr": "751", "dbg": true, "cmd": {"22": "2078"}, "freq": 5, "signals": [{"id": "JAGUAR_TP_RR_ALT", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "unit": "bars"}, "name": "Rear Right Tire Pressure (Jaguar method)", "suggestedMetric": "rearRightTirePressure"}]}, +{ "hdr": "751", "dbg": true, "cmd": {"22": "2079"}, "freq": 5, "signals": [{"id": "JAGUAR_TP_RL_ALT", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "unit": "bars"}, "name": "Rear Left Tire Pressure (Jaguar method)", "suggestedMetric": "rearLeftTirePressure"}]}, +{ "hdr": "7E4", "dbg": true, "cmd": {"22": "DD01"}, "freq": 5, "signals": [{"id": "JAGUAR_ODOMETER_ALT", "path": "Stats", "fmt": {"len": 24, "max": 1000000, "unit": "kilometers"}, "name": "Odometer (Jaguar method)", "suggestedMetric": "odometer"}]}, +{ "hdr": "7E4", "dbg": true, "cmd": {"22": "DD09"}, "freq": 1, "signals": [{"id": "JAGUAR_VSS_ALT", "path": "Movement", "fmt": {"len": 8, "max": 255, "unit": "kilometersPerHour"}, "name": "Vehicle Speed (Jaguar method)", "suggestedMetric": "speed"}]} +] } From c2abc828a8246b7b4bc8c787da6118c65a4e0716 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sat, 19 Jul 2025 20:53:26 -0500 Subject: [PATCH 06/84] jag fail --- signalsets/v3/default.json | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index db3361a..5f37f57 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -36,12 +36,21 @@ { "hdr": "7E8", "dbg": true, "cmd": {"01": "31"}, "freq": 1, "signals": [{"id": "LANDROVER_DISTANCE_TRAVELED", "path": "Stats", "fmt": {"len": 16, "unit": "kilometers", "max": 6553500, "min": 0, "mul": 100}, "name": "Distance Traveled", "suggestedMetric": "odometer"}]}, { "hdr": "7E8", "dbg": true, "cmd": {"01": "A6"}, "freq": 1, "signals": [{"id": "LANDROVER_ODOMETER", "path": "Stats", "fmt": {"len": 24, "unit": "kilometers", "max": 1677721500, "min": 0, "mul": 100}, "name": "Odometer", "suggestedMetric": "odometer"}]}, { "hdr": "7E8", "dbg": true, "cmd": {"01": "A7"}, "freq": 1, "signals": [{"id": "LANDROVER_ODOMETER_MILES", "path": "Stats", "fmt": {"len": 24, "unit": "miles", "max": 1677721500, "min": 0, "mul": 100}, "name": "Odometer (Miles)", "suggestedMetric": "odometer"}]}, -{ "hdr": "733", "dbg": true, "cmd": {"22": "9924"}, "freq": 30, "signals": [{"id": "JAGUAR_AAT_ALT", "path": "Climate", "fmt": {"len": 8, "max": 87.5, "min": -40, "div": 2, "add": -40, "unit": "celsius"}, "name": "Outside Temperature (Jaguar method)"}]}, -{ "hdr": "751", "dbg": true, "cmd": {"22": "2076"}, "freq": 5, "signals": [{"id": "JAGUAR_TP_FL_ALT", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "unit": "bars"}, "name": "Front Left Tire Pressure (Jaguar method)", "suggestedMetric": "frontLeftTirePressure"}]}, -{ "hdr": "751", "dbg": true, "cmd": {"22": "2077"}, "freq": 5, "signals": [{"id": "JAGUAR_TP_FR_ALT", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "unit": "bars"}, "name": "Front Right Tire Pressure (Jaguar method)", "suggestedMetric": "frontRightTirePressure"}]}, -{ "hdr": "751", "dbg": true, "cmd": {"22": "2078"}, "freq": 5, "signals": [{"id": "JAGUAR_TP_RR_ALT", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "unit": "bars"}, "name": "Rear Right Tire Pressure (Jaguar method)", "suggestedMetric": "rearRightTirePressure"}]}, -{ "hdr": "751", "dbg": true, "cmd": {"22": "2079"}, "freq": 5, "signals": [{"id": "JAGUAR_TP_RL_ALT", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "unit": "bars"}, "name": "Rear Left Tire Pressure (Jaguar method)", "suggestedMetric": "rearLeftTirePressure"}]}, -{ "hdr": "7E4", "dbg": true, "cmd": {"22": "DD01"}, "freq": 5, "signals": [{"id": "JAGUAR_ODOMETER_ALT", "path": "Stats", "fmt": {"len": 24, "max": 1000000, "unit": "kilometers"}, "name": "Odometer (Jaguar method)", "suggestedMetric": "odometer"}]}, -{ "hdr": "7E4", "dbg": true, "cmd": {"22": "DD09"}, "freq": 1, "signals": [{"id": "JAGUAR_VSS_ALT", "path": "Movement", "fmt": {"len": 8, "max": 255, "unit": "kilometersPerHour"}, "name": "Vehicle Speed (Jaguar method)", "suggestedMetric": "speed"}]} +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "42"}, "freq": 1, "signals": [{"id": "LANDROVER_CONTROL_MODULE_VOLTAGE", "path": "Engine", "fmt": {"len": 16, "div": 1000, "unit": "volts", "max": 65.535, "min": 0}, "name": "Control Module Voltage"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "43"}, "freq": 1, "signals": [{"id": "LANDROVER_ABS_LOAD_VALUE", "path": "Engine", "fmt": {"len": 16, "div": 255, "unit": "percent", "max": 25700, "min": 0}, "name": "Absolute Load Value"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "44"}, "freq": 1, "signals": [{"id": "LANDROVER_COMMANDED_EQUIV_RATIO", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "ratio", "max": 2, "min": 0}, "name": "Commanded Equivalence Ratio"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "45"}, "freq": 1, "signals": [{"id": "LANDROVER_RELATIVE_THROTTLE_POS", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Relative Throttle Position"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "47"}, "freq": 1, "signals": [{"id": "LANDROVER_ABS_THROTTLE_POS_B", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Absolute Throttle Position B"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "48"}, "freq": 1, "signals": [{"id": "LANDROVER_ABS_THROTTLE_POS_C", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Absolute Throttle Position C"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "49"}, "freq": 1, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_D", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position D"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "4A"}, "freq": 1, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_E", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position E"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "4B"}, "freq": 1, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_F", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position F"}]}, +{ "hdr": "7E8", "dbg": true, "cmd": {"01": "4C"}, "freq": 1, "signals": [{"id": "LANDROVER_COMMANDED_THROTTLE_ACTUATOR_CTRL", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Commanded Throttle Actuator Control"}]}, +{ "hdr": "7E0", "dbg": true, "cmd": {"22": "F40C"}, "freq": 10, "signals": [{"id": "LANDROVER_BATTERY_VOLTAGE", "path": "Engine", "fmt": {"len": 16, "div": 1000, "unit": "volts", "max": 25.5, "min": 0}, "name": "Battery Voltage"}]}, +{ "hdr": "7E0", "dbg": true, "cmd": {"22": "F442"}, "freq": 10, "signals": [{"id": "LANDROVER_VEHICLE_SPEED_2", "path": "Movement", "fmt": {"len": 16, "div": 100, "unit": "kilometersPerHour", "max": 655.35, "min": 0}, "name": "Vehicle Speed (Enhanced)"}]}, +{ "hdr": "7E0", "dbg": true, "cmd": {"22": "F1A3"}, "freq": 30, "signals": [{"id": "LANDROVER_INTAKE_AIR_TEMP_2", "path": "Engine", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Intake Air Temperature 2"}]}, +{ "hdr": "7E0", "dbg": true, "cmd": {"22": "F18C"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure"}]}, +{ "hdr": "7E0", "dbg": true, "cmd": {"22": "F1AB"}, "freq": 5, "signals": [{"id": "LANDROVER_TURBO_BOOST_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "kilopascal", "max": 655.35, "min": 0}, "name": "Turbo Boost Pressure"}]}, +{ "hdr": "7E0", "dbg": true, "cmd": {"22": "F18D"}, "freq": 5, "signals": [{"id": "LANDROVER_INTAKE_MANIFOLD_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "kilopascal", "max": 655.35, "min": 0}, "name": "Intake Manifold Pressure"}]} ] } From 434cea5893be62a1d19a5cebbfd31c31d300d94e Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Fri, 25 Jul 2025 23:32:26 -0500 Subject: [PATCH 07/84] remove dbg statements --- signalsets/v3/default.json | 106 ++++++++++++++++++------------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 5f37f57..fb95d97 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -1,56 +1,56 @@ { "commands": [ -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "0D"}, "freq": 1, "signals": [{"id": "LANDROVER_VSS", "path": "Movement", "fmt": {"len": 8, "max": 255, "unit": "kilometersPerHour", "min": 0}, "name": "Vehicle Speed", "suggestedMetric": "speed"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "0C"}, "freq": 1, "signals": [{"id": "LANDROVER_ENGINE_RPM", "path": "Engine", "fmt": {"len": 16, "div": 4, "max": 16383, "unit": "rpm", "min": 0}, "name": "Engine RPM"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "05"}, "freq": 1, "signals": [{"id": "LANDROVER_COOLANT_TEMP", "path": "Engine", "fmt": {"len": 8, "add": -40, "max": 215, "unit": "celsius", "min": 0}, "name": "Coolant Temperature"}]}, -{ "hdr": "732", "dbg": true, "cmd": {"22": "D928"}, "freq": 1, "signals": [{"id": "LANDROVER_PARKED", "path": "Movement", "fmt": {"bix": 7, "len": 1, "max": 1, "unit": "noyes", "min": 0}, "name": "Parked?"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "04"}, "freq": 1, "signals": [{"id": "LANDROVER_ENGINE_LOAD", "path": "Engine", "fmt": {"len": 8, "max": 100, "unit": "percent", "min": 0}, "name": "Engine Load"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "0F"}, "freq": 1, "signals": [{"id": "LANDROVER_IAT", "path": "Engine", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 255, "min": 0}, "name": "Intake Air Temperature"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "10"}, "freq": 1, "signals": [{"id": "LANDROVER_MAF", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "gramsPerSecond", "max": 255, "min": 0}, "name": "Mass Air Flow"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "1F"}, "freq": 1, "signals": [{"id": "LANDROVER_TIME_SINCE_ENGINE_START", "path": "Clocks", "fmt": {"len": 16, "unit": "seconds", "max": 65535, "min": 0}, "name": "Time Since Engine Start"}]}, -{ "hdr": "7E0", "dbg": true, "cmd": {"22": "F300"}, "freq": 5, "signals": [{"id": "LANDROVER_ENGINE_OIL_TEMP", "path": "Engine", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 255, "min": 0}, "name": "Engine Oil Temp"}]}, -{ "hdr": "7E0", "dbg": true, "cmd": {"22": "F200"}, "freq": 5, "signals": [{"id": "LANDROVER_ENGINE_OIL_VOL", "path": "Engine", "fmt": {"len": 8, "div": 10, "unit": "liters", "max": 255, "min": 0}, "name": "Engine Oil Volume"}]}, -{ "hdr": "7E0", "dbg": true, "cmd": {"22": "33E"}, "freq": 5, "signals": [{"id": "LANDROVER_BOOST", "path": "Engine", "fmt": {"len": 8, "unit": "kilopascal", "max": 255, "min": 0}, "name": "Boost"}]}, -{ "hdr": "7E0", "dbg": true, "cmd": {"22": "5200"}, "freq": 5, "signals": [{"id": "LANDROVER_IAT2", "path": "Engine", "fmt": {"len": 8, "unit": "celsius", "max": 255, "min": 0}, "name": "IAT2"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "03"}, "freq": 1, "signals": [{"id": "LANDROVER_FUEL_SYS_STATUS", "path": "Engine", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Fuel System Status"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "06"}, "freq": 1, "signals": [{"id": "LANDROVER_SHORT_TERM_FUEL_TRIM_B1", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": -100}, "name": "Short Term Fuel Trim Bank 1"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "07"}, "freq": 1, "signals": [{"id": "LANDROVER_LONG_TERM_FUEL_TRIM_B1", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": -100}, "name": "Long Term Fuel Trim Bank 1"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "0A"}, "freq": 1, "signals": [{"id": "LANDROVER_FUEL_PRESSURE", "path": "Engine", "fmt": {"len": 8, "unit": "kilopascal", "max": 765, "min": 0}, "name": "Fuel Pressure"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "11"}, "freq": 1, "signals": [{"id": "LANDROVER_THROTTLE_POS", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Throttle Position"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "13"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_1_VOLT", "path": "Engine", "fmt": {"len": 8, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 1 Voltage"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "1D"}, "freq": 1, "signals": [{"id": "LANDROVER_DIST_MIL_ON", "path": "Stats", "fmt": {"len": 16, "unit": "kilometers", "max": 65535, "min": 0}, "name": "Distance with MIL On"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "21"}, "freq": 1, "signals": [{"id": "LANDROVER_DIST_SINCE_CODES_CLEARED", "path": "Stats", "fmt": {"len": 16, "unit": "kilometers", "max": 65535, "min": 0}, "name": "Distance Since Codes Cleared", "suggestedMetric": "distanceSinceDTCsCleared"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "2F"}, "freq": 1, "signals": [{"id": "LANDROVER_FUEL_LEVEL", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Input", "suggestedMetric": "fuelTankLevel"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "33"}, "freq": 1, "signals": [{"id": "LANDROVER_BARO_PRESSURE", "path": "Engine", "fmt": {"len": 8, "unit": "kilopascal", "max": 255, "min": 0}, "name": "Barometric Pressure"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "46"}, "freq": 30, "signals": [{"id": "LANDROVER_AMBIENT_AIR_TEMP", "path": "Climate", "fmt": {"len": 8, "max": 87.5, "min": -40, "div": 2, "add": -40, "unit": "celsius"}, "name": "Ambient Air Temperature"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "4D"}, "freq": 1, "signals": [{"id": "LANDROVER_COMMANDED_THROTTLE_ACTUATOR", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Commanded Throttle Actuator"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "5C"}, "freq": 1, "signals": [{"id": "LANDROVER_ENGINE_OIL_TEMP_STD", "path": "Engine", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Engine Oil Temperature (Std)"}]}, -{ "hdr": "7E0", "dbg": true, "cmd": {"22": "D900"}, "freq": 5, "signals": [{"id": "LANDROVER_FRONT_LEFT_TIRE_PRESSURE", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Front Left Tire Pressure", "suggestedMetric": "frontLeftTirePressure"}]}, -{ "hdr": "7E0", "dbg": true, "cmd": {"22": "D901"}, "freq": 5, "signals": [{"id": "LANDROVER_FRONT_RIGHT_TIRE_PRESSURE", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Front Right Tire Pressure", "suggestedMetric": "frontRightTirePressure"}]}, -{ "hdr": "7E0", "dbg": true, "cmd": {"22": "D902"}, "freq": 5, "signals": [{"id": "LANDROVER_REAR_LEFT_TIRE_PRESSURE", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Rear Left Tire Pressure", "suggestedMetric": "rearLeftTirePressure"}]}, -{ "hdr": "7E0", "dbg": true, "cmd": {"22": "D903"}, "freq": 5, "signals": [{"id": "LANDROVER_REAR_RIGHT_TIRE_PRESSURE", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Rear Right Tire Pressure", "suggestedMetric": "rearRightTirePressure"}]}, -{ "hdr": "7E0", "dbg": true, "cmd": {"22": "D904"}, "freq": 5, "signals": [{"id": "LANDROVER_SPARE_TIRE_PRESSURE", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Spare Tire Pressure"}]}, -{ "hdr": "7E0", "dbg": true, "cmd": {"22": "D910"}, "freq": 5, "signals": [{"id": "LANDROVER_FRONT_LEFT_TIRE_TEMP", "path": "Tires", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Front Left Tire Temperature"}]}, -{ "hdr": "7E0", "dbg": true, "cmd": {"22": "D911"}, "freq": 5, "signals": [{"id": "LANDROVER_FRONT_RIGHT_TIRE_TEMP", "path": "Tires", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Front Right Tire Temperature"}]}, -{ "hdr": "7E0", "dbg": true, "cmd": {"22": "D912"}, "freq": 5, "signals": [{"id": "LANDROVER_REAR_LEFT_TIRE_TEMP", "path": "Tires", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Rear Left Tire Temperature"}]}, -{ "hdr": "7E0", "dbg": true, "cmd": {"22": "D913"}, "freq": 5, "signals": [{"id": "LANDROVER_REAR_RIGHT_TIRE_TEMP", "path": "Tires", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Rear Right Tire Temperature"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "31"}, "freq": 1, "signals": [{"id": "LANDROVER_DISTANCE_TRAVELED", "path": "Stats", "fmt": {"len": 16, "unit": "kilometers", "max": 6553500, "min": 0, "mul": 100}, "name": "Distance Traveled", "suggestedMetric": "odometer"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "A6"}, "freq": 1, "signals": [{"id": "LANDROVER_ODOMETER", "path": "Stats", "fmt": {"len": 24, "unit": "kilometers", "max": 1677721500, "min": 0, "mul": 100}, "name": "Odometer", "suggestedMetric": "odometer"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "A7"}, "freq": 1, "signals": [{"id": "LANDROVER_ODOMETER_MILES", "path": "Stats", "fmt": {"len": 24, "unit": "miles", "max": 1677721500, "min": 0, "mul": 100}, "name": "Odometer (Miles)", "suggestedMetric": "odometer"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "42"}, "freq": 1, "signals": [{"id": "LANDROVER_CONTROL_MODULE_VOLTAGE", "path": "Engine", "fmt": {"len": 16, "div": 1000, "unit": "volts", "max": 65.535, "min": 0}, "name": "Control Module Voltage"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "43"}, "freq": 1, "signals": [{"id": "LANDROVER_ABS_LOAD_VALUE", "path": "Engine", "fmt": {"len": 16, "div": 255, "unit": "percent", "max": 25700, "min": 0}, "name": "Absolute Load Value"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "44"}, "freq": 1, "signals": [{"id": "LANDROVER_COMMANDED_EQUIV_RATIO", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "ratio", "max": 2, "min": 0}, "name": "Commanded Equivalence Ratio"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "45"}, "freq": 1, "signals": [{"id": "LANDROVER_RELATIVE_THROTTLE_POS", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Relative Throttle Position"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "47"}, "freq": 1, "signals": [{"id": "LANDROVER_ABS_THROTTLE_POS_B", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Absolute Throttle Position B"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "48"}, "freq": 1, "signals": [{"id": "LANDROVER_ABS_THROTTLE_POS_C", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Absolute Throttle Position C"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "49"}, "freq": 1, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_D", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position D"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "4A"}, "freq": 1, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_E", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position E"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "4B"}, "freq": 1, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_F", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position F"}]}, -{ "hdr": "7E8", "dbg": true, "cmd": {"01": "4C"}, "freq": 1, "signals": [{"id": "LANDROVER_COMMANDED_THROTTLE_ACTUATOR_CTRL", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Commanded Throttle Actuator Control"}]}, -{ "hdr": "7E0", "dbg": true, "cmd": {"22": "F40C"}, "freq": 10, "signals": [{"id": "LANDROVER_BATTERY_VOLTAGE", "path": "Engine", "fmt": {"len": 16, "div": 1000, "unit": "volts", "max": 25.5, "min": 0}, "name": "Battery Voltage"}]}, -{ "hdr": "7E0", "dbg": true, "cmd": {"22": "F442"}, "freq": 10, "signals": [{"id": "LANDROVER_VEHICLE_SPEED_2", "path": "Movement", "fmt": {"len": 16, "div": 100, "unit": "kilometersPerHour", "max": 655.35, "min": 0}, "name": "Vehicle Speed (Enhanced)"}]}, -{ "hdr": "7E0", "dbg": true, "cmd": {"22": "F1A3"}, "freq": 30, "signals": [{"id": "LANDROVER_INTAKE_AIR_TEMP_2", "path": "Engine", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Intake Air Temperature 2"}]}, -{ "hdr": "7E0", "dbg": true, "cmd": {"22": "F18C"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure"}]}, -{ "hdr": "7E0", "dbg": true, "cmd": {"22": "F1AB"}, "freq": 5, "signals": [{"id": "LANDROVER_TURBO_BOOST_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "kilopascal", "max": 655.35, "min": 0}, "name": "Turbo Boost Pressure"}]}, -{ "hdr": "7E0", "dbg": true, "cmd": {"22": "F18D"}, "freq": 5, "signals": [{"id": "LANDROVER_INTAKE_MANIFOLD_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "kilopascal", "max": 655.35, "min": 0}, "name": "Intake Manifold Pressure"}]} +{ "hdr": "7E8", "cmd": {"01": "0D"}, "freq": 1, "signals": [{"id": "LANDROVER_VSS", "path": "Movement", "fmt": {"len": 8, "max": 255, "unit": "kilometersPerHour", "min": 0}, "name": "Vehicle Speed", "suggestedMetric": "speed"}]}, +{ "hdr": "7E8", "cmd": {"01": "0C"}, "freq": 1, "signals": [{"id": "LANDROVER_ENGINE_RPM", "path": "Engine", "fmt": {"len": 16, "div": 4, "max": 16383, "unit": "rpm", "min": 0}, "name": "Engine RPM"}]}, +{ "hdr": "7E8", "cmd": {"01": "05"}, "freq": 1, "signals": [{"id": "LANDROVER_COOLANT_TEMP", "path": "Engine", "fmt": {"len": 8, "add": -40, "max": 215, "unit": "celsius", "min": 0}, "name": "Coolant Temperature"}]}, +{ "hdr": "732", "cmd": {"22": "D928"}, "freq": 1, "signals": [{"id": "LANDROVER_PARKED", "path": "Movement", "fmt": {"bix": 7, "len": 1, "max": 1, "unit": "noyes", "min": 0}, "name": "Parked?"}]}, +{ "hdr": "7E8", "cmd": {"01": "04"}, "freq": 1, "signals": [{"id": "LANDROVER_ENGINE_LOAD", "path": "Engine", "fmt": {"len": 8, "max": 100, "unit": "percent", "min": 0}, "name": "Engine Load"}]}, +{ "hdr": "7E8", "cmd": {"01": "0F"}, "freq": 1, "signals": [{"id": "LANDROVER_IAT", "path": "Engine", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 255, "min": 0}, "name": "Intake Air Temperature"}]}, +{ "hdr": "7E8", "cmd": {"01": "10"}, "freq": 1, "signals": [{"id": "LANDROVER_MAF", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "gramsPerSecond", "max": 255, "min": 0}, "name": "Mass Air Flow"}]}, +{ "hdr": "7E8", "cmd": {"01": "1F"}, "freq": 1, "signals": [{"id": "LANDROVER_TIME_SINCE_ENGINE_START", "path": "Clocks", "fmt": {"len": 16, "unit": "seconds", "max": 65535, "min": 0}, "name": "Time Since Engine Start"}]}, +{ "hdr": "7E0", "cmd": {"22": "F300"}, "freq": 5, "signals": [{"id": "LANDROVER_ENGINE_OIL_TEMP", "path": "Engine", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 255, "min": 0}, "name": "Engine Oil Temp"}]}, +{ "hdr": "7E0", "cmd": {"22": "F200"}, "freq": 5, "signals": [{"id": "LANDROVER_ENGINE_OIL_VOL", "path": "Engine", "fmt": {"len": 8, "div": 10, "unit": "liters", "max": 255, "min": 0}, "name": "Engine Oil Volume"}]}, +{ "hdr": "7E0", "cmd": {"22": "33E"}, "freq": 5, "signals": [{"id": "LANDROVER_BOOST", "path": "Engine", "fmt": {"len": 8, "unit": "kilopascal", "max": 255, "min": 0}, "name": "Boost"}]}, +{ "hdr": "7E0", "cmd": {"22": "5200"}, "freq": 5, "signals": [{"id": "LANDROVER_IAT2", "path": "Engine", "fmt": {"len": 8, "unit": "celsius", "max": 255, "min": 0}, "name": "IAT2"}]}, +{ "hdr": "7E8", "cmd": {"01": "03"}, "freq": 1, "signals": [{"id": "LANDROVER_FUEL_SYS_STATUS", "path": "Engine", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Fuel System Status"}]}, +{ "hdr": "7E8", "cmd": {"01": "06"}, "freq": 1, "signals": [{"id": "LANDROVER_SHORT_TERM_FUEL_TRIM_B1", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": -100}, "name": "Short Term Fuel Trim Bank 1"}]}, +{ "hdr": "7E8", "cmd": {"01": "07"}, "freq": 1, "signals": [{"id": "LANDROVER_LONG_TERM_FUEL_TRIM_B1", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": -100}, "name": "Long Term Fuel Trim Bank 1"}]}, +{ "hdr": "7E8", "cmd": {"01": "0A"}, "freq": 1, "signals": [{"id": "LANDROVER_FUEL_PRESSURE", "path": "Engine", "fmt": {"len": 8, "unit": "kilopascal", "max": 765, "min": 0}, "name": "Fuel Pressure"}]}, +{ "hdr": "7E8", "cmd": {"01": "11"}, "freq": 1, "signals": [{"id": "LANDROVER_THROTTLE_POS", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Throttle Position"}]}, +{ "hdr": "7E8", "cmd": {"01": "13"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_1_VOLT", "path": "Engine", "fmt": {"len": 8, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 1 Voltage"}]}, +{ "hdr": "7E8", "cmd": {"01": "1D"}, "freq": 1, "signals": [{"id": "LANDROVER_DIST_MIL_ON", "path": "Stats", "fmt": {"len": 16, "unit": "kilometers", "max": 65535, "min": 0}, "name": "Distance with MIL On"}]}, +{ "hdr": "7E8", "cmd": {"01": "21"}, "freq": 1, "signals": [{"id": "LANDROVER_DIST_SINCE_CODES_CLEARED", "path": "Stats", "fmt": {"len": 16, "unit": "kilometers", "max": 65535, "min": 0}, "name": "Distance Since Codes Cleared", "suggestedMetric": "distanceSinceDTCsCleared"}]}, +{ "hdr": "7E8", "cmd": {"01": "2F"}, "freq": 1, "signals": [{"id": "LANDROVER_FUEL_LEVEL", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Input", "suggestedMetric": "fuelTankLevel"}]}, +{ "hdr": "7E8", "cmd": {"01": "33"}, "freq": 1, "signals": [{"id": "LANDROVER_BARO_PRESSURE", "path": "Engine", "fmt": {"len": 8, "unit": "kilopascal", "max": 255, "min": 0}, "name": "Barometric Pressure"}]}, +{ "hdr": "7E8", "cmd": {"01": "46"}, "freq": 30, "signals": [{"id": "LANDROVER_AMBIENT_AIR_TEMP", "path": "Climate", "fmt": {"len": 8, "max": 87.5, "min": -40, "div": 2, "add": -40, "unit": "celsius"}, "name": "Ambient Air Temperature"}]}, +{ "hdr": "7E8", "cmd": {"01": "4D"}, "freq": 1, "signals": [{"id": "LANDROVER_COMMANDED_THROTTLE_ACTUATOR", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Commanded Throttle Actuator"}]}, +{ "hdr": "7E8", "cmd": {"01": "5C"}, "freq": 1, "signals": [{"id": "LANDROVER_ENGINE_OIL_TEMP_STD", "path": "Engine", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Engine Oil Temperature (Std)"}]}, +{ "hdr": "7E0", "cmd": {"22": "D900"}, "freq": 5, "signals": [{"id": "LANDROVER_FRONT_LEFT_TIRE_PRESSURE", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Front Left Tire Pressure", "suggestedMetric": "frontLeftTirePressure"}]}, +{ "hdr": "7E0", "cmd": {"22": "D901"}, "freq": 5, "signals": [{"id": "LANDROVER_FRONT_RIGHT_TIRE_PRESSURE", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Front Right Tire Pressure", "suggestedMetric": "frontRightTirePressure"}]}, +{ "hdr": "7E0", "cmd": {"22": "D902"}, "freq": 5, "signals": [{"id": "LANDROVER_REAR_LEFT_TIRE_PRESSURE", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Rear Left Tire Pressure", "suggestedMetric": "rearLeftTirePressure"}]}, +{ "hdr": "7E0", "cmd": {"22": "D903"}, "freq": 5, "signals": [{"id": "LANDROVER_REAR_RIGHT_TIRE_PRESSURE", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Rear Right Tire Pressure", "suggestedMetric": "rearRightTirePressure"}]}, +{ "hdr": "7E0", "cmd": {"22": "D904"}, "freq": 5, "signals": [{"id": "LANDROVER_SPARE_TIRE_PRESSURE", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Spare Tire Pressure"}]}, +{ "hdr": "7E0", "cmd": {"22": "D910"}, "freq": 5, "signals": [{"id": "LANDROVER_FRONT_LEFT_TIRE_TEMP", "path": "Tires", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Front Left Tire Temperature"}]}, +{ "hdr": "7E0", "cmd": {"22": "D911"}, "freq": 5, "signals": [{"id": "LANDROVER_FRONT_RIGHT_TIRE_TEMP", "path": "Tires", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Front Right Tire Temperature"}]}, +{ "hdr": "7E0", "cmd": {"22": "D912"}, "freq": 5, "signals": [{"id": "LANDROVER_REAR_LEFT_TIRE_TEMP", "path": "Tires", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Rear Left Tire Temperature"}]}, +{ "hdr": "7E0", "cmd": {"22": "D913"}, "freq": 5, "signals": [{"id": "LANDROVER_REAR_RIGHT_TIRE_TEMP", "path": "Tires", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Rear Right Tire Temperature"}]}, +{ "hdr": "7E8", "cmd": {"01": "31"}, "freq": 1, "signals": [{"id": "LANDROVER_DISTANCE_TRAVELED", "path": "Stats", "fmt": {"len": 16, "unit": "kilometers", "max": 6553500, "min": 0, "mul": 100}, "name": "Distance Traveled", "suggestedMetric": "odometer"}]}, +{ "hdr": "7E8", "cmd": {"01": "A6"}, "freq": 1, "signals": [{"id": "LANDROVER_ODOMETER", "path": "Stats", "fmt": {"len": 24, "unit": "kilometers", "max": 1677721500, "min": 0, "mul": 100}, "name": "Odometer", "suggestedMetric": "odometer"}]}, +{ "hdr": "7E8", "cmd": {"01": "A7"}, "freq": 1, "signals": [{"id": "LANDROVER_ODOMETER_MILES", "path": "Stats", "fmt": {"len": 24, "unit": "miles", "max": 1677721500, "min": 0, "mul": 100}, "name": "Odometer (Miles)", "suggestedMetric": "odometer"}]}, +{ "hdr": "7E8", "cmd": {"01": "42"}, "freq": 1, "signals": [{"id": "LANDROVER_CONTROL_MODULE_VOLTAGE", "path": "Engine", "fmt": {"len": 16, "div": 1000, "unit": "volts", "max": 65.535, "min": 0}, "name": "Control Module Voltage"}]}, +{ "hdr": "7E8", "cmd": {"01": "43"}, "freq": 1, "signals": [{"id": "LANDROVER_ABS_LOAD_VALUE", "path": "Engine", "fmt": {"len": 16, "div": 255, "unit": "percent", "max": 25700, "min": 0}, "name": "Absolute Load Value"}]}, +{ "hdr": "7E8", "cmd": {"01": "44"}, "freq": 1, "signals": [{"id": "LANDROVER_COMMANDED_EQUIV_RATIO", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "ratio", "max": 2, "min": 0}, "name": "Commanded Equivalence Ratio"}]}, +{ "hdr": "7E8", "cmd": {"01": "45"}, "freq": 1, "signals": [{"id": "LANDROVER_RELATIVE_THROTTLE_POS", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Relative Throttle Position"}]}, +{ "hdr": "7E8", "cmd": {"01": "47"}, "freq": 1, "signals": [{"id": "LANDROVER_ABS_THROTTLE_POS_B", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Absolute Throttle Position B"}]}, +{ "hdr": "7E8", "cmd": {"01": "48"}, "freq": 1, "signals": [{"id": "LANDROVER_ABS_THROTTLE_POS_C", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Absolute Throttle Position C"}]}, +{ "hdr": "7E8", "cmd": {"01": "49"}, "freq": 1, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_D", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position D"}]}, +{ "hdr": "7E8", "cmd": {"01": "4A"}, "freq": 1, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_E", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position E"}]}, +{ "hdr": "7E8", "cmd": {"01": "4B"}, "freq": 1, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_F", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position F"}]}, +{ "hdr": "7E8", "cmd": {"01": "4C"}, "freq": 1, "signals": [{"id": "LANDROVER_COMMANDED_THROTTLE_ACTUATOR_CTRL", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Commanded Throttle Actuator Control"}]}, +{ "hdr": "7E0", "cmd": {"22": "F40C"}, "freq": 10, "signals": [{"id": "LANDROVER_BATTERY_VOLTAGE", "path": "Engine", "fmt": {"len": 16, "div": 1000, "unit": "volts", "max": 25.5, "min": 0}, "name": "Battery Voltage"}]}, +{ "hdr": "7E0", "cmd": {"22": "F442"}, "freq": 10, "signals": [{"id": "LANDROVER_VEHICLE_SPEED_2", "path": "Movement", "fmt": {"len": 16, "div": 100, "unit": "kilometersPerHour", "max": 655.35, "min": 0}, "name": "Vehicle Speed (Enhanced)"}]}, +{ "hdr": "7E0", "cmd": {"22": "F1A3"}, "freq": 30, "signals": [{"id": "LANDROVER_INTAKE_AIR_TEMP_2", "path": "Engine", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Intake Air Temperature 2"}]}, +{ "hdr": "7E0", "cmd": {"22": "F18C"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure"}]}, +{ "hdr": "7E0", "cmd": {"22": "F1AB"}, "freq": 5, "signals": [{"id": "LANDROVER_TURBO_BOOST_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "kilopascal", "max": 655.35, "min": 0}, "name": "Turbo Boost Pressure"}]}, +{ "hdr": "7E0", "cmd": {"22": "F18D"}, "freq": 5, "signals": [{"id": "LANDROVER_INTAKE_MANIFOLD_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "kilopascal", "max": 655.35, "min": 0}, "name": "Intake Manifold Pressure"}]} ] } From a03124da9f6a2b7f4fd31668d3043dfa6eaf4396 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Fri, 25 Jul 2025 23:36:22 -0500 Subject: [PATCH 08/84] try new fuel level reading --- signalsets/v3/default.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index fb95d97..c7af1d8 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -2,7 +2,7 @@ { "hdr": "7E8", "cmd": {"01": "0D"}, "freq": 1, "signals": [{"id": "LANDROVER_VSS", "path": "Movement", "fmt": {"len": 8, "max": 255, "unit": "kilometersPerHour", "min": 0}, "name": "Vehicle Speed", "suggestedMetric": "speed"}]}, { "hdr": "7E8", "cmd": {"01": "0C"}, "freq": 1, "signals": [{"id": "LANDROVER_ENGINE_RPM", "path": "Engine", "fmt": {"len": 16, "div": 4, "max": 16383, "unit": "rpm", "min": 0}, "name": "Engine RPM"}]}, { "hdr": "7E8", "cmd": {"01": "05"}, "freq": 1, "signals": [{"id": "LANDROVER_COOLANT_TEMP", "path": "Engine", "fmt": {"len": 8, "add": -40, "max": 215, "unit": "celsius", "min": 0}, "name": "Coolant Temperature"}]}, -{ "hdr": "732", "cmd": {"22": "D928"}, "freq": 1, "signals": [{"id": "LANDROVER_PARKED", "path": "Movement", "fmt": {"bix": 7, "len": 1, "max": 1, "unit": "noyes", "min": 0}, "name": "Parked?"}]}, +{ "hdr": "732", "cmd": {"22": "D928"}, "freq": 1, "signals": [{"id": "LANDROVER_PARKED", "path": "Movement", "fmt": {"bix": 7, "len": 1, "max": 1, "unit": "yesno", "min": 0}, "name": "Parked?"}]}, { "hdr": "7E8", "cmd": {"01": "04"}, "freq": 1, "signals": [{"id": "LANDROVER_ENGINE_LOAD", "path": "Engine", "fmt": {"len": 8, "max": 100, "unit": "percent", "min": 0}, "name": "Engine Load"}]}, { "hdr": "7E8", "cmd": {"01": "0F"}, "freq": 1, "signals": [{"id": "LANDROVER_IAT", "path": "Engine", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 255, "min": 0}, "name": "Intake Air Temperature"}]}, { "hdr": "7E8", "cmd": {"01": "10"}, "freq": 1, "signals": [{"id": "LANDROVER_MAF", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "gramsPerSecond", "max": 255, "min": 0}, "name": "Mass Air Flow"}]}, @@ -19,7 +19,7 @@ { "hdr": "7E8", "cmd": {"01": "13"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_1_VOLT", "path": "Engine", "fmt": {"len": 8, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 1 Voltage"}]}, { "hdr": "7E8", "cmd": {"01": "1D"}, "freq": 1, "signals": [{"id": "LANDROVER_DIST_MIL_ON", "path": "Stats", "fmt": {"len": 16, "unit": "kilometers", "max": 65535, "min": 0}, "name": "Distance with MIL On"}]}, { "hdr": "7E8", "cmd": {"01": "21"}, "freq": 1, "signals": [{"id": "LANDROVER_DIST_SINCE_CODES_CLEARED", "path": "Stats", "fmt": {"len": 16, "unit": "kilometers", "max": 65535, "min": 0}, "name": "Distance Since Codes Cleared", "suggestedMetric": "distanceSinceDTCsCleared"}]}, -{ "hdr": "7E8", "cmd": {"01": "2F"}, "freq": 1, "signals": [{"id": "LANDROVER_FUEL_LEVEL", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Input", "suggestedMetric": "fuelTankLevel"}]}, +{ "hdr": "7E0", "cmd": {"22": "F187"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level", "suggestedMetric": "fuelTankLevel"}]}, { "hdr": "7E8", "cmd": {"01": "33"}, "freq": 1, "signals": [{"id": "LANDROVER_BARO_PRESSURE", "path": "Engine", "fmt": {"len": 8, "unit": "kilopascal", "max": 255, "min": 0}, "name": "Barometric Pressure"}]}, { "hdr": "7E8", "cmd": {"01": "46"}, "freq": 30, "signals": [{"id": "LANDROVER_AMBIENT_AIR_TEMP", "path": "Climate", "fmt": {"len": 8, "max": 87.5, "min": -40, "div": 2, "add": -40, "unit": "celsius"}, "name": "Ambient Air Temperature"}]}, { "hdr": "7E8", "cmd": {"01": "4D"}, "freq": 1, "signals": [{"id": "LANDROVER_COMMANDED_THROTTLE_ACTUATOR", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Commanded Throttle Actuator"}]}, From 06b827ecbe5dbf6e366cd6e0021da197fe7cbe0a Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sat, 26 Jul 2025 11:14:13 -0500 Subject: [PATCH 09/84] all the things! --- signalsets/v3/default.json | 90 +++++++++++++++++++++++++++++++++++++- 1 file changed, 88 insertions(+), 2 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index c7af1d8..5b00fce 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -19,7 +19,22 @@ { "hdr": "7E8", "cmd": {"01": "13"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_1_VOLT", "path": "Engine", "fmt": {"len": 8, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 1 Voltage"}]}, { "hdr": "7E8", "cmd": {"01": "1D"}, "freq": 1, "signals": [{"id": "LANDROVER_DIST_MIL_ON", "path": "Stats", "fmt": {"len": 16, "unit": "kilometers", "max": 65535, "min": 0}, "name": "Distance with MIL On"}]}, { "hdr": "7E8", "cmd": {"01": "21"}, "freq": 1, "signals": [{"id": "LANDROVER_DIST_SINCE_CODES_CLEARED", "path": "Stats", "fmt": {"len": 16, "unit": "kilometers", "max": 65535, "min": 0}, "name": "Distance Since Codes Cleared", "suggestedMetric": "distanceSinceDTCsCleared"}]}, -{ "hdr": "7E0", "cmd": {"22": "F187"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level", "suggestedMetric": "fuelTankLevel"}]}, +{ "hdr": "7E0", "cmd": {"22": "F150"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level", "suggestedMetric": "fuelTankLevel"}]}, +{ "hdr": "7E0", "cmd": {"22": "F151"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt"}]}, +{ "hdr": "7E0", "cmd": {"22": "F152"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT2", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt2"}]}, +{ "hdr": "7E0", "cmd": {"22": "F153"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT3", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt3"}]}, +{ "hdr": "7E0", "cmd": {"22": "F154"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT4", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt4"}]}, +{ "hdr": "7E0", "cmd": {"22": "F155"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT5", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt5"}]}, +{ "hdr": "7E0", "cmd": {"22": "F156"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT6", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt6"}]}, +{ "hdr": "7E0", "cmd": {"22": "F157"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT7", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt7"}]}, +{ "hdr": "7E0", "cmd": {"22": "F158"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT8", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt8"}]}, +{ "hdr": "7E0", "cmd": {"22": "F159"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT9", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt9"}]}, +{ "hdr": "7E0", "cmd": {"22": "F15A"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT10", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt10"}]}, +{ "hdr": "7E0", "cmd": {"22": "F15B"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT11", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt11"}]}, +{ "hdr": "7E0", "cmd": {"22": "F15C"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT12", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt12"}]}, +{ "hdr": "7E0", "cmd": {"22": "F15D"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT13", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt13"}]}, +{ "hdr": "7E0", "cmd": {"22": "F15E"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT14", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt14"}]}, +{ "hdr": "7E0", "cmd": {"22": "F15F"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT15", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt15"}]}, { "hdr": "7E8", "cmd": {"01": "33"}, "freq": 1, "signals": [{"id": "LANDROVER_BARO_PRESSURE", "path": "Engine", "fmt": {"len": 8, "unit": "kilopascal", "max": 255, "min": 0}, "name": "Barometric Pressure"}]}, { "hdr": "7E8", "cmd": {"01": "46"}, "freq": 30, "signals": [{"id": "LANDROVER_AMBIENT_AIR_TEMP", "path": "Climate", "fmt": {"len": 8, "max": 87.5, "min": -40, "div": 2, "add": -40, "unit": "celsius"}, "name": "Ambient Air Temperature"}]}, { "hdr": "7E8", "cmd": {"01": "4D"}, "freq": 1, "signals": [{"id": "LANDROVER_COMMANDED_THROTTLE_ACTUATOR", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Commanded Throttle Actuator"}]}, @@ -33,6 +48,14 @@ { "hdr": "7E0", "cmd": {"22": "D911"}, "freq": 5, "signals": [{"id": "LANDROVER_FRONT_RIGHT_TIRE_TEMP", "path": "Tires", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Front Right Tire Temperature"}]}, { "hdr": "7E0", "cmd": {"22": "D912"}, "freq": 5, "signals": [{"id": "LANDROVER_REAR_LEFT_TIRE_TEMP", "path": "Tires", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Rear Left Tire Temperature"}]}, { "hdr": "7E0", "cmd": {"22": "D913"}, "freq": 5, "signals": [{"id": "LANDROVER_REAR_RIGHT_TIRE_TEMP", "path": "Tires", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Rear Right Tire Temperature"}]}, +{ "hdr": "7E0", "cmd": {"22": "D920"}, "freq": 5, "signals": [{"id": "LANDROVER_FRONT_LEFT_TIRE_PRESSURE_ALT", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Front Left Tire Pressure Alt"}]}, +{ "hdr": "7E0", "cmd": {"22": "D921"}, "freq": 5, "signals": [{"id": "LANDROVER_FRONT_RIGHT_TIRE_PRESSURE_ALT", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Front Right Tire Pressure Alt"}]}, +{ "hdr": "7E0", "cmd": {"22": "D922"}, "freq": 5, "signals": [{"id": "LANDROVER_REAR_LEFT_TIRE_PRESSURE_ALT", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Rear Left Tire Pressure Alt"}]}, +{ "hdr": "7E0", "cmd": {"22": "D923"}, "freq": 5, "signals": [{"id": "LANDROVER_REAR_RIGHT_TIRE_PRESSURE_ALT", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Rear Right Tire Pressure Alt"}]}, +{ "hdr": "7E0", "cmd": {"22": "D930"}, "freq": 5, "signals": [{"id": "LANDROVER_FRONT_LEFT_TIRE_PRESSURE_ALT2", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Front Left Tire Pressure Alt2"}]}, +{ "hdr": "7E0", "cmd": {"22": "D931"}, "freq": 5, "signals": [{"id": "LANDROVER_FRONT_RIGHT_TIRE_PRESSURE_ALT2", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Front Right Tire Pressure Alt2"}]}, +{ "hdr": "7E0", "cmd": {"22": "D932"}, "freq": 5, "signals": [{"id": "LANDROVER_REAR_LEFT_TIRE_PRESSURE_ALT2", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Rear Left Tire Pressure Alt2"}]}, +{ "hdr": "7E0", "cmd": {"22": "D933"}, "freq": 5, "signals": [{"id": "LANDROVER_REAR_RIGHT_TIRE_PRESSURE_ALT2", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Rear Right Tire Pressure Alt2"}]}, { "hdr": "7E8", "cmd": {"01": "31"}, "freq": 1, "signals": [{"id": "LANDROVER_DISTANCE_TRAVELED", "path": "Stats", "fmt": {"len": 16, "unit": "kilometers", "max": 6553500, "min": 0, "mul": 100}, "name": "Distance Traveled", "suggestedMetric": "odometer"}]}, { "hdr": "7E8", "cmd": {"01": "A6"}, "freq": 1, "signals": [{"id": "LANDROVER_ODOMETER", "path": "Stats", "fmt": {"len": 24, "unit": "kilometers", "max": 1677721500, "min": 0, "mul": 100}, "name": "Odometer", "suggestedMetric": "odometer"}]}, { "hdr": "7E8", "cmd": {"01": "A7"}, "freq": 1, "signals": [{"id": "LANDROVER_ODOMETER_MILES", "path": "Stats", "fmt": {"len": 24, "unit": "miles", "max": 1677721500, "min": 0, "mul": 100}, "name": "Odometer (Miles)", "suggestedMetric": "odometer"}]}, @@ -45,12 +68,75 @@ { "hdr": "7E8", "cmd": {"01": "49"}, "freq": 1, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_D", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position D"}]}, { "hdr": "7E8", "cmd": {"01": "4A"}, "freq": 1, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_E", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position E"}]}, { "hdr": "7E8", "cmd": {"01": "4B"}, "freq": 1, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_F", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position F"}]}, +{ "hdr": "7E0", "cmd": {"22": "F200"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt"}]}, +{ "hdr": "7E0", "cmd": {"22": "F201"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT2", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt2"}]}, +{ "hdr": "7E0", "cmd": {"22": "F202"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT3", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt3"}]}, +{ "hdr": "7E0", "cmd": {"22": "F203"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT4", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt4"}]}, +{ "hdr": "7E0", "cmd": {"22": "F204"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT5", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt5"}]}, +{ "hdr": "7E0", "cmd": {"22": "F205"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT6", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt6"}]}, +{ "hdr": "7E0", "cmd": {"22": "F206"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT7", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt7"}]}, +{ "hdr": "7E0", "cmd": {"22": "F207"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT8", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt8"}]}, +{ "hdr": "7E0", "cmd": {"22": "F208"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT9", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt9"}]}, +{ "hdr": "7E0", "cmd": {"22": "F209"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT10", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt10"}]}, +{ "hdr": "7E0", "cmd": {"22": "F20A"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT11", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt11"}]}, +{ "hdr": "7E0", "cmd": {"22": "F20B"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT12", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt12"}]}, +{ "hdr": "7E0", "cmd": {"22": "F20C"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT13", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt13"}]}, +{ "hdr": "7E0", "cmd": {"22": "F20D"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT14", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt14"}]}, +{ "hdr": "7E0", "cmd": {"22": "F20E"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT15", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt15"}]}, +{ "hdr": "7E0", "cmd": {"22": "F20F"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT16", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt16"}]}, { "hdr": "7E8", "cmd": {"01": "4C"}, "freq": 1, "signals": [{"id": "LANDROVER_COMMANDED_THROTTLE_ACTUATOR_CTRL", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Commanded Throttle Actuator Control"}]}, { "hdr": "7E0", "cmd": {"22": "F40C"}, "freq": 10, "signals": [{"id": "LANDROVER_BATTERY_VOLTAGE", "path": "Engine", "fmt": {"len": 16, "div": 1000, "unit": "volts", "max": 25.5, "min": 0}, "name": "Battery Voltage"}]}, { "hdr": "7E0", "cmd": {"22": "F442"}, "freq": 10, "signals": [{"id": "LANDROVER_VEHICLE_SPEED_2", "path": "Movement", "fmt": {"len": 16, "div": 100, "unit": "kilometersPerHour", "max": 655.35, "min": 0}, "name": "Vehicle Speed (Enhanced)"}]}, { "hdr": "7E0", "cmd": {"22": "F1A3"}, "freq": 30, "signals": [{"id": "LANDROVER_INTAKE_AIR_TEMP_2", "path": "Engine", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Intake Air Temperature 2"}]}, { "hdr": "7E0", "cmd": {"22": "F18C"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure"}]}, +{ "hdr": "7E0", "cmd": {"22": "F18D"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt"}]}, +{ "hdr": "7E0", "cmd": {"22": "F18E"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT2", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt2"}]}, +{ "hdr": "7E0", "cmd": {"22": "F18F"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT3", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt3"}]}, +{ "hdr": "7E0", "cmd": {"22": "F190"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT4", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt4"}]}, +{ "hdr": "7E0", "cmd": {"22": "F191"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT5", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt5"}]}, +{ "hdr": "7E0", "cmd": {"22": "F192"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT6", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt6"}]}, +{ "hdr": "7E0", "cmd": {"22": "F193"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT7", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt7"}]}, +{ "hdr": "7E0", "cmd": {"22": "F194"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT8", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt8"}]}, +{ "hdr": "7E0", "cmd": {"22": "F195"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT9", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt9"}]}, +{ "hdr": "7E0", "cmd": {"22": "F196"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT10", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt10"}]}, +{ "hdr": "7E0", "cmd": {"22": "F197"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT11", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt11"}]}, +{ "hdr": "7E0", "cmd": {"22": "F198"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT12", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt12"}]}, +{ "hdr": "7E0", "cmd": {"22": "F199"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT13", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt13"}]}, +{ "hdr": "7E0", "cmd": {"22": "F19A"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT14", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt14"}]}, +{ "hdr": "7E0", "cmd": {"22": "F19B"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT15", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt15"}]}, { "hdr": "7E0", "cmd": {"22": "F1AB"}, "freq": 5, "signals": [{"id": "LANDROVER_TURBO_BOOST_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "kilopascal", "max": 655.35, "min": 0}, "name": "Turbo Boost Pressure"}]}, -{ "hdr": "7E0", "cmd": {"22": "F18D"}, "freq": 5, "signals": [{"id": "LANDROVER_INTAKE_MANIFOLD_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "kilopascal", "max": 655.35, "min": 0}, "name": "Intake Manifold Pressure"}]} +{ "hdr": "7E0", "cmd": {"22": "F18D"}, "freq": 5, "signals": [{"id": "LANDROVER_INTAKE_MANIFOLD_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "kilopascal", "max": 655.35, "min": 0}, "name": "Intake Manifold Pressure"}]}, +{ "hdr": "7E0", "cmd": {"22": "F210"}, "freq": 5, "signals": [{"id": "LANDROVER_TRANSMISSION_TEMP", "path": "Transmission", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Transmission Temperature"}]}, +{ "hdr": "7E0", "cmd": {"22": "F211"}, "freq": 5, "signals": [{"id": "LANDROVER_TRANSFER_CASE_TEMP", "path": "Transmission", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Transfer Case Temperature"}]}, +{ "hdr": "7E0", "cmd": {"22": "F212"}, "freq": 5, "signals": [{"id": "LANDROVER_DIFF_TEMP", "path": "Transmission", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Differential Temperature"}]}, +{ "hdr": "7E0", "cmd": {"22": "F213"}, "freq": 5, "signals": [{"id": "LANDROVER_GEAR_POSITION", "path": "Transmission", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Gear Position"}]}, +{ "hdr": "7E0", "cmd": {"22": "F214"}, "freq": 5, "signals": [{"id": "LANDROVER_DRIVE_MODE", "path": "Transmission", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Drive Mode"}]}, +{ "hdr": "7E0", "cmd": {"22": "F215"}, "freq": 5, "signals": [{"id": "LANDROVER_TERRAIN_RESPONSE", "path": "Transmission", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Terrain Response Mode"}]}, +{ "hdr": "7E0", "cmd": {"22": "F216"}, "freq": 5, "signals": [{"id": "LANDROVER_AIR_SUSPENSION_HEIGHT", "path": "Suspension", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Air Suspension Height"}]}, +{ "hdr": "7E0", "cmd": {"22": "F217"}, "freq": 5, "signals": [{"id": "LANDROVER_AIR_SUSPENSION_PRESSURE", "path": "Suspension", "fmt": {"len": 16, "div": 100, "unit": "bar", "max": 655.35, "min": 0}, "name": "Air Suspension Pressure"}]}, +{ "hdr": "7E0", "cmd": {"22": "F218"}, "freq": 5, "signals": [{"id": "LANDROVER_STEERING_ANGLE", "path": "Steering", "fmt": {"len": 16, "div": 10, "unit": "degrees", "max": 3276.7, "min": -3276.8}, "name": "Steering Angle"}]}, +{ "hdr": "7E0", "cmd": {"22": "F219"}, "freq": 5, "signals": [{"id": "LANDROVER_BRAKE_PRESSURE", "path": "Brakes", "fmt": {"len": 16, "div": 100, "unit": "bar", "max": 655.35, "min": 0}, "name": "Brake Pressure"}]}, +{ "hdr": "7E0", "cmd": {"22": "F21A"}, "freq": 5, "signals": [{"id": "LANDROVER_BRAKE_TEMP", "path": "Brakes", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Brake Temperature"}]}, +{ "hdr": "7E0", "cmd": {"22": "F21B"}, "freq": 5, "signals": [{"id": "LANDROVER_ABS_STATUS", "path": "Brakes", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "ABS Status"}]}, +{ "hdr": "7E0", "cmd": {"22": "F21C"}, "freq": 5, "signals": [{"id": "LANDROVER_TRACTION_CONTROL", "path": "Brakes", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Traction Control Status"}]}, +{ "hdr": "7E0", "cmd": {"22": "F21D"}, "freq": 5, "signals": [{"id": "LANDROVER_STABILITY_CONTROL", "path": "Brakes", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Stability Control Status"}]}, +{ "hdr": "7E0", "cmd": {"22": "F21E"}, "freq": 5, "signals": [{"id": "LANDROVER_HILL_DESCENT", "path": "Brakes", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Hill Descent Control"}]}, +{ "hdr": "7E0", "cmd": {"22": "F21F"}, "freq": 5, "signals": [{"id": "LANDROVER_PARKING_SENSORS", "path": "Safety", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Parking Sensor Status"}]}, +{ "hdr": "7E0", "cmd": {"22": "F220"}, "freq": 5, "signals": [{"id": "LANDROVER_BLIND_SPOT_MONITOR", "path": "Safety", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Blind Spot Monitor"}]}, +{ "hdr": "7E0", "cmd": {"22": "F221"}, "freq": 5, "signals": [{"id": "LANDROVER_LANE_DEPARTURE", "path": "Safety", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Lane Departure Warning"}]}, +{ "hdr": "7E0", "cmd": {"22": "F222"}, "freq": 5, "signals": [{"id": "LANDROVER_ADAPTIVE_CRUISE", "path": "Safety", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Adaptive Cruise Control"}]}, +{ "hdr": "7E0", "cmd": {"22": "F223"}, "freq": 5, "signals": [{"id": "LANDROVER_HEADLIGHT_LEVEL", "path": "Lighting", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Headlight Level"}]}, +{ "hdr": "7E0", "cmd": {"22": "F224"}, "freq": 5, "signals": [{"id": "LANDROVER_WIPER_STATUS", "path": "Lighting", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Wiper Status"}]}, +{ "hdr": "7E0", "cmd": {"22": "F225"}, "freq": 5, "signals": [{"id": "LANDROVER_CLIMATE_TEMP", "path": "Climate", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Climate Control Temperature"}]}, +{ "hdr": "7E0", "cmd": {"22": "F226"}, "freq": 5, "signals": [{"id": "LANDROVER_CLIMATE_FAN", "path": "Climate", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Climate Control Fan Speed"}]}, +{ "hdr": "7E0", "cmd": {"22": "F227"}, "freq": 5, "signals": [{"id": "LANDROVER_CLIMATE_MODE", "path": "Climate", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Climate Control Mode"}]}, +{ "hdr": "7E0", "cmd": {"22": "F228"}, "freq": 5, "signals": [{"id": "LANDROVER_SEAT_HEATER", "path": "Climate", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Seat Heater Status"}]}, +{ "hdr": "7E0", "cmd": {"22": "F229"}, "freq": 5, "signals": [{"id": "LANDROVER_STEERING_WHEEL_HEATER", "path": "Climate", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Steering Wheel Heater"}]}, +{ "hdr": "7E0", "cmd": {"22": "F22A"}, "freq": 5, "signals": [{"id": "LANDROVER_DOOR_STATUS", "path": "Body", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Door Status"}]}, +{ "hdr": "7E0", "cmd": {"22": "F22B"}, "freq": 5, "signals": [{"id": "LANDROVER_WINDOW_STATUS", "path": "Body", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Window Status"}]}, +{ "hdr": "7E0", "cmd": {"22": "F22C"}, "freq": 5, "signals": [{"id": "LANDROVER_SUNROOF_STATUS", "path": "Body", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Sunroof Status"}]}, +{ "hdr": "7E0", "cmd": {"22": "F22D"}, "freq": 5, "signals": [{"id": "LANDROVER_MIRROR_STATUS", "path": "Body", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Mirror Status"}]}, +{ "hdr": "7E0", "cmd": {"22": "F22E"}, "freq": 5, "signals": [{"id": "LANDROVER_TAILGATE_STATUS", "path": "Body", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Tailgate Status"}]}, +{ "hdr": "7E0", "cmd": {"22": "F22F"}, "freq": 5, "signals": [{"id": "LANDROVER_HOOD_STATUS", "path": "Body", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Hood Status"}]} ] } From 1fa00c21ee92f1f3f248f833428ad70256bc7cde Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sat, 26 Jul 2025 11:38:46 -0500 Subject: [PATCH 10/84] remove non-working, stealing from jag --- signalsets/v3/default.json | 188 ++++++++++++++++++------------------- 1 file changed, 93 insertions(+), 95 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 5b00fce..e20fab9 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -20,43 +20,13 @@ { "hdr": "7E8", "cmd": {"01": "1D"}, "freq": 1, "signals": [{"id": "LANDROVER_DIST_MIL_ON", "path": "Stats", "fmt": {"len": 16, "unit": "kilometers", "max": 65535, "min": 0}, "name": "Distance with MIL On"}]}, { "hdr": "7E8", "cmd": {"01": "21"}, "freq": 1, "signals": [{"id": "LANDROVER_DIST_SINCE_CODES_CLEARED", "path": "Stats", "fmt": {"len": 16, "unit": "kilometers", "max": 65535, "min": 0}, "name": "Distance Since Codes Cleared", "suggestedMetric": "distanceSinceDTCsCleared"}]}, { "hdr": "7E0", "cmd": {"22": "F150"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level", "suggestedMetric": "fuelTankLevel"}]}, -{ "hdr": "7E0", "cmd": {"22": "F151"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt"}]}, -{ "hdr": "7E0", "cmd": {"22": "F152"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT2", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt2"}]}, -{ "hdr": "7E0", "cmd": {"22": "F153"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT3", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt3"}]}, -{ "hdr": "7E0", "cmd": {"22": "F154"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT4", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt4"}]}, -{ "hdr": "7E0", "cmd": {"22": "F155"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT5", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt5"}]}, -{ "hdr": "7E0", "cmd": {"22": "F156"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT6", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt6"}]}, -{ "hdr": "7E0", "cmd": {"22": "F157"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT7", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt7"}]}, -{ "hdr": "7E0", "cmd": {"22": "F158"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT8", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt8"}]}, -{ "hdr": "7E0", "cmd": {"22": "F159"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT9", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt9"}]}, -{ "hdr": "7E0", "cmd": {"22": "F15A"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT10", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt10"}]}, -{ "hdr": "7E0", "cmd": {"22": "F15B"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT11", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt11"}]}, -{ "hdr": "7E0", "cmd": {"22": "F15C"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT12", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt12"}]}, -{ "hdr": "7E0", "cmd": {"22": "F15D"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT13", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt13"}]}, -{ "hdr": "7E0", "cmd": {"22": "F15E"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT14", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt14"}]}, -{ "hdr": "7E0", "cmd": {"22": "F15F"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL_ALT15", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Alt15"}]}, + { "hdr": "7E8", "cmd": {"01": "33"}, "freq": 1, "signals": [{"id": "LANDROVER_BARO_PRESSURE", "path": "Engine", "fmt": {"len": 8, "unit": "kilopascal", "max": 255, "min": 0}, "name": "Barometric Pressure"}]}, { "hdr": "7E8", "cmd": {"01": "46"}, "freq": 30, "signals": [{"id": "LANDROVER_AMBIENT_AIR_TEMP", "path": "Climate", "fmt": {"len": 8, "max": 87.5, "min": -40, "div": 2, "add": -40, "unit": "celsius"}, "name": "Ambient Air Temperature"}]}, { "hdr": "7E8", "cmd": {"01": "4D"}, "freq": 1, "signals": [{"id": "LANDROVER_COMMANDED_THROTTLE_ACTUATOR", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Commanded Throttle Actuator"}]}, { "hdr": "7E8", "cmd": {"01": "5C"}, "freq": 1, "signals": [{"id": "LANDROVER_ENGINE_OIL_TEMP_STD", "path": "Engine", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Engine Oil Temperature (Std)"}]}, -{ "hdr": "7E0", "cmd": {"22": "D900"}, "freq": 5, "signals": [{"id": "LANDROVER_FRONT_LEFT_TIRE_PRESSURE", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Front Left Tire Pressure", "suggestedMetric": "frontLeftTirePressure"}]}, -{ "hdr": "7E0", "cmd": {"22": "D901"}, "freq": 5, "signals": [{"id": "LANDROVER_FRONT_RIGHT_TIRE_PRESSURE", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Front Right Tire Pressure", "suggestedMetric": "frontRightTirePressure"}]}, -{ "hdr": "7E0", "cmd": {"22": "D902"}, "freq": 5, "signals": [{"id": "LANDROVER_REAR_LEFT_TIRE_PRESSURE", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Rear Left Tire Pressure", "suggestedMetric": "rearLeftTirePressure"}]}, -{ "hdr": "7E0", "cmd": {"22": "D903"}, "freq": 5, "signals": [{"id": "LANDROVER_REAR_RIGHT_TIRE_PRESSURE", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Rear Right Tire Pressure", "suggestedMetric": "rearRightTirePressure"}]}, -{ "hdr": "7E0", "cmd": {"22": "D904"}, "freq": 5, "signals": [{"id": "LANDROVER_SPARE_TIRE_PRESSURE", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Spare Tire Pressure"}]}, -{ "hdr": "7E0", "cmd": {"22": "D910"}, "freq": 5, "signals": [{"id": "LANDROVER_FRONT_LEFT_TIRE_TEMP", "path": "Tires", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Front Left Tire Temperature"}]}, -{ "hdr": "7E0", "cmd": {"22": "D911"}, "freq": 5, "signals": [{"id": "LANDROVER_FRONT_RIGHT_TIRE_TEMP", "path": "Tires", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Front Right Tire Temperature"}]}, -{ "hdr": "7E0", "cmd": {"22": "D912"}, "freq": 5, "signals": [{"id": "LANDROVER_REAR_LEFT_TIRE_TEMP", "path": "Tires", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Rear Left Tire Temperature"}]}, -{ "hdr": "7E0", "cmd": {"22": "D913"}, "freq": 5, "signals": [{"id": "LANDROVER_REAR_RIGHT_TIRE_TEMP", "path": "Tires", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Rear Right Tire Temperature"}]}, -{ "hdr": "7E0", "cmd": {"22": "D920"}, "freq": 5, "signals": [{"id": "LANDROVER_FRONT_LEFT_TIRE_PRESSURE_ALT", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Front Left Tire Pressure Alt"}]}, -{ "hdr": "7E0", "cmd": {"22": "D921"}, "freq": 5, "signals": [{"id": "LANDROVER_FRONT_RIGHT_TIRE_PRESSURE_ALT", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Front Right Tire Pressure Alt"}]}, -{ "hdr": "7E0", "cmd": {"22": "D922"}, "freq": 5, "signals": [{"id": "LANDROVER_REAR_LEFT_TIRE_PRESSURE_ALT", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Rear Left Tire Pressure Alt"}]}, -{ "hdr": "7E0", "cmd": {"22": "D923"}, "freq": 5, "signals": [{"id": "LANDROVER_REAR_RIGHT_TIRE_PRESSURE_ALT", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Rear Right Tire Pressure Alt"}]}, -{ "hdr": "7E0", "cmd": {"22": "D930"}, "freq": 5, "signals": [{"id": "LANDROVER_FRONT_LEFT_TIRE_PRESSURE_ALT2", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Front Left Tire Pressure Alt2"}]}, -{ "hdr": "7E0", "cmd": {"22": "D931"}, "freq": 5, "signals": [{"id": "LANDROVER_FRONT_RIGHT_TIRE_PRESSURE_ALT2", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Front Right Tire Pressure Alt2"}]}, -{ "hdr": "7E0", "cmd": {"22": "D932"}, "freq": 5, "signals": [{"id": "LANDROVER_REAR_LEFT_TIRE_PRESSURE_ALT2", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Rear Left Tire Pressure Alt2"}]}, -{ "hdr": "7E0", "cmd": {"22": "D933"}, "freq": 5, "signals": [{"id": "LANDROVER_REAR_RIGHT_TIRE_PRESSURE_ALT2", "path": "Tires", "fmt": {"len": 8, "unit": "psi", "max": 255, "min": 0}, "name": "Rear Right Tire Pressure Alt2"}]}, -{ "hdr": "7E8", "cmd": {"01": "31"}, "freq": 1, "signals": [{"id": "LANDROVER_DISTANCE_TRAVELED", "path": "Stats", "fmt": {"len": 16, "unit": "kilometers", "max": 6553500, "min": 0, "mul": 100}, "name": "Distance Traveled", "suggestedMetric": "odometer"}]}, + +{ "hdr": "7E8", "cmd": {"01": "31"}, "freq": 1, "signals": [{"id": "LANDROVER_DISTANCE_TRAVELED", "path": "Stats", "fmt": {"len": 16, "unit": "kilometers", "max": 65535, "min": 0}, "name": "Distance Traveled", "suggestedMetric": "odometer"}]}, { "hdr": "7E8", "cmd": {"01": "A6"}, "freq": 1, "signals": [{"id": "LANDROVER_ODOMETER", "path": "Stats", "fmt": {"len": 24, "unit": "kilometers", "max": 1677721500, "min": 0, "mul": 100}, "name": "Odometer", "suggestedMetric": "odometer"}]}, { "hdr": "7E8", "cmd": {"01": "A7"}, "freq": 1, "signals": [{"id": "LANDROVER_ODOMETER_MILES", "path": "Stats", "fmt": {"len": 24, "unit": "miles", "max": 1677721500, "min": 0, "mul": 100}, "name": "Odometer (Miles)", "suggestedMetric": "odometer"}]}, { "hdr": "7E8", "cmd": {"01": "42"}, "freq": 1, "signals": [{"id": "LANDROVER_CONTROL_MODULE_VOLTAGE", "path": "Engine", "fmt": {"len": 16, "div": 1000, "unit": "volts", "max": 65.535, "min": 0}, "name": "Control Module Voltage"}]}, @@ -68,75 +38,103 @@ { "hdr": "7E8", "cmd": {"01": "49"}, "freq": 1, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_D", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position D"}]}, { "hdr": "7E8", "cmd": {"01": "4A"}, "freq": 1, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_E", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position E"}]}, { "hdr": "7E8", "cmd": {"01": "4B"}, "freq": 1, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_F", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position F"}]}, -{ "hdr": "7E0", "cmd": {"22": "F200"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt"}]}, -{ "hdr": "7E0", "cmd": {"22": "F201"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT2", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt2"}]}, -{ "hdr": "7E0", "cmd": {"22": "F202"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT3", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt3"}]}, -{ "hdr": "7E0", "cmd": {"22": "F203"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT4", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt4"}]}, -{ "hdr": "7E0", "cmd": {"22": "F204"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT5", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt5"}]}, -{ "hdr": "7E0", "cmd": {"22": "F205"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT6", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt6"}]}, -{ "hdr": "7E0", "cmd": {"22": "F206"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT7", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt7"}]}, -{ "hdr": "7E0", "cmd": {"22": "F207"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT8", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt8"}]}, -{ "hdr": "7E0", "cmd": {"22": "F208"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT9", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt9"}]}, -{ "hdr": "7E0", "cmd": {"22": "F209"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT10", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt10"}]}, -{ "hdr": "7E0", "cmd": {"22": "F20A"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT11", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt11"}]}, -{ "hdr": "7E0", "cmd": {"22": "F20B"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT12", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt12"}]}, -{ "hdr": "7E0", "cmd": {"22": "F20C"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT13", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt13"}]}, -{ "hdr": "7E0", "cmd": {"22": "F20D"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT14", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt14"}]}, -{ "hdr": "7E0", "cmd": {"22": "F20E"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT15", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt15"}]}, -{ "hdr": "7E0", "cmd": {"22": "F20F"}, "freq": 5, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_ALT16", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position Alt16"}]}, + { "hdr": "7E8", "cmd": {"01": "4C"}, "freq": 1, "signals": [{"id": "LANDROVER_COMMANDED_THROTTLE_ACTUATOR_CTRL", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Commanded Throttle Actuator Control"}]}, -{ "hdr": "7E0", "cmd": {"22": "F40C"}, "freq": 10, "signals": [{"id": "LANDROVER_BATTERY_VOLTAGE", "path": "Engine", "fmt": {"len": 16, "div": 1000, "unit": "volts", "max": 25.5, "min": 0}, "name": "Battery Voltage"}]}, +{ "hdr": "7E0", "cmd": {"22": "F40C"}, "freq": 10, "signals": [{"id": "LANDROVER_BATTERY_VOLTAGE", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "volts", "max": 25.5, "min": 0}, "name": "Battery Voltage"}]}, { "hdr": "7E0", "cmd": {"22": "F442"}, "freq": 10, "signals": [{"id": "LANDROVER_VEHICLE_SPEED_2", "path": "Movement", "fmt": {"len": 16, "div": 100, "unit": "kilometersPerHour", "max": 655.35, "min": 0}, "name": "Vehicle Speed (Enhanced)"}]}, { "hdr": "7E0", "cmd": {"22": "F1A3"}, "freq": 30, "signals": [{"id": "LANDROVER_INTAKE_AIR_TEMP_2", "path": "Engine", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Intake Air Temperature 2"}]}, { "hdr": "7E0", "cmd": {"22": "F18C"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure"}]}, -{ "hdr": "7E0", "cmd": {"22": "F18D"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt"}]}, -{ "hdr": "7E0", "cmd": {"22": "F18E"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT2", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt2"}]}, -{ "hdr": "7E0", "cmd": {"22": "F18F"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT3", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt3"}]}, { "hdr": "7E0", "cmd": {"22": "F190"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT4", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt4"}]}, -{ "hdr": "7E0", "cmd": {"22": "F191"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT5", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt5"}]}, -{ "hdr": "7E0", "cmd": {"22": "F192"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT6", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt6"}]}, -{ "hdr": "7E0", "cmd": {"22": "F193"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT7", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt7"}]}, -{ "hdr": "7E0", "cmd": {"22": "F194"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT8", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt8"}]}, -{ "hdr": "7E0", "cmd": {"22": "F195"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT9", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt9"}]}, { "hdr": "7E0", "cmd": {"22": "F196"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT10", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt10"}]}, -{ "hdr": "7E0", "cmd": {"22": "F197"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT11", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt11"}]}, -{ "hdr": "7E0", "cmd": {"22": "F198"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT12", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt12"}]}, -{ "hdr": "7E0", "cmd": {"22": "F199"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT13", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt13"}]}, -{ "hdr": "7E0", "cmd": {"22": "F19A"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT14", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt14"}]}, -{ "hdr": "7E0", "cmd": {"22": "F19B"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT15", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt15"}]}, { "hdr": "7E0", "cmd": {"22": "F1AB"}, "freq": 5, "signals": [{"id": "LANDROVER_TURBO_BOOST_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "kilopascal", "max": 655.35, "min": 0}, "name": "Turbo Boost Pressure"}]}, { "hdr": "7E0", "cmd": {"22": "F18D"}, "freq": 5, "signals": [{"id": "LANDROVER_INTAKE_MANIFOLD_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "kilopascal", "max": 655.35, "min": 0}, "name": "Intake Manifold Pressure"}]}, -{ "hdr": "7E0", "cmd": {"22": "F210"}, "freq": 5, "signals": [{"id": "LANDROVER_TRANSMISSION_TEMP", "path": "Transmission", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Transmission Temperature"}]}, -{ "hdr": "7E0", "cmd": {"22": "F211"}, "freq": 5, "signals": [{"id": "LANDROVER_TRANSFER_CASE_TEMP", "path": "Transmission", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Transfer Case Temperature"}]}, -{ "hdr": "7E0", "cmd": {"22": "F212"}, "freq": 5, "signals": [{"id": "LANDROVER_DIFF_TEMP", "path": "Transmission", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Differential Temperature"}]}, -{ "hdr": "7E0", "cmd": {"22": "F213"}, "freq": 5, "signals": [{"id": "LANDROVER_GEAR_POSITION", "path": "Transmission", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Gear Position"}]}, -{ "hdr": "7E0", "cmd": {"22": "F214"}, "freq": 5, "signals": [{"id": "LANDROVER_DRIVE_MODE", "path": "Transmission", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Drive Mode"}]}, -{ "hdr": "7E0", "cmd": {"22": "F215"}, "freq": 5, "signals": [{"id": "LANDROVER_TERRAIN_RESPONSE", "path": "Transmission", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Terrain Response Mode"}]}, -{ "hdr": "7E0", "cmd": {"22": "F216"}, "freq": 5, "signals": [{"id": "LANDROVER_AIR_SUSPENSION_HEIGHT", "path": "Suspension", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Air Suspension Height"}]}, -{ "hdr": "7E0", "cmd": {"22": "F217"}, "freq": 5, "signals": [{"id": "LANDROVER_AIR_SUSPENSION_PRESSURE", "path": "Suspension", "fmt": {"len": 16, "div": 100, "unit": "bar", "max": 655.35, "min": 0}, "name": "Air Suspension Pressure"}]}, -{ "hdr": "7E0", "cmd": {"22": "F218"}, "freq": 5, "signals": [{"id": "LANDROVER_STEERING_ANGLE", "path": "Steering", "fmt": {"len": 16, "div": 10, "unit": "degrees", "max": 3276.7, "min": -3276.8}, "name": "Steering Angle"}]}, -{ "hdr": "7E0", "cmd": {"22": "F219"}, "freq": 5, "signals": [{"id": "LANDROVER_BRAKE_PRESSURE", "path": "Brakes", "fmt": {"len": 16, "div": 100, "unit": "bar", "max": 655.35, "min": 0}, "name": "Brake Pressure"}]}, -{ "hdr": "7E0", "cmd": {"22": "F21A"}, "freq": 5, "signals": [{"id": "LANDROVER_BRAKE_TEMP", "path": "Brakes", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Brake Temperature"}]}, -{ "hdr": "7E0", "cmd": {"22": "F21B"}, "freq": 5, "signals": [{"id": "LANDROVER_ABS_STATUS", "path": "Brakes", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "ABS Status"}]}, -{ "hdr": "7E0", "cmd": {"22": "F21C"}, "freq": 5, "signals": [{"id": "LANDROVER_TRACTION_CONTROL", "path": "Brakes", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Traction Control Status"}]}, -{ "hdr": "7E0", "cmd": {"22": "F21D"}, "freq": 5, "signals": [{"id": "LANDROVER_STABILITY_CONTROL", "path": "Brakes", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Stability Control Status"}]}, -{ "hdr": "7E0", "cmd": {"22": "F21E"}, "freq": 5, "signals": [{"id": "LANDROVER_HILL_DESCENT", "path": "Brakes", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Hill Descent Control"}]}, -{ "hdr": "7E0", "cmd": {"22": "F21F"}, "freq": 5, "signals": [{"id": "LANDROVER_PARKING_SENSORS", "path": "Safety", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Parking Sensor Status"}]}, -{ "hdr": "7E0", "cmd": {"22": "F220"}, "freq": 5, "signals": [{"id": "LANDROVER_BLIND_SPOT_MONITOR", "path": "Safety", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Blind Spot Monitor"}]}, -{ "hdr": "7E0", "cmd": {"22": "F221"}, "freq": 5, "signals": [{"id": "LANDROVER_LANE_DEPARTURE", "path": "Safety", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Lane Departure Warning"}]}, -{ "hdr": "7E0", "cmd": {"22": "F222"}, "freq": 5, "signals": [{"id": "LANDROVER_ADAPTIVE_CRUISE", "path": "Safety", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Adaptive Cruise Control"}]}, -{ "hdr": "7E0", "cmd": {"22": "F223"}, "freq": 5, "signals": [{"id": "LANDROVER_HEADLIGHT_LEVEL", "path": "Lighting", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Headlight Level"}]}, -{ "hdr": "7E0", "cmd": {"22": "F224"}, "freq": 5, "signals": [{"id": "LANDROVER_WIPER_STATUS", "path": "Lighting", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Wiper Status"}]}, -{ "hdr": "7E0", "cmd": {"22": "F225"}, "freq": 5, "signals": [{"id": "LANDROVER_CLIMATE_TEMP", "path": "Climate", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Climate Control Temperature"}]}, -{ "hdr": "7E0", "cmd": {"22": "F226"}, "freq": 5, "signals": [{"id": "LANDROVER_CLIMATE_FAN", "path": "Climate", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Climate Control Fan Speed"}]}, -{ "hdr": "7E0", "cmd": {"22": "F227"}, "freq": 5, "signals": [{"id": "LANDROVER_CLIMATE_MODE", "path": "Climate", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Climate Control Mode"}]}, -{ "hdr": "7E0", "cmd": {"22": "F228"}, "freq": 5, "signals": [{"id": "LANDROVER_SEAT_HEATER", "path": "Climate", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Seat Heater Status"}]}, -{ "hdr": "7E0", "cmd": {"22": "F229"}, "freq": 5, "signals": [{"id": "LANDROVER_STEERING_WHEEL_HEATER", "path": "Climate", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Steering Wheel Heater"}]}, -{ "hdr": "7E0", "cmd": {"22": "F22A"}, "freq": 5, "signals": [{"id": "LANDROVER_DOOR_STATUS", "path": "Body", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Door Status"}]}, -{ "hdr": "7E0", "cmd": {"22": "F22B"}, "freq": 5, "signals": [{"id": "LANDROVER_WINDOW_STATUS", "path": "Body", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Window Status"}]}, -{ "hdr": "7E0", "cmd": {"22": "F22C"}, "freq": 5, "signals": [{"id": "LANDROVER_SUNROOF_STATUS", "path": "Body", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Sunroof Status"}]}, -{ "hdr": "7E0", "cmd": {"22": "F22D"}, "freq": 5, "signals": [{"id": "LANDROVER_MIRROR_STATUS", "path": "Body", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Mirror Status"}]}, -{ "hdr": "7E0", "cmd": {"22": "F22E"}, "freq": 5, "signals": [{"id": "LANDROVER_TAILGATE_STATUS", "path": "Body", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Tailgate Status"}]}, -{ "hdr": "7E0", "cmd": {"22": "F22F"}, "freq": 5, "signals": [{"id": "LANDROVER_HOOD_STATUS", "path": "Body", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Hood Status"}]} +{ "hdr": "7E8", "cmd": {"01": "08"}, "freq": 1, "signals": [{"id": "LANDROVER_TIMING_ADVANCE", "path": "Engine", "fmt": {"len": 8, "div": 2, "add": -128, "unit": "degrees", "max": 127, "min": -128}, "name": "Timing Advance"}]}, +{ "hdr": "7E8", "cmd": {"01": "0B"}, "freq": 1, "signals": [{"id": "LANDROVER_INTAKE_MANIFOLD_PRESSURE_STD", "path": "Engine", "fmt": {"len": 8, "unit": "kilopascal", "max": 255, "min": 0}, "name": "Intake Manifold Pressure (Std)"}]}, +{ "hdr": "7E8", "cmd": {"01": "0E"}, "freq": 1, "signals": [{"id": "LANDROVER_TIMING_ADVANCE_2", "path": "Engine", "fmt": {"len": 8, "div": 2, "add": -128, "unit": "degrees", "max": 127, "min": -128}, "name": "Timing Advance 2"}]}, +{ "hdr": "7E8", "cmd": {"01": "14"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_1_VOLT_2", "path": "Engine", "fmt": {"len": 8, "div": 200, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 1 Voltage 2"}]}, +{ "hdr": "7E8", "cmd": {"01": "15"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_2_VOLT", "path": "Engine", "fmt": {"len": 8, "div": 200, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 2 Voltage"}]}, +{ "hdr": "7E8", "cmd": {"01": "16"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_3_VOLT", "path": "Engine", "fmt": {"len": 8, "div": 200, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 3 Voltage"}]}, +{ "hdr": "7E8", "cmd": {"01": "17"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_4_VOLT", "path": "Engine", "fmt": {"len": 8, "div": 200, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 4 Voltage"}]}, +{ "hdr": "7E8", "cmd": {"01": "18"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_5_VOLT", "path": "Engine", "fmt": {"len": 8, "div": 200, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 5 Voltage"}]}, +{ "hdr": "7E8", "cmd": {"01": "19"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_6_VOLT", "path": "Engine", "fmt": {"len": 8, "div": 200, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 6 Voltage"}]}, +{ "hdr": "7E8", "cmd": {"01": "1A"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_7_VOLT", "path": "Engine", "fmt": {"len": 8, "div": 200, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 7 Voltage"}]}, +{ "hdr": "7E8", "cmd": {"01": "1B"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_8_VOLT", "path": "Engine", "fmt": {"len": 8, "div": 200, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 8 Voltage"}]}, +{ "hdr": "7E8", "cmd": {"01": "1C"}, "freq": 1, "signals": [{"id": "LANDROVER_OBD_STANDARD", "path": "Engine", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "OBD Standard"}]}, +{ "hdr": "7E8", "cmd": {"01": "1E"}, "freq": 1, "signals": [{"id": "LANDROVER_PTO_STATUS", "path": "Engine", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "PTO Status"}]}, +{ "hdr": "7E8", "cmd": {"01": "20"}, "freq": 1, "signals": [{"id": "LANDROVER_AUX_INPUT_STATUS", "path": "Engine", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Auxiliary Input Status"}]}, +{ "hdr": "7E8", "cmd": {"01": "22"}, "freq": 1, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_STD", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure (Std)"}]}, +{ "hdr": "7E8", "cmd": {"01": "23"}, "freq": 1, "signals": [{"id": "LANDROVER_FUEL_RAIL_GAUGE_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Gauge Pressure"}]}, +{ "hdr": "7E8", "cmd": {"01": "24"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_1_WIDE_RATIO", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "ratio", "max": 2, "min": 0}, "name": "O2 Sensor 1 Wide Ratio"}]}, +{ "hdr": "7E8", "cmd": {"01": "25"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_2_WIDE_RATIO", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "ratio", "max": 2, "min": 0}, "name": "O2 Sensor 2 Wide Ratio"}]}, +{ "hdr": "7E8", "cmd": {"01": "26"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_3_WIDE_RATIO", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "ratio", "max": 2, "min": 0}, "name": "O2 Sensor 3 Wide Ratio"}]}, +{ "hdr": "7E8", "cmd": {"01": "27"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_4_WIDE_RATIO", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "ratio", "max": 2, "min": 0}, "name": "O2 Sensor 4 Wide Ratio"}]}, +{ "hdr": "7E8", "cmd": {"01": "28"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_5_WIDE_RATIO", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "ratio", "max": 2, "min": 0}, "name": "O2 Sensor 5 Wide Ratio"}]}, +{ "hdr": "7E8", "cmd": {"01": "29"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_6_WIDE_RATIO", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "ratio", "max": 2, "min": 0}, "name": "O2 Sensor 6 Wide Ratio"}]}, +{ "hdr": "7E8", "cmd": {"01": "2A"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_7_WIDE_RATIO", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "ratio", "max": 2, "min": 0}, "name": "O2 Sensor 7 Wide Ratio"}]}, +{ "hdr": "7E8", "cmd": {"01": "2B"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_8_WIDE_RATIO", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "ratio", "max": 2, "min": 0}, "name": "O2 Sensor 8 Wide Ratio"}]}, +{ "hdr": "7E8", "cmd": {"01": "2C"}, "freq": 1, "signals": [{"id": "LANDROVER_COMMANDED_EGR", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Commanded EGR"}]}, +{ "hdr": "7E8", "cmd": {"01": "2D"}, "freq": 1, "signals": [{"id": "LANDROVER_EGR_ERROR", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": -100}, "name": "EGR Error"}]}, +{ "hdr": "7E8", "cmd": {"01": "2E"}, "freq": 1, "signals": [{"id": "LANDROVER_COMMANDED_EVAPORATIVE_PURGE", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Commanded Evaporative Purge"}]}, +{ "hdr": "7E8", "cmd": {"01": "2F"}, "freq": 1, "signals": [{"id": "LANDROVER_FUEL_LEVEL_INPUT", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Input (Std)"}]}, +{ "hdr": "7E8", "cmd": {"01": "30"}, "freq": 1, "signals": [{"id": "LANDROVER_WARM_UPS_SINCE_CODES_CLEARED", "path": "Stats", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Warm-ups Since Codes Cleared"}]}, +{ "hdr": "7E8", "cmd": {"01": "32"}, "freq": 1, "signals": [{"id": "LANDROVER_EVAP_VAPOR_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 4, "unit": "pascal", "max": 8191, "min": -8192}, "name": "EVAP Vapor Pressure"}]}, +{ "hdr": "7E8", "cmd": {"01": "34"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_1_WIDE_VOLT", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 1 Wide Voltage"}]}, +{ "hdr": "7E8", "cmd": {"01": "35"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_2_WIDE_VOLT", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 2 Wide Voltage"}]}, +{ "hdr": "7E8", "cmd": {"01": "36"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_3_WIDE_VOLT", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 3 Wide Voltage"}]}, +{ "hdr": "7E8", "cmd": {"01": "37"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_4_WIDE_VOLT", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 4 Wide Voltage"}]}, +{ "hdr": "7E8", "cmd": {"01": "38"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_5_WIDE_VOLT", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 5 Wide Voltage"}]}, +{ "hdr": "7E8", "cmd": {"01": "39"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_6_WIDE_VOLT", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 6 Wide Voltage"}]}, +{ "hdr": "7E8", "cmd": {"01": "3A"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_7_WIDE_VOLT", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 7 Wide Voltage"}]}, +{ "hdr": "7E8", "cmd": {"01": "3B"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_8_WIDE_VOLT", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 8 Wide Voltage"}]}, +{ "hdr": "7E8", "cmd": {"01": "3C"}, "freq": 1, "signals": [{"id": "LANDROVER_CATALYST_TEMP_B1S1", "path": "Engine", "fmt": {"len": 16, "div": 10, "add": -40, "unit": "celsius", "max": 6513.5, "min": -40}, "name": "Catalyst Temperature Bank 1 Sensor 1"}]}, +{ "hdr": "7E8", "cmd": {"01": "3D"}, "freq": 1, "signals": [{"id": "LANDROVER_CATALYST_TEMP_B2S1", "path": "Engine", "fmt": {"len": 16, "div": 10, "add": -40, "unit": "celsius", "max": 6513.5, "min": -40}, "name": "Catalyst Temperature Bank 2 Sensor 1"}]}, +{ "hdr": "7E8", "cmd": {"01": "3E"}, "freq": 1, "signals": [{"id": "LANDROVER_CATALYST_TEMP_B1S2", "path": "Engine", "fmt": {"len": 16, "div": 10, "add": -40, "unit": "celsius", "max": 6513.5, "min": -40}, "name": "Catalyst Temperature Bank 1 Sensor 2"}]}, +{ "hdr": "7E8", "cmd": {"01": "3F"}, "freq": 1, "signals": [{"id": "LANDROVER_CATALYST_TEMP_B2S2", "path": "Engine", "fmt": {"len": 16, "div": 10, "add": -40, "unit": "celsius", "max": 6513.5, "min": -40}, "name": "Catalyst Temperature Bank 2 Sensor 2"}]}, +{ "hdr": "7E8", "cmd": {"01": "40"}, "freq": 1, "signals": [{"id": "LANDROVER_PIDS_SUPPORTED_41_60", "path": "Engine", "fmt": {"len": 32, "unit": "scalar", "max": 4294967295, "min": 0}, "name": "PIDs Supported 41-60"}]}, +{ "hdr": "7E8", "cmd": {"01": "41"}, "freq": 1, "signals": [{"id": "LANDROVER_MONITOR_STATUS_THIS_DRIVE_CYCLE", "path": "Engine", "fmt": {"len": 32, "unit": "scalar", "max": 4294967295, "min": 0}, "name": "Monitor Status This Drive Cycle"}]}, +{ "hdr": "7E8", "cmd": {"01": "42"}, "freq": 1, "signals": [{"id": "LANDROVER_CONTROL_MODULE_VOLTAGE", "path": "Engine", "fmt": {"len": 16, "div": 1000, "unit": "volts", "max": 65.535, "min": 0}, "name": "Control Module Voltage"}]}, +{ "hdr": "7E8", "cmd": {"01": "43"}, "freq": 1, "signals": [{"id": "LANDROVER_ABS_LOAD_VALUE", "path": "Engine", "fmt": {"len": 16, "div": 255, "unit": "percent", "max": 25700, "min": 0}, "name": "Absolute Load Value"}]}, +{ "hdr": "7E8", "cmd": {"01": "44"}, "freq": 1, "signals": [{"id": "LANDROVER_COMMANDED_EQUIV_RATIO", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "ratio", "max": 2, "min": 0}, "name": "Commanded Equivalence Ratio"}]}, +{ "hdr": "7E8", "cmd": {"01": "45"}, "freq": 1, "signals": [{"id": "LANDROVER_RELATIVE_THROTTLE_POS", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Relative Throttle Position"}]}, +{ "hdr": "7E8", "cmd": {"01": "46"}, "freq": 30, "signals": [{"id": "LANDROVER_AMBIENT_AIR_TEMP", "path": "Climate", "fmt": {"len": 8, "max": 87.5, "min": -40, "div": 2, "add": -40, "unit": "celsius"}, "name": "Ambient Air Temperature"}]}, +{ "hdr": "7E8", "cmd": {"01": "47"}, "freq": 1, "signals": [{"id": "LANDROVER_ABS_THROTTLE_POS_B", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Absolute Throttle Position B"}]}, +{ "hdr": "7E8", "cmd": {"01": "48"}, "freq": 1, "signals": [{"id": "LANDROVER_ABS_THROTTLE_POS_C", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Absolute Throttle Position C"}]}, +{ "hdr": "7E8", "cmd": {"01": "49"}, "freq": 1, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_D", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position D"}]}, +{ "hdr": "7E8", "cmd": {"01": "4A"}, "freq": 1, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_E", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position E"}]}, +{ "hdr": "7E8", "cmd": {"01": "4B"}, "freq": 1, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_F", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position F"}]}, + +{ "hdr": "7E8", "cmd": {"01": "4C"}, "freq": 1, "signals": [{"id": "LANDROVER_COMMANDED_THROTTLE_ACTUATOR_CTRL", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Commanded Throttle Actuator Control"}]}, +{ "hdr": "7E0", "cmd": {"22": "F40C"}, "freq": 10, "signals": [{"id": "LANDROVER_BATTERY_VOLTAGE", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "volts", "max": 25.5, "min": 0}, "name": "Battery Voltage"}]}, +{ "hdr": "7E0", "cmd": {"22": "F442"}, "freq": 10, "signals": [{"id": "LANDROVER_VEHICLE_SPEED_2", "path": "Movement", "fmt": {"len": 16, "div": 100, "unit": "kilometersPerHour", "max": 655.35, "min": 0}, "name": "Vehicle Speed (Enhanced)"}]}, +{ "hdr": "7E0", "cmd": {"22": "F1A3"}, "freq": 30, "signals": [{"id": "LANDROVER_INTAKE_AIR_TEMP_2", "path": "Engine", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Intake Air Temperature 2"}]}, +{ "hdr": "7E0", "cmd": {"22": "F18C"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure"}]}, +{ "hdr": "7E0", "cmd": {"22": "F190"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT4", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt4"}]}, +{ "hdr": "7E0", "cmd": {"22": "F196"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT10", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt10"}]}, +{ "hdr": "7E0", "cmd": {"22": "F1AB"}, "freq": 5, "signals": [{"id": "LANDROVER_TURBO_BOOST_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "kilopascal", "max": 655.35, "min": 0}, "name": "Turbo Boost Pressure"}]}, +{ "hdr": "7E0", "cmd": {"22": "F18D"}, "freq": 5, "signals": [{"id": "LANDROVER_INTAKE_MANIFOLD_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "kilopascal", "max": 655.35, "min": 0}, "name": "Intake Manifold Pressure"}]}, +{ "hdr": "732", "cmd": {"22": "D928"}, "freq": 1, "signals": [{"id": "JAG_IS_PARKED", "path": "Movement", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "JAG Is Parked"}]}, +{ "hdr": "7E4", "cmd": {"22": "DD01"}, "freq": 1, "signals": [{"id": "JAG_ODOMETER", "path": "Stats", "fmt": {"len": 24, "unit": "kilometers", "max": 16777215, "min": 0}, "name": "JAG Odometer"}]}, +{ "hdr": "7E4", "cmd": {"22": "DD09"}, "freq": 1, "signals": [{"id": "JAG_VEHICLE_SPEED", "path": "Movement", "fmt": {"len": 8, "unit": "kilometersPerHour", "max": 255, "min": 0}, "name": "JAG Vehicle Speed"}]}, +{ "hdr": "7E4", "cmd": {"22": "4918"}, "freq": 5, "signals": [{"id": "JAG_BATTERY_SOH_AVG", "path": "Engine", "fmt": {"len": 8, "div": 2, "unit": "percent", "max": 100, "min": 0}, "name": "JAG Battery State of Health"}]}, +{ "hdr": "7E4", "cmd": {"22": "4907"}, "freq": 5, "signals": [{"id": "JAG_BATTERY_TEMP", "path": "Engine", "fmt": {"len": 8, "div": 2, "add": -40, "unit": "celsius", "max": 80, "min": -40}, "name": "JAG Battery Temperature"}]}, +{ "hdr": "7E4", "cmd": {"22": "490C"}, "freq": 5, "signals": [{"id": "JAG_BATTERY_CURRENT", "path": "Engine", "fmt": {"len": 16, "div": 40, "add": -819.2, "unit": "amperes", "max": 1000, "min": -500}, "name": "JAG Battery Current"}]}, +{ "hdr": "7E4", "cmd": {"22": "490F"}, "freq": 5, "signals": [{"id": "JAG_BATTERY_VOLTAGE", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "volts", "max": 450, "min": 0}, "name": "JAG Battery Voltage"}]}, +{ "hdr": "7E4", "cmd": {"22": "4910"}, "freq": 5, "signals": [{"id": "JAG_BATTERY_SOC", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "percent", "max": 100, "min": 0}, "name": "JAG Battery State of Charge"}]}, +{ "hdr": "733", "cmd": {"22": "9924"}, "freq": 30, "signals": [{"id": "JAG_OUTSIDE_TEMP", "path": "Climate", "fmt": {"len": 8, "div": 2, "add": -40, "unit": "celsius", "max": 80, "min": -40}, "name": "JAG Outside Temperature"}]}, +{ "hdr": "7E5", "cmd": {"22": "FE0C"}, "freq": 5, "signals": [{"id": "JAG_CHARGING_STATUS", "path": "Engine", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "JAG Charging Status"}]}, +{ "hdr": "726", "cmd": {"22": "FD2A"}, "freq": 5, "signals": [{"id": "JAG_AUTO_HOLD", "path": "Brakes", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "JAG Auto Hold"}]}, +{ "hdr": "733", "cmd": {"22": "99AD"}, "freq": 5, "signals": [{"id": "JAG_HEATER_COOLANT_IN", "path": "Engine", "fmt": {"len": 8, "div": 2, "unit": "celsius", "max": 100, "min": 0}, "name": "JAG Heater Coolant Inlet Temp"}]}, +{ "hdr": "733", "cmd": {"22": "99AF"}, "freq": 5, "signals": [{"id": "JAG_HEATER_COOLANT_OUT", "path": "Engine", "fmt": {"len": 8, "div": 2, "unit": "celsius", "max": 100, "min": 0}, "name": "JAG Heater Coolant Outlet Temp"}]}, +{ "hdr": "733", "cmd": {"22": "99AC"}, "freq": 5, "signals": [{"id": "JAG_POWERTRAIN_CHILLER", "path": "Engine", "fmt": {"len": 16, "div": 5, "add": -50, "unit": "celsius", "max": 100, "min": 0}, "name": "JAG Powertrain Chiller Temp"}]}, +{ "hdr": "1", "cmd": {"22": "8097"}, "freq": 5, "signals": [{"id": "JAG_EXPANSION_VALVE", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "JAG Expansion Valve Position"}]}, +{ "hdr": "7E4", "cmd": {"22": "490A"}, "freq": 5, "signals": [{"id": "JAG_BATTERY_COOLANT_INLET", "path": "Engine", "fmt": {"len": 8, "div": 2, "add": -40, "unit": "celsius", "max": 80, "min": -40}, "name": "JAG Battery Coolant Inlet Temp"}]}, +{ "hdr": "7E4", "cmd": {"22": "4908"}, "freq": 5, "signals": [{"id": "JAG_BATTERY_COOLANT_OUTLET", "path": "Engine", "fmt": {"len": 8, "div": 2, "add": -40, "unit": "celsius", "max": 80, "min": -40}, "name": "JAG Battery Coolant Outlet Temp"}]}, +{ "hdr": "732", "cmd": {"22": "DA2A"}, "freq": 1, "signals": [{"id": "JAG_CONTACT_STATUS", "path": "Engine", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "JAG Contact Status"}]}, +{ "hdr": "7E5", "cmd": {"22": "FE0C"}, "freq": 5, "signals": [{"id": "JAG_CHARGER_MODE", "path": "Engine", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "JAG Charger Mode"}]}, +{ "hdr": "7E5", "cmd": {"22": "FE0C"}, "freq": 5, "signals": [{"id": "JAG_CONNECTION_STATUS", "path": "Engine", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "JAG Connection Status"}]}, +{ "hdr": "733", "cmd": {"22": "9A5C"}, "freq": 5, "signals": [{"id": "JAG_FRONT_EVAP_EXP_VALVE", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "JAG Front Evap Expansion Valve"}]}, +{ "hdr": "733", "cmd": {"22": "9A43"}, "freq": 5, "signals": [{"id": "JAG_FRONT_EVAP_SUPERHEAT", "path": "Engine", "fmt": {"len": 8, "unit": "celsius", "max": 100, "min": 0}, "name": "JAG Front Evap Superheat Temp"}]}, +{ "hdr": "733", "cmd": {"22": "9A42"}, "freq": 5, "signals": [{"id": "JAG_FRONT_EVAP_TARGET_TEMP", "path": "Engine", "fmt": {"len": 8, "unit": "celsius", "max": 100, "min": 0}, "name": "JAG Front Evap Target Temp"}]}, +{ "hdr": "7E4", "cmd": {"22": "4A0B"}, "freq": 5, "signals": [{"id": "JAG_H441_VALUE", "path": "Engine", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "JAG H441 Value"}]} ] } From 3e1fa1727c8f58441bb5942c6c7c643a8ce7b8fe Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Fri, 1 Aug 2025 15:48:31 -0500 Subject: [PATCH 11/84] remove non-working jag attempt --- signalsets/v3/default.json | 27 +-------------------------- 1 file changed, 1 insertion(+), 26 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index e20fab9..0ec5eeb 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -90,7 +90,6 @@ { "hdr": "7E8", "cmd": {"01": "3D"}, "freq": 1, "signals": [{"id": "LANDROVER_CATALYST_TEMP_B2S1", "path": "Engine", "fmt": {"len": 16, "div": 10, "add": -40, "unit": "celsius", "max": 6513.5, "min": -40}, "name": "Catalyst Temperature Bank 2 Sensor 1"}]}, { "hdr": "7E8", "cmd": {"01": "3E"}, "freq": 1, "signals": [{"id": "LANDROVER_CATALYST_TEMP_B1S2", "path": "Engine", "fmt": {"len": 16, "div": 10, "add": -40, "unit": "celsius", "max": 6513.5, "min": -40}, "name": "Catalyst Temperature Bank 1 Sensor 2"}]}, { "hdr": "7E8", "cmd": {"01": "3F"}, "freq": 1, "signals": [{"id": "LANDROVER_CATALYST_TEMP_B2S2", "path": "Engine", "fmt": {"len": 16, "div": 10, "add": -40, "unit": "celsius", "max": 6513.5, "min": -40}, "name": "Catalyst Temperature Bank 2 Sensor 2"}]}, -{ "hdr": "7E8", "cmd": {"01": "40"}, "freq": 1, "signals": [{"id": "LANDROVER_PIDS_SUPPORTED_41_60", "path": "Engine", "fmt": {"len": 32, "unit": "scalar", "max": 4294967295, "min": 0}, "name": "PIDs Supported 41-60"}]}, { "hdr": "7E8", "cmd": {"01": "41"}, "freq": 1, "signals": [{"id": "LANDROVER_MONITOR_STATUS_THIS_DRIVE_CYCLE", "path": "Engine", "fmt": {"len": 32, "unit": "scalar", "max": 4294967295, "min": 0}, "name": "Monitor Status This Drive Cycle"}]}, { "hdr": "7E8", "cmd": {"01": "42"}, "freq": 1, "signals": [{"id": "LANDROVER_CONTROL_MODULE_VOLTAGE", "path": "Engine", "fmt": {"len": 16, "div": 1000, "unit": "volts", "max": 65.535, "min": 0}, "name": "Control Module Voltage"}]}, { "hdr": "7E8", "cmd": {"01": "43"}, "freq": 1, "signals": [{"id": "LANDROVER_ABS_LOAD_VALUE", "path": "Engine", "fmt": {"len": 16, "div": 255, "unit": "percent", "max": 25700, "min": 0}, "name": "Absolute Load Value"}]}, @@ -111,30 +110,6 @@ { "hdr": "7E0", "cmd": {"22": "F190"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT4", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt4"}]}, { "hdr": "7E0", "cmd": {"22": "F196"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT10", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt10"}]}, { "hdr": "7E0", "cmd": {"22": "F1AB"}, "freq": 5, "signals": [{"id": "LANDROVER_TURBO_BOOST_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "kilopascal", "max": 655.35, "min": 0}, "name": "Turbo Boost Pressure"}]}, -{ "hdr": "7E0", "cmd": {"22": "F18D"}, "freq": 5, "signals": [{"id": "LANDROVER_INTAKE_MANIFOLD_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "kilopascal", "max": 655.35, "min": 0}, "name": "Intake Manifold Pressure"}]}, -{ "hdr": "732", "cmd": {"22": "D928"}, "freq": 1, "signals": [{"id": "JAG_IS_PARKED", "path": "Movement", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "JAG Is Parked"}]}, -{ "hdr": "7E4", "cmd": {"22": "DD01"}, "freq": 1, "signals": [{"id": "JAG_ODOMETER", "path": "Stats", "fmt": {"len": 24, "unit": "kilometers", "max": 16777215, "min": 0}, "name": "JAG Odometer"}]}, -{ "hdr": "7E4", "cmd": {"22": "DD09"}, "freq": 1, "signals": [{"id": "JAG_VEHICLE_SPEED", "path": "Movement", "fmt": {"len": 8, "unit": "kilometersPerHour", "max": 255, "min": 0}, "name": "JAG Vehicle Speed"}]}, -{ "hdr": "7E4", "cmd": {"22": "4918"}, "freq": 5, "signals": [{"id": "JAG_BATTERY_SOH_AVG", "path": "Engine", "fmt": {"len": 8, "div": 2, "unit": "percent", "max": 100, "min": 0}, "name": "JAG Battery State of Health"}]}, -{ "hdr": "7E4", "cmd": {"22": "4907"}, "freq": 5, "signals": [{"id": "JAG_BATTERY_TEMP", "path": "Engine", "fmt": {"len": 8, "div": 2, "add": -40, "unit": "celsius", "max": 80, "min": -40}, "name": "JAG Battery Temperature"}]}, -{ "hdr": "7E4", "cmd": {"22": "490C"}, "freq": 5, "signals": [{"id": "JAG_BATTERY_CURRENT", "path": "Engine", "fmt": {"len": 16, "div": 40, "add": -819.2, "unit": "amperes", "max": 1000, "min": -500}, "name": "JAG Battery Current"}]}, -{ "hdr": "7E4", "cmd": {"22": "490F"}, "freq": 5, "signals": [{"id": "JAG_BATTERY_VOLTAGE", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "volts", "max": 450, "min": 0}, "name": "JAG Battery Voltage"}]}, -{ "hdr": "7E4", "cmd": {"22": "4910"}, "freq": 5, "signals": [{"id": "JAG_BATTERY_SOC", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "percent", "max": 100, "min": 0}, "name": "JAG Battery State of Charge"}]}, -{ "hdr": "733", "cmd": {"22": "9924"}, "freq": 30, "signals": [{"id": "JAG_OUTSIDE_TEMP", "path": "Climate", "fmt": {"len": 8, "div": 2, "add": -40, "unit": "celsius", "max": 80, "min": -40}, "name": "JAG Outside Temperature"}]}, -{ "hdr": "7E5", "cmd": {"22": "FE0C"}, "freq": 5, "signals": [{"id": "JAG_CHARGING_STATUS", "path": "Engine", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "JAG Charging Status"}]}, -{ "hdr": "726", "cmd": {"22": "FD2A"}, "freq": 5, "signals": [{"id": "JAG_AUTO_HOLD", "path": "Brakes", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "JAG Auto Hold"}]}, -{ "hdr": "733", "cmd": {"22": "99AD"}, "freq": 5, "signals": [{"id": "JAG_HEATER_COOLANT_IN", "path": "Engine", "fmt": {"len": 8, "div": 2, "unit": "celsius", "max": 100, "min": 0}, "name": "JAG Heater Coolant Inlet Temp"}]}, -{ "hdr": "733", "cmd": {"22": "99AF"}, "freq": 5, "signals": [{"id": "JAG_HEATER_COOLANT_OUT", "path": "Engine", "fmt": {"len": 8, "div": 2, "unit": "celsius", "max": 100, "min": 0}, "name": "JAG Heater Coolant Outlet Temp"}]}, -{ "hdr": "733", "cmd": {"22": "99AC"}, "freq": 5, "signals": [{"id": "JAG_POWERTRAIN_CHILLER", "path": "Engine", "fmt": {"len": 16, "div": 5, "add": -50, "unit": "celsius", "max": 100, "min": 0}, "name": "JAG Powertrain Chiller Temp"}]}, -{ "hdr": "1", "cmd": {"22": "8097"}, "freq": 5, "signals": [{"id": "JAG_EXPANSION_VALVE", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "JAG Expansion Valve Position"}]}, -{ "hdr": "7E4", "cmd": {"22": "490A"}, "freq": 5, "signals": [{"id": "JAG_BATTERY_COOLANT_INLET", "path": "Engine", "fmt": {"len": 8, "div": 2, "add": -40, "unit": "celsius", "max": 80, "min": -40}, "name": "JAG Battery Coolant Inlet Temp"}]}, -{ "hdr": "7E4", "cmd": {"22": "4908"}, "freq": 5, "signals": [{"id": "JAG_BATTERY_COOLANT_OUTLET", "path": "Engine", "fmt": {"len": 8, "div": 2, "add": -40, "unit": "celsius", "max": 80, "min": -40}, "name": "JAG Battery Coolant Outlet Temp"}]}, -{ "hdr": "732", "cmd": {"22": "DA2A"}, "freq": 1, "signals": [{"id": "JAG_CONTACT_STATUS", "path": "Engine", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "JAG Contact Status"}]}, -{ "hdr": "7E5", "cmd": {"22": "FE0C"}, "freq": 5, "signals": [{"id": "JAG_CHARGER_MODE", "path": "Engine", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "JAG Charger Mode"}]}, -{ "hdr": "7E5", "cmd": {"22": "FE0C"}, "freq": 5, "signals": [{"id": "JAG_CONNECTION_STATUS", "path": "Engine", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "JAG Connection Status"}]}, -{ "hdr": "733", "cmd": {"22": "9A5C"}, "freq": 5, "signals": [{"id": "JAG_FRONT_EVAP_EXP_VALVE", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "JAG Front Evap Expansion Valve"}]}, -{ "hdr": "733", "cmd": {"22": "9A43"}, "freq": 5, "signals": [{"id": "JAG_FRONT_EVAP_SUPERHEAT", "path": "Engine", "fmt": {"len": 8, "unit": "celsius", "max": 100, "min": 0}, "name": "JAG Front Evap Superheat Temp"}]}, -{ "hdr": "733", "cmd": {"22": "9A42"}, "freq": 5, "signals": [{"id": "JAG_FRONT_EVAP_TARGET_TEMP", "path": "Engine", "fmt": {"len": 8, "unit": "celsius", "max": 100, "min": 0}, "name": "JAG Front Evap Target Temp"}]}, -{ "hdr": "7E4", "cmd": {"22": "4A0B"}, "freq": 5, "signals": [{"id": "JAG_H441_VALUE", "path": "Engine", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "JAG H441 Value"}]} +{ "hdr": "7E0", "cmd": {"22": "F18D"}, "freq": 5, "signals": [{"id": "LANDROVER_INTAKE_MANIFOLD_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "kilopascal", "max": 655.35, "min": 0}, "name": "Intake Manifold Pressure"}]} ] } From 5ebf38602db0b3e5ff7a652af838e31087f380e0 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sat, 23 Aug 2025 13:44:33 -0500 Subject: [PATCH 12/84] roadtrip fun --- signalsets/v3/default.json | 188 ++++++++++++++----------------------- 1 file changed, 73 insertions(+), 115 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 0ec5eeb..70ae8e1 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -1,115 +1,73 @@ -{ "commands": [ -{ "hdr": "7E8", "cmd": {"01": "0D"}, "freq": 1, "signals": [{"id": "LANDROVER_VSS", "path": "Movement", "fmt": {"len": 8, "max": 255, "unit": "kilometersPerHour", "min": 0}, "name": "Vehicle Speed", "suggestedMetric": "speed"}]}, -{ "hdr": "7E8", "cmd": {"01": "0C"}, "freq": 1, "signals": [{"id": "LANDROVER_ENGINE_RPM", "path": "Engine", "fmt": {"len": 16, "div": 4, "max": 16383, "unit": "rpm", "min": 0}, "name": "Engine RPM"}]}, -{ "hdr": "7E8", "cmd": {"01": "05"}, "freq": 1, "signals": [{"id": "LANDROVER_COOLANT_TEMP", "path": "Engine", "fmt": {"len": 8, "add": -40, "max": 215, "unit": "celsius", "min": 0}, "name": "Coolant Temperature"}]}, -{ "hdr": "732", "cmd": {"22": "D928"}, "freq": 1, "signals": [{"id": "LANDROVER_PARKED", "path": "Movement", "fmt": {"bix": 7, "len": 1, "max": 1, "unit": "yesno", "min": 0}, "name": "Parked?"}]}, -{ "hdr": "7E8", "cmd": {"01": "04"}, "freq": 1, "signals": [{"id": "LANDROVER_ENGINE_LOAD", "path": "Engine", "fmt": {"len": 8, "max": 100, "unit": "percent", "min": 0}, "name": "Engine Load"}]}, -{ "hdr": "7E8", "cmd": {"01": "0F"}, "freq": 1, "signals": [{"id": "LANDROVER_IAT", "path": "Engine", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 255, "min": 0}, "name": "Intake Air Temperature"}]}, -{ "hdr": "7E8", "cmd": {"01": "10"}, "freq": 1, "signals": [{"id": "LANDROVER_MAF", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "gramsPerSecond", "max": 255, "min": 0}, "name": "Mass Air Flow"}]}, -{ "hdr": "7E8", "cmd": {"01": "1F"}, "freq": 1, "signals": [{"id": "LANDROVER_TIME_SINCE_ENGINE_START", "path": "Clocks", "fmt": {"len": 16, "unit": "seconds", "max": 65535, "min": 0}, "name": "Time Since Engine Start"}]}, -{ "hdr": "7E0", "cmd": {"22": "F300"}, "freq": 5, "signals": [{"id": "LANDROVER_ENGINE_OIL_TEMP", "path": "Engine", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 255, "min": 0}, "name": "Engine Oil Temp"}]}, -{ "hdr": "7E0", "cmd": {"22": "F200"}, "freq": 5, "signals": [{"id": "LANDROVER_ENGINE_OIL_VOL", "path": "Engine", "fmt": {"len": 8, "div": 10, "unit": "liters", "max": 255, "min": 0}, "name": "Engine Oil Volume"}]}, -{ "hdr": "7E0", "cmd": {"22": "33E"}, "freq": 5, "signals": [{"id": "LANDROVER_BOOST", "path": "Engine", "fmt": {"len": 8, "unit": "kilopascal", "max": 255, "min": 0}, "name": "Boost"}]}, -{ "hdr": "7E0", "cmd": {"22": "5200"}, "freq": 5, "signals": [{"id": "LANDROVER_IAT2", "path": "Engine", "fmt": {"len": 8, "unit": "celsius", "max": 255, "min": 0}, "name": "IAT2"}]}, -{ "hdr": "7E8", "cmd": {"01": "03"}, "freq": 1, "signals": [{"id": "LANDROVER_FUEL_SYS_STATUS", "path": "Engine", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Fuel System Status"}]}, -{ "hdr": "7E8", "cmd": {"01": "06"}, "freq": 1, "signals": [{"id": "LANDROVER_SHORT_TERM_FUEL_TRIM_B1", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": -100}, "name": "Short Term Fuel Trim Bank 1"}]}, -{ "hdr": "7E8", "cmd": {"01": "07"}, "freq": 1, "signals": [{"id": "LANDROVER_LONG_TERM_FUEL_TRIM_B1", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": -100}, "name": "Long Term Fuel Trim Bank 1"}]}, -{ "hdr": "7E8", "cmd": {"01": "0A"}, "freq": 1, "signals": [{"id": "LANDROVER_FUEL_PRESSURE", "path": "Engine", "fmt": {"len": 8, "unit": "kilopascal", "max": 765, "min": 0}, "name": "Fuel Pressure"}]}, -{ "hdr": "7E8", "cmd": {"01": "11"}, "freq": 1, "signals": [{"id": "LANDROVER_THROTTLE_POS", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Throttle Position"}]}, -{ "hdr": "7E8", "cmd": {"01": "13"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_1_VOLT", "path": "Engine", "fmt": {"len": 8, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 1 Voltage"}]}, -{ "hdr": "7E8", "cmd": {"01": "1D"}, "freq": 1, "signals": [{"id": "LANDROVER_DIST_MIL_ON", "path": "Stats", "fmt": {"len": 16, "unit": "kilometers", "max": 65535, "min": 0}, "name": "Distance with MIL On"}]}, -{ "hdr": "7E8", "cmd": {"01": "21"}, "freq": 1, "signals": [{"id": "LANDROVER_DIST_SINCE_CODES_CLEARED", "path": "Stats", "fmt": {"len": 16, "unit": "kilometers", "max": 65535, "min": 0}, "name": "Distance Since Codes Cleared", "suggestedMetric": "distanceSinceDTCsCleared"}]}, -{ "hdr": "7E0", "cmd": {"22": "F150"}, "freq": 5, "signals": [{"id": "LANDROVER_FUEL_LEVEL", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level", "suggestedMetric": "fuelTankLevel"}]}, - -{ "hdr": "7E8", "cmd": {"01": "33"}, "freq": 1, "signals": [{"id": "LANDROVER_BARO_PRESSURE", "path": "Engine", "fmt": {"len": 8, "unit": "kilopascal", "max": 255, "min": 0}, "name": "Barometric Pressure"}]}, -{ "hdr": "7E8", "cmd": {"01": "46"}, "freq": 30, "signals": [{"id": "LANDROVER_AMBIENT_AIR_TEMP", "path": "Climate", "fmt": {"len": 8, "max": 87.5, "min": -40, "div": 2, "add": -40, "unit": "celsius"}, "name": "Ambient Air Temperature"}]}, -{ "hdr": "7E8", "cmd": {"01": "4D"}, "freq": 1, "signals": [{"id": "LANDROVER_COMMANDED_THROTTLE_ACTUATOR", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Commanded Throttle Actuator"}]}, -{ "hdr": "7E8", "cmd": {"01": "5C"}, "freq": 1, "signals": [{"id": "LANDROVER_ENGINE_OIL_TEMP_STD", "path": "Engine", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Engine Oil Temperature (Std)"}]}, - -{ "hdr": "7E8", "cmd": {"01": "31"}, "freq": 1, "signals": [{"id": "LANDROVER_DISTANCE_TRAVELED", "path": "Stats", "fmt": {"len": 16, "unit": "kilometers", "max": 65535, "min": 0}, "name": "Distance Traveled", "suggestedMetric": "odometer"}]}, -{ "hdr": "7E8", "cmd": {"01": "A6"}, "freq": 1, "signals": [{"id": "LANDROVER_ODOMETER", "path": "Stats", "fmt": {"len": 24, "unit": "kilometers", "max": 1677721500, "min": 0, "mul": 100}, "name": "Odometer", "suggestedMetric": "odometer"}]}, -{ "hdr": "7E8", "cmd": {"01": "A7"}, "freq": 1, "signals": [{"id": "LANDROVER_ODOMETER_MILES", "path": "Stats", "fmt": {"len": 24, "unit": "miles", "max": 1677721500, "min": 0, "mul": 100}, "name": "Odometer (Miles)", "suggestedMetric": "odometer"}]}, -{ "hdr": "7E8", "cmd": {"01": "42"}, "freq": 1, "signals": [{"id": "LANDROVER_CONTROL_MODULE_VOLTAGE", "path": "Engine", "fmt": {"len": 16, "div": 1000, "unit": "volts", "max": 65.535, "min": 0}, "name": "Control Module Voltage"}]}, -{ "hdr": "7E8", "cmd": {"01": "43"}, "freq": 1, "signals": [{"id": "LANDROVER_ABS_LOAD_VALUE", "path": "Engine", "fmt": {"len": 16, "div": 255, "unit": "percent", "max": 25700, "min": 0}, "name": "Absolute Load Value"}]}, -{ "hdr": "7E8", "cmd": {"01": "44"}, "freq": 1, "signals": [{"id": "LANDROVER_COMMANDED_EQUIV_RATIO", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "ratio", "max": 2, "min": 0}, "name": "Commanded Equivalence Ratio"}]}, -{ "hdr": "7E8", "cmd": {"01": "45"}, "freq": 1, "signals": [{"id": "LANDROVER_RELATIVE_THROTTLE_POS", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Relative Throttle Position"}]}, -{ "hdr": "7E8", "cmd": {"01": "47"}, "freq": 1, "signals": [{"id": "LANDROVER_ABS_THROTTLE_POS_B", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Absolute Throttle Position B"}]}, -{ "hdr": "7E8", "cmd": {"01": "48"}, "freq": 1, "signals": [{"id": "LANDROVER_ABS_THROTTLE_POS_C", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Absolute Throttle Position C"}]}, -{ "hdr": "7E8", "cmd": {"01": "49"}, "freq": 1, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_D", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position D"}]}, -{ "hdr": "7E8", "cmd": {"01": "4A"}, "freq": 1, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_E", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position E"}]}, -{ "hdr": "7E8", "cmd": {"01": "4B"}, "freq": 1, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_F", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position F"}]}, - -{ "hdr": "7E8", "cmd": {"01": "4C"}, "freq": 1, "signals": [{"id": "LANDROVER_COMMANDED_THROTTLE_ACTUATOR_CTRL", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Commanded Throttle Actuator Control"}]}, -{ "hdr": "7E0", "cmd": {"22": "F40C"}, "freq": 10, "signals": [{"id": "LANDROVER_BATTERY_VOLTAGE", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "volts", "max": 25.5, "min": 0}, "name": "Battery Voltage"}]}, -{ "hdr": "7E0", "cmd": {"22": "F442"}, "freq": 10, "signals": [{"id": "LANDROVER_VEHICLE_SPEED_2", "path": "Movement", "fmt": {"len": 16, "div": 100, "unit": "kilometersPerHour", "max": 655.35, "min": 0}, "name": "Vehicle Speed (Enhanced)"}]}, -{ "hdr": "7E0", "cmd": {"22": "F1A3"}, "freq": 30, "signals": [{"id": "LANDROVER_INTAKE_AIR_TEMP_2", "path": "Engine", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Intake Air Temperature 2"}]}, -{ "hdr": "7E0", "cmd": {"22": "F18C"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure"}]}, -{ "hdr": "7E0", "cmd": {"22": "F190"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT4", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt4"}]}, -{ "hdr": "7E0", "cmd": {"22": "F196"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT10", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt10"}]}, -{ "hdr": "7E0", "cmd": {"22": "F1AB"}, "freq": 5, "signals": [{"id": "LANDROVER_TURBO_BOOST_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "kilopascal", "max": 655.35, "min": 0}, "name": "Turbo Boost Pressure"}]}, -{ "hdr": "7E0", "cmd": {"22": "F18D"}, "freq": 5, "signals": [{"id": "LANDROVER_INTAKE_MANIFOLD_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "kilopascal", "max": 655.35, "min": 0}, "name": "Intake Manifold Pressure"}]}, -{ "hdr": "7E8", "cmd": {"01": "08"}, "freq": 1, "signals": [{"id": "LANDROVER_TIMING_ADVANCE", "path": "Engine", "fmt": {"len": 8, "div": 2, "add": -128, "unit": "degrees", "max": 127, "min": -128}, "name": "Timing Advance"}]}, -{ "hdr": "7E8", "cmd": {"01": "0B"}, "freq": 1, "signals": [{"id": "LANDROVER_INTAKE_MANIFOLD_PRESSURE_STD", "path": "Engine", "fmt": {"len": 8, "unit": "kilopascal", "max": 255, "min": 0}, "name": "Intake Manifold Pressure (Std)"}]}, -{ "hdr": "7E8", "cmd": {"01": "0E"}, "freq": 1, "signals": [{"id": "LANDROVER_TIMING_ADVANCE_2", "path": "Engine", "fmt": {"len": 8, "div": 2, "add": -128, "unit": "degrees", "max": 127, "min": -128}, "name": "Timing Advance 2"}]}, -{ "hdr": "7E8", "cmd": {"01": "14"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_1_VOLT_2", "path": "Engine", "fmt": {"len": 8, "div": 200, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 1 Voltage 2"}]}, -{ "hdr": "7E8", "cmd": {"01": "15"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_2_VOLT", "path": "Engine", "fmt": {"len": 8, "div": 200, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 2 Voltage"}]}, -{ "hdr": "7E8", "cmd": {"01": "16"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_3_VOLT", "path": "Engine", "fmt": {"len": 8, "div": 200, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 3 Voltage"}]}, -{ "hdr": "7E8", "cmd": {"01": "17"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_4_VOLT", "path": "Engine", "fmt": {"len": 8, "div": 200, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 4 Voltage"}]}, -{ "hdr": "7E8", "cmd": {"01": "18"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_5_VOLT", "path": "Engine", "fmt": {"len": 8, "div": 200, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 5 Voltage"}]}, -{ "hdr": "7E8", "cmd": {"01": "19"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_6_VOLT", "path": "Engine", "fmt": {"len": 8, "div": 200, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 6 Voltage"}]}, -{ "hdr": "7E8", "cmd": {"01": "1A"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_7_VOLT", "path": "Engine", "fmt": {"len": 8, "div": 200, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 7 Voltage"}]}, -{ "hdr": "7E8", "cmd": {"01": "1B"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_8_VOLT", "path": "Engine", "fmt": {"len": 8, "div": 200, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 8 Voltage"}]}, -{ "hdr": "7E8", "cmd": {"01": "1C"}, "freq": 1, "signals": [{"id": "LANDROVER_OBD_STANDARD", "path": "Engine", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "OBD Standard"}]}, -{ "hdr": "7E8", "cmd": {"01": "1E"}, "freq": 1, "signals": [{"id": "LANDROVER_PTO_STATUS", "path": "Engine", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "PTO Status"}]}, -{ "hdr": "7E8", "cmd": {"01": "20"}, "freq": 1, "signals": [{"id": "LANDROVER_AUX_INPUT_STATUS", "path": "Engine", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Auxiliary Input Status"}]}, -{ "hdr": "7E8", "cmd": {"01": "22"}, "freq": 1, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_STD", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure (Std)"}]}, -{ "hdr": "7E8", "cmd": {"01": "23"}, "freq": 1, "signals": [{"id": "LANDROVER_FUEL_RAIL_GAUGE_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Gauge Pressure"}]}, -{ "hdr": "7E8", "cmd": {"01": "24"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_1_WIDE_RATIO", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "ratio", "max": 2, "min": 0}, "name": "O2 Sensor 1 Wide Ratio"}]}, -{ "hdr": "7E8", "cmd": {"01": "25"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_2_WIDE_RATIO", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "ratio", "max": 2, "min": 0}, "name": "O2 Sensor 2 Wide Ratio"}]}, -{ "hdr": "7E8", "cmd": {"01": "26"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_3_WIDE_RATIO", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "ratio", "max": 2, "min": 0}, "name": "O2 Sensor 3 Wide Ratio"}]}, -{ "hdr": "7E8", "cmd": {"01": "27"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_4_WIDE_RATIO", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "ratio", "max": 2, "min": 0}, "name": "O2 Sensor 4 Wide Ratio"}]}, -{ "hdr": "7E8", "cmd": {"01": "28"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_5_WIDE_RATIO", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "ratio", "max": 2, "min": 0}, "name": "O2 Sensor 5 Wide Ratio"}]}, -{ "hdr": "7E8", "cmd": {"01": "29"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_6_WIDE_RATIO", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "ratio", "max": 2, "min": 0}, "name": "O2 Sensor 6 Wide Ratio"}]}, -{ "hdr": "7E8", "cmd": {"01": "2A"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_7_WIDE_RATIO", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "ratio", "max": 2, "min": 0}, "name": "O2 Sensor 7 Wide Ratio"}]}, -{ "hdr": "7E8", "cmd": {"01": "2B"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_8_WIDE_RATIO", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "ratio", "max": 2, "min": 0}, "name": "O2 Sensor 8 Wide Ratio"}]}, -{ "hdr": "7E8", "cmd": {"01": "2C"}, "freq": 1, "signals": [{"id": "LANDROVER_COMMANDED_EGR", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Commanded EGR"}]}, -{ "hdr": "7E8", "cmd": {"01": "2D"}, "freq": 1, "signals": [{"id": "LANDROVER_EGR_ERROR", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": -100}, "name": "EGR Error"}]}, -{ "hdr": "7E8", "cmd": {"01": "2E"}, "freq": 1, "signals": [{"id": "LANDROVER_COMMANDED_EVAPORATIVE_PURGE", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Commanded Evaporative Purge"}]}, -{ "hdr": "7E8", "cmd": {"01": "2F"}, "freq": 1, "signals": [{"id": "LANDROVER_FUEL_LEVEL_INPUT", "path": "Fuel", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Fuel Level Input (Std)"}]}, -{ "hdr": "7E8", "cmd": {"01": "30"}, "freq": 1, "signals": [{"id": "LANDROVER_WARM_UPS_SINCE_CODES_CLEARED", "path": "Stats", "fmt": {"len": 8, "unit": "scalar", "max": 255, "min": 0}, "name": "Warm-ups Since Codes Cleared"}]}, -{ "hdr": "7E8", "cmd": {"01": "32"}, "freq": 1, "signals": [{"id": "LANDROVER_EVAP_VAPOR_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 4, "unit": "pascal", "max": 8191, "min": -8192}, "name": "EVAP Vapor Pressure"}]}, -{ "hdr": "7E8", "cmd": {"01": "34"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_1_WIDE_VOLT", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 1 Wide Voltage"}]}, -{ "hdr": "7E8", "cmd": {"01": "35"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_2_WIDE_VOLT", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 2 Wide Voltage"}]}, -{ "hdr": "7E8", "cmd": {"01": "36"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_3_WIDE_VOLT", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 3 Wide Voltage"}]}, -{ "hdr": "7E8", "cmd": {"01": "37"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_4_WIDE_VOLT", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 4 Wide Voltage"}]}, -{ "hdr": "7E8", "cmd": {"01": "38"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_5_WIDE_VOLT", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 5 Wide Voltage"}]}, -{ "hdr": "7E8", "cmd": {"01": "39"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_6_WIDE_VOLT", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 6 Wide Voltage"}]}, -{ "hdr": "7E8", "cmd": {"01": "3A"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_7_WIDE_VOLT", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 7 Wide Voltage"}]}, -{ "hdr": "7E8", "cmd": {"01": "3B"}, "freq": 1, "signals": [{"id": "LANDROVER_O2_SENSOR_8_WIDE_VOLT", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "volts", "max": 1.275, "min": 0}, "name": "O2 Sensor 8 Wide Voltage"}]}, -{ "hdr": "7E8", "cmd": {"01": "3C"}, "freq": 1, "signals": [{"id": "LANDROVER_CATALYST_TEMP_B1S1", "path": "Engine", "fmt": {"len": 16, "div": 10, "add": -40, "unit": "celsius", "max": 6513.5, "min": -40}, "name": "Catalyst Temperature Bank 1 Sensor 1"}]}, -{ "hdr": "7E8", "cmd": {"01": "3D"}, "freq": 1, "signals": [{"id": "LANDROVER_CATALYST_TEMP_B2S1", "path": "Engine", "fmt": {"len": 16, "div": 10, "add": -40, "unit": "celsius", "max": 6513.5, "min": -40}, "name": "Catalyst Temperature Bank 2 Sensor 1"}]}, -{ "hdr": "7E8", "cmd": {"01": "3E"}, "freq": 1, "signals": [{"id": "LANDROVER_CATALYST_TEMP_B1S2", "path": "Engine", "fmt": {"len": 16, "div": 10, "add": -40, "unit": "celsius", "max": 6513.5, "min": -40}, "name": "Catalyst Temperature Bank 1 Sensor 2"}]}, -{ "hdr": "7E8", "cmd": {"01": "3F"}, "freq": 1, "signals": [{"id": "LANDROVER_CATALYST_TEMP_B2S2", "path": "Engine", "fmt": {"len": 16, "div": 10, "add": -40, "unit": "celsius", "max": 6513.5, "min": -40}, "name": "Catalyst Temperature Bank 2 Sensor 2"}]}, -{ "hdr": "7E8", "cmd": {"01": "41"}, "freq": 1, "signals": [{"id": "LANDROVER_MONITOR_STATUS_THIS_DRIVE_CYCLE", "path": "Engine", "fmt": {"len": 32, "unit": "scalar", "max": 4294967295, "min": 0}, "name": "Monitor Status This Drive Cycle"}]}, -{ "hdr": "7E8", "cmd": {"01": "42"}, "freq": 1, "signals": [{"id": "LANDROVER_CONTROL_MODULE_VOLTAGE", "path": "Engine", "fmt": {"len": 16, "div": 1000, "unit": "volts", "max": 65.535, "min": 0}, "name": "Control Module Voltage"}]}, -{ "hdr": "7E8", "cmd": {"01": "43"}, "freq": 1, "signals": [{"id": "LANDROVER_ABS_LOAD_VALUE", "path": "Engine", "fmt": {"len": 16, "div": 255, "unit": "percent", "max": 25700, "min": 0}, "name": "Absolute Load Value"}]}, -{ "hdr": "7E8", "cmd": {"01": "44"}, "freq": 1, "signals": [{"id": "LANDROVER_COMMANDED_EQUIV_RATIO", "path": "Engine", "fmt": {"len": 16, "div": 32768, "unit": "ratio", "max": 2, "min": 0}, "name": "Commanded Equivalence Ratio"}]}, -{ "hdr": "7E8", "cmd": {"01": "45"}, "freq": 1, "signals": [{"id": "LANDROVER_RELATIVE_THROTTLE_POS", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Relative Throttle Position"}]}, -{ "hdr": "7E8", "cmd": {"01": "46"}, "freq": 30, "signals": [{"id": "LANDROVER_AMBIENT_AIR_TEMP", "path": "Climate", "fmt": {"len": 8, "max": 87.5, "min": -40, "div": 2, "add": -40, "unit": "celsius"}, "name": "Ambient Air Temperature"}]}, -{ "hdr": "7E8", "cmd": {"01": "47"}, "freq": 1, "signals": [{"id": "LANDROVER_ABS_THROTTLE_POS_B", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Absolute Throttle Position B"}]}, -{ "hdr": "7E8", "cmd": {"01": "48"}, "freq": 1, "signals": [{"id": "LANDROVER_ABS_THROTTLE_POS_C", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Absolute Throttle Position C"}]}, -{ "hdr": "7E8", "cmd": {"01": "49"}, "freq": 1, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_D", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position D"}]}, -{ "hdr": "7E8", "cmd": {"01": "4A"}, "freq": 1, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_E", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position E"}]}, -{ "hdr": "7E8", "cmd": {"01": "4B"}, "freq": 1, "signals": [{"id": "LANDROVER_ACC_PEDAL_POS_F", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Accelerator Pedal Position F"}]}, - -{ "hdr": "7E8", "cmd": {"01": "4C"}, "freq": 1, "signals": [{"id": "LANDROVER_COMMANDED_THROTTLE_ACTUATOR_CTRL", "path": "Engine", "fmt": {"len": 8, "unit": "percent", "max": 100, "min": 0}, "name": "Commanded Throttle Actuator Control"}]}, -{ "hdr": "7E0", "cmd": {"22": "F40C"}, "freq": 10, "signals": [{"id": "LANDROVER_BATTERY_VOLTAGE", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "volts", "max": 25.5, "min": 0}, "name": "Battery Voltage"}]}, -{ "hdr": "7E0", "cmd": {"22": "F442"}, "freq": 10, "signals": [{"id": "LANDROVER_VEHICLE_SPEED_2", "path": "Movement", "fmt": {"len": 16, "div": 100, "unit": "kilometersPerHour", "max": 655.35, "min": 0}, "name": "Vehicle Speed (Enhanced)"}]}, -{ "hdr": "7E0", "cmd": {"22": "F1A3"}, "freq": 30, "signals": [{"id": "LANDROVER_INTAKE_AIR_TEMP_2", "path": "Engine", "fmt": {"len": 8, "add": -40, "unit": "celsius", "max": 215, "min": -40}, "name": "Intake Air Temperature 2"}]}, -{ "hdr": "7E0", "cmd": {"22": "F18C"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure"}]}, -{ "hdr": "7E0", "cmd": {"22": "F190"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT4", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt4"}]}, -{ "hdr": "7E0", "cmd": {"22": "F196"}, "freq": 10, "signals": [{"id": "LANDROVER_FUEL_RAIL_PRESSURE_ALT10", "path": "Engine", "fmt": {"len": 16, "div": 10, "unit": "kilopascal", "max": 6553.5, "min": 0}, "name": "Fuel Rail Pressure Alt10"}]}, -{ "hdr": "7E0", "cmd": {"22": "F1AB"}, "freq": 5, "signals": [{"id": "LANDROVER_TURBO_BOOST_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "kilopascal", "max": 655.35, "min": 0}, "name": "Turbo Boost Pressure"}]}, -{ "hdr": "7E0", "cmd": {"22": "F18D"}, "freq": 5, "signals": [{"id": "LANDROVER_INTAKE_MANIFOLD_PRESSURE", "path": "Engine", "fmt": {"len": 16, "div": 100, "unit": "kilopascal", "max": 655.35, "min": 0}, "name": "Intake Manifold Pressure"}]} -] -} +{ + "commands": [ + { "hdr": "7DF", "cmd": { "01": "46" }, "freq": 1, + "signals": [ + { "id": "LR4_SAE_AAT", "fmt": { "len": 8, "unit": "celsius" }, "name": "Ambient air temperature", "description": "A - 40 °C (SAE PID 0x46)" }, + { "id": "LR4_SAE_AAT_ADJ", "fmt": { "len": 8, "offs": -10, "unit": "celsius" }, "name": "Ambient air temperature (adjusted)", "description": "Subtract 10 °C to match outside reality, keep both until proven." } + ] + }, + { "hdr": "7DF", "cmd": { "01": "0C" }, "freq": 5, + "signals": [{ "id": "LR4_SAE_RPM", "fmt": { "len": 16, "mul": 0.25, "unit": "rpm" }, "name": "Engine speed" }] + }, + { "hdr": "7DF", "cmd": { "01": "0D" }, "freq": 2, + "signals": [{ "id": "LR4_SAE_SPEED", "fmt": { "len": 8, "unit": "km/h" }, "name": "Vehicle speed" }] + }, + { "hdr": "7DF", "cmd": { "01": "05" }, "freq": 1, + "signals": [{ "id": "LR4_SAE_ECT", "fmt": { "len": 8, "unit": "celsius" }, "name": "Engine coolant temperature" }] + }, + { "hdr": "7DF", "cmd": { "01": "0F" }, "freq": 1, + "signals": [{ "id": "LR4_SAE_IAT", "fmt": { "len": 8, "unit": "celsius" }, "name": "Intake air temperature" }] + }, + { "hdr": "7DF", "cmd": { "01": "10" }, "freq": 2, + "signals": [{ "id": "LR4_SAE_MAF", "fmt": { "len": 16, "mul": 0.01, "unit": "grams_per_second" }, "name": "Mass air flow" }] + }, + { "hdr": "7DF", "cmd": { "01": "11" }, "freq": 2, + "signals": [{ "id": "LR4_SAE_TPS", "fmt": { "len": 8, "mul": 0.3921568627, "unit": "percent" }, "name": "Throttle position" }] + }, + { "hdr": "7DF", "cmd": { "01": "2E" }, "freq": 0.5, + "signals": [{ "id": "LR4_SAE_EVAP_CMD", "fmt": { "len": 8, "mul": 0.3921568627, "unit": "percent" }, "name": "Commanded evaporative purge" }] + }, + { "hdr": "7DF", "cmd": { "01": "2F" }, "freq": 0.5, + "signals": [{ "id": "LR4_SAE_FUEL", "fmt": { "len": 8, "mul": 0.3921568627, "unit": "percent" }, "name": "Fuel level" }] + }, + { "hdr": "7DF", "cmd": { "01": "31" }, "freq": 0.1, + "signals": [{ "id": "LR4_SAE_DIST_SINCE_CLR", "fmt": { "len": 16, "unit": "km" }, "name": "Distance since DTC clear" }] + }, + { "hdr": "7DF", "cmd": { "01": "1F" }, "freq": 0.2, + "signals": [{ "id": "LR4_SAE_RUNTIME", "fmt": { "len": 16, "unit": "seconds" }, "name": "Run time since engine start" }] + }, + { "hdr": "7DF", "cmd": { "01": "4C" }, "freq": 0.5, + "signals": [{ "id": "LR4_SAE_CMD_THR_ACT", "fmt": { "len": 8, "mul": 0.3921568627, "unit": "percent" }, "name": "Commanded throttle actuator" }] + }, + { "hdr": "7DF", "cmd": { "01": "5A" }, "freq": 0.5, + "signals": [{ "id": "LR4_SAE_REL_PEDAL", "fmt": { "len": 8, "mul": 0.3921568627, "unit": "percent" }, "name": "Relative accelerator pedal position" }] + }, + { "hdr": "7DF", "cmd": { "01": "5C" }, "freq": 0.5, + "signals": [{ "id": "LR4_SAE_OILT", "fmt": { "len": 8, "unit": "celsius" }, "name": "Engine oil temperature" }] + }, + { "hdr": "7DF", "cmd": { "01": "33" }, "freq": 0.5, + "signals": [{ "id": "LR4_SAE_BARO", "fmt": { "len": 8, "unit": "kPa" }, "name": "Barometric pressure" }] + }, + { "hdr": "7DF", "cmd": { "01": "42" }, "freq": 0.5, + "signals": [{ "id": "LR4_SAE_VBAT", "fmt": { "len": 16, "mul": 0.001, "unit": "volts" }, "name": "Control module voltage" }] + }, + { "hdr": "7DF", "cmd": { "01": "43" }, "freq": 0.5, + "signals": [{ "id": "LR4_SAE_ABS_LOAD", "fmt": { "len": 16, "mul": 0.3921568627, "unit": "percent" }, "name": "Absolute load value" }] + }, + { "hdr": "7DF", "cmd": { "01": "59" }, "freq": 0.5, + "signals": [{ "id": "LR4_SAE_FRP_ABS", "fmt": { "len": 16, "mul": 10, "unit": "kPa" }, "name": "Fuel rail absolute pressure", "description": "Usually for GDI/diesel. Returns 10*(256*A+B)." }] + }, + { "hdr": "7DF", "cmd": { "01": "5E" }, "freq": 0.5, + "signals": [{ "id": "LR4_SAE_FUEL_RATE", "fmt": { "len": 16, "mul": 0.05, "unit": "L/h" }, "name": "Engine fuel rate" }] + }, + { "hdr": "7E0", "cmd": { "22": "033E" }, "freq": 0.5, + "signals": [{ "id": "LR4_ECU_033E_RAW", "fmt": { "len": 16, "unit": "raw" }, "name": "0x033E (raw)", "description": "Manufacturer PID that responded in your logs. Keep raw until we confirm scaling." }] + }, + { "hdr": "7DF", "cmd": { "09": "02" }, "freq": 0.02, + "signals": [{ "id": "LR4_VIN", "fmt": { "len": 136, "unit": "ascii" }, "name": "VIN", "description": "Mode 09 VIN (string). Some stacks deliver multi-frame ASCII." }] + }, + { "hdr": "7E2", "cmd": { "22": "F121" }, "freq": 0.05, + "signals": [{ "id": "LR4_IC_ODOMETER_CANDIDATE", "fmt": { "len": 24, "unit": "km" }, "name": "Odometer (candidate F121)", "description": "Instrument cluster DID candidate. Expect ~153,300 km for 95,283 mi if correct." }] + } + ] + } From b2cfcf0919f1b29e211155b509185655bb05c33f Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sat, 23 Aug 2025 13:52:47 -0500 Subject: [PATCH 13/84] formatting --- signalsets/v3/default.json | 281 ++++++++++++++++++++++++++++++------- 1 file changed, 232 insertions(+), 49 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 70ae8e1..e2dfe96 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -1,73 +1,256 @@ { "commands": [ - { "hdr": "7DF", "cmd": { "01": "46" }, "freq": 1, + { + "hdr": "7DF", + "cmd": {"01": "0D"}, + "freq": 0.25, "signals": [ - { "id": "LR4_SAE_AAT", "fmt": { "len": 8, "unit": "celsius" }, "name": "Ambient air temperature", "description": "A - 40 °C (SAE PID 0x46)" }, - { "id": "LR4_SAE_AAT_ADJ", "fmt": { "len": 8, "offs": -10, "unit": "celsius" }, "name": "Ambient air temperature (adjusted)", "description": "Subtract 10 °C to match outside reality, keep both until proven." } + { + "id": "LR4_SAE_SPEED", + "path": "Movement", + "fmt": { "len": 8, "max": 300, "unit": "kilometersPerHour" }, + "name": "Vehicle speed", + "suggestedMetric": "speed" + } ] }, - { "hdr": "7DF", "cmd": { "01": "0C" }, "freq": 5, - "signals": [{ "id": "LR4_SAE_RPM", "fmt": { "len": 16, "mul": 0.25, "unit": "rpm" }, "name": "Engine speed" }] - }, - { "hdr": "7DF", "cmd": { "01": "0D" }, "freq": 2, - "signals": [{ "id": "LR4_SAE_SPEED", "fmt": { "len": 8, "unit": "km/h" }, "name": "Vehicle speed" }] - }, - { "hdr": "7DF", "cmd": { "01": "05" }, "freq": 1, - "signals": [{ "id": "LR4_SAE_ECT", "fmt": { "len": 8, "unit": "celsius" }, "name": "Engine coolant temperature" }] - }, - { "hdr": "7DF", "cmd": { "01": "0F" }, "freq": 1, - "signals": [{ "id": "LR4_SAE_IAT", "fmt": { "len": 8, "unit": "celsius" }, "name": "Intake air temperature" }] - }, - { "hdr": "7DF", "cmd": { "01": "10" }, "freq": 2, - "signals": [{ "id": "LR4_SAE_MAF", "fmt": { "len": 16, "mul": 0.01, "unit": "grams_per_second" }, "name": "Mass air flow" }] + { + "hdr": "7DF", + "cmd": {"01": "0C"}, + "freq": 0.25, + "signals": [ + { + "id": "LR4_SAE_RPM", + "path": "Engine", + "fmt": { "len": 16, "max": 8000, "mul": 0.25, "unit": "revolutionsPerMinute" }, + "name": "Engine speed" + } + ] }, - { "hdr": "7DF", "cmd": { "01": "11" }, "freq": 2, - "signals": [{ "id": "LR4_SAE_TPS", "fmt": { "len": 8, "mul": 0.3921568627, "unit": "percent" }, "name": "Throttle position" }] + { + "hdr": "7DF", + "cmd": {"01": "05"}, + "freq": 1, + "signals": [ + { + "id": "LR4_SAE_ECT", + "path": "Engine", + "fmt": { "len": 8, "min": -40, "max": 150, "add": -40, "unit": "celsius" }, + "name": "Engine coolant temperature" + } + ] }, - { "hdr": "7DF", "cmd": { "01": "2E" }, "freq": 0.5, - "signals": [{ "id": "LR4_SAE_EVAP_CMD", "fmt": { "len": 8, "mul": 0.3921568627, "unit": "percent" }, "name": "Commanded evaporative purge" }] + { + "hdr": "7DF", + "cmd": {"01": "0F"}, + "freq": 1, + "signals": [ + { + "id": "LR4_SAE_IAT", + "path": "Engine", + "fmt": { "len": 8, "min": -40, "max": 120, "add": -40, "unit": "celsius" }, + "name": "Intake air temperature" + } + ] }, - { "hdr": "7DF", "cmd": { "01": "2F" }, "freq": 0.5, - "signals": [{ "id": "LR4_SAE_FUEL", "fmt": { "len": 8, "mul": 0.3921568627, "unit": "percent" }, "name": "Fuel level" }] + { + "hdr": "7DF", + "cmd": {"01": "10"}, + "freq": 0.5, + "signals": [ + { + "id": "LR4_SAE_MAF", + "path": "Engine", + "fmt": { "len": 16, "max": 655.35, "mul": 0.01, "unit": "gramsPerSecond" }, + "name": "Mass air flow" + } + ] }, - { "hdr": "7DF", "cmd": { "01": "31" }, "freq": 0.1, - "signals": [{ "id": "LR4_SAE_DIST_SINCE_CLR", "fmt": { "len": 16, "unit": "km" }, "name": "Distance since DTC clear" }] + { + "hdr": "7DF", + "cmd": {"01": "11"}, + "freq": 0.5, + "signals": [ + { + "id": "LR4_SAE_TPS", + "path": "Engine", + "fmt": { "len": 8, "max": 100, "mul": 0.3921568627, "unit": "percent" }, + "name": "Throttle position" + } + ] }, - { "hdr": "7DF", "cmd": { "01": "1F" }, "freq": 0.2, - "signals": [{ "id": "LR4_SAE_RUNTIME", "fmt": { "len": 16, "unit": "seconds" }, "name": "Run time since engine start" }] + { + "hdr": "7DF", + "cmd": {"01": "2F"}, + "freq": 1, + "signals": [ + { + "id": "LR4_SAE_FUEL", + "path": "Fuel", + "fmt": { "len": 8, "max": 100, "mul": 0.3921568627, "unit": "percent" }, + "name": "Fuel level", + "suggestedMetric": "fuelTankLevel" + } + ] }, - { "hdr": "7DF", "cmd": { "01": "4C" }, "freq": 0.5, - "signals": [{ "id": "LR4_SAE_CMD_THR_ACT", "fmt": { "len": 8, "mul": 0.3921568627, "unit": "percent" }, "name": "Commanded throttle actuator" }] + { + "hdr": "7DF", + "cmd": {"01": "31"}, + "freq": 1, + "signals": [ + { + "id": "LR4_SAE_DIST_SINCE_CLR", + "path": "Diagnostics", + "fmt": { "len": 16, "max": 65535, "unit": "kilometers" }, + "name": "Distance since DTC clear", + "suggestedMetric": "distanceSinceDTCsCleared" + } + ] }, - { "hdr": "7DF", "cmd": { "01": "5A" }, "freq": 0.5, - "signals": [{ "id": "LR4_SAE_REL_PEDAL", "fmt": { "len": 8, "mul": 0.3921568627, "unit": "percent" }, "name": "Relative accelerator pedal position" }] + { + "hdr": "7DF", + "cmd": {"01": "1F"}, + "freq": 0.5, + "signals": [ + { + "id": "LR4_SAE_RUNTIME", + "path": "Engine", + "fmt": { "len": 16, "max": 65535, "unit": "seconds" }, + "name": "Run time since engine start" + } + ] }, - { "hdr": "7DF", "cmd": { "01": "5C" }, "freq": 0.5, - "signals": [{ "id": "LR4_SAE_OILT", "fmt": { "len": 8, "unit": "celsius" }, "name": "Engine oil temperature" }] + { + "hdr": "7DF", + "cmd": {"01": "46"}, + "freq": 1, + "signals": [ + { + "id": "LR4_SAE_AAT", + "path": "Environment", + "fmt": { "len": 8, "min": -60, "max": 80, "add": -40, "unit": "celsius" }, + "name": "Ambient air temperature" + }, + { + "id": "LR4_SAE_AAT_ADJ", + "path": "Environment", + "fmt": { "len": 8, "min": -70, "max": 70, "add": -50, "unit": "celsius" }, + "name": "Ambient air temperature (adjusted)", + "description": "Temporary −10 °C offset to match observed readings; keep both until verified." + } + ] }, - { "hdr": "7DF", "cmd": { "01": "33" }, "freq": 0.5, - "signals": [{ "id": "LR4_SAE_BARO", "fmt": { "len": 8, "unit": "kPa" }, "name": "Barometric pressure" }] + { + "hdr": "7DF", + "cmd": {"01": "5A"}, + "freq": 0.5, + "signals": [ + { + "id": "LR4_SAE_REL_PEDAL", + "path": "Engine", + "fmt": { "len": 8, "max": 100, "mul": 0.3921568627, "unit": "percent" }, + "name": "Relative accelerator pedal position" + } + ] }, - { "hdr": "7DF", "cmd": { "01": "42" }, "freq": 0.5, - "signals": [{ "id": "LR4_SAE_VBAT", "fmt": { "len": 16, "mul": 0.001, "unit": "volts" }, "name": "Control module voltage" }] + { + "hdr": "7DF", + "cmd": {"01": "4C"}, + "freq": 0.5, + "signals": [ + { + "id": "LR4_SAE_CMD_THR_ACT", + "path": "Engine", + "fmt": { "len": 8, "max": 100, "mul": 0.3921568627, "unit": "percent" }, + "name": "Commanded throttle actuator" + } + ] }, - { "hdr": "7DF", "cmd": { "01": "43" }, "freq": 0.5, - "signals": [{ "id": "LR4_SAE_ABS_LOAD", "fmt": { "len": 16, "mul": 0.3921568627, "unit": "percent" }, "name": "Absolute load value" }] + { + "hdr": "7DF", + "cmd": {"01": "5C"}, + "freq": 0.5, + "signals": [ + { + "id": "LR4_SAE_OILT", + "path": "Engine", + "fmt": { "len": 8, "min": -40, "max": 180, "add": -40, "unit": "celsius" }, + "name": "Engine oil temperature" + } + ] }, - { "hdr": "7DF", "cmd": { "01": "59" }, "freq": 0.5, - "signals": [{ "id": "LR4_SAE_FRP_ABS", "fmt": { "len": 16, "mul": 10, "unit": "kPa" }, "name": "Fuel rail absolute pressure", "description": "Usually for GDI/diesel. Returns 10*(256*A+B)." }] + { + "hdr": "7DF", + "cmd": {"01": "33"}, + "freq": 1, + "signals": [ + { + "id": "LR4_SAE_BARO", + "path": "Environment", + "fmt": { "len": 8, "max": 255, "unit": "kilopascals" }, + "name": "Barometric pressure" + } + ] }, - { "hdr": "7DF", "cmd": { "01": "5E" }, "freq": 0.5, - "signals": [{ "id": "LR4_SAE_FUEL_RATE", "fmt": { "len": 16, "mul": 0.05, "unit": "L/h" }, "name": "Engine fuel rate" }] + { + "hdr": "7DF", + "cmd": {"01": "42"}, + "freq": 1, + "signals": [ + { + "id": "LR4_SAE_VBAT", + "path": "Electrical", + "fmt": { "len": 16, "max": 20, "mul": 0.001, "unit": "volts" }, + "name": "Control module voltage", + "suggestedMetric": "starterBatteryVoltage" + } + ] }, - { "hdr": "7E0", "cmd": { "22": "033E" }, "freq": 0.5, - "signals": [{ "id": "LR4_ECU_033E_RAW", "fmt": { "len": 16, "unit": "raw" }, "name": "0x033E (raw)", "description": "Manufacturer PID that responded in your logs. Keep raw until we confirm scaling." }] + { + "hdr": "7DF", + "cmd": {"01": "5E"}, + "freq": 1, + "signals": [ + { + "id": "LR4_SAE_FUEL_RATE", + "path": "Fuel", + "fmt": { "len": 16, "max": 500, "mul": 0.05, "unit": "litersPerHour" }, + "name": "Engine fuel rate" + } + ] }, - { "hdr": "7DF", "cmd": { "09": "02" }, "freq": 0.02, - "signals": [{ "id": "LR4_VIN", "fmt": { "len": 136, "unit": "ascii" }, "name": "VIN", "description": "Mode 09 VIN (string). Some stacks deliver multi-frame ASCII." }] + + { + "hdr": "7E0", + "rax": "7E8", + "cmd": {"22": "033E"}, + "freq": 0.5, + "signals": [ + { + "id": "LR4_ECU_033E_RAW", + "path": "Engine", + "fmt": { "len": 16, "max": 65535, "unit": "unitless" }, + "name": "0x033E (raw)", + "description": "Manufacturer PID observed responding on your LR4. Keep raw until correlated." + } + ] }, - { "hdr": "7E2", "cmd": { "22": "F121" }, "freq": 0.05, - "signals": [{ "id": "LR4_IC_ODOMETER_CANDIDATE", "fmt": { "len": 24, "unit": "km" }, "name": "Odometer (candidate F121)", "description": "Instrument cluster DID candidate. Expect ~153,300 km for 95,283 mi if correct." }] + + { + "hdr": "7E2", + "rax": "7EA", + "cmd": {"22": "F121"}, + "freq": 1, + "signals": [ + { + "id": "LR4_IC_ODOMETER_CANDIDATE", + "path": "Movement", + "fmt": { "len": 24, "max": 2000000, "unit": "kilometers" }, + "name": "Odometer (candidate F121)", + "description": "Target ≈ 153,300 km for your current 95,283 mi if correct.", + "suggestedMetric": "odometer" + } + ] } ] } From c4fd8a791ff5d4965a3ecdce565eac6a10a7b08d Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sat, 23 Aug 2025 14:10:15 -0500 Subject: [PATCH 14/84] trying some other pids (fix cats) --- signalsets/v3/default.json | 92 ++++++++++++++++++++++++++++++++++---- 1 file changed, 83 insertions(+), 9 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index e2dfe96..769e3ac 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -127,16 +127,9 @@ "signals": [ { "id": "LR4_SAE_AAT", - "path": "Environment", + "path": "Climate", "fmt": { "len": 8, "min": -60, "max": 80, "add": -40, "unit": "celsius" }, "name": "Ambient air temperature" - }, - { - "id": "LR4_SAE_AAT_ADJ", - "path": "Environment", - "fmt": { "len": 8, "min": -70, "max": 70, "add": -50, "unit": "celsius" }, - "name": "Ambient air temperature (adjusted)", - "description": "Temporary −10 °C offset to match observed readings; keep both until verified." } ] }, @@ -199,7 +192,7 @@ "signals": [ { "id": "LR4_SAE_VBAT", - "path": "Electrical", + "path": "Battery", "fmt": { "len": 16, "max": 20, "mul": 0.001, "unit": "volts" }, "name": "Control module voltage", "suggestedMetric": "starterBatteryVoltage" @@ -251,6 +244,87 @@ "suggestedMetric": "odometer" } ] + }, + { + "hdr": "7E0", + "cmd": { "01": "5E" }, + "freq": 1, + "signals": [ + { + "id": "LR4_SAE_FUEL_RATE_PHYS", + "path": "Fuel", + "fmt": { "len": 16, "max": 500, "mul": 0.05, "unit": "litersPerHour" }, + "name": "Engine fuel rate (ECM addr 7E0)", + "description": "Some ECUs only answer 01 5E when addressed physically." + } + ] + }, + { + "hdr": "7E0", + "rax": "7E8", + "cmd": { "22": "033E" }, + "freq": 0.5, + "signals": [ + { + "id": "LR4_ECU_033E_UPTIME_S", + "path": "Diagnostics", + "fmt": { "len": 16, "max": 65535, "unit": "seconds" }, + "name": "ECU uptime (s)", + "description": "Mapped from 0x22033E. In your logs it rose steadily ~1 per second." + }, + { + "id": "LR4_ECU_033E_RAW", + "path": "Diagnostics", + "fmt": { "len": 16, "max": 65535, "unit": "unitless" }, + "name": "0x033E (raw)", + "description": "Raw copy kept for correlation and sanity checks." + } + ] + }, + { + "hdr": "7E2", + "rax": "7EA", + "cmd": { "22": "F17C" }, + "freq": 0.2, + "signals": [ + { + "id": "LR4_IC_ODO_F17C", + "path": "Movement", + "fmt": { "len": 32, "max": 3000000, "unit": "unitless" }, + "name": "Odometer candidate F17C", + "description": "Cluster DID candidate. Expect a stable value near 153300 (km) or 95283 (mi) or scaled by 10." + } + ] + }, + { + "hdr": "7E2", + "rax": "7EA", + "cmd": { "22": "F18C" }, + "freq": 0.2, + "signals": [ + { + "id": "LR4_IC_ODO_F18C", + "path": "Movement", + "fmt": { "len": 32, "max": 3000000, "unit": "unitless" }, + "name": "Odometer candidate F18C", + "description": "Alternate cluster DID candidate. Keep if it lands near expected odometer." + } + ] + }, + { + "hdr": "7E2", + "rax": "7EA", + "cmd": { "22": "01A6" }, + "freq": 0.2, + "signals": [ + { + "id": "LR4_IC_ODO_01A6", + "path": "Movement", + "fmt": { "len": 24, "max": 3000000, "unit": "unitless" }, + "name": "Odometer candidate 01A6", + "description": "Legacy/KWP-era style ID some JLR clusters still alias. Safe to try." + } + ] } ] } From 72f3cefe1f8231fc76a47ce9d8b0ec5a0dd76ae9 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sat, 23 Aug 2025 14:17:01 -0500 Subject: [PATCH 15/84] remove non working --- signalsets/v3/default.json | 131 +------------------------------------ 1 file changed, 2 insertions(+), 129 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 769e3ac..06c6a51 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -100,7 +100,7 @@ "signals": [ { "id": "LR4_SAE_DIST_SINCE_CLR", - "path": "Diagnostics", + "path": "DTCs", "fmt": { "len": 16, "max": 65535, "unit": "kilometers" }, "name": "Distance since DTC clear", "suggestedMetric": "distanceSinceDTCsCleared" @@ -179,7 +179,7 @@ "signals": [ { "id": "LR4_SAE_BARO", - "path": "Environment", + "path": "Climate", "fmt": { "len": 8, "max": 255, "unit": "kilopascals" }, "name": "Barometric pressure" } @@ -198,133 +198,6 @@ "suggestedMetric": "starterBatteryVoltage" } ] - }, - { - "hdr": "7DF", - "cmd": {"01": "5E"}, - "freq": 1, - "signals": [ - { - "id": "LR4_SAE_FUEL_RATE", - "path": "Fuel", - "fmt": { "len": 16, "max": 500, "mul": 0.05, "unit": "litersPerHour" }, - "name": "Engine fuel rate" - } - ] - }, - - { - "hdr": "7E0", - "rax": "7E8", - "cmd": {"22": "033E"}, - "freq": 0.5, - "signals": [ - { - "id": "LR4_ECU_033E_RAW", - "path": "Engine", - "fmt": { "len": 16, "max": 65535, "unit": "unitless" }, - "name": "0x033E (raw)", - "description": "Manufacturer PID observed responding on your LR4. Keep raw until correlated." - } - ] - }, - - { - "hdr": "7E2", - "rax": "7EA", - "cmd": {"22": "F121"}, - "freq": 1, - "signals": [ - { - "id": "LR4_IC_ODOMETER_CANDIDATE", - "path": "Movement", - "fmt": { "len": 24, "max": 2000000, "unit": "kilometers" }, - "name": "Odometer (candidate F121)", - "description": "Target ≈ 153,300 km for your current 95,283 mi if correct.", - "suggestedMetric": "odometer" - } - ] - }, - { - "hdr": "7E0", - "cmd": { "01": "5E" }, - "freq": 1, - "signals": [ - { - "id": "LR4_SAE_FUEL_RATE_PHYS", - "path": "Fuel", - "fmt": { "len": 16, "max": 500, "mul": 0.05, "unit": "litersPerHour" }, - "name": "Engine fuel rate (ECM addr 7E0)", - "description": "Some ECUs only answer 01 5E when addressed physically." - } - ] - }, - { - "hdr": "7E0", - "rax": "7E8", - "cmd": { "22": "033E" }, - "freq": 0.5, - "signals": [ - { - "id": "LR4_ECU_033E_UPTIME_S", - "path": "Diagnostics", - "fmt": { "len": 16, "max": 65535, "unit": "seconds" }, - "name": "ECU uptime (s)", - "description": "Mapped from 0x22033E. In your logs it rose steadily ~1 per second." - }, - { - "id": "LR4_ECU_033E_RAW", - "path": "Diagnostics", - "fmt": { "len": 16, "max": 65535, "unit": "unitless" }, - "name": "0x033E (raw)", - "description": "Raw copy kept for correlation and sanity checks." - } - ] - }, - { - "hdr": "7E2", - "rax": "7EA", - "cmd": { "22": "F17C" }, - "freq": 0.2, - "signals": [ - { - "id": "LR4_IC_ODO_F17C", - "path": "Movement", - "fmt": { "len": 32, "max": 3000000, "unit": "unitless" }, - "name": "Odometer candidate F17C", - "description": "Cluster DID candidate. Expect a stable value near 153300 (km) or 95283 (mi) or scaled by 10." - } - ] - }, - { - "hdr": "7E2", - "rax": "7EA", - "cmd": { "22": "F18C" }, - "freq": 0.2, - "signals": [ - { - "id": "LR4_IC_ODO_F18C", - "path": "Movement", - "fmt": { "len": 32, "max": 3000000, "unit": "unitless" }, - "name": "Odometer candidate F18C", - "description": "Alternate cluster DID candidate. Keep if it lands near expected odometer." - } - ] - }, - { - "hdr": "7E2", - "rax": "7EA", - "cmd": { "22": "01A6" }, - "freq": 0.2, - "signals": [ - { - "id": "LR4_IC_ODO_01A6", - "path": "Movement", - "fmt": { "len": 24, "max": 3000000, "unit": "unitless" }, - "name": "Odometer candidate 01A6", - "description": "Legacy/KWP-era style ID some JLR clusters still alias. Safe to try." - } - ] } ] } From a239b6a03804809fe2d71de44858ccafc2ef860d Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 24 Aug 2025 08:18:06 -0500 Subject: [PATCH 16/84] tryin to find altitude --- signalsets/v3/default.json | 88 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 06c6a51..c4cbce0 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -198,6 +198,94 @@ "suggestedMetric": "starterBatteryVoltage" } ] + }, + { + "hdr": "7E2", + "rax": "7EA", + "cmd": { "22": "F173" }, + "freq": 0.5, + "signals": [ + { + "id": "LR4_IC_ALT_F173_16_BE", + "path": "Environment", + "fmt": { "len": 16, "max": 9000, "min": -500, "sign": true, "unit": "meters" }, + "name": "Altitude (F173 16-bit BE)", + "description": "Cluster candidate; signed meters, big-endian" + }, + { + "id": "LR4_IC_ALT_F173_16_LE", + "path": "Environment", + "fmt": { "len": 16, "max": 9000, "min": -500, "sign": true, "blsb": true, "unit": "meters" }, + "name": "Altitude (F173 16-bit LE)", + "description": "Same DID, little-endian decode" + }, + { + "id": "LR4_IC_ALT_F173_32_BE", + "path": "Environment", + "fmt": { "len": 32, "max": 9000, "min": -500, "sign": true, "unit": "meters" }, + "name": "Altitude (F173 32-bit BE)", + "description": "If module returns 4-byte signed meters" + } + ] + }, + { + "hdr": "7E2", + "rax": "7EA", + "cmd": { "22": "F17C" }, + "freq": 0.5, + "signals": [ + { + "id": "LR4_IC_ALT_F17C_16_BE", + "path": "Environment", + "fmt": { "len": 16, "max": 9000, "min": -500, "sign": true, "unit": "meters" }, + "name": "Altitude (F17C 16-bit BE)", + "description": "Alternate cluster DID, signed meters" + }, + { + "id": "LR4_IC_ALT_F17C_32_BE", + "path": "Environment", + "fmt": { "len": 32, "max": 9000, "min": -500, "sign": true, "unit": "meters" }, + "name": "Altitude (F17C 32-bit BE)", + "description": "Alternate cluster DID, 4-byte signed" + } + ] + }, + { + "hdr": "7E5", + "rax": "7ED", + "cmd": { "22": "F173" }, + "freq": 0.5, + "signals": [ + { + "id": "LR4_NAV_ALT_F173_16_BE", + "path": "Environment", + "fmt": { "len": 16, "max": 9000, "min": -500, "sign": true, "unit": "meters" }, + "name": "Altitude (NAV F173 16-bit BE)", + "description": "Infotainment/nav address; signed meters" + }, + { + "id": "LR4_NAV_ALT_F173_16_LE", + "path": "Environment", + "fmt": { "len": 16, "max": 9000, "min": -500, "sign": true, "blsb": true, "unit": "meters" }, + "name": "Altitude (NAV F173 16-bit LE)", + "description": "Little-endian variant" + } + ] + }, + { + "hdr": "7E5", + "rax": "7ED", + "cmd": { "22": "01A6" }, + "freq": 0.5, + "signals": [ + { + "id": "LR4_NAV_ALT_01A6_16_BE", + "path": "Environment", + "fmt": { "len": 16, "max": 9000, "min": -500, "sign": true, "unit": "meters" }, + "name": "Altitude (NAV 01A6 16-bit BE)", + "description": "Legacy-style DID some JLR stacks alias; signed meters" + } + ] } ] } From e744af13df4158fc6e10236a6feb663d372d3ef6 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 24 Aug 2025 08:40:19 -0500 Subject: [PATCH 17/84] AJ133 values --- signalsets/v3/default.json | 127 ++++++++++++++++++++++++++++++++----- 1 file changed, 111 insertions(+), 16 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index c4cbce0..8db547b 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -199,6 +199,109 @@ } ] }, + { + "hdr": "7E0", + "rax": "7E8", + "cmd": { "22": "03F3" }, + "freq": 0.5, + "signals": [ + { + "id": "LR4_ENGINE_OIL_TEMP", + "path": "Engine", + "fmt": { "len": 8, "add": -40, "min": -40, "max": 120, "unit": "celsius" }, + "name": "AJ133 Engine Oil Temp" + } + ] + }, + { + "hdr": "7E0", + "rax": "7E8", + "cmd": { "22": "03F2" }, + "freq": 0.5, + "signals": [ + { + "id": "LR4_ENGINE_OIL_VOLUME", + "path": "Engine", + "fmt": { "len": 8, "mul": 0.1, "min": 0, "max": 25.5, "unit": "liters" }, + "name": "AJ133 Engine Oil Volume" + } + ] + }, + { + "hdr": "7E1", + "rax": "7E9", + "cmd": { "22": "1E69" }, + "freq": 0.5, + "signals": [ + { + "id": "LR4_GEARBOX_OIL_TEMP", + "path": "Transmission", + "fmt": { "len": 8, "add": -40, "min": -40, "max": 120, "unit": "celsius" }, + "name": "AJ133 Gearbox Temp" + } + ] + }, + { + "hdr": "795", + "cmd": { "22": "1E8A" }, + "freq": 0.5, + "signals": [ + { + "id": "LR4_REAR_DIFF_TEMP", + "path": "Driveline", + "fmt": { "len": 8, "add": -40, "min": -40, "max": 150, "unit": "celsius" }, + "name": "AJ133 Locking Diff Oil Temp" + } + ] + }, + { + "hdr": "7E0", + "rax": "7E8", + "cmd": { "22": "03E6" }, + "freq": 0.5, + "signals": [ + { + "id": "LR4_MEASURED_OIL_LEVEL", + "path": "Engine", + "fmt": { "len": 8, "min": 0, "max": 255, "unit": "millimeters" }, + "name": "AJ133 Oil Level" + } + ] + }, + { + "hdr": "7E0", + "rax": "7E8", + "cmd": { "22": "033E" }, + "freq": 0.5, + "signals": [ + { + "id": "LR4_AJ133_BOOST_KPA", + "path": "Engine", + "fmt": { "len": 8, "min": 0, "max": 255, "unit": "kilopascals" }, + "name": "AJ133 Boost (candidate)" + }, + { + "id": "LR4_ECU_033E_UPTIME_S", + "path": "Diagnostics", + "fmt": { "len": 16, "max": 65535, "unit": "seconds" }, + "name": "ECU uptime (candidate)" + } + ] + }, + { + "hdr": "7E0", + "rax": "7E8", + "cmd": { "22": "0520" }, + "freq": 0.5, + "signals": [ + { + "id": "LR4_IAT2", + "path": "Engine", + "fmt": { "len": 8, "min": 0, "max": 999, "unit": "celsius" }, + "name": "AJ133 IAT2" + } + ] + }, { "hdr": "7E2", "rax": "7EA", @@ -209,22 +312,19 @@ "id": "LR4_IC_ALT_F173_16_BE", "path": "Environment", "fmt": { "len": 16, "max": 9000, "min": -500, "sign": true, "unit": "meters" }, - "name": "Altitude (F173 16-bit BE)", - "description": "Cluster candidate; signed meters, big-endian" + "name": "Altitude (F173 16-bit BE)" }, { "id": "LR4_IC_ALT_F173_16_LE", "path": "Environment", "fmt": { "len": 16, "max": 9000, "min": -500, "sign": true, "blsb": true, "unit": "meters" }, - "name": "Altitude (F173 16-bit LE)", - "description": "Same DID, little-endian decode" + "name": "Altitude (F173 16-bit LE)" }, { "id": "LR4_IC_ALT_F173_32_BE", "path": "Environment", "fmt": { "len": 32, "max": 9000, "min": -500, "sign": true, "unit": "meters" }, - "name": "Altitude (F173 32-bit BE)", - "description": "If module returns 4-byte signed meters" + "name": "Altitude (F173 32-bit BE)" } ] }, @@ -238,15 +338,13 @@ "id": "LR4_IC_ALT_F17C_16_BE", "path": "Environment", "fmt": { "len": 16, "max": 9000, "min": -500, "sign": true, "unit": "meters" }, - "name": "Altitude (F17C 16-bit BE)", - "description": "Alternate cluster DID, signed meters" + "name": "Altitude (F17C 16-bit BE)" }, { "id": "LR4_IC_ALT_F17C_32_BE", "path": "Environment", "fmt": { "len": 32, "max": 9000, "min": -500, "sign": true, "unit": "meters" }, - "name": "Altitude (F17C 32-bit BE)", - "description": "Alternate cluster DID, 4-byte signed" + "name": "Altitude (F17C 32-bit BE)" } ] }, @@ -260,15 +358,13 @@ "id": "LR4_NAV_ALT_F173_16_BE", "path": "Environment", "fmt": { "len": 16, "max": 9000, "min": -500, "sign": true, "unit": "meters" }, - "name": "Altitude (NAV F173 16-bit BE)", - "description": "Infotainment/nav address; signed meters" + "name": "Altitude (NAV F173 16-bit BE)" }, { "id": "LR4_NAV_ALT_F173_16_LE", "path": "Environment", "fmt": { "len": 16, "max": 9000, "min": -500, "sign": true, "blsb": true, "unit": "meters" }, - "name": "Altitude (NAV F173 16-bit LE)", - "description": "Little-endian variant" + "name": "Altitude (NAV F173 16-bit LE)" } ] }, @@ -282,8 +378,7 @@ "id": "LR4_NAV_ALT_01A6_16_BE", "path": "Environment", "fmt": { "len": 16, "max": 9000, "min": -500, "sign": true, "unit": "meters" }, - "name": "Altitude (NAV 01A6 16-bit BE)", - "description": "Legacy-style DID some JLR stacks alias; signed meters" + "name": "Altitude (NAV 01A6 16-bit BE)" } ] } From 412655311993cac8ef5a29ecf059bcaf6cb5638f Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 24 Aug 2025 09:53:21 -0600 Subject: [PATCH 18/84] more altitude attempts --- signalsets/v3/default.json | 113 ++++++++++++++++++------------------- 1 file changed, 56 insertions(+), 57 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 8db547b..593b7ba 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -248,9 +248,9 @@ "signals": [ { "id": "LR4_REAR_DIFF_TEMP", - "path": "Driveline", + "path": "Drivetrain", "fmt": { "len": 8, "add": -40, "min": -40, "max": 150, "unit": "celsius" }, - "name": "AJ133 Locking Diff Oil Temp" + "name": "Locking Diff Oil Temp" } ] }, @@ -264,7 +264,7 @@ "id": "LR4_MEASURED_OIL_LEVEL", "path": "Engine", "fmt": { "len": 8, "min": 0, "max": 255, "unit": "millimeters" }, - "name": "AJ133 Oil Level" + "name": "Oil Level" } ] }, @@ -275,10 +275,10 @@ "freq": 0.5, "signals": [ { - "id": "LR4_AJ133_BOOST_KPA", + "id": "LR4_BOOST", "path": "Engine", "fmt": { "len": 8, "min": 0, "max": 255, "unit": "kilopascals" }, - "name": "AJ133 Boost (candidate)" + "name": "Engine Boost" }, { "id": "LR4_ECU_033E_UPTIME_S", @@ -305,81 +305,80 @@ { "hdr": "7E2", "rax": "7EA", - "cmd": { "22": "F173" }, + "cmd": { "22": "F172" }, "freq": 0.5, "signals": [ - { - "id": "LR4_IC_ALT_F173_16_BE", - "path": "Environment", - "fmt": { "len": 16, "max": 9000, "min": -500, "sign": true, "unit": "meters" }, - "name": "Altitude (F173 16-bit BE)" - }, - { - "id": "LR4_IC_ALT_F173_16_LE", - "path": "Environment", - "fmt": { "len": 16, "max": 9000, "min": -500, "sign": true, "blsb": true, "unit": "meters" }, - "name": "Altitude (F173 16-bit LE)" - }, - { - "id": "LR4_IC_ALT_F173_32_BE", - "path": "Environment", - "fmt": { "len": 32, "max": 9000, "min": -500, "sign": true, "unit": "meters" }, - "name": "Altitude (F173 32-bit BE)" - } + { "id": "LR4_IC_ALT_F172_RAW", "path": "Environment", "fmt": { "len": 16, "max": 20000, "unit": "unitless" }, "name": "Altitude (IC F172 raw)" }, + { "id": "LR4_IC_ALT_F172_M", "path": "Environment", "fmt": { "len": 16, "max": 9000, "unit": "meters" }, "name": "Altitude (IC F172 m, 16-bit)" }, + { "id": "LR4_IC_ALT_F172_FT2M", "path": "Environment", "fmt": { "len": 16, "mul": 0.3048, "max": 9000, "unit": "meters" }, "name": "Altitude (IC F172 feet→m)" } ] }, { "hdr": "7E2", "rax": "7EA", - "cmd": { "22": "F17C" }, + "cmd": { "22": "F174" }, "freq": 0.5, "signals": [ - { - "id": "LR4_IC_ALT_F17C_16_BE", - "path": "Environment", - "fmt": { "len": 16, "max": 9000, "min": -500, "sign": true, "unit": "meters" }, - "name": "Altitude (F17C 16-bit BE)" - }, - { - "id": "LR4_IC_ALT_F17C_32_BE", - "path": "Environment", - "fmt": { "len": 32, "max": 9000, "min": -500, "sign": true, "unit": "meters" }, - "name": "Altitude (F17C 32-bit BE)" - } + { "id": "LR4_IC_ALT_F174_RAW", "path": "Environment", "fmt": { "len": 16, "max": 20000, "unit": "unitless" }, "name": "Altitude (IC F174 raw)" }, + { "id": "LR4_IC_ALT_F174_M", "path": "Environment", "fmt": { "len": 16, "max": 9000, "unit": "meters" }, "name": "Altitude (IC F174 m, 16-bit)" }, + { "id": "LR4_IC_ALT_F174_FT2M", "path": "Environment", "fmt": { "len": 16, "mul": 0.3048, "max": 9000, "unit": "meters" }, "name": "Altitude (IC F174 feet→m)" } ] }, + { + "hdr": "7E2", + "rax": "7EA", + "cmd": { "22": "F176" }, + "freq": 0.5, + "signals": [ + { "id": "LR4_IC_ALT_F176_RAW", "path": "Environment", "fmt": { "len": 16, "max": 20000, "unit": "unitless" }, "name": "Altitude (IC F176 raw)" }, + { "id": "LR4_IC_ALT_F176_M", "path": "Environment", "fmt": { "len": 16, "max": 9000, "unit": "meters" }, "name": "Altitude (IC F176 m, 16-bit)" }, + { "id": "LR4_IC_ALT_F176_FT2M", "path": "Environment", "fmt": { "len": 16, "mul": 0.3048, "max": 9000, "unit": "meters" }, "name": "Altitude (IC F176 feet→m)" } + ] + }, + { "hdr": "7E5", "rax": "7ED", - "cmd": { "22": "F173" }, + "cmd": { "22": "F172" }, "freq": 0.5, "signals": [ - { - "id": "LR4_NAV_ALT_F173_16_BE", - "path": "Environment", - "fmt": { "len": 16, "max": 9000, "min": -500, "sign": true, "unit": "meters" }, - "name": "Altitude (NAV F173 16-bit BE)" - }, - { - "id": "LR4_NAV_ALT_F173_16_LE", - "path": "Environment", - "fmt": { "len": 16, "max": 9000, "min": -500, "sign": true, "blsb": true, "unit": "meters" }, - "name": "Altitude (NAV F173 16-bit LE)" - } + { "id": "LR4_NAV_ALT_F172_RAW", "path": "Environment", "fmt": { "len": 16, "max": 20000, "unit": "unitless" }, "name": "Altitude (NAV F172 raw)" }, + { "id": "LR4_NAV_ALT_F172_M", "path": "Environment", "fmt": { "len": 16, "max": 9000, "unit": "meters" }, "name": "Altitude (NAV F172 m, 16-bit)" }, + { "id": "LR4_NAV_ALT_F172_FT2M", "path": "Environment", "fmt": { "len": 16, "mul": 0.3048, "max": 9000, "unit": "meters" }, "name": "Altitude (NAV F172 feet→m)" } ] }, { "hdr": "7E5", "rax": "7ED", - "cmd": { "22": "01A6" }, + "cmd": { "22": "F174" }, "freq": 0.5, "signals": [ - { - "id": "LR4_NAV_ALT_01A6_16_BE", - "path": "Environment", - "fmt": { "len": 16, "max": 9000, "min": -500, "sign": true, "unit": "meters" }, - "name": "Altitude (NAV 01A6 16-bit BE)" - } + { "id": "LR4_NAV_ALT_F174_RAW", "path": "Environment", "fmt": { "len": 16, "max": 20000, "unit": "unitless" }, "name": "Altitude (NAV F174 raw)" }, + { "id": "LR4_NAV_ALT_F174_M", "path": "Environment", "fmt": { "len": 16, "max": 9000, "unit": "meters" }, "name": "Altitude (NAV F174 m, 16-bit)" }, + { "id": "LR4_NAV_ALT_F174_FT2M", "path": "Environment", "fmt": { "len": 16, "mul": 0.3048, "max": 9000, "unit": "meters" }, "name": "Altitude (NAV F174 feet→m)" } + ] + }, + { + "hdr": "7E5", + "rax": "7ED", + "cmd": { "22": "F176" }, + "freq": 0.5, + "signals": [ + { "id": "LR4_NAV_ALT_F176_RAW", "path": "Environment", "fmt": { "len": 16, "max": 20000, "unit": "unitless" }, "name": "Altitude (NAV F176 raw)" }, + { "id": "LR4_NAV_ALT_F176_M", "path": "Environment", "fmt": { "len": 16, "max": 9000, "unit": "meters" }, "name": "Altitude (NAV F176 m, 16-bit)" }, + { "id": "LR4_NAV_ALT_F176_FT2M", "path": "Environment", "fmt": { "len": 16, "mul": 0.3048, "max": 9000, "unit": "meters" }, "name": "Altitude (NAV F176 feet→m)" } + ] + }, + + { + "hdr": "7E2", + "rax": "7EA", + "cmd": { "21": "A6" }, + "freq": 0.5, + "signals": [ + { "id": "LR4_IC_ALT_21A6_RAW", "path": "Environment", "fmt": { "len": 16, "max": 20000, "unit": "unitless" }, "name": "Altitude (IC 21A6 raw KWP-style)" }, + { "id": "LR4_IC_ALT_21A6_M", "path": "Environment", "fmt": { "len": 16, "max": 9000, "unit": "meters" }, "name": "Altitude (IC 21A6 m, 16-bit)" }, + { "id": "LR4_IC_ALT_21A6_FT2M", "path": "Environment", "fmt": { "len": 16, "mul": 0.3048, "max": 9000, "unit": "meters" }, "name": "Altitude (IC 21A6 feet→m)" } ] } ] From cbbbd15de0abb76a97acf3169ab1123081cd69d1 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 24 Aug 2025 09:54:59 -0600 Subject: [PATCH 19/84] nope --- signalsets/v3/default.json | 79 -------------------------------------- 1 file changed, 79 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 593b7ba..3ecfadd 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -301,85 +301,6 @@ "name": "AJ133 IAT2" } ] - }, - { - "hdr": "7E2", - "rax": "7EA", - "cmd": { "22": "F172" }, - "freq": 0.5, - "signals": [ - { "id": "LR4_IC_ALT_F172_RAW", "path": "Environment", "fmt": { "len": 16, "max": 20000, "unit": "unitless" }, "name": "Altitude (IC F172 raw)" }, - { "id": "LR4_IC_ALT_F172_M", "path": "Environment", "fmt": { "len": 16, "max": 9000, "unit": "meters" }, "name": "Altitude (IC F172 m, 16-bit)" }, - { "id": "LR4_IC_ALT_F172_FT2M", "path": "Environment", "fmt": { "len": 16, "mul": 0.3048, "max": 9000, "unit": "meters" }, "name": "Altitude (IC F172 feet→m)" } - ] - }, - { - "hdr": "7E2", - "rax": "7EA", - "cmd": { "22": "F174" }, - "freq": 0.5, - "signals": [ - { "id": "LR4_IC_ALT_F174_RAW", "path": "Environment", "fmt": { "len": 16, "max": 20000, "unit": "unitless" }, "name": "Altitude (IC F174 raw)" }, - { "id": "LR4_IC_ALT_F174_M", "path": "Environment", "fmt": { "len": 16, "max": 9000, "unit": "meters" }, "name": "Altitude (IC F174 m, 16-bit)" }, - { "id": "LR4_IC_ALT_F174_FT2M", "path": "Environment", "fmt": { "len": 16, "mul": 0.3048, "max": 9000, "unit": "meters" }, "name": "Altitude (IC F174 feet→m)" } - ] - }, - { - "hdr": "7E2", - "rax": "7EA", - "cmd": { "22": "F176" }, - "freq": 0.5, - "signals": [ - { "id": "LR4_IC_ALT_F176_RAW", "path": "Environment", "fmt": { "len": 16, "max": 20000, "unit": "unitless" }, "name": "Altitude (IC F176 raw)" }, - { "id": "LR4_IC_ALT_F176_M", "path": "Environment", "fmt": { "len": 16, "max": 9000, "unit": "meters" }, "name": "Altitude (IC F176 m, 16-bit)" }, - { "id": "LR4_IC_ALT_F176_FT2M", "path": "Environment", "fmt": { "len": 16, "mul": 0.3048, "max": 9000, "unit": "meters" }, "name": "Altitude (IC F176 feet→m)" } - ] - }, - - { - "hdr": "7E5", - "rax": "7ED", - "cmd": { "22": "F172" }, - "freq": 0.5, - "signals": [ - { "id": "LR4_NAV_ALT_F172_RAW", "path": "Environment", "fmt": { "len": 16, "max": 20000, "unit": "unitless" }, "name": "Altitude (NAV F172 raw)" }, - { "id": "LR4_NAV_ALT_F172_M", "path": "Environment", "fmt": { "len": 16, "max": 9000, "unit": "meters" }, "name": "Altitude (NAV F172 m, 16-bit)" }, - { "id": "LR4_NAV_ALT_F172_FT2M", "path": "Environment", "fmt": { "len": 16, "mul": 0.3048, "max": 9000, "unit": "meters" }, "name": "Altitude (NAV F172 feet→m)" } - ] - }, - { - "hdr": "7E5", - "rax": "7ED", - "cmd": { "22": "F174" }, - "freq": 0.5, - "signals": [ - { "id": "LR4_NAV_ALT_F174_RAW", "path": "Environment", "fmt": { "len": 16, "max": 20000, "unit": "unitless" }, "name": "Altitude (NAV F174 raw)" }, - { "id": "LR4_NAV_ALT_F174_M", "path": "Environment", "fmt": { "len": 16, "max": 9000, "unit": "meters" }, "name": "Altitude (NAV F174 m, 16-bit)" }, - { "id": "LR4_NAV_ALT_F174_FT2M", "path": "Environment", "fmt": { "len": 16, "mul": 0.3048, "max": 9000, "unit": "meters" }, "name": "Altitude (NAV F174 feet→m)" } - ] - }, - { - "hdr": "7E5", - "rax": "7ED", - "cmd": { "22": "F176" }, - "freq": 0.5, - "signals": [ - { "id": "LR4_NAV_ALT_F176_RAW", "path": "Environment", "fmt": { "len": 16, "max": 20000, "unit": "unitless" }, "name": "Altitude (NAV F176 raw)" }, - { "id": "LR4_NAV_ALT_F176_M", "path": "Environment", "fmt": { "len": 16, "max": 9000, "unit": "meters" }, "name": "Altitude (NAV F176 m, 16-bit)" }, - { "id": "LR4_NAV_ALT_F176_FT2M", "path": "Environment", "fmt": { "len": 16, "mul": 0.3048, "max": 9000, "unit": "meters" }, "name": "Altitude (NAV F176 feet→m)" } - ] - }, - - { - "hdr": "7E2", - "rax": "7EA", - "cmd": { "21": "A6" }, - "freq": 0.5, - "signals": [ - { "id": "LR4_IC_ALT_21A6_RAW", "path": "Environment", "fmt": { "len": 16, "max": 20000, "unit": "unitless" }, "name": "Altitude (IC 21A6 raw KWP-style)" }, - { "id": "LR4_IC_ALT_21A6_M", "path": "Environment", "fmt": { "len": 16, "max": 9000, "unit": "meters" }, "name": "Altitude (IC 21A6 m, 16-bit)" }, - { "id": "LR4_IC_ALT_21A6_FT2M", "path": "Environment", "fmt": { "len": 16, "mul": 0.3048, "max": 9000, "unit": "meters" }, "name": "Altitude (IC 21A6 feet→m)" } - ] } ] } From f108ce286703a2a10d3632f22b7d1132278d53bb Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 24 Aug 2025 10:19:46 -0600 Subject: [PATCH 20/84] organize file, test other pids --- signalsets/v3/default.json | 183 ++++++++++++++++++++++++++++++------- 1 file changed, 151 insertions(+), 32 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 3ecfadd..e9c7c83 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -107,6 +107,19 @@ } ] }, + { + "hdr": "7DF", + "cmd": {"01": "21"}, + "freq": 1, + "signals": [ + { + "id": "LR4_SAE_DIST_WITH_MIL", + "path": "DTCs", + "fmt": { "len": 16, "max": 65535, "unit": "kilometers" }, + "name": "Distance with MIL on" + } + ] + }, { "hdr": "7DF", "cmd": {"01": "1F"}, @@ -135,70 +148,71 @@ }, { "hdr": "7DF", - "cmd": {"01": "5A"}, - "freq": 0.5, + "cmd": {"01": "33"}, + "freq": 1, "signals": [ { - "id": "LR4_SAE_REL_PEDAL", - "path": "Engine", - "fmt": { "len": 8, "max": 100, "mul": 0.3921568627, "unit": "percent" }, - "name": "Relative accelerator pedal position" + "id": "LR4_SAE_BARO", + "path": "Climate", + "fmt": { "len": 8, "max": 255, "unit": "kilopascals" }, + "name": "Barometric pressure" } ] }, { "hdr": "7DF", - "cmd": {"01": "4C"}, - "freq": 0.5, + "cmd": {"01": "42"}, + "freq": 1, "signals": [ { - "id": "LR4_SAE_CMD_THR_ACT", - "path": "Engine", - "fmt": { "len": 8, "max": 100, "mul": 0.3921568627, "unit": "percent" }, - "name": "Commanded throttle actuator" + "id": "LR4_SAE_VBAT", + "path": "Battery", + "fmt": { "len": 16, "max": 20, "mul": 0.001, "unit": "volts" }, + "name": "Control module voltage", + "suggestedMetric": "starterBatteryVoltage" } ] }, { "hdr": "7DF", - "cmd": {"01": "5C"}, + "cmd": {"01": "2E"}, "freq": 0.5, "signals": [ { - "id": "LR4_SAE_OILT", - "path": "Engine", - "fmt": { "len": 8, "min": -40, "max": 180, "add": -40, "unit": "celsius" }, - "name": "Engine oil temperature" + "id": "LR4_SAE_EVAP_CMD", + "path": "Fuel", + "fmt": { "len": 8, "max": 100, "mul": 0.3921568627, "unit": "percent" }, + "name": "Commanded evaporative purge" } ] }, { "hdr": "7DF", - "cmd": {"01": "33"}, - "freq": 1, + "cmd": {"01": "04"}, + "freq": 0.5, "signals": [ { - "id": "LR4_SAE_BARO", - "path": "Climate", - "fmt": { "len": 8, "max": 255, "unit": "kilopascals" }, - "name": "Barometric pressure" + "id": "LR4_SAE_LOAD_CALC", + "path": "Engine", + "fmt": { "len": 8, "max": 100, "mul": 0.3921568627, "unit": "percent" }, + "name": "Calculated engine load" } ] }, { "hdr": "7DF", - "cmd": {"01": "42"}, - "freq": 1, + "cmd": {"01": "0E"}, + "freq": 0.5, "signals": [ { - "id": "LR4_SAE_VBAT", - "path": "Battery", - "fmt": { "len": 16, "max": 20, "mul": 0.001, "unit": "volts" }, - "name": "Control module voltage", - "suggestedMetric": "starterBatteryVoltage" + "id": "LR4_SAE_SPARK_ADV", + "path": "Engine", + "fmt": { "len": 8, "min": -64, "max": 63.5, "mul": 0.5, "add": -64, "unit": "degrees" }, + "name": "Timing advance" } ] }, + { "hdr": "7E0", "rax": "7E8", @@ -220,10 +234,16 @@ "freq": 0.5, "signals": [ { - "id": "LR4_ENGINE_OIL_VOLUME", + "id": "LR4_ENGINE_OIL_VOLUME_L", "path": "Engine", "fmt": { "len": 8, "mul": 0.1, "min": 0, "max": 25.5, "unit": "liters" }, - "name": "AJ133 Engine Oil Volume" + "name": "Engine Oil Volume (L)" + }, + { + "id": "LR4_ENGINE_OIL_VOLUME_GAL", + "path": "Engine", + "fmt": { "len": 8, "mul": 0.0264172, "min": 0, "max": 6.74, "unit": "gallons" }, + "name": "Engine Oil Volume (gal)" } ] }, @@ -299,8 +319,107 @@ "path": "Engine", "fmt": { "len": 8, "min": 0, "max": 999, "unit": "celsius" }, "name": "AJ133 IAT2" + }, + { + "id": "LR4_IAT2_OFFSET", + "path": "Engine", + "fmt": { "len": 8, "min": -40, "max": 150, "add": -40, "unit": "celsius" }, + "name": "AJ133 IAT2 (offset)" + } + ] + }, + + { + "hdr": "7E0", + "rax": "7E8", + "cmd": {"01": "5E"}, + "freq": 1, + "signals": [ + { + "id": "LR4_SAE_FUEL_RATE_PHYS", + "path": "Fuel", + "fmt": { "len": 16, "max": 500, "mul": 0.05, "unit": "litersPerHour" }, + "name": "Engine fuel rate (ECM)" + } + ] + }, + + { + "hdr": "7E2", + "rax": "7EA", + "cmd": { "22": "F121" }, + "freq": 1, + "signals": [ + { + "id": "LR4_IC_ODOMETER_F121", + "path": "Movement", + "fmt": { "len": 24, "max": 2000000, "unit": "kilometers" }, + "name": "Odometer (F121)" + } + ] + }, + { + "hdr": "7E2", + "rax": "7EA", + "cmd": { "22": "F17C" }, + "freq": 0.5, + "signals": [ + { + "id": "LR4_IC_ODOMETER_F17C", + "path": "Movement", + "fmt": { "len": 32, "max": 2000000, "unit": "kilometers" }, + "name": "Odometer (F17C)" + } + ] + }, + { + "hdr": "7E2", + "rax": "7EA", + "cmd": { "22": "F18C" }, + "freq": 0.5, + "signals": [ + { + "id": "LR4_IC_ODOMETER_F18C", + "path": "Movement", + "fmt": { "len": 32, "max": 2000000, "unit": "kilometers" }, + "name": "Odometer (F18C)" } ] + }, + { + "hdr": "7E2", + "rax": "7EA", + "cmd": { "21": "A6" }, + "freq": 0.5, + "signals": [ + { + "id": "LR4_IC_ODOMETER_21A6", + "path": "Movement", + "fmt": { "len": 24, "max": 2000000, "unit": "kilometers" }, + "name": "Odometer (21A6)" + } + ] + }, + + { + "hdr": "7E2", + "rax": "7EA", + "cmd": { "22": "F172" }, + "freq": 0.5, + "signals": [ + { "id": "LR4_IC_ALT_F172_RAW", "path": "Climate", "fmt": { "len": 16, "max": 20000, "unit": "unitless" }, "name": "Altitude (IC F172 raw)" }, + { "id": "LR4_IC_ALT_F172_FT2M", "path": "Climate", "fmt": { "len": 16, "mul": 0.3048, "max": 9000, "unit": "meters" }, "name": "Altitude (IC F172 feet→m)" } + ] + }, + { + "hdr": "7E5", + "rax": "7ED", + "cmd": { "22": "F172" }, + "freq": 0.5, + "signals": [ + { "id": "LR4_NAV_ALT_F172_RAW", "path": "Climate", "fmt": { "len": 16, "max": 20000, "unit": "unitless" }, "name": "Altitude (NAV F172 raw)" }, + { "id": "LR4_NAV_ALT_F172_FT2M", "path": "Climate", "fmt": { "len": 16, "mul": 0.3048, "max": 9000, "unit": "meters" }, "name": "Altitude (NAV F172 feet→m)" } + ] } ] } From 93298489a0fa1d32b56244cacd0a6dd174dba8eb Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 24 Aug 2025 10:28:11 -0600 Subject: [PATCH 21/84] cleanup --- signalsets/v3/default.json | 117 ++----------------------------------- 1 file changed, 6 insertions(+), 111 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index e9c7c83..b88b278 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -223,7 +223,7 @@ "id": "LR4_ENGINE_OIL_TEMP", "path": "Engine", "fmt": { "len": 8, "add": -40, "min": -40, "max": 120, "unit": "celsius" }, - "name": "AJ133 Engine Oil Temp" + "name": "Engine Oil Temp (AJ133)" } ] }, @@ -233,17 +233,11 @@ "cmd": { "22": "03F2" }, "freq": 0.5, "signals": [ - { - "id": "LR4_ENGINE_OIL_VOLUME_L", - "path": "Engine", - "fmt": { "len": 8, "mul": 0.1, "min": 0, "max": 25.5, "unit": "liters" }, - "name": "Engine Oil Volume (L)" - }, { "id": "LR4_ENGINE_OIL_VOLUME_GAL", "path": "Engine", "fmt": { "len": 8, "mul": 0.0264172, "min": 0, "max": 6.74, "unit": "gallons" }, - "name": "Engine Oil Volume (gal)" + "name": "Engine Oil Volume" } ] }, @@ -255,9 +249,9 @@ "signals": [ { "id": "LR4_GEARBOX_OIL_TEMP", - "path": "Transmission", + "path": "Drivetrain", "fmt": { "len": 8, "add": -40, "min": -40, "max": 120, "unit": "celsius" }, - "name": "AJ133 Gearbox Temp" + "name": "Gearbox Temp (AJ133)" } ] }, @@ -299,12 +293,6 @@ "path": "Engine", "fmt": { "len": 8, "min": 0, "max": 255, "unit": "kilopascals" }, "name": "Engine Boost" - }, - { - "id": "LR4_ECU_033E_UPTIME_S", - "path": "Diagnostics", - "fmt": { "len": 16, "max": 65535, "unit": "seconds" }, - "name": "ECU uptime (candidate)" } ] }, @@ -318,108 +306,15 @@ "id": "LR4_IAT2", "path": "Engine", "fmt": { "len": 8, "min": 0, "max": 999, "unit": "celsius" }, - "name": "AJ133 IAT2" + "name": "IAT2" }, { "id": "LR4_IAT2_OFFSET", "path": "Engine", "fmt": { "len": 8, "min": -40, "max": 150, "add": -40, "unit": "celsius" }, - "name": "AJ133 IAT2 (offset)" - } - ] - }, - - { - "hdr": "7E0", - "rax": "7E8", - "cmd": {"01": "5E"}, - "freq": 1, - "signals": [ - { - "id": "LR4_SAE_FUEL_RATE_PHYS", - "path": "Fuel", - "fmt": { "len": 16, "max": 500, "mul": 0.05, "unit": "litersPerHour" }, - "name": "Engine fuel rate (ECM)" - } - ] - }, - - { - "hdr": "7E2", - "rax": "7EA", - "cmd": { "22": "F121" }, - "freq": 1, - "signals": [ - { - "id": "LR4_IC_ODOMETER_F121", - "path": "Movement", - "fmt": { "len": 24, "max": 2000000, "unit": "kilometers" }, - "name": "Odometer (F121)" - } - ] - }, - { - "hdr": "7E2", - "rax": "7EA", - "cmd": { "22": "F17C" }, - "freq": 0.5, - "signals": [ - { - "id": "LR4_IC_ODOMETER_F17C", - "path": "Movement", - "fmt": { "len": 32, "max": 2000000, "unit": "kilometers" }, - "name": "Odometer (F17C)" - } - ] - }, - { - "hdr": "7E2", - "rax": "7EA", - "cmd": { "22": "F18C" }, - "freq": 0.5, - "signals": [ - { - "id": "LR4_IC_ODOMETER_F18C", - "path": "Movement", - "fmt": { "len": 32, "max": 2000000, "unit": "kilometers" }, - "name": "Odometer (F18C)" + "name": "IAT2 (offset)" } ] - }, - { - "hdr": "7E2", - "rax": "7EA", - "cmd": { "21": "A6" }, - "freq": 0.5, - "signals": [ - { - "id": "LR4_IC_ODOMETER_21A6", - "path": "Movement", - "fmt": { "len": 24, "max": 2000000, "unit": "kilometers" }, - "name": "Odometer (21A6)" - } - ] - }, - - { - "hdr": "7E2", - "rax": "7EA", - "cmd": { "22": "F172" }, - "freq": 0.5, - "signals": [ - { "id": "LR4_IC_ALT_F172_RAW", "path": "Climate", "fmt": { "len": 16, "max": 20000, "unit": "unitless" }, "name": "Altitude (IC F172 raw)" }, - { "id": "LR4_IC_ALT_F172_FT2M", "path": "Climate", "fmt": { "len": 16, "mul": 0.3048, "max": 9000, "unit": "meters" }, "name": "Altitude (IC F172 feet→m)" } - ] - }, - { - "hdr": "7E5", - "rax": "7ED", - "cmd": { "22": "F172" }, - "freq": 0.5, - "signals": [ - { "id": "LR4_NAV_ALT_F172_RAW", "path": "Climate", "fmt": { "len": 16, "max": 20000, "unit": "unitless" }, "name": "Altitude (NAV F172 raw)" }, - { "id": "LR4_NAV_ALT_F172_FT2M", "path": "Climate", "fmt": { "len": 16, "mul": 0.3048, "max": 9000, "unit": "meters" }, "name": "Altitude (NAV F172 feet→m)" } - ] } ] } From a123f521f16c483d81dafb9702cee3a63fa547d0 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 24 Aug 2025 10:31:51 -0600 Subject: [PATCH 22/84] baro calculated altitutde --- signalsets/v3/default.json | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index b88b278..53610f9 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -159,6 +159,32 @@ } ] }, + { + "hdr": "7DF", + "cmd": {"01": "33"}, + "freq": 1, + "signals": [ + { + "id": "LR4_ALT_FROM_BARO_M", + "path": "Climate", + "fmt": { "len": 8, "min": -500, "max": 9000, "mul": -84, "add": 8511.3, "unit": "meters" }, + "name": "Altitude (from BARO, m)" + } + ] + }, + { + "hdr": "7DF", + "cmd": {"01": "33"}, + "freq": 1, + "signals": [ + { + "id": "LR4_ALT_FROM_BARO_FT", + "path": "Climate", + "fmt": { "len": 8, "min": -1500, "max": 30000, "mul": -275.6, "add": 27931, "unit": "feet" }, + "name": "Altitude (from BARO, ft)" + } + ] + }, { "hdr": "7DF", "cmd": {"01": "42"}, From c23cffd089fdc3fceb2daa00d440180e81422b15 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 24 Aug 2025 10:36:33 -0600 Subject: [PATCH 23/84] do you only let me use a pid once? --- signalsets/v3/default.json | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 53610f9..d8b3971 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -146,32 +146,6 @@ } ] }, - { - "hdr": "7DF", - "cmd": {"01": "33"}, - "freq": 1, - "signals": [ - { - "id": "LR4_SAE_BARO", - "path": "Climate", - "fmt": { "len": 8, "max": 255, "unit": "kilopascals" }, - "name": "Barometric pressure" - } - ] - }, - { - "hdr": "7DF", - "cmd": {"01": "33"}, - "freq": 1, - "signals": [ - { - "id": "LR4_ALT_FROM_BARO_M", - "path": "Climate", - "fmt": { "len": 8, "min": -500, "max": 9000, "mul": -84, "add": 8511.3, "unit": "meters" }, - "name": "Altitude (from BARO, m)" - } - ] - }, { "hdr": "7DF", "cmd": {"01": "33"}, From a03ca23554ead9bb7a1d05107a78ad51956b2946 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 24 Aug 2025 10:37:49 -0600 Subject: [PATCH 24/84] meters? --- signalsets/v3/default.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index d8b3971..613f27d 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -152,10 +152,10 @@ "freq": 1, "signals": [ { - "id": "LR4_ALT_FROM_BARO_FT", + "id": "LR4_ALT_FROM_BARO_M", "path": "Climate", - "fmt": { "len": 8, "min": -1500, "max": 30000, "mul": -275.6, "add": 27931, "unit": "feet" }, - "name": "Altitude (from BARO, ft)" + "fmt": { "len": 8, "min": -500, "max": 9000, "mul": -84, "add": 8511.3, "unit": "meters" }, + "name": "Altitude (from BARO, m)" } ] }, From b04070602b0a88e743661723c12706a97a9aa104 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 24 Aug 2025 10:39:58 -0600 Subject: [PATCH 25/84] can i make you show feet? --- signalsets/v3/default.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 613f27d..97dd54c 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -152,13 +152,13 @@ "freq": 1, "signals": [ { - "id": "LR4_ALT_FROM_BARO_M", + "id": "LR4_ALT_FROM_BARO_FT", "path": "Climate", - "fmt": { "len": 8, "min": -500, "max": 9000, "mul": -84, "add": 8511.3, "unit": "meters" }, - "name": "Altitude (from BARO, m)" + "fmt": { "len": 8, "min": -1500, "max": 30000, "mul": -275.6, "add": 27931, "unit": "feet" }, + "name": "Altitude (ft)" } ] - }, + } { "hdr": "7DF", "cmd": {"01": "42"}, From 5a658669eaefd18e562670efa77831c1070e82aa Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 24 Aug 2025 10:41:11 -0600 Subject: [PATCH 26/84] boop --- signalsets/v3/default.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 97dd54c..d8b3971 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -155,10 +155,10 @@ "id": "LR4_ALT_FROM_BARO_FT", "path": "Climate", "fmt": { "len": 8, "min": -1500, "max": 30000, "mul": -275.6, "add": 27931, "unit": "feet" }, - "name": "Altitude (ft)" + "name": "Altitude (from BARO, ft)" } ] - } + }, { "hdr": "7DF", "cmd": {"01": "42"}, From d6d8e384824520fecbccecd5d28d835d9a8027e0 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 24 Aug 2025 10:42:06 -0600 Subject: [PATCH 27/84] unitless --- signalsets/v3/default.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index d8b3971..2d3699e 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -152,10 +152,10 @@ "freq": 1, "signals": [ { - "id": "LR4_ALT_FROM_BARO_FT", + "id": "LR4_ALT_FROM_BARO_FT_RAW", "path": "Climate", - "fmt": { "len": 8, "min": -1500, "max": 30000, "mul": -275.6, "add": 27931, "unit": "feet" }, - "name": "Altitude (from BARO, ft)" + "fmt": { "len": 8, "min": -1500, "max": 30000, "mul": -275.6, "add": 27931, "unit": "unitless" }, + "name": "Altitude (ft)" } ] }, From 2fd984c5944c477334ef9320ca33bf8659164657 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 24 Aug 2025 10:44:46 -0600 Subject: [PATCH 28/84] adjust offset --- signalsets/v3/default.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 2d3699e..7e72363 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -154,7 +154,7 @@ { "id": "LR4_ALT_FROM_BARO_FT_RAW", "path": "Climate", - "fmt": { "len": 8, "min": -1500, "max": 30000, "mul": -275.6, "add": 27931, "unit": "unitless" }, + "fmt": { "len": 8, "min": -1500, "max": 30000, "mul": -275.6, "add": 28531, "unit": "unitless" }, "name": "Altitude (ft)" } ] From aef51394f241c515466d02fa7969077b024a4567 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Mon, 25 Aug 2025 10:13:03 -0600 Subject: [PATCH 29/84] iid log pids --- signalsets/v3/default.json | 517 ++++++++++++++++--------------------- 1 file changed, 222 insertions(+), 295 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 7e72363..c9e91ce 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -1,320 +1,247 @@ { "commands": [ - { - "hdr": "7DF", - "cmd": {"01": "0D"}, - "freq": 0.25, - "signals": [ - { - "id": "LR4_SAE_SPEED", - "path": "Movement", + { "hdr": "7DF", "cmd": {"01": "0D"}, "freq": 0.25, + "signals": [ + { "id": "LR4_SAE_SPEED", "path": "Movement", "fmt": { "len": 8, "max": 300, "unit": "kilometersPerHour" }, - "name": "Vehicle speed", - "suggestedMetric": "speed" - } - ] - }, - { - "hdr": "7DF", - "cmd": {"01": "0C"}, - "freq": 0.25, - "signals": [ - { - "id": "LR4_SAE_RPM", - "path": "Engine", + "name": "Vehicle speed", "suggestedMetric": "speed" } + ]}, + + { "hdr": "7DF", "cmd": {"01": "0C"}, "freq": 0.25, + "signals": [ + { "id": "LR4_SAE_RPM", "path": "Engine", "fmt": { "len": 16, "max": 8000, "mul": 0.25, "unit": "revolutionsPerMinute" }, - "name": "Engine speed" - } - ] - }, - { - "hdr": "7DF", - "cmd": {"01": "05"}, - "freq": 1, - "signals": [ - { - "id": "LR4_SAE_ECT", - "path": "Engine", + "name": "Engine speed" } + ]}, + + { "hdr": "7DF", "cmd": {"01": "05"}, "freq": 1, + "signals": [ + { "id": "LR4_SAE_ECT", "path": "Engine", "fmt": { "len": 8, "min": -40, "max": 150, "add": -40, "unit": "celsius" }, - "name": "Engine coolant temperature" - } - ] - }, - { - "hdr": "7DF", - "cmd": {"01": "0F"}, - "freq": 1, - "signals": [ - { - "id": "LR4_SAE_IAT", - "path": "Engine", + "name": "Engine coolant temperature" } + ]}, + + { "hdr": "7DF", "cmd": {"01": "0F"}, "freq": 1, + "signals": [ + { "id": "LR4_SAE_IAT", "path": "Engine", "fmt": { "len": 8, "min": -40, "max": 120, "add": -40, "unit": "celsius" }, - "name": "Intake air temperature" - } - ] - }, - { - "hdr": "7DF", - "cmd": {"01": "10"}, - "freq": 0.5, - "signals": [ - { - "id": "LR4_SAE_MAF", - "path": "Engine", + "name": "Intake air temperature" } + ]}, + + { "hdr": "7DF", "cmd": {"01": "10"}, "freq": 0.5, + "signals": [ + { "id": "LR4_SAE_MAF", "path": "Engine", "fmt": { "len": 16, "max": 655.35, "mul": 0.01, "unit": "gramsPerSecond" }, - "name": "Mass air flow" - } - ] - }, - { - "hdr": "7DF", - "cmd": {"01": "11"}, - "freq": 0.5, - "signals": [ - { - "id": "LR4_SAE_TPS", - "path": "Engine", + "name": "Mass air flow" } + ]}, + + { "hdr": "7DF", "cmd": {"01": "11"}, "freq": 0.5, + "signals": [ + { "id": "LR4_SAE_TPS", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 0.3921568627, "unit": "percent" }, - "name": "Throttle position" - } - ] - }, - { - "hdr": "7DF", - "cmd": {"01": "2F"}, - "freq": 1, - "signals": [ - { - "id": "LR4_SAE_FUEL", - "path": "Fuel", + "name": "Throttle position" } + ]}, + + { "hdr": "7DF", "cmd": {"01": "0B"}, "freq": 1, + "signals": [ + { "id": "LR4_SAE_MAP", "path": "Engine", + "fmt": { "len": 8, "max": 255, "unit": "kilopascals" }, + "name": "Intake manifold absolute pressure" } + ]}, + + { "hdr": "7DF", "cmd": {"01": "04"}, "freq": 0.5, + "signals": [ + { "id": "LR4_SAE_LOAD_CALC", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 0.3921568627, "unit": "percent" }, - "name": "Fuel level", - "suggestedMetric": "fuelTankLevel" - } - ] - }, - { - "hdr": "7DF", - "cmd": {"01": "31"}, - "freq": 1, - "signals": [ - { - "id": "LR4_SAE_DIST_SINCE_CLR", - "path": "DTCs", + "name": "Calculated engine load" } + ]}, + + { "hdr": "7DF", "cmd": {"01": "0E"}, "freq": 0.5, + "signals": [ + { "id": "LR4_SAE_SPARK_ADV", "path": "Engine", + "fmt": { "len": 8, "min": -64, "max": 63.5, "mul": 0.5, "add": -64, "unit": "degrees" }, + "name": "Timing advance" } + ]}, + + { "hdr": "7DF", "cmd": {"01": "2E"}, "freq": 0.5, + "signals": [ + { "id": "LR4_SAE_EVAP_CMD", "path": "Fuel", + "fmt": { "len": 8, "max": 100, "mul": 0.3921568627, "unit": "percent" }, + "name": "Commanded evaporative purge" } + ]}, + + { "hdr": "7DF", "cmd": {"01": "2F"}, "freq": 1, + "signals": [ + { "id": "LR4_SAE_FUEL", "path": "Fuel", + "fmt": { "len": 8, "max": 100, "mul": 0.3921568627, "unit": "percent" }, + "name": "Fuel level", "suggestedMetric": "fuelTankLevel" } + ]}, + + { "hdr": "7DF", "cmd": {"01": "06"}, "freq": 0.5, + "signals": [ + { "id": "LR4_SAE_STFT_B1", "path": "Fuel", + "fmt": { "len": 8, "min": -100, "max": 99.22, "mul": 0.78125, "add": -100, "unit": "percent" }, + "name": "Short term fuel trim (B1)" } + ]}, + + { "hdr": "7DF", "cmd": {"01": "07"}, "freq": 0.5, + "signals": [ + { "id": "LR4_SAE_LTFT_B1", "path": "Fuel", + "fmt": { "len": 8, "min": -100, "max": 99.22, "mul": 0.78125, "add": -100, "unit": "percent" }, + "name": "Long term fuel trim (B1)" } + ]}, + + { "hdr": "7DF", "cmd": {"01": "08"}, "freq": 0.5, + "signals": [ + { "id": "LR4_SAE_STFT_B2", "path": "Fuel", + "fmt": { "len": 8, "min": -100, "max": 99.22, "mul": 0.78125, "add": -100, "unit": "percent" }, + "name": "Short term fuel trim (B2)" } + ]}, + + { "hdr": "7DF", "cmd": {"01": "09"}, "freq": 0.5, + "signals": [ + { "id": "LR4_SAE_LTFT_B2", "path": "Fuel", + "fmt": { "len": 8, "min": -100, "max": 99.22, "mul": 0.78125, "add": -100, "unit": "percent" }, + "name": "Long term fuel trim (B2)" } + ]}, + + { "hdr": "7DF", "cmd": {"01": "30"}, "freq": 0.25, + "signals": [ + { "id": "LR4_SAE_WARMUPS", "path": "DTCs", + "fmt": { "len": 8, "max": 255, "unit": "unitless" }, + "name": "Warm-ups since DTC clear" } + ]}, + + { "hdr": "7DF", "cmd": {"01": "31"}, "freq": 1, + "signals": [ + { "id": "LR4_SAE_DIST_SINCE_CLR", "path": "DTCs", "fmt": { "len": 16, "max": 65535, "unit": "kilometers" }, - "name": "Distance since DTC clear", - "suggestedMetric": "distanceSinceDTCsCleared" - } - ] - }, - { - "hdr": "7DF", - "cmd": {"01": "21"}, - "freq": 1, - "signals": [ - { - "id": "LR4_SAE_DIST_WITH_MIL", - "path": "DTCs", + "name": "Distance since DTC clear", "suggestedMetric": "distanceSinceDTCsCleared" } + ]}, + + { "hdr": "7DF", "cmd": {"01": "21"}, "freq": 1, + "signals": [ + { "id": "LR4_SAE_DIST_WITH_MIL", "path": "DTCs", "fmt": { "len": 16, "max": 65535, "unit": "kilometers" }, - "name": "Distance with MIL on" - } - ] - }, - { - "hdr": "7DF", - "cmd": {"01": "1F"}, - "freq": 0.5, - "signals": [ - { - "id": "LR4_SAE_RUNTIME", - "path": "Engine", + "name": "Distance with MIL on" } + ]}, + + { "hdr": "7DF", "cmd": {"01": "1F"}, "freq": 0.5, + "signals": [ + { "id": "LR4_SAE_RUNTIME", "path": "Engine", "fmt": { "len": 16, "max": 65535, "unit": "seconds" }, - "name": "Run time since engine start" - } - ] - }, - { - "hdr": "7DF", - "cmd": {"01": "46"}, - "freq": 1, - "signals": [ - { - "id": "LR4_SAE_AAT", - "path": "Climate", + "name": "Run time since engine start" } + ]}, + + { "hdr": "7DF", "cmd": {"01": "46"}, "freq": 1, + "signals": [ + { "id": "LR4_SAE_AAT", "path": "Climate", "fmt": { "len": 8, "min": -60, "max": 80, "add": -40, "unit": "celsius" }, - "name": "Ambient air temperature" - } - ] - }, - { - "hdr": "7DF", - "cmd": {"01": "33"}, - "freq": 1, - "signals": [ - { - "id": "LR4_ALT_FROM_BARO_FT_RAW", - "path": "Climate", + "name": "Ambient air temperature" } + ]}, + + { "hdr": "7DF", "cmd": {"01": "33"}, "freq": 1, + "signals": [ + { "id": "LR4_ALT_FROM_BARO_FT_RAW", "path": "Climate", "fmt": { "len": 8, "min": -1500, "max": 30000, "mul": -275.6, "add": 28531, "unit": "unitless" }, - "name": "Altitude (ft)" - } - ] - }, - { - "hdr": "7DF", - "cmd": {"01": "42"}, - "freq": 1, - "signals": [ - { - "id": "LR4_SAE_VBAT", - "path": "Battery", + "name": "Altitude (ft)" } + ]}, + + { "hdr": "7DF", "cmd": {"01": "42"}, "freq": 1, + "signals": [ + { "id": "LR4_SAE_VBAT", "path": "Battery", "fmt": { "len": 16, "max": 20, "mul": 0.001, "unit": "volts" }, - "name": "Control module voltage", - "suggestedMetric": "starterBatteryVoltage" - } - ] - }, - { - "hdr": "7DF", - "cmd": {"01": "2E"}, - "freq": 0.5, - "signals": [ - { - "id": "LR4_SAE_EVAP_CMD", - "path": "Fuel", - "fmt": { "len": 8, "max": 100, "mul": 0.3921568627, "unit": "percent" }, - "name": "Commanded evaporative purge" - } - ] - }, - { - "hdr": "7DF", - "cmd": {"01": "04"}, - "freq": 0.5, - "signals": [ - { - "id": "LR4_SAE_LOAD_CALC", - "path": "Engine", - "fmt": { "len": 8, "max": 100, "mul": 0.3921568627, "unit": "percent" }, - "name": "Calculated engine load" - } - ] - }, - { - "hdr": "7DF", - "cmd": {"01": "0E"}, - "freq": 0.5, - "signals": [ - { - "id": "LR4_SAE_SPARK_ADV", - "path": "Engine", - "fmt": { "len": 8, "min": -64, "max": 63.5, "mul": 0.5, "add": -64, "unit": "degrees" }, - "name": "Timing advance" - } - ] - }, - - { - "hdr": "7E0", - "rax": "7E8", - "cmd": { "22": "03F3" }, - "freq": 0.5, - "signals": [ - { - "id": "LR4_ENGINE_OIL_TEMP", - "path": "Engine", + "name": "Control module voltage", "suggestedMetric": "starterBatteryVoltage" } + ]}, + + { "hdr": "7DF", "cmd": {"01": "34"}, "freq": 0.5, + "signals": [ + { "id": "LR4_SAE_LAMBDA_B1S1", "path": "Fuel", + "fmt": { "len": 16, "min": 0, "max": 2, "mul": 0.000030517578125, "unit": "lambda" }, + "name": "Equivalence ratio (B1S1)" } + ]}, + + { "hdr": "7DF", "cmd": {"01": "35"}, "freq": 0.5, + "signals": [ + { "id": "LR4_SAE_LAMBDA_B1S2", "path": "Fuel", + "fmt": { "len": 16, "min": 0, "max": 2, "mul": 0.000030517578125, "unit": "lambda" }, + "name": "Equivalence ratio (B1S2)" } + ]}, + + { "hdr": "7DF", "cmd": {"01": "36"}, "freq": 0.5, + "signals": [ + { "id": "LR4_SAE_LAMBDA_B2S1", "path": "Fuel", + "fmt": { "len": 16, "min": 0, "max": 2, "mul": 0.000030517578125, "unit": "lambda" }, + "name": "Equivalence ratio (B2S1)" } + ]}, + + { "hdr": "7DF", "cmd": {"01": "37"}, "freq": 0.5, + "signals": [ + { "id": "LR4_SAE_LAMBDA_B2S2", "path": "Fuel", + "fmt": { "len": 16, "min": 0, "max": 2, "mul": 0.000030517578125, "unit": "lambda" }, + "name": "Equivalence ratio (B2S2)" } + ]}, + + { "hdr": "7DF", "cmd": {"09": "02"}, "freq": 0.02, + "signals": [ + { "id": "LR4_VIN", "path": "Info", + "fmt": { "len": 136, "unit": "ascii" }, + "name": "VIN" } + ]}, + + { "hdr": "7E0", "rax": "7E8", "cmd": { "22": "03F3" }, "freq": 0.5, + "signals": [ + { "id": "LR4_ENGINE_OIL_TEMP", "path": "Engine", "fmt": { "len": 8, "add": -40, "min": -40, "max": 120, "unit": "celsius" }, - "name": "Engine Oil Temp (AJ133)" - } - ] - }, - { - "hdr": "7E0", - "rax": "7E8", - "cmd": { "22": "03F2" }, - "freq": 0.5, - "signals": [ - { - "id": "LR4_ENGINE_OIL_VOLUME_GAL", - "path": "Engine", + "name": "Engine Oil Temp (AJ133)" } + ]}, + + { "hdr": "7E0", "rax": "7E8", "cmd": { "22": "03F2" }, "freq": 0.5, + "signals": [ + { "id": "LR4_ENGINE_OIL_VOLUME_GAL", "path": "Engine", "fmt": { "len": 8, "mul": 0.0264172, "min": 0, "max": 6.74, "unit": "gallons" }, - "name": "Engine Oil Volume" - } - ] - }, - { - "hdr": "7E1", - "rax": "7E9", - "cmd": { "22": "1E69" }, - "freq": 0.5, - "signals": [ - { - "id": "LR4_GEARBOX_OIL_TEMP", - "path": "Drivetrain", + "name": "Engine Oil Volume" } + ]}, + + { "hdr": "7E1", "rax": "7E9", "cmd": { "22": "1E69" }, "freq": 0.5, + "signals": [ + { "id": "LR4_GEARBOX_OIL_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "add": -40, "min": -40, "max": 120, "unit": "celsius" }, - "name": "Gearbox Temp (AJ133)" - } - ] - }, - { - "hdr": "795", - "cmd": { "22": "1E8A" }, - "freq": 0.5, - "signals": [ - { - "id": "LR4_REAR_DIFF_TEMP", - "path": "Drivetrain", + "name": "Gearbox Temp (AJ133)" } + ]}, + + { "hdr": "795", "cmd": { "22": "1E8A" }, "freq": 0.5, + "signals": [ + { "id": "LR4_REAR_DIFF_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "add": -40, "min": -40, "max": 150, "unit": "celsius" }, - "name": "Locking Diff Oil Temp" - } - ] - }, - { - "hdr": "7E0", - "rax": "7E8", - "cmd": { "22": "03E6" }, - "freq": 0.5, - "signals": [ - { - "id": "LR4_MEASURED_OIL_LEVEL", - "path": "Engine", + "name": "Locking Diff Oil Temp" } + ]}, + + { "hdr": "7E0", "rax": "7E8", "cmd": { "22": "03E6" }, "freq": 0.5, + "signals": [ + { "id": "LR4_MEASURED_OIL_LEVEL", "path": "Engine", "fmt": { "len": 8, "min": 0, "max": 255, "unit": "millimeters" }, - "name": "Oil Level" - } - ] - }, - { - "hdr": "7E0", - "rax": "7E8", - "cmd": { "22": "033E" }, - "freq": 0.5, - "signals": [ - { - "id": "LR4_BOOST", - "path": "Engine", + "name": "Oil Level" } + ]}, + + { "hdr": "7E0", "rax": "7E8", "cmd": { "22": "033E" }, "freq": 0.5, + "signals": [ + { "id": "LR4_BOOST", "path": "Engine", "fmt": { "len": 8, "min": 0, "max": 255, "unit": "kilopascals" }, - "name": "Engine Boost" - } - ] - }, - { - "hdr": "7E0", - "rax": "7E8", - "cmd": { "22": "0520" }, - "freq": 0.5, - "signals": [ - { - "id": "LR4_IAT2", - "path": "Engine", + "name": "Engine Boost" }, + { "id": "LR4_ECU_033E_UPTIME_S", "path": "Diagnostics", + "fmt": { "len": 16, "max": 65535, "unit": "seconds" }, + "name": "ECU uptime (033E)" } + ]}, + + { "hdr": "7E0", "rax": "7E8", "cmd": { "22": "0520" }, "freq": 0.5, + "signals": [ + { "id": "LR4_IAT2", "path": "Engine", "fmt": { "len": 8, "min": 0, "max": 999, "unit": "celsius" }, - "name": "IAT2" - }, - { - "id": "LR4_IAT2_OFFSET", - "path": "Engine", + "name": "IAT2" }, + { "id": "LR4_IAT2_OFFSET", "path": "Engine", "fmt": { "len": 8, "min": -40, "max": 150, "add": -40, "unit": "celsius" }, - "name": "IAT2 (offset)" - } - ] - } + "name": "IAT2 (offset)" } + ]} ] } From a0bfb0292df1bb2e53e98ba6696e80797f942a46 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Mon, 25 Aug 2025 14:02:49 -0600 Subject: [PATCH 30/84] fix units --- signalsets/v3/default.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index c9e91ce..4bfec59 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -10,7 +10,7 @@ { "hdr": "7DF", "cmd": {"01": "0C"}, "freq": 0.25, "signals": [ { "id": "LR4_SAE_RPM", "path": "Engine", - "fmt": { "len": 16, "max": 8000, "mul": 0.25, "unit": "revolutionsPerMinute" }, + "fmt": { "len": 16, "max": 8000, "mul": 0.25, "unit": "rpm" }, "name": "Engine speed" } ]}, @@ -45,7 +45,7 @@ { "hdr": "7DF", "cmd": {"01": "0B"}, "freq": 1, "signals": [ { "id": "LR4_SAE_MAP", "path": "Engine", - "fmt": { "len": 8, "max": 255, "unit": "kilopascals" }, + "fmt": { "len": 8, "max": 255, "unit": "kilopascal" }, "name": "Intake manifold absolute pressure" } ]}, @@ -108,7 +108,7 @@ { "hdr": "7DF", "cmd": {"01": "30"}, "freq": 0.25, "signals": [ { "id": "LR4_SAE_WARMUPS", "path": "DTCs", - "fmt": { "len": 8, "max": 255, "unit": "unitless" }, + "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "Warm-ups since DTC clear" } ]}, @@ -143,7 +143,7 @@ { "hdr": "7DF", "cmd": {"01": "33"}, "freq": 1, "signals": [ { "id": "LR4_ALT_FROM_BARO_FT_RAW", "path": "Climate", - "fmt": { "len": 8, "min": -1500, "max": 30000, "mul": -275.6, "add": 28531, "unit": "unitless" }, + "fmt": { "len": 8, "min": -1500, "max": 30000, "mul": -275.6, "add": 28531, "unit": "scalar" }, "name": "Altitude (ft)" } ]}, @@ -157,28 +157,28 @@ { "hdr": "7DF", "cmd": {"01": "34"}, "freq": 0.5, "signals": [ { "id": "LR4_SAE_LAMBDA_B1S1", "path": "Fuel", - "fmt": { "len": 16, "min": 0, "max": 2, "mul": 0.000030517578125, "unit": "lambda" }, + "fmt": { "len": 16, "min": 0, "max": 2, "mul": 0.000030517578125, "unit": "normal" }, "name": "Equivalence ratio (B1S1)" } ]}, { "hdr": "7DF", "cmd": {"01": "35"}, "freq": 0.5, "signals": [ { "id": "LR4_SAE_LAMBDA_B1S2", "path": "Fuel", - "fmt": { "len": 16, "min": 0, "max": 2, "mul": 0.000030517578125, "unit": "lambda" }, + "fmt": { "len": 16, "min": 0, "max": 2, "mul": 0.000030517578125, "unit": "normal" }, "name": "Equivalence ratio (B1S2)" } ]}, { "hdr": "7DF", "cmd": {"01": "36"}, "freq": 0.5, "signals": [ { "id": "LR4_SAE_LAMBDA_B2S1", "path": "Fuel", - "fmt": { "len": 16, "min": 0, "max": 2, "mul": 0.000030517578125, "unit": "lambda" }, + "fmt": { "len": 16, "min": 0, "max": 2, "mul": 0.000030517578125, "unit": "normal" }, "name": "Equivalence ratio (B2S1)" } ]}, { "hdr": "7DF", "cmd": {"01": "37"}, "freq": 0.5, "signals": [ { "id": "LR4_SAE_LAMBDA_B2S2", "path": "Fuel", - "fmt": { "len": 16, "min": 0, "max": 2, "mul": 0.000030517578125, "unit": "lambda" }, + "fmt": { "len": 16, "min": 0, "max": 2, "mul": 0.000030517578125, "unit": "normal" }, "name": "Equivalence ratio (B2S2)" } ]}, @@ -227,7 +227,7 @@ { "hdr": "7E0", "rax": "7E8", "cmd": { "22": "033E" }, "freq": 0.5, "signals": [ { "id": "LR4_BOOST", "path": "Engine", - "fmt": { "len": 8, "min": 0, "max": 255, "unit": "kilopascals" }, + "fmt": { "len": 8, "min": 0, "max": 255, "unit": "kilopascal" }, "name": "Engine Boost" }, { "id": "LR4_ECU_033E_UPTIME_S", "path": "Diagnostics", "fmt": { "len": 16, "max": 65535, "unit": "seconds" }, From 60a35013a03bf6cc70862482642032f54dbcd0a9 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Mon, 25 Aug 2025 14:11:49 -0600 Subject: [PATCH 31/84] parsing error --- signalsets/v3/default.json | 45 +++++--------------------------------- 1 file changed, 5 insertions(+), 40 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 4bfec59..5337cb5 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -10,7 +10,7 @@ { "hdr": "7DF", "cmd": {"01": "0C"}, "freq": 0.25, "signals": [ { "id": "LR4_SAE_RPM", "path": "Engine", - "fmt": { "len": 16, "max": 8000, "mul": 0.25, "unit": "rpm" }, + "fmt": { "len": 16, "max": 8000, "mul": 0.25, "unit": "revolutionsPerMinute" }, "name": "Engine speed" } ]}, @@ -45,7 +45,7 @@ { "hdr": "7DF", "cmd": {"01": "0B"}, "freq": 1, "signals": [ { "id": "LR4_SAE_MAP", "path": "Engine", - "fmt": { "len": 8, "max": 255, "unit": "kilopascal" }, + "fmt": { "len": 8, "max": 255, "unit": "kilopascals" }, "name": "Intake manifold absolute pressure" } ]}, @@ -108,7 +108,7 @@ { "hdr": "7DF", "cmd": {"01": "30"}, "freq": 0.25, "signals": [ { "id": "LR4_SAE_WARMUPS", "path": "DTCs", - "fmt": { "len": 8, "max": 255, "unit": "scalar" }, + "fmt": { "len": 8, "max": 255, "unit": "unitless" }, "name": "Warm-ups since DTC clear" } ]}, @@ -143,7 +143,7 @@ { "hdr": "7DF", "cmd": {"01": "33"}, "freq": 1, "signals": [ { "id": "LR4_ALT_FROM_BARO_FT_RAW", "path": "Climate", - "fmt": { "len": 8, "min": -1500, "max": 30000, "mul": -275.6, "add": 28531, "unit": "scalar" }, + "fmt": { "len": 8, "min": -1500, "max": 30000, "mul": -275.6, "add": 28531, "unit": "unitless" }, "name": "Altitude (ft)" } ]}, @@ -154,41 +154,6 @@ "name": "Control module voltage", "suggestedMetric": "starterBatteryVoltage" } ]}, - { "hdr": "7DF", "cmd": {"01": "34"}, "freq": 0.5, - "signals": [ - { "id": "LR4_SAE_LAMBDA_B1S1", "path": "Fuel", - "fmt": { "len": 16, "min": 0, "max": 2, "mul": 0.000030517578125, "unit": "normal" }, - "name": "Equivalence ratio (B1S1)" } - ]}, - - { "hdr": "7DF", "cmd": {"01": "35"}, "freq": 0.5, - "signals": [ - { "id": "LR4_SAE_LAMBDA_B1S2", "path": "Fuel", - "fmt": { "len": 16, "min": 0, "max": 2, "mul": 0.000030517578125, "unit": "normal" }, - "name": "Equivalence ratio (B1S2)" } - ]}, - - { "hdr": "7DF", "cmd": {"01": "36"}, "freq": 0.5, - "signals": [ - { "id": "LR4_SAE_LAMBDA_B2S1", "path": "Fuel", - "fmt": { "len": 16, "min": 0, "max": 2, "mul": 0.000030517578125, "unit": "normal" }, - "name": "Equivalence ratio (B2S1)" } - ]}, - - { "hdr": "7DF", "cmd": {"01": "37"}, "freq": 0.5, - "signals": [ - { "id": "LR4_SAE_LAMBDA_B2S2", "path": "Fuel", - "fmt": { "len": 16, "min": 0, "max": 2, "mul": 0.000030517578125, "unit": "normal" }, - "name": "Equivalence ratio (B2S2)" } - ]}, - - { "hdr": "7DF", "cmd": {"09": "02"}, "freq": 0.02, - "signals": [ - { "id": "LR4_VIN", "path": "Info", - "fmt": { "len": 136, "unit": "ascii" }, - "name": "VIN" } - ]}, - { "hdr": "7E0", "rax": "7E8", "cmd": { "22": "03F3" }, "freq": 0.5, "signals": [ { "id": "LR4_ENGINE_OIL_TEMP", "path": "Engine", @@ -227,7 +192,7 @@ { "hdr": "7E0", "rax": "7E8", "cmd": { "22": "033E" }, "freq": 0.5, "signals": [ { "id": "LR4_BOOST", "path": "Engine", - "fmt": { "len": 8, "min": 0, "max": 255, "unit": "kilopascal" }, + "fmt": { "len": 8, "min": 0, "max": 255, "unit": "kilopascals" }, "name": "Engine Boost" }, { "id": "LR4_ECU_033E_UPTIME_S", "path": "Diagnostics", "fmt": { "len": 16, "max": 65535, "unit": "seconds" }, From b5289e2eb5c92c3bb0b7d11e42bb865aa6e73d5b Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sat, 4 Oct 2025 14:06:21 -0500 Subject: [PATCH 32/84] remove now onboarded and working pids --- signalsets/v3/default.json | 195 +++---------------------------------- 1 file changed, 11 insertions(+), 184 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 5337cb5..f778a1a 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -1,212 +1,39 @@ { "commands": [ - { "hdr": "7DF", "cmd": {"01": "0D"}, "freq": 0.25, - "signals": [ - { "id": "LR4_SAE_SPEED", "path": "Movement", - "fmt": { "len": 8, "max": 300, "unit": "kilometersPerHour" }, - "name": "Vehicle speed", "suggestedMetric": "speed" } - ]}, - - { "hdr": "7DF", "cmd": {"01": "0C"}, "freq": 0.25, - "signals": [ - { "id": "LR4_SAE_RPM", "path": "Engine", - "fmt": { "len": 16, "max": 8000, "mul": 0.25, "unit": "revolutionsPerMinute" }, - "name": "Engine speed" } - ]}, - - { "hdr": "7DF", "cmd": {"01": "05"}, "freq": 1, - "signals": [ - { "id": "LR4_SAE_ECT", "path": "Engine", - "fmt": { "len": 8, "min": -40, "max": 150, "add": -40, "unit": "celsius" }, - "name": "Engine coolant temperature" } - ]}, - - { "hdr": "7DF", "cmd": {"01": "0F"}, "freq": 1, - "signals": [ - { "id": "LR4_SAE_IAT", "path": "Engine", - "fmt": { "len": 8, "min": -40, "max": 120, "add": -40, "unit": "celsius" }, - "name": "Intake air temperature" } - ]}, - - { "hdr": "7DF", "cmd": {"01": "10"}, "freq": 0.5, - "signals": [ - { "id": "LR4_SAE_MAF", "path": "Engine", - "fmt": { "len": 16, "max": 655.35, "mul": 0.01, "unit": "gramsPerSecond" }, - "name": "Mass air flow" } - ]}, - - { "hdr": "7DF", "cmd": {"01": "11"}, "freq": 0.5, - "signals": [ - { "id": "LR4_SAE_TPS", "path": "Engine", - "fmt": { "len": 8, "max": 100, "mul": 0.3921568627, "unit": "percent" }, - "name": "Throttle position" } - ]}, - - { "hdr": "7DF", "cmd": {"01": "0B"}, "freq": 1, - "signals": [ - { "id": "LR4_SAE_MAP", "path": "Engine", - "fmt": { "len": 8, "max": 255, "unit": "kilopascals" }, - "name": "Intake manifold absolute pressure" } - ]}, - - { "hdr": "7DF", "cmd": {"01": "04"}, "freq": 0.5, - "signals": [ - { "id": "LR4_SAE_LOAD_CALC", "path": "Engine", - "fmt": { "len": 8, "max": 100, "mul": 0.3921568627, "unit": "percent" }, - "name": "Calculated engine load" } - ]}, - - { "hdr": "7DF", "cmd": {"01": "0E"}, "freq": 0.5, - "signals": [ - { "id": "LR4_SAE_SPARK_ADV", "path": "Engine", - "fmt": { "len": 8, "min": -64, "max": 63.5, "mul": 0.5, "add": -64, "unit": "degrees" }, - "name": "Timing advance" } - ]}, - - { "hdr": "7DF", "cmd": {"01": "2E"}, "freq": 0.5, - "signals": [ - { "id": "LR4_SAE_EVAP_CMD", "path": "Fuel", - "fmt": { "len": 8, "max": 100, "mul": 0.3921568627, "unit": "percent" }, - "name": "Commanded evaporative purge" } - ]}, - - { "hdr": "7DF", "cmd": {"01": "2F"}, "freq": 1, - "signals": [ - { "id": "LR4_SAE_FUEL", "path": "Fuel", - "fmt": { "len": 8, "max": 100, "mul": 0.3921568627, "unit": "percent" }, - "name": "Fuel level", "suggestedMetric": "fuelTankLevel" } - ]}, - - { "hdr": "7DF", "cmd": {"01": "06"}, "freq": 0.5, - "signals": [ - { "id": "LR4_SAE_STFT_B1", "path": "Fuel", - "fmt": { "len": 8, "min": -100, "max": 99.22, "mul": 0.78125, "add": -100, "unit": "percent" }, - "name": "Short term fuel trim (B1)" } - ]}, - - { "hdr": "7DF", "cmd": {"01": "07"}, "freq": 0.5, - "signals": [ - { "id": "LR4_SAE_LTFT_B1", "path": "Fuel", - "fmt": { "len": 8, "min": -100, "max": 99.22, "mul": 0.78125, "add": -100, "unit": "percent" }, - "name": "Long term fuel trim (B1)" } - ]}, - - { "hdr": "7DF", "cmd": {"01": "08"}, "freq": 0.5, - "signals": [ - { "id": "LR4_SAE_STFT_B2", "path": "Fuel", - "fmt": { "len": 8, "min": -100, "max": 99.22, "mul": 0.78125, "add": -100, "unit": "percent" }, - "name": "Short term fuel trim (B2)" } - ]}, - - { "hdr": "7DF", "cmd": {"01": "09"}, "freq": 0.5, - "signals": [ - { "id": "LR4_SAE_LTFT_B2", "path": "Fuel", - "fmt": { "len": 8, "min": -100, "max": 99.22, "mul": 0.78125, "add": -100, "unit": "percent" }, - "name": "Long term fuel trim (B2)" } - ]}, - - { "hdr": "7DF", "cmd": {"01": "30"}, "freq": 0.25, - "signals": [ - { "id": "LR4_SAE_WARMUPS", "path": "DTCs", - "fmt": { "len": 8, "max": 255, "unit": "unitless" }, - "name": "Warm-ups since DTC clear" } - ]}, - - { "hdr": "7DF", "cmd": {"01": "31"}, "freq": 1, - "signals": [ - { "id": "LR4_SAE_DIST_SINCE_CLR", "path": "DTCs", - "fmt": { "len": 16, "max": 65535, "unit": "kilometers" }, - "name": "Distance since DTC clear", "suggestedMetric": "distanceSinceDTCsCleared" } - ]}, - - { "hdr": "7DF", "cmd": {"01": "21"}, "freq": 1, - "signals": [ - { "id": "LR4_SAE_DIST_WITH_MIL", "path": "DTCs", - "fmt": { "len": 16, "max": 65535, "unit": "kilometers" }, - "name": "Distance with MIL on" } - ]}, - - { "hdr": "7DF", "cmd": {"01": "1F"}, "freq": 0.5, - "signals": [ - { "id": "LR4_SAE_RUNTIME", "path": "Engine", - "fmt": { "len": 16, "max": 65535, "unit": "seconds" }, - "name": "Run time since engine start" } - ]}, - - { "hdr": "7DF", "cmd": {"01": "46"}, "freq": 1, - "signals": [ - { "id": "LR4_SAE_AAT", "path": "Climate", - "fmt": { "len": 8, "min": -60, "max": 80, "add": -40, "unit": "celsius" }, - "name": "Ambient air temperature" } - ]}, - - { "hdr": "7DF", "cmd": {"01": "33"}, "freq": 1, - "signals": [ - { "id": "LR4_ALT_FROM_BARO_FT_RAW", "path": "Climate", - "fmt": { "len": 8, "min": -1500, "max": 30000, "mul": -275.6, "add": 28531, "unit": "unitless" }, - "name": "Altitude (ft)" } - ]}, - - { "hdr": "7DF", "cmd": {"01": "42"}, "freq": 1, - "signals": [ - { "id": "LR4_SAE_VBAT", "path": "Battery", - "fmt": { "len": 16, "max": 20, "mul": 0.001, "unit": "volts" }, - "name": "Control module voltage", "suggestedMetric": "starterBatteryVoltage" } - ]}, - { "hdr": "7E0", "rax": "7E8", "cmd": { "22": "03F3" }, "freq": 0.5, "signals": [ { "id": "LR4_ENGINE_OIL_TEMP", "path": "Engine", "fmt": { "len": 8, "add": -40, "min": -40, "max": 120, "unit": "celsius" }, - "name": "Engine Oil Temp (AJ133)" } + "name": "Oil Temp" } ]}, { "hdr": "7E0", "rax": "7E8", "cmd": { "22": "03F2" }, "freq": 0.5, "signals": [ { "id": "LR4_ENGINE_OIL_VOLUME_GAL", "path": "Engine", "fmt": { "len": 8, "mul": 0.0264172, "min": 0, "max": 6.74, "unit": "gallons" }, - "name": "Engine Oil Volume" } - ]}, - + "name": "Oil Volume" } + ] + }, { "hdr": "7E1", "rax": "7E9", "cmd": { "22": "1E69" }, "freq": 0.5, "signals": [ { "id": "LR4_GEARBOX_OIL_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "add": -40, "min": -40, "max": 120, "unit": "celsius" }, - "name": "Gearbox Temp (AJ133)" } - ]}, - + "name": "Gearbox Temp" } + ] + }, { "hdr": "795", "cmd": { "22": "1E8A" }, "freq": 0.5, "signals": [ { "id": "LR4_REAR_DIFF_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "add": -40, "min": -40, "max": 150, "unit": "celsius" }, "name": "Locking Diff Oil Temp" } - ]}, - + ] + }, { "hdr": "7E0", "rax": "7E8", "cmd": { "22": "03E6" }, "freq": 0.5, "signals": [ { "id": "LR4_MEASURED_OIL_LEVEL", "path": "Engine", "fmt": { "len": 8, "min": 0, "max": 255, "unit": "millimeters" }, "name": "Oil Level" } - ]}, - - { "hdr": "7E0", "rax": "7E8", "cmd": { "22": "033E" }, "freq": 0.5, - "signals": [ - { "id": "LR4_BOOST", "path": "Engine", - "fmt": { "len": 8, "min": 0, "max": 255, "unit": "kilopascals" }, - "name": "Engine Boost" }, - { "id": "LR4_ECU_033E_UPTIME_S", "path": "Diagnostics", - "fmt": { "len": 16, "max": 65535, "unit": "seconds" }, - "name": "ECU uptime (033E)" } - ]}, - - { "hdr": "7E0", "rax": "7E8", "cmd": { "22": "0520" }, "freq": 0.5, - "signals": [ - { "id": "LR4_IAT2", "path": "Engine", - "fmt": { "len": 8, "min": 0, "max": 999, "unit": "celsius" }, - "name": "IAT2" }, - { "id": "LR4_IAT2_OFFSET", "path": "Engine", - "fmt": { "len": 8, "min": -40, "max": 150, "add": -40, "unit": "celsius" }, - "name": "IAT2 (offset)" } - ]} + ] + } ] } From dbb535cc035962c38f10467d550d12d941c21e6d Mon Sep 17 00:00:00 2001 From: Jeff Verkoeyen Date: Fri, 14 Nov 2025 22:07:39 -0500 Subject: [PATCH 33/84] Upgrade to Claude Code workbench (#8) --- .claude/settings.local.json | 14 ++++++++++++++ .devcontainer/devcontainer.json | 10 +++++----- .gitignore | 1 + 3 files changed, 20 insertions(+), 5 deletions(-) create mode 100644 .claude/settings.local.json diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..b1f30b1 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,14 @@ +{ + "permissions": { + "allow": [ + "Bash(cat:*)", + "Bash(comm -23:*)", + "Bash(jq:*)", + "Skill(obdb-editor)", + "Bash(python3:*)", + "Bash(find:*)" + ], + "deny": [], + "ask": [] + } +} diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 95508da..a8e4257 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,6 +1,6 @@ { "name": "Python Development", - "image": "mcr.microsoft.com/devcontainers/python:3", + "image": "ghcr.io/obdb/devcontainer:latest", "customizations": { "vscode": { "extensions": [ @@ -8,7 +8,8 @@ "ms-python.vscode-pylance", "GitHub.vscode-github-actions", "GitHub.vscode-pull-request-github", - "ClutchEngineering.obdb-tooling" + "ClutchEngineering.obdb-tooling", + "anthropic.claude-code" ], "settings": { "task.quickOpen.skip": true, @@ -23,7 +24,6 @@ } } }, - "postCreateCommand": "pip install pytest pyyaml pytest-xdist", - "postAttachCommand": "cd tests/schemas && git pull && cd ../.. || git clone --depth=1 https://github.com/OBDb/.schemas.git tests/schemas", + "postAttachCommand": "/usr/local/bin/setup-obdb-dev.sh", "remoteUser": "vscode" -} +} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 3aea39a..9dd2f83 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ tests/schemas/ __pycache__ +.claude/skills From c32a17debfffb2113cbe283a2650e82ead908904 Mon Sep 17 00:00:00 2001 From: Jeff Verkoeyen Date: Tue, 25 Nov 2025 02:29:23 -0500 Subject: [PATCH 34/84] Sync template updates and remove deprecated files (#9) --- .claude/settings.local.json | 14 ----- .github/workflows/presubmits.yml | 3 - .github/workflows/response_tests.yml | 65 ++++++++++++------- .gitignore | 3 + .vscode/settings.json | 11 ---- .vscode/tasks.json | 39 ------------ tests/test_responses.py | 41 ------------ tests/update_yaml_tests.py | 93 ---------------------------- 8 files changed, 45 insertions(+), 224 deletions(-) delete mode 100644 .claude/settings.local.json delete mode 100644 .vscode/settings.json delete mode 100644 .vscode/tasks.json delete mode 100644 tests/test_responses.py delete mode 100644 tests/update_yaml_tests.py diff --git a/.claude/settings.local.json b/.claude/settings.local.json deleted file mode 100644 index b1f30b1..0000000 --- a/.claude/settings.local.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "permissions": { - "allow": [ - "Bash(cat:*)", - "Bash(comm -23:*)", - "Bash(jq:*)", - "Skill(obdb-editor)", - "Bash(python3:*)", - "Bash(find:*)" - ], - "deny": [], - "ask": [] - } -} diff --git a/.github/workflows/presubmits.yml b/.github/workflows/presubmits.yml index 80d1b54..9732469 100644 --- a/.github/workflows/presubmits.yml +++ b/.github/workflows/presubmits.yml @@ -13,17 +13,14 @@ jobs: validate-signals: runs-on: ubuntu-latest steps: - # Step 1: Check out the current repository - uses: actions/checkout@v4 - # Step 2: Check out the central schema repository - name: Checkout schemas repo uses: actions/checkout@v4 with: repository: OBDb/.schemas path: .schemas - # Step 3: Validate with schema from the central repository - name: Validate signalsets id: json-yaml-validate-v3 uses: GrantBirki/json-yaml-validate@v2.7.1 diff --git a/.github/workflows/response_tests.yml b/.github/workflows/response_tests.yml index ac8e45f..5aea0ea 100644 --- a/.github/workflows/response_tests.yml +++ b/.github/workflows/response_tests.yml @@ -8,39 +8,58 @@ on: permissions: contents: read + pull-requests: write jobs: test: runs-on: ubuntu-latest steps: - - name: Checkout main repository + - name: Checkout repository uses: actions/checkout@v4 - - name: Checkout schemas repo - uses: actions/checkout@v4 + - name: Run tests in devcontainer + id: test + uses: devcontainers/ci@v0.3 with: - repository: OBDb/.schemas - path: tests/schemas + imageName: ghcr.io/obdb/devcontainer + push: never + env: | + GITHUB_SERVER_URL=${{ github.server_url }} + GITHUB_REPOSITORY=${{ github.repository }} + GITHUB_SHA=${{ github.sha }} + GITHUB_RUN_ID=${{ github.run_id }} + runCmd: | + pytest tests/ --ignore=tests/schemas -xvs -n auto > ./test-output.txt 2>&1 + TEST_EXIT=$? + cat ./test-output.txt - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: '3.13' - cache: 'pip' + # Format results for PR comment with all required arguments + /usr/local/bin/format-test-results.sh \ + test-output.txt \ + $TEST_EXIT \ + "$GITHUB_SERVER_URL" \ + "$GITHUB_REPOSITORY" \ + "$GITHUB_SHA" \ + "$GITHUB_RUN_ID" \ + > ./test-results.md || true - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install -r tests/schemas/requirements.txt + # Exit with the actual test result + exit $TEST_EXIT - - name: Run tests - id: run_tests + - name: Set test results output + if: always() && github.event_name == 'pull_request' run: | - pytest tests/ --ignore=tests/schemas -xvs -n auto - continue-on-error: true + if [ -f test-results.md ]; then + { + echo 'TEST_RESULTS<> $GITHUB_ENV + fi - - name: Print fix instructions - if: steps.run_tests.outcome == 'failure' - run: | - echo "::notice title=How to fix failed tests::To fix the failed tests, run: python3 tests/update_yaml_tests.py --verbose" - exit 1 + - name: Comment test results on PR + if: always() && github.event_name == 'pull_request' + uses: thollander/actions-comment-pull-request@v2 + with: + message: ${{ env.TEST_RESULTS }} + comment_tag: response-tests diff --git a/.gitignore b/.gitignore index 9dd2f83..17717bf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ tests/schemas/ __pycache__ .claude/skills +.claude/settings.local.json +tests/*.py +.vscode/*.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index da11add..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "python.testing.pytestArgs": [ - "tests", - "-xvs", - "-n", - "auto" - ], - "python.testing.unittestEnabled": false, - "python.testing.pytestEnabled": true, - "files.trimTrailingWhitespace": true -} diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index 3bbe224..0000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "Format Signals", - "type": "shell", - "command": "find signalsets/v3 -type f -exec python3 tests/schemas/cli.py '{}' --output '{}' \\;", - "problemMatcher": [], - "group": "test" - }, - { - "label": "Update YAML Tests", - "type": "shell", - "command": "python3 ${workspaceFolder}/tests/update_yaml_tests.py ${input:testUpdateOptions}", - "problemMatcher": [], - "presentation": { - "reveal": "always", - "panel": "new" - }, - "group": "test" - } - ], - "inputs": [ - { - "id": "testUpdateOptions", - "type": "pickString", - "description": "Choose test update options", - "options": [ - "--dry-run --verbose", - "--verbose", - "--year 2022 --verbose", - "--year 2023 --verbose", - "--year 2024 --verbose", - "--year 2025 --verbose" - ], - "default": "--dry-run --verbose" - } - ] -} diff --git a/tests/test_responses.py b/tests/test_responses.py deleted file mode 100644 index b583341..0000000 --- a/tests/test_responses.py +++ /dev/null @@ -1,41 +0,0 @@ -import glob -import os -import pytest -from pathlib import Path - -# These will be imported from the schemas repository -from schemas.python.json_formatter import format_file -from schemas.python.signals_testing import find_test_yaml_files, register_test_classes - -REPO_ROOT = Path(__file__).parent.parent.absolute() -TEST_CASES_DIR = os.path.join(Path(__file__).parent, 'test_cases') - -# Find all test files grouped by model year -test_files_by_year = find_test_yaml_files(TEST_CASES_DIR) - -# Register test classes dynamically -register_test_classes(test_files_by_year) - -def get_json_files(): - """Get all JSON files from the signalsets/v3 directory.""" - signalsets_path = os.path.join(REPO_ROOT, 'signalsets', 'v3') - json_files = glob.glob(os.path.join(signalsets_path, '*.json')) - # Convert full paths to relative filenames - return [os.path.basename(f) for f in json_files] - -@pytest.mark.parametrize("test_file", - get_json_files(), - ids=lambda x: x.split('.')[0].replace('-', '_') # Create readable test IDs -) -def test_formatting(test_file): - """Test signal set formatting for all vehicle models in signalsets/v3/.""" - signalset_path = os.path.join(REPO_ROOT, 'signalsets', 'v3', test_file) - - formatted = format_file(signalset_path) - - with open(signalset_path) as f: - assert f.read() == formatted - -if __name__ == '__main__': - # Use pytest's main function with xdist arguments - pytest.main([__file__, '-xvs', '-n', 'auto']) diff --git a/tests/update_yaml_tests.py b/tests/update_yaml_tests.py deleted file mode 100644 index 41b3019..0000000 --- a/tests/update_yaml_tests.py +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/env python3 -""" -Tool for updating YAML test cases with current signal values. -This is useful when signals are removed from signalsets and tests need to be updated. -""" - -import os -import sys -import argparse -import subprocess -from pathlib import Path - -# Add the current directory to the path so we can import our module -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) - -def ensure_schemas_repo(): - """Ensure the schemas repository is cloned, similar to devcontainer.json.""" - script_dir = os.path.dirname(os.path.abspath(__file__)) - schemas_dir = os.path.join(script_dir, 'schemas') - - # Check if schemas directory exists and is a git repository - if os.path.isdir(os.path.join(schemas_dir, '.git')): - # Try to pull latest changes - try: - print(f"Updating schemas repository...") - subprocess.run(['git', 'pull'], cwd=schemas_dir, check=True) - return True - except subprocess.CalledProcessError as e: - print(f"Warning: Failed to update schemas repository: {e}") - # Continue with existing repo - return True - elif os.path.exists(schemas_dir): - # Directory exists but might not be a git repository - print(f"Warning: schemas directory exists but might not be a git repository: {schemas_dir}") - return True - else: - # Need to clone the repository - try: - print(f"Cloning schemas repository...") - subprocess.run( - ['git', 'clone', '--depth=1', 'https://github.com/OBDb/.schemas.git', schemas_dir], - check=True - ) - return True - except subprocess.CalledProcessError as e: - print(f"Error: Failed to clone schemas repository: {e}") - return False - -def main(): - parser = argparse.ArgumentParser(description='Update YAML test expected values based on current signalsets') - parser.add_argument('--test-cases-dir', default=None, help='Path to test_cases directory') - parser.add_argument('--year', type=int, action='append', help='Specific model year(s) to update') - parser.add_argument('--dry-run', action='store_true', help='Show what would be changed without making changes') - parser.add_argument('--verbose', '-v', action='store_true', help='Show detailed output') - - args = parser.parse_args() - - # Find test_cases directory - if args.test_cases_dir: - test_cases_dir = args.test_cases_dir - else: - # Try to find it relative to current script - script_dir = os.path.dirname(os.path.abspath(__file__)) - test_cases_dir = os.path.join(script_dir, 'test_cases') - - if not os.path.isdir(test_cases_dir): - print(f"Test cases directory not found: {test_cases_dir}") - print(f"Creating directory: {test_cases_dir}") - os.makedirs(test_cases_dir) - - print(f"Using test cases directory: {test_cases_dir}") - - # Ensure we have the schemas repository - if not ensure_schemas_repo(): - print("Error: Could not set up schemas repository.") - sys.exit(1) - - # Import our module - try: - from schemas.python.yaml_test_updater import update_yaml_tests - update_yaml_tests(test_cases_dir, args.year, args.dry_run, args.verbose) - except ImportError as e: - print(f"Error importing yaml_test_updater module: {e}") - print("Make sure the schemas package is properly installed.") - sys.exit(1) - except Exception as e: - print(f"Error updating YAML tests: {e}") - sys.exit(1) - - print("Done!") - -if __name__ == "__main__": - main() From 5767b1e1557e2c8e51ac77e12ad7084975f1c149 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Fri, 28 Aug 2026 17:26:05 -0500 Subject: [PATCH 35/84] add battery/fuel/gear signals, probe TPMS and air suspension Tier 1 (7E0/7E8 1172/1670/168E/16C1) verified identical in Land-Rover-Defender, Land-Rover and Jaguar signalsets. 732.22D928 already responds per command_support.yaml. 751 retried with rax 759; 710 untried on this truck. --- signalsets/v3/default.json | 115 ++++++++++++++++++++++++------------- 1 file changed, 76 insertions(+), 39 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index f778a1a..18ed28a 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -1,39 +1,76 @@ -{ - "commands": [ - { "hdr": "7E0", "rax": "7E8", "cmd": { "22": "03F3" }, "freq": 0.5, - "signals": [ - { "id": "LR4_ENGINE_OIL_TEMP", "path": "Engine", - "fmt": { "len": 8, "add": -40, "min": -40, "max": 120, "unit": "celsius" }, - "name": "Oil Temp" } - ]}, - - { "hdr": "7E0", "rax": "7E8", "cmd": { "22": "03F2" }, "freq": 0.5, - "signals": [ - { "id": "LR4_ENGINE_OIL_VOLUME_GAL", "path": "Engine", - "fmt": { "len": 8, "mul": 0.0264172, "min": 0, "max": 6.74, "unit": "gallons" }, - "name": "Oil Volume" } - ] - }, - { "hdr": "7E1", "rax": "7E9", "cmd": { "22": "1E69" }, "freq": 0.5, - "signals": [ - { "id": "LR4_GEARBOX_OIL_TEMP", "path": "Drivetrain", - "fmt": { "len": 8, "add": -40, "min": -40, "max": 120, "unit": "celsius" }, - "name": "Gearbox Temp" } - ] - }, - { "hdr": "795", "cmd": { "22": "1E8A" }, "freq": 0.5, - "signals": [ - { "id": "LR4_REAR_DIFF_TEMP", "path": "Drivetrain", - "fmt": { "len": 8, "add": -40, "min": -40, "max": 150, "unit": "celsius" }, - "name": "Locking Diff Oil Temp" } - ] - }, - { "hdr": "7E0", "rax": "7E8", "cmd": { "22": "03E6" }, "freq": 0.5, - "signals": [ - { "id": "LR4_MEASURED_OIL_LEVEL", "path": "Engine", - "fmt": { "len": 8, "min": 0, "max": 255, "unit": "millimeters" }, - "name": "Oil Level" } - ] - } - ] - } +{ "commands": [ +{ "hdr": "710", "cmd": {"22": "3B03"}, "freq": 1, + "signals": [ + {"id": "LR4_SUSPENSION_PRES_FR", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension Pressure Front Right"} + ]}, +{ "hdr": "710", "cmd": {"22": "3B04"}, "freq": 1, + "signals": [ + {"id": "LR4_SUSPENSION_PRES_FL", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension Pressure Front Left"} + ]}, +{ "hdr": "710", "cmd": {"22": "3B05"}, "freq": 1, + "signals": [ + {"id": "LR4_SUSPENSION_PRES_RR", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension Pressure Rear Right"} + ]}, +{ "hdr": "710", "cmd": {"22": "3B06"}, "freq": 1, + "signals": [ + {"id": "LR4_SUSPENSION_PRES_RL", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension Pressure Rear Left"} + ]}, +{ "hdr": "732", "cmd": {"22": "D928"}, "freq": 1, + "signals": [ + {"id": "LR4_GEAR", "path": "Drivetrain", "fmt": { "len": 7, "max": 127, "unit": "scalar" }, "name": "Gear"}, + {"id": "LR4_PARKED", "path": "Movement", "fmt": {"bix": 7, "len": 1, "max": 1, "unit": "noyes" }, "name": "Parked"} + ]}, +{ "hdr": "751", "rax": "759", "cmd": {"22": "2076"}, "freq": 5, + "signals": [ + {"id": "LR4_TP_FL", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 3.5, "mul": 0.01373, "unit": "bars" }, "name": "Front Left Tire Pressure", "suggestedMetric": "frontLeftTirePressure"} + ]}, +{ "hdr": "751", "rax": "759", "cmd": {"22": "2077"}, "freq": 5, + "signals": [ + {"id": "LR4_TP_FR", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 3.5, "mul": 0.01373, "unit": "bars" }, "name": "Front Right Tire Pressure", "suggestedMetric": "frontRightTirePressure"} + ]}, +{ "hdr": "751", "rax": "759", "cmd": {"22": "2078"}, "freq": 5, + "signals": [ + {"id": "LR4_TP_RR", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 3.5, "mul": 0.01373, "unit": "bars" }, "name": "Rear Right Tire Pressure", "suggestedMetric": "rearRightTirePressure"} + ]}, +{ "hdr": "751", "rax": "759", "cmd": {"22": "2079"}, "freq": 5, + "signals": [ + {"id": "LR4_TP_RL", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 3.5, "mul": 0.01373, "unit": "bars" }, "name": "Rear Left Tire Pressure", "suggestedMetric": "rearLeftTirePressure"} + ]}, +{ "hdr": "795", "cmd": {"22": "1E8A"}, "freq": 0.5, + "signals": [ + {"id": "LR4_REAR_DIFF_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "max": 150, "min": -40, "add": -40, "unit": "celsius" }, "name": "Locking Diff Oil Temp"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "03E6"}, "freq": 0.5, + "signals": [ + {"id": "LR4_MEASURED_OIL_LEVEL", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "millimeters" }, "name": "Oil Level"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "03F2"}, "freq": 0.5, + "signals": [ + {"id": "LR4_ENGINE_OIL_VOLUME_GAL", "path": "Engine", "fmt": { "len": 8, "max": 6.74, "mul": 0.0264172, "unit": "gallons" }, "name": "Oil Volume"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "03F3"}, "freq": 0.5, + "signals": [ + {"id": "LR4_ENGINE_OIL_TEMP", "path": "Engine", "fmt": { "len": 8, "max": 120, "min": -40, "add": -40, "unit": "celsius" }, "name": "Oil Temp"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1172"}, "freq": 1, + "signals": [ + {"id": "LR4_BAT_V", "path": "Battery", "fmt": { "len": 8, "max": 15.9375, "mul": 625, "div": 10000, "unit": "volts" }, "name": "Battery Voltage"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1670"}, "freq": 1, + "signals": [ + {"id": "LR4_FUEL_RAIL_P", "path": "Fuel", "fmt": { "len": 16, "max": 511992.1875, "mul": 78125, "div": 10000, "unit": "kilopascal" }, "name": "Fuel Rail Pressure"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "168E"}, "freq": 1, + "signals": [ + {"id": "LR4_FUEL_RAIL_T", "path": "Fuel", "fmt": { "len": 8, "max": 60.96, "min": -61.44, "mul": 48, "div": 100, "sign": true, "unit": "celsius" }, "name": "Fuel Rail Temperature"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "16C1"}, "freq": 1, + "signals": [ + {"id": "LR4_FLI", "path": "Fuel", "fmt": { "len": 16, "max": 100, "mul": 200, "div": 65535, "unit": "percent" }, "name": "Fuel Tank Level", "suggestedMetric": "fuelTankLevel"} + ]}, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E69"}, "freq": 0.5, + "signals": [ + {"id": "LR4_GEARBOX_OIL_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "max": 120, "min": -40, "add": -40, "unit": "celsius" }, "name": "Gearbox Temp"} + ]} +] +} From 6fa55ea439625a05c90fe1413bdd3514405221cc Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Fri, 28 Aug 2026 17:36:13 -0500 Subject: [PATCH 36/84] drop DIDs the ECUs reject, add log-confirmed charge air temp + raw probes Road test and 12.7M-row scan log agree: 1172/1670/168E/16C1 return NRC 0x31, 751 and 710 return NO DATA. Jaguar's D928 gear/parked layout is wrong here - the byte only ever holds 0-3. 220520 confirmed as charge air temp over 70,073 samples (raw-40 C). Remaining additions are DIDs the log shows answering but never decoded; shipped raw for road calibration. --- signalsets/v3/default.json | 73 +++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 37 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 18ed28a..ea73f9c 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -1,76 +1,75 @@ { "commands": [ -{ "hdr": "710", "cmd": {"22": "3B03"}, "freq": 1, - "signals": [ - {"id": "LR4_SUSPENSION_PRES_FR", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension Pressure Front Right"} - ]}, -{ "hdr": "710", "cmd": {"22": "3B04"}, "freq": 1, +{ "hdr": "732", "cmd": {"22": "D928"}, "freq": 1, "signals": [ - {"id": "LR4_SUSPENSION_PRES_FL", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension Pressure Front Left"} + {"id": "LR4_D928_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "D928 State"} ]}, -{ "hdr": "710", "cmd": {"22": "3B05"}, "freq": 1, +{ "hdr": "795", "cmd": {"22": "1E8A"}, "freq": 0.5, "signals": [ - {"id": "LR4_SUSPENSION_PRES_RR", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension Pressure Rear Right"} + {"id": "LR4_REAR_DIFF_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "max": 150, "min": -40, "add": -40, "unit": "celsius" }, "name": "Locking Diff Oil Temp"} ]}, -{ "hdr": "710", "cmd": {"22": "3B06"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "033E"}, "freq": 1, "signals": [ - {"id": "LR4_SUSPENSION_PRES_RL", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension Pressure Rear Left"} + {"id": "LR4_033E_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "033E Raw"} ]}, -{ "hdr": "732", "cmd": {"22": "D928"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "03E6"}, "freq": 0.5, "signals": [ - {"id": "LR4_GEAR", "path": "Drivetrain", "fmt": { "len": 7, "max": 127, "unit": "scalar" }, "name": "Gear"}, - {"id": "LR4_PARKED", "path": "Movement", "fmt": {"bix": 7, "len": 1, "max": 1, "unit": "noyes" }, "name": "Parked"} + {"id": "LR4_MEASURED_OIL_LEVEL", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "millimeters" }, "name": "Oil Level"} ]}, -{ "hdr": "751", "rax": "759", "cmd": {"22": "2076"}, "freq": 5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "03F2"}, "freq": 0.5, "signals": [ - {"id": "LR4_TP_FL", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 3.5, "mul": 0.01373, "unit": "bars" }, "name": "Front Left Tire Pressure", "suggestedMetric": "frontLeftTirePressure"} + {"id": "LR4_ENGINE_OIL_VOLUME_GAL", "path": "Engine", "fmt": { "len": 8, "max": 6.74, "mul": 0.0264172, "unit": "gallons" }, "name": "Oil Volume"} ]}, -{ "hdr": "751", "rax": "759", "cmd": {"22": "2077"}, "freq": 5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "03F3"}, "freq": 0.5, "signals": [ - {"id": "LR4_TP_FR", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 3.5, "mul": 0.01373, "unit": "bars" }, "name": "Front Right Tire Pressure", "suggestedMetric": "frontRightTirePressure"} + {"id": "LR4_ENGINE_OIL_TEMP", "path": "Engine", "fmt": { "len": 8, "max": 120, "min": -40, "add": -40, "unit": "celsius" }, "name": "Oil Temp"} ]}, -{ "hdr": "751", "rax": "759", "cmd": {"22": "2078"}, "freq": 5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "0520"}, "freq": 1, "signals": [ - {"id": "LR4_TP_RR", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 3.5, "mul": 0.01373, "unit": "bars" }, "name": "Rear Right Tire Pressure", "suggestedMetric": "rearRightTirePressure"} + {"id": "LR4_CHARGE_AIR_TEMP", "path": "Engine", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Charge Air Temp"} ]}, -{ "hdr": "751", "rax": "759", "cmd": {"22": "2079"}, "freq": 5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1153"}, "freq": 1, "signals": [ - {"id": "LR4_TP_RL", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 3.5, "mul": 0.01373, "unit": "bars" }, "name": "Rear Left Tire Pressure", "suggestedMetric": "rearLeftTirePressure"} + {"id": "LR4_1153_RAW", "path": "ECU", "fmt": { "len": 16, "max": 32767, "min": -32768, "sign": true, "unit": "scalar" }, "name": "1153 Raw"} ]}, -{ "hdr": "795", "cmd": {"22": "1E8A"}, "freq": 0.5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1154"}, "freq": 1, "signals": [ - {"id": "LR4_REAR_DIFF_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "max": 150, "min": -40, "add": -40, "unit": "celsius" }, "name": "Locking Diff Oil Temp"} + {"id": "LR4_1154_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "1154 Raw"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "03E6"}, "freq": 0.5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1156"}, "freq": 1, "signals": [ - {"id": "LR4_MEASURED_OIL_LEVEL", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "millimeters" }, "name": "Oil Level"} + {"id": "LR4_1156_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1156 Raw"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "03F2"}, "freq": 0.5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1160"}, "freq": 1, "signals": [ - {"id": "LR4_ENGINE_OIL_VOLUME_GAL", "path": "Engine", "fmt": { "len": 8, "max": 6.74, "mul": 0.0264172, "unit": "gallons" }, "name": "Oil Volume"} + {"id": "LR4_1160_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "1160 Raw"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "03F3"}, "freq": 0.5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "11BA"}, "freq": 1, "signals": [ - {"id": "LR4_ENGINE_OIL_TEMP", "path": "Engine", "fmt": { "len": 8, "max": 120, "min": -40, "add": -40, "unit": "celsius" }, "name": "Oil Temp"} + {"id": "LR4_11BA_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "11BA Raw"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1172"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "11BD"}, "freq": 1, "signals": [ - {"id": "LR4_BAT_V", "path": "Battery", "fmt": { "len": 8, "max": 15.9375, "mul": 625, "div": 10000, "unit": "volts" }, "name": "Battery Voltage"} + {"id": "LR4_11BD_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "11BD Raw"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1670"}, "freq": 1, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "0302"}, "freq": 1, "signals": [ - {"id": "LR4_FUEL_RAIL_P", "path": "Fuel", "fmt": { "len": 16, "max": 511992.1875, "mul": 78125, "div": 10000, "unit": "kilopascal" }, "name": "Fuel Rail Pressure"} + {"id": "LR4_0302_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "0302 Raw"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "168E"}, "freq": 1, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "0805"}, "freq": 1, "signals": [ - {"id": "LR4_FUEL_RAIL_T", "path": "Fuel", "fmt": { "len": 8, "max": 60.96, "min": -61.44, "mul": 48, "div": 100, "sign": true, "unit": "celsius" }, "name": "Fuel Rail Temperature"} + {"id": "LR4_0805_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "0805 Raw"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "16C1"}, "freq": 1, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "101A"}, "freq": 1, "signals": [ - {"id": "LR4_FLI", "path": "Fuel", "fmt": { "len": 16, "max": 100, "mul": 200, "div": 65535, "unit": "percent" }, "name": "Fuel Tank Level", "suggestedMetric": "fuelTankLevel"} + {"id": "LR4_101A_RAW", "path": "ECU", "fmt": { "len": 16, "max": 32767, "min": -32768, "sign": true, "unit": "scalar" }, "name": "101A Raw"} ]}, { "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E69"}, "freq": 0.5, "signals": [ {"id": "LR4_GEARBOX_OIL_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "max": 120, "min": -40, "add": -40, "unit": "celsius" }, "name": "Gearbox Temp"} + ]}, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "210F"}, "freq": 1, + "signals": [ + {"id": "LR4_210F_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "210F State"} ]} ] } From 5170fc8ffbf397c9221ad1700cf5125eb95ec2c6 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Fri, 28 Aug 2026 17:42:06 -0500 Subject: [PATCH 37/84] restore TPMS and suspension probes for retest while rolling --- signalsets/v3/default.json | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index ea73f9c..b06f544 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -1,8 +1,40 @@ { "commands": [ +{ "hdr": "710", "cmd": {"22": "3B03"}, "freq": 1, + "signals": [ + {"id": "LR4_SUSPENSION_PRES_FR", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension Pressure Front Right"} + ]}, +{ "hdr": "710", "cmd": {"22": "3B04"}, "freq": 1, + "signals": [ + {"id": "LR4_SUSPENSION_PRES_FL", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension Pressure Front Left"} + ]}, +{ "hdr": "710", "cmd": {"22": "3B05"}, "freq": 1, + "signals": [ + {"id": "LR4_SUSPENSION_PRES_RR", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension Pressure Rear Right"} + ]}, +{ "hdr": "710", "cmd": {"22": "3B06"}, "freq": 1, + "signals": [ + {"id": "LR4_SUSPENSION_PRES_RL", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension Pressure Rear Left"} + ]}, { "hdr": "732", "cmd": {"22": "D928"}, "freq": 1, "signals": [ {"id": "LR4_D928_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "D928 State"} ]}, +{ "hdr": "751", "rax": "759", "cmd": {"22": "2076"}, "freq": 5, + "signals": [ + {"id": "LR4_TP_FL", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 3.5, "mul": 0.01373, "unit": "bars" }, "name": "Front Left Tire Pressure", "suggestedMetric": "frontLeftTirePressure"} + ]}, +{ "hdr": "751", "rax": "759", "cmd": {"22": "2077"}, "freq": 5, + "signals": [ + {"id": "LR4_TP_FR", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 3.5, "mul": 0.01373, "unit": "bars" }, "name": "Front Right Tire Pressure", "suggestedMetric": "frontRightTirePressure"} + ]}, +{ "hdr": "751", "rax": "759", "cmd": {"22": "2078"}, "freq": 5, + "signals": [ + {"id": "LR4_TP_RR", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 3.5, "mul": 0.01373, "unit": "bars" }, "name": "Rear Right Tire Pressure", "suggestedMetric": "rearRightTirePressure"} + ]}, +{ "hdr": "751", "rax": "759", "cmd": {"22": "2079"}, "freq": 5, + "signals": [ + {"id": "LR4_TP_RL", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 3.5, "mul": 0.01373, "unit": "bars" }, "name": "Rear Left Tire Pressure", "suggestedMetric": "rearLeftTirePressure"} + ]}, { "hdr": "795", "cmd": {"22": "1E8A"}, "freq": 0.5, "signals": [ {"id": "LR4_REAR_DIFF_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "max": 150, "min": -40, "add": -40, "unit": "celsius" }, "name": "Locking Diff Oil Temp"} From 7a72c2a81fe0c00556826b783bba3beea043f3aa Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Fri, 28 Aug 2026 17:51:33 -0500 Subject: [PATCH 38/84] decode gear selector and fuel rail pressure, add 13 more live DIDs D928 confirmed on the road: 0 Park, 1 Reverse, 2 Neutral, 3 Drive, 7 Sport. 033E reads 4000-12000 and tracks demand rather than rpm, which is the DI rail-pressure curve; naming it pending the key-off/crank check. --- signalsets/v3/default.json | 63 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index b06f544..e7ad08d 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -17,7 +17,14 @@ ]}, { "hdr": "732", "cmd": {"22": "D928"}, "freq": 1, "signals": [ - {"id": "LR4_D928_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "D928 State"} + {"id": "LR4_GEAR_SELECTOR", "path": "Transmission", "name": "Gear Selector", "fmt": {"len": 8, "map": { + "0": { "description": "Park", "value": "Park" }, + "1": { "description": "Reverse", "value": "Reverse" }, + "2": { "description": "Neutral", "value": "Neutral" }, + "3": { "description": "Drive", "value": "Drive" }, + "7": { "description": "Sport", "value": "Sport" } + }} + } ]}, { "hdr": "751", "rax": "759", "cmd": {"22": "2076"}, "freq": 5, "signals": [ @@ -41,7 +48,7 @@ ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "033E"}, "freq": 1, "signals": [ - {"id": "LR4_033E_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "033E Raw"} + {"id": "LR4_FUEL_RAIL_P", "path": "Fuel", "fmt": { "len": 16, "max": 30000, "unit": "kilopascal" }, "name": "Fuel Rail Pressure"} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "03E6"}, "freq": 0.5, "signals": [ @@ -59,6 +66,22 @@ "signals": [ {"id": "LR4_CHARGE_AIR_TEMP", "path": "Engine", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Charge Air Temp"} ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "112C"}, "freq": 1, + "signals": [ + {"id": "LR4_112C_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "112C Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1139"}, "freq": 1, + "signals": [ + {"id": "LR4_1139_RAW", "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "1139 Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "113F"}, "freq": 1, + "signals": [ + {"id": "LR4_113F_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "113F Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1151"}, "freq": 1, + "signals": [ + {"id": "LR4_1151_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "1151 Raw"} + ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1153"}, "freq": 1, "signals": [ {"id": "LR4_1153_RAW", "path": "ECU", "fmt": { "len": 16, "max": 32767, "min": -32768, "sign": true, "unit": "scalar" }, "name": "1153 Raw"} @@ -71,10 +94,26 @@ "signals": [ {"id": "LR4_1156_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1156 Raw"} ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1159"}, "freq": 1, + "signals": [ + {"id": "LR4_1159_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1159 Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "115B"}, "freq": 1, + "signals": [ + {"id": "LR4_115B_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "115B Raw"} + ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1160"}, "freq": 1, "signals": [ {"id": "LR4_1160_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "1160 Raw"} ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1164"}, "freq": 1, + "signals": [ + {"id": "LR4_1164_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1164 Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1187"}, "freq": 1, + "signals": [ + {"id": "LR4_1187_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1187 Raw"} + ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "11BA"}, "freq": 1, "signals": [ {"id": "LR4_11BA_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "11BA Raw"} @@ -83,10 +122,26 @@ "signals": [ {"id": "LR4_11BD_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "11BD Raw"} ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "11C4"}, "freq": 1, + "signals": [ + {"id": "LR4_11C4_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "11C4 Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "11C5"}, "freq": 1, + "signals": [ + {"id": "LR4_11C5_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "11C5 Raw"} + ]}, { "hdr": "7E1", "rax": "7E9", "cmd": {"22": "0302"}, "freq": 1, "signals": [ {"id": "LR4_0302_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "0302 Raw"} ]}, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "0303"}, "freq": 1, + "signals": [ + {"id": "LR4_0303_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "0303 Raw"} + ]}, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "0304"}, "freq": 1, + "signals": [ + {"id": "LR4_0304_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "0304 Raw"} + ]}, { "hdr": "7E1", "rax": "7E9", "cmd": {"22": "0805"}, "freq": 1, "signals": [ {"id": "LR4_0805_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "0805 Raw"} @@ -99,6 +154,10 @@ "signals": [ {"id": "LR4_GEARBOX_OIL_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "max": 120, "min": -40, "add": -40, "unit": "celsius" }, "name": "Gearbox Temp"} ]}, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "2104"}, "freq": 1, + "signals": [ + {"id": "LR4_2104_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "2104 Raw"} + ]}, { "hdr": "7E1", "rax": "7E9", "cmd": {"22": "210F"}, "freq": 1, "signals": [ {"id": "LR4_210F_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "210F State"} From ee327e0281f68484469771e535dbb5589cdd979e Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Fri, 28 Aug 2026 18:01:22 -0500 Subject: [PATCH 39/84] fuel level on physical ECM address instead of broadcast Old version used hdr 7DF; broadcast lets any ECU answer and the adapter picks inconsistently. Scan log shows 012F answered only by 7E8, 235734 good responses at 97.8 percent, steady values. --- signalsets/v3/default.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index e7ad08d..ee14c19 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -46,6 +46,10 @@ "signals": [ {"id": "LR4_REAR_DIFF_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "max": 150, "min": -40, "add": -40, "unit": "celsius" }, "name": "Locking Diff Oil Temp"} ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"01": "2F"}, "freq": 1, + "signals": [ + {"id": "LR4_FUEL_LEVEL", "path": "Fuel", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Fuel Level", "suggestedMetric": "fuelTankLevel"} + ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "033E"}, "freq": 1, "signals": [ {"id": "LR4_FUEL_RAIL_P", "path": "Fuel", "fmt": { "len": 16, "max": 30000, "unit": "kilopascal" }, "name": "Fuel Rail Pressure"} From 831181b898922d7dde22dd3949c61aee0bca5d60 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Fri, 28 Aug 2026 18:09:42 -0500 Subject: [PATCH 40/84] expose standard PIDs as 22F4xx aliases, including fuel level The app owns service-01 PIDs natively, so a signalset entry for 012F never surfaces. The F4xx alias block answers on this truck (F41F, F421, F430, F431, F40D all decode as their 01xx twins), so the same data arrives as custom DIDs instead. F42F is fuel level. --- signalsets/v3/default.json | 52 +++++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index ee14c19..695c08f 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -46,10 +46,6 @@ "signals": [ {"id": "LR4_REAR_DIFF_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "max": 150, "min": -40, "add": -40, "unit": "celsius" }, "name": "Locking Diff Oil Temp"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"01": "2F"}, "freq": 1, - "signals": [ - {"id": "LR4_FUEL_LEVEL", "path": "Fuel", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Fuel Level", "suggestedMetric": "fuelTankLevel"} - ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "033E"}, "freq": 1, "signals": [ {"id": "LR4_FUEL_RAIL_P", "path": "Fuel", "fmt": { "len": 16, "max": 30000, "unit": "kilopascal" }, "name": "Fuel Rail Pressure"} @@ -134,6 +130,54 @@ "signals": [ {"id": "LR4_11C5_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "11C5 Raw"} ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40B"}, "freq": 1, + "signals": [ + {"id": "LR4_MAP", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "kilopascal" }, "name": "Manifold Pressure"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40F"}, "freq": 1, + "signals": [ + {"id": "LR4_IAT", "path": "Engine", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Intake Air Temp"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F410"}, "freq": 1, + "signals": [ + {"id": "LR4_MAF", "path": "Engine", "fmt": { "len": 16, "max": 655.35, "div": 100, "unit": "gramsPerSecond" }, "name": "Mass Air Flow"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F42F"}, "freq": 1, + "signals": [ + {"id": "LR4_FUEL_LEVEL", "path": "Fuel", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Fuel Level"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F433"}, "freq": 1, + "signals": [ + {"id": "LR4_BARO", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "kilopascal" }, "name": "Barometric Pressure"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F43C"}, "freq": 1, + "signals": [ + {"id": "LR4_CAT_TEMP_B1", "path": "Engine", "fmt": { "len": 16, "max": 6513.5, "min": -40, "div": 10, "add": -40, "unit": "celsius" }, "name": "Catalyst Temp B1S1"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F43D"}, "freq": 1, + "signals": [ + {"id": "LR4_CAT_TEMP_B2", "path": "Engine", "fmt": { "len": 16, "max": 6513.5, "min": -40, "div": 10, "add": -40, "unit": "celsius" }, "name": "Catalyst Temp B2S1"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F443"}, "freq": 1, + "signals": [ + {"id": "LR4_LOAD_ABS", "path": "Engine", "fmt": { "len": 16, "max": 25700, "mul": 100, "div": 255, "unit": "percent" }, "name": "Absolute Load"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F444"}, "freq": 1, + "signals": [ + {"id": "LR4_EQ_RATIO", "path": "Engine", "fmt": { "len": 16, "max": 2, "div": 32768, "unit": "ratio" }, "name": "Equivalence Ratio"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F446"}, "freq": 1, + "signals": [ + {"id": "LR4_AMBIENT_TEMP", "path": "Climate", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Ambient Air Temp"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F44C"}, "freq": 1, + "signals": [ + {"id": "LR4_THROTTLE_CMD", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Commanded Throttle"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F45C"}, "freq": 1, + "signals": [ + {"id": "LR4_OIL_TEMP_SAE", "path": "Engine", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Oil Temp (SAE)"} + ]}, { "hdr": "7E1", "rax": "7E9", "cmd": {"22": "0302"}, "freq": 1, "signals": [ {"id": "LR4_0302_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "0302 Raw"} From bd19d92dee8400a495fa4fc220900f573a2c7d2d Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Fri, 28 Aug 2026 18:09:59 -0500 Subject: [PATCH 41/84] fix invalid unit on equivalence ratio --- signalsets/v3/default.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 695c08f..850fcae 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -164,7 +164,7 @@ ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F444"}, "freq": 1, "signals": [ - {"id": "LR4_EQ_RATIO", "path": "Engine", "fmt": { "len": 16, "max": 2, "div": 32768, "unit": "ratio" }, "name": "Equivalence Ratio"} + {"id": "LR4_EQ_RATIO", "path": "Engine", "fmt": { "len": 16, "max": 2, "div": 32768, "unit": "scalar" }, "name": "Equivalence Ratio"} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F446"}, "freq": 1, "signals": [ From be9e2413489ced04f57a9c84a7be04564fbd5e52 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Fri, 28 Aug 2026 18:19:25 -0500 Subject: [PATCH 42/84] add timing advance, SAE rail pressure, pedal and trim aliases --- signalsets/v3/default.json | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 850fcae..8b48fa3 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -130,10 +130,26 @@ "signals": [ {"id": "LR4_11C5_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "11C5 Raw"} ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F404"}, "freq": 1, + "signals": [ + {"id": "LR4_LOAD_CALC", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Calculated Load"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F406"}, "freq": 1, + "signals": [ + {"id": "LR4_SHRTFT1", "path": "Fuel", "fmt": { "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "Short Term Fuel Trim B1"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F407"}, "freq": 1, + "signals": [ + {"id": "LR4_LONGFT1", "path": "Fuel", "fmt": { "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "Long Term Fuel Trim B1"} + ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40B"}, "freq": 1, "signals": [ {"id": "LR4_MAP", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "kilopascal" }, "name": "Manifold Pressure"} ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40E"}, "freq": 1, + "signals": [ + {"id": "LR4_SPARK_ADV", "path": "Engine", "fmt": { "len": 8, "max": 63.5, "min": -64, "div": 2, "add": -64, "unit": "degrees" }, "name": "Timing Advance"} + ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40F"}, "freq": 1, "signals": [ {"id": "LR4_IAT", "path": "Engine", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Intake Air Temp"} @@ -142,6 +158,14 @@ "signals": [ {"id": "LR4_MAF", "path": "Engine", "fmt": { "len": 16, "max": 655.35, "div": 100, "unit": "gramsPerSecond" }, "name": "Mass Air Flow"} ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F411"}, "freq": 1, + "signals": [ + {"id": "LR4_THROTTLE_POS", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Throttle Position"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F423"}, "freq": 1, + "signals": [ + {"id": "LR4_FUEL_RAIL_P_GAUGE", "path": "Fuel", "fmt": { "len": 16, "max": 655350, "mul": 10, "unit": "kilopascal" }, "name": "Fuel Rail Pressure (SAE)"} + ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F42F"}, "freq": 1, "signals": [ {"id": "LR4_FUEL_LEVEL", "path": "Fuel", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Fuel Level"} @@ -170,6 +194,14 @@ "signals": [ {"id": "LR4_AMBIENT_TEMP", "path": "Climate", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Ambient Air Temp"} ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F449"}, "freq": 1, + "signals": [ + {"id": "LR4_PEDAL_D", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Accelerator Pedal D"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F44A"}, "freq": 1, + "signals": [ + {"id": "LR4_PEDAL_E", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Accelerator Pedal E"} + ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F44C"}, "freq": 1, "signals": [ {"id": "LR4_THROTTLE_CMD", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Commanded Throttle"} From 1cf20db384a0a1f2b89c6a4b18d55106b80b5a49 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Fri, 28 Aug 2026 18:31:23 -0500 Subject: [PATCH 43/84] wire signals to Pelican metrics, drop dead probes Every ECU-path raw probe returns NRC on the poll loop, so they only cost bus time. Adds coolant temp, rpm, speed and battery voltage via the F4xx aliases and tags the metric slots. --- signalsets/v3/default.json | 124 +++++++------------------------------ 1 file changed, 24 insertions(+), 100 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 8b48fa3..fbac357 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -60,83 +60,23 @@ ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "03F3"}, "freq": 0.5, "signals": [ - {"id": "LR4_ENGINE_OIL_TEMP", "path": "Engine", "fmt": { "len": 8, "max": 120, "min": -40, "add": -40, "unit": "celsius" }, "name": "Oil Temp"} + {"id": "LR4_ENGINE_OIL_TEMP", "path": "Engine", "fmt": { "len": 8, "max": 120, "min": -40, "add": -40, "unit": "celsius" }, "name": "Oil Temp", "suggestedMetric": "engineOilTemperature"} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "0520"}, "freq": 1, "signals": [ {"id": "LR4_CHARGE_AIR_TEMP", "path": "Engine", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Charge Air Temp"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "112C"}, "freq": 1, - "signals": [ - {"id": "LR4_112C_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "112C Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1139"}, "freq": 1, - "signals": [ - {"id": "LR4_1139_RAW", "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "1139 Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "113F"}, "freq": 1, - "signals": [ - {"id": "LR4_113F_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "113F Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1151"}, "freq": 1, - "signals": [ - {"id": "LR4_1151_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "1151 Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1153"}, "freq": 1, - "signals": [ - {"id": "LR4_1153_RAW", "path": "ECU", "fmt": { "len": 16, "max": 32767, "min": -32768, "sign": true, "unit": "scalar" }, "name": "1153 Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1154"}, "freq": 1, - "signals": [ - {"id": "LR4_1154_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "1154 Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1156"}, "freq": 1, - "signals": [ - {"id": "LR4_1156_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1156 Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1159"}, "freq": 1, - "signals": [ - {"id": "LR4_1159_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1159 Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "115B"}, "freq": 1, - "signals": [ - {"id": "LR4_115B_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "115B Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1160"}, "freq": 1, - "signals": [ - {"id": "LR4_1160_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "1160 Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1164"}, "freq": 1, - "signals": [ - {"id": "LR4_1164_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1164 Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1187"}, "freq": 1, - "signals": [ - {"id": "LR4_1187_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1187 Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "11BA"}, "freq": 1, - "signals": [ - {"id": "LR4_11BA_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "11BA Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "11BD"}, "freq": 1, - "signals": [ - {"id": "LR4_11BD_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "11BD Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "11C4"}, "freq": 1, - "signals": [ - {"id": "LR4_11C4_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "11C4 Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "11C5"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F404"}, "freq": 1, "signals": [ - {"id": "LR4_11C5_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "11C5 Raw"} + {"id": "LR4_LOAD_CALC", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Calculated Load", "suggestedMetric": "engineLoad"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F404"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F405"}, "freq": 1, "signals": [ - {"id": "LR4_LOAD_CALC", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Calculated Load"} + {"id": "LR4_COOLANT_TEMP", "path": "Engine", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Coolant Temp", "suggestedMetric": "engineCoolantTemperature"} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F406"}, "freq": 1, "signals": [ - {"id": "LR4_SHRTFT1", "path": "Fuel", "fmt": { "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "Short Term Fuel Trim B1"} + {"id": "LR4_SHRTFT1", "path": "Fuel", "fmt": { "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "Short Term Fuel Trim B1", "suggestedMetric": "shortTermFuelTrim"} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F407"}, "freq": 1, "signals": [ @@ -146,6 +86,14 @@ "signals": [ {"id": "LR4_MAP", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "kilopascal" }, "name": "Manifold Pressure"} ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40C"}, "freq": 1, + "signals": [ + {"id": "LR4_RPM", "path": "Engine", "fmt": { "len": 16, "max": 16383.75, "div": 4, "unit": "rpm" }, "name": "Engine Speed", "suggestedMetric": "engineSpeed"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40D"}, "freq": 1, + "signals": [ + {"id": "LR4_SPEED", "path": "Movement", "fmt": { "len": 8, "max": 255, "unit": "kilometersPerHour" }, "name": "Vehicle Speed", "suggestedMetric": "speed"} + ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40E"}, "freq": 1, "signals": [ {"id": "LR4_SPARK_ADV", "path": "Engine", "fmt": { "len": 8, "max": 63.5, "min": -64, "div": 2, "add": -64, "unit": "degrees" }, "name": "Timing Advance"} @@ -156,11 +104,11 @@ ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F410"}, "freq": 1, "signals": [ - {"id": "LR4_MAF", "path": "Engine", "fmt": { "len": 16, "max": 655.35, "div": 100, "unit": "gramsPerSecond" }, "name": "Mass Air Flow"} + {"id": "LR4_MAF", "path": "Engine", "fmt": { "len": 16, "max": 655.35, "div": 100, "unit": "gramsPerSecond" }, "name": "Mass Air Flow", "suggestedMetric": "massAirFlow"} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F411"}, "freq": 1, "signals": [ - {"id": "LR4_THROTTLE_POS", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Throttle Position"} + {"id": "LR4_THROTTLE_POS", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Throttle Position", "suggestedMetric": "throttlePosition"} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F423"}, "freq": 1, "signals": [ @@ -168,7 +116,7 @@ ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F42F"}, "freq": 1, "signals": [ - {"id": "LR4_FUEL_LEVEL", "path": "Fuel", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Fuel Level"} + {"id": "LR4_FUEL_LEVEL", "path": "Fuel", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Fuel Level", "suggestedMetric": "fuelTankLevel"} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F433"}, "freq": 1, "signals": [ @@ -182,13 +130,17 @@ "signals": [ {"id": "LR4_CAT_TEMP_B2", "path": "Engine", "fmt": { "len": 16, "max": 6513.5, "min": -40, "div": 10, "add": -40, "unit": "celsius" }, "name": "Catalyst Temp B2S1"} ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F442"}, "freq": 1, + "signals": [ + {"id": "LR4_BAT_V", "path": "Battery", "fmt": { "len": 16, "max": 65.535, "div": 1000, "unit": "volts" }, "name": "Battery Voltage", "suggestedMetric": "starterBatteryVoltage"} + ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F443"}, "freq": 1, "signals": [ - {"id": "LR4_LOAD_ABS", "path": "Engine", "fmt": { "len": 16, "max": 25700, "mul": 100, "div": 255, "unit": "percent" }, "name": "Absolute Load"} + {"id": "LR4_LOAD_ABS", "path": "Engine", "fmt": { "len": 16, "max": 25700, "mul": 100, "div": 255, "unit": "percent" }, "name": "Absolute Load", "suggestedMetric": "absoluteEngineLoad"} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F444"}, "freq": 1, "signals": [ - {"id": "LR4_EQ_RATIO", "path": "Engine", "fmt": { "len": 16, "max": 2, "div": 32768, "unit": "scalar" }, "name": "Equivalence Ratio"} + {"id": "LR4_EQ_RATIO", "path": "Engine", "fmt": { "len": 16, "max": 2, "div": 32768, "unit": "scalar" }, "name": "Equivalence Ratio", "suggestedMetric": "commandedLambda"} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F446"}, "freq": 1, "signals": [ @@ -210,37 +162,9 @@ "signals": [ {"id": "LR4_OIL_TEMP_SAE", "path": "Engine", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Oil Temp (SAE)"} ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "0302"}, "freq": 1, - "signals": [ - {"id": "LR4_0302_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "0302 Raw"} - ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "0303"}, "freq": 1, - "signals": [ - {"id": "LR4_0303_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "0303 Raw"} - ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "0304"}, "freq": 1, - "signals": [ - {"id": "LR4_0304_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "0304 Raw"} - ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "0805"}, "freq": 1, - "signals": [ - {"id": "LR4_0805_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "0805 Raw"} - ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "101A"}, "freq": 1, - "signals": [ - {"id": "LR4_101A_RAW", "path": "ECU", "fmt": { "len": 16, "max": 32767, "min": -32768, "sign": true, "unit": "scalar" }, "name": "101A Raw"} - ]}, { "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E69"}, "freq": 0.5, "signals": [ - {"id": "LR4_GEARBOX_OIL_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "max": 120, "min": -40, "add": -40, "unit": "celsius" }, "name": "Gearbox Temp"} - ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "2104"}, "freq": 1, - "signals": [ - {"id": "LR4_2104_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "2104 Raw"} - ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "210F"}, "freq": 1, - "signals": [ - {"id": "LR4_210F_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "210F State"} + {"id": "LR4_GEARBOX_OIL_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "max": 120, "min": -40, "add": -40, "unit": "celsius" }, "name": "Gearbox Temp", "suggestedMetric": "transmissionFluidTemperature"} ]} ] } From ff3e89d6f37e9fbec9350d9073fd8f21435495ed Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Fri, 28 Aug 2026 20:40:48 -0500 Subject: [PATCH 44/84] air suspension answers from 7DB, not 718 Scan log shows 223B03-223B07 requested at hdr 710 coming back from 7DB with plausible corner pressures near 40 psi. Without an explicit rax the adapter filtered the response out, which is why this looked dead. --- signalsets/v3/default.json | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index fbac357..42a7264 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -1,20 +1,32 @@ { "commands": [ -{ "hdr": "710", "cmd": {"22": "3B03"}, "freq": 1, +{ "hdr": "710", "rax": "7DB", "cmd": {"22": "2B12"}, "freq": 1, + "signals": [ + {"id": "LR4_SUSPENSION_2B12", "path": "Suspension", "fmt": { "len": 16, "max": 32767, "min": -32768, "sign": true, "unit": "scalar" }, "name": "Suspension 2B12"} + ]}, +{ "hdr": "710", "rax": "7DB", "cmd": {"22": "3B03"}, "freq": 1, "signals": [ {"id": "LR4_SUSPENSION_PRES_FR", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension Pressure Front Right"} ]}, -{ "hdr": "710", "cmd": {"22": "3B04"}, "freq": 1, +{ "hdr": "710", "rax": "7DB", "cmd": {"22": "3B04"}, "freq": 1, "signals": [ {"id": "LR4_SUSPENSION_PRES_FL", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension Pressure Front Left"} ]}, -{ "hdr": "710", "cmd": {"22": "3B05"}, "freq": 1, +{ "hdr": "710", "rax": "7DB", "cmd": {"22": "3B05"}, "freq": 1, "signals": [ {"id": "LR4_SUSPENSION_PRES_RR", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension Pressure Rear Right"} ]}, -{ "hdr": "710", "cmd": {"22": "3B06"}, "freq": 1, +{ "hdr": "710", "rax": "7DB", "cmd": {"22": "3B06"}, "freq": 1, "signals": [ {"id": "LR4_SUSPENSION_PRES_RL", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension Pressure Rear Left"} ]}, +{ "hdr": "710", "rax": "7DB", "cmd": {"22": "3B07"}, "freq": 1, + "signals": [ + {"id": "LR4_SUSPENSION_3B07", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension 3B07"} + ]}, +{ "hdr": "710", "rax": "7DB", "cmd": {"22": "D11A"}, "freq": 1, + "signals": [ + {"id": "LR4_SUSPENSION_D11A", "path": "Suspension", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "Suspension D11A"} + ]}, { "hdr": "732", "cmd": {"22": "D928"}, "freq": 1, "signals": [ {"id": "LR4_GEAR_SELECTOR", "path": "Transmission", "name": "Gear Selector", "fmt": {"len": 8, "map": { From 4bc9f5caf801685b1ff3ed640312a61d0485a17e Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Fri, 28 Aug 2026 20:42:01 -0500 Subject: [PATCH 45/84] probe 792 for the 2A3x frames 79A broadcasts unsolicited --- signalsets/v3/default.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 42a7264..f60a128 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -54,6 +54,22 @@ "signals": [ {"id": "LR4_TP_RL", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 3.5, "mul": 0.01373, "unit": "bars" }, "name": "Rear Left Tire Pressure", "suggestedMetric": "rearLeftTirePressure"} ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A36"}, "freq": 5, + "signals": [ + {"id": "LR4_2A36_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A36 Raw"} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A37"}, "freq": 5, + "signals": [ + {"id": "LR4_2A37_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A37 Raw"} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A38"}, "freq": 5, + "signals": [ + {"id": "LR4_2A38_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A38 Raw"} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A3A"}, "freq": 5, + "signals": [ + {"id": "LR4_2A3A_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A3A Raw"} + ]}, { "hdr": "795", "cmd": {"22": "1E8A"}, "freq": 0.5, "signals": [ {"id": "LR4_REAR_DIFF_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "max": 150, "min": -40, "add": -40, "unit": "celsius" }, "name": "Locking Diff Oil Temp"} From 4362a24139dc5ee85a6f41f383afa18abbd54c51 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Fri, 28 Aug 2026 20:45:53 -0500 Subject: [PATCH 46/84] suspension request goes to 7D3, not 710 Tonight's log shows 223B0x at hdr 710 returning NO DATA on every attempt. The 7DB frames carrying 623B03-623B07 are stray broadcasts captured during adapter desync, not replies to 710, so the request address was never established. 7D3 is the UDS convention for a responder at 7DB. --- signalsets/v3/default.json | 56 +++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index f60a128..0489529 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -1,32 +1,4 @@ { "commands": [ -{ "hdr": "710", "rax": "7DB", "cmd": {"22": "2B12"}, "freq": 1, - "signals": [ - {"id": "LR4_SUSPENSION_2B12", "path": "Suspension", "fmt": { "len": 16, "max": 32767, "min": -32768, "sign": true, "unit": "scalar" }, "name": "Suspension 2B12"} - ]}, -{ "hdr": "710", "rax": "7DB", "cmd": {"22": "3B03"}, "freq": 1, - "signals": [ - {"id": "LR4_SUSPENSION_PRES_FR", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension Pressure Front Right"} - ]}, -{ "hdr": "710", "rax": "7DB", "cmd": {"22": "3B04"}, "freq": 1, - "signals": [ - {"id": "LR4_SUSPENSION_PRES_FL", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension Pressure Front Left"} - ]}, -{ "hdr": "710", "rax": "7DB", "cmd": {"22": "3B05"}, "freq": 1, - "signals": [ - {"id": "LR4_SUSPENSION_PRES_RR", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension Pressure Rear Right"} - ]}, -{ "hdr": "710", "rax": "7DB", "cmd": {"22": "3B06"}, "freq": 1, - "signals": [ - {"id": "LR4_SUSPENSION_PRES_RL", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension Pressure Rear Left"} - ]}, -{ "hdr": "710", "rax": "7DB", "cmd": {"22": "3B07"}, "freq": 1, - "signals": [ - {"id": "LR4_SUSPENSION_3B07", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension 3B07"} - ]}, -{ "hdr": "710", "rax": "7DB", "cmd": {"22": "D11A"}, "freq": 1, - "signals": [ - {"id": "LR4_SUSPENSION_D11A", "path": "Suspension", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "Suspension D11A"} - ]}, { "hdr": "732", "cmd": {"22": "D928"}, "freq": 1, "signals": [ {"id": "LR4_GEAR_SELECTOR", "path": "Transmission", "name": "Gear Selector", "fmt": {"len": 8, "map": { @@ -74,6 +46,34 @@ "signals": [ {"id": "LR4_REAR_DIFF_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "max": 150, "min": -40, "add": -40, "unit": "celsius" }, "name": "Locking Diff Oil Temp"} ]}, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "2B12"}, "freq": 1, + "signals": [ + {"id": "LR4_SUSPENSION_2B12", "path": "Suspension", "fmt": { "len": 16, "max": 32767, "min": -32768, "sign": true, "unit": "scalar" }, "name": "Suspension 2B12"} + ]}, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B03"}, "freq": 1, + "signals": [ + {"id": "LR4_SUSPENSION_PRES_FR", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension Pressure Front Right"} + ]}, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B04"}, "freq": 1, + "signals": [ + {"id": "LR4_SUSPENSION_PRES_FL", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension Pressure Front Left"} + ]}, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B05"}, "freq": 1, + "signals": [ + {"id": "LR4_SUSPENSION_PRES_RR", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension Pressure Rear Right"} + ]}, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B06"}, "freq": 1, + "signals": [ + {"id": "LR4_SUSPENSION_PRES_RL", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension Pressure Rear Left"} + ]}, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B07"}, "freq": 1, + "signals": [ + {"id": "LR4_SUSPENSION_3B07", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension 3B07"} + ]}, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "D11A"}, "freq": 1, + "signals": [ + {"id": "LR4_SUSPENSION_D11A", "path": "Suspension", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "Suspension D11A"} + ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "033E"}, "freq": 1, "signals": [ {"id": "LR4_FUEL_RAIL_P", "path": "Fuel", "fmt": { "len": 16, "max": 30000, "unit": "kilopascal" }, "name": "Fuel Rail Pressure"} From 449671c955fd59c72a5eced25b7661340c10d3b3 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sat, 29 Aug 2026 00:45:33 -0500 Subject: [PATCH 47/84] add odometer, name the suspension module DIDs, sweep 2A block 22DD01 answers at 7E8 and 7E9 and advanced 845 counts over 35 days, which reads as kilometers. D11A tracked battery voltage at 0.16V per count. Drops the 751 TPMS commands after 458 NO DATA per corner. --- signalsets/v3/default.json | 56 +++++++++++++++++++++++++++++++------- 1 file changed, 46 insertions(+), 10 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 0489529..10d996f 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -10,21 +10,29 @@ }} } ]}, -{ "hdr": "751", "rax": "759", "cmd": {"22": "2076"}, "freq": 5, +{ "hdr": "761", "rax": "769", "cmd": {"22": "197C"}, "freq": 1, "signals": [ - {"id": "LR4_TP_FL", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 3.5, "mul": 0.01373, "unit": "bars" }, "name": "Front Left Tire Pressure", "suggestedMetric": "frontLeftTirePressure"} + {"id": "LR4_197C_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "197C Raw"} ]}, -{ "hdr": "751", "rax": "759", "cmd": {"22": "2077"}, "freq": 5, +{ "hdr": "761", "rax": "769", "cmd": {"22": "D11C"}, "freq": 1, "signals": [ - {"id": "LR4_TP_FR", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 3.5, "mul": 0.01373, "unit": "bars" }, "name": "Front Right Tire Pressure", "suggestedMetric": "frontRightTirePressure"} + {"id": "LR4_D11C_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "D11C Raw"} ]}, -{ "hdr": "751", "rax": "759", "cmd": {"22": "2078"}, "freq": 5, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A32"}, "freq": 5, "signals": [ - {"id": "LR4_TP_RR", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 3.5, "mul": 0.01373, "unit": "bars" }, "name": "Rear Right Tire Pressure", "suggestedMetric": "rearRightTirePressure"} + {"id": "LR4_2A32_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A32 Raw"} ]}, -{ "hdr": "751", "rax": "759", "cmd": {"22": "2079"}, "freq": 5, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A33"}, "freq": 5, "signals": [ - {"id": "LR4_TP_RL", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 3.5, "mul": 0.01373, "unit": "bars" }, "name": "Rear Left Tire Pressure", "suggestedMetric": "rearLeftTirePressure"} + {"id": "LR4_2A33_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A33 Raw"} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A34"}, "freq": 5, + "signals": [ + {"id": "LR4_2A34_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A34 Raw"} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A35"}, "freq": 5, + "signals": [ + {"id": "LR4_2A35_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A35 Raw"} ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A36"}, "freq": 5, "signals": [ @@ -38,17 +46,41 @@ "signals": [ {"id": "LR4_2A38_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A38 Raw"} ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A39"}, "freq": 5, + "signals": [ + {"id": "LR4_2A39_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A39 Raw"} + ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A3A"}, "freq": 5, "signals": [ {"id": "LR4_2A3A_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A3A Raw"} ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A3B"}, "freq": 5, + "signals": [ + {"id": "LR4_2A3B_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A3B Raw"} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A3C"}, "freq": 5, + "signals": [ + {"id": "LR4_2A3C_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A3C Raw"} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A3D"}, "freq": 5, + "signals": [ + {"id": "LR4_2A3D_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A3D Raw"} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A3E"}, "freq": 5, + "signals": [ + {"id": "LR4_2A3E_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A3E Raw"} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A3F"}, "freq": 5, + "signals": [ + {"id": "LR4_2A3F_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A3F Raw"} + ]}, { "hdr": "795", "cmd": {"22": "1E8A"}, "freq": 0.5, "signals": [ {"id": "LR4_REAR_DIFF_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "max": 150, "min": -40, "add": -40, "unit": "celsius" }, "name": "Locking Diff Oil Temp"} ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "2B12"}, "freq": 1, "signals": [ - {"id": "LR4_SUSPENSION_2B12", "path": "Suspension", "fmt": { "len": 16, "max": 32767, "min": -32768, "sign": true, "unit": "scalar" }, "name": "Suspension 2B12"} + {"id": "LR4_SUSPENSION_2B12", "path": "Suspension", "fmt": { "len": 16, "max": 32767, "min": -32768, "sign": true, "unit": "millimeters" }, "name": "Suspension Height Offset"} ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B03"}, "freq": 1, "signals": [ @@ -72,7 +104,7 @@ ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "D11A"}, "freq": 1, "signals": [ - {"id": "LR4_SUSPENSION_D11A", "path": "Suspension", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "Suspension D11A"} + {"id": "LR4_SUSPENSION_SUPPLY_V", "path": "Suspension", "fmt": { "len": 8, "max": 40.8, "mul": 16, "div": 100, "unit": "volts" }, "name": "Suspension Module Voltage"} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "033E"}, "freq": 1, "signals": [ @@ -94,6 +126,10 @@ "signals": [ {"id": "LR4_CHARGE_AIR_TEMP", "path": "Engine", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Charge Air Temp"} ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "DD01"}, "freq": 0.2, + "signals": [ + {"id": "LR4_ODOMETER", "path": "Trips", "fmt": { "len": 24, "max": 16777215, "unit": "kilometers" }, "name": "Odometer", "suggestedMetric": "odometer"} + ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F404"}, "freq": 1, "signals": [ {"id": "LR4_LOAD_CALC", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Calculated Load", "suggestedMetric": "engineLoad"} From 10298d08f7753af88e43f953ab71e8864fc35fd0 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sat, 29 Aug 2026 00:54:31 -0500 Subject: [PATCH 48/84] wire remaining metric slots, guard readings with nullmin, try extended addressing for TPMS Reviewed Toyota-Tacoma, Jeep-Grand-Cherokee and Land-Rover-Defender. Both larger repos reach their tire modules through addressing this truck has never been asked with: Tacoma via ISO-TP extended address (eax/tst/fcm1), Jeep via a 29-bit header. Adds the eax variant here. nullmin follows their convention so an absent sensor reads as no data instead of zero. --- signalsets/v3/default.json | 88 ++++++++++++++++++++++++++++---------- 1 file changed, 66 insertions(+), 22 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 10d996f..94fa129 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -10,97 +10,113 @@ }} } ]}, +{ "hdr": "751", "rax": "759", "eax": "2A", "tst": "2A", "tmo": "96", "fcm1": true, "cmd": {"22": "2076"}, "freq": 5, + "signals": [ + {"id": "LR4_TPMS_EAX2A", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "nullmin": 0, "unit": "bars" }, "name": "TPMS Probe eax 2A"} + ]}, { "hdr": "761", "rax": "769", "cmd": {"22": "197C"}, "freq": 1, "signals": [ - {"id": "LR4_197C_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "197C Raw"} + {"id": "LR4_197C_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "197C Raw"} ]}, { "hdr": "761", "rax": "769", "cmd": {"22": "D11C"}, "freq": 1, "signals": [ - {"id": "LR4_D11C_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "D11C Raw"} + {"id": "LR4_D11C_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "D11C Raw"} ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A32"}, "freq": 5, "signals": [ - {"id": "LR4_2A32_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A32 Raw"} + {"id": "LR4_2A32_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A32 Raw"} ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A33"}, "freq": 5, "signals": [ - {"id": "LR4_2A33_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A33 Raw"} + {"id": "LR4_2A33_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A33 Raw"} ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A34"}, "freq": 5, "signals": [ - {"id": "LR4_2A34_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A34 Raw"} + {"id": "LR4_2A34_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A34 Raw"} ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A35"}, "freq": 5, "signals": [ - {"id": "LR4_2A35_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A35 Raw"} + {"id": "LR4_2A35_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A35 Raw"} ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A36"}, "freq": 5, "signals": [ - {"id": "LR4_2A36_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A36 Raw"} + {"id": "LR4_2A36_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A36 Raw"} ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A37"}, "freq": 5, "signals": [ - {"id": "LR4_2A37_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A37 Raw"} + {"id": "LR4_2A37_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A37 Raw"} ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A38"}, "freq": 5, "signals": [ - {"id": "LR4_2A38_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A38 Raw"} + {"id": "LR4_2A38_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A38 Raw"} ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A39"}, "freq": 5, "signals": [ - {"id": "LR4_2A39_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A39 Raw"} + {"id": "LR4_2A39_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A39 Raw"} ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A3A"}, "freq": 5, "signals": [ - {"id": "LR4_2A3A_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A3A Raw"} + {"id": "LR4_2A3A_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A3A Raw"} ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A3B"}, "freq": 5, "signals": [ - {"id": "LR4_2A3B_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A3B Raw"} + {"id": "LR4_2A3B_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A3B Raw"} ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A3C"}, "freq": 5, "signals": [ - {"id": "LR4_2A3C_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A3C Raw"} + {"id": "LR4_2A3C_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A3C Raw"} ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A3D"}, "freq": 5, "signals": [ - {"id": "LR4_2A3D_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A3D Raw"} + {"id": "LR4_2A3D_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A3D Raw"} ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A3E"}, "freq": 5, "signals": [ - {"id": "LR4_2A3E_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A3E Raw"} + {"id": "LR4_2A3E_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A3E Raw"} ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A3F"}, "freq": 5, "signals": [ - {"id": "LR4_2A3F_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A3F Raw"} + {"id": "LR4_2A3F_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A3F Raw"} ]}, { "hdr": "795", "cmd": {"22": "1E8A"}, "freq": 0.5, "signals": [ {"id": "LR4_REAR_DIFF_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "max": 150, "min": -40, "add": -40, "unit": "celsius" }, "name": "Locking Diff Oil Temp"} ]}, +{ "hdr": "795", "rax": "79D", "cmd": {"22": "1E88"}, "freq": 1, + "signals": [ + {"id": "LR4_1E88_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "1E88 Raw"} + ]}, +{ "hdr": "795", "rax": "79D", "cmd": {"22": "1E89"}, "freq": 1, + "signals": [ + {"id": "LR4_1E89_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "1E89 Raw"} + ]}, +{ "hdr": "795", "rax": "79D", "cmd": {"22": "1E8B"}, "freq": 1, + "signals": [ + {"id": "LR4_1E8B_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "1E8B Raw"} + ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "2B12"}, "freq": 1, "signals": [ {"id": "LR4_SUSPENSION_2B12", "path": "Suspension", "fmt": { "len": 16, "max": 32767, "min": -32768, "sign": true, "unit": "millimeters" }, "name": "Suspension Height Offset"} ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B03"}, "freq": 1, "signals": [ - {"id": "LR4_SUSPENSION_PRES_FR", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension Pressure Front Right"} + {"id": "LR4_SUSPENSION_PRES_FR", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "nullmin": 0, "unit": "psi" }, "name": "Suspension Pressure Front Right"} ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B04"}, "freq": 1, "signals": [ - {"id": "LR4_SUSPENSION_PRES_FL", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension Pressure Front Left"} + {"id": "LR4_SUSPENSION_PRES_FL", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "nullmin": 0, "unit": "psi" }, "name": "Suspension Pressure Front Left"} ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B05"}, "freq": 1, "signals": [ - {"id": "LR4_SUSPENSION_PRES_RR", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension Pressure Rear Right"} + {"id": "LR4_SUSPENSION_PRES_RR", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "nullmin": 0, "unit": "psi" }, "name": "Suspension Pressure Rear Right"} ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B06"}, "freq": 1, "signals": [ - {"id": "LR4_SUSPENSION_PRES_RL", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension Pressure Rear Left"} + {"id": "LR4_SUSPENSION_PRES_RL", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "nullmin": 0, "unit": "psi" }, "name": "Suspension Pressure Rear Left"} ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B07"}, "freq": 1, "signals": [ - {"id": "LR4_SUSPENSION_3B07", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "unit": "psi" }, "name": "Suspension 3B07"} + {"id": "LR4_SUSPENSION_3B07", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "nullmin": 0, "unit": "psi" }, "name": "Suspension 3B07"} ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "D11A"}, "freq": 1, "signals": [ @@ -128,7 +144,7 @@ ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "DD01"}, "freq": 0.2, "signals": [ - {"id": "LR4_ODOMETER", "path": "Trips", "fmt": { "len": 24, "max": 16777215, "unit": "kilometers" }, "name": "Odometer", "suggestedMetric": "odometer"} + {"id": "LR4_ODOMETER", "path": "Trips", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "kilometers" }, "name": "Odometer", "suggestedMetric": "odometer"} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F404"}, "freq": 1, "signals": [ @@ -182,10 +198,18 @@ "signals": [ {"id": "LR4_FUEL_LEVEL", "path": "Fuel", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Fuel Level", "suggestedMetric": "fuelTankLevel"} ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F431"}, "freq": 1, + "signals": [ + {"id": "LR4_DIST_SINCE_CLR", "path": "Trips", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "kilometers" }, "name": "Distance Since Codes Cleared", "suggestedMetric": "distanceSinceDTCsCleared"} + ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F433"}, "freq": 1, "signals": [ {"id": "LR4_BARO", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "kilopascal" }, "name": "Barometric Pressure"} ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F434"}, "freq": 1, + "signals": [ + {"id": "LR4_O2_LAMBDA", "path": "Engine", "fmt": { "len": 16, "max": 2, "div": 32768, "nullmin": 0, "unit": "scalar" }, "name": "O2 Lambda B1S1", "suggestedMetric": "o2Lambda"} + ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F43C"}, "freq": 1, "signals": [ {"id": "LR4_CAT_TEMP_B1", "path": "Engine", "fmt": { "len": 16, "max": 6513.5, "min": -40, "div": 10, "add": -40, "unit": "celsius" }, "name": "Catalyst Temp B1S1"} @@ -226,9 +250,29 @@ "signals": [ {"id": "LR4_OIL_TEMP_SAE", "path": "Engine", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Oil Temp (SAE)"} ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F45E"}, "freq": 1, + "signals": [ + {"id": "LR4_FUEL_RATE", "path": "Fuel", "fmt": { "len": 16, "max": 3276.75, "div": 20, "nullmin": 0, "unit": "litersPerHour" }, "name": "Fuel Rate", "suggestedMetric": "fuelRate"} + ]}, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E68"}, "freq": 1, + "signals": [ + {"id": "LR4_1E68_RAW", "path": "Transmission", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "1E68 Raw"} + ]}, { "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E69"}, "freq": 0.5, "signals": [ {"id": "LR4_GEARBOX_OIL_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "max": 120, "min": -40, "add": -40, "unit": "celsius" }, "name": "Gearbox Temp", "suggestedMetric": "transmissionFluidTemperature"} + ]}, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E6A"}, "freq": 1, + "signals": [ + {"id": "LR4_1E6A_RAW", "path": "Transmission", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "1E6A Raw"} + ]}, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E6B"}, "freq": 1, + "signals": [ + {"id": "LR4_1E6B_RAW", "path": "Transmission", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "1E6B Raw"} + ]}, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E70"}, "freq": 1, + "signals": [ + {"id": "LR4_1E70_RAW", "path": "Transmission", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "1E70 Raw"} ]} ] } From d2d49a35931f44cd7d39c54d1e41addc0980a083 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sat, 29 Aug 2026 01:07:00 -0500 Subject: [PATCH 49/84] document the signal reference Covers each module and signal, the pairs that read differently together (boost from MAP minus baro, heat-limited power, fueling health, sensor cross-checks), what is still undecoded, and terminal safety. --- README.md | 272 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 271 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3553b0c..a6ad360 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,272 @@ -# Model make +# Land Rover LR4 (L319) — Signal Reference +OBDb signalset for the 2016 Land Rover LR4 / Discovery 4 — 3.0L supercharged +V6 (AJ126), ZF 8HP70, full-time 4WD with locking rear differential and +electronic air suspension. + +Signals here were confirmed against ~13M logged request/response pairs from +this vehicle (VIN `SALAK2V62GA832217`). Anything still named `*_RAW` responds +on the bus but hasn't been decoded yet. + +--- + +## Modules + +Seven modules answer on this truck. Requests go to `hdr`, replies come back +from `rax`. + +| Request | Response | Module | +|---|---|---| +| `7E0` | `7E8` | Engine (ECM) | +| `7E1` | `7E9` | Transmission (TCM) | +| `732` | `73A` | Gear selector | +| `761` | `769` | Body / instrument | +| `795` | `79D` | Rear differential | +| `792` | `79A` | Unidentified — answers `2A3x` | +| `7D3` | `7DB` | Air suspension (EAS) | + +Two addressing quirks are worth knowing: + +**Per-ECU DID offsets.** The engine's proprietary DIDs sit `+0x300` from +their base (`00F2` → `03F2`), while the transmission and differential use +`+0x1000` (`0E69` → `1E69`). A DID that returns "out of range" is often just +sitting at the other offset. + +**`22F4xx` aliases.** Any standard OBD PID `01XX` is also readable as +`22F4XX` — `010C` (RPM) is the same data as `22F40C`. This matters because +Pelican handles standard PIDs internally, so a signalset entry for `012F` +never surfaces in the app. The `F4xx` alias arrives as a custom signal and +shows up normally. Most of this file uses that trick. + +--- + +## Engine + +| Signal | Address | Notes | +|---|---|---| +| Engine Speed | `7E0` `22F40C` | | +| Calculated Load | `7E0` `22F404` | Percent of available torque at current RPM | +| Absolute Load | `7E0` `22F443` | Percent of *peak possible* airflow — exceeds 100% under boost | +| Coolant Temp | `7E0` `22F405` | Thermostat opens ~88°C; normal running 90–105°C | +| Manifold Pressure | `7E0` `22F40B` | **Absolute**, not gauge. See boost calculation below | +| Barometric Pressure | `7E0` `22F433` | ~101 kPa at sea level, drops with altitude | +| Intake Air Temp | `7E0` `22F40F` | Before the supercharger | +| Charge Air Temp | `7E0` `220520` | **After** the supercharger and intercooler | +| Timing Advance | `7E0` `22F40E` | Degrees before top dead centre | +| Throttle Position | `7E0` `22F411` | Actual plate position | +| Commanded Throttle | `7E0` `22F44C` | What the ECU asked for | +| Accelerator Pedal D / E | `7E0` `22F449` / `22F44A` | Two sensors in one pedal | +| Mass Air Flow | `7E0` `22F410` | Grams of air per second | +| Equivalence Ratio | `7E0` `22F444` | Commanded lambda | +| O2 Lambda B1S1 | `7E0` `22F434` | Measured lambda | +| Catalyst Temp B1S1 / B2S1 | `7E0` `22F43C` / `22F43D` | One per bank | +| Oil Temp | `7E0` `2203F3` | Land Rover's own sensor | +| Oil Temp (SAE) | `7E0` `22F45C` | Standard PID, same physical sensor | +| Oil Level | `7E0` `2203E6` | Millimetres in the sump | +| Oil Volume | `7E0` `2203F2` | | + +### Lambda + +Lambda expresses air-fuel ratio relative to perfect combustion (14.7:1 for +gasoline). + +- **1.00** — stoichiometric, the cruise target +- **below 1.00** — rich, extra fuel +- **above 1.00** — lean, extra air + +Under boost the ECU deliberately commands rich (~0.85) because extra fuel +cools the charge and suppresses knock. A value of 2.00 means deceleration +fuel cut — injectors fully off while coasting, sensor reading pure air. + +--- + +## Fuel + +| Signal | Address | Notes | +|---|---|---| +| Fuel Level | `7E0` `22F42F` | | +| Fuel Rate | `7E0` `22F45E` | Litres per hour | +| Fuel Rail Pressure | `7E0` `22033E` | Proprietary; ~60 bar idle, 130+ under load | +| Fuel Rail Pressure (SAE) | `7E0` `22F423` | Standard PID, same rail | +| Short Term Fuel Trim B1 | `7E0` `22F406` | Immediate correction, swings constantly | +| Long Term Fuel Trim B1 | `7E0` `22F407` | Learned correction, drifts slowly | + +--- + +## Drivetrain + +| Signal | Address | Notes | +|---|---|---| +| Gear Selector | `732` `22D928` | 0 Park · 1 Reverse · 2 Neutral · 3 Drive · 7 Sport | +| Gearbox Temp | `7E1` `221E69` | ZF 8HP70 sump | +| Locking Diff Oil Temp | `795` `221E8A` | | + +--- + +## Suspension + +All four corners report gauge pressure in the air spring. + +| Signal | Address | +|---|---| +| Pressure Front Left / Right | `7D3` `223B04` / `223B03` | +| Pressure Rear Left / Right | `7D3` `223B06` / `223B05` | +| Height Offset | `7D3` `222B12` | Signed, millimetres from nominal | +| Module Voltage | `7D3` `22D11A` | Should mirror battery voltage | + +Normal standing pressures are roughly 40 psi per corner at normal ride +height, rising with load and with raised height modes. + +--- + +## Reading signals together + +Individual numbers are useful. Pairs are where the diagnostics live. + +### Boost — Manifold Pressure minus Barometric Pressure + +The LR4 reports manifold pressure as *absolute*, so at idle it reads well +below atmospheric and looks wrong. Subtract barometric and you get true +boost: + +``` +boost = Manifold Pressure − Barometric Pressure +``` + +Negative is vacuum (closed throttle, coasting). Zero is atmospheric. Positive +is supercharger boost. Because barometric is a live reading, this stays +correct as you gain or lose altitude. + +### Heat-limited power — Charge Air Temp with Timing Advance + +Charge air temp is the truck's honest report of whether the intercooler is +keeping up. Watch it with timing advance: + +| Charge air temp | Timing advance | Meaning | +|---|---|---| +| Near ambient | Normal | Healthy, full power available | +| Climbing | Retarding | ECU pulling timing to prevent knock — power is fading | +| High, stable after stopping | — | Heat soak; recovers once moving | + +Timing retarding *without* a temperature rise points at fuel quality or knock +sensor activity instead. + +### Fueling health — Commanded vs Measured Lambda + +Equivalence Ratio is the target, O2 Lambda is reality. They should track +closely. A persistent gap means fueling isn't achieving its target — failing +sensor, vacuum leak, or fuel delivery shortfall. + +### Total fuel correction — Short Term plus Long Term Trim + +Add them. Their sum is how far off the base fuel map the engine is running. + +| Sum | Meaning | +|---|---| +| Within ±5% | Normal | +| Around +20% at warm idle | Adding fuel to compensate — vacuum leak or lazy MAF | +| Persistently negative | Running rich — leaking injector or high fuel pressure | + +Short term swinging while long term stays near zero is normal closed-loop +operation. Long term drifting away from zero is the engine *learning* a +problem, which is the one to act on. + +### Sensor cross-checks + +Several values are measured twice by independent paths. Agreement validates +both; disagreement localises the fault. + +| Pair | Should agree within | +|---|---| +| Oil Temp vs Oil Temp (SAE) | A few degrees | +| Fuel Rail Pressure vs SAE equivalent | Similar magnitude at steady idle | +| Accelerator Pedal D vs E | A percent or two — they're redundant by design | + +Pedal D and E disagreeing is significant: the ECU compares them itself and +will enter limp mode if they diverge. + +### Bank imbalance — Catalyst Temp B1 vs B2 + +The two banks should run within ~30°C of each other. A persistent split means +one bank is working harder — a misfire, an injector, or an O2 sensor on the +cooler side. + +### Load distribution — the four suspension pressures + +Front and rear pairs should be near-symmetrical left to right. A single +corner reading consistently low is either a load imbalance or an air spring +losing pressure. Compare against Height Offset: if pressure is low but height +is nominal, the system is compensating for a slow leak. + +### Warm-up sequence — Coolant, Oil, Gearbox + +These heat at different rates, and the order tells you about circulation. +Coolant reaches operating temperature first, oil follows several minutes +later, gearbox last. Oil temp lagging far behind coolant on a long drive +suggests restricted flow. Gearbox temperature climbing above normal while +towing is the signal to back off. + +### Airflow sanity — MAF against RPM and Load + +At idle, roughly 3–8 g/s. Under full boost, ten times that or more. MAF +staying flat while load and RPM climb means the sensor is under-reporting — +which the fuel trims will then try to correct, showing up as a rising +positive trim. + +--- + +## Undecoded + +These respond on the bus but their meaning isn't established. They're in the +signalset so their values get logged during normal driving, which is how the +formulas eventually get worked out. + +| Address | Signals | +|---|---| +| `792` / `79A` | `2A32`–`2A3F` — `2A36`, `2A37`, `2A38`, `2A3A` return data; the rest are a sweep | +| `795` / `79D` | `1E88`, `1E89`, `1E8B` — neighbours of the differential temp | +| `7E1` / `7E9` | `1E68`, `1E6A`, `1E6B`, `1E70` — neighbours of the gearbox temp | +| `761` / `769` | `197C`, `D11C` | +| `7D3` / `7DB` | `3B07` — reads lower than the four corner pressures | + +**Tire pressures remain unsolved.** Module `751` returns no data to any +request. Both Toyota-Tacoma and Jeep-Grand-Cherokee reach their tire modules +through addressing modes never tried here — Tacoma via ISO-TP extended +addressing (`eax`/`tst`/`fcm1`), Jeep via a 29-bit header (`DAC7`). The +extended-address variant is in this signalset as `LR4_TPMS_EAX2A`. + +--- + +## Terminal probing + +Sidecar's terminal is the fastest way to test a DID. + +``` +ATSH 7E0 set request address +ATCRA 7E8 set response filter +22F42F read a DID +ATAR restore automatic addressing +``` + +**Always finish with `ATAR`.** A left-over `ATCRA` filter blocks replies from +every other module, which makes the whole app look broken. + +Reading a reply — `7E8 04 62 F42F EC` is address, length, positive response, +echoed DID, then data. `7E8 03 7F 22 31` is a negative response: the DID +doesn't exist here. `NO DATA` means nothing answered at all. + +### Safety + +Service `22` is read-only by definition and cannot change vehicle state. It +is safe to send anything at it. + +Service `10 03` (extended diagnostic session) does change ECU state. It's a +standard service that auto-reverts after a few seconds, but run it parked — +some modules reduce normal messaging while an extended session is open. + +Avoid entirely unless you know exactly what you're doing: `2F` (actuator +control), `31` (routine control), `2E` (write), `11` (ECU reset), `14` (clear +codes), `27` (security access). On this vehicle `2F` and `31` sent to the +suspension module can physically raise or lower the truck, and `14` erases +emissions readiness monitors, which means failing inspection until a full +drive cycle completes. From cfa5e6ca17b794acbb49d6b232e4468cbe282c8d Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sat, 29 Aug 2026 01:17:03 -0500 Subject: [PATCH 50/84] compute health ratios as synthetic signals The schema supports synthetics with a ratio operation, so pairs that should hold a fixed value become single displayable numbers. Six of the eight read 1.0 when healthy. Subtraction is not available, so gauge boost stays a manual calculation and the pressure ratio carries it instead. --- README.md | 28 ++++++++++++++++++++++++++++ signalsets/v3/default.json | 26 ++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/README.md b/README.md index a6ad360..12c9208 100644 --- a/README.md +++ b/README.md @@ -215,6 +215,34 @@ positive trim. --- +## Computed signals + +The signalset defines eight synthetic signals. Each is a **ratio between two +readings that should hold a known value**, which makes them suited to a +display: you learn the normal number once, and anything else is a signal. + +| Signal | Ratio | Normal | Meaning when it moves | +|---|---|---|---| +| Boost Pressure Ratio | MAP / Barometric | 1.0 idle, up to ~1.8 | Above 1.0 is supercharger boost, self-correcting for altitude | +| Lambda Tracking | Measured / Commanded lambda | 1.0 | Fuelling isn't hitting its target — sensor, leak, or delivery | +| Bank Balance | Cat temp B1 / B2 | 1.0 | One bank working harder — misfire or injector on the low side | +| Pedal Agreement | Pedal D / Pedal E | 1.0 | Redundant pedal sensors disagreeing; the ECU limps if they diverge | +| Throttle Tracking | Actual / Commanded throttle | 1.0 | Plate not following orders — sticky or carbonned throttle body | +| Rail Pressure Crosscheck | Proprietary / SAE rail pressure | steady | Drift means one sensor path is wrong | +| Suspension Balance Front | Front left / right pressure | 1.0 | A corner losing air, before the dash warns | +| Suspension Balance Rear | Rear left / right pressure | 1.0 | Same, rear axle | + +Six of the eight sit at **1.0 when healthy**, so a single glance covers +fuelling, ignition balance, pedal and throttle integrity, and air springs. + +Boost Pressure Ratio is the exception and the one to watch for fun: it's the +closest thing to a boost gauge this vehicle exposes. The schema's only +operation is division, so true gauge boost (`MAP − Barometric`) isn't +expressible as a synthetic — but the ratio carries the same information and +needs no altitude correction. + +--- + ## Undecoded These respond on the bus but their meaning isn't established. They're in the diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 94fa129..17f240e 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -274,5 +274,31 @@ "signals": [ {"id": "LR4_1E70_RAW", "path": "Transmission", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "1E70 Raw"} ]} +], +"synthetics": [ + { "id": "LR4_BANK_BALANCE", "path": "Engine", "name": "Bank Balance", "max": 3, "unit": "scalar", "formula": { + "op": "ratio", "a": "LR4_CAT_TEMP_B1", "b": "LR4_CAT_TEMP_B2" + }}, + { "id": "LR4_BOOST_RATIO", "path": "Engine", "name": "Boost Pressure Ratio", "max": 3, "unit": "scalar", "formula": { + "op": "ratio", "a": "LR4_MAP", "b": "LR4_BARO" + }}, + { "id": "LR4_LAMBDA_TRACKING", "path": "Engine", "name": "Lambda Tracking", "max": 3, "unit": "scalar", "formula": { + "op": "ratio", "a": "LR4_O2_LAMBDA", "b": "LR4_EQ_RATIO" + }}, + { "id": "LR4_PEDAL_AGREEMENT", "path": "Engine", "name": "Pedal Agreement", "max": 3, "unit": "scalar", "formula": { + "op": "ratio", "a": "LR4_PEDAL_D", "b": "LR4_PEDAL_E" + }}, + { "id": "LR4_RAIL_CROSSCHECK", "path": "Fuel", "name": "Rail Pressure Crosscheck", "max": 3, "unit": "scalar", "formula": { + "op": "ratio", "a": "LR4_FUEL_RAIL_P", "b": "LR4_FUEL_RAIL_P_GAUGE" + }}, + { "id": "LR4_SUSPENSION_BALANCE_F", "path": "Suspension", "name": "Suspension Balance Front", "max": 3, "unit": "scalar", "formula": { + "op": "ratio", "a": "LR4_SUSPENSION_PRES_FL", "b": "LR4_SUSPENSION_PRES_FR" + }}, + { "id": "LR4_SUSPENSION_BALANCE_R", "path": "Suspension", "name": "Suspension Balance Rear", "max": 3, "unit": "scalar", "formula": { + "op": "ratio", "a": "LR4_SUSPENSION_PRES_RL", "b": "LR4_SUSPENSION_PRES_RR" + }}, + { "id": "LR4_THROTTLE_TRACKING", "path": "Engine", "name": "Throttle Tracking", "max": 3, "unit": "scalar", "formula": { + "op": "ratio", "a": "LR4_THROTTLE_POS", "b": "LR4_THROTTLE_CMD" + }} ] } From 1ca1d9a3dfcc26b471e5ce5fd103c783c726f1b5 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sat, 29 Aug 2026 01:20:46 -0500 Subject: [PATCH 51/84] add mountain and off-road guidance, probe EAS height and drive mode The Jaguar EAS block matched this module on the corner pressures, so its height and drive-mode DIDs are retried here at the correct header. Documents reading altitude from barometric pressure and what each signal does on sustained grades and on the trail. --- README.md | 111 ++++++++++++++++++++++++++++++++++++- signalsets/v3/default.json | 44 +++++++++++++++ 2 files changed, 153 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 12c9208..35258bb 100644 --- a/README.md +++ b/README.md @@ -12,17 +12,25 @@ on the bus but hasn't been decoded yet. ## Modules -Seven modules answer on this truck. Requests go to `hdr`, replies come back +Thirteen modules answer on this truck. Six have never been mined — they +reject unknown DIDs with a negative response rather than staying silent, +which is how we know they're there. Requests go to `hdr`, replies come back from `rax`. | Request | Response | Module | |---|---|---| | `7E0` | `7E8` | Engine (ECM) | | `7E1` | `7E9` | Transmission (TCM) | +| `716` | `71E` | Unmined | +| `726` | `72E` | Unmined — returns the VIN | | `732` | `73A` | Gear selector | +| `734` | `73C` | Unmined | +| `737` | `73F` | Unmined | +| `760` | `768` | Unmined | | `761` | `769` | Body / instrument | -| `795` | `79D` | Rear differential | | `792` | `79A` | Unidentified — answers `2A3x` | +| `795` | `79D` | Rear differential | +| `797` | `79F` | Unmined | | `7D3` | `7DB` | Air suspension (EAS) | Two addressing quirks are worth knowing: @@ -243,6 +251,105 @@ needs no altitude correction. --- +## Altitude and mountain driving + +### Reading altitude + +There's no altitude signal, but **Barometric Pressure is one** — air thins +predictably with height. Read `22F433` directly: + +| Altitude | Barometric | In psi | +|---|---|---| +| Sea level | 101 kPa | 14.7 | +| 2,000 ft | 94 kPa | 13.7 | +| 4,000 ft | 88 kPa | 12.7 | +| 6,000 ft | 81 kPa | 11.8 | +| 8,000 ft | 75 kPa | 10.9 | +| 10,000 ft | 70 kPa | 10.1 | +| 12,000 ft | 64 kPa | 9.3 | + +Roughly 1 kPa per 300 ft in this range. Weather shifts it a few kPa, so treat +it as approximate unless you calibrate against a known elevation. + +### What altitude does to the engine + +A naturally aspirated engine loses about 3% power per 1,000 ft. Yours loses +much less, because the supercharger is a fixed-displacement blower geared to +the crank — it keeps stuffing the same volume in regardless of ambient +pressure. What you'll see instead: + +- **Boost Pressure Ratio holds steady.** It's normalised against barometric, + so it reads the same at 10,000 ft as at sea level. That's the point of + using the ratio rather than raw manifold pressure. +- **Mass Air Flow drops** at the same throttle and RPM. Thinner air, less + mass, less fuel, less power — the loss the blower can't fully erase. +- **Fuel trims may drift positive** as the ECU adapts. Mild drift climbing a + long pass is normal, not a fault. + +### What to watch climbing + +Sustained high load is the hardest thing you'll ask of the truck. + +| Signal | Watch for | +|---|---| +| Charge Air Temp | Climbing on a long pull, with Timing Advance retarding — the ECU protecting itself, and where your power goes | +| Gearbox Temp | The one that matters. Sustained climbing in a low gear heats the ZF fast | +| Coolant Temp | Should stay near 100°C. Rising past that on a grade means the cooling system is at its limit | +| Absolute Load | Pinned near 100% for long stretches means you're asking for everything available | + +### What to watch descending + +Engine braking sends heat somewhere different. + +- **Lambda goes to 2.00** on a closed-throttle descent. That's deceleration + fuel cut, working exactly as intended — you're using no fuel at all. +- **Gearbox Temp still climbs** in a low gear, even off-throttle. +- **Coolant Temp can rise** on a long descent despite low load, because + airflow is low and the engine is being driven by the wheels. + +--- + +## Off-road + +### Air suspension + +The four corner pressures are the most useful thing you have off-road. On +uneven ground the truck articulates, and pressures diverge as weight shifts. + +- **Suspension Balance Front / Rear** — the two synthetic ratios. At 1.0 the + axle is evenly loaded. Away from 1.0, weight has moved to one side. +- A corner going very low while its opposite goes high means that wheel is + unloading — the first hint of lifting a wheel. +- **Height Offset** shows where you are relative to normal ride height. + +Back on pavement both balance ratios should settle at 1.0. If one doesn't, +you've either shifted your load or picked up a slow leak. + +### Watch on the trail + +| Signal | Why | +|---|---| +| Gearbox Temp | Low-range crawling generates heat with almost no airflow. The number to respect | +| Locking Diff Oil Temp | Same reason, and it climbs fast when the diff is locked and working | +| Coolant Temp | Low speed means low airflow; the fan is doing the work alone | +| Suspension Balance | Articulation and weight transfer, live | +| Gear Selector | Confirms what the transmission thinks it's in | + +Ride Height, Ride Height Front/Rear and Drive Mode are in the signalset as +untested probes — the addresses come from a Jaguar EAS that shares this +module's pressure DIDs, so they have a good chance of working. If Drive Mode +returns a value, note what it reads in each Terrain Response setting and the +numbers can be mapped to names. + +### Before you go + +Air suspension raises the truck at low speed and drops it as you speed up. If +you're crawling and it lowers unexpectedly, watch Height Offset and the +corner pressures — an EAS fault normally means the truck sits down, which +matters a lot more with rocks under it than in a parking lot. + +--- + ## Undecoded These respond on the bus but their meaning isn't established. They're in the diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 17f240e..4a100ba 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -98,6 +98,18 @@ "signals": [ {"id": "LR4_SUSPENSION_2B12", "path": "Suspension", "fmt": { "len": 16, "max": 32767, "min": -32768, "sign": true, "unit": "millimeters" }, "name": "Suspension Height Offset"} ]}, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B00"}, "freq": 1, + "signals": [ + {"id": "LR4_3B00_RAW", "path": "Suspension", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "3B00 Raw"} + ]}, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B01"}, "freq": 1, + "signals": [ + {"id": "LR4_3B01_RAW", "path": "Suspension", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "3B01 Raw"} + ]}, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B02"}, "freq": 1, + "signals": [ + {"id": "LR4_3B02_RAW", "path": "Suspension", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "3B02 Raw"} + ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B03"}, "freq": 1, "signals": [ {"id": "LR4_SUSPENSION_PRES_FR", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "nullmin": 0, "unit": "psi" }, "name": "Suspension Pressure Front Right"} @@ -118,6 +130,38 @@ "signals": [ {"id": "LR4_SUSPENSION_3B07", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "nullmin": 0, "unit": "psi" }, "name": "Suspension 3B07"} ]}, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B08"}, "freq": 1, + "signals": [ + {"id": "LR4_3B08_RAW", "path": "Suspension", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "3B08 Raw"} + ]}, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B09"}, "freq": 1, + "signals": [ + {"id": "LR4_3B09_RAW", "path": "Suspension", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "3B09 Raw"} + ]}, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B0A"}, "freq": 1, + "signals": [ + {"id": "LR4_3B0A_RAW", "path": "Suspension", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "3B0A Raw"} + ]}, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B0B"}, "freq": 1, + "signals": [ + {"id": "LR4_3B0B_RAW", "path": "Suspension", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "3B0B Raw"} + ]}, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B3C"}, "freq": 1, + "signals": [ + {"id": "LR4_RIDE_HEIGHT", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "Ride Height"} + ]}, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B4D"}, "freq": 1, + "signals": [ + {"id": "LR4_DRIVE_MODE", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "Drive Mode"} + ]}, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B71"}, "freq": 1, + "signals": [ + {"id": "LR4_RIDE_HEIGHT_FRONT", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "Ride Height Front"} + ]}, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B72"}, "freq": 1, + "signals": [ + {"id": "LR4_RIDE_HEIGHT_REAR", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "Ride Height Rear"} + ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "D11A"}, "freq": 1, "signals": [ {"id": "LR4_SUSPENSION_SUPPLY_V", "path": "Suspension", "fmt": { "len": 8, "max": 40.8, "mul": 16, "div": 100, "unit": "volts" }, "name": "Suspension Module Voltage"} From a3b7637c52dc2a9a79d774de83457fbc2e585e95 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sat, 29 Aug 2026 01:23:05 -0500 Subject: [PATCH 52/84] record measured altitude baselines from the September 2025 trip Barometric ran 65-76 kPa on that trip, near 10,000 ft for most of it. Long term fuel trim tracks altitude across 76,000 samples, rising from +8.6% near sea level to +14.8% at 10,900 ft. The low-altitude baseline is itself above the healthy band. --- README.md | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 35258bb..ede3e16 100644 --- a/README.md +++ b/README.md @@ -268,9 +268,52 @@ predictably with height. Read `22F433` directly: | 10,000 ft | 70 kPa | 10.1 | | 12,000 ft | 64 kPa | 9.3 | -Roughly 1 kPa per 300 ft in this range. Weather shifts it a few kPa, so treat +Roughly 1 kPa per 300 ft near sea level, stretching to about 340 ft +per kPa above 8,000 ft. Weather shifts it a few kPa, so treat it as approximate unless you calibrate against a known elevation. +### Measured on this truck + +From the September 2025 mountain trip, barometric pressure ranged **65–76 kPa, +median 70** — roughly 7,800 to 11,800 ft, spending most of its time near +10,000. Those runs give real baselines to compare against: + +| Signal | Mountains, Sept 2025 | Notes | +|---|---|---| +| Charge Air Temp | 6–81°C, median 47 | Wide swing with grade and airflow | +| Gearbox Temp | 8–85°C, median 64 | Never troubling | +| Diff Temp | 0–60°C, median 35 | Cooler than a hot-weather lowland drive | +| Coolant Temp | up to 103°C | Normal ceiling on sustained climbs | +| Mass Air Flow | peak 216 g/s | Full-load airflow | + +Worth noting the differential ran *hotter* on flat August driving (median +71°C) than in the mountains (35°C). Ambient temperature matters more to it +than terrain does. + +### Fuel trim climbs with altitude + +Long term fuel trim tracks altitude clearly across ~76,000 logged samples: + +| Barometric | Altitude | Median LTFT | +|---|---|---| +| 100 kPa | ~400 ft | +8.6% | +| 80 kPa | ~6,400 ft | +7.8% | +| 75 kPa | ~7,900 ft | +12.5% | +| 70 kPa | ~9,400 ft | +14.1% | +| 65 kPa | ~10,900 ft | +14.8% | + +Altitude adding fuel trim is expected — the mass air flow sensor tends to +under-report in thin air and the ECU compensates. **The part worth watching +is the low-altitude baseline of around +8%.** A healthy engine sits within +±5%, so there's a mild lean condition present before altitude adds anything, +and the two stack: near +15% at 11,000 ft is approaching where a lean code +would set. + +Most likely cause on this engine is a small unmetered air leak — the +supercharged V6 has a lot of intake plumbing and hose joints. Not urgent, but +if the truck ever feels flat at altitude, this is the reason to look at +first. + ### What altitude does to the engine A naturally aspirated engine loses about 3% power per 1,000 ft. Yours loses From 4238154aa7b123aa252240c304d3837f24236ed5 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sat, 29 Aug 2026 09:54:00 -0500 Subject: [PATCH 53/84] prune what the truck rejected, fix byte lengths Morning test: odometer reads 105,506 mi against the dash, ride height front and rear move with the suspension, module voltage tracks the battery at 14.6 V, and both balance ratios compute. 22F45E, the eax TPMS probe and nine block-sweep DIDs came back rejected or silent. Four more answered a single byte where the definition asked for two. --- signalsets/v3/default.json | 62 +++----------------------------------- 1 file changed, 5 insertions(+), 57 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 4a100ba..9a19955 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -10,17 +10,13 @@ }} } ]}, -{ "hdr": "751", "rax": "759", "eax": "2A", "tst": "2A", "tmo": "96", "fcm1": true, "cmd": {"22": "2076"}, "freq": 5, - "signals": [ - {"id": "LR4_TPMS_EAX2A", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "nullmin": 0, "unit": "bars" }, "name": "TPMS Probe eax 2A"} - ]}, { "hdr": "761", "rax": "769", "cmd": {"22": "197C"}, "freq": 1, "signals": [ {"id": "LR4_197C_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "197C Raw"} ]}, { "hdr": "761", "rax": "769", "cmd": {"22": "D11C"}, "freq": 1, "signals": [ - {"id": "LR4_D11C_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "D11C Raw"} + {"id": "LR4_D11C_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "D11C Raw"} ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A32"}, "freq": 5, "signals": [ @@ -58,42 +54,14 @@ "signals": [ {"id": "LR4_2A3A_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A3A Raw"} ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A3B"}, "freq": 5, - "signals": [ - {"id": "LR4_2A3B_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A3B Raw"} - ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A3C"}, "freq": 5, - "signals": [ - {"id": "LR4_2A3C_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A3C Raw"} - ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A3D"}, "freq": 5, - "signals": [ - {"id": "LR4_2A3D_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A3D Raw"} - ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A3E"}, "freq": 5, - "signals": [ - {"id": "LR4_2A3E_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A3E Raw"} - ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A3F"}, "freq": 5, - "signals": [ - {"id": "LR4_2A3F_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A3F Raw"} - ]}, { "hdr": "795", "cmd": {"22": "1E8A"}, "freq": 0.5, "signals": [ {"id": "LR4_REAR_DIFF_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "max": 150, "min": -40, "add": -40, "unit": "celsius" }, "name": "Locking Diff Oil Temp"} ]}, -{ "hdr": "795", "rax": "79D", "cmd": {"22": "1E88"}, "freq": 1, - "signals": [ - {"id": "LR4_1E88_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "1E88 Raw"} - ]}, { "hdr": "795", "rax": "79D", "cmd": {"22": "1E89"}, "freq": 1, "signals": [ {"id": "LR4_1E89_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "1E89 Raw"} ]}, -{ "hdr": "795", "rax": "79D", "cmd": {"22": "1E8B"}, "freq": 1, - "signals": [ - {"id": "LR4_1E8B_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "1E8B Raw"} - ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "2B12"}, "freq": 1, "signals": [ {"id": "LR4_SUSPENSION_2B12", "path": "Suspension", "fmt": { "len": 16, "max": 32767, "min": -32768, "sign": true, "unit": "millimeters" }, "name": "Suspension Height Offset"} @@ -132,15 +100,7 @@ ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B08"}, "freq": 1, "signals": [ - {"id": "LR4_3B08_RAW", "path": "Suspension", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "3B08 Raw"} - ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B09"}, "freq": 1, - "signals": [ - {"id": "LR4_3B09_RAW", "path": "Suspension", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "3B09 Raw"} - ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B0A"}, "freq": 1, - "signals": [ - {"id": "LR4_3B0A_RAW", "path": "Suspension", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "3B0A Raw"} + {"id": "LR4_3B08_RAW", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "3B08 Raw"} ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B0B"}, "freq": 1, "signals": [ @@ -148,7 +108,7 @@ ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B3C"}, "freq": 1, "signals": [ - {"id": "LR4_RIDE_HEIGHT", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "Ride Height"} + {"id": "LR4_RIDE_HEIGHT", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "Ride Height Mode"} ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B4D"}, "freq": 1, "signals": [ @@ -294,13 +254,9 @@ "signals": [ {"id": "LR4_OIL_TEMP_SAE", "path": "Engine", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Oil Temp (SAE)"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F45E"}, "freq": 1, - "signals": [ - {"id": "LR4_FUEL_RATE", "path": "Fuel", "fmt": { "len": 16, "max": 3276.75, "div": 20, "nullmin": 0, "unit": "litersPerHour" }, "name": "Fuel Rate", "suggestedMetric": "fuelRate"} - ]}, { "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E68"}, "freq": 1, "signals": [ - {"id": "LR4_1E68_RAW", "path": "Transmission", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "1E68 Raw"} + {"id": "LR4_1E68_RAW", "path": "Transmission", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "1E68 Raw"} ]}, { "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E69"}, "freq": 0.5, "signals": [ @@ -308,15 +264,7 @@ ]}, { "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E6A"}, "freq": 1, "signals": [ - {"id": "LR4_1E6A_RAW", "path": "Transmission", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "1E6A Raw"} - ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E6B"}, "freq": 1, - "signals": [ - {"id": "LR4_1E6B_RAW", "path": "Transmission", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "1E6B Raw"} - ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E70"}, "freq": 1, - "signals": [ - {"id": "LR4_1E70_RAW", "path": "Transmission", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "1E70 Raw"} + {"id": "LR4_1E6A_RAW", "path": "Transmission", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "1E6A Raw"} ]} ], "synthetics": [ From 3abbfaf9a4ebae9ddfaa8aadb7d5dc475b6ca9cc Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sat, 29 Aug 2026 10:00:10 -0500 Subject: [PATCH 54/84] spare tire warning proves real pressure sensors exist A spare does not rotate, so a low-spare warning cannot come from wheel-speed inference. Direct sensors are fitted and report somewhere. Probes the tire-pressure DID at the six modules that answer but have never been mined. Height sensors read inverted, confirmed by raising the truck: 115/115 normal, 93/101 raised. Mode 1 normal, 2 raised. --- README.md | 29 ++++++++++++++++++++++++----- signalsets/v3/default.json | 36 +++++++++++++++++++++++++++++++++--- 2 files changed, 57 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index ede3e16..509536e 100644 --- a/README.md +++ b/README.md @@ -407,11 +407,30 @@ formulas eventually get worked out. | `761` / `769` | `197C`, `D11C` | | `7D3` / `7DB` | `3B07` — reads lower than the four corner pressures | -**Tire pressures remain unsolved.** Module `751` returns no data to any -request. Both Toyota-Tacoma and Jeep-Grand-Cherokee reach their tire modules -through addressing modes never tried here — Tacoma via ISO-TP extended -addressing (`eax`/`tst`/`fcm1`), Jeep via a 29-bit header (`DAC7`). The -extended-address variant is in this signalset as `LR4_TPMS_EAX2A`. +**Tire pressures remain unsolved, but they exist.** Module `751` returns no +data to any request, and nothing found so far resembles four tire pressures. +The decisive clue is the spare: this truck warns when the *spare* is low, and a +spare does not rotate — so there is no wheel-speed difference to infer it from. +That rules out an indirect system and means real pressure sensors are fitted and +reporting to some module. Six modules answer negative responses but have never +been mined — `716`, `726`, `734`, `737`, `760`, `797` — and each is now probed +with the Jaguar tire-pressure DID as a locator. A positive response from any of +them finds the module. + +### Air suspension notes + +`3B71` and `3B72` track the height sensors, and they read **inverted** — the +number falls as the truck rises. Observed: 115/115 at normal height, 93/101 +raised. Treat a falling value as the truck going up. + +`3B3C` is the height mode and increments upward: mode 1 was normal and mode 2 +was raised, both confirmed. The map also labels 0 as Access and 3 as Extended on +the assumption the ordering continues — neither has been observed yet, so +correct them if they read wrong. + +The two balance ratios respond to cargo, not just faults. With the load area +full, front balance read 0.99 and rear read 0.92 — the rear axle carrying more +on one side. Check the ratios unloaded before reading a low number as a leak. --- diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 9a19955..0acd5d2 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -1,4 +1,12 @@ { "commands": [ +{ "hdr": "716", "rax": "71E", "cmd": {"22": "2076"}, "freq": 5, + "signals": [ + {"id": "LR4_TPMS_SEEK_716", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "nullmin": 0, "unit": "bars" }, "name": "TPMS Seek 716"} + ]}, +{ "hdr": "726", "rax": "72E", "cmd": {"22": "2076"}, "freq": 5, + "signals": [ + {"id": "LR4_TPMS_SEEK_726", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "nullmin": 0, "unit": "bars" }, "name": "TPMS Seek 726"} + ]}, { "hdr": "732", "cmd": {"22": "D928"}, "freq": 1, "signals": [ {"id": "LR4_GEAR_SELECTOR", "path": "Transmission", "name": "Gear Selector", "fmt": {"len": 8, "map": { @@ -10,6 +18,18 @@ }} } ]}, +{ "hdr": "734", "rax": "73C", "cmd": {"22": "2076"}, "freq": 5, + "signals": [ + {"id": "LR4_TPMS_SEEK_734", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "nullmin": 0, "unit": "bars" }, "name": "TPMS Seek 734"} + ]}, +{ "hdr": "737", "rax": "73F", "cmd": {"22": "2076"}, "freq": 5, + "signals": [ + {"id": "LR4_TPMS_SEEK_737", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "nullmin": 0, "unit": "bars" }, "name": "TPMS Seek 737"} + ]}, +{ "hdr": "760", "rax": "768", "cmd": {"22": "2076"}, "freq": 5, + "signals": [ + {"id": "LR4_TPMS_SEEK_760", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "nullmin": 0, "unit": "bars" }, "name": "TPMS Seek 760"} + ]}, { "hdr": "761", "rax": "769", "cmd": {"22": "197C"}, "freq": 1, "signals": [ {"id": "LR4_197C_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "197C Raw"} @@ -62,6 +82,10 @@ "signals": [ {"id": "LR4_1E89_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "1E89 Raw"} ]}, +{ "hdr": "797", "rax": "79F", "cmd": {"22": "2076"}, "freq": 5, + "signals": [ + {"id": "LR4_TPMS_SEEK_797", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "nullmin": 0, "unit": "bars" }, "name": "TPMS Seek 797"} + ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "2B12"}, "freq": 1, "signals": [ {"id": "LR4_SUSPENSION_2B12", "path": "Suspension", "fmt": { "len": 16, "max": 32767, "min": -32768, "sign": true, "unit": "millimeters" }, "name": "Suspension Height Offset"} @@ -108,7 +132,13 @@ ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B3C"}, "freq": 1, "signals": [ - {"id": "LR4_RIDE_HEIGHT", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "Ride Height Mode"} + {"id": "LR4_RIDE_HEIGHT", "path": "Suspension", "name": "Ride Height Mode", "fmt": {"len": 8, "map": { + "0": { "description": "Access", "value": "Access" }, + "1": { "description": "Normal", "value": "Normal" }, + "2": { "description": "Off-Road", "value": "Off-Road" }, + "3": { "description": "Extended", "value": "Extended" } + }} + } ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B4D"}, "freq": 1, "signals": [ @@ -116,11 +146,11 @@ ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B71"}, "freq": 1, "signals": [ - {"id": "LR4_RIDE_HEIGHT_FRONT", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "Ride Height Front"} + {"id": "LR4_RIDE_HEIGHT_FRONT", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "Height Sensor Front (inverted)"} ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B72"}, "freq": 1, "signals": [ - {"id": "LR4_RIDE_HEIGHT_REAR", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "Ride Height Rear"} + {"id": "LR4_RIDE_HEIGHT_REAR", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "Height Sensor Rear (inverted)"} ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "D11A"}, "freq": 1, "signals": [ From 96162f639825e0b09ad5a8324f8c0d5962713eba Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 30 Aug 2026 15:27:16 -0600 Subject: [PATCH 55/84] 3B07 is the air compressor, not a corner pressure It answers two bytes, not one. Sits near 110 at rest and jumps past 1300 for the duration of a raise, tracking the height sensors as they move. Drops the six TPMS locator probes: every module answered 7F 22 31, so they are reachable but do not hold that DID. Raises trim polling, which only produced 71 samples over two days. --- signalsets/v3/default.json | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 0acd5d2..12966b7 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -1,12 +1,4 @@ { "commands": [ -{ "hdr": "716", "rax": "71E", "cmd": {"22": "2076"}, "freq": 5, - "signals": [ - {"id": "LR4_TPMS_SEEK_716", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "nullmin": 0, "unit": "bars" }, "name": "TPMS Seek 716"} - ]}, -{ "hdr": "726", "rax": "72E", "cmd": {"22": "2076"}, "freq": 5, - "signals": [ - {"id": "LR4_TPMS_SEEK_726", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "nullmin": 0, "unit": "bars" }, "name": "TPMS Seek 726"} - ]}, { "hdr": "732", "cmd": {"22": "D928"}, "freq": 1, "signals": [ {"id": "LR4_GEAR_SELECTOR", "path": "Transmission", "name": "Gear Selector", "fmt": {"len": 8, "map": { @@ -18,18 +10,6 @@ }} } ]}, -{ "hdr": "734", "rax": "73C", "cmd": {"22": "2076"}, "freq": 5, - "signals": [ - {"id": "LR4_TPMS_SEEK_734", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "nullmin": 0, "unit": "bars" }, "name": "TPMS Seek 734"} - ]}, -{ "hdr": "737", "rax": "73F", "cmd": {"22": "2076"}, "freq": 5, - "signals": [ - {"id": "LR4_TPMS_SEEK_737", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "nullmin": 0, "unit": "bars" }, "name": "TPMS Seek 737"} - ]}, -{ "hdr": "760", "rax": "768", "cmd": {"22": "2076"}, "freq": 5, - "signals": [ - {"id": "LR4_TPMS_SEEK_760", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "nullmin": 0, "unit": "bars" }, "name": "TPMS Seek 760"} - ]}, { "hdr": "761", "rax": "769", "cmd": {"22": "197C"}, "freq": 1, "signals": [ {"id": "LR4_197C_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "197C Raw"} @@ -82,10 +62,6 @@ "signals": [ {"id": "LR4_1E89_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "1E89 Raw"} ]}, -{ "hdr": "797", "rax": "79F", "cmd": {"22": "2076"}, "freq": 5, - "signals": [ - {"id": "LR4_TPMS_SEEK_797", "path": "Tires", "fmt": {"bix": 8, "len": 8, "max": 5, "mul": 0.01373, "nullmin": 0, "unit": "bars" }, "name": "TPMS Seek 797"} - ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "2B12"}, "freq": 1, "signals": [ {"id": "LR4_SUSPENSION_2B12", "path": "Suspension", "fmt": { "len": 16, "max": 32767, "min": -32768, "sign": true, "unit": "millimeters" }, "name": "Suspension Height Offset"} @@ -120,7 +96,7 @@ ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B07"}, "freq": 1, "signals": [ - {"id": "LR4_SUSPENSION_3B07", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "nullmin": 0, "unit": "psi" }, "name": "Suspension 3B07"} + {"id": "LR4_SUSPENSION_COMPRESSOR", "path": "Suspension", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "Compressor Activity"} ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B08"}, "freq": 1, "signals": [ From a94ce6c8346c681fa97f0601f4eb0b8ac60c820d Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 30 Aug 2026 15:34:03 -0600 Subject: [PATCH 56/84] add altitude as a barometric lookup, fix 3B01 length The schema has no logarithmic operator and synthetics only divide, so the barometric-to-altitude curve is baked in as a map from each kPa value to feet. Kept on its own command because the formatter rejects two signals reading the same bits, and LR4_BARO still feeds the boost ratio. 3B01 answers four data bytes. --- signalsets/v3/default.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 12966b7..263e175 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -72,7 +72,7 @@ ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B01"}, "freq": 1, "signals": [ - {"id": "LR4_3B01_RAW", "path": "Suspension", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "3B01 Raw"} + {"id": "LR4_3B01_RAW", "path": "Suspension", "fmt": { "len": 32, "max": 4294967295, "nullmin": 0, "unit": "scalar" }, "name": "3B01 Raw"} ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B02"}, "freq": 1, "signals": [ From f782e4d202803f69c21258a390e1c8b9ca53bba3 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 30 Aug 2026 15:49:35 -0600 Subject: [PATCH 57/84] tune freq as the interval it actually is, read the rest of PID 0134 Pelican documents freq as the maximum interval in seconds, so a smaller number polls harder. The odometer was set to 0.2, the tightest ceiling in the file on the least urgent signal. Fast values now every half second, temperatures every five, odometer every five minutes, undecoded probes every minute. 0134 returns four bytes and only two were read; the second pair is the sensor voltage. 3B02 answers four single-byte values that look like one per corner. --- signalsets/v3/default.json | 138 +++++++++++++++++++------------------ 1 file changed, 71 insertions(+), 67 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 263e175..cda5ede 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -1,5 +1,5 @@ { "commands": [ -{ "hdr": "732", "cmd": {"22": "D928"}, "freq": 1, +{ "hdr": "732", "cmd": {"22": "D928"}, "freq": 5, "signals": [ {"id": "LR4_GEAR_SELECTOR", "path": "Transmission", "name": "Gear Selector", "fmt": {"len": 8, "map": { "0": { "description": "Park", "value": "Park" }, @@ -10,103 +10,106 @@ }} } ]}, -{ "hdr": "761", "rax": "769", "cmd": {"22": "197C"}, "freq": 1, +{ "hdr": "761", "rax": "769", "cmd": {"22": "197C"}, "freq": 60, "signals": [ {"id": "LR4_197C_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "197C Raw"} ]}, -{ "hdr": "761", "rax": "769", "cmd": {"22": "D11C"}, "freq": 1, +{ "hdr": "761", "rax": "769", "cmd": {"22": "D11C"}, "freq": 60, "signals": [ {"id": "LR4_D11C_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "D11C Raw"} ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A32"}, "freq": 5, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A32"}, "freq": 60, "signals": [ {"id": "LR4_2A32_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A32 Raw"} ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A33"}, "freq": 5, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A33"}, "freq": 60, "signals": [ {"id": "LR4_2A33_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A33 Raw"} ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A34"}, "freq": 5, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A34"}, "freq": 60, "signals": [ {"id": "LR4_2A34_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A34 Raw"} ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A35"}, "freq": 5, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A35"}, "freq": 60, "signals": [ {"id": "LR4_2A35_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A35 Raw"} ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A36"}, "freq": 5, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A36"}, "freq": 60, "signals": [ {"id": "LR4_2A36_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A36 Raw"} ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A37"}, "freq": 5, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A37"}, "freq": 60, "signals": [ {"id": "LR4_2A37_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A37 Raw"} ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A38"}, "freq": 5, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A38"}, "freq": 60, "signals": [ {"id": "LR4_2A38_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A38 Raw"} ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A39"}, "freq": 5, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A39"}, "freq": 60, "signals": [ {"id": "LR4_2A39_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A39 Raw"} ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A3A"}, "freq": 5, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A3A"}, "freq": 60, "signals": [ {"id": "LR4_2A3A_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A3A Raw"} ]}, -{ "hdr": "795", "cmd": {"22": "1E8A"}, "freq": 0.5, +{ "hdr": "795", "cmd": {"22": "1E8A"}, "freq": 5, "signals": [ {"id": "LR4_REAR_DIFF_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "max": 150, "min": -40, "add": -40, "unit": "celsius" }, "name": "Locking Diff Oil Temp"} ]}, -{ "hdr": "795", "rax": "79D", "cmd": {"22": "1E89"}, "freq": 1, +{ "hdr": "795", "rax": "79D", "cmd": {"22": "1E89"}, "freq": 60, "signals": [ {"id": "LR4_1E89_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "1E89 Raw"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "2B12"}, "freq": 1, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "2B12"}, "freq": 2, "signals": [ {"id": "LR4_SUSPENSION_2B12", "path": "Suspension", "fmt": { "len": 16, "max": 32767, "min": -32768, "sign": true, "unit": "millimeters" }, "name": "Suspension Height Offset"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B00"}, "freq": 1, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B00"}, "freq": 60, "signals": [ {"id": "LR4_3B00_RAW", "path": "Suspension", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "3B00 Raw"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B01"}, "freq": 1, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B01"}, "freq": 60, "signals": [ {"id": "LR4_3B01_RAW", "path": "Suspension", "fmt": { "len": 32, "max": 4294967295, "nullmin": 0, "unit": "scalar" }, "name": "3B01 Raw"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B02"}, "freq": 1, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B02"}, "freq": 60, "signals": [ - {"id": "LR4_3B02_RAW", "path": "Suspension", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "3B02 Raw"} + {"id": "LR4_3B02_B0", "path": "Suspension", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "3B02 Byte 1"}, + {"id": "LR4_3B02_B1", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 255, "unit": "scalar" }, "name": "3B02 Byte 2"}, + {"id": "LR4_3B02_B2", "path": "Suspension", "fmt": {"bix": 16, "len": 8, "max": 255, "unit": "scalar" }, "name": "3B02 Byte 3"}, + {"id": "LR4_3B02_B3", "path": "Suspension", "fmt": {"bix": 24, "len": 8, "max": 255, "unit": "scalar" }, "name": "3B02 Byte 4"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B03"}, "freq": 1, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B03"}, "freq": 2, "signals": [ {"id": "LR4_SUSPENSION_PRES_FR", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "nullmin": 0, "unit": "psi" }, "name": "Suspension Pressure Front Right"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B04"}, "freq": 1, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B04"}, "freq": 2, "signals": [ {"id": "LR4_SUSPENSION_PRES_FL", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "nullmin": 0, "unit": "psi" }, "name": "Suspension Pressure Front Left"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B05"}, "freq": 1, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B05"}, "freq": 2, "signals": [ {"id": "LR4_SUSPENSION_PRES_RR", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "nullmin": 0, "unit": "psi" }, "name": "Suspension Pressure Rear Right"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B06"}, "freq": 1, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B06"}, "freq": 2, "signals": [ {"id": "LR4_SUSPENSION_PRES_RL", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "nullmin": 0, "unit": "psi" }, "name": "Suspension Pressure Rear Left"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B07"}, "freq": 1, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B07"}, "freq": 2, "signals": [ {"id": "LR4_SUSPENSION_COMPRESSOR", "path": "Suspension", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "Compressor Activity"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B08"}, "freq": 1, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B08"}, "freq": 60, "signals": [ {"id": "LR4_3B08_RAW", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "3B08 Raw"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B0B"}, "freq": 1, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B0B"}, "freq": 60, "signals": [ {"id": "LR4_3B0B_RAW", "path": "Suspension", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "3B0B Raw"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B3C"}, "freq": 1, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B3C"}, "freq": 2, "signals": [ {"id": "LR4_RIDE_HEIGHT", "path": "Suspension", "name": "Ride Height Mode", "fmt": {"len": 8, "map": { "0": { "description": "Access", "value": "Access" }, @@ -116,159 +119,160 @@ }} } ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B4D"}, "freq": 1, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B4D"}, "freq": 2, "signals": [ {"id": "LR4_DRIVE_MODE", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "Drive Mode"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B71"}, "freq": 1, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B71"}, "freq": 2, "signals": [ {"id": "LR4_RIDE_HEIGHT_FRONT", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "Height Sensor Front (inverted)"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B72"}, "freq": 1, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B72"}, "freq": 2, "signals": [ {"id": "LR4_RIDE_HEIGHT_REAR", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "Height Sensor Rear (inverted)"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "D11A"}, "freq": 1, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "D11A"}, "freq": 2, "signals": [ {"id": "LR4_SUSPENSION_SUPPLY_V", "path": "Suspension", "fmt": { "len": 8, "max": 40.8, "mul": 16, "div": 100, "unit": "volts" }, "name": "Suspension Module Voltage"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "033E"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "033E"}, "freq": 5, "signals": [ {"id": "LR4_FUEL_RAIL_P", "path": "Fuel", "fmt": { "len": 16, "max": 30000, "unit": "kilopascal" }, "name": "Fuel Rail Pressure"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "03E6"}, "freq": 0.5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "03E6"}, "freq": 300, "signals": [ {"id": "LR4_MEASURED_OIL_LEVEL", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "millimeters" }, "name": "Oil Level"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "03F2"}, "freq": 0.5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "03F2"}, "freq": 300, "signals": [ {"id": "LR4_ENGINE_OIL_VOLUME_GAL", "path": "Engine", "fmt": { "len": 8, "max": 6.74, "mul": 0.0264172, "unit": "gallons" }, "name": "Oil Volume"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "03F3"}, "freq": 0.5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "03F3"}, "freq": 5, "signals": [ {"id": "LR4_ENGINE_OIL_TEMP", "path": "Engine", "fmt": { "len": 8, "max": 120, "min": -40, "add": -40, "unit": "celsius" }, "name": "Oil Temp", "suggestedMetric": "engineOilTemperature"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "0520"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "0520"}, "freq": 5, "signals": [ {"id": "LR4_CHARGE_AIR_TEMP", "path": "Engine", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Charge Air Temp"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "DD01"}, "freq": 0.2, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "DD01"}, "freq": 300, "signals": [ {"id": "LR4_ODOMETER", "path": "Trips", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "kilometers" }, "name": "Odometer", "suggestedMetric": "odometer"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F404"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F404"}, "freq": 0.5, "signals": [ {"id": "LR4_LOAD_CALC", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Calculated Load", "suggestedMetric": "engineLoad"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F405"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F405"}, "freq": 5, "signals": [ {"id": "LR4_COOLANT_TEMP", "path": "Engine", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Coolant Temp", "suggestedMetric": "engineCoolantTemperature"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F406"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F406"}, "freq": 5, "signals": [ {"id": "LR4_SHRTFT1", "path": "Fuel", "fmt": { "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "Short Term Fuel Trim B1", "suggestedMetric": "shortTermFuelTrim"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F407"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F407"}, "freq": 5, "signals": [ {"id": "LR4_LONGFT1", "path": "Fuel", "fmt": { "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "Long Term Fuel Trim B1"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40B"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40B"}, "freq": 0.5, "signals": [ {"id": "LR4_MAP", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "kilopascal" }, "name": "Manifold Pressure"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40C"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40C"}, "freq": 0.5, "signals": [ {"id": "LR4_RPM", "path": "Engine", "fmt": { "len": 16, "max": 16383.75, "div": 4, "unit": "rpm" }, "name": "Engine Speed", "suggestedMetric": "engineSpeed"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40D"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40D"}, "freq": 0.5, "signals": [ {"id": "LR4_SPEED", "path": "Movement", "fmt": { "len": 8, "max": 255, "unit": "kilometersPerHour" }, "name": "Vehicle Speed", "suggestedMetric": "speed"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40E"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40E"}, "freq": 0.5, "signals": [ {"id": "LR4_SPARK_ADV", "path": "Engine", "fmt": { "len": 8, "max": 63.5, "min": -64, "div": 2, "add": -64, "unit": "degrees" }, "name": "Timing Advance"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40F"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40F"}, "freq": 10, "signals": [ {"id": "LR4_IAT", "path": "Engine", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Intake Air Temp"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F410"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F410"}, "freq": 5, "signals": [ {"id": "LR4_MAF", "path": "Engine", "fmt": { "len": 16, "max": 655.35, "div": 100, "unit": "gramsPerSecond" }, "name": "Mass Air Flow", "suggestedMetric": "massAirFlow"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F411"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F411"}, "freq": 0.5, "signals": [ {"id": "LR4_THROTTLE_POS", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Throttle Position", "suggestedMetric": "throttlePosition"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F423"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F423"}, "freq": 5, "signals": [ {"id": "LR4_FUEL_RAIL_P_GAUGE", "path": "Fuel", "fmt": { "len": 16, "max": 655350, "mul": 10, "unit": "kilopascal" }, "name": "Fuel Rail Pressure (SAE)"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F42F"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F42F"}, "freq": 15, "signals": [ {"id": "LR4_FUEL_LEVEL", "path": "Fuel", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Fuel Level", "suggestedMetric": "fuelTankLevel"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F431"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F431"}, "freq": 15, "signals": [ {"id": "LR4_DIST_SINCE_CLR", "path": "Trips", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "kilometers" }, "name": "Distance Since Codes Cleared", "suggestedMetric": "distanceSinceDTCsCleared"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F433"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F433"}, "freq": 0.5, "signals": [ {"id": "LR4_BARO", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "kilopascal" }, "name": "Barometric Pressure"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F434"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F434"}, "freq": 0.5, "signals": [ - {"id": "LR4_O2_LAMBDA", "path": "Engine", "fmt": { "len": 16, "max": 2, "div": 32768, "nullmin": 0, "unit": "scalar" }, "name": "O2 Lambda B1S1", "suggestedMetric": "o2Lambda"} + {"id": "LR4_O2_LAMBDA", "path": "Engine", "fmt": { "len": 16, "max": 2, "div": 32768, "nullmin": 0, "unit": "scalar" }, "name": "O2 Lambda B1S1", "suggestedMetric": "o2Lambda"}, + {"id": "LR4_O2_VOLTAGE", "path": "Engine", "fmt": {"bix": 16, "len": 16, "max": 7.999, "div": 8192, "unit": "volts" }, "name": "O2 Sensor Voltage"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F43C"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F43C"}, "freq": 15, "signals": [ {"id": "LR4_CAT_TEMP_B1", "path": "Engine", "fmt": { "len": 16, "max": 6513.5, "min": -40, "div": 10, "add": -40, "unit": "celsius" }, "name": "Catalyst Temp B1S1"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F43D"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F43D"}, "freq": 15, "signals": [ {"id": "LR4_CAT_TEMP_B2", "path": "Engine", "fmt": { "len": 16, "max": 6513.5, "min": -40, "div": 10, "add": -40, "unit": "celsius" }, "name": "Catalyst Temp B2S1"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F442"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F442"}, "freq": 15, "signals": [ {"id": "LR4_BAT_V", "path": "Battery", "fmt": { "len": 16, "max": 65.535, "div": 1000, "unit": "volts" }, "name": "Battery Voltage", "suggestedMetric": "starterBatteryVoltage"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F443"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F443"}, "freq": 0.5, "signals": [ {"id": "LR4_LOAD_ABS", "path": "Engine", "fmt": { "len": 16, "max": 25700, "mul": 100, "div": 255, "unit": "percent" }, "name": "Absolute Load", "suggestedMetric": "absoluteEngineLoad"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F444"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F444"}, "freq": 0.5, "signals": [ {"id": "LR4_EQ_RATIO", "path": "Engine", "fmt": { "len": 16, "max": 2, "div": 32768, "unit": "scalar" }, "name": "Equivalence Ratio", "suggestedMetric": "commandedLambda"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F446"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F446"}, "freq": 15, "signals": [ {"id": "LR4_AMBIENT_TEMP", "path": "Climate", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Ambient Air Temp"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F449"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F449"}, "freq": 0.5, "signals": [ {"id": "LR4_PEDAL_D", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Accelerator Pedal D"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F44A"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F44A"}, "freq": 0.5, "signals": [ {"id": "LR4_PEDAL_E", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Accelerator Pedal E"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F44C"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F44C"}, "freq": 0.5, "signals": [ {"id": "LR4_THROTTLE_CMD", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Commanded Throttle"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F45C"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F45C"}, "freq": 5, "signals": [ {"id": "LR4_OIL_TEMP_SAE", "path": "Engine", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Oil Temp (SAE)"} ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E68"}, "freq": 1, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E68"}, "freq": 60, "signals": [ {"id": "LR4_1E68_RAW", "path": "Transmission", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "1E68 Raw"} ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E69"}, "freq": 0.5, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E69"}, "freq": 5, "signals": [ {"id": "LR4_GEARBOX_OIL_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "max": 120, "min": -40, "add": -40, "unit": "celsius" }, "name": "Gearbox Temp", "suggestedMetric": "transmissionFluidTemperature"} ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E6A"}, "freq": 1, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E6A"}, "freq": 60, "signals": [ {"id": "LR4_1E6A_RAW", "path": "Transmission", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "1E6A Raw"} ]} From 527a47f416438e64c24f8ec1deeae8e876e4cc4c Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 30 Aug 2026 15:50:08 -0600 Subject: [PATCH 58/84] fit the poll budget to the 13 req/s the adapter actually delivers --- signalsets/v3/default.json | 106 ++++++++++++++++++------------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index cda5ede..daa29ac 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -10,47 +10,47 @@ }} } ]}, -{ "hdr": "761", "rax": "769", "cmd": {"22": "197C"}, "freq": 60, +{ "hdr": "761", "rax": "769", "cmd": {"22": "197C"}, "freq": 120, "signals": [ {"id": "LR4_197C_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "197C Raw"} ]}, -{ "hdr": "761", "rax": "769", "cmd": {"22": "D11C"}, "freq": 60, +{ "hdr": "761", "rax": "769", "cmd": {"22": "D11C"}, "freq": 120, "signals": [ {"id": "LR4_D11C_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "D11C Raw"} ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A32"}, "freq": 60, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A32"}, "freq": 120, "signals": [ {"id": "LR4_2A32_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A32 Raw"} ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A33"}, "freq": 60, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A33"}, "freq": 120, "signals": [ {"id": "LR4_2A33_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A33 Raw"} ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A34"}, "freq": 60, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A34"}, "freq": 120, "signals": [ {"id": "LR4_2A34_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A34 Raw"} ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A35"}, "freq": 60, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A35"}, "freq": 120, "signals": [ {"id": "LR4_2A35_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A35 Raw"} ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A36"}, "freq": 60, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A36"}, "freq": 120, "signals": [ {"id": "LR4_2A36_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A36 Raw"} ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A37"}, "freq": 60, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A37"}, "freq": 120, "signals": [ {"id": "LR4_2A37_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A37 Raw"} ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A38"}, "freq": 60, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A38"}, "freq": 120, "signals": [ {"id": "LR4_2A38_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A38 Raw"} ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A39"}, "freq": 60, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A39"}, "freq": 120, "signals": [ {"id": "LR4_2A39_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A39 Raw"} ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A3A"}, "freq": 60, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A3A"}, "freq": 120, "signals": [ {"id": "LR4_2A3A_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A3A Raw"} ]}, @@ -58,58 +58,58 @@ "signals": [ {"id": "LR4_REAR_DIFF_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "max": 150, "min": -40, "add": -40, "unit": "celsius" }, "name": "Locking Diff Oil Temp"} ]}, -{ "hdr": "795", "rax": "79D", "cmd": {"22": "1E89"}, "freq": 60, +{ "hdr": "795", "rax": "79D", "cmd": {"22": "1E89"}, "freq": 120, "signals": [ {"id": "LR4_1E89_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "1E89 Raw"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "2B12"}, "freq": 2, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "2B12"}, "freq": 10, "signals": [ {"id": "LR4_SUSPENSION_2B12", "path": "Suspension", "fmt": { "len": 16, "max": 32767, "min": -32768, "sign": true, "unit": "millimeters" }, "name": "Suspension Height Offset"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B00"}, "freq": 60, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B00"}, "freq": 10, "signals": [ {"id": "LR4_3B00_RAW", "path": "Suspension", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "3B00 Raw"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B01"}, "freq": 60, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B01"}, "freq": 10, "signals": [ {"id": "LR4_3B01_RAW", "path": "Suspension", "fmt": { "len": 32, "max": 4294967295, "nullmin": 0, "unit": "scalar" }, "name": "3B01 Raw"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B02"}, "freq": 60, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B02"}, "freq": 10, "signals": [ {"id": "LR4_3B02_B0", "path": "Suspension", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "3B02 Byte 1"}, {"id": "LR4_3B02_B1", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 255, "unit": "scalar" }, "name": "3B02 Byte 2"}, {"id": "LR4_3B02_B2", "path": "Suspension", "fmt": {"bix": 16, "len": 8, "max": 255, "unit": "scalar" }, "name": "3B02 Byte 3"}, {"id": "LR4_3B02_B3", "path": "Suspension", "fmt": {"bix": 24, "len": 8, "max": 255, "unit": "scalar" }, "name": "3B02 Byte 4"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B03"}, "freq": 2, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B03"}, "freq": 10, "signals": [ {"id": "LR4_SUSPENSION_PRES_FR", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "nullmin": 0, "unit": "psi" }, "name": "Suspension Pressure Front Right"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B04"}, "freq": 2, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B04"}, "freq": 10, "signals": [ {"id": "LR4_SUSPENSION_PRES_FL", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "nullmin": 0, "unit": "psi" }, "name": "Suspension Pressure Front Left"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B05"}, "freq": 2, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B05"}, "freq": 10, "signals": [ {"id": "LR4_SUSPENSION_PRES_RR", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "nullmin": 0, "unit": "psi" }, "name": "Suspension Pressure Rear Right"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B06"}, "freq": 2, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B06"}, "freq": 10, "signals": [ {"id": "LR4_SUSPENSION_PRES_RL", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "nullmin": 0, "unit": "psi" }, "name": "Suspension Pressure Rear Left"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B07"}, "freq": 2, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B07"}, "freq": 10, "signals": [ {"id": "LR4_SUSPENSION_COMPRESSOR", "path": "Suspension", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "Compressor Activity"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B08"}, "freq": 60, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B08"}, "freq": 10, "signals": [ {"id": "LR4_3B08_RAW", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "3B08 Raw"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B0B"}, "freq": 60, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B0B"}, "freq": 10, "signals": [ {"id": "LR4_3B0B_RAW", "path": "Suspension", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "3B0B Raw"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B3C"}, "freq": 2, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B3C"}, "freq": 10, "signals": [ {"id": "LR4_RIDE_HEIGHT", "path": "Suspension", "name": "Ride Height Mode", "fmt": {"len": 8, "map": { "0": { "description": "Access", "value": "Access" }, @@ -119,19 +119,19 @@ }} } ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B4D"}, "freq": 2, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B4D"}, "freq": 10, "signals": [ {"id": "LR4_DRIVE_MODE", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "Drive Mode"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B71"}, "freq": 2, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B71"}, "freq": 10, "signals": [ {"id": "LR4_RIDE_HEIGHT_FRONT", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "Height Sensor Front (inverted)"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B72"}, "freq": 2, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B72"}, "freq": 10, "signals": [ {"id": "LR4_RIDE_HEIGHT_REAR", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "Height Sensor Rear (inverted)"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "D11A"}, "freq": 2, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "D11A"}, "freq": 10, "signals": [ {"id": "LR4_SUSPENSION_SUPPLY_V", "path": "Suspension", "fmt": { "len": 8, "max": 40.8, "mul": 16, "div": 100, "unit": "volts" }, "name": "Suspension Module Voltage"} ]}, @@ -139,11 +139,11 @@ "signals": [ {"id": "LR4_FUEL_RAIL_P", "path": "Fuel", "fmt": { "len": 16, "max": 30000, "unit": "kilopascal" }, "name": "Fuel Rail Pressure"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "03E6"}, "freq": 300, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "03E6"}, "freq": 600, "signals": [ {"id": "LR4_MEASURED_OIL_LEVEL", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "millimeters" }, "name": "Oil Level"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "03F2"}, "freq": 300, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "03F2"}, "freq": 600, "signals": [ {"id": "LR4_ENGINE_OIL_VOLUME_GAL", "path": "Engine", "fmt": { "len": 8, "max": 6.74, "mul": 0.0264172, "unit": "gallons" }, "name": "Oil Volume"} ]}, @@ -155,11 +155,11 @@ "signals": [ {"id": "LR4_CHARGE_AIR_TEMP", "path": "Engine", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Charge Air Temp"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "DD01"}, "freq": 300, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "DD01"}, "freq": 600, "signals": [ {"id": "LR4_ODOMETER", "path": "Trips", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "kilometers" }, "name": "Odometer", "suggestedMetric": "odometer"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F404"}, "freq": 0.5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F404"}, "freq": 3, "signals": [ {"id": "LR4_LOAD_CALC", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Calculated Load", "suggestedMetric": "engineLoad"} ]}, @@ -175,23 +175,23 @@ "signals": [ {"id": "LR4_LONGFT1", "path": "Fuel", "fmt": { "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "Long Term Fuel Trim B1"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40B"}, "freq": 0.5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40B"}, "freq": 1, "signals": [ {"id": "LR4_MAP", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "kilopascal" }, "name": "Manifold Pressure"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40C"}, "freq": 0.5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40C"}, "freq": 1, "signals": [ {"id": "LR4_RPM", "path": "Engine", "fmt": { "len": 16, "max": 16383.75, "div": 4, "unit": "rpm" }, "name": "Engine Speed", "suggestedMetric": "engineSpeed"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40D"}, "freq": 0.5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40D"}, "freq": 1, "signals": [ {"id": "LR4_SPEED", "path": "Movement", "fmt": { "len": 8, "max": 255, "unit": "kilometersPerHour" }, "name": "Vehicle Speed", "suggestedMetric": "speed"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40E"}, "freq": 0.5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40E"}, "freq": 3, "signals": [ {"id": "LR4_SPARK_ADV", "path": "Engine", "fmt": { "len": 8, "max": 63.5, "min": -64, "div": 2, "add": -64, "unit": "degrees" }, "name": "Timing Advance"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40F"}, "freq": 10, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40F"}, "freq": 30, "signals": [ {"id": "LR4_IAT", "path": "Engine", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Intake Air Temp"} ]}, @@ -199,7 +199,7 @@ "signals": [ {"id": "LR4_MAF", "path": "Engine", "fmt": { "len": 16, "max": 655.35, "div": 100, "unit": "gramsPerSecond" }, "name": "Mass Air Flow", "suggestedMetric": "massAirFlow"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F411"}, "freq": 0.5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F411"}, "freq": 3, "signals": [ {"id": "LR4_THROTTLE_POS", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Throttle Position", "suggestedMetric": "throttlePosition"} ]}, @@ -207,56 +207,56 @@ "signals": [ {"id": "LR4_FUEL_RAIL_P_GAUGE", "path": "Fuel", "fmt": { "len": 16, "max": 655350, "mul": 10, "unit": "kilopascal" }, "name": "Fuel Rail Pressure (SAE)"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F42F"}, "freq": 15, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F42F"}, "freq": 30, "signals": [ {"id": "LR4_FUEL_LEVEL", "path": "Fuel", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Fuel Level", "suggestedMetric": "fuelTankLevel"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F431"}, "freq": 15, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F431"}, "freq": 30, "signals": [ {"id": "LR4_DIST_SINCE_CLR", "path": "Trips", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "kilometers" }, "name": "Distance Since Codes Cleared", "suggestedMetric": "distanceSinceDTCsCleared"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F433"}, "freq": 0.5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F433"}, "freq": 1, "signals": [ {"id": "LR4_BARO", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "kilopascal" }, "name": "Barometric Pressure"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F434"}, "freq": 0.5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F434"}, "freq": 3, "signals": [ {"id": "LR4_O2_LAMBDA", "path": "Engine", "fmt": { "len": 16, "max": 2, "div": 32768, "nullmin": 0, "unit": "scalar" }, "name": "O2 Lambda B1S1", "suggestedMetric": "o2Lambda"}, {"id": "LR4_O2_VOLTAGE", "path": "Engine", "fmt": {"bix": 16, "len": 16, "max": 7.999, "div": 8192, "unit": "volts" }, "name": "O2 Sensor Voltage"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F43C"}, "freq": 15, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F43C"}, "freq": 30, "signals": [ {"id": "LR4_CAT_TEMP_B1", "path": "Engine", "fmt": { "len": 16, "max": 6513.5, "min": -40, "div": 10, "add": -40, "unit": "celsius" }, "name": "Catalyst Temp B1S1"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F43D"}, "freq": 15, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F43D"}, "freq": 30, "signals": [ {"id": "LR4_CAT_TEMP_B2", "path": "Engine", "fmt": { "len": 16, "max": 6513.5, "min": -40, "div": 10, "add": -40, "unit": "celsius" }, "name": "Catalyst Temp B2S1"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F442"}, "freq": 15, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F442"}, "freq": 30, "signals": [ {"id": "LR4_BAT_V", "path": "Battery", "fmt": { "len": 16, "max": 65.535, "div": 1000, "unit": "volts" }, "name": "Battery Voltage", "suggestedMetric": "starterBatteryVoltage"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F443"}, "freq": 0.5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F443"}, "freq": 3, "signals": [ {"id": "LR4_LOAD_ABS", "path": "Engine", "fmt": { "len": 16, "max": 25700, "mul": 100, "div": 255, "unit": "percent" }, "name": "Absolute Load", "suggestedMetric": "absoluteEngineLoad"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F444"}, "freq": 0.5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F444"}, "freq": 3, "signals": [ {"id": "LR4_EQ_RATIO", "path": "Engine", "fmt": { "len": 16, "max": 2, "div": 32768, "unit": "scalar" }, "name": "Equivalence Ratio", "suggestedMetric": "commandedLambda"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F446"}, "freq": 15, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F446"}, "freq": 30, "signals": [ {"id": "LR4_AMBIENT_TEMP", "path": "Climate", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Ambient Air Temp"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F449"}, "freq": 0.5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F449"}, "freq": 3, "signals": [ {"id": "LR4_PEDAL_D", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Accelerator Pedal D"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F44A"}, "freq": 0.5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F44A"}, "freq": 3, "signals": [ {"id": "LR4_PEDAL_E", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Accelerator Pedal E"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F44C"}, "freq": 0.5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F44C"}, "freq": 30, "signals": [ {"id": "LR4_THROTTLE_CMD", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Commanded Throttle"} ]}, @@ -264,7 +264,7 @@ "signals": [ {"id": "LR4_OIL_TEMP_SAE", "path": "Engine", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Oil Temp (SAE)"} ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E68"}, "freq": 60, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E68"}, "freq": 120, "signals": [ {"id": "LR4_1E68_RAW", "path": "Transmission", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "1E68 Raw"} ]}, @@ -272,7 +272,7 @@ "signals": [ {"id": "LR4_GEARBOX_OIL_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "max": 120, "min": -40, "add": -40, "unit": "celsius" }, "name": "Gearbox Temp", "suggestedMetric": "transmissionFluidTemperature"} ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E6A"}, "freq": 60, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E6A"}, "freq": 120, "signals": [ {"id": "LR4_1E6A_RAW", "path": "Transmission", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "1E6A Raw"} ]} From 38c24ece9f07f432333dbfcc0b500f2edd8c24f2 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 30 Aug 2026 16:49:08 -0600 Subject: [PATCH 59/84] document the polling budget and the signals found this week --- README.md | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 57 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 509536e..06338e7 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,7 @@ shows up normally. Most of this file uses that trick. | Coolant Temp | `7E0` `22F405` | Thermostat opens ~88°C; normal running 90–105°C | | Manifold Pressure | `7E0` `22F40B` | **Absolute**, not gauge. See boost calculation below | | Barometric Pressure | `7E0` `22F433` | ~101 kPa at sea level, drops with altitude | +| Altitude | `7E0` `22F433` | Barometric converted to feet by lookup table | | Intake Air Temp | `7E0` `22F40F` | Before the supercharger | | Charge Air Temp | `7E0` `220520` | **After** the supercharger and intercooler | | Timing Advance | `7E0` `22F40E` | Degrees before top dead centre | @@ -67,6 +68,7 @@ shows up normally. Most of this file uses that trick. | Mass Air Flow | `7E0` `22F410` | Grams of air per second | | Equivalence Ratio | `7E0` `22F444` | Commanded lambda | | O2 Lambda B1S1 | `7E0` `22F434` | Measured lambda | +| O2 Sensor Voltage | `7E0` `22F434` | Second half of the same response | | Catalyst Temp B1S1 / B2S1 | `7E0` `22F43C` / `22F43D` | One per bank | | Oil Temp | `7E0` `2203F3` | Land Rover's own sensor | | Oil Temp (SAE) | `7E0` `22F45C` | Standard PID, same physical sensor | @@ -93,7 +95,6 @@ fuel cut — injectors fully off while coasting, sensor reading pure air. | Signal | Address | Notes | |---|---|---| | Fuel Level | `7E0` `22F42F` | | -| Fuel Rate | `7E0` `22F45E` | Litres per hour | | Fuel Rail Pressure | `7E0` `22033E` | Proprietary; ~60 bar idle, 130+ under load | | Fuel Rail Pressure (SAE) | `7E0` `22F423` | Standard PID, same rail | | Short Term Fuel Trim B1 | `7E0` `22F406` | Immediate correction, swings constantly | @@ -120,6 +121,9 @@ All four corners report gauge pressure in the air spring. | Pressure Front Left / Right | `7D3` `223B04` / `223B03` | | Pressure Rear Left / Right | `7D3` `223B06` / `223B05` | | Height Offset | `7D3` `222B12` | Signed, millimetres from nominal | +| Compressor Activity | `7D3` `223B07` | ~110 at rest, over 1,300 while the truck raises | +| Ride Height Mode | `7D3` `223B3C` | 1 normal, 2 raised — both confirmed | +| Height Sensor Front / Rear | `7D3` `223B71` / `223B72` | **Inverted** — falls as the truck rises | | Module Voltage | `7D3` `22D11A` | Should mirror battery voltage | Normal standing pressures are roughly 40 psi per corner at normal ride @@ -401,11 +405,11 @@ formulas eventually get worked out. | Address | Signals | |---|---| -| `792` / `79A` | `2A32`–`2A3F` — `2A36`, `2A37`, `2A38`, `2A3A` return data; the rest are a sweep | -| `795` / `79D` | `1E88`, `1E89`, `1E8B` — neighbours of the differential temp | -| `7E1` / `7E9` | `1E68`, `1E6A`, `1E6B`, `1E70` — neighbours of the gearbox temp | +| `792` / `79A` | `2A32`–`2A3A` — eight live values, none resembling tire pressures | +| `795` / `79D` | `1E89` | +| `7E1` / `7E9` | `1E68`, `1E6A` — neighbours of the gearbox temp | | `761` / `769` | `197C`, `D11C` | -| `7D3` / `7DB` | `3B07` — reads lower than the four corner pressures | +| `7D3` / `7DB` | `3B00`, `3B01`, `3B02`, `3B08`, `3B0B` — `3B02` answers four single-byte values that look like one per corner | **Tire pressures remain unsolved, but they exist.** Module `751` returns no data to any request, and nothing found so far resembles four tire pressures. @@ -434,6 +438,54 @@ on one side. Check the ratios unloaded before reading a low number as a leak. --- +## Polling + +The adapter sustains about **13 request/response round trips per second**, +measured across many hours of logging. That is the ELM327's ceiling, not the +CAN bus — 13 requests per second is negligible against 500 kbit/s, and +diagnostic identifiers in the `7xx` range are low priority by CAN arbitration, +so they yield to powertrain traffic automatically. Service `22` is read-only. +Polling cannot harm anything; it can only compete with itself. + +**`freq` is a minimum interval in seconds, not a rate.** Pelican documents it as +the maximum frequency at which a command may be sent, expressed in seconds, so +a *smaller* number polls *harder*. There is no priority field anywhere in the +v3 format — command count and `freq` are the only levers. + +The budget in this file: + +| Interval | Commands | Contents | +|---|---|---| +| 1s | 4 | Manifold pressure, barometric, engine speed, vehicle speed | +| 3s | 8 | Throttle, pedals, timing, lambda, load | +| 5s | 12 | Temperatures, fuel trims, mass air flow | +| 10s | 16 | Air suspension | +| 30s | 8 | Fuel level, battery, catalyst temperatures | +| 120s | 14 | Undecoded probes | +| 600s | 3 | Odometer, oil level, oil volume | + +That totals about 11 requests per second of demand against roughly 11 available +once protocol overhead is removed. The four one-second commands exist so the +boost calculation stays responsive. + +**Two known inefficiencies**, neither fixable from a signalset: + +Requests carry no expected-response count. The ELM327 datasheet documents that +appending a digit (`22F405 1`) lets the adapter return the instant it has that +many responses instead of waiting out the full timeout, and shows it nearly +doubling throughput. No request in this vehicle's history uses it. + +Sparse headers cost triple. Reading one value from a module means `ATSH`, then +a receive filter, then the read — three round trips for one number. The engine +module amortises this well at 0.12 setup commands per read; a header carrying a +single command pays 2.0. + +Multi-DID requests would help most — a single frame holds seven payload bytes, +enough for `22` plus three identifiers — but the schema caps `cmd` at one +identifier, so the format cannot express it. + +--- + ## Terminal probing Sidecar's terminal is the fastest way to test a DID. From f04145b0e6b1a0bbfedcc7060251a5d313b0e4ab Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Thu, 3 Sep 2026 17:31:39 -0600 Subject: [PATCH 60/84] altitude survived neither the formatter nor the commit The formatter drops a second command sharing a header and cmd, so the separate altitude command disappeared at format time and the commit landed as an unrelated one-line change. Both signals now sit on the barometric command. The formatter warns that they overlap, which is true and intended: one presents the byte as kilopascals for the boost ratio, the other as a lookup into feet. Schema validation, which is what CI enforces, passes. --- signalsets/v3/default.json | 56 +++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index daa29ac..23ba1f8 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -217,7 +217,61 @@ ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F433"}, "freq": 1, "signals": [ - {"id": "LR4_BARO", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "kilopascal" }, "name": "Barometric Pressure"} + {"id": "LR4_BARO", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "kilopascal" }, "name": "Barometric Pressure"}, + {"id": "LR4_ALTITUDE", "path": "Movement", "name": "Altitude", "fmt": {"len": 8, "map": { + "55": { "description": "15,955 ft", "value": "15,955 ft" }, + "56": { "description": "15,511 ft", "value": "15,511 ft" }, + "57": { "description": "15,073 ft", "value": "15,073 ft" }, + "58": { "description": "14,641 ft", "value": "14,641 ft" }, + "59": { "description": "14,215 ft", "value": "14,215 ft" }, + "60": { "description": "13,795 ft", "value": "13,795 ft" }, + "61": { "description": "13,380 ft", "value": "13,380 ft" }, + "62": { "description": "12,971 ft", "value": "12,971 ft" }, + "63": { "description": "12,568 ft", "value": "12,568 ft" }, + "64": { "description": "12,169 ft", "value": "12,169 ft" }, + "65": { "description": "11,776 ft", "value": "11,776 ft" }, + "66": { "description": "11,387 ft", "value": "11,387 ft" }, + "67": { "description": "11,003 ft", "value": "11,003 ft" }, + "68": { "description": "10,624 ft", "value": "10,624 ft" }, + "69": { "description": "10,249 ft", "value": "10,249 ft" }, + "70": { "description": "9,878 ft", "value": "9,878 ft" }, + "71": { "description": "9,512 ft", "value": "9,512 ft" }, + "72": { "description": "9,150 ft", "value": "9,150 ft" }, + "73": { "description": "8,792 ft", "value": "8,792 ft" }, + "74": { "description": "8,438 ft", "value": "8,438 ft" }, + "75": { "description": "8,088 ft", "value": "8,088 ft" }, + "76": { "description": "7,742 ft", "value": "7,742 ft" }, + "77": { "description": "7,399 ft", "value": "7,399 ft" }, + "78": { "description": "7,060 ft", "value": "7,060 ft" }, + "79": { "description": "6,724 ft", "value": "6,724 ft" }, + "80": { "description": "6,392 ft", "value": "6,392 ft" }, + "81": { "description": "6,063 ft", "value": "6,063 ft" }, + "82": { "description": "5,737 ft", "value": "5,737 ft" }, + "83": { "description": "5,415 ft", "value": "5,415 ft" }, + "84": { "description": "5,095 ft", "value": "5,095 ft" }, + "85": { "description": "4,779 ft", "value": "4,779 ft" }, + "86": { "description": "4,466 ft", "value": "4,466 ft" }, + "87": { "description": "4,156 ft", "value": "4,156 ft" }, + "88": { "description": "3,848 ft", "value": "3,848 ft" }, + "89": { "description": "3,544 ft", "value": "3,544 ft" }, + "90": { "description": "3,242 ft", "value": "3,242 ft" }, + "91": { "description": "2,943 ft", "value": "2,943 ft" }, + "92": { "description": "2,646 ft", "value": "2,646 ft" }, + "93": { "description": "2,352 ft", "value": "2,352 ft" }, + "94": { "description": "2,061 ft", "value": "2,061 ft" }, + "95": { "description": "1,772 ft", "value": "1,772 ft" }, + "96": { "description": "1,486 ft", "value": "1,486 ft" }, + "97": { "description": "1,202 ft", "value": "1,202 ft" }, + "98": { "description": "920 ft", "value": "920 ft" }, + "99": { "description": "641 ft", "value": "641 ft" }, + "100": { "description": "364 ft", "value": "364 ft" }, + "101": { "description": "sea level", "value": "sea level" }, + "102": { "description": "sea level", "value": "sea level" }, + "103": { "description": "sea level", "value": "sea level" }, + "104": { "description": "sea level", "value": "sea level" }, + "105": { "description": "sea level", "value": "sea level" } + }} + } ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F434"}, "freq": 3, "signals": [ From a83d63bd15d78f0b0a9df130a8eb7c018fd47ce0 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Thu, 3 Sep 2026 18:22:58 -0600 Subject: [PATCH 61/84] drop the probes that answer but never move Thirteen DIDs returned a positive response on every read and the identical value every time, across the whole log. They are configuration or identity values, not sensors. The six that do vary stay and now get looked at twice as often. 2A36 is worth watching: it advanced 602 while the odometer advanced 722 km, so it counts distance on some condition. --- signalsets/v3/default.json | 68 +++++--------------------------------- 1 file changed, 8 insertions(+), 60 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 23ba1f8..a92747c 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -10,71 +10,27 @@ }} } ]}, -{ "hdr": "761", "rax": "769", "cmd": {"22": "197C"}, "freq": 120, +{ "hdr": "761", "rax": "769", "cmd": {"22": "197C"}, "freq": 30, "signals": [ {"id": "LR4_197C_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "197C Raw"} ]}, -{ "hdr": "761", "rax": "769", "cmd": {"22": "D11C"}, "freq": 120, +{ "hdr": "761", "rax": "769", "cmd": {"22": "D11C"}, "freq": 30, "signals": [ {"id": "LR4_D11C_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "D11C Raw"} ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A32"}, "freq": 120, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A36"}, "freq": 30, "signals": [ - {"id": "LR4_2A32_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A32 Raw"} - ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A33"}, "freq": 120, - "signals": [ - {"id": "LR4_2A33_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A33 Raw"} - ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A34"}, "freq": 120, - "signals": [ - {"id": "LR4_2A34_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A34 Raw"} - ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A35"}, "freq": 120, - "signals": [ - {"id": "LR4_2A35_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A35 Raw"} - ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A36"}, "freq": 120, - "signals": [ - {"id": "LR4_2A36_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A36 Raw"} - ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A37"}, "freq": 120, - "signals": [ - {"id": "LR4_2A37_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A37 Raw"} - ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A38"}, "freq": 120, - "signals": [ - {"id": "LR4_2A38_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A38 Raw"} - ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A39"}, "freq": 120, - "signals": [ - {"id": "LR4_2A39_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A39 Raw"} - ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A3A"}, "freq": 120, - "signals": [ - {"id": "LR4_2A3A_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A3A Raw"} + {"id": "LR4_2A36_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A36 Distance Counter"} ]}, { "hdr": "795", "cmd": {"22": "1E8A"}, "freq": 5, "signals": [ {"id": "LR4_REAR_DIFF_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "max": 150, "min": -40, "add": -40, "unit": "celsius" }, "name": "Locking Diff Oil Temp"} ]}, -{ "hdr": "795", "rax": "79D", "cmd": {"22": "1E89"}, "freq": 120, - "signals": [ - {"id": "LR4_1E89_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "1E89 Raw"} - ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "2B12"}, "freq": 10, "signals": [ {"id": "LR4_SUSPENSION_2B12", "path": "Suspension", "fmt": { "len": 16, "max": 32767, "min": -32768, "sign": true, "unit": "millimeters" }, "name": "Suspension Height Offset"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B00"}, "freq": 10, - "signals": [ - {"id": "LR4_3B00_RAW", "path": "Suspension", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "3B00 Raw"} - ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B01"}, "freq": 10, - "signals": [ - {"id": "LR4_3B01_RAW", "path": "Suspension", "fmt": { "len": 32, "max": 4294967295, "nullmin": 0, "unit": "scalar" }, "name": "3B01 Raw"} - ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B02"}, "freq": 10, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B02"}, "freq": 30, "signals": [ {"id": "LR4_3B02_B0", "path": "Suspension", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "3B02 Byte 1"}, {"id": "LR4_3B02_B1", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 255, "unit": "scalar" }, "name": "3B02 Byte 2"}, @@ -101,11 +57,7 @@ "signals": [ {"id": "LR4_SUSPENSION_COMPRESSOR", "path": "Suspension", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "Compressor Activity"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B08"}, "freq": 10, - "signals": [ - {"id": "LR4_3B08_RAW", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "3B08 Raw"} - ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B0B"}, "freq": 10, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B0B"}, "freq": 30, "signals": [ {"id": "LR4_3B0B_RAW", "path": "Suspension", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "3B0B Raw"} ]}, @@ -318,17 +270,13 @@ "signals": [ {"id": "LR4_OIL_TEMP_SAE", "path": "Engine", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Oil Temp (SAE)"} ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E68"}, "freq": 120, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E68"}, "freq": 30, "signals": [ - {"id": "LR4_1E68_RAW", "path": "Transmission", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "1E68 Raw"} + {"id": "LR4_1E68_RAW", "path": "Transmission", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "1E68 Raw (varies most)"} ]}, { "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E69"}, "freq": 5, "signals": [ {"id": "LR4_GEARBOX_OIL_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "max": 120, "min": -40, "add": -40, "unit": "celsius" }, "name": "Gearbox Temp", "suggestedMetric": "transmissionFluidTemperature"} - ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E6A"}, "freq": 120, - "signals": [ - {"id": "LR4_1E6A_RAW", "path": "Transmission", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "1E6A Raw"} ]} ], "synthetics": [ From 24e324505813f05dd239f0064617e77b0f21abed Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 20 Sep 2026 00:49:52 -0600 Subject: [PATCH 62/84] trade the SAE duplicates for three PIDs that answer 033E outpolls its SAE alias F423 15910 samples to 158, and 03F3 outpolls F45C 347015 to 1169; F423 stopped answering entirely on 2026-09-01. Drop both aliases, and with F423 the rail pressure crosscheck that divided one by the other. 197C and D11C are undecoded raws that took zero polls in ten days, and dropping them empties header 761. F41F, F421 and F430 answer 100% of the time and decode through the F4xx PID mirror this file already relies on: run time, distance with MIL on, warm-ups since codes cleared. --- signalsets/v3/default.json | 27 ++++++++-------------- tests/test_cases/2016/command_support.yaml | 3 +++ 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index a92747c..9f2d16a 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -10,14 +10,6 @@ }} } ]}, -{ "hdr": "761", "rax": "769", "cmd": {"22": "197C"}, "freq": 30, - "signals": [ - {"id": "LR4_197C_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "197C Raw"} - ]}, -{ "hdr": "761", "rax": "769", "cmd": {"22": "D11C"}, "freq": 30, - "signals": [ - {"id": "LR4_D11C_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "D11C Raw"} - ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A36"}, "freq": 30, "signals": [ {"id": "LR4_2A36_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A36 Distance Counter"} @@ -155,14 +147,22 @@ "signals": [ {"id": "LR4_THROTTLE_POS", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Throttle Position", "suggestedMetric": "throttlePosition"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F423"}, "freq": 5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F41F"}, "freq": 30, + "signals": [ + {"id": "LR4_RUN_TIME", "path": "Engine", "fmt": { "len": 16, "max": 65535, "unit": "seconds" }, "name": "Run Time Since Engine Start"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F421"}, "freq": 600, "signals": [ - {"id": "LR4_FUEL_RAIL_P_GAUGE", "path": "Fuel", "fmt": { "len": 16, "max": 655350, "mul": 10, "unit": "kilopascal" }, "name": "Fuel Rail Pressure (SAE)"} + {"id": "LR4_MIL_DIST", "path": "Trips", "fmt": { "len": 16, "max": 65535, "unit": "kilometers" }, "name": "Distance With MIL On"} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F42F"}, "freq": 30, "signals": [ {"id": "LR4_FUEL_LEVEL", "path": "Fuel", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Fuel Level", "suggestedMetric": "fuelTankLevel"} ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F430"}, "freq": 600, + "signals": [ + {"id": "LR4_WARMUPS", "path": "Trips", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "Warm-ups Since Codes Cleared"} + ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F431"}, "freq": 30, "signals": [ {"id": "LR4_DIST_SINCE_CLR", "path": "Trips", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "kilometers" }, "name": "Distance Since Codes Cleared", "suggestedMetric": "distanceSinceDTCsCleared"} @@ -266,10 +266,6 @@ "signals": [ {"id": "LR4_THROTTLE_CMD", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Commanded Throttle"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F45C"}, "freq": 5, - "signals": [ - {"id": "LR4_OIL_TEMP_SAE", "path": "Engine", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Oil Temp (SAE)"} - ]}, { "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E68"}, "freq": 30, "signals": [ {"id": "LR4_1E68_RAW", "path": "Transmission", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "1E68 Raw (varies most)"} @@ -292,9 +288,6 @@ { "id": "LR4_PEDAL_AGREEMENT", "path": "Engine", "name": "Pedal Agreement", "max": 3, "unit": "scalar", "formula": { "op": "ratio", "a": "LR4_PEDAL_D", "b": "LR4_PEDAL_E" }}, - { "id": "LR4_RAIL_CROSSCHECK", "path": "Fuel", "name": "Rail Pressure Crosscheck", "max": 3, "unit": "scalar", "formula": { - "op": "ratio", "a": "LR4_FUEL_RAIL_P", "b": "LR4_FUEL_RAIL_P_GAUGE" - }}, { "id": "LR4_SUSPENSION_BALANCE_F", "path": "Suspension", "name": "Suspension Balance Front", "max": 3, "unit": "scalar", "formula": { "op": "ratio", "a": "LR4_SUSPENSION_PRES_FL", "b": "LR4_SUSPENSION_PRES_FR" }}, diff --git a/tests/test_cases/2016/command_support.yaml b/tests/test_cases/2016/command_support.yaml index 3970e88..20cce07 100644 --- a/tests/test_cases/2016/command_support.yaml +++ b/tests/test_cases/2016/command_support.yaml @@ -86,6 +86,9 @@ supported_commands_by_ecu: - 7E0.220520 - 7E0.22F18C - 7E0.22F40C + - 7E0.22F41F + - 7E0.22F421 + - 7E0.22F430 - 7E0.22F442 "7E1": - 0101:ACRF_RDY,ACRF_SUP,AIR_RDY,AIR_SUP,CAT_RDY,CAT_SUP,CCM_RDY,CCM_SUP,CIM_SUP,DTC_CNT,EGR_RDY,EGR_SUP,EVAP_RDY,EVAP_SUP,FUEL_RDY,FUEL_SUP,HCAT_RDY,HCAT_SUP,HTR_RDY,HTR_SUP,MIL,MIS_RDY,MIS_SUP,O2S_RDY,O2S_SUP From 6bd75eafc606dc9687639bf88b6bb89a3e1c2602 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 20 Sep 2026 00:49:52 -0600 Subject: [PATCH 63/84] name the headlamp and ABS modules, record what the budget starves 22F191 identifies 734 as a Hella 14C243 headlamp leveller and 760 as the ABS module a published L319 scan reports under CH32-14C227-AB. The other four unmined modules rejected F191 but each returned a distinct serial, so they are real and separate. A 0000-03FF sweep of 726 found one hit, 0202. The poll audit is the uncomfortable half: F40C is set to the same freq as vehicle speed and logged 12 samples in ten days against its 17130. --- README.md | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 06338e7..9e5a709 100644 --- a/README.md +++ b/README.md @@ -24,9 +24,9 @@ from `rax`. | `716` | `71E` | Unmined | | `726` | `72E` | Unmined — returns the VIN | | `732` | `73A` | Gear selector | -| `734` | `73C` | Unmined | +| `734` | `73C` | Headlamp control module (HCM) | | `737` | `73F` | Unmined | -| `760` | `768` | Unmined | +| `760` | `768` | ABS / brake control module (probable) | | `761` | `769` | Body / instrument | | `792` | `79A` | Unidentified — answers `2A3x` | | `795` | `79D` | Rear differential | @@ -46,6 +46,35 @@ Pelican handles standard PIDs internally, so a signalset entry for `012F` never surfaces in the app. The `F4xx` alias arrives as a custom signal and shows up normally. Most of this file uses that trick. +### Module identification (2026-09-19) + +A UDS identification probe (`22F18C` ECU serial, `22F191` ECU part number) +was run against all six previously unmined modules: + +| Module | `F18C` serial | `F191` part number | +|---|---|---| +| `716` | `0000000004757126` | rejected (NRC 31) | +| `726` | `5224293808` | rejected (NRC 31) | +| `734` | `0080-508580` | `EX53-14C243-AB` | +| `737` | `Q117eeA3516` | rejected (NRC 31) | +| `760` | `1716263MO0507` | `CH32-14C227-AB` | +| `797` | `0-00002C` | rejected (NRC 31) | + +`734`'s part number is a Hella `14C243` headlamp levelling / adaptive front +lighting controller, the same base number used across Jaguar Land Rover +platforms of this era (it also shows up as `8W83-14C243-AA` on the Jaguar +XK) — identified as the Headlamp control module (HCM). `760`'s part number +matches the ABS/brake module in a published Discovery 4 (L319) ECU scan +report; that identification rests on a single external scan report, so +treat it as probable rather than confirmed. The other four modules didn't +resolve a part number, but each returned a distinct serial, so they're +confirmed to be real, separate modules even though what they do is still +unknown. + +`22F187` was also tried against all six and came back NRC 31 (request out +of range) everywhere except `726`, whose reply was malformed and returned +VIN bytes instead of a rejection — worth a retry. + --- ## Engine @@ -409,8 +438,13 @@ formulas eventually get worked out. | `795` / `79D` | `1E89` | | `7E1` / `7E9` | `1E68`, `1E6A` — neighbours of the gearbox temp | | `761` / `769` | `197C`, `D11C` | +| `726` / `72E` | `0202` — returns `00` | | `7D3` / `7DB` | `3B00`, `3B01`, `3B02`, `3B08`, `3B0B` — `3B02` answers four single-byte values that look like one per corner | +`726`'s `0202` came out of a sweep of DIDs `0000`–`03FF` against that module +(916 requests) — the one hit, and the first non-identification DID ever +found there. + **Tire pressures remain unsolved, but they exist.** Module `751` returns no data to any request, and nothing found so far resembles four tire pressures. The decisive clue is the spare: this truck warns when the *spare* is low, and a @@ -468,6 +502,24 @@ That totals about 11 requests per second of demand against roughly 11 available once protocol overhead is removed. The four one-second commands exist so the boost calculation stays responsive. +### What actually gets polled + +The signalset defined 52 commands when a scan-log audit through 2026-09-19 +found only about 20 receiving meaningful traffic on a drive. Five commands +received zero polls in the preceding ten days: `7E0/033E`, `7E0/F407`, +`7E0/F423`, `761/197C`, `761/D11C`. + +Starvation is worst for `7E0/F40C` (Engine Speed): it's set to `freq` 1, the +same as Vehicle Speed, but logged 12 samples in ten days against Vehicle +Speed's 17,130. Timing Advance (`F40E`), Absolute Load (`F443`), and both +accelerator pedal signals (`F449`, `F44A`) are also in single digits over the +same period. + +This hasn't been traced to a cause — it's an observation, not a diagnosis. +The practical consequence is that adding commands without removing others +makes it worse: new probes should be traded against deletions, not added on +top. + **Two known inefficiencies**, neither fixable from a signalset: Requests carry no expected-response count. The ELM327 datasheet documents that From 48565be5645c6112552443b92d0a63a141b5b87a Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 20 Sep 2026 01:16:25 -0600 Subject: [PATCH 64/84] eight commands went quiet on the day we re-tiered every freq The starvation reading was wrong. It is not the budget - demand is 10.21 req/s against the 11-13 available - and it is not freq, because F40C and F40D are both freq 1 and only F40D runs. Eight commands simply stopped on 2026-08-30, the day f782e4d and 527a47f rewrote every freq in the file. The cost is concrete: engineSpeed has never been filled in fourteen months. 010C carries rpm 2511 times per drive and Pelican eats standard PIDs internally, so the F40C alias was the only path to a recorded signal and it is not running. THROTTLE_TRACKING and PEDAL_AGREEMENT cannot compute either. --- README.md | 56 ++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 9e5a709..569bfc3 100644 --- a/README.md +++ b/README.md @@ -502,23 +502,45 @@ That totals about 11 requests per second of demand against roughly 11 available once protocol overhead is removed. The four one-second commands exist so the boost calculation stays responsive. -### What actually gets polled - -The signalset defined 52 commands when a scan-log audit through 2026-09-19 -found only about 20 receiving meaningful traffic on a drive. Five commands -received zero polls in the preceding ten days: `7E0/033E`, `7E0/F407`, -`7E0/F423`, `761/197C`, `761/D11C`. - -Starvation is worst for `7E0/F40C` (Engine Speed): it's set to `freq` 1, the -same as Vehicle Speed, but logged 12 samples in ten days against Vehicle -Speed's 17,130. Timing Advance (`F40E`), Absolute Load (`F443`), and both -accelerator pedal signals (`F449`, `F44A`) are also in single digits over the -same period. - -This hasn't been traced to a cause — it's an observation, not a diagnosis. -The practical consequence is that adding commands without removing others -makes it worse: new probes should be traded against deletions, not added on -top. +### Eight commands stopped being polled on 2026-08-30 + +A scan-log audit through 2026-09-19 found that eight commands in this file +are never requested on a drive, and have not been since 2026-08-30: + +| Command | Signal | Last normal day | +|---|---|---| +| `7E0/F40C` | Engine Speed | 2026-08-29, 1155 polls | +| `7E0/F411` | Throttle Position | 2026-09-04 | +| `7E0/F40E` | Timing Advance | 2026-08-30 | +| `7E0/F443` | Absolute Load | 2026-08-30 | +| `7E0/F449` | Accelerator Pedal D | 2026-08-30 | +| `7E0/F44A` | Accelerator Pedal E | 2026-08-30 | +| `7E0/F407` | Long Term Fuel Trim B1 | 2026-09-01 | +| `7E0/033E` | Fuel Rail Pressure | 2026-09-01 | + +**No engine speed value has ever reached the signal database**, across +fourteen months. The `engineSpeed` metric slot is wired to `F40C` and has +never been filled. The data is on the wire — the app polls standard PID +`010C` 2511 times in a 39-minute drive — but Pelican consumes standard PIDs +internally and they never surface as signals, which is the whole reason this +file uses `F4xx` aliases. The alias is the part that isn't running. + +Two synthetics consequently never compute: `LR4_THROTTLE_TRACKING` needs +`F411`, and `LR4_PEDAL_AGREEMENT` needs `F449` and `F44A`. + +Two candidate causes are ruled out. It is not the request budget: total +demand is 10.21 req/s against the 11-13 the adapter delivers. It is not the +`freq` values either, because dead commands share tiers with live ones — +`F40C` and `F40D` are both `freq` 1, and only `F40D` runs; `F411`, `F443`, +`F449` and `F44A` sit at `freq` 3 alongside `F404`, `F434` and `F444`, which +all run. + +What remains is the app's own scheduling, and the date points at this repo: +2026-08-30 is when `f782e4d` and `527a47f` re-tiered every `freq` in the +file, `f782e4d` briefly introducing fractional values such as `0.5` before +`527a47f` rounded them back to integers. Whether the app cached a schedule +built from that intermediate state is untested. Before changing anything +here, confirm which version of this signalset the app actually holds. **Two known inefficiencies**, neither fixable from a signalset: From 868cdcfecd7c939d77c028b229d03bde08f2e0d4 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 20 Sep 2026 01:23:10 -0600 Subject: [PATCH 65/84] add seven probes chosen to be watched, not trusted 1153 and 1154 are a charging pair at 1/256 V that 1cf20db called dead; 1154 sits at exactly 14.00 V and both dip on crank, and every sample behind the original call was taken parked. F408 and F409 are the bank-2 trims, never once requested on this truck, which is the only way to measure the asymmetry directly now that F407 is silent. 113F and 2104 move but parked data cannot tell a raw Celsius reading from a -40 one, so they go in as scalars. 726/0202 is the single hit from today's sweep. Demand goes to 10.76 req/s, still inside the budget, and F41F against standard 011F tells us whether the alias path works at all. --- README.md | 31 ++++++++++++++++++++++ signalsets/v3/default.json | 28 +++++++++++++++++++ tests/test_cases/2016/command_support.yaml | 6 +++++ 3 files changed, 65 insertions(+) diff --git a/README.md b/README.md index 569bfc3..b019a60 100644 --- a/README.md +++ b/README.md @@ -542,6 +542,37 @@ file, `f782e4d` briefly introducing fractional values such as `0.5` before built from that intermediate state is untested. Before changing anything here, confirm which version of this signalset the app actually holds. +### Probes added to test that conclusion + +Seven commands were added on 2026-09-20 specifically to be watched rather +than trusted. Total demand rises to 10.76 req/s, still inside the budget. + +`7E0/1153` and `7E0/1154` are a charging-voltage pair at 1/256 V. `1154` +rests at exactly `0E00`, 14.00 V, which reads as a regulator setpoint rather +than a measurement; `1153` floats 13.94-14.12 V around it and both drop to +5.7-10.1 V on crank. They do not track `F442`, which drifted 13.0-14.5 V +across the same session, so this is a different node and at better +resolution. Both were dropped as dead probes in `1cf20db`; the logs +contradict that, and every sample behind the original call was taken parked. + +`7E0/F408` and `7E0/F409` are the bank-2 fuel trims. They have never been +requested on this vehicle. If they answer, the bank asymmetry becomes +directly measurable instead of inferred, which matters more now that `F407` +has been silent since 2026-09-01. + +`7E0/113F` and `7E1/2104` are undecoded single bytes that move: `113F` drifts +77-80 and `2104` climbs 56-64 while parked and running. Both are recorded as +raw scalars because a plain degrees-Celsius reading and a reading with the +usual -40 offset are both physically plausible, and parked data cannot +separate them. + +`726/0202` is the one hit from the `0000`-`03FF` sweep of that module. + +These also double as a test of the scheduler: `F41F` duplicates standard PID +`011F`, which the app already polls 1560 times a drive. If `F41F` records and +`F40C` still does not, the alias mechanism works and something specific to +those eight commands does not. + **Two known inefficiencies**, neither fixable from a signalset: Requests carry no expected-response count. The ELM327 datasheet documents that diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 9f2d16a..a957781 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -10,6 +10,10 @@ }} } ]}, +{ "hdr": "726", "rax": "72E", "cmd": {"22": "0202"}, "freq": 60, + "signals": [ + {"id": "LR4_726_0202_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "726 0202 Raw"} + ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A36"}, "freq": 30, "signals": [ {"id": "LR4_2A36_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A36 Distance Counter"} @@ -103,6 +107,18 @@ "signals": [ {"id": "LR4_ODOMETER", "path": "Trips", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "kilometers" }, "name": "Odometer", "suggestedMetric": "odometer"} ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1153"}, "freq": 5, + "signals": [ + {"id": "LR4_CHARGE_V", "path": "Engine", "fmt": { "len": 16, "max": 65.535, "div": 256, "unit": "volts" }, "name": "Charging Voltage"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1154"}, "freq": 5, + "signals": [ + {"id": "LR4_CHARGE_V_TARGET", "path": "Engine", "fmt": { "len": 16, "max": 65.535, "div": 256, "unit": "volts" }, "name": "Charging Voltage Target"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "113F"}, "freq": 30, + "signals": [ + {"id": "LR4_113F_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "113F Raw"} + ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F404"}, "freq": 3, "signals": [ {"id": "LR4_LOAD_CALC", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Calculated Load", "suggestedMetric": "engineLoad"} @@ -119,6 +135,14 @@ "signals": [ {"id": "LR4_LONGFT1", "path": "Fuel", "fmt": { "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "Long Term Fuel Trim B1"} ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F408"}, "freq": 30, + "signals": [ + {"id": "LR4_SHRTFT2", "path": "Fuel", "fmt": { "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "Short Term Fuel Trim B2"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F409"}, "freq": 30, + "signals": [ + {"id": "LR4_LONGFT2", "path": "Fuel", "fmt": { "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "Long Term Fuel Trim B2"} + ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40B"}, "freq": 1, "signals": [ {"id": "LR4_MAP", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "kilopascal" }, "name": "Manifold Pressure"} @@ -270,6 +294,10 @@ "signals": [ {"id": "LR4_1E68_RAW", "path": "Transmission", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "1E68 Raw (varies most)"} ]}, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "2104"}, "freq": 30, + "signals": [ + {"id": "LR4_2104_RAW", "path": "Drivetrain", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "2104 Raw"} + ]}, { "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E69"}, "freq": 5, "signals": [ {"id": "LR4_GEARBOX_OIL_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "max": 120, "min": -40, "add": -40, "unit": "celsius" }, "name": "Gearbox Temp", "suggestedMetric": "transmissionFluidTemperature"} diff --git a/tests/test_cases/2016/command_support.yaml b/tests/test_cases/2016/command_support.yaml index 20cce07..45547e5 100644 --- a/tests/test_cases/2016/command_support.yaml +++ b/tests/test_cases/2016/command_support.yaml @@ -1,5 +1,7 @@ model_year: 2016 supported_commands_by_ecu: + "726": + - "726.220202" "732": - 732.22D928 "7DF": @@ -84,6 +86,9 @@ supported_commands_by_ecu: - 0170:BP_A,BP_A_ACT,BP_A_ACT_SUP,BP_A_CMD,BP_A_CMD_SUP,BP_A_SUP,BP_B,BP_B_ACT,BP_B_ACT_SUP,BP_B_CMD,BP_B_CMD_SUP,BP_B_SUP - 7E0.22033E - 7E0.220520 + - 7E0.22113F + - 7E0.221153 + - 7E0.221154 - 7E0.22F18C - 7E0.22F40C - 7E0.22F41F @@ -119,6 +124,7 @@ supported_commands_by_ecu: - 7E1.7E9.0133 - 7E1.7E9.0142 - 7E1.7E9.015A + - 7E1.7E9.222104 "7E8": - 7E8.0103 - 7E8.0104 From 96ff75a5e9acd20960707ab4d3a634275aa4bfdc Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 20 Sep 2026 01:41:17 -0600 Subject: [PATCH 66/84] add 51 debug params, one for every DID that answers and is not decoded Everything the truck has ever replied to that this file does not already name, recorded as a raw scalar at the observed byte width. Cadence follows what the logs already show each one doing: 60s for the six that vary, 120s for the nine that flip between two values, 600s for the thirty-six that have never moved - though most of those were only ever sampled parked, and the suspension ones at a single ride height. Costs 0.235 req/s, putting total demand at 10.99. --- signalsets/v3/default.json | 204 +++++++++++++++++++++++++++++++++++++ 1 file changed, 204 insertions(+) diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index a957781..67e7437 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -10,6 +10,210 @@ }} } ]}, +{ "hdr": "761", "rax": "769", "cmd": {"22": "197C"}, "freq": 60, + "signals": [ + {"id": "LR4_197C_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "197C Raw"} + ]}, +{ "hdr": "761", "rax": "769", "cmd": {"22": "D11C"}, "freq": 60, + "signals": [ + {"id": "LR4_D11C_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "D11C Raw"} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A32"}, "freq": 600, + "signals": [ + {"id": "LR4_2A32_RAW", "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A32 Raw"} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A33"}, "freq": 600, + "signals": [ + {"id": "LR4_2A33_RAW", "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A33 Raw"} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A34"}, "freq": 600, + "signals": [ + {"id": "LR4_2A34_RAW", "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A34 Raw"} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A35"}, "freq": 600, + "signals": [ + {"id": "LR4_2A35_RAW", "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A35 Raw"} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A37"}, "freq": 600, + "signals": [ + {"id": "LR4_2A37_RAW", "path": "ECU", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A37 Raw"} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A38"}, "freq": 600, + "signals": [ + {"id": "LR4_2A38_RAW", "path": "ECU", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A38 Raw"} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A39"}, "freq": 600, + "signals": [ + {"id": "LR4_2A39_RAW", "path": "ECU", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A39 Raw"} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A3A"}, "freq": 600, + "signals": [ + {"id": "LR4_2A3A_RAW", "path": "ECU", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A3A Raw"} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A3B"}, "freq": 600, + "signals": [ + {"id": "LR4_2A3B_RAW", "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A3B Raw"} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A3C"}, "freq": 600, + "signals": [ + {"id": "LR4_2A3C_RAW", "path": "ECU", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A3C Raw"} + ]}, +{ "hdr": "795", "rax": "79D", "cmd": {"22": "1E88"}, "freq": 600, + "signals": [ + {"id": "LR4_1E88_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "1E88 Raw"} + ]}, +{ "hdr": "795", "rax": "79D", "cmd": {"22": "1E89"}, "freq": 600, + "signals": [ + {"id": "LR4_1E89_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "1E89 Raw"} + ]}, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B00"}, "freq": 600, + "signals": [ + {"id": "LR4_3B00_RAW", "path": "Suspension", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "3B00 Raw"} + ]}, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B01"}, "freq": 600, + "signals": [ + {"id": "LR4_3B01_RAW", "path": "Suspension", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "3B01 Raw"} + ]}, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B08"}, "freq": 600, + "signals": [ + {"id": "LR4_3B08_RAW", "path": "Suspension", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "3B08 Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1044"}, "freq": 600, + "signals": [ + {"id": "LR4_1044_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1044 Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "10E0"}, "freq": 600, + "signals": [ + {"id": "LR4_10E0_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "10E0 Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "112C"}, "freq": 60, + "signals": [ + {"id": "LR4_112C_RAW", "path": "Engine", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "112C Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1139"}, "freq": 60, + "signals": [ + {"id": "LR4_1139_RAW", "path": "Engine", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "1139 Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1151"}, "freq": 120, + "signals": [ + {"id": "LR4_1151_RAW", "path": "Engine", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "1151 Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1152"}, "freq": 600, + "signals": [ + {"id": "LR4_1152_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1152 Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1155"}, "freq": 600, + "signals": [ + {"id": "LR4_1155_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1155 Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1156"}, "freq": 120, + "signals": [ + {"id": "LR4_1156_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1156 Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1158"}, "freq": 600, + "signals": [ + {"id": "LR4_1158_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1158 Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1159"}, "freq": 120, + "signals": [ + {"id": "LR4_1159_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1159 Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "115B"}, "freq": 120, + "signals": [ + {"id": "LR4_115B_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "115B Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1160"}, "freq": 600, + "signals": [ + {"id": "LR4_1160_RAW", "path": "Engine", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "1160 Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1164"}, "freq": 120, + "signals": [ + {"id": "LR4_1164_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1164 Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1187"}, "freq": 600, + "signals": [ + {"id": "LR4_1187_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1187 Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "11BA"}, "freq": 600, + "signals": [ + {"id": "LR4_11BA_RAW", "path": "Engine", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "11BA Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "11BB"}, "freq": 600, + "signals": [ + {"id": "LR4_11BB_RAW", "path": "Engine", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "11BB Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "11BD"}, "freq": 600, + "signals": [ + {"id": "LR4_11BD_RAW", "path": "Engine", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "11BD Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "11BE"}, "freq": 600, + "signals": [ + {"id": "LR4_11BE_RAW", "path": "Engine", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "11BE Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "11C4"}, "freq": 60, + "signals": [ + {"id": "LR4_11C4_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "11C4 Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "11C5"}, "freq": 120, + "signals": [ + {"id": "LR4_11C5_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "11C5 Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "11CC"}, "freq": 600, + "signals": [ + {"id": "LR4_11CC_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "11CC Raw"} + ]}, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "0302"}, "freq": 120, + "signals": [ + {"id": "LR4_0302_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "0302 Raw"} + ]}, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "0303"}, "freq": 600, + "signals": [ + {"id": "LR4_0303_RAW", "path": "Drivetrain", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "0303 Raw"} + ]}, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "0304"}, "freq": 600, + "signals": [ + {"id": "LR4_0304_RAW", "path": "Drivetrain", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "0304 Raw"} + ]}, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "0305"}, "freq": 600, + "signals": [ + {"id": "LR4_0305_RAW", "path": "Drivetrain", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "0305 Raw"} + ]}, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "0805"}, "freq": 120, + "signals": [ + {"id": "LR4_0805_RAW", "path": "Drivetrain", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "0805 Raw"} + ]}, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "101A"}, "freq": 60, + "signals": [ + {"id": "LR4_101A_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "101A Raw"} + ]}, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E6A"}, "freq": 600, + "signals": [ + {"id": "LR4_1E6A_RAW", "path": "Drivetrain", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1E6A Raw"} + ]}, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "210F"}, "freq": 120, + "signals": [ + {"id": "LR4_210F_RAW", "path": "Drivetrain", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "210F Raw"} + ]}, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "2B1B"}, "freq": 600, + "signals": [ + {"id": "LR4_2B1B_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "2B1B Raw"} + ]}, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "2B1C"}, "freq": 600, + "signals": [ + {"id": "LR4_2B1C_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "2B1C Raw"} + ]}, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "2B1D"}, "freq": 600, + "signals": [ + {"id": "LR4_2B1D_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "2B1D Raw"} + ]}, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "2B1E"}, "freq": 600, + "signals": [ + {"id": "LR4_2B1E_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "2B1E Raw"} + ]}, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "DD01"}, "freq": 600, + "signals": [ + {"id": "LR4_DD01_RAW", "path": "Drivetrain", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "DD01 Raw"} + ]}, { "hdr": "726", "rax": "72E", "cmd": {"22": "0202"}, "freq": 60, "signals": [ {"id": "LR4_726_0202_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "726 0202 Raw"} From f5348e76ff330a12751753940a465cf20321d96f Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 20 Sep 2026 01:45:31 -0600 Subject: [PATCH 67/84] document the debug batch and what would retire it Cadence per tier, and the caveat that matters: every 'never moved' reading came from a parked truck, and 3B00/3B01/3B08 were read at one ride height where they could not have moved regardless. Records the 197C and D11C reversal rather than quietly undoing it. Also the suspension decode audit - pressures, signed height offset and module voltage all check out against every logged sample; 3B4D has returned zero on all 171 samples, and only 36 minutes in fourteen months have all four corners at once. --- README.md | 44 ++++++++ tests/test_cases/2016/command_support.yaml | 120 +++++++++++++++++++-- 2 files changed, 154 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index b019a60..74369b3 100644 --- a/README.md +++ b/README.md @@ -445,6 +445,18 @@ formulas eventually get worked out. (916 requests) — the one hit, and the first non-identification DID ever found there. +**The suspension decodes check out.** Replaying every logged sample through +the formats in this file gives corner pressures of 34-50 psi, a ride height +offset correctly signed at -91 to +50 mm, and module voltage of 9.12-14.56 V, +all physically sensible. The exception is `3B4D`, labelled Drive Mode, which +has returned `0` on all 171 samples ever recorded — either the label or the +byte offset is wrong. + +What the audit could not do is say anything about suspension health. Across +fourteen months only 36 minutes have all four corner pressures captured +together, because the `7D3` module receives one or two requests per drive +despite its `freq` of 10. + **Tire pressures remain unsolved, but they exist.** Module `751` returns no data to any request, and nothing found so far resembles four tire pressures. The decisive clue is the spare: this truck warns when the *spare* is low, and a @@ -573,6 +585,38 @@ These also double as a test of the scheduler: `F41F` duplicates standard PID `F40C` still does not, the alias mechanism works and something specific to those eight commands does not. +### The debug batch + +On 2026-09-20 a further 51 commands went in: one for every DID this truck has +ever answered that nothing here decodes. Each is a raw scalar at the byte +width the logs show it returning, named `LR4__RAW`. The batch costs +0.235 req/s and puts total demand at 10.99. + +Cadence follows what fourteen months of scan logs show each DID doing: + +| `freq` | Count | Behaviour in the logs | +|---|---|---| +| 60 | 6 | Genuinely vary — `761/197C`, `761/D11C`, `7E0/112C`, `7E0/1139`, `7E0/11C4`, `7E1/101A` | +| 120 | 9 | Flip between exactly two values | +| 600 | 36 | Never moved | + +**"Never moved" means never moved while parked.** Every sample behind that +bottom tier came from a stationary truck, and the three suspension entries +(`3B00`, `3B01`, `3B08`) were read at a single ride height, where they could +not have varied even if they encode something. That tier is the weakest +classification here, which is why it is slow rather than absent. + +`761/197C` and `761/D11C` were deleted earlier in this same branch as +undecoded raws taking zero polls. That was true and also misleading: the +audit then showed they are among the most variable DIDs on the truck — +`197C` returns 9 distinct values in 14 samples, `D11C` ranges `3A` to `41`, +which would be a plausible temperature. They were starved, not dead, and +they are back at `freq` 60. + +A DID that moves on a real drive earns a proper decode. One that stays flat +through a full cycle — including a ride-height change and a terrain-mode +switch — can be deleted for good rather than on suspicion. + **Two known inefficiencies**, neither fixable from a signalset: Requests carry no expected-response count. The ELM327 datasheet documents that diff --git a/tests/test_cases/2016/command_support.yaml b/tests/test_cases/2016/command_support.yaml index 45547e5..97f9316 100644 --- a/tests/test_cases/2016/command_support.yaml +++ b/tests/test_cases/2016/command_support.yaml @@ -4,6 +4,42 @@ supported_commands_by_ecu: - "726.220202" "732": - 732.22D928 + "761": + - 761.22197C + - 761.22D11C + "792": + - 792.222A32 + - 792.222A33 + - 792.222A34 + - 792.222A35 + - 792.222A36 + - 792.222A37 + - 792.222A38 + - 792.222A39 + - 792.222A3A + - 792.222A3B + - 792.222A3C + "795": + - 795.221E88 + - 795.221E89 + - 795.221E8A + "7D3": + - 7D3.222B12 + - 7D3.223B00 + - 7D3.223B01 + - 7D3.223B02 + - 7D3.223B03 + - 7D3.223B04 + - 7D3.223B05 + - 7D3.223B06 + - 7D3.223B07 + - 7D3.223B08 + - 7D3.223B0B + - 7D3.223B3C + - 7D3.223B4D + - 7D3.223B71 + - 7D3.223B72 + - 7D3.22D11A "7DF": - 7DF.0101 - 7DF.0103 @@ -50,7 +86,7 @@ supported_commands_by_ecu: - 010E:SPARKADV - 010F:IAT - 0110:MAF - - 0111:TP + - "0111:TP" - 0113:O2S11_EXISTS,O2S12_EXISTS,O2S13_EXISTS,O2S14_EXISTS,O2S21_EXISTS,O2S22_EXISTS,O2S23_EXISTS,O2S24_EXISTS - 0115:O2S12,SHRTFT11 - 0119:O2S22,SHRTFT22 @@ -67,10 +103,10 @@ supported_commands_by_ecu: - 013C:CATEMP11 - 013D:CATEMP21 - 0141:ACRFCMPL,ACRF_ENA,AIR_CMPL,AIR_ENA,CAT_CMPL,CAT_ENA,CCM_CMPL,CCM_ENA,CIM_SUP_FLAG,EGR_CMPL,EGR_ENA,EVAPCMPL,EVAP_ENA,FUEL_CMPL,FUEL_ENA,HCATCMPL,HCAT_ENA,HTR_CMPL,HTR_ENA,MIS_CMPL,MIS_ENA,O2S_CMPL,O2S_ENA - - 0142:VPWR + - "0142:VPWR" - 0143:LOAD_ABS - 0144:EQ_RAT - - 0145:TP_R + - "0145:TP_R" - 0146:AAT - 0147:TP_B - 0149:APP_D @@ -85,30 +121,79 @@ supported_commands_by_ecu: - 0168:IAT_11,IAT_11_SUP,IAT_12,IAT_12_SUP,IAT_13,IAT_13_SUP,IAT_21,IAT_21_SUP,IAT_22,IAT_22_SUP,IAT_23,IAT_23_SUP - 0170:BP_A,BP_A_ACT,BP_A_ACT_SUP,BP_A_CMD,BP_A_CMD_SUP,BP_A_SUP,BP_B,BP_B_ACT,BP_B_ACT_SUP,BP_B_CMD,BP_B_CMD_SUP,BP_B_SUP - 7E0.22033E + - 7E0.2203E6 + - 7E0.2203F2 + - 7E0.2203F3 - 7E0.220520 + - 7E0.221044 + - 7E0.2210E0 + - 7E0.22112C + - 7E0.221139 - 7E0.22113F + - 7E0.221151 + - 7E0.221152 - 7E0.221153 - 7E0.221154 + - 7E0.221155 + - 7E0.221156 + - 7E0.221158 + - 7E0.221159 + - 7E0.22115B + - 7E0.221160 + - 7E0.221164 + - 7E0.221187 + - 7E0.2211BA + - 7E0.2211BB + - 7E0.2211BD + - 7E0.2211BE + - 7E0.2211C4 + - 7E0.2211C5 + - 7E0.2211CC + - 7E0.22DD01 - 7E0.22F18C + - 7E0.22F404 + - 7E0.22F405 + - 7E0.22F406 + - 7E0.22F407 + - 7E0.22F408 + - 7E0.22F409 + - 7E0.22F40B - 7E0.22F40C + - 7E0.22F40D + - 7E0.22F40E + - 7E0.22F40F + - 7E0.22F410 + - 7E0.22F411 - 7E0.22F41F - 7E0.22F421 + - 7E0.22F42F - 7E0.22F430 + - 7E0.22F431 + - 7E0.22F433 + - 7E0.22F434 + - 7E0.22F43C + - 7E0.22F43D - 7E0.22F442 + - 7E0.22F443 + - 7E0.22F444 + - 7E0.22F446 + - 7E0.22F449 + - 7E0.22F44A + - 7E0.22F44C "7E1": - 0101:ACRF_RDY,ACRF_SUP,AIR_RDY,AIR_SUP,CAT_RDY,CAT_SUP,CCM_RDY,CCM_SUP,CIM_SUP,DTC_CNT,EGR_RDY,EGR_SUP,EVAP_RDY,EVAP_SUP,FUEL_RDY,FUEL_SUP,HCAT_RDY,HCAT_SUP,HTR_RDY,HTR_SUP,MIL,MIS_RDY,MIS_SUP,O2S_RDY,O2S_SUP - 0104:LOAD_PCT - 0105:ECT - 010C:RPM - 010D:VSS - - 0111:TP + - "0111:TP" - 011C:OBDSUP - 011F:RUNTM - 0121:MIL_DIST - 0130:WARM_UPS - 0131:CLR_DIST - 0133:BARO - - 0142:VPWR + - "0142:VPWR" - 015A:APP_R - 7E1.7E9.0101 - 7E1.7E9.0104 @@ -124,7 +209,22 @@ supported_commands_by_ecu: - 7E1.7E9.0133 - 7E1.7E9.0142 - 7E1.7E9.015A + - 7E1.7E9.220302 + - 7E1.7E9.220303 + - 7E1.7E9.220304 + - 7E1.7E9.220305 + - 7E1.7E9.220805 + - 7E1.7E9.22101A + - 7E1.7E9.221E68 + - 7E1.7E9.221E69 + - 7E1.7E9.221E6A - 7E1.7E9.222104 + - 7E1.7E9.22210F + - 7E1.7E9.222B1B + - 7E1.7E9.222B1C + - 7E1.7E9.222B1D + - 7E1.7E9.222B1E + - 7E1.7E9.22DD01 "7E8": - 7E8.0103 - 7E8.0104 @@ -155,12 +255,12 @@ supported_commands_by_ecu: - 7E8.015C unsupported_commands_by_ecu: "733": - - '733.229924' + - "733.229924" "751": - - '751.222076' - - '751.222077' - - '751.222078' - - '751.222079' + - "751.222076" + - "751.222077" + - "751.222078" + - "751.222079" "795": - 795.220E8A "7E0": From 1a4ba84f24b7becbfa65dc1cf0739d828d5650b7 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 20 Sep 2026 02:14:44 -0600 Subject: [PATCH 68/84] write down the orientation and the standing field checklist CLAUDE.md is what someone needs before touching this repo: layout, the F4xx convention and why it exists, that freq is an interval and the budget has 0.01 req/s of slack, runnable validation, and five traps that all bit during this work. The load-bearing one is that a command's presence in the signalset does not mean it is being collected. TESTING.md tracks what can only be answered in the truck - eight open tasks, and a per-DID table of what each debug param is believed to be and what would count as a result. Deciding a DID is dead requires a drive with a ride-height change and a terrain-mode switch, because everything in the 600s tier was classified from a parked vehicle. --- CLAUDE.md | 150 +++++++++++++++++++++++++++++++++++++++++++++++++++++ TESTING.md | 120 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 270 insertions(+) create mode 100644 CLAUDE.md create mode 100644 TESTING.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..e033e39 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,150 @@ +# Land Rover LR4 (L319) OBDb Signalset + +This repo defines the OBD-II/UDS signalset for a 2016 Land Rover LR4 / +Discovery 4 (L319) — 3.0L supercharged V6 (AJ126), ZF 8HP70, full-time 4WD, +electronic air suspension. It follows the [OBDb](https://github.com/OBDb) +v3 signalset format and is consumed by the Sidecar/Pelican OBD-II app. + +For signal-level detail (what each DID means, how to read boost, altitude +behavior, off-road usage, module identification) and the ongoing findings +log, read `README.md` — it is the primary reference and this file does not +repeat it. + +## Layout + +- `signalsets/v3/default.json` — the signalset itself, 109 commands. The + only file the app actually consumes. +- `tests/test_cases/2016/command_support.yaml` — manifest of which commands + each ECU supports, used by the test suite. +- `README.md` — signal reference, polling budget, and the findings log. + +## Architecture facts + +- The vehicle is **11-bit CAN** throughout. Every module answers on a + `0x7xx` request header with its response at `request + 8` (e.g. `7E0` → + `7E8`). No 29-bit/extended addressing anywhere on this truck. +- **The `F4xx` convention.** `22 F4` returns standard OBD-II PID `01` + with standard scaling, as a UDS request instead of a mode-01 request. This + exists because Pelican consumes standard mode-01 PIDs internally and they + never surface as recordable signals in the app, whereas the same data + requested via the `F4xx` alias arrives as a custom signal and does show + up. Most of the signalset uses this trick rather than requesting the + standard PID directly. +- **Per-ECU DID offsets.** The engine's proprietary DIDs sit `+0x300` from + their base (e.g. `00F2` → `03F2`). The transmission and rear differential + sit `+0x1000` (e.g. `0E69` → `1E69`). A DID that comes back "out of range" + is often just addressed at the wrong offset for that module. +- **`freq` is an interval in seconds, not a rate.** A lower number polls + harder. Total demand is `sum(1/freq)` across all commands and must stay + under roughly 11 req/s, which is what the adapter actually delivers. + Current demand is 10.99 — there is almost no headroom. Adding a command + means trading it against a deletion or giving it a slow cadence (120s or + 600s). + +## Validation + +CI (`.github/workflows/presubmits.yml`) validates `signalsets/v3/` against +the schema in the separate `OBDb/.schemas` repo, which is not checked into +this repo. To validate locally: + +``` +curl -sfL https://raw.githubusercontent.com/OBDb/.schemas/main/signals.json -o /tmp/signals.schema.json +python3 -c " +import json, jsonschema +schema=json.load(open('/tmp/signals.schema.json')) +inst=json.load(open('signalsets/v3/default.json')) +errs=list(jsonschema.Draft7Validator(schema).iter_errors(inst)) +print('errors:', len(errs)) +for e in errs[:5]: print(list(e.path), e.message[:200]) +" +``` + +`path` is constrained by the schema to a fixed enum (`Engine`, `Fuel`, +`Drivetrain`, `Suspension`, `Transmission`, `Trips`, `ECU`, `Electrical`, +`Tires`, `Battery`, `Climate`, `Movement`, and a few others) — `Diagnostics` +is not a valid value; use `ECU` for undecoded/diagnostic raw signals. + +Print total polling demand: + +``` +python3 -c " +import json +d=json.load(open('signalsets/v3/default.json')) +print(sum(1/c['freq'] for c in d['commands'])) +" +``` + +Check that the test manifest YAML parses and that no entry silently became +a float or other non-string type (see trap 1 below): + +``` +python3 -c " +import yaml +d=yaml.safe_load(open('tests/test_cases/2016/command_support.yaml')) +for ecu, entries in d['supported_commands_by_ecu'].items(): + for e in entries: + if not isinstance(e, str): + print('NON-STRING ENTRY:', ecu, repr(e)) +print('ok') +" +``` + +The pytest workflow (`.github/workflows/response_tests.yml`) runs inside the +`ghcr.io/obdb/devcontainer` image, and the test sources it runs live inside +that image, not in this checkout. Running `pytest tests/` locally will +report "no tests ran" — that is expected, not a failure. There is no way to +run the actual response tests outside CI. + +## Traps + +These have all actually bitten: + +1. **YAML float trap.** In `command_support.yaml`, a plain-scalar entry made + up only of digits and dots (e.g. `726.220202`) parses as a YAML float, + not a string, unless it's quoted. Any entry with no hex letter A–F + anywhere in it must be double-quoted. After editing this file, verify no + entry parsed as a non-string (see the validation command above). +2. **Deleting a command can orphan a synthetic.** The top-level `synthetics` + block in `default.json` references signal ids by name (e.g. + `LR4_BOOST_RATIO` reads `LR4_MAP` and `LR4_BARO`). Removing the command + that defines one of those signal ids leaves a dangling reference that is + still valid JSON but semantically broken — the synthetic will never + compute. Grep `synthetics` for a signal id before deleting the command + that defines it. +3. **Entry shape differs per ECU in `command_support.yaml`.** Most ECUs use + `.22` (e.g. `795.221E89`). `7E1` in the `supported_commands_by_ecu` + section uses `..22` (e.g. `7E1.7E9.221E69`). There is no + reason for the difference — `7E1`'s `rax` is `7E9`, exactly `hdr+8`, the + same as everywhere else. It is just how that block was written. Match + whatever shape the surrounding block already uses; don't normalize + across ECUs. +4. **Agent worktrees branch from `main`, not from the current branch.** Work + that depends on unmerged commits on the current branch must be done in + the main checkout, or the agent must be told explicitly to check out that + branch — otherwise it silently operates on stale files and produces + confident, wrong results. +5. **Eight commands have not been polled since 2026-08-30** — `F40C`, + `F411`, `F40E`, `F443`, `F449`, `F44A`, `F407`, `033E` — despite being + present in the signalset with sane `freq` values and the request budget + having headroom at the time. Engine speed has therefore never actually + been recorded as a signal, even though the command is in the file and + the underlying standard PID is being polled constantly. Cause unknown; + see the "Eight commands stopped being polled" section in `README.md`. + **A command's presence in this file does not mean it is actually being + collected** — check the scan logs before relying on one. + +## Where the data comes from + +On macOS, the Sidecar/Pelican app writes zipped SQLite backups to +`~/Library/Mobile Documents/iCloud~com~featherless~apps~electricsidecar/DataBackups/`, +in four folders: + +- `scanSessions` — every raw request/response pair (large, on the order of + a gigabyte or more). This is the ground truth for whether a command + answers and what it actually returns. +- `signals` — decoded signal values. +- `tripLogger` — trip-level data. +- `records` — other recorded data. + +The backups lag live data by up to a day, so a command that looks dead in +the backups may have started responding again since the last sync. diff --git a/TESTING.md b/TESTING.md new file mode 100644 index 0000000..13c063a --- /dev/null +++ b/TESTING.md @@ -0,0 +1,120 @@ +# Testing + +The README records what's known about this signalset. This file records what +isn't — the open questions that can only be answered in the truck, and the +pass/fail criteria for the 51 debug parameters added on 2026-09-20. Work +through it as drives happen; check items off with evidence, not on suspicion. + +--- + +## Open in-vehicle tasks + +- [ ] **Re-run `22F187` against module `726`.** Every other module rejected it with NRC 31, but `726` returned a malformed reply carrying VIN bytes instead. Terminal sequence: `ATSH 726`, `ATCRA 72E`, `22F187`. +- [ ] **Confirm which signalset version the Pelican app is actually holding.** Eight commands stopped being polled on 2026-08-30 and engine speed has never been recorded; the app may be running a cached schedule. Force a signalset refresh, then check whether `F40C` starts appearing. +- [ ] **A drive with a ride-height change.** `3B00`, `3B01`, `3B08` and `2B12` have only ever been sampled at one height, so their "static" classification is meaningless. Raise and lower the suspension during a logged drive. +- [ ] **A drive with a terrain-mode change.** `3B4D`, labelled Drive Mode, has returned `0` on all 171 samples ever taken. Cycle through terrain response settings to find out whether the label or the byte offset is wrong. +- [ ] **A rear-differential lock cycle.** `1E88` and `1E89` on module `795` have never moved. +- [ ] **A cold start.** Needed for the warm-up curves on `113F` and `2104`, and to catch the crank dip on `1153`/`1154`. +- [ ] **Identify module `792`.** Its whole `2A3x` block is static and nothing is known about it. Try `22F18C` and `22F191` against it the way the other six unmined modules were probed on 2026-09-19. +- [ ] **Mine the four still-unidentified modules** — `716`, `726`, `737`, `797`. Each returned a distinct ECU serial via `22F18C` but rejected `22F191`, so they are real and separate but their function is unknown. + +--- + +## Debug parameter criteria + +A DID that moves on a real drive earns a proper decode and a real name. One +that stays flat through a full drive cycle — including a ride-height change +and a terrain-mode switch — can be deleted with evidence rather than on +suspicion. The `freq` 600 tier is the least trustworthy classification in the +table below: every sample behind it came from a parked truck, so "never +moved" so far only means "never moved while parked." + +| Module | DID | `freq` | What we think it is | What would count as a result | +|---|---|---|---|---| +| `726` | `0202` | 60 | Only DID found on module 726 | Whether it ever leaves 00 | +| `761` | `197C` | 60 | Unknown, 9 distinct values in 14 samples | Most variable unmined DID; any correlation with a cabin or body state | +| `761` | `D11C` | 60 | Unknown, 3A-41 (58-65) | Plausible temperature; compare against F446 ambient | +| `792` | `2A32` | 600 | Undecoded, constant 00062CF0 in 16 samples (all parked) | Drop if still flat after a full drive cycle | +| `792` | `2A33` | 600 | Undecoded, constant 00033E0A in 15 samples (all parked) | Drop if still flat after a full drive cycle | +| `792` | `2A34` | 600 | Undecoded, constant 000008C0 in 15 samples (all parked) | Drop if still flat after a full drive cycle | +| `792` | `2A35` | 600 | Undecoded, constant 00051E28 in 11 samples (all parked) | Drop if still flat after a full drive cycle | +| `792` | `2A37` | 600 | Undecoded, constant 000069 in 12 samples (all parked) | Drop if still flat after a full drive cycle | +| `792` | `2A38` | 600 | Undecoded, constant 00001A in 12 samples (all parked) | Drop if still flat after a full drive cycle | +| `792` | `2A39` | 600 | Undecoded, constant 000002 in 12 samples (all parked) | Drop if still flat after a full drive cycle | +| `792` | `2A3A` | 600 | Undecoded, constant 00001F in 14 samples (all parked) | Drop if still flat after a full drive cycle | +| `792` | `2A3B` | 600 | Undecoded, constant 00000000 in 7 samples (all parked) | Drop if still flat after a full drive cycle | +| `792` | `2A3C` | 600 | Undecoded, constant 000000 in 7 samples (all parked) | Drop if still flat after a full drive cycle | +| `795` | `1E88` | 600 | Rear diff, always 0000 | Any movement under lock engagement | +| `795` | `1E89` | 600 | Rear diff, always 09C4 (2500) | Looks like a constant or a limit; drop if flat after a lock cycle | +| `7D3` | `3B00` | 600 | Suspension, static at one ride height | Must be sampled across a ride-height change to mean anything | +| `7D3` | `3B01` | 600 | Suspension, static at one ride height | Must be sampled across a ride-height change to mean anything | +| `7D3` | `3B08` | 600 | Suspension, static at one ride height | Must be sampled across a ride-height change to mean anything | +| `7E0` | `1044` | 600 | Undecoded, constant 00 in 2 samples (all parked) | Drop if still flat after a full drive cycle | +| `7E0` | `10E0` | 600 | Undecoded, constant 00 in 14 samples (all parked) | Drop if still flat after a full drive cycle | +| `7E0` | `112C` | 60 | Unknown, 570-1341, one FFFF | Any correlation with rpm, load or MAF over a drive | +| `7E0` | `1139` | 60 | Unknown 32-bit, 1142-2784 | Does not track rpm at idle; look for correlation with injector or air mass | +| `7E0` | `113F` | 30 | Temperature, 77-80 observed | Should follow a warm-up curve; compare against F405 coolant and 03F3 oil | +| `7E0` | `1151` | 120 | Undecoded, two values seen: 0000, 0001 | Whether a third value appears on a drive | +| `7E0` | `1152` | 600 | Undecoded, constant 00 in 12 samples (all parked) | Drop if still flat after a full drive cycle | +| `7E0` | `1153` | 5 | Charging voltage, 1/256 V | Tracks alternator output; must dip on crank and NOT mirror F442 | +| `7E0` | `1154` | 5 | Charging voltage setpoint, 1/256 V | Should sit pinned at 0E00 (14.00 V) and step only under load shedding | +| `7E0` | `1155` | 600 | Undecoded, constant 00 in 12 samples (all parked) | Drop if still flat after a full drive cycle | +| `7E0` | `1156` | 120 | Undecoded, two values seen: 05, 52 | Whether a third value appears on a drive | +| `7E0` | `1158` | 600 | Undecoded, constant 05 in 12 samples (all parked) | Drop if still flat after a full drive cycle | +| `7E0` | `1159` | 120 | Undecoded, two values seen: 04, 07 | Whether a third value appears on a drive | +| `7E0` | `115B` | 120 | Undecoded, two values seen: 04, 05 | Whether a third value appears on a drive | +| `7E0` | `1160` | 600 | Undecoded, constant 00D9 in 13 samples (all parked) | Drop if still flat after a full drive cycle | +| `7E0` | `1164` | 120 | Undecoded, two values seen: AB, AF | Whether a third value appears on a drive | +| `7E0` | `1187` | 600 | Undecoded, constant 88 in 5 samples (all parked) | Drop if still flat after a full drive cycle | +| `7E0` | `11BA` | 600 | Undecoded, constant 012A in 14 samples (all parked) | Drop if still flat after a full drive cycle | +| `7E0` | `11BB` | 600 | Undecoded, constant 0000 in 9 samples (all parked) | Drop if still flat after a full drive cycle | +| `7E0` | `11BD` | 600 | Undecoded, constant 00EB in 17 samples (all parked) | Drop if still flat after a full drive cycle | +| `7E0` | `11BE` | 600 | Undecoded, constant 0000 in 17 samples (all parked) | Drop if still flat after a full drive cycle | +| `7E0` | `11C4` | 60 | Unknown enum, seen 00/01/03 | Which driving states produce 03 | +| `7E0` | `11C5` | 120 | Undecoded, two values seen: 04, 14 | Whether a third value appears on a drive | +| `7E0` | `11CC` | 600 | Undecoded, constant 00 in 5 samples (all parked) | Drop if still flat after a full drive cycle | +| `7E0` | `F408` | 30 | Short term fuel trim bank 2 (PID 08) | Answers at all; then compare against F406 for the bank asymmetry | +| `7E0` | `F409` | 30 | Long term fuel trim bank 2 (PID 09) | Answers at all; pairs with F407 to measure asymmetry directly | +| `7E0` | `F41F` | 30 | Run time since start (PID 1F) | Records as a signal - this is the alias-mechanism test against standard 011F | +| `7E1` | `0302` | 120 | Counter, +145 over six months | Monotonic across drives - candidate operating hours | +| `7E1` | `0303` | 600 | Undecoded, constant F8 in 6 samples (all parked) | Drop if still flat after a full drive cycle | +| `7E1` | `0304` | 600 | Undecoded, constant 02 in 6 samples (all parked) | Drop if still flat after a full drive cycle | +| `7E1` | `0305` | 600 | Undecoded, constant 00 in 6 samples (all parked) | Drop if still flat after a full drive cycle | +| `7E1` | `0805` | 120 | Undecoded, two values seen: 0A, 0B | Whether a third value appears on a drive | +| `7E1` | `101A` | 60 | Signed value, -14 to +35 | Sign flips with drive/overrun; candidate torque or slip | +| `7E1` | `1E6A` | 600 | Undecoded, constant 00 in 27 samples (all parked) | Drop if still flat after a full drive cycle | +| `7E1` | `2104` | 30 | Temperature, 56-64 observed | Should track 1E69 gearbox temp with an offset, or diverge as a second sensor | +| `7E1` | `210F` | 120 | Enum, 01/02 | Changes with gear range or drive mode | +| `7E1` | `2B1B` | 600 | Undecoded, constant 0000 in 13 samples (all parked) | Drop if still flat after a full drive cycle | +| `7E1` | `2B1C` | 600 | Undecoded, constant 0000 in 13 samples (all parked) | Drop if still flat after a full drive cycle | +| `7E1` | `2B1D` | 600 | Undecoded, constant 0000 in 13 samples (all parked) | Drop if still flat after a full drive cycle | +| `7E1` | `2B1E` | 600 | Undecoded, constant 0000 in 13 samples (all parked) | Drop if still flat after a full drive cycle | +| `7E1` | `DD01` | 600 | Undecoded, constant 025166 in 1 samples (all parked) | Drop if still flat after a full drive cycle | + +--- + +## How to check results + +Sidecar writes zipped SQLite backups to +`~/Library/Mobile Documents/iCloud~com~featherless~apps~electricsidecar/DataBackups/` +on macOS. `scanSessions` holds every raw request and response; `signals` holds +decoded values. Backups lag live data by up to a day, so check the day after a +drive, not immediately after. + +The useful check after a drive, per DID: how many distinct payloads came back, +and over what range. A DID that returned the same byte string every time is +still flat. A DID that returned two or three distinct values is worth a second +drive before deciding anything. A DID that swept a range correlated with +something else on the bus (RPM, load, ride height, gear) is ready for a real +decode. + +--- + +## Known-unresolved + +Open questions that aren't in-vehicle tasks — they need log analysis or a +decision, not a drive: + +- Why eight commands stopped being polled on 2026-08-30, and whether it's tied to the `freq` re-tiering in `f782e4d`/`527a47f`. +- Whether `F408`/`F409` (bank-2 fuel trims) exist on this engine at all — they have never been requested. +- What `761/197C` and `761/D11C` measure — the most variable unmined DIDs found so far. From ba06626af3437da76440e9237b19997d9a7cf44b Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 20 Sep 2026 09:19:35 -0600 Subject: [PATCH 69/84] explain the terminal, not just the commands to run The ATSH/ATCRA pair is the part that is not obvious: one sets who you are addressing, the other filters what comes back, and the block repeats because each pair retargets the same three questions at the next module. ATAR at the end matters more than it looks - leave a filter set and the next healthy request reads as dead. Worked examples are real frames from this truck's logs rather than invented ones, so they can be checked: 7E80462F40582 decodes to 90 C coolant, and 726's multi-frame F18C reply spells serial 5224293808. Command meanings are taken from the Elm Electronics AT command list. --- TESTING.md | 118 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) diff --git a/TESTING.md b/TESTING.md index 13c063a..6b1a38d 100644 --- a/TESTING.md +++ b/TESTING.md @@ -20,6 +20,124 @@ through it as drives happen; check items off with evidence, not on suspicion. --- +## Terminal cheat sheet + +The adapter terminal puts you on the CAN bus as a diagnostic tester. Everything +you type is either **a setting that decides who you are talking to and who you +are listening to**, or **a question you ask**. AT commands are settings, handled +by the adapter itself and never sent to the car. Anything else is a question, +put on the bus verbatim. + +### The pattern you keep repeating + +``` +ATSH 726 set header - address requests to this module +ATCRA 72E receive filter - show only this module's replies +22F187 question +22F18C question +22F191 question +``` + +`ATSH hhh` is "Set Header": the 11-bit CAN ID your requests go out with, which +is the module's request address. `ATCRA hhh` is "set CAN Receive Address" — a +filter on what comes back. On this truck every reply address is the request +address plus 8, so `726` is answered by `72E`, `7E0` by `7E8`, `7D3` by `7DB`. + +You need both because they do different jobs. Without `ATCRA` you see every +module that felt like answering, and the adapter sits waiting for more replies +before it gives you the prompt back — slow and noisy. With it, the adapter +returns the moment your module answers. + +The block repeats because **each pair retargets the conversation**. Ask the same +three questions of `726`, then re-point at `716` and ask again, and so on. The +questions stay the same; only the two settings change. + +### The command at the end + +`ATAR` is "Automatic Receive" — it undoes `ATCRA` and lets the adapter choose +the receive address again. **Always finish with it.** Leave a filter set and the +next thing you try is still listening to the last module you probed, so a +perfectly healthy request looks dead. `ATCRA` with no argument resets the +filters the same way. + +### Asking a question + +| You type | Meaning | +|---|---| +| `22 xxxx` | UDS ReadDataByIdentifier — service `22`, then a four-digit DID. This is the one to hunt with. It is read-only. | +| `01 xx` | Legacy OBD-II mode 1 PID. Mostly useless here — the app consumes these internally and they never become recorded signals. | +| `09 02` | VIN. | +| `22F18C` / `22F191` / `22F187` | ECU serial / part number / spare part number. Ask these first of any new module: cheap, and often enough to identify what it is. | + +Stay on service `22`. Services like `10 03` (extended session), `2F` (I/O +control) and `31` (routine control) change ECU state rather than read it. + +### Reading the reply + +A positive answer. This is a real frame from the logs, the reply to `22F405`, +which arrives as `7E80462F40582` with spaces suppressed: + +| Part | Meaning | +|---|---| +| `7E8` | who answered | +| `04` | how many bytes follow | +| `62` | `0x22 + 0x40` — "yes, ReadDataByIdentifier" | +| `F405` | echo of the DID you asked for | +| `82` | the payload, `0x82` = 130, so 130 − 40 = 90 °C coolant | + +A rejection — `7E8 03 7F 22 31`: `7F` means refused, `22` is the service you +asked for, `31` is the reason — request out of range, i.e. this module has no +such DID. **This is the normal answer when hunting** and not a problem. + +`NO DATA` means nothing replied before the timeout: either the module is not +there or the header is wrong. + +Long answers arrive split. Module `726` answering `22F18C` gives +`72E101362F18C353232`, then `72E2134323933383038`, then `72E2200000000000000`. +After the address, `10` marks the first frame and `13` is the total byte count +(19); `21` and `22` are continuation frames counting up. Drop the leading byte +of each continuation and join the rest — here that spells the ECU serial +`5224293808`. + +### Watching instead of asking + +`ATMA` is "Monitor All" — it sends nothing and dumps every frame on the bus. +Good for finding data that modules broadcast without being asked. Reset the +filter with `ATCRA` first or you will only see one ID. Any key stops it. + +### The setup line the app sends + +You do not normally type these, but they explain the noise at the top of a log. + +| Command | Meaning | +|---|---| +| `ATWS` | warm start — reset the adapter without unplugging it | +| `ATE0` | echo off | +| `ATH1` | headers on — **essential**, without it you cannot tell which module replied | +| `ATS0` | drop spaces from the output | +| `ATSP6` | protocol 6: ISO 15765-4 CAN, 11-bit, 500 kbaud | +| `ATAT1` | adaptive timing | +| `ATM0` | memory off | +| `ATFCSM0` | flow control fully automatic | +| `ATDPN` | which protocol is in use — answers `6` here | +| `ATRV` | battery voltage at the socket | + +### Hunting recipe + +1. Point at the module: `ATSH `, `ATCRA `. +2. Ask `22F18C`, `22F191`, `22F187` first. A serial proves the module exists; a + part number often names it. +3. Sweep DIDs. Remember the per-ECU offsets — engine proprietary DIDs sit + +0x300 from base, transmission and rear differential +0x1000 — so an "out of + range" is often the right DID at the wrong offset. +4. Note the payload width of anything that answers `62`. +5. `ATAR` when you move on. +6. Ask the same DID again under different conditions. A value that never moves + tells you nothing, and most of this signalset's unknowns are unknown + precisely because they were only ever read from a parked truck. + +--- + ## Debug parameter criteria A DID that moves on a real drive earns a proper decode and a real name. One From a9d5cc21c8dc819f931ce8952596329440f0ba75 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 20 Sep 2026 10:52:02 -0600 Subject: [PATCH 70/84] the first drive on the debug batch, and the stale signalset explained All 109 commands were polled. F40C answered 172 of 172 and engine speed reached the signal database for the first time in fourteen months, with nothing in this file having changed to cause it - the app had been holding an older copy. The budget and freq theories were both wrong, and they were worth ruling out only because doing so left no other explanation. Thirty-six debug params came straight back out. The 7E0 11xx family and the 7E1 03xx/101A/21xx/2B1x block answer only inside an extended diagnostic session; they answered in December 2025 because that session sent 10 03 first, and nobody had noticed. They are not dead probes, they are unreachable by polling, and they now live in TESTING.md with the 10 03 recipe and its warning. F408 and F409 answered, so there is bank-2 data at last, and it says the banks agree: long term +9.31 and +7.32 percent. Both lean together, which is a shared cause rather than the asymmetry we thought we had. The ride-height change moved 3B01, 3B3C, both height sensors, all four corner pressures and the compressor. Access height did register, in the pressures rather than the state fields, which were sampled too slowly to catch it - 3B01 goes to freq 10. 3B4D read zero throughout and is no longer called Drive Mode. 73 commands at 10.55 req/s. --- README.md | 273 ++++++++++++--------- TESTING.md | 124 ++++++---- signalsets/v3/default.json | 156 +----------- tests/test_cases/2016/command_support.yaml | 37 --- 4 files changed, 231 insertions(+), 359 deletions(-) diff --git a/README.md b/README.md index 74369b3..6037460 100644 --- a/README.md +++ b/README.md @@ -128,6 +128,8 @@ fuel cut — injectors fully off while coasting, sensor reading pure air. | Fuel Rail Pressure (SAE) | `7E0` `22F423` | Standard PID, same rail | | Short Term Fuel Trim B1 | `7E0` `22F406` | Immediate correction, swings constantly | | Long Term Fuel Trim B1 | `7E0` `22F407` | Learned correction, drifts slowly | +| Short Term Fuel Trim B2 | `7E0` `22F408` | First recorded 2026-09-20 | +| Long Term Fuel Trim B2 | `7E0` `22F409` | First recorded 2026-09-20 | --- @@ -151,7 +153,7 @@ All four corners report gauge pressure in the air spring. | Pressure Rear Left / Right | `7D3` `223B06` / `223B05` | | Height Offset | `7D3` `222B12` | Signed, millimetres from nominal | | Compressor Activity | `7D3` `223B07` | ~110 at rest, over 1,300 while the truck raises | -| Ride Height Mode | `7D3` `223B3C` | 1 normal, 2 raised — both confirmed | +| Ride Height Mode | `7D3` `223B3C` | 1 normal, 2 raised — both confirmed. Two more values, `0D` and `04`, turned up during a ride-height change on 2026-09-20 and aren't explained yet | | Height Sensor Front / Rear | `7D3` `223B71` / `223B72` | **Inverted** — falls as the truck rises | | Module Voltage | `7D3` `22D11A` | Should mirror battery voltage | @@ -411,11 +413,14 @@ you've either shifted your load or picked up a slow leak. | Suspension Balance | Articulation and weight transfer, live | | Gear Selector | Confirms what the transmission thinks it's in | -Ride Height, Ride Height Front/Rear and Drive Mode are in the signalset as -untested probes — the addresses come from a Jaguar EAS that shares this -module's pressure DIDs, so they have a good chance of working. If Drive Mode -returns a value, note what it reads in each Terrain Response setting and the -numbers can be mapped to names. +A drive on 2026-09-20 that changed ride height confirmed Ride Height, Ride +Height Front/Rear and the corner pressures all move together and in the +directions their labels predict — see "Air suspension notes" below. `3B4D`, +once labelled Drive Mode, is not: it read `0` on all 48 samples that drive, +straight through every height change. Terrain Response mode itself is still +untested, since the drive changed height rather than terrain setting — if a +future drive cycles through Terrain Response settings, watch `3B4D` and note +what it reads in each one. ### Before you go @@ -435,7 +440,7 @@ formulas eventually get worked out. | Address | Signals | |---|---| | `792` / `79A` | `2A32`–`2A3A` — eight live values, none resembling tire pressures | -| `795` / `79D` | `1E89` | +| `795` / `79D` | `1E88`, `1E89` | | `7E1` / `7E9` | `1E68`, `1E6A` — neighbours of the gearbox temp | | `761` / `769` | `197C`, `D11C` | | `726` / `72E` | `0202` — returns `00` | @@ -448,9 +453,12 @@ found there. **The suspension decodes check out.** Replaying every logged sample through the formats in this file gives corner pressures of 34-50 psi, a ride height offset correctly signed at -91 to +50 mm, and module voltage of 9.12-14.56 V, -all physically sensible. The exception is `3B4D`, labelled Drive Mode, which -has returned `0` on all 171 samples ever recorded — either the label or the -byte offset is wrong. +all physically sensible. The exception is `3B4D`: it was labelled Drive Mode, +but it returned `0` on all 171 samples recorded before 2026-09-20 and on all +48 samples taken on a 2026-09-20 drive that changed ride height twice — flat +straight through the one state change it was tested against. The signal has +been renamed `LR4_3B4D_RAW`. A terrain-mode change hasn't been tested yet, so +the field is unidentified rather than proven useless. What the audit could not do is say anything about suspension health. Across fourteen months only 36 minutes have all four corner pressures captured @@ -469,14 +477,39 @@ them finds the module. ### Air suspension notes +A 33-minute drive on 2026-09-20 that changed ride height twice gave the first +real test of these fields, and most of them passed it. + `3B71` and `3B72` track the height sensors, and they read **inverted** — the number falls as the truck rises. Observed: 115/115 at normal height, 93/101 -raised. Treat a falling value as the truck going up. +raised; on the 2026-09-20 drive `3B71` fell from `6A` to `56` on the raise, +then rose to `85` by the end. Treat a falling value as the truck going up. + +The four corner pressures (`3B03`-`3B06`) tracked the same drive unambiguously: +around `00C5` cruising, down to about `00AC`, up to about `00FE` at 16:22:42 +UTC as the truck raised, then down to `0096`-`009F` at 16:23:49 as it lowered. +Compressor activity (`3B07`) jumped from around `00A0` to `05F0` and `0617` +during those changes. + +The driver believed the low "access" height didn't register. It did — the +corner pressures and height sensors both recorded a third, lower level at +16:23:49. The state fields did not obviously distinguish it: `3B3C` is the height mode and increments upward: mode 1 was normal and mode 2 -was raised, both confirmed. The map also labels 0 as Access and 3 as Extended on -the assumption the ordering continues — neither has been observed yet, so -correct them if they read wrong. +was raised, both confirmed before this drive. The map also labels 0 as Access +and 3 as Extended on the assumption the ordering continues. On the 2026-09-20 +drive it also returned `0D` and `04`, neither of which fits that scheme, and +none of the four values it returned cleanly picked out the access-height +moment. Correct the 0/3 labels if they read wrong. + +`3B01` returned three distinct values on the same drive — `00000400`, +`00000100`, `00000800` — each a single bit set, which looks like a ride-height +state word rather than an enum. It was at `freq` 600 and caught only 3 +samples that drive, so it's been raised to `freq` 10 for another look. + +Most likely, `3B01` and `3B3C` simply weren't sampled often enough (`freq` 600 +and 10) to catch the access-height moment, which is why the corner pressures +and height sensors saw it and the state fields didn't. The two balance ratios respond to cargo, not just faults. With the load area full, front balance read 0.99 and rear read 0.92 — the rear axle carrying more @@ -504,118 +537,122 @@ The budget in this file: |---|---|---| | 1s | 4 | Manifold pressure, barometric, engine speed, vehicle speed | | 3s | 8 | Throttle, pedals, timing, lambda, load | -| 5s | 12 | Temperatures, fuel trims, mass air flow | -| 10s | 16 | Air suspension | -| 30s | 8 | Fuel level, battery, catalyst temperatures | -| 120s | 14 | Undecoded probes | -| 600s | 3 | Odometer, oil level, oil volume | +| 5s | 10 | Temperatures, fuel trims bank 1, mass air flow, gearbox and diff temp, gear selector | +| 10s | 12 | Air suspension | +| 30s | 19 | Fuel trims bank 2, catalyst temperatures, battery, fuel level, and the undecoded probes shown to move | +| 60s | 1 | `726/0202` | +| 600s | 19 | Odometer, oil level, oil volume, and undecoded probes that have never moved | + +That totals 10.55 requests per second of demand against roughly 11 available +once protocol overhead is removed — 73 commands, down from 109 after the +extended-session-only block described below was removed. The four +one-second commands exist so the boost calculation stays responsive. + +### Eight commands went quiet for three weeks. The app had a stale signalset + +Between 2026-08-30 and 2026-09-19, eight commands in this file were never +requested on a drive: `F40C`, `F411`, `F40E`, `F443`, `F449`, `F44A`, `F407` +and `033E`. The cost was real — `engineSpeed` is wired to `F40C`, and no +engine speed value reached the signal database in fourteen months. Two +synthetics could not compute either, `LR4_THROTTLE_TRACKING` needing `F411` +and `LR4_PEDAL_AGREEMENT` needing `F449` and `F44A`. + +**Resolved on 2026-09-20.** Every command in the file was polled that drive. +`F40C` was requested 172 times and answered 172 times, and engine speed is +now recorded. Nothing in this file changed to cause that — the app had +simply been running an older copy of the signalset, and picked up the +current one. + +Getting there meant ruling out the two obvious causes, and both remain worth +knowing. It was not the request budget: demand was 10.21 req/s against the +11-13 the adapter delivers. It was not the `freq` values either, because the +dead commands shared tiers with live ones — `F40C` and `F40D` are both +`freq` 1 and only `F40D` ran; `F411`, `F443`, `F449` and `F44A` sat at +`freq` 3 alongside `F404`, `F434` and `F444`, which all ran. + +The lesson that outlives the incident: **a command's presence in this file +means nothing until the app has actually fetched the file.** Before +concluding that a command is unsupported, confirm the app is holding the +version you think it is. + +### The seven probes, and how they turned out + +Seven commands were added on 2026-09-20 to be watched rather than trusted. +The 2026-09-20 drive settled all of them. + +**`7E0/F408` and `7E0/F409` answered — the bank-2 fuel trims exist.** They +had never been requested on this vehicle before. They are now real signals +rather than probes, and what they show matters: see below. + +**`7E0/1153`, `7E0/1154`, `7E0/113F` and `7E1/2104` returned `7F 22 31`.** +They are session-gated, not dead — see the manual-probe list in +`TESTING.md`. The charging-voltage reading behind `1153`/`1154` still +stands (`1154` pinned at exactly `0E00`, 14.00 V, with both dipping to +5.7-10.1 V on crank, tracking nothing that `F442` does), but it can only be +read by hand in an extended diagnostic session, so those commands have been +removed from this file. + +**`726/0202` answered and stayed at `00`** across twelve samples. + +`F41F` also recorded, which was the incidental test of whether the `F4xx` +alias mechanism works at all against a standard PID the app already polls. +It does. + +### Both banks are running lean, and they agree with each other + +First bank-2 data from this truck, measured over the 2026-09-20 drive: + +| | Bank 1 | Bank 2 | +|---|---|---| +| Short term | -0.55% (n=305) | -5.36% (n=7) | +| Long term | **+9.31%** (n=13) | **+7.32%** (n=8) | -That totals about 11 requests per second of demand against roughly 11 available -once protocol overhead is removed. The four one-second commands exist so the -boost calculation stays responsive. +Two points apart on the long-term trims is not an asymmetry. Both banks are +correcting lean together by 7-9%, which points at something shared — fuel +delivery, MAF calibration, or unmetered air upstream of where the intake +splits — rather than a fault on one side. Any earlier reading of this as a +bank asymmetry came from having only bank 1 to look at. -### Eight commands stopped being polled on 2026-08-30 +Sample sizes are small: one drive, and single digits on three of the four +figures. Treat the direction as real and the magnitude as provisional. -A scan-log audit through 2026-09-19 found that eight commands in this file -are never requested on a drive, and have not been since 2026-08-30: +### The debug batch, and what the first drive did to it -| Command | Signal | Last normal day | -|---|---|---| -| `7E0/F40C` | Engine Speed | 2026-08-29, 1155 polls | -| `7E0/F411` | Throttle Position | 2026-09-04 | -| `7E0/F40E` | Timing Advance | 2026-08-30 | -| `7E0/F443` | Absolute Load | 2026-08-30 | -| `7E0/F449` | Accelerator Pedal D | 2026-08-30 | -| `7E0/F44A` | Accelerator Pedal E | 2026-08-30 | -| `7E0/F407` | Long Term Fuel Trim B1 | 2026-09-01 | -| `7E0/033E` | Fuel Rail Pressure | 2026-09-01 | - -**No engine speed value has ever reached the signal database**, across -fourteen months. The `engineSpeed` metric slot is wired to `F40C` and has -never been filled. The data is on the wire — the app polls standard PID -`010C` 2511 times in a 39-minute drive — but Pelican consumes standard PIDs -internally and they never surface as signals, which is the whole reason this -file uses `F4xx` aliases. The alias is the part that isn't running. - -Two synthetics consequently never compute: `LR4_THROTTLE_TRACKING` needs -`F411`, and `LR4_PEDAL_AGREEMENT` needs `F449` and `F44A`. - -Two candidate causes are ruled out. It is not the request budget: total -demand is 10.21 req/s against the 11-13 the adapter delivers. It is not the -`freq` values either, because dead commands share tiers with live ones — -`F40C` and `F40D` are both `freq` 1, and only `F40D` runs; `F411`, `F443`, -`F449` and `F44A` sit at `freq` 3 alongside `F404`, `F434` and `F444`, which -all run. - -What remains is the app's own scheduling, and the date points at this repo: -2026-08-30 is when `f782e4d` and `527a47f` re-tiered every `freq` in the -file, `f782e4d` briefly introducing fractional values such as `0.5` before -`527a47f` rounded them back to integers. Whether the app cached a schedule -built from that intermediate state is untested. Before changing anything -here, confirm which version of this signalset the app actually holds. - -### Probes added to test that conclusion - -Seven commands were added on 2026-09-20 specifically to be watched rather -than trusted. Total demand rises to 10.76 req/s, still inside the budget. - -`7E0/1153` and `7E0/1154` are a charging-voltage pair at 1/256 V. `1154` -rests at exactly `0E00`, 14.00 V, which reads as a regulator setpoint rather -than a measurement; `1153` floats 13.94-14.12 V around it and both drop to -5.7-10.1 V on crank. They do not track `F442`, which drifted 13.0-14.5 V -across the same session, so this is a different node and at better -resolution. Both were dropped as dead probes in `1cf20db`; the logs -contradict that, and every sample behind the original call was taken parked. - -`7E0/F408` and `7E0/F409` are the bank-2 fuel trims. They have never been -requested on this vehicle. If they answer, the bank asymmetry becomes -directly measurable instead of inferred, which matters more now that `F407` -has been silent since 2026-09-01. - -`7E0/113F` and `7E1/2104` are undecoded single bytes that move: `113F` drifts -77-80 and `2104` climbs 56-64 while parked and running. Both are recorded as -raw scalars because a plain degrees-Celsius reading and a reading with the -usual -40 offset are both physically plausible, and parked data cannot -separate them. - -`726/0202` is the one hit from the `0000`-`03FF` sweep of that module. - -These also double as a test of the scheduler: `F41F` duplicates standard PID -`011F`, which the app already polls 1560 times a drive. If `F41F` records and -`F40C` still does not, the alias mechanism works and something specific to -those eight commands does not. - -### The debug batch - -On 2026-09-20 a further 51 commands went in: one for every DID this truck has -ever answered that nothing here decodes. Each is a raw scalar at the byte -width the logs show it returning, named `LR4__RAW`. The batch costs -0.235 req/s and puts total demand at 10.99. - -Cadence follows what fourteen months of scan logs show each DID doing: - -| `freq` | Count | Behaviour in the logs | +On 2026-09-20, 51 commands went in — one for every DID this truck had ever +answered that nothing here decodes — each a raw scalar at its observed byte +width, named `LR4__RAW`. The first real drive cut that back hard. + +**Thirty-six of them are session-gated.** The whole `7E0` `10xx`/`11xx` +family and the `7E1` `0302`-`0305`, `0805`, `101A`, `2104`, `210F`, +`2B1B`-`2B1E` block returned `7F 22 31`. In fourteen months of logs they +have answered in exactly two sessions: one in December 2025 that sent +`10 03` to open an extended diagnostic session, and one in June 2025 doing +unusual protocol and flow-control setup. Every session since that did not +open an extended session has been rejected. + +The app polls in the default session, so it can never reach them. All 36 +are out of this file and listed in `TESTING.md` as manual-probe-only. This +also rewrites the history: `1cf20db` dropped many of them as "dead probes", +and they were never dead — they were session-gated, and nobody had noticed +the December session opened `10 03` first. + +What survived, and how it was re-tiered after the drive: + +| Command | Change | Why | |---|---|---| -| 60 | 6 | Genuinely vary — `761/197C`, `761/D11C`, `7E0/112C`, `7E0/1139`, `7E0/11C4`, `7E1/101A` | -| 120 | 9 | Flip between exactly two values | -| 600 | 36 | Never moved | - -**"Never moved" means never moved while parked.** Every sample behind that -bottom tier came from a stationary truck, and the three suspension entries -(`3B00`, `3B01`, `3B08`) were read at a single ride height, where they could -not have varied even if they encode something. That tier is the weakest -classification here, which is why it is slow rather than absent. - -`761/197C` and `761/D11C` were deleted earlier in this same branch as -undecoded raws taking zero polls. That was true and also misleading: the -audit then showed they are among the most variable DIDs on the truck — -`197C` returns 9 distinct values in 14 samples, `D11C` ranges `3A` to `41`, -which would be a plausible temperature. They were starved, not dead, and -they are back at `freq` 60. +| `7D3/3B01` | `freq` 600 → 10 | Returned three single-bit values; looks like the ride-height state word | +| `7D3/3B00`, `7D3/3B08` | `freq` 600 → 30 | Still flat through a real height change, but on 3 samples each — one more look before deletion | +| `761/197C`, `761/D11C` | `freq` 60 → 30 | Four distinct values in four samples each; the most active unmined DIDs on the truck | +| `792/2A32`, `792/2A37` | unchanged | Each ticked by a small amount, consistent with counters. The rest of the `2A3x` block stayed flat | +| `726/0202`, `795/1E88`, `795/1E89` | unchanged | Still flat; the diff-lock cycle is what will decide the `795` pair | + +The file is now 73 commands at 10.55 req/s. A DID that moves on a real drive earns a proper decode. One that stays flat through a full cycle — including a ride-height change and a terrain-mode -switch — can be deleted for good rather than on suspicion. +switch — can be deleted for good rather than on suspicion. Do not read a +`7F 22 31` as "unsupported" without checking whether an extended session +would have changed the answer. **Two known inefficiencies**, neither fixable from a signalset: diff --git a/TESTING.md b/TESTING.md index 6b1a38d..ccfc620 100644 --- a/TESTING.md +++ b/TESTING.md @@ -10,9 +10,9 @@ through it as drives happen; check items off with evidence, not on suspicion. ## Open in-vehicle tasks - [ ] **Re-run `22F187` against module `726`.** Every other module rejected it with NRC 31, but `726` returned a malformed reply carrying VIN bytes instead. Terminal sequence: `ATSH 726`, `ATCRA 72E`, `22F187`. -- [ ] **Confirm which signalset version the Pelican app is actually holding.** Eight commands stopped being polled on 2026-08-30 and engine speed has never been recorded; the app may be running a cached schedule. Force a signalset refresh, then check whether `F40C` starts appearing. -- [ ] **A drive with a ride-height change.** `3B00`, `3B01`, `3B08` and `2B12` have only ever been sampled at one height, so their "static" classification is meaningless. Raise and lower the suspension during a logged drive. -- [ ] **A drive with a terrain-mode change.** `3B4D`, labelled Drive Mode, has returned `0` on all 171 samples ever taken. Cycle through terrain response settings to find out whether the label or the byte offset is wrong. +- [x] **Confirm which signalset version the Pelican app is actually holding.** Done 2026-09-20: the app was holding a stale signalset. A forced refresh brought all 109 commands into the poll cycle — `F40C` answered 172 of 172 requests, and engine speed was recorded for the first time. +- [x] **A drive with a ride-height change.** Done 2026-09-20: `3B01`, `3B3C`, all four corner pressures, both height sensors and the compressor all moved. Access height did register — in the pressures and height sensors — contrary to what it looked like from the driver's seat. +- [ ] **A drive with a terrain-mode change.** `3B4D`, labelled Drive Mode, has returned `0` on all 171 samples ever taken. Cycle through terrain response settings to find out whether the label or the byte offset is wrong. Update 2026-09-20: also returned `0` on all 48 samples through every ride-height change on this drive, so it survived a real state change unmoved. Renamed `LR4_3B4D_RAW` — a terrain-response change is now the only thing left that can identify it. - [ ] **A rear-differential lock cycle.** `1E88` and `1E89` on module `795` have never moved. - [ ] **A cold start.** Needed for the warm-up curves on `113F` and `2104`, and to catch the crank dip on `1153`/`1154`. - [ ] **Identify module `792`.** Its whole `2A3x` block is static and nothing is known about it. Try `22F18C` and `22F191` against it the way the other six unmined modules were probed on 2026-09-19. @@ -149,68 +149,84 @@ moved" so far only means "never moved while parked." | Module | DID | `freq` | What we think it is | What would count as a result | |---|---|---|---|---| -| `726` | `0202` | 60 | Only DID found on module 726 | Whether it ever leaves 00 | -| `761` | `197C` | 60 | Unknown, 9 distinct values in 14 samples | Most variable unmined DID; any correlation with a cabin or body state | -| `761` | `D11C` | 60 | Unknown, 3A-41 (58-65) | Plausible temperature; compare against F446 ambient | -| `792` | `2A32` | 600 | Undecoded, constant 00062CF0 in 16 samples (all parked) | Drop if still flat after a full drive cycle | +| `726` | `0202` | 60 | Only DID found on module 726 — still 00 after 12 samples | Whether it ever leaves 00 | +| `761` | `197C` | 30 | Unknown, 4 distinct values in 4 samples on the 2026-09-20 drive — with `D11C`, the most active unmined DIDs on the truck | Any correlation with a cabin or body state | +| `761` | `D11C` | 30 | Unknown, 3A-41 (58-65); 4 distinct values in 4 samples on the 2026-09-20 drive — with `197C`, the most active unmined DIDs on the truck | Plausible temperature; compare against F446 ambient | +| `792` | `2A32` | 600 | Undecoded, ticked by a small amount on the 2026-09-20 drive — consistent with a counter | Confirm counter behavior over a longer drive; rest of the `2A3x` block stayed flat | | `792` | `2A33` | 600 | Undecoded, constant 00033E0A in 15 samples (all parked) | Drop if still flat after a full drive cycle | | `792` | `2A34` | 600 | Undecoded, constant 000008C0 in 15 samples (all parked) | Drop if still flat after a full drive cycle | | `792` | `2A35` | 600 | Undecoded, constant 00051E28 in 11 samples (all parked) | Drop if still flat after a full drive cycle | -| `792` | `2A37` | 600 | Undecoded, constant 000069 in 12 samples (all parked) | Drop if still flat after a full drive cycle | +| `792` | `2A37` | 600 | Undecoded, ticked by a small amount on the 2026-09-20 drive — consistent with a counter | Confirm counter behavior over a longer drive; rest of the `2A3x` block stayed flat | | `792` | `2A38` | 600 | Undecoded, constant 00001A in 12 samples (all parked) | Drop if still flat after a full drive cycle | | `792` | `2A39` | 600 | Undecoded, constant 000002 in 12 samples (all parked) | Drop if still flat after a full drive cycle | | `792` | `2A3A` | 600 | Undecoded, constant 00001F in 14 samples (all parked) | Drop if still flat after a full drive cycle | | `792` | `2A3B` | 600 | Undecoded, constant 00000000 in 7 samples (all parked) | Drop if still flat after a full drive cycle | | `792` | `2A3C` | 600 | Undecoded, constant 000000 in 7 samples (all parked) | Drop if still flat after a full drive cycle | -| `795` | `1E88` | 600 | Rear diff, always 0000 | Any movement under lock engagement | -| `795` | `1E89` | 600 | Rear diff, always 09C4 (2500) | Looks like a constant or a limit; drop if flat after a lock cycle | -| `7D3` | `3B00` | 600 | Suspension, static at one ride height | Must be sampled across a ride-height change to mean anything | -| `7D3` | `3B01` | 600 | Suspension, static at one ride height | Must be sampled across a ride-height change to mean anything | -| `7D3` | `3B08` | 600 | Suspension, static at one ride height | Must be sampled across a ride-height change to mean anything | -| `7E0` | `1044` | 600 | Undecoded, constant 00 in 2 samples (all parked) | Drop if still flat after a full drive cycle | -| `7E0` | `10E0` | 600 | Undecoded, constant 00 in 14 samples (all parked) | Drop if still flat after a full drive cycle | -| `7E0` | `112C` | 60 | Unknown, 570-1341, one FFFF | Any correlation with rpm, load or MAF over a drive | -| `7E0` | `1139` | 60 | Unknown 32-bit, 1142-2784 | Does not track rpm at idle; look for correlation with injector or air mass | -| `7E0` | `113F` | 30 | Temperature, 77-80 observed | Should follow a warm-up curve; compare against F405 coolant and 03F3 oil | -| `7E0` | `1151` | 120 | Undecoded, two values seen: 0000, 0001 | Whether a third value appears on a drive | -| `7E0` | `1152` | 600 | Undecoded, constant 00 in 12 samples (all parked) | Drop if still flat after a full drive cycle | -| `7E0` | `1153` | 5 | Charging voltage, 1/256 V | Tracks alternator output; must dip on crank and NOT mirror F442 | -| `7E0` | `1154` | 5 | Charging voltage setpoint, 1/256 V | Should sit pinned at 0E00 (14.00 V) and step only under load shedding | -| `7E0` | `1155` | 600 | Undecoded, constant 00 in 12 samples (all parked) | Drop if still flat after a full drive cycle | -| `7E0` | `1156` | 120 | Undecoded, two values seen: 05, 52 | Whether a third value appears on a drive | -| `7E0` | `1158` | 600 | Undecoded, constant 05 in 12 samples (all parked) | Drop if still flat after a full drive cycle | -| `7E0` | `1159` | 120 | Undecoded, two values seen: 04, 07 | Whether a third value appears on a drive | -| `7E0` | `115B` | 120 | Undecoded, two values seen: 04, 05 | Whether a third value appears on a drive | -| `7E0` | `1160` | 600 | Undecoded, constant 00D9 in 13 samples (all parked) | Drop if still flat after a full drive cycle | -| `7E0` | `1164` | 120 | Undecoded, two values seen: AB, AF | Whether a third value appears on a drive | -| `7E0` | `1187` | 600 | Undecoded, constant 88 in 5 samples (all parked) | Drop if still flat after a full drive cycle | -| `7E0` | `11BA` | 600 | Undecoded, constant 012A in 14 samples (all parked) | Drop if still flat after a full drive cycle | -| `7E0` | `11BB` | 600 | Undecoded, constant 0000 in 9 samples (all parked) | Drop if still flat after a full drive cycle | -| `7E0` | `11BD` | 600 | Undecoded, constant 00EB in 17 samples (all parked) | Drop if still flat after a full drive cycle | -| `7E0` | `11BE` | 600 | Undecoded, constant 0000 in 17 samples (all parked) | Drop if still flat after a full drive cycle | -| `7E0` | `11C4` | 60 | Unknown enum, seen 00/01/03 | Which driving states produce 03 | -| `7E0` | `11C5` | 120 | Undecoded, two values seen: 04, 14 | Whether a third value appears on a drive | -| `7E0` | `11CC` | 600 | Undecoded, constant 00 in 5 samples (all parked) | Drop if still flat after a full drive cycle | -| `7E0` | `F408` | 30 | Short term fuel trim bank 2 (PID 08) | Answers at all; then compare against F406 for the bank asymmetry | -| `7E0` | `F409` | 30 | Long term fuel trim bank 2 (PID 09) | Answers at all; pairs with F407 to measure asymmetry directly | +| `795` | `1E88` | 600 | Rear diff, always 0000 — still flat on the 2026-09-20 drive | Any movement under lock engagement | +| `795` | `1E89` | 600 | Rear diff, always 09C4 (2500) — still flat on the 2026-09-20 drive | Looks like a constant or a limit; drop if flat after a lock cycle | +| `7D3` | `3B00` | 30 | Suspension, still flat through the 2026-09-20 ride-height change (3 samples) | One more look at `freq` 30 before deletion | +| `7D3` | `3B01` | 10 | Suspension, three values seen on the 2026-09-20 ride-height change (`00000400`, `00000100`, `00000800`) — looks like a ride-height state word | Needs enough samples to map each value to a height | +| `7D3` | `3B08` | 30 | Suspension, still flat through the 2026-09-20 ride-height change (3 samples) | One more look at `freq` 30 before deletion | | `7E0` | `F41F` | 30 | Run time since start (PID 1F) | Records as a signal - this is the alias-mechanism test against standard 011F | -| `7E1` | `0302` | 120 | Counter, +145 over six months | Monotonic across drives - candidate operating hours | -| `7E1` | `0303` | 600 | Undecoded, constant F8 in 6 samples (all parked) | Drop if still flat after a full drive cycle | -| `7E1` | `0304` | 600 | Undecoded, constant 02 in 6 samples (all parked) | Drop if still flat after a full drive cycle | -| `7E1` | `0305` | 600 | Undecoded, constant 00 in 6 samples (all parked) | Drop if still flat after a full drive cycle | -| `7E1` | `0805` | 120 | Undecoded, two values seen: 0A, 0B | Whether a third value appears on a drive | -| `7E1` | `101A` | 60 | Signed value, -14 to +35 | Sign flips with drive/overrun; candidate torque or slip | | `7E1` | `1E6A` | 600 | Undecoded, constant 00 in 27 samples (all parked) | Drop if still flat after a full drive cycle | -| `7E1` | `2104` | 30 | Temperature, 56-64 observed | Should track 1E69 gearbox temp with an offset, or diverge as a second sensor | -| `7E1` | `210F` | 120 | Enum, 01/02 | Changes with gear range or drive mode | -| `7E1` | `2B1B` | 600 | Undecoded, constant 0000 in 13 samples (all parked) | Drop if still flat after a full drive cycle | -| `7E1` | `2B1C` | 600 | Undecoded, constant 0000 in 13 samples (all parked) | Drop if still flat after a full drive cycle | -| `7E1` | `2B1D` | 600 | Undecoded, constant 0000 in 13 samples (all parked) | Drop if still flat after a full drive cycle | -| `7E1` | `2B1E` | 600 | Undecoded, constant 0000 in 13 samples (all parked) | Drop if still flat after a full drive cycle | | `7E1` | `DD01` | 600 | Undecoded, constant 025166 in 1 samples (all parked) | Drop if still flat after a full drive cycle | --- +## Manual-probe-only DIDs + +The 2026-09-20 drive's biggest finding: 36 DIDs return `7F 22 31` (request +out of range) on every normal poll and always have. Across fourteen months +of logs they have answered only twice — once in December 2025, in a session +that had sent `10 03` (extended diagnostic session), and once in June 2025, +in a session with unusual protocol and flow-control setup. Every session +since that did not open an extended session first has been rejected. + +**They are session-gated, not dead.** The app polls in the default session +and can never reach them. All 36 have been removed from the signalset — +this is why the command count dropped from 109 to 73 on this drive — and +they are now readable only by hand. + +`7E0`: `1044`, `10E0`, `112C`, `1139`, `113F`, `1151`, `1152`, `1153`, +`1154`, `1155`, `1156`, `1158`, `1159`, `115B`, `1160`, `1164`, `1187`, +`11BA`, `11BB`, `11BD`, `11BE`, `11C4`, `11C5`, `11CC` + +`7E1`: `0302`, `0303`, `0304`, `0305`, `0805`, `101A`, `2104`, `210F`, +`2B1B`, `2B1C`, `2B1D`, `2B1E` + +The two most interesting: `1153` and `1154`, a charging-voltage pair at +1/256 V. `1154` sits pinned at exactly `0E00` (14.00 V); both dip to +5.7-10.1 V on crank. + +### Reading them + +`10 03` is Diagnostic Session Control, sub-function `03` — extended +diagnostic session. **This is the one place in this document where a +command changes ECU state instead of reading it.** Do it deliberately: +parked, engine running, never while driving — and close the session +afterward with `10 01` (return to default session). + +The extended session times out after a few seconds of silence unless kept +alive with `3E 00` (tester present). That matters here: probe a long list +without it and the session drops back to default between questions, and +every DID on it goes back to answering `7F 22 31`. + +``` +ATSH 7E0 set header +ATCRA 7E8 receive filter +10 03 open extended diagnostic session +3E 00 tester present - repeat every few seconds to hold the session +22 1153 question +22 1154 question +... more questions, with 3E 00 between any pause +10 01 return to default session +``` + +Retarget `ATSH`/`ATCRA` to `7E1`/`7E9` for the second module and open a +fresh `10 03` there — the extended session is per-module, not global. + +--- + ## How to check results Sidecar writes zipped SQLite backups to @@ -233,6 +249,6 @@ decode. Open questions that aren't in-vehicle tasks — they need log analysis or a decision, not a drive: -- Why eight commands stopped being polled on 2026-08-30, and whether it's tied to the `freq` re-tiering in `f782e4d`/`527a47f`. -- Whether `F408`/`F409` (bank-2 fuel trims) exist on this engine at all — they have never been requested. -- What `761/197C` and `761/D11C` measure — the most variable unmined DIDs found so far. +- Both banks are correcting lean together by 7-9% long term (B1 +9.31%, B2 +7.32%), which points at fuel delivery, MAF calibration or an unmetered air leak rather than a per-bank fault. One drive, single-digit sample counts — needs confirming. +- What `3B01`'s bit flags mean, and which bit corresponds to which height. +- What `761/197C` and `761/D11C` measure. diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 67e7437..f8457f1 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -10,11 +10,11 @@ }} } ]}, -{ "hdr": "761", "rax": "769", "cmd": {"22": "197C"}, "freq": 60, +{ "hdr": "761", "rax": "769", "cmd": {"22": "197C"}, "freq": 30, "signals": [ {"id": "LR4_197C_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "197C Raw"} ]}, -{ "hdr": "761", "rax": "769", "cmd": {"22": "D11C"}, "freq": 60, +{ "hdr": "761", "rax": "769", "cmd": {"22": "D11C"}, "freq": 30, "signals": [ {"id": "LR4_D11C_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "D11C Raw"} ]}, @@ -66,150 +66,22 @@ "signals": [ {"id": "LR4_1E89_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "1E89 Raw"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B00"}, "freq": 600, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B00"}, "freq": 30, "signals": [ {"id": "LR4_3B00_RAW", "path": "Suspension", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "3B00 Raw"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B01"}, "freq": 600, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B01"}, "freq": 10, "signals": [ {"id": "LR4_3B01_RAW", "path": "Suspension", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "3B01 Raw"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B08"}, "freq": 600, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B08"}, "freq": 30, "signals": [ {"id": "LR4_3B08_RAW", "path": "Suspension", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "3B08 Raw"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1044"}, "freq": 600, - "signals": [ - {"id": "LR4_1044_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1044 Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "10E0"}, "freq": 600, - "signals": [ - {"id": "LR4_10E0_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "10E0 Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "112C"}, "freq": 60, - "signals": [ - {"id": "LR4_112C_RAW", "path": "Engine", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "112C Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1139"}, "freq": 60, - "signals": [ - {"id": "LR4_1139_RAW", "path": "Engine", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "1139 Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1151"}, "freq": 120, - "signals": [ - {"id": "LR4_1151_RAW", "path": "Engine", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "1151 Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1152"}, "freq": 600, - "signals": [ - {"id": "LR4_1152_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1152 Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1155"}, "freq": 600, - "signals": [ - {"id": "LR4_1155_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1155 Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1156"}, "freq": 120, - "signals": [ - {"id": "LR4_1156_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1156 Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1158"}, "freq": 600, - "signals": [ - {"id": "LR4_1158_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1158 Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1159"}, "freq": 120, - "signals": [ - {"id": "LR4_1159_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1159 Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "115B"}, "freq": 120, - "signals": [ - {"id": "LR4_115B_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "115B Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1160"}, "freq": 600, - "signals": [ - {"id": "LR4_1160_RAW", "path": "Engine", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "1160 Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1164"}, "freq": 120, - "signals": [ - {"id": "LR4_1164_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1164 Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1187"}, "freq": 600, - "signals": [ - {"id": "LR4_1187_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1187 Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "11BA"}, "freq": 600, - "signals": [ - {"id": "LR4_11BA_RAW", "path": "Engine", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "11BA Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "11BB"}, "freq": 600, - "signals": [ - {"id": "LR4_11BB_RAW", "path": "Engine", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "11BB Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "11BD"}, "freq": 600, - "signals": [ - {"id": "LR4_11BD_RAW", "path": "Engine", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "11BD Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "11BE"}, "freq": 600, - "signals": [ - {"id": "LR4_11BE_RAW", "path": "Engine", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "11BE Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "11C4"}, "freq": 60, - "signals": [ - {"id": "LR4_11C4_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "11C4 Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "11C5"}, "freq": 120, - "signals": [ - {"id": "LR4_11C5_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "11C5 Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "11CC"}, "freq": 600, - "signals": [ - {"id": "LR4_11CC_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "11CC Raw"} - ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "0302"}, "freq": 120, - "signals": [ - {"id": "LR4_0302_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "0302 Raw"} - ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "0303"}, "freq": 600, - "signals": [ - {"id": "LR4_0303_RAW", "path": "Drivetrain", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "0303 Raw"} - ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "0304"}, "freq": 600, - "signals": [ - {"id": "LR4_0304_RAW", "path": "Drivetrain", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "0304 Raw"} - ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "0305"}, "freq": 600, - "signals": [ - {"id": "LR4_0305_RAW", "path": "Drivetrain", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "0305 Raw"} - ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "0805"}, "freq": 120, - "signals": [ - {"id": "LR4_0805_RAW", "path": "Drivetrain", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "0805 Raw"} - ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "101A"}, "freq": 60, - "signals": [ - {"id": "LR4_101A_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "101A Raw"} - ]}, { "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E6A"}, "freq": 600, "signals": [ {"id": "LR4_1E6A_RAW", "path": "Drivetrain", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1E6A Raw"} ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "210F"}, "freq": 120, - "signals": [ - {"id": "LR4_210F_RAW", "path": "Drivetrain", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "210F Raw"} - ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "2B1B"}, "freq": 600, - "signals": [ - {"id": "LR4_2B1B_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "2B1B Raw"} - ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "2B1C"}, "freq": 600, - "signals": [ - {"id": "LR4_2B1C_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "2B1C Raw"} - ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "2B1D"}, "freq": 600, - "signals": [ - {"id": "LR4_2B1D_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "2B1D Raw"} - ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "2B1E"}, "freq": 600, - "signals": [ - {"id": "LR4_2B1E_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "2B1E Raw"} - ]}, { "hdr": "7E1", "rax": "7E9", "cmd": {"22": "DD01"}, "freq": 600, "signals": [ {"id": "LR4_DD01_RAW", "path": "Drivetrain", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "DD01 Raw"} @@ -273,7 +145,7 @@ ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B4D"}, "freq": 10, "signals": [ - {"id": "LR4_DRIVE_MODE", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "Drive Mode"} + {"id": "LR4_3B4D_RAW", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "3B4D Raw"} ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B71"}, "freq": 10, "signals": [ @@ -311,18 +183,6 @@ "signals": [ {"id": "LR4_ODOMETER", "path": "Trips", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "kilometers" }, "name": "Odometer", "suggestedMetric": "odometer"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1153"}, "freq": 5, - "signals": [ - {"id": "LR4_CHARGE_V", "path": "Engine", "fmt": { "len": 16, "max": 65.535, "div": 256, "unit": "volts" }, "name": "Charging Voltage"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "1154"}, "freq": 5, - "signals": [ - {"id": "LR4_CHARGE_V_TARGET", "path": "Engine", "fmt": { "len": 16, "max": 65.535, "div": 256, "unit": "volts" }, "name": "Charging Voltage Target"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "113F"}, "freq": 30, - "signals": [ - {"id": "LR4_113F_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "113F Raw"} - ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F404"}, "freq": 3, "signals": [ {"id": "LR4_LOAD_CALC", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Calculated Load", "suggestedMetric": "engineLoad"} @@ -498,10 +358,6 @@ "signals": [ {"id": "LR4_1E68_RAW", "path": "Transmission", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "1E68 Raw (varies most)"} ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "2104"}, "freq": 30, - "signals": [ - {"id": "LR4_2104_RAW", "path": "Drivetrain", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "2104 Raw"} - ]}, { "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E69"}, "freq": 5, "signals": [ {"id": "LR4_GEARBOX_OIL_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "max": 120, "min": -40, "add": -40, "unit": "celsius" }, "name": "Gearbox Temp", "suggestedMetric": "transmissionFluidTemperature"} diff --git a/tests/test_cases/2016/command_support.yaml b/tests/test_cases/2016/command_support.yaml index 97f9316..c87a393 100644 --- a/tests/test_cases/2016/command_support.yaml +++ b/tests/test_cases/2016/command_support.yaml @@ -125,32 +125,7 @@ supported_commands_by_ecu: - 7E0.2203F2 - 7E0.2203F3 - 7E0.220520 - - 7E0.221044 - - 7E0.2210E0 - - 7E0.22112C - - 7E0.221139 - - 7E0.22113F - - 7E0.221151 - - 7E0.221152 - - 7E0.221153 - - 7E0.221154 - - 7E0.221155 - - 7E0.221156 - - 7E0.221158 - - 7E0.221159 - - 7E0.22115B - - 7E0.221160 - - 7E0.221164 - - 7E0.221187 - - 7E0.2211BA - - 7E0.2211BB - - 7E0.2211BD - - 7E0.2211BE - - 7E0.2211C4 - - 7E0.2211C5 - - 7E0.2211CC - 7E0.22DD01 - - 7E0.22F18C - 7E0.22F404 - 7E0.22F405 - 7E0.22F406 @@ -209,21 +184,9 @@ supported_commands_by_ecu: - 7E1.7E9.0133 - 7E1.7E9.0142 - 7E1.7E9.015A - - 7E1.7E9.220302 - - 7E1.7E9.220303 - - 7E1.7E9.220304 - - 7E1.7E9.220305 - - 7E1.7E9.220805 - - 7E1.7E9.22101A - 7E1.7E9.221E68 - 7E1.7E9.221E69 - 7E1.7E9.221E6A - - 7E1.7E9.222104 - - 7E1.7E9.22210F - - 7E1.7E9.222B1B - - 7E1.7E9.222B1C - - 7E1.7E9.222B1D - - 7E1.7E9.222B1E - 7E1.7E9.22DD01 "7E8": - 7E8.0103 From c79659eb356c1433738656d9a047c33a290bbc26 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 20 Sep 2026 10:53:28 -0600 Subject: [PATCH 71/84] drop the two SAE rows for commands that no longer exist F423 and F45C came out of the signalset when their proprietary equivalents won on sample count, but the signal tables kept listing them. Note the reason on the surviving rows so nobody re-adds them. --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 6037460..1ded4c5 100644 --- a/README.md +++ b/README.md @@ -99,8 +99,7 @@ VIN bytes instead of a rejection — worth a retry. | O2 Lambda B1S1 | `7E0` `22F434` | Measured lambda | | O2 Sensor Voltage | `7E0` `22F434` | Second half of the same response | | Catalyst Temp B1S1 / B2S1 | `7E0` `22F43C` / `22F43D` | One per bank | -| Oil Temp | `7E0` `2203F3` | Land Rover's own sensor | -| Oil Temp (SAE) | `7E0` `22F45C` | Standard PID, same physical sensor | +| Oil Temp | `7E0` `2203F3` | Land Rover's own sensor. The SAE alias `F45C` was dropped — 1,169 samples against this one's 347,015 | | Oil Level | `7E0` `2203E6` | Millimetres in the sump | | Oil Volume | `7E0` `2203F2` | | @@ -124,8 +123,7 @@ fuel cut — injectors fully off while coasting, sensor reading pure air. | Signal | Address | Notes | |---|---|---| | Fuel Level | `7E0` `22F42F` | | -| Fuel Rail Pressure | `7E0` `22033E` | Proprietary; ~60 bar idle, 130+ under load | -| Fuel Rail Pressure (SAE) | `7E0` `22F423` | Standard PID, same rail | +| Fuel Rail Pressure | `7E0` `22033E` | Proprietary; ~60 bar idle, 130+ under load. The SAE alias `F423` was dropped — 158 samples against this one's 15,910 | | Short Term Fuel Trim B1 | `7E0` `22F406` | Immediate correction, swings constantly | | Long Term Fuel Trim B1 | `7E0` `22F407` | Learned correction, drifts slowly | | Short Term Fuel Trim B2 | `7E0` `22F408` | First recorded 2026-09-20 | From 72cc76e6b846bac9868fc07410a82ace2313bbd4 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 20 Sep 2026 12:34:17 -0600 Subject: [PATCH 72/84] probe the sixteen PIDs the ECM says it has and we never read Decoding the ECM's own 0100/0120/0140/0160 bitmasks says it supports 54 mode-01 PIDs; 25 had no entry here. Dropping the metadata ones and the two SAE aliases that already lost to their proprietary twins leaves sixteen. Three of them exist to prosecute the lean finding rather than to collect data: F403 says whether the engine was even in closed loop when those trims were measured, F42E tests the stuck-purge-valve hypothesis that would explain both banks drifting together, and F438 is the bank 2 oxygen sensor sitting behind the bank 2 trim we only just started reading. Eight go in as single raw bytes because we do not know what they are. len 8 is deliberate - reading the first byte is safe whatever the real width turns out to be, and they get widened once something replies. 89 commands at 10.93 req/s. --- README.md | 71 ++++++++++++++++++++-- TESTING.md | 16 ++++- signalsets/v3/default.json | 67 ++++++++++++++++++++ tests/test_cases/2016/command_support.yaml | 16 +++++ 4 files changed, 162 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 1ded4c5..feb2c54 100644 --- a/README.md +++ b/README.md @@ -102,6 +102,12 @@ VIN bytes instead of a rejection — worth a retry. | Oil Temp | `7E0` `2203F3` | Land Rover's own sensor. The SAE alias `F45C` was dropped — 1,169 samples against this one's 347,015 | | Oil Level | `7E0` `2203E6` | Millimetres in the sump | | Oil Volume | `7E0` `2203F2` | | +| O2 Lambda B2S1 | `7E0` `22F438` | Measured lambda, bank 2 — first bank 2 lambda ever read on this truck | +| O2 Sensor Voltage B2S1 | `7E0` `22F438` | Second half of the same response | +| O2 Voltage B1S2 | `7E0` `22F415` | Post-catalyst sensor, bank 1 | +| Relative Throttle Position | `7E0` `22F445` | A third throttle-position reading, alongside Throttle Position and Commanded Throttle | +| Absolute Throttle Position B | `7E0` `22F447` | A fourth | +| O2 Sensors Present | `7E0` `22F413` | Bitmask of which O2 sensor positions are physically fitted | ### Lambda @@ -128,6 +134,11 @@ fuel cut — injectors fully off while coasting, sensor reading pure air. | Long Term Fuel Trim B1 | `7E0` `22F407` | Learned correction, drifts slowly | | Short Term Fuel Trim B2 | `7E0` `22F408` | First recorded 2026-09-20 | | Long Term Fuel Trim B2 | `7E0` `22F409` | First recorded 2026-09-20 | +| Fuel System Status B1 | `7E0` `22F403` | Enum: open loop cold / closed loop / open loop, load or decel fuel cut / open loop, system fault / closed loop with a feedback fault | +| Fuel System Status B2 | `7E0` `22F403` | Second half of the same response; not yet mapped to named states | +| Commanded Evap Purge | `7E0` `22F42E` | Percent duty cycle on the purge valve | +| O2 Trim B1S2 | `7E0` `22F415` | Second half of the same response — post-catalyst trim, bank 1 | +| Long Term Secondary O2 Trim B1 | `7E0` `22F456` | | --- @@ -437,6 +448,7 @@ formulas eventually get worked out. | Address | Signals | |---|---| +| `7E0` / `7E8` | `F416`, `F419`, `F41A`, `F458`, `F466`, `F467`, `F468`, `F470` — eight single-byte probes added 2026-09-20. The ECM's own supported-PID bitmask says these PIDs exist; nothing more is known | | `792` / `79A` | `2A32`–`2A3A` — eight live values, none resembling tire pressures | | `795` / `79D` | `1E88`, `1E89` | | `7E1` / `7E9` | `1E68`, `1E6A` — neighbours of the gearbox temp | @@ -536,14 +548,16 @@ The budget in this file: | 1s | 4 | Manifold pressure, barometric, engine speed, vehicle speed | | 3s | 8 | Throttle, pedals, timing, lambda, load | | 5s | 10 | Temperatures, fuel trims bank 1, mass air flow, gearbox and diff temp, gear selector | -| 10s | 12 | Air suspension | +| 10s | 14 | Air suspension, fuel system status B1/B2, O2 lambda/voltage B2S1 | +| 20s | 2 | Commanded evap purge, O2 voltage/trim B1S2 | | 30s | 19 | Fuel trims bank 2, catalyst temperatures, battery, fuel level, and the undecoded probes shown to move | -| 60s | 1 | `726/0202` | -| 600s | 19 | Odometer, oil level, oil volume, and undecoded probes that have never moved | +| 60s | 4 | `726/0202`, long term secondary O2 trim B1, relative throttle position, absolute throttle position B | +| 300s | 8 | Eight raw single-byte probes from the ECM's own supported-PID bitmask, payload width unknown | +| 600s | 20 | Odometer, oil level, oil volume, O2 sensors present, and undecoded probes that have never moved | -That totals 10.55 requests per second of demand against roughly 11 available -once protocol overhead is removed — 73 commands, down from 109 after the -extended-session-only block described below was removed. The four +That totals 10.93 requests per second of demand against roughly 11 available +once protocol overhead is removed — 89 commands, up from 73 after the +sixteen added from the ECM's own supported-PID bitmask (see below). The four one-second commands exist so the boost calculation stays responsive. ### Eight commands went quiet for three weeks. The app had a stale signalset @@ -614,6 +628,11 @@ bank asymmetry came from having only bank 1 to look at. Sample sizes are small: one drive, and single digits on three of the four figures. Treat the direction as real and the magnitude as provisional. +`F403`, `F42E` and `F438`, added to the file below, exist specifically to +test this: whether the engine was in closed loop when the trims were +measured, whether a stuck-open purge valve is pulling in unmetered air, and +what bank 2's own oxygen sensor is doing behind its trim. + ### The debug batch, and what the first drive did to it On 2026-09-20, 51 commands went in — one for every DID this truck had ever @@ -652,6 +671,46 @@ switch — can be deleted for good rather than on suspicion. Do not read a `7F 22 31` as "unsupported" without checking whether an extended session would have changed the answer. +### Sixteen more, found by reading the ECM's own PID list + +Every request in this file so far came from watching the bus and guessing. +On 2026-09-20 the ECM's own mode-01 replies to `0100`, `0120`, `0140` and +`0160` were decoded instead — these are bitmasks of which mode-01 PIDs the +module actually supports, and this ECM claims 54 of them. Cross-referencing +those 54 against this file found 25 with no entry. After excluding metadata +PIDs (the support bitmasks themselves, monitor status, OBD standard, fuel +type) and the two SAE aliases already dropped as duplicates (`F423`, `F45C` +— see Fuel and Engine above), sixteen were worth adding. + +Eight got real decodes: + +| Command | PID | Signal | Why it was worth adding | +|---|---|---|---| +| `F403` | `03` | Fuel System Status B1 / B2 | Open loop vs. closed loop — fuel trims only mean something in closed loop | +| `F438` | `38` | O2 Lambda B2S1 / O2 Voltage B2S1 | Bank 1 lambda has been read via `F434` all along; there was no bank 2 equivalent | +| `F42E` | `2E` | Commanded Evap Purge | A stuck-open purge valve is a classic cause of both banks running lean at once | +| `F415` | `15` | O2 Voltage B1S2 / O2 Trim B1S2 | Post-catalyst sensor, bank 1 | +| `F456` | `56` | Long Term Secondary O2 Trim B1 | Further trim context | +| `F445` | `45` | Relative Throttle Position | Throttle redundancy | +| `F447` | `47` | Absolute Throttle Position B | Throttle redundancy | +| `F413` | `13` | O2 Sensors Present | Bitmask of which O2 sensor positions are physically fitted | + +The other eight are raw single-byte probes, because their meaning isn't +established: `F416`, `F419`, `F41A`, `F458`, `F466`, `F467`, `F468`, `F470`. +All that's known is that the ECM claims to support the underlying PIDs. +They're declared at `len` 8 because the payload width is unknown — reading +the first byte is always safe, and each should be widened once a real reply +shows its actual width. See `TESTING.md` for what would count as a result +for each. + +This batch was picked to test the lean-trim finding above rather than at +random: `F403` says whether the engine was in closed loop when the +9%/+7% +trims were measured, `F42E` tests the stuck-purge-valve hypothesis directly, +and `F438` gives bank 2's own oxygen sensor behind the bank 2 trim. Together +they move that finding from an observation toward something diagnosable. + +The file is now 89 commands at 10.93 req/s. + **Two known inefficiencies**, neither fixable from a signalset: Requests carry no expected-response count. The ELM327 datasheet documents that diff --git a/TESTING.md b/TESTING.md index ccfc620..d8ea75d 100644 --- a/TESTING.md +++ b/TESTING.md @@ -2,8 +2,10 @@ The README records what's known about this signalset. This file records what isn't — the open questions that can only be answered in the truck, and the -pass/fail criteria for the 51 debug parameters added on 2026-09-20. Work -through it as drives happen; check items off with evidence, not on suspicion. +pass/fail criteria for the debug parameters added on 2026-09-20 (51 in the +first batch, 8 more added later that day from the ECM's own supported-PID +bitmask). Work through it as drives happen; check items off with evidence, +not on suspicion. --- @@ -17,6 +19,8 @@ through it as drives happen; check items off with evidence, not on suspicion. - [ ] **A cold start.** Needed for the warm-up curves on `113F` and `2104`, and to catch the crank dip on `1153`/`1154`. - [ ] **Identify module `792`.** Its whole `2A3x` block is static and nothing is known about it. Try `22F18C` and `22F191` against it the way the other six unmined modules were probed on 2026-09-19. - [ ] **Mine the four still-unidentified modules** — `716`, `726`, `737`, `797`. Each returned a distinct ECU serial via `22F18C` but rejected `22F191`, so they are real and separate but their function is unknown. +- [ ] **Sweep module `760` for wheel speeds.** `760` was identified as the ABS/brake module on 2026-09-19 and has never been mined. Individual wheel speeds would enable dragging-brake detection, a tire-size mismatch check, and a better speed reference than the single `F40D` value. A parked terminal sweep — no drive needed. +- [ ] **Read fault codes.** This file has no DTC coverage at all — modes `03` (stored), `07` (pending), `0A` (permanent), plus UDS service `19` for the non-OBD modules. Pending codes are the earliest warning available on a vehicle this age and have never been looked at. This probably can't be expressed in an OBDb signalset, so it stays a terminal task rather than something to add to `default.json`. --- @@ -170,6 +174,14 @@ moved" so far only means "never moved while parked." | `7E0` | `F41F` | 30 | Run time since start (PID 1F) | Records as a signal - this is the alias-mechanism test against standard 011F | | `7E1` | `1E6A` | 600 | Undecoded, constant 00 in 27 samples (all parked) | Drop if still flat after a full drive cycle | | `7E1` | `DD01` | 600 | Undecoded, constant 025166 in 1 samples (all parked) | Drop if still flat after a full drive cycle | +| `7E0` | `F416` | 300 | Raw single-byte probe from the ECM's own supported-PID bitmask decode; no data read yet | Whether it answers at all, and what payload width comes back | +| `7E0` | `F419` | 300 | Raw single-byte probe from the ECM's own supported-PID bitmask decode; no data read yet | Whether it answers at all, and what payload width comes back | +| `7E0` | `F41A` | 300 | Raw single-byte probe from the ECM's own supported-PID bitmask decode; no data read yet | Whether it answers at all, and what payload width comes back | +| `7E0` | `F458` | 300 | Raw single-byte probe from the ECM's own supported-PID bitmask decode; no data read yet | Whether it answers at all, and what payload width comes back | +| `7E0` | `F466` | 300 | Raw single-byte probe from the ECM's own supported-PID bitmask decode; no data read yet | Whether it answers at all, and what payload width comes back | +| `7E0` | `F467` | 300 | Raw single-byte probe from the ECM's own supported-PID bitmask decode; no data read yet | Whether it answers at all, and what payload width comes back | +| `7E0` | `F468` | 300 | Raw single-byte probe from the ECM's own supported-PID bitmask decode; no data read yet | Whether it answers at all, and what payload width comes back | +| `7E0` | `F470` | 300 | Raw single-byte probe from the ECM's own supported-PID bitmask decode; no data read yet | Whether it answers at all, and what payload width comes back | --- diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index f8457f1..6f91a3d 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -183,6 +183,73 @@ "signals": [ {"id": "LR4_ODOMETER", "path": "Trips", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "kilometers" }, "name": "Odometer", "suggestedMetric": "odometer"} ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F403"}, "freq": 10, + "signals": [ + {"id": "LR4_FUEL_SYS_B1", "path": "Fuel", "fmt": { "len": 8, "max": 255, "map": { "1": { "description": "Open loop, engine cold", "value": "OpenLoopCold" }, "2": { "description": "Closed loop", "value": "ClosedLoop" }, "4": { "description": "Open loop, load or decel fuel cut", "value": "OpenLoopLoad" }, "8": { "description": "Open loop, system fault", "value": "OpenLoopFault" }, "16": { "description": "Closed loop with a feedback fault", "value": "ClosedLoopFault" } } }, "name": "Fuel System Status B1"}, + {"id": "LR4_FUEL_SYS_B2", "path": "Fuel", "fmt": { "bix": 8, "len": 8, "max": 255, "unit": "scalar" }, "name": "Fuel System Status B2"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F438"}, "freq": 10, + "signals": [ + {"id": "LR4_O2_LAMBDA_B2", "path": "Engine", "fmt": { "len": 16, "max": 1.999, "div": 32768, "unit": "scalar" }, "name": "O2 Lambda B2S1"}, + {"id": "LR4_O2_VOLTAGE_B2", "path": "Engine", "fmt": { "bix": 16, "len": 16, "max": 7.999, "div": 8192, "unit": "volts" }, "name": "O2 Voltage B2S1"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F42E"}, "freq": 20, + "signals": [ + {"id": "LR4_EVAP_PURGE", "path": "Fuel", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Commanded Evap Purge"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F415"}, "freq": 20, + "signals": [ + {"id": "LR4_O2_S2_VOLTAGE", "path": "Engine", "fmt": { "len": 8, "max": 1.275, "div": 200, "unit": "volts" }, "name": "O2 Voltage B1S2"}, + {"id": "LR4_O2_S2_TRIM", "path": "Fuel", "fmt": { "bix": 8, "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "O2 Trim B1S2"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F456"}, "freq": 60, + "signals": [ + {"id": "LR4_SEC_O2_TRIM_B1", "path": "Fuel", "fmt": { "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "Long Term Secondary O2 Trim B1"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F445"}, "freq": 60, + "signals": [ + {"id": "LR4_THROTTLE_REL", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Relative Throttle Position"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F447"}, "freq": 60, + "signals": [ + {"id": "LR4_THROTTLE_B", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Absolute Throttle Position B"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F413"}, "freq": 600, + "signals": [ + {"id": "LR4_O2_PRESENT", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "O2 Sensors Present"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F416"}, "freq": 300, + "signals": [ + {"id": "LR4_416_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "416 Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F419"}, "freq": 300, + "signals": [ + {"id": "LR4_419_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "419 Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F41A"}, "freq": 300, + "signals": [ + {"id": "LR4_41A_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "41A Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F458"}, "freq": 300, + "signals": [ + {"id": "LR4_458_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "458 Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F466"}, "freq": 300, + "signals": [ + {"id": "LR4_466_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "466 Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F467"}, "freq": 300, + "signals": [ + {"id": "LR4_467_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "467 Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F468"}, "freq": 300, + "signals": [ + {"id": "LR4_468_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "468 Raw"} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F470"}, "freq": 300, + "signals": [ + {"id": "LR4_470_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "470 Raw"} + ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F404"}, "freq": 3, "signals": [ {"id": "LR4_LOAD_CALC", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Calculated Load", "suggestedMetric": "engineLoad"} diff --git a/tests/test_cases/2016/command_support.yaml b/tests/test_cases/2016/command_support.yaml index c87a393..51ab34e 100644 --- a/tests/test_cases/2016/command_support.yaml +++ b/tests/test_cases/2016/command_support.yaml @@ -126,6 +126,7 @@ supported_commands_by_ecu: - 7E0.2203F3 - 7E0.220520 - 7E0.22DD01 + - 7E0.22F403 - 7E0.22F404 - 7E0.22F405 - 7E0.22F406 @@ -139,22 +140,37 @@ supported_commands_by_ecu: - 7E0.22F40F - 7E0.22F410 - 7E0.22F411 + - 7E0.22F413 + - 7E0.22F415 + - 7E0.22F416 + - 7E0.22F419 + - 7E0.22F41A - 7E0.22F41F - 7E0.22F421 + - 7E0.22F42E - 7E0.22F42F - 7E0.22F430 - 7E0.22F431 - 7E0.22F433 - 7E0.22F434 + - 7E0.22F438 - 7E0.22F43C - 7E0.22F43D - 7E0.22F442 - 7E0.22F443 - 7E0.22F444 + - 7E0.22F445 - 7E0.22F446 + - 7E0.22F447 - 7E0.22F449 - 7E0.22F44A - 7E0.22F44C + - 7E0.22F456 + - 7E0.22F458 + - 7E0.22F466 + - 7E0.22F467 + - 7E0.22F468 + - 7E0.22F470 "7E1": - 0101:ACRF_RDY,ACRF_SUP,AIR_RDY,AIR_SUP,CAT_RDY,CAT_SUP,CCM_RDY,CCM_SUP,CIM_SUP,DTC_CNT,EGR_RDY,EGR_SUP,EVAP_RDY,EVAP_SUP,FUEL_RDY,FUEL_SUP,HCAT_RDY,HCAT_SUP,HTR_RDY,HTR_SUP,MIL,MIS_RDY,MIS_SUP,O2S_RDY,O2S_SUP - 0104:LOAD_PCT From 8b08dafc98c96c3595cd3eca1eabd2177a6f25cf Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 20 Sep 2026 14:34:40 -0600 Subject: [PATCH 73/84] widen the four PIDs whose first byte was a support bitmask F466, F467, F468 and F470 went in at len 8 because nobody knew how wide they were. The first byte of each turns out to be a sensor-support mask, so all four have been faithfully recording the constant 3. The real payloads are two mass airflow sensors, two coolant sensors, two intake air sensors and ten bytes of boost control, and every number we have from them was read out of raw frames by hand rather than by the signalset. The dual MAF is the reason to care: 2.09 g/s against 1.78, a 17.5% split between intake tracts, summing to roughly what F410 reports on its own. MAF calibration was one of three explanations for both banks trimming lean together and this is the first evidence touching it, so F466 goes to freq 5. F416, F419 and F41A answer FFFF, not available, every time and are gone. F413 said 0x77 once - both banks have sensors 1 through 3 - which can never change, so it is written down rather than polled. Re-tiered for a two-hour drive with off-roading: the diff-lock pair to 30, boost control to 15, purge to 10. Barometric pressure pays for it at freq 5 instead of 1, which frees 0.9 req/s and loses nothing. 85 commands at 10.53 req/s. --- README.md | 119 ++++++++------------- TESTING.md | 22 +++- signalsets/v3/default.json | 50 ++++----- tests/test_cases/2016/command_support.yaml | 4 - 4 files changed, 85 insertions(+), 110 deletions(-) diff --git a/README.md b/README.md index feb2c54..a346494 100644 --- a/README.md +++ b/README.md @@ -671,81 +671,56 @@ switch — can be deleted for good rather than on suspicion. Do not read a `7F 22 31` as "unsupported" without checking whether an extended session would have changed the answer. -### Sixteen more, found by reading the ECM's own PID list +### Sixteen more, found by reading the ECM's own PID list, and how they did -Every request in this file so far came from watching the bus and guessing. -On 2026-09-20 the ECM's own mode-01 replies to `0100`, `0120`, `0140` and -`0160` were decoded instead — these are bitmasks of which mode-01 PIDs the -module actually supports, and this ECM claims 54 of them. Cross-referencing -those 54 against this file found 25 with no entry. After excluding metadata -PIDs (the support bitmasks themselves, monitor status, OBD standard, fuel -type) and the two SAE aliases already dropped as duplicates (`F423`, `F45C` -— see Fuel and Engine above), sixteen were worth adding. +The ECM's `0100`/`0120`/`0140`/`0160` bitmasks report 54 supported mode-01 +PIDs. Twenty-five had no entry here; after removing metadata PIDs and the +two SAE aliases already dropped, sixteen went in on 2026-09-20 and were +tested the same day. **All sixteen answered.** Ten earn their place. -Eight got real decodes: - -| Command | PID | Signal | Why it was worth adding | -|---|---|---|---| -| `F403` | `03` | Fuel System Status B1 / B2 | Open loop vs. closed loop — fuel trims only mean something in closed loop | -| `F438` | `38` | O2 Lambda B2S1 / O2 Voltage B2S1 | Bank 1 lambda has been read via `F434` all along; there was no bank 2 equivalent | -| `F42E` | `2E` | Commanded Evap Purge | A stuck-open purge valve is a classic cause of both banks running lean at once | -| `F415` | `15` | O2 Voltage B1S2 / O2 Trim B1S2 | Post-catalyst sensor, bank 1 | -| `F456` | `56` | Long Term Secondary O2 Trim B1 | Further trim context | -| `F445` | `45` | Relative Throttle Position | Throttle redundancy | -| `F447` | `47` | Absolute Throttle Position B | Throttle redundancy | -| `F413` | `13` | O2 Sensors Present | Bitmask of which O2 sensor positions are physically fitted | - -The other eight are raw single-byte probes, because their meaning isn't -established: `F416`, `F419`, `F41A`, `F458`, `F466`, `F467`, `F468`, `F470`. -All that's known is that the ECM claims to support the underlying PIDs. -They're declared at `len` 8 because the payload width is unknown — reading -the first byte is always safe, and each should be widened once a real reply -shows its actual width. See `TESTING.md` for what would count as a result -for each. - -This batch was picked to test the lean-trim finding above rather than at -random: `F403` says whether the engine was in closed loop when the +9%/+7% -trims were measured, `F42E` tests the stuck-purge-valve hypothesis directly, -and `F438` gives bank 2's own oxygen sensor behind the bank 2 trim. Together -they move that finding from an observation toward something diagnosable. - -The file is now 89 commands at 10.93 req/s. - -**Two known inefficiencies**, neither fixable from a signalset: - -Requests carry no expected-response count. The ELM327 datasheet documents that -appending a digit (`22F405 1`) lets the adapter return the instant it has that -many responses instead of waiting out the full timeout, and shows it nearly -doubling throughput. No request in this vehicle's history uses it. - -Sparse headers cost triple. Reading one value from a module means `ATSH`, then -a receive filter, then the read — three round trips for one number. The engine -module amortises this well at 0.12 setup commands per read; a header carrying a -single command pays 2.0. - -Multi-DID requests would help most — a single frame holds seven payload bytes, -enough for `22` plus three identifiers — but the schema caps `cmd` at one -identifier, so the format cannot express it. - ---- - -## Terminal probing - -Sidecar's terminal is the fastest way to test a DID. - -``` -ATSH 7E0 set request address -ATCRA 7E8 set response filter -22F42F read a DID -ATAR restore automatic addressing -``` - -**Always finish with `ATAR`.** A left-over `ATCRA` filter blocks replies from -every other module, which makes the whole app look broken. +| Command | Result | +|---|---| +| `22F466` | **Two mass airflow sensors.** A 2.09 g/s against B 1.78 g/s, summing to 3.88 against `F410`'s 4.16 a second later | +| `22F467` | **Two coolant temperature sensors**, 61 °C and 35 °C | +| `22F468` | **Two intake air temperature sensors**, 36 °C and 59 °C | +| `22F403` | Fuel system status, two states over 14 samples: open loop on load or decel ×9, closed loop ×5 | +| `22F42E` | Evap purge duty, 0 to 72.2% | +| `22F438` | Bank 2 lambda 0.853-1.985 over 29 valid samples; railed at `FFFF` on 23 of 52 | +| `22F415` | Post-catalyst O2, 0.13-0.93 V and switching | +| `22F445` / `22F447` | Relative throttle 2.7-22.7%, absolute throttle B 12.5-22.4% | +| `22F470` | Ten data bytes, undecoded | + +**The dual mass airflow sensors are the find.** MAF calibration was one of +three candidate explanations for both banks correcting lean together, and +`F466` shows the two intake tracts disagreeing by 17.5%. Their sum tracks +the single `F410` figure, so they are the two halves of the same +measurement. One sample, taken at idle where these sensors are least +accurate — a lead, not a finding, and the reason `F466` now runs at `freq` 5. + +`F403` matters for the same investigation: the engine does reach closed +loop, so the 7-9% long-term trims are real measurements rather than +open-loop artifacts. + +**Four were declared wrong and recorded nothing useful.** `F466`, `F467`, +`F468` and `F470` were added at `len` 8 because their payload widths were +unknown. The first byte of each turns out to be a sensor-support bitmask, +not data, so all four logged a constant 3 or 2. The figures above came from +decoding raw frames by hand. Widths are now known and declared properly. + +**Three did nothing and are gone.** `F416`, `F419` and `F41A` return `FFFF`, +not-available, on every sample. The ECM's bitmask claims them; the values do +not exist. + +**One did its whole job in a single reply and is also gone.** `F413` +returned `0x77`: bank 1 sensors 1, 2 and 3 and bank 2 sensors 1, 2 and 3 are +present. That can never change, so it is recorded here instead of polled. + +Two still need samples: `F456` (three samples, all near zero) and `F458` +(one sample, `7F`, meaning unknown). + +Barometric pressure moved from `freq` 1 to `freq` 5 to pay for this. It does +not change at 1 Hz, and it was consuming 0.9 req/s of a budget with no slack. -Reading a reply — `7E8 04 62 F42F EC` is address, length, positive response, -echoed DID, then data. `7E8 03 7F 22 31` is a negative response: the DID -doesn't exist here. `NO DATA` means nothing answered at all. ### Safety diff --git a/TESTING.md b/TESTING.md index d8ea75d..eb2c046 100644 --- a/TESTING.md +++ b/TESTING.md @@ -174,9 +174,6 @@ moved" so far only means "never moved while parked." | `7E0` | `F41F` | 30 | Run time since start (PID 1F) | Records as a signal - this is the alias-mechanism test against standard 011F | | `7E1` | `1E6A` | 600 | Undecoded, constant 00 in 27 samples (all parked) | Drop if still flat after a full drive cycle | | `7E1` | `DD01` | 600 | Undecoded, constant 025166 in 1 samples (all parked) | Drop if still flat after a full drive cycle | -| `7E0` | `F416` | 300 | Raw single-byte probe from the ECM's own supported-PID bitmask decode; no data read yet | Whether it answers at all, and what payload width comes back | -| `7E0` | `F419` | 300 | Raw single-byte probe from the ECM's own supported-PID bitmask decode; no data read yet | Whether it answers at all, and what payload width comes back | -| `7E0` | `F41A` | 300 | Raw single-byte probe from the ECM's own supported-PID bitmask decode; no data read yet | Whether it answers at all, and what payload width comes back | | `7E0` | `F458` | 300 | Raw single-byte probe from the ECM's own supported-PID bitmask decode; no data read yet | Whether it answers at all, and what payload width comes back | | `7E0` | `F466` | 300 | Raw single-byte probe from the ECM's own supported-PID bitmask decode; no data read yet | Whether it answers at all, and what payload width comes back | | `7E0` | `F467` | 300 | Raw single-byte probe from the ECM's own supported-PID bitmask decode; no data read yet | Whether it answers at all, and what payload width comes back | @@ -185,6 +182,25 @@ moved" so far only means "never moved while parked." --- +## Set up for a long drive with off-roading + +A two-hour drive with light off-roading on 2026-09-20 was set up to exercise +the features that short commuter runs never touch. What was re-tiered for it, +and what to look for afterwards: + +| Command | `freq` | What the drive should produce | +|---|---|---| +| `7E0/F466` | 5 | Whether the 17.5% disagreement between the two mass airflow sensors holds up under load, or was an idle artifact | +| `795/1E88`, `795/1E89` | 30 | First data through a rear differential lock cycle. Both have been flat at `0000` and `09C4` on every sample ever taken | +| `7D3/3B4D` | 10 | Still returns `0` on every sample. A Terrain Response mode change is the only untried thing that would identify it | +| `7D3/3B01` | 10 | Three single-bit values seen so far. Enough samples across repeated height changes should map bit to height | +| `7E0/F470` | 15 | Ten undecoded bytes on a supercharged engine, under sustained load for the first time | +| `7E0/F42E` | 10 | Purge duty against fuel trims over two hours, which is the cleanest test of the stuck-purge-valve hypothesis | + +Barometric pressure dropped from `freq` 1 to `freq` 5 to pay for the above. +It does not change at 1 Hz and was taking 0.9 req/s of a budget that had no +slack. Total demand is 10.53 req/s across 85 commands. + ## Manual-probe-only DIDs The 2026-09-20 drive's biggest finding: 36 DIDs return `7F 22 31` (request diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 6f91a3d..58bebdf 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -58,11 +58,11 @@ "signals": [ {"id": "LR4_2A3C_RAW", "path": "ECU", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A3C Raw"} ]}, -{ "hdr": "795", "rax": "79D", "cmd": {"22": "1E88"}, "freq": 600, +{ "hdr": "795", "rax": "79D", "cmd": {"22": "1E88"}, "freq": 30, "signals": [ {"id": "LR4_1E88_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "1E88 Raw"} ]}, -{ "hdr": "795", "rax": "79D", "cmd": {"22": "1E89"}, "freq": 600, +{ "hdr": "795", "rax": "79D", "cmd": {"22": "1E89"}, "freq": 30, "signals": [ {"id": "LR4_1E89_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "1E89 Raw"} ]}, @@ -193,14 +193,13 @@ {"id": "LR4_O2_LAMBDA_B2", "path": "Engine", "fmt": { "len": 16, "max": 1.999, "div": 32768, "unit": "scalar" }, "name": "O2 Lambda B2S1"}, {"id": "LR4_O2_VOLTAGE_B2", "path": "Engine", "fmt": { "bix": 16, "len": 16, "max": 7.999, "div": 8192, "unit": "volts" }, "name": "O2 Voltage B2S1"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F42E"}, "freq": 20, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F42E"}, "freq": 10, "signals": [ {"id": "LR4_EVAP_PURGE", "path": "Fuel", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Commanded Evap Purge"} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F415"}, "freq": 20, "signals": [ - {"id": "LR4_O2_S2_VOLTAGE", "path": "Engine", "fmt": { "len": 8, "max": 1.275, "div": 200, "unit": "volts" }, "name": "O2 Voltage B1S2"}, - {"id": "LR4_O2_S2_TRIM", "path": "Fuel", "fmt": { "bix": 8, "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "O2 Trim B1S2"} + {"id": "LR4_O2_S2_VOLTAGE", "path": "Engine", "fmt": { "len": 8, "max": 1.275, "div": 200, "unit": "volts" }, "name": "O2 Voltage B1S2"} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F456"}, "freq": 60, "signals": [ @@ -214,41 +213,30 @@ "signals": [ {"id": "LR4_THROTTLE_B", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Absolute Throttle Position B"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F413"}, "freq": 600, - "signals": [ - {"id": "LR4_O2_PRESENT", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "O2 Sensors Present"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F416"}, "freq": 300, - "signals": [ - {"id": "LR4_416_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "416 Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F419"}, "freq": 300, - "signals": [ - {"id": "LR4_419_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "419 Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F41A"}, "freq": 300, - "signals": [ - {"id": "LR4_41A_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "41A Raw"} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F458"}, "freq": 300, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F458"}, "freq": 60, "signals": [ {"id": "LR4_458_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "458 Raw"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F466"}, "freq": 300, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F466"}, "freq": 5, "signals": [ - {"id": "LR4_466_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "466 Raw"} + {"id": "LR4_MAF_A", "path": "Engine", "fmt": { "bix": 8, "len": 16, "max": 2047.96, "div": 32, "unit": "gramsPerSecond" }, "name": "Mass Air Flow A"}, + {"id": "LR4_MAF_B", "path": "Engine", "fmt": { "bix": 24, "len": 16, "max": 2047.96, "div": 32, "unit": "gramsPerSecond" }, "name": "Mass Air Flow B"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F467"}, "freq": 300, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F467"}, "freq": 60, "signals": [ - {"id": "LR4_467_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "467 Raw"} + {"id": "LR4_COOLANT_TEMP_1", "path": "Engine", "fmt": { "bix": 8, "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Coolant Temp Sensor 1"}, + {"id": "LR4_COOLANT_TEMP_2", "path": "Engine", "fmt": { "bix": 16, "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Coolant Temp Sensor 2"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F468"}, "freq": 300, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F468"}, "freq": 60, "signals": [ - {"id": "LR4_468_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "468 Raw"} + {"id": "LR4_IAT_1", "path": "Engine", "fmt": { "bix": 8, "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Intake Air Temp Sensor 1"}, + {"id": "LR4_IAT_2", "path": "Engine", "fmt": { "bix": 16, "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Intake Air Temp Sensor 2"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F470"}, "freq": 300, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F470"}, "freq": 15, "signals": [ - {"id": "LR4_470_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "470 Raw"} + {"id": "LR4_F470_B1", "path": "Engine", "fmt": { "bix": 8, "len": 16, "max": 65535, "unit": "scalar" }, "name": "F470 Word 1"}, + {"id": "LR4_F470_B2", "path": "Engine", "fmt": { "bix": 24, "len": 16, "max": 65535, "unit": "scalar" }, "name": "F470 Word 2"}, + {"id": "LR4_F470_B3", "path": "Engine", "fmt": { "bix": 40, "len": 16, "max": 65535, "unit": "scalar" }, "name": "F470 Word 3"} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F404"}, "freq": 3, "signals": [ @@ -322,7 +310,7 @@ "signals": [ {"id": "LR4_DIST_SINCE_CLR", "path": "Trips", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "kilometers" }, "name": "Distance Since Codes Cleared", "suggestedMetric": "distanceSinceDTCsCleared"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F433"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F433"}, "freq": 5, "signals": [ {"id": "LR4_BARO", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "kilopascal" }, "name": "Barometric Pressure"}, {"id": "LR4_ALTITUDE", "path": "Movement", "name": "Altitude", "fmt": {"len": 8, "map": { diff --git a/tests/test_cases/2016/command_support.yaml b/tests/test_cases/2016/command_support.yaml index 51ab34e..f3265ce 100644 --- a/tests/test_cases/2016/command_support.yaml +++ b/tests/test_cases/2016/command_support.yaml @@ -140,11 +140,7 @@ supported_commands_by_ecu: - 7E0.22F40F - 7E0.22F410 - 7E0.22F411 - - 7E0.22F413 - 7E0.22F415 - - 7E0.22F416 - - 7E0.22F419 - - 7E0.22F41A - 7E0.22F41F - 7E0.22F421 - 7E0.22F42E From 870a59a43a657d3257c98beba8b9eb351733dcf9 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 20 Sep 2026 15:00:24 -0600 Subject: [PATCH 74/84] F470 was boost pressure all along Read against the SAE J1979 definition of PID 70, the ten bytes we were storing as three anonymous words are commanded and measured boost for two channels at 1/32 kPa. The support byte says channel A exists and it reads 24.72 kPa at idle. First direct boost measurement on this truck - the boost ratio synthetic has only ever inferred it from MAP over barometric - and it costs nothing, because the reply was already arriving. Checked every other command the same way against the canonical SAE signalset. Nothing else is being left behind: the unread fields are sensor-present bits and channels a V6 does not have. Also recorded what Jaguar does for tire pressures, since it fills eight metric slots we leave empty. Its 751 is silent here across 1386 attempts, but its temperature DIDs 2A0A-2A0D have never been sent to a module that answers, which is a parked sweep rather than a drive. --- README.md | 17 ++++++++++++++++- TESTING.md | 27 +++++++++++++++++++++++++++ signalsets/v3/default.json | 7 ++++--- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index a346494..e90c1f0 100644 --- a/README.md +++ b/README.md @@ -688,7 +688,7 @@ tested the same day. **All sixteen answered.** Ten earn their place. | `22F438` | Bank 2 lambda 0.853-1.985 over 29 valid samples; railed at `FFFF` on 23 of 52 | | `22F415` | Post-catalyst O2, 0.13-0.93 V and switching | | `22F445` / `22F447` | Relative throttle 2.7-22.7%, absolute throttle B 12.5-22.4% | -| `22F470` | Ten data bytes, undecoded | +| `22F470` | **Boost pressure.** Decoded against SAE J1979 PID 70: sensor A reads 24.72 kPa at idle | **The dual mass airflow sensors are the find.** MAF calibration was one of three candidate explanations for both banks correcting lean together, and @@ -718,6 +718,21 @@ present. That can never change, so it is recorded here instead of polled. Two still need samples: `F456` (three samples, all near zero) and `F458` (one sample, `7F`, meaning unknown). +`F470` was the one command still leaving something on the table. Read +against the SAE J1979 definition of PID 70 its ten bytes are commanded boost +and measured boost for two channels, at 1/32 kPa. The support byte is `0x02`, +which flags channel A as present, and channel A reads 24.72 kPa at idle. +**This is the first direct boost measurement on this truck** — everything +before it was inferred from manifold pressure over barometric. It costs no +extra requests; the reply was already arriving and being thrown away. + +Checking the rest of the signalset the same way found nothing else. Against +the canonical SAE signalset, the only other unread fields in replies we +already make are sensor-present bits and channels this engine does not have: +`F468` carries six intake air temperature slots and answers `FF` on four, +`F466` and `F467` expose support bits for sensors we already read, and +`F408`/`F409` reserve a second byte for bank 4, which a V6 does not have. + Barometric pressure moved from `freq` 1 to `freq` 5 to pay for this. It does not change at 1 Hz, and it was consuming 0.9 req/s of a budget with no slack. diff --git a/TESTING.md b/TESTING.md index eb2c046..e7c0c0a 100644 --- a/TESTING.md +++ b/TESTING.md @@ -24,6 +24,33 @@ not on suspicion. --- +## Tire pressures: what the Jaguar signalset suggests + +Jaguar reads all four tire pressures and temperatures, and fills eight Pelican +metric slots this truck leaves empty. It does it on header `751`, response +`759`, with DIDs `2076`-`2079` for pressure at 1/0.01373 bar and `2A0A`-`2A0D` +for temperature at -50 °C offset. + +On this truck `751` is silent. It has been asked `2076`-`2079` 1,386 times +each and answers `NO DATA` every time, and it does not answer `0100` or +`0902` either, so nothing is listening at that address. + +But the temperature DIDs have never been tried anywhere useful. `2A0A`-`2A0D` +have only ever gone to header `710` and to `FC00F1`, both of which are silent. +They have never been sent to a module that actually answers. + +- [ ] **Sweep `2A0A`-`2A0D` across every module that responds** — `716`, + `726`, `732`, `734`, `737`, `760`, `761`, `792`, `795`, `797`, `7D3`. About + 45 requests, parked, a couple of minutes. `2076` has already been tried on + `716`, `726`, `734`, `737`, `760` and `797` and drew `7F 22 31` from the + live ones, meaning those modules are there but do not carry that DID. +- [ ] **Try `2076`-`2079` on `761` and `7D3`**, the two answering modules that + were skipped in the earlier round. + +The spare tire warning proves the sensors exist. Something is receiving them. + +--- + ## Terminal cheat sheet The adapter terminal puts you on the CAN bus as a diagnostic tester. Everything diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 58bebdf..5050b62 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -234,9 +234,10 @@ ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F470"}, "freq": 15, "signals": [ - {"id": "LR4_F470_B1", "path": "Engine", "fmt": { "bix": 8, "len": 16, "max": 65535, "unit": "scalar" }, "name": "F470 Word 1"}, - {"id": "LR4_F470_B2", "path": "Engine", "fmt": { "bix": 24, "len": 16, "max": 65535, "unit": "scalar" }, "name": "F470 Word 2"}, - {"id": "LR4_F470_B3", "path": "Engine", "fmt": { "bix": 40, "len": 16, "max": 65535, "unit": "scalar" }, "name": "F470 Word 3"} + {"id": "LR4_BOOST_CMD_A", "path": "Engine", "fmt": { "bix": 8, "len": 16, "max": 2047.96875, "div": 32, "unit": "kilopascal" }, "name": "Commanded Boost Pressure A"}, + {"id": "LR4_BOOST_A", "path": "Engine", "fmt": { "bix": 24, "len": 16, "max": 2047.96875, "div": 32, "unit": "kilopascal" }, "name": "Boost Pressure Sensor A"}, + {"id": "LR4_BOOST_CMD_B", "path": "Engine", "fmt": { "bix": 40, "len": 16, "max": 2047.96875, "div": 32, "unit": "kilopascal" }, "name": "Commanded Boost Pressure B"}, + {"id": "LR4_BOOST_B", "path": "Engine", "fmt": { "bix": 56, "len": 16, "max": 2047.96875, "div": 32, "unit": "kilopascal" }, "name": "Boost Pressure Sensor B"} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F404"}, "freq": 3, "signals": [ From 0e6a50c5887d0449c5dc0c9b048f33a140ff9070 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 20 Sep 2026 15:07:05 -0600 Subject: [PATCH 75/84] hide the probes, and write down what the odd ones actually mean Twenty-nine signals are raw probes or byte splits that nobody can read yet. They belong in the log, not on the screen, so they get hidden: true. SAE J1979 hides 76 of its 294 the same way; we were hiding none of 98. Twenty-three get a description, aimed at the ones that would mislead a reader who trusted the name: the height sensors are inverted, bank 2 lambda rails at FFFF about half the time and those samples are invalid rather than lean, altitude is a barometric lookup and not GPS, and 3B4D is emphatically not the drive mode its old name claimed. Also recorded why sixteen metric slots is the ceiling rather than an oversight. Of the twenty unfilled, ten are electric-vehicle only, eight are tires we cannot read yet, and the last two need data this ECM does not produce. fuelRate cannot be faked with a synthetic either - the only supported formula op is a plain ratio with no constant, so the number would be wrong by a factor of fourteen. An empty slot beats a wrong gauge. --- README.md | 33 ++++++++++++++++ signalsets/v3/default.json | 78 +++++++++++++++++++------------------- 2 files changed, 72 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index e90c1f0..06a33a3 100644 --- a/README.md +++ b/README.md @@ -737,6 +737,39 @@ Barometric pressure moved from `freq` 1 to `freq` 5 to pay for this. It does not change at 1 Hz, and it was consuming 0.9 req/s of a budget with no slack. +### Metric slots, and why sixteen is the ceiling + +The schema defines 36 `suggestedMetric` values — the slots Pelican treats as +connectable. This signalset fills 16. The other 20 break down as: + +| Slots | Why they stay empty | +|---|---| +| 10 | Electric and hybrid only: state of charge and health, traction battery, charging, electric range, CVT deterioration | +| 8 | Tire pressure and temperature, which this truck has not yet given up | +| 2 | `fuelRate` needs PID 5E, which this ECM's own bitmask does not list, and `fuelRange` is a proprietary Ford DID | + +Nothing else can be claimed honestly. A synthetic could not rescue `fuelRate` +either: the only formula operation the schema supports is `ratio`, a plain +a divided by b with no constant and no scaling, so mass air flow over +commanded lambda would land in the slot at fourteen-odd times the real value. +An empty slot is better than a wrong gauge. + +Tire pressure is the one worth chasing. Eight of the twenty are tires, and +`TESTING.md` records what the Jaguar signalset does and what has never been +tried here. + +### Hidden signals + +Twenty-nine of the 98 signals carry `hidden: true`: every `*_RAW` probe and +the `3B02` byte splits. They are still recorded, they simply do not clutter +the app with values nobody can interpret yet. A probe earns its way out of +hiding by being decoded and named. + +Twenty-three signals carry a `description`, concentrated on the probes and on +the decoded signals with a catch — the inverted height sensors, the bank 2 +lambda that rails at `FFFF`, altitude being a barometric lookup rather than +GPS. + ### Safety Service `22` is read-only by definition and cannot change vehicle state. It diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 5050b62..b7908f4 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -12,87 +12,87 @@ ]}, { "hdr": "761", "rax": "769", "cmd": {"22": "197C"}, "freq": 30, "signals": [ - {"id": "LR4_197C_RAW", "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "197C Raw"} + {"id": "LR4_197C_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "197C Raw", "description": "Undecoded. Nine distinct values in fourteen samples, the most variable unmined DID on the truck."} ]}, { "hdr": "761", "rax": "769", "cmd": {"22": "D11C"}, "freq": 30, "signals": [ - {"id": "LR4_D11C_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "D11C Raw"} + {"id": "LR4_D11C_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "D11C Raw", "description": "Undecoded. Ranges 0x3A to 0x41, which would be a plausible temperature."} ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A32"}, "freq": 600, "signals": [ - {"id": "LR4_2A32_RAW", "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A32 Raw"} + {"id": "LR4_2A32_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A32 Raw"} ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A33"}, "freq": 600, "signals": [ - {"id": "LR4_2A33_RAW", "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A33 Raw"} + {"id": "LR4_2A33_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A33 Raw"} ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A34"}, "freq": 600, "signals": [ - {"id": "LR4_2A34_RAW", "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A34 Raw"} + {"id": "LR4_2A34_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A34 Raw"} ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A35"}, "freq": 600, "signals": [ - {"id": "LR4_2A35_RAW", "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A35 Raw"} + {"id": "LR4_2A35_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A35 Raw"} ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A37"}, "freq": 600, "signals": [ - {"id": "LR4_2A37_RAW", "path": "ECU", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A37 Raw"} + {"id": "LR4_2A37_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A37 Raw"} ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A38"}, "freq": 600, "signals": [ - {"id": "LR4_2A38_RAW", "path": "ECU", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A38 Raw"} + {"id": "LR4_2A38_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A38 Raw"} ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A39"}, "freq": 600, "signals": [ - {"id": "LR4_2A39_RAW", "path": "ECU", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A39 Raw"} + {"id": "LR4_2A39_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A39 Raw"} ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A3A"}, "freq": 600, "signals": [ - {"id": "LR4_2A3A_RAW", "path": "ECU", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A3A Raw"} + {"id": "LR4_2A3A_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A3A Raw"} ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A3B"}, "freq": 600, "signals": [ - {"id": "LR4_2A3B_RAW", "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A3B Raw"} + {"id": "LR4_2A3B_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A3B Raw"} ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A3C"}, "freq": 600, "signals": [ - {"id": "LR4_2A3C_RAW", "path": "ECU", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A3C Raw"} + {"id": "LR4_2A3C_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A3C Raw"} ]}, { "hdr": "795", "rax": "79D", "cmd": {"22": "1E88"}, "freq": 30, "signals": [ - {"id": "LR4_1E88_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "1E88 Raw"} + {"id": "LR4_1E88_RAW", "hidden": true, "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "1E88 Raw", "description": "Undecoded rear differential DID. Flat at 0000 on every sample so far; a lock cycle is the test."} ]}, { "hdr": "795", "rax": "79D", "cmd": {"22": "1E89"}, "freq": 30, "signals": [ - {"id": "LR4_1E89_RAW", "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "1E89 Raw"} + {"id": "LR4_1E89_RAW", "hidden": true, "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "1E89 Raw", "description": "Undecoded rear differential DID. Flat at 09C4 on every sample so far."} ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B00"}, "freq": 30, "signals": [ - {"id": "LR4_3B00_RAW", "path": "Suspension", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "3B00 Raw"} + {"id": "LR4_3B00_RAW", "hidden": true, "path": "Suspension", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "3B00 Raw", "description": "Undecoded suspension DID. Flat through a real ride-height change, but on three samples only."} ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B01"}, "freq": 10, "signals": [ - {"id": "LR4_3B01_RAW", "path": "Suspension", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "3B01 Raw"} + {"id": "LR4_3B01_RAW", "hidden": true, "path": "Suspension", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "3B01 Raw", "description": "Ride-height state word. Returns single-bit values (0x100, 0x400, 0x800); which bit means which height is not yet known."} ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B08"}, "freq": 30, "signals": [ - {"id": "LR4_3B08_RAW", "path": "Suspension", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "3B08 Raw"} + {"id": "LR4_3B08_RAW", "hidden": true, "path": "Suspension", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "3B08 Raw", "description": "Undecoded suspension DID. Flat through a real ride-height change, but on three samples only."} ]}, { "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E6A"}, "freq": 600, "signals": [ - {"id": "LR4_1E6A_RAW", "path": "Drivetrain", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1E6A Raw"} + {"id": "LR4_1E6A_RAW", "hidden": true, "path": "Drivetrain", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1E6A Raw", "description": "Undecoded transmission DID, neighbour of the gearbox temperature."} ]}, { "hdr": "7E1", "rax": "7E9", "cmd": {"22": "DD01"}, "freq": 600, "signals": [ - {"id": "LR4_DD01_RAW", "path": "Drivetrain", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "DD01 Raw"} + {"id": "LR4_DD01_RAW", "hidden": true, "path": "Drivetrain", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "DD01 Raw"} ]}, { "hdr": "726", "rax": "72E", "cmd": {"22": "0202"}, "freq": 60, "signals": [ - {"id": "LR4_726_0202_RAW", "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "726 0202 Raw"} + {"id": "LR4_726_0202_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "726 0202 Raw", "description": "The only non-identification DID ever found on module 726, from a sweep of 0000-03FF. Has only ever returned 00."} ]}, { "hdr": "792", "rax": "79A", "cmd": {"22": "2A36"}, "freq": 30, "signals": [ - {"id": "LR4_2A36_RAW", "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A36 Distance Counter"} + {"id": "LR4_2A36_RAW", "hidden": true, "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A36 Distance Counter"} ]}, { "hdr": "795", "cmd": {"22": "1E8A"}, "freq": 5, "signals": [ @@ -104,10 +104,10 @@ ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B02"}, "freq": 30, "signals": [ - {"id": "LR4_3B02_B0", "path": "Suspension", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "3B02 Byte 1"}, - {"id": "LR4_3B02_B1", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 255, "unit": "scalar" }, "name": "3B02 Byte 2"}, - {"id": "LR4_3B02_B2", "path": "Suspension", "fmt": {"bix": 16, "len": 8, "max": 255, "unit": "scalar" }, "name": "3B02 Byte 3"}, - {"id": "LR4_3B02_B3", "path": "Suspension", "fmt": {"bix": 24, "len": 8, "max": 255, "unit": "scalar" }, "name": "3B02 Byte 4"} + {"id": "LR4_3B02_B0", "hidden": true, "path": "Suspension", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "3B02 Byte 1"}, + {"id": "LR4_3B02_B1", "hidden": true, "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 255, "unit": "scalar" }, "name": "3B02 Byte 2"}, + {"id": "LR4_3B02_B2", "hidden": true, "path": "Suspension", "fmt": {"bix": 16, "len": 8, "max": 255, "unit": "scalar" }, "name": "3B02 Byte 3"}, + {"id": "LR4_3B02_B3", "hidden": true, "path": "Suspension", "fmt": {"bix": 24, "len": 8, "max": 255, "unit": "scalar" }, "name": "3B02 Byte 4"} ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B03"}, "freq": 10, "signals": [ @@ -131,7 +131,7 @@ ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B0B"}, "freq": 30, "signals": [ - {"id": "LR4_3B0B_RAW", "path": "Suspension", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "3B0B Raw"} + {"id": "LR4_3B0B_RAW", "hidden": true, "path": "Suspension", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "3B0B Raw", "description": "Undecoded suspension DID, narrow range around 0x3D5."} ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B3C"}, "freq": 10, "signals": [ @@ -145,15 +145,15 @@ ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B4D"}, "freq": 10, "signals": [ - {"id": "LR4_3B4D_RAW", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "3B4D Raw"} + {"id": "LR4_3B4D_RAW", "hidden": true, "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "3B4D Raw", "description": "Previously labelled Drive Mode, which it is not: it has read 0 on every sample ever taken, including through ride-height changes. A Terrain Response change is the untried test."} ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B71"}, "freq": 10, "signals": [ - {"id": "LR4_RIDE_HEIGHT_FRONT", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "Height Sensor Front (inverted)"} + {"id": "LR4_RIDE_HEIGHT_FRONT", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "Height Sensor Front (inverted)", "description": "Inverted: a falling value means the truck is rising."} ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B72"}, "freq": 10, "signals": [ - {"id": "LR4_RIDE_HEIGHT_REAR", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "Height Sensor Rear (inverted)"} + {"id": "LR4_RIDE_HEIGHT_REAR", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "Height Sensor Rear (inverted)", "description": "Inverted: a falling value means the truck is rising."} ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "D11A"}, "freq": 10, "signals": [ @@ -186,11 +186,11 @@ { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F403"}, "freq": 10, "signals": [ {"id": "LR4_FUEL_SYS_B1", "path": "Fuel", "fmt": { "len": 8, "max": 255, "map": { "1": { "description": "Open loop, engine cold", "value": "OpenLoopCold" }, "2": { "description": "Closed loop", "value": "ClosedLoop" }, "4": { "description": "Open loop, load or decel fuel cut", "value": "OpenLoopLoad" }, "8": { "description": "Open loop, system fault", "value": "OpenLoopFault" }, "16": { "description": "Closed loop with a feedback fault", "value": "ClosedLoopFault" } } }, "name": "Fuel System Status B1"}, - {"id": "LR4_FUEL_SYS_B2", "path": "Fuel", "fmt": { "bix": 8, "len": 8, "max": 255, "unit": "scalar" }, "name": "Fuel System Status B2"} + {"id": "LR4_FUEL_SYS_B2", "path": "Fuel", "fmt": { "bix": 8, "len": 8, "max": 255, "unit": "scalar" }, "name": "Fuel System Status B2", "description": "Bank 2 fuel system status. Has mirrored bank 1 on every sample so far."} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F438"}, "freq": 10, "signals": [ - {"id": "LR4_O2_LAMBDA_B2", "path": "Engine", "fmt": { "len": 16, "max": 1.999, "div": 32768, "unit": "scalar" }, "name": "O2 Lambda B2S1"}, + {"id": "LR4_O2_LAMBDA_B2", "path": "Engine", "fmt": { "len": 16, "max": 1.999, "div": 32768, "unit": "scalar" }, "name": "O2 Lambda B2S1", "description": "Bank 2 sensor 1. Rails at FFFF on roughly half of samples; treat those as invalid rather than lean."}, {"id": "LR4_O2_VOLTAGE_B2", "path": "Engine", "fmt": { "bix": 16, "len": 16, "max": 7.999, "div": 8192, "unit": "volts" }, "name": "O2 Voltage B2S1"} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F42E"}, "freq": 10, @@ -215,12 +215,12 @@ ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F458"}, "freq": 60, "signals": [ - {"id": "LR4_458_RAW", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "458 Raw"} + {"id": "LR4_458_RAW", "hidden": true, "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "458 Raw", "description": "Undecoded. The ECM reports PID 58 as supported; one sample so far, 0x7F."} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F466"}, "freq": 5, "signals": [ - {"id": "LR4_MAF_A", "path": "Engine", "fmt": { "bix": 8, "len": 16, "max": 2047.96, "div": 32, "unit": "gramsPerSecond" }, "name": "Mass Air Flow A"}, - {"id": "LR4_MAF_B", "path": "Engine", "fmt": { "bix": 24, "len": 16, "max": 2047.96, "div": 32, "unit": "gramsPerSecond" }, "name": "Mass Air Flow B"} + {"id": "LR4_MAF_A", "path": "Engine", "fmt": { "bix": 8, "len": 16, "max": 2047.96, "div": 32, "unit": "gramsPerSecond" }, "name": "Mass Air Flow A", "description": "One of two intake tract sensors. A and B disagreed by 17.5% on the single sample taken at idle; they sum to roughly what the single MAF PID reports."}, + {"id": "LR4_MAF_B", "path": "Engine", "fmt": { "bix": 24, "len": 16, "max": 2047.96, "div": 32, "unit": "gramsPerSecond" }, "name": "Mass Air Flow B", "description": "One of two intake tract sensors. See Mass Air Flow A."} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F467"}, "freq": 60, "signals": [ @@ -235,9 +235,9 @@ { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F470"}, "freq": 15, "signals": [ {"id": "LR4_BOOST_CMD_A", "path": "Engine", "fmt": { "bix": 8, "len": 16, "max": 2047.96875, "div": 32, "unit": "kilopascal" }, "name": "Commanded Boost Pressure A"}, - {"id": "LR4_BOOST_A", "path": "Engine", "fmt": { "bix": 24, "len": 16, "max": 2047.96875, "div": 32, "unit": "kilopascal" }, "name": "Boost Pressure Sensor A"}, + {"id": "LR4_BOOST_A", "path": "Engine", "fmt": { "bix": 24, "len": 16, "max": 2047.96875, "div": 32, "unit": "kilopascal" }, "name": "Boost Pressure Sensor A", "description": "Decoded against SAE J1979 PID 70. The support byte reports channel A present and channel B absent, so the B signals are expected to read zero."}, {"id": "LR4_BOOST_CMD_B", "path": "Engine", "fmt": { "bix": 40, "len": 16, "max": 2047.96875, "div": 32, "unit": "kilopascal" }, "name": "Commanded Boost Pressure B"}, - {"id": "LR4_BOOST_B", "path": "Engine", "fmt": { "bix": 56, "len": 16, "max": 2047.96875, "div": 32, "unit": "kilopascal" }, "name": "Boost Pressure Sensor B"} + {"id": "LR4_BOOST_B", "path": "Engine", "fmt": { "bix": 56, "len": 16, "max": 2047.96875, "div": 32, "unit": "kilopascal" }, "name": "Boost Pressure Sensor B", "description": "Channel B is reported absent by the support byte; expected to read zero."} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F404"}, "freq": 3, "signals": [ @@ -261,7 +261,7 @@ ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F409"}, "freq": 30, "signals": [ - {"id": "LR4_LONGFT2", "path": "Fuel", "fmt": { "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "Long Term Fuel Trim B2"} + {"id": "LR4_LONGFT2", "path": "Fuel", "fmt": { "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "Long Term Fuel Trim B2", "description": "Bank 2. There is no long-term fuel trim metric slot, so this does not surface as a connectable."} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40B"}, "freq": 1, "signals": [ @@ -314,7 +314,7 @@ { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F433"}, "freq": 5, "signals": [ {"id": "LR4_BARO", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "kilopascal" }, "name": "Barometric Pressure"}, - {"id": "LR4_ALTITUDE", "path": "Movement", "name": "Altitude", "fmt": {"len": 8, "map": { + {"id": "LR4_ALTITUDE", "path": "Movement", "name": "Altitude", "description": "Derived from barometric pressure by lookup, not from GPS. Accurate to a few hundred feet and wrong in unusual weather.", "fmt": {"len": 8, "map": { "55": { "description": "15,955 ft", "value": "15,955 ft" }, "56": { "description": "15,511 ft", "value": "15,511 ft" }, "57": { "description": "15,073 ft", "value": "15,073 ft" }, @@ -412,7 +412,7 @@ ]}, { "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E68"}, "freq": 30, "signals": [ - {"id": "LR4_1E68_RAW", "path": "Transmission", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "1E68 Raw (varies most)"} + {"id": "LR4_1E68_RAW", "hidden": true, "path": "Transmission", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "1E68 Raw (varies most)", "description": "Undecoded transmission DID, neighbour of the gearbox temperature."} ]}, { "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E69"}, "freq": 5, "signals": [ From 224c17e5b7d4720f47c4dde4722074d1077af860 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 20 Sep 2026 18:33:23 -0600 Subject: [PATCH 76/84] fit the budget the adapter actually gives us The app never gives signalset traffic more than about 4.2 req/s. Measured over seven sessions: 108 distinct DIDs got 4.19 req/s, 23 DIDs got 4.22. The adapter's 13.4 req/s is real but the app spends 3.3 on AT commands and 5.9 on its own mode-01 polling. We had been asking for 10.53 against a ceiling of 11 that was never ours to spend. Overdrawing it has a cost that isn't slower polling. The app retires ECUs and never retries them: 726 and 761 went at 10:59, 732 and 792 at 12:40, 7D3 at 14:07, all while answering correctly. On the 137-minute drive that followed, 61 of 84 commands were never sent once. The off-road tests were all aimed at 7D3 and collected nothing. Cut to 66 commands at 3.922 req/s. Nineteen deleted as dead across all logged history, not one drive, including 3B4D, which was the Terrain Response candidate and is constant zero across 236 samples spanning several modes. Engine speed is back on a real cadence. Three duplicates proven by correlation and resolved: PID 67 sensor 1 is the coolant PID to 0.0 C over 135 pairs; PID 70 channel A is manifold pressure to 1.3 kPa over 525 pairs, not a separate boost sensor; the proprietary oil temp DID is standard PID 5C to 0.7 C over 1,135 pairs. PID 67 sensor 2 turns out to be the supercharger intercooler's low temperature circuit, which is new. Ride height Access never registered because 3B3C is a bitfield, not an ordinal. 0x04 is Access and was not in the map; the 0 we had labelled Access never occurs. Pinned against the inverted front height sensor. Fuel rate is computed. The ECM's bitmask says PID 5E is unsupported, so it is derived from MAF and commanded lambda with the constant folded into a hidden operand, since synthetics only allow a bare ratio. Integrates to 11.21 L against 9.48 L from the tank gauge over 91.5 km. Corrects two claims made earlier today: F470 is manifold pressure at finer resolution rather than boost, and the two MAF channels do not sum to the single MAF PID. That rested on one idle sample; 1,474 samples give a least-squares slope of 0.88 with scatter too wide to trust the split. Also documents that the app only ever stores signals carrying a suggestedMetric. Fifteen distinct signals in fifteen months. Everything else is polled and thrown away. --- CLAUDE.md | 77 +++- README.md | 511 ++++++++++++++++----- TESTING.md | 61 ++- signalsets/v3/default.json | 210 +++------ tests/test_cases/2016/command_support.yaml | 21 - 5 files changed, 552 insertions(+), 328 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index e033e39..78a7830 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -12,7 +12,7 @@ repeat it. ## Layout -- `signalsets/v3/default.json` — the signalset itself, 109 commands. The +- `signalsets/v3/default.json` — the signalset itself, 66 commands. The only file the app actually consumes. - `tests/test_cases/2016/command_support.yaml` — manifest of which commands each ECU supports, used by the test suite. @@ -36,10 +36,15 @@ repeat it. is often just addressed at the wrong offset for that module. - **`freq` is an interval in seconds, not a rate.** A lower number polls harder. Total demand is `sum(1/freq)` across all commands and must stay - under roughly 11 req/s, which is what the adapter actually delivers. - Current demand is 10.99 — there is almost no headroom. Adding a command - means trading it against a deletion or giving it a slow cadence (120s or - 600s). + under **4.2 req/s**, which is measured, not assumed. The adapter delivers + about 13.4 req/s in total, but the app spends roughly 3.3 of that on AT + commands and 5.9 on its own internal mode-01 polling, which never + surfaces as a recordable signal. Signalset traffic gets what is left. + Measured across seven sessions, the UDS service-22 share stayed between + 4.1 and 5.1 req/s no matter how big the signalset was: one session polled + 108 distinct DIDs at 4.19 req/s and another polled 23 at 4.22 req/s. + Current demand is 3.922. Asking for more than the app can deliver does + not slow everything down evenly — see trap 5. ## Validation @@ -100,7 +105,7 @@ run the actual response tests outside CI. These have all actually bitten: 1. **YAML float trap.** In `command_support.yaml`, a plain-scalar entry made - up only of digits and dots (e.g. `726.220202`) parses as a YAML float, + up only of digits and dots (e.g. `751.222076`) parses as a YAML float, not a string, unless it's quoted. Any entry with no hex letter A–F anywhere in it must be double-quoted. After editing this file, verify no entry parsed as a non-string (see the validation command above). @@ -112,7 +117,7 @@ These have all actually bitten: compute. Grep `synthetics` for a signal id before deleting the command that defines it. 3. **Entry shape differs per ECU in `command_support.yaml`.** Most ECUs use - `.22` (e.g. `795.221E89`). `7E1` in the `supported_commands_by_ecu` + `.22` (e.g. `795.221E8A`). `7E1` in the `supported_commands_by_ecu` section uses `..22` (e.g. `7E1.7E9.221E69`). There is no reason for the difference — `7E1`'s `rax` is `7E9`, exactly `hdr+8`, the same as everywhere else. It is just how that block was written. Match @@ -123,15 +128,55 @@ These have all actually bitten: the main checkout, or the agent must be told explicitly to check out that branch — otherwise it silently operates on stale files and produces confident, wrong results. -5. **Eight commands have not been polled since 2026-08-30** — `F40C`, - `F411`, `F40E`, `F443`, `F449`, `F44A`, `F407`, `033E` — despite being - present in the signalset with sane `freq` values and the request budget - having headroom at the time. Engine speed has therefore never actually - been recorded as a signal, even though the command is in the file and - the underlying standard PID is being polled constantly. Cause unknown; - see the "Eight commands stopped being polled" section in `README.md`. - **A command's presence in this file does not mean it is actually being - collected** — check the scan logs before relying on one. +5. **The app retires ECUs permanently when the signalset overdraws its + request budget, and it never retries them.** Measured on 2026-09-20: at + 09:57 the app addressed every header the signalset names; by 10:59 it + had stopped addressing `726` and `761`; by 12:40 `732` and `792`; by + 14:07 `7D3`. The modules were answering correctly when they were + dropped. On the 137-minute drive that followed, 61 of 84 commands were + never sent once — not throttled, never requested. **A command's presence + in this file does not mean it is being collected.** Check the scan logs + before relying on one. Nothing in this repo can un-retire a module; the + app's learned vehicle profile has to be reset from inside the app. The + defence is to stay under the 4.2 req/s ceiling and to delete commands + that have been proven dead rather than leaving them in at a slow `freq`, + because each one still costs a module-discovery attempt. + +6. **Standard mode-01 PIDs are already being polled by the app, constantly, + and a proprietary DID may duplicate one.** Before adding a signal, check + whether the truck already answers it somewhere cheaper, and check whether + two DIDs you both poll are the same measurement. Three duplicates have + been found this way by correlating logged samples: PID 67 sensor 1 equals + the engine coolant PID to 0.0 C over 135 pairs; PID 70 channel A equals + manifold pressure to 1.3 kPa over 525 pairs; and the proprietary oil + temperature DID equals standard PID 5C to 0.7 C over 1,135 pairs once + warm. Correlate against the scan logs before believing a new DID is new. + +7. **Synthetic signals support only `op: ratio`, a plain a/b with no + constant** — but `fmt.div` on an ordinary signal is a `number`, not an + integer, so a scaling constant can be folded into a hidden operand and + the ratio then comes out in real units. `LR4_FUEL_RATE` is built that + way: `LR4_FUEL_DIVISOR` is commanded lambda premultiplied by + 14.7 x 745 / 3600, so MAF divided by it is litres per hour. + +8. **Only signals carrying a `suggestedMetric` are ever written to the + app's signal database.** Measured over fifteen months of backups: the + store has held exactly 15 distinct signals, and they are precisely the + ones with a metric. Everything else is requested, answered, decoded and + discarded. During a 137-minute drive on 2026-09-20 the 14 signals + recorded were exactly the metric-carrying signals on commands that were + being polled; the two metric-carrying signals that were missing + (`engineSpeed`, `absoluteEngineLoad`) were missing because their + commands were not polled at all. The other two stores in the backup are + not alternatives: `records` holds manual service and fuel entries, and + `tripLogger` holds the phone's own GPS trace. + + The metric enum has 36 values and no slot for manifold pressure, ride + height, suspension pressure, charge air temperature or anything else + specific to this truck. So most of what this signalset decodes can be + watched live but can never be looked at historically except by reading + the scan logs. Weigh that before spending budget on a signal: a fast + `freq` on a signal with no metric buys a live readout and nothing else. ## Where the data comes from diff --git a/README.md b/README.md index 06a33a3..67a6711 100644 --- a/README.md +++ b/README.md @@ -142,6 +142,43 @@ fuel cut — injectors fully off while coasting, sensor reading pure air. --- +## Duplicates found and removed + +Four signals were checked against another reading of the same physical +quantity, using paired samples across logged history rather than a single +drive. Two turned out to be the same measurement and were dropped; two +turned out to be genuinely separate sensors and were kept. + +**PID 67 sensor 1 is the engine coolant PID.** Mean difference 0.0°C over +135 paired samples. Deleted. Sensor 2 of the same PID is kept, renamed to +Charge Cooler Coolant Temp: it ran 11.7°C above ambient and 24°C below +charge air temperature over those same samples, which is where the AJ126's +separate low-temperature intercooler circuit belongs. A genuinely new +signal, not a rename in name only. + +**PID 70 channel A is manifold pressure, at finer resolution — not a +separate boost sensor.** This corrects "F470 was boost pressure all along," +decoded earlier the same day. PID 70's support byte reads `0x02`; three of +its four defined channels read constant zero across 525 samples and were +dropped. The fourth, channel A, tracks Manifold Pressure to within 1.3 kPa +mean over 525 pairs (r = 0.85) — the same manifold sensor, reported at 1/32 +kPa instead of 1 kPa, not a pre-throttle sensor. Kept, renamed to Manifold +Pressure (Fine), slowed to 120s since the extra resolution isn't worth a +faster poll. + +**The proprietary oil temperature DID and standard PID 5C agree to 0.7°C** +over 1,135 paired samples once warm, diverging by up to 15°C during +warm-up with PID 5C reading higher. Dropping PID 5C earlier was correct, +and it stays out. + +**PID 68 sensor 2 tracks the proprietary charge air temperature DID to +2.7°C mean** — close to redundant, but kept: sensor 1 of the same PID is +the pre-supercharger inlet, running 9.2°C above ambient, and is a real +second reading the truck doesn't report anywhere else. Both kept at 120s +with descriptions. + +--- + ## Drivetrain | Signal | Address | Notes | @@ -162,13 +199,20 @@ All four corners report gauge pressure in the air spring. | Pressure Rear Left / Right | `7D3` `223B06` / `223B05` | | Height Offset | `7D3` `222B12` | Signed, millimetres from nominal | | Compressor Activity | `7D3` `223B07` | ~110 at rest, over 1,300 while the truck raises | -| Ride Height Mode | `7D3` `223B3C` | 1 normal, 2 raised — both confirmed. Two more values, `0D` and `04`, turned up during a ride-height change on 2026-09-20 and aren't explained yet | +| Ride Height Mode | `7D3` `223B3C` | Enum: 1 Normal, 2 Off-Road, 4 Access, 13 In Transit. Corrected 2026-09-20 — see "Air suspension notes" under Off-road | | Height Sensor Front / Rear | `7D3` `223B71` / `223B72` | **Inverted** — falls as the truck rises | | Module Voltage | `7D3` `22D11A` | Should mirror battery voltage | Normal standing pressures are roughly 40 psi per corner at normal ride height, rising with load and with raised height modes. +**None of this module's signals carry a `suggestedMetric`, and the app +only ever stores signals that do** — see "The app only ever stores signals +that carry a `suggestedMetric`" under Polling. Corner pressures, ride +height, compressor activity and module voltage are all live-only: even +once `7D3` is un-retired and answering again, nothing from this table will +ever show up in the app's own history, only in the raw scan logs. + --- ## Reading signals together @@ -230,10 +274,13 @@ both; disagreement localises the fault. | Pair | Should agree within | |---|---| -| Oil Temp vs Oil Temp (SAE) | A few degrees | -| Fuel Rail Pressure vs SAE equivalent | Similar magnitude at steady idle | | Accelerator Pedal D vs E | A percent or two — they're redundant by design | +Oil Temp and Fuel Rail Pressure each had an SAE alias checked against the +proprietary signal early on (0.7°C and similar magnitude respectively); +both aliases were dropped as duplicates and are gone from this file, so +there's nothing left to cross-check them against day to day. + Pedal D and E disagreeing is significant: the ECU compares them itself and will enter limp mode if they diverge. @@ -269,9 +316,14 @@ positive trim. ## Computed signals -The signalset defines eight synthetic signals. Each is a **ratio between two -readings that should hold a known value**, which makes them suited to a -display: you learn the normal number once, and anything else is a signal. +The signalset defines eight synthetic signals. Seven are a **ratio between +two readings that should hold a known value**, which makes them suited to +a display: you learn the normal number once, and anything else is a +signal. The eighth, Fuel Rate, is a different shape — a real physical +quantity rather than a 1.0-normal ratio — and is described separately +below. (An earlier eighth ratio, Rail Pressure Crosscheck, was removed +when its SAE rail-pressure alias was dropped as a duplicate; Fuel Rate +took its slot.) | Signal | Ratio | Normal | Meaning when it moves | |---|---|---|---| @@ -280,12 +332,11 @@ display: you learn the normal number once, and anything else is a signal. | Bank Balance | Cat temp B1 / B2 | 1.0 | One bank working harder — misfire or injector on the low side | | Pedal Agreement | Pedal D / Pedal E | 1.0 | Redundant pedal sensors disagreeing; the ECU limps if they diverge | | Throttle Tracking | Actual / Commanded throttle | 1.0 | Plate not following orders — sticky or carbonned throttle body | -| Rail Pressure Crosscheck | Proprietary / SAE rail pressure | steady | Drift means one sensor path is wrong | | Suspension Balance Front | Front left / right pressure | 1.0 | A corner losing air, before the dash warns | | Suspension Balance Rear | Rear left / right pressure | 1.0 | Same, rear axle | -Six of the eight sit at **1.0 when healthy**, so a single glance covers -fuelling, ignition balance, pedal and throttle integrity, and air springs. +All seven sit at **1.0 when healthy**, so a single glance covers fuelling, +ignition balance, pedal and throttle integrity, and air springs. Boost Pressure Ratio is the exception and the one to watch for fun: it's the closest thing to a boost gauge this vehicle exposes. The schema's only @@ -293,6 +344,34 @@ operation is division, so true gauge boost (`MAP − Barometric`) isn't expressible as a synthetic — but the ratio carries the same information and needs no altitude correction. +### Fuel rate, now computed + +The ECM's own supported-PID bitmasks (`0100 = BFBFACD3`, `0120 = A007B119`, +`0140 = FED08511`, `0160 = 07010000`) say PIDs `5E` and `9D` are both +unsupported. The truck does not report fuel rate. Any app showing one is +computing it, and now this signalset does too — the eighth synthetic, +added 2026-09-20. + +``` +Litres per hour = MAF (g/s) / (Lambda × 14.7 × 745 / 3600) + = MAF / (Lambda × 3.0421) +``` + +The schema's synthetic operation is a plain ratio with no constant, so the +constant was folded into a hidden operand instead: `LR4_FUEL_DIVISOR` reads +Commanded Equivalence Ratio (`22F444`) with `div` set to `10771.53` +(`32768 / 3.0421`), which yields `Lambda × 3.0421` directly. `LR4_FUEL_RATE` +is then Mass Air Flow divided by that, already in litres per hour, and +carries `suggestedMetric: fuelRate`. + +Validated against the 2026-09-20 drive: integrating the formula over 1,480 +MAF samples gives 11.21 L burned. The tank gauge fell from 87.8% to 76.9% +over the same drive, which on the 86.3 L tank is 9.48 L — agreement to +about 18%, on the pessimistic side, over 91.5 km (19.2 mpg by the +formula). It's an estimate, not a measurement: the gauge is 8-bit (one step +is 0.34 L), and float angle off-road makes it worse. Treat Fuel Rate as +directionally useful, not a trip computer. + --- ## Altitude and mountain driving @@ -398,6 +477,26 @@ Engine braking sends heat somewhere different. ## Off-road +### The mountain drive that tested off-roading collected no off-road data + +Session 2525 (2026-09-20, 15:14–17:32, 137.5 minutes, 91.5 km / 56.9 mi at +7,800–11,000 ft) deliberately included light off-roading to exercise the +suspension and rear differential. It produced none of that data. Every +signal the test was aimed at lives on a module the app had already stopped +addressing before the drive started: ride height, height sensors, corner +pressures, compressor activity and Terrain Response all live on `7D3`, +which the app retired at 14:07 that day, over an hour before the drive +began. The two rear-differential-lock candidates lived on `795`, which the +app was still addressing, but neither DID was among the 23 commands it +chose to poll that session — see "The app retires ECUs permanently, one +session at a time" under Polling for why. + +Everything below about air suspension and the rear differential was +recovered from earlier sessions already present in the same log file, not +from this drive. Until the app's learned vehicle profile is reset, no +suspension or gear-selector data will be collected on a drive no matter +what this signalset asks for. + ### Air suspension The four corner pressures are the most useful thing you have off-road. On @@ -422,14 +521,14 @@ you've either shifted your load or picked up a slow leak. | Suspension Balance | Articulation and weight transfer, live | | Gear Selector | Confirms what the transmission thinks it's in | -A drive on 2026-09-20 that changed ride height confirmed Ride Height, Ride -Height Front/Rear and the corner pressures all move together and in the +A drive on 2026-09-20 that changed ride height confirmed Ride Height, the +height sensors and the corner pressures all move together and in the directions their labels predict — see "Air suspension notes" below. `3B4D`, -once labelled Drive Mode, is not: it read `0` on all 48 samples that drive, -straight through every height change. Terrain Response mode itself is still -untested, since the drive changed height rather than terrain setting — if a -future drive cycles through Terrain Response settings, watch `3B4D` and note -what it reads in each one. +once considered for Drive Mode or Terrain Response, is neither: a later +audit across 236 samples spanning many drives and several terrain modes +found it constant at `0x00` throughout, and it has been deleted. Terrain +Response itself remains unidentified on this truck — nothing currently in +the signalset is known to carry it. ### Before you go @@ -448,27 +547,43 @@ formulas eventually get worked out. | Address | Signals | |---|---| -| `7E0` / `7E8` | `F416`, `F419`, `F41A`, `F458`, `F466`, `F467`, `F468`, `F470` — eight single-byte probes added 2026-09-20. The ECM's own supported-PID bitmask says these PIDs exist; nothing more is known | -| `792` / `79A` | `2A32`–`2A3A` — eight live values, none resembling tire pressures | -| `795` / `79D` | `1E88`, `1E89` | -| `7E1` / `7E9` | `1E68`, `1E6A` — neighbours of the gearbox temp | -| `761` / `769` | `197C`, `D11C` | -| `726` / `72E` | `0202` — returns `00` | -| `7D3` / `7DB` | `3B00`, `3B01`, `3B02`, `3B08`, `3B0B` — `3B02` answers four single-byte values that look like one per corner | - -`726`'s `0202` came out of a sweep of DIDs `0000`–`03FF` against that module -(916 requests) — the one hit, and the first non-identification DID ever -found there. +| `7E1` / `7E9` | `1E68`, `DD01` — `1E68` is a neighbour of the gearbox temp and varies most of anything unmined on this module; `DD01` shares its DID with the engine's odometer but isn't one | +| `761` / `769` | `197C`, `D11C` — the most active unmined DIDs on the truck, four distinct values each in four samples | +| `7D3` / `7DB` | `3B01`, `3B02`, `3B0B` — `3B01` looks like the ride-height state word (see "Air suspension notes" under Off-road); `3B02` answers four single-byte values that look like one per corner | + +Nineteen commands that used to sit in this section were deleted on +2026-09-20, on evidence across all logged history rather than a single +drive: + +| Command | Evidence | Verdict | +|---|---|---| +| `726` / `0202` | One value (`0x00`) in 13 samples | Dead | +| `792` / `2A32`–`2A3C` (eleven commands) | Nine return a single constant, two return two values each; the module itself was never identified | Dead. Moved to `TESTING.md` as a manual probe | +| `795` / `1E88` | Constant `0x0000` in 6 samples | Dead. One of the two rear-diff-lock candidates | +| `795` / `1E89` | `0x09C4` in 24 of 25 samples | Dead. The other diff-lock candidate | +| `7E1` / `1E6A` | Constant `0x00` in 29 samples | Dead | +| `7D3` / `3B00` | `0x00000003` in 54 of 55 samples | Dead | +| `7D3` / `3B08` | Constant `0x00` in 64 samples | Dead | +| `7D3` / `3B4D` | Constant `0x00` across 236 samples spanning many drives and several terrain modes | Dead. This was the Terrain Response candidate — it isn't, and appears to be nothing. See "Terrain Response and 3B4D" below | +| `7E0` / `F458` | Returns a `7F` negative response | Dead | + +Deleting a command this way — evidence across the full log history rather +than one drive — is the standard this file now holds new deletions to. A +DID that stays flat through a real height change, a real terrain-mode +cycle, and everything in between doesn't need a second chance. **The suspension decodes check out.** Replaying every logged sample through the formats in this file gives corner pressures of 34-50 psi, a ride height offset correctly signed at -91 to +50 mm, and module voltage of 9.12-14.56 V, -all physically sensible. The exception is `3B4D`: it was labelled Drive Mode, -but it returned `0` on all 171 samples recorded before 2026-09-20 and on all -48 samples taken on a 2026-09-20 drive that changed ride height twice — flat -straight through the one state change it was tested against. The signal has -been renamed `LR4_3B4D_RAW`. A terrain-mode change hasn't been tested yet, so -the field is unidentified rather than proven useless. +all physically sensible. + +**Terrain Response and `3B4D`.** `3B4D` was labelled Drive Mode and was the +candidate for Terrain Response. Across all logged history it returns a +constant `0x00` — 236 samples, spanning many drives and several terrain +modes, not just the one 2026-09-20 drive that first flagged it as flat. +That's not "unconfirmed," it's answered: `3B4D` is not Terrain Response and +appears to be nothing. It has been deleted rather than kept as a probe — +see "Nineteen commands deleted" above. What the audit could not do is say anything about suspension health. Across fourteen months only 36 minutes have all four corner pressures captured @@ -503,23 +618,27 @@ during those changes. The driver believed the low "access" height didn't register. It did — the corner pressures and height sensors both recorded a third, lower level at -16:23:49. The state fields did not obviously distinguish it: +16:23:49. What was wrong was the map, not the sampling, and a later audit +across all logged history settled it. -`3B3C` is the height mode and increments upward: mode 1 was normal and mode 2 -was raised, both confirmed before this drive. The map also labels 0 as Access -and 3 as Extended on the assumption the ordering continues. On the 2026-09-20 -drive it also returned `0D` and `04`, neither of which fits that scheme, and -none of the four values it returned cleanly picked out the access-height -moment. Correct the 0/3 labels if they read wrong. +**The ride height map was wrong, and that is why Access never registered.** +`3B3C` across all logged history returns `0x01` (216 samples), `0x02` (11), +`0x04` (5) and `0x0D` (4). The map in this file was ordinal, 0 through 3, +with 0 labelled Access — but the value 0 never once occurs, and `0x04` and +`0x0D` weren't in the map at all. Pinned against the front height sensor, +which is inverted so a falling value means the truck is rising: -`3B01` returned three distinct values on the same drive — `00000400`, -`00000100`, `00000800` — each a single bit set, which looks like a ride-height -state word rather than an enum. It was at `freq` 600 and caught only 3 -samples that drive, so it's been raised to `freq` 10 for another look. +| Value | Front height sensor mean | State | +|---|---|---| +| `0x01` | 111.4 (range 91–122) | Normal | +| `0x02` | 90.4 (85–95), highest the truck sits | Off-Road | +| `0x04` | 133.0, lowest the truck sits | Access | +| `0x0D` | 120.5, between Normal and Access | In Transit | -Most likely, `3B01` and `3B3C` simply weren't sampled often enough (`freq` 600 -and 10) to catch the access-height moment, which is why the corner pressures -and height sensors saw it and the state fields didn't. +The map is now `1, 2, 4, 13`. `3B01` carries the same state in parallel: +`0x100` pins to a front mean of 111.6 (Normal) and `0x800` to 133.0 +(Access). `0x400` has been seen once and never alongside a height sample, so +it's Off-Road by elimination — unconfirmed, unlike the other three. The two balance ratios respond to cargo, not just faults. With the load area full, front balance read 0.99 and rear read 0.92 — the rear axle carrying more @@ -529,38 +648,101 @@ on one side. Check the ratios unloaded before reading a low number as a leak. ## Polling -The adapter sustains about **13 request/response round trips per second**, -measured across many hours of logging. That is the ELM327's ceiling, not the -CAN bus — 13 requests per second is negligible against 500 kbit/s, and -diagnostic identifiers in the `7xx` range are low priority by CAN arbitration, -so they yield to powertrain traffic automatically. Service `22` is read-only. -Polling cannot harm anything; it can only compete with itself. +### The budget was measured against the wrong ceiling + +For most of this file's history the budget was set against **13 +request/response round trips per second**, treated as the adapter's +ceiling. That number is real, but it's the whole bus, and most of it +belongs to the app, not to this signalset. Measured on 2026-09-20 (session +2525): total adapter throughput was 13.43 req/s, splitting into AT +commands (adapter setup, header changes, filter changes) at 3.27/s, the +app's own internal mode-01/mode-09 polling — which never surfaces as a +recordable signal — at 5.94/s, and this signalset's UDS service-`22` +traffic at 4.22/s. + +Across seven sessions on 2026-09-19 and 2026-09-20, the UDS share stayed +pinned between 4.1 and 5.1 req/s no matter how large the signalset was. +Session 2504 polled 108 distinct DIDs and got 4.19 req/s. Session 2525 +polled 23 distinct DIDs and got 4.22 req/s — five times fewer commands, +identical throughput. **The signalset's real ceiling is about 4.2 req/s, +not 11.** This file had been asking for 10.53. + +Service `22` is read-only. Polling cannot harm anything; it can only +compete with itself, and with the app's own traffic, for a share that +doesn't grow no matter how much is asked of it. **`freq` is a minimum interval in seconds, not a rate.** Pelican documents it as the maximum frequency at which a command may be sent, expressed in seconds, so a *smaller* number polls *harder*. There is no priority field anywhere in the v3 format — command count and `freq` are the only levers. -The budget in this file: +The budget in this file, cut to fit the measured ceiling on 2026-09-20: | Interval | Commands | Contents | |---|---|---| -| 1s | 4 | Manifold pressure, barometric, engine speed, vehicle speed | -| 3s | 8 | Throttle, pedals, timing, lambda, load | -| 5s | 10 | Temperatures, fuel trims bank 1, mass air flow, gearbox and diff temp, gear selector | -| 10s | 14 | Air suspension, fuel system status B1/B2, O2 lambda/voltage B2S1 | -| 20s | 2 | Commanded evap purge, O2 voltage/trim B1S2 | -| 30s | 19 | Fuel trims bank 2, catalyst temperatures, battery, fuel level, and the undecoded probes shown to move | -| 60s | 4 | `726/0202`, long term secondary O2 trim B1, relative throttle position, absolute throttle position B | -| 300s | 8 | Eight raw single-byte probes from the ECM's own supported-PID bitmask, payload width unknown | -| 600s | 20 | Odometer, oil level, oil volume, O2 sensors present, and undecoded probes that have never moved | - -That totals 10.93 requests per second of demand against roughly 11 available -once protocol overhead is removed — 89 commands, up from 73 after the -sixteen added from the ECM's own supported-PID bitmask (see below). The four -one-second commands exist so the boost calculation stays responsive. - -### Eight commands went quiet for three weeks. The app had a stale signalset +| 2s | 2 | Engine speed, vehicle speed | +| 5s | 6 | Calculated load, throttle position, manifold pressure, mass air flow, commanded equivalence ratio, gear selector | +| 10s | 3 | Lambda B1S1, fuel rail pressure, ride height mode | +| 15s | 9 | Timing advance, absolute load, both pedal sensors, coolant temp, short term trim B1, both height sensors, `3B01` | +| 30s | 15 | Remaining temperatures (oil, charge air, gearbox, diff), fuel trims bank 2, commanded throttle, fuel level, MAF A/B, all four corner pressures, compressor activity | +| 60s | 13 | Height offset, module voltage, lambda B2S1, ambient, barometric/altitude, battery, catalyst temps, IAT sensors, `3B02`, `3B0B`, `1E68` | +| 120s | 11 | Slower diagnostics: fuel system status, evap purge, O2 voltage B1S2, secondary O2 trim, relative/absolute throttle, IAT 1/2, manifold pressure (fine), run time, `197C`, `D11C` | +| 300s | 1 | Distance since codes cleared | +| 600s | 6 | Odometer, oil level, oil volume, distance with MIL on, warm-ups since codes cleared, `DD01` | + +That's **66 commands at 3.922 req/s**, down from 85 commands at 10.528 — +comfortably under the measured 4.2 req/s ceiling, where the old figure had +looked safe against 11 req/s but was actually overdrawing the real one by +more than double. Engine speed is back on a real cadence (2s) and carries +the `engineSpeed` metric; it had not been polled since 2026-08-30 — see +below for why. + +### The app retires ECUs permanently, one session at a time + +Headers the app actually addressed, by session, on 2026-09-20: + +| Time | Headers addressed | +|---|---| +| 09:57 | `726`, `732`, `761`, `792`, `795`, `7D3`, `7DF`, `7E0`–`7E7` — everything this file names | +| 10:59 | `726` and `761` gone | +| 12:40 | `732` and `792` gone | +| 14:07 | `7D3` gone | +| 15:14 (session 2525, the off-road drive) | Unchanged from 14:07 | + +Once a module is dropped it is never retried. This is a ratchet, not a +fluctuation, and it isn't about the modules going bad: in the 12:40 session +every `7D3` command returned a valid response right up until the app +stopped asking. + +During session 2525's 137-minute drive, 61 of this file's 84 commands (the +count before today's cut to 66) were never sent once — not throttled, not +degraded, never requested. The 23 that were polled all start at minute 0.1 +or 0.6 and run continuously to minute 137.4, so this isn't a mid-drive +dropout either. It also isn't the stale-signalset explanation from +2026-08-30, reframed below: no commit in this file's history matches the +polled set, and four commands added earlier the same day were among the 23 +being polled — a stale copy of the file wouldn't include same-day +additions. + +**A command's presence in this file does not mean it is being collected.** +Check the scan logs before relying on one. Nothing in this repo can +un-retire a module — the app has learned that `7D3`, `792`, `732`, `726` +and `761` don't answer and has stopped addressing them, and that has to be +reset from inside the app (probably by removing and re-adding the +vehicle), not from this file. Whether staying under the 4.2 req/s ceiling +stops the ratchet from taking more modules is untested; the next drive is +the test. + +### Eight commands went quiet for three weeks — the first sighting of the ratchet, not a separate incident + +This section originally explained an isolated 2026-08-30 incident as a +stale copy of the signalset on the app's side. It wasn't isolated. It was +the first visible symptom of the retirement ratchet described above, and +at the time nobody knew the ratchet existed. The history below is kept +as-is because the reasoning in it — ruling out the request budget and the +`freq` tiers before landing on "the app must be holding stale data" — was +a reasonable read of the evidence available that day. It just wasn't the +right answer. Between 2026-08-30 and 2026-09-19, eight commands in this file were never requested on a drive: `F40C`, `F411`, `F40E`, `F443`, `F449`, `F44A`, `F407` @@ -569,23 +751,30 @@ engine speed value reached the signal database in fourteen months. Two synthetics could not compute either, `LR4_THROTTLE_TRACKING` needing `F411` and `LR4_PEDAL_AGREEMENT` needing `F449` and `F44A`. -**Resolved on 2026-09-20.** Every command in the file was polled that drive. -`F40C` was requested 172 times and answered 172 times, and engine speed is -now recorded. Nothing in this file changed to cause that — the app had -simply been running an older copy of the signalset, and picked up the -current one. - -Getting there meant ruling out the two obvious causes, and both remain worth -knowing. It was not the request budget: demand was 10.21 req/s against the -11-13 the adapter delivers. It was not the `freq` values either, because the -dead commands shared tiers with live ones — `F40C` and `F40D` are both -`freq` 1 and only `F40D` ran; `F411`, `F443`, `F449` and `F44A` sat at -`freq` 3 alongside `F404`, `F434` and `F444`, which all ran. - -The lesson that outlives the incident: **a command's presence in this file -means nothing until the app has actually fetched the file.** Before -concluding that a command is unsupported, confirm the app is holding the -version you think it is. +**Looked resolved on 2026-09-20, briefly.** Every command in the file was +polled that morning. `F40C` was requested 172 times and answered 172 +times, and engine speed was recorded for the first time in fourteen +months. At the time this was credited to the app picking up a fresher copy +of the signalset. Later the same day, session 2525 showed the real +pattern: the app hadn't fixed anything, it had simply not yet retired the +modules carrying those eight commands. It went on to retire four more +modules that same day. + +Getting to the "stale signalset" explanation meant ruling out the two +obvious causes, and both remain worth knowing even though the explanation +built on them was wrong. It was not the request budget: demand was 10.21 +req/s against the 11-13 the adapter appeared to deliver — appeared to, +because that 11-13 figure was the whole-bus number, not this signalset's +real share. It was not the `freq` values either, because the dead commands +shared tiers with live ones — `F40C` and `F40D` are both `freq` 1 and only +`F40D` ran; `F411`, `F443`, `F449` and `F44A` sat at `freq` 3 alongside +`F404`, `F434` and `F444`, which all ran. + +The lesson that outlives the incident, revised: **a command's presence in +this file means nothing until the scan logs confirm the app is actually +addressing its module this session.** Before concluding a command is +unsupported, or that a fix worked, check which headers the app is +addressing — not just which commands answer when you send them by hand. ### The seven probes, and how they turned out @@ -680,7 +869,7 @@ tested the same day. **All sixteen answered.** Ten earn their place. | Command | Result | |---|---| -| `22F466` | **Two mass airflow sensors.** A 2.09 g/s against B 1.78 g/s, summing to 3.88 against `F410`'s 4.16 a second later | +| `22F466` | **Two mass airflow sensors.** A 2.09 g/s against B 1.78 g/s, summing to 3.88 against `F410`'s 4.16 a second later. One idle sample — see the correction below | | `22F467` | **Two coolant temperature sensors**, 61 °C and 35 °C | | `22F468` | **Two intake air temperature sensors**, 36 °C and 59 °C | | `22F403` | Fuel system status, two states over 14 samples: open loop on load or decel ×9, closed loop ×5 | @@ -688,14 +877,16 @@ tested the same day. **All sixteen answered.** Ten earn their place. | `22F438` | Bank 2 lambda 0.853-1.985 over 29 valid samples; railed at `FFFF` on 23 of 52 | | `22F415` | Post-catalyst O2, 0.13-0.93 V and switching | | `22F445` / `22F447` | Relative throttle 2.7-22.7%, absolute throttle B 12.5-22.4% | -| `22F470` | **Boost pressure.** Decoded against SAE J1979 PID 70: sensor A reads 24.72 kPa at idle | +| `22F470` | Decoded against SAE J1979 PID 70: channel A reads 24.72 kPa at idle. Later shown to be manifold pressure at finer resolution, not a separate boost sensor — see "Duplicates found and removed" above | -**The dual mass airflow sensors are the find.** MAF calibration was one of -three candidate explanations for both banks correcting lean together, and -`F466` shows the two intake tracts disagreeing by 17.5%. Their sum tracks -the single `F410` figure, so they are the two halves of the same -measurement. One sample, taken at idle where these sensors are least -accurate — a lead, not a finding, and the reason `F466` now runs at `freq` 5. +**The dual mass airflow sensors exist, but the 17.5% disagreement claim +above was wrong — it rested on a single idle sample.** With 1,474 paired +samples from the 2026-09-20 drive, the least-squares slope of (A+B) against +the single MAF PID through the origin is 0.88, not 1.0, and individual +pairs scatter badly: one pair reads 7.03 g/s against the single PID's +18.16 g/s at the same instant. The split between the two channels is not +trustworthy at this polling rate. Use the single MAF PID for anything +quantitative; treat A and B as present but unvalidated. `F403` matters for the same investigation: the engine does reach closed loop, so the 7-9% long-term trims are real measurements rather than @@ -715,16 +906,22 @@ not exist. returned `0x77`: bank 1 sensors 1, 2 and 3 and bank 2 sensors 1, 2 and 3 are present. That can never change, so it is recorded here instead of polled. -Two still need samples: `F456` (three samples, all near zero) and `F458` -(one sample, `7F`, meaning unknown). - -`F470` was the one command still leaving something on the table. Read -against the SAE J1979 definition of PID 70 its ten bytes are commanded boost -and measured boost for two channels, at 1/32 kPa. The support byte is `0x02`, -which flags channel A as present, and channel A reads 24.72 kPa at idle. -**This is the first direct boost measurement on this truck** — everything -before it was inferred from manifold pressure over barometric. It costs no -extra requests; the reply was already arriving and being thrown away. +Two still needed samples at the time: `F456` (three samples, all near +zero) and `F458` (one sample, `7F`, meaning unknown). `F458` is now +resolved — it returns a `7F` negative response consistently and has been +deleted; see "Nineteen commands deleted" under Undecoded. `F456` stayed in +at `freq` 120. + +`F470` was read against the SAE J1979 definition of PID 70: its ten bytes +are commanded boost and measured boost for two channels, at 1/32 kPa. The +support byte is `0x02`, flagging channel A as present, and channel A read +24.72 kPa at idle. At the time this looked like the first direct boost +measurement on this truck. A wider check on 2026-09-20 against 525 paired +samples found channel A tracking Manifold Pressure to within 1.3 kPa mean +(r = 0.85) — it is the same manifold sensor at finer resolution, not a +separate boost sensor. See "Duplicates found and removed" above. Boost is +still only available by subtracting Barometric Pressure from Manifold +Pressure, as below. Checking the rest of the signalset the same way found nothing else. Against the canonical SAE signalset, the only other unread fields in replies we @@ -736,36 +933,104 @@ already make are sensor-present bits and channels this engine does not have: Barometric pressure moved from `freq` 1 to `freq` 5 to pay for this. It does not change at 1 Hz, and it was consuming 0.9 req/s of a budget with no slack. - -### Metric slots, and why sixteen is the ceiling +### From 89 commands back down to 66 + +The narrative above tracks the file growing to 89 commands at 10.93 req/s +over the course of 2026-09-20. Later the same day, session 2525 showed +that budget had been measured against the wrong ceiling — 11 req/s that +was never really available, against a true UDS share of about 4.2 req/s — +and that four more ECUs had been permanently retired in the meantime. The +response was the nineteen deletions listed under "Undecoded" (dead across +all logged history, not one drive), the duplicate signals resolved under +"Duplicates found and removed" (PID 67 sensor 1 deleted outright, three of +PID 70's four channels dropped as dead alongside it), and a re-tiering of +everything that survived. The result is the 66-command, 3.922 req/s budget +at the top of this section. + +### Only signals with a metric are ever recorded + +This is the most consequential thing measured on 2026-09-20, and it sets the +boundary on what this whole project can deliver. + +**The app writes a signal to its database only if that signal carries a +`suggestedMetric`. Everything else is requested, answered, decoded and +thrown away.** + +Across fifteen months of backups, from 2025-06-29 to 2026-09-20, the signal +database has held exactly 15 distinct signals. Not 84, not the 98 the file +carried at its peak. Fifteen. + +The 137-minute drive on 2026-09-20 recorded 14, and they are precisely the +metric-carrying signals whose commands were being polled. The signalset held +16 metrics that day. The two missing from the database are `engineSpeed` and +`absoluteEngineLoad`, and they are missing for the unrelated reason that +their commands, `F40C` and `F443`, were among the 61 never sent. The match +is exact in both directions: every metric-carrying polled signal was stored, +and no signal without a metric ever was. + +The other two stores in the backup are not alternatives. `records` holds +manual service and fuel-up entries and is empty. `tripLogger` holds the +phone's own CoreLocation trace — latitude, longitude, altitude, speed — with +no OBD content in it. + +What that costs, stated plainly: the metric enum has no slot for manifold +pressure, ride height, suspension pressure, corner pressure, charge air +temperature, barometric pressure, ambient temperature, rear differential +temperature or boost. **None of those can ever be looked at historically +through the app.** They exist live, or in the raw scan logs, and nowhere +else. + +That includes the suspension work in its entirety. Even once the retired +`7D3` module is polled again, no ride height and no corner pressure will be +recorded as history. It includes the charge cooler coolant temperature newly +decoded from PID 67 sensor 2 — a real signal, genuinely new, that will never +persist. + +One limit on the claim: what was measured is that these signals are never +*stored*. Whether the app renders them live is a separate question the logs +cannot answer. This repo has always assumed that an `F4xx`-aliased signal +does show up live in the app, and nothing here contradicts that; it is still +an assumption, and it is one the owner can confirm from the app in a few +seconds. + +The practical rule: a fast `freq` on a signal with no metric buys a live +readout and nothing else. That can be worth paying for. It should be a +deliberate choice rather than an accident. + +### Metric slots, seventeen of thirty-six The schema defines 36 `suggestedMetric` values — the slots Pelican treats as -connectable. This signalset fills 16. The other 20 break down as: +connectable. Per the section above they are also the only signals that get +recorded at all, which makes this table the boundary of what is knowable +about this truck over time, not just a list of gauges. This signalset fills +17, up from 16 on 2026-09-20 when +`fuelRate` was added as a computed signal (see "Fuel rate, now computed" +above). The remaining 19 break down as: | Slots | Why they stay empty | |---|---| | 10 | Electric and hybrid only: state of charge and health, traction battery, charging, electric range, CVT deterioration | | 8 | Tire pressure and temperature, which this truck has not yet given up | -| 2 | `fuelRate` needs PID 5E, which this ECM's own bitmask does not list, and `fuelRange` is a proprietary Ford DID | - -Nothing else can be claimed honestly. A synthetic could not rescue `fuelRate` -either: the only formula operation the schema supports is `ratio`, a plain -a divided by b with no constant and no scaling, so mass air flow over -commanded lambda would land in the slot at fourteen-odd times the real value. -An empty slot is better than a wrong gauge. +| 1 | `fuelRange` is a proprietary Ford DID | -Tire pressure is the one worth chasing. Eight of the twenty are tires, and -`TESTING.md` records what the Jaguar signalset does and what has never been -tried here. +`fuelRate` looked like it belonged in this list too — the schema's only +formula operation is `ratio`, a plain a divided by b with no constant and no +scaling — but the constant can be folded into a hidden operand on one side +of the ratio instead of the ratio itself, which is how it got filled. See +above for the mechanism. Tire pressure is the one still worth chasing: eight +of the nineteen empty slots are tires, and `TESTING.md` records what the +Jaguar signalset does and what has never been tried here. ### Hidden signals -Twenty-nine of the 98 signals carry `hidden: true`: every `*_RAW` probe and -the `3B02` byte splits. They are still recorded, they simply do not clutter -the app with values nobody can interpret yet. A probe earns its way out of -hiding by being decoded and named. +Eleven of the file's 84 signals (including synthetics) carry `hidden: true`: +the remaining `*_RAW` probes and the `3B02` byte splits. Hiding keeps them +from cluttering the app with values nobody can interpret yet. Note that none +of them is recorded either way — none carries a metric, so `hidden` changes +only what is shown, never what is kept. A probe earns its way out of hiding +by being decoded and named. -Twenty-three signals carry a `description`, concentrated on the probes and on +Eighteen signals carry a `description`, concentrated on the probes and on the decoded signals with a catch — the inverted height sensors, the bank 2 lambda that rails at `FFFF`, altitude being a barometric lookup rather than GPS. diff --git a/TESTING.md b/TESTING.md index e7c0c0a..12707fa 100644 --- a/TESTING.md +++ b/TESTING.md @@ -11,16 +11,19 @@ not on suspicion. ## Open in-vehicle tasks -- [ ] **Re-run `22F187` against module `726`.** Every other module rejected it with NRC 31, but `726` returned a malformed reply carrying VIN bytes instead. Terminal sequence: `ATSH 726`, `ATCRA 72E`, `22F187`. +- [ ] **Reset the Pelican app's learned vehicle profile — before any of the suspension or differential tasks below.** The app has permanently dropped five ECUs and will not retry them. Scan logs from 2026-09-20 show it addressing every module at 09:57, then losing `726` and `761` by 10:59, `732` and `792` by 12:40, and `7D3` by 14:07 — all while those modules were still answering correctly. The 15:14 off-road drive ran 137 minutes with 61 of 84 commands never sent once, and collected zero suspension data (ride height, terrain response and the suspension pressures all live on `7D3`) and zero differential data (the diff-lock DIDs live on `795`, which wasn't even among the 23 commands still being polled by then). **Nothing in this repo can fix this.** It needs the owner to reset the app's learned profile, most likely by removing and re-adding the vehicle in the app, before it happens again. +- [ ] **Verify the cut-down signalset on the next drive.** The polling budget was cut from 10.53 req/s to 3.922 req/s (109 commands down to 66) because measurement showed the app only ever delivers about 4.2 req/s to signalset traffic, no matter how many commands are in the file — see the profile-reset task above for what overdrawing that ceiling does. Two explicit pass criteria: (1) all 66 commands are actually being polled, and (2) no further module gets retired. +- [ ] **Re-run `22F187` against module `726`.** Every other module rejected it with NRC 31, but `726` returned a malformed reply carrying VIN bytes instead. Terminal sequence: `ATSH 726`, `ATCRA 72E`, `22F187`. (Unaffected by the profile-reset issue above — this is a hand-typed terminal probe, not app polling.) - [x] **Confirm which signalset version the Pelican app is actually holding.** Done 2026-09-20: the app was holding a stale signalset. A forced refresh brought all 109 commands into the poll cycle — `F40C` answered 172 of 172 requests, and engine speed was recorded for the first time. -- [x] **A drive with a ride-height change.** Done 2026-09-20: `3B01`, `3B3C`, all four corner pressures, both height sensors and the compressor all moved. Access height did register — in the pressures and height sensors — contrary to what it looked like from the driver's seat. -- [ ] **A drive with a terrain-mode change.** `3B4D`, labelled Drive Mode, has returned `0` on all 171 samples ever taken. Cycle through terrain response settings to find out whether the label or the byte offset is wrong. Update 2026-09-20: also returned `0` on all 48 samples through every ride-height change on this drive, so it survived a real state change unmoved. Renamed `LR4_3B4D_RAW` — a terrain-response change is now the only thing left that can identify it. -- [ ] **A rear-differential lock cycle.** `1E88` and `1E89` on module `795` have never moved. +- [x] **A drive with a ride-height change.** Done 2026-09-20: `3B01`, `3B3C`, all four corner pressures, both height sensors and the compressor all moved. Access height did register — in the pressures and height sensors — contrary to what it looked like from the driver's seat. Update 2026-09-20 (log review): the reason Access looked unreliable was ours — `3B3C` is a bitfield, not an ordinal. Observed values across all history are `0x01` (216 samples), `0x02` (11), `0x04` (5), `0x0D` (4); the old map ran 0-3 with 0 labelled Access, and 0 never occurs. Pinned against the inverted front height sensor, where a falling value means the truck is rising: `0x01` (front mean 111.4) is Normal, `0x02` (front mean 90.4, truck highest) is Off-Road, `0x04` (front mean 133.0, truck lowest) is Access, `0x0D` (front mean 120.5) is in transit. Map corrected to `1, 2, 4, 13`. Access should register cleanly once `7D3` is being polled again — see the profile-reset task above. +- [ ] **Confirm `3B01` bit `0x400`.** `0x100` is pinned to Normal and `0x800` to Access, both measured against the height sensor. `0x400` has been seen once and never alongside a height sample — Off-Road by elimination, unconfirmed. Needs a deliberate Off-Road selection, once `7D3` is answering again. +- [ ] **Find a working rear-differential-lock DID on `795`, if the owner still wants this signal.** `1E88` (constant `0000` across 6 samples) and `1E89` (constant `09C4` in 24 of 25 samples) were both effectively dead and have been deleted. A different DID, found by manual probing, is the only way back to this. - [ ] **A cold start.** Needed for the warm-up curves on `113F` and `2104`, and to catch the crank dip on `1153`/`1154`. -- [ ] **Identify module `792`.** Its whole `2A3x` block is static and nothing is known about it. Try `22F18C` and `22F191` against it the way the other six unmined modules were probed on 2026-09-19. -- [ ] **Mine the four still-unidentified modules** — `716`, `726`, `737`, `797`. Each returned a distinct ECU serial via `22F18C` but rejected `22F191`, so they are real and separate but their function is unknown. +- [ ] **Identify module `792`.** Dropped from the signalset entirely on 2026-09-20 — its eleven `2A3x` DIDs came back nine constants and two near-constants, and the module itself has never been identified. Not worth polling any more; still worth one terminal sweep. Try `22F18C` and `22F191` against it the way the other six unmined modules were probed on 2026-09-19. +- [ ] **Mine the four still-unidentified modules** — `716`, `726`, `737`, `797`. Each returned a distinct ECU serial via `22F18C` but rejected `22F191`, so they are real and separate but their function is unknown. (`726`'s only known DID, `0202`, was deleted from the signalset on 2026-09-20 for staying `00` across 13 samples — the module itself is still unidentified.) - [ ] **Sweep module `760` for wheel speeds.** `760` was identified as the ABS/brake module on 2026-09-19 and has never been mined. Individual wheel speeds would enable dragging-brake detection, a tire-size mismatch check, and a better speed reference than the single `F40D` value. A parked terminal sweep — no drive needed. - [ ] **Read fault codes.** This file has no DTC coverage at all — modes `03` (stored), `07` (pending), `0A` (permanent), plus UDS service `19` for the non-OBD modules. Pending codes are the earliest warning available on a vehicle this age and have never been looked at. This probably can't be expressed in an OBDb signalset, so it stays a terminal task rather than something to add to `default.json`. +- [ ] **Sanity-check the computed fuel-rate synthetic against real fill-ups.** PID `5E` isn't supported per the ECM's own supported-PID bitmask, so fuel rate can't be read directly — it's now derived from MAF and commanded lambda instead. Validated to within about 18% of the tank gauge over one 91.5 km drive; comparing against a few real fill-ups is the only way to actually calibrate it. --- @@ -180,33 +183,18 @@ moved" so far only means "never moved while parked." | Module | DID | `freq` | What we think it is | What would count as a result | |---|---|---|---|---| -| `726` | `0202` | 60 | Only DID found on module 726 — still 00 after 12 samples | Whether it ever leaves 00 | | `761` | `197C` | 30 | Unknown, 4 distinct values in 4 samples on the 2026-09-20 drive — with `D11C`, the most active unmined DIDs on the truck | Any correlation with a cabin or body state | | `761` | `D11C` | 30 | Unknown, 3A-41 (58-65); 4 distinct values in 4 samples on the 2026-09-20 drive — with `197C`, the most active unmined DIDs on the truck | Plausible temperature; compare against F446 ambient | -| `792` | `2A32` | 600 | Undecoded, ticked by a small amount on the 2026-09-20 drive — consistent with a counter | Confirm counter behavior over a longer drive; rest of the `2A3x` block stayed flat | -| `792` | `2A33` | 600 | Undecoded, constant 00033E0A in 15 samples (all parked) | Drop if still flat after a full drive cycle | -| `792` | `2A34` | 600 | Undecoded, constant 000008C0 in 15 samples (all parked) | Drop if still flat after a full drive cycle | -| `792` | `2A35` | 600 | Undecoded, constant 00051E28 in 11 samples (all parked) | Drop if still flat after a full drive cycle | -| `792` | `2A37` | 600 | Undecoded, ticked by a small amount on the 2026-09-20 drive — consistent with a counter | Confirm counter behavior over a longer drive; rest of the `2A3x` block stayed flat | -| `792` | `2A38` | 600 | Undecoded, constant 00001A in 12 samples (all parked) | Drop if still flat after a full drive cycle | -| `792` | `2A39` | 600 | Undecoded, constant 000002 in 12 samples (all parked) | Drop if still flat after a full drive cycle | -| `792` | `2A3A` | 600 | Undecoded, constant 00001F in 14 samples (all parked) | Drop if still flat after a full drive cycle | -| `792` | `2A3B` | 600 | Undecoded, constant 00000000 in 7 samples (all parked) | Drop if still flat after a full drive cycle | -| `792` | `2A3C` | 600 | Undecoded, constant 000000 in 7 samples (all parked) | Drop if still flat after a full drive cycle | -| `795` | `1E88` | 600 | Rear diff, always 0000 — still flat on the 2026-09-20 drive | Any movement under lock engagement | -| `795` | `1E89` | 600 | Rear diff, always 09C4 (2500) — still flat on the 2026-09-20 drive | Looks like a constant or a limit; drop if flat after a lock cycle | -| `7D3` | `3B00` | 30 | Suspension, still flat through the 2026-09-20 ride-height change (3 samples) | One more look at `freq` 30 before deletion | | `7D3` | `3B01` | 10 | Suspension, three values seen on the 2026-09-20 ride-height change (`00000400`, `00000100`, `00000800`) — looks like a ride-height state word | Needs enough samples to map each value to a height | -| `7D3` | `3B08` | 30 | Suspension, still flat through the 2026-09-20 ride-height change (3 samples) | One more look at `freq` 30 before deletion | | `7E0` | `F41F` | 30 | Run time since start (PID 1F) | Records as a signal - this is the alias-mechanism test against standard 011F | -| `7E1` | `1E6A` | 600 | Undecoded, constant 00 in 27 samples (all parked) | Drop if still flat after a full drive cycle | | `7E1` | `DD01` | 600 | Undecoded, constant 025166 in 1 samples (all parked) | Drop if still flat after a full drive cycle | -| `7E0` | `F458` | 300 | Raw single-byte probe from the ECM's own supported-PID bitmask decode; no data read yet | Whether it answers at all, and what payload width comes back | | `7E0` | `F466` | 300 | Raw single-byte probe from the ECM's own supported-PID bitmask decode; no data read yet | Whether it answers at all, and what payload width comes back | | `7E0` | `F467` | 300 | Raw single-byte probe from the ECM's own supported-PID bitmask decode; no data read yet | Whether it answers at all, and what payload width comes back | | `7E0` | `F468` | 300 | Raw single-byte probe from the ECM's own supported-PID bitmask decode; no data read yet | Whether it answers at all, and what payload width comes back | | `7E0` | `F470` | 300 | Raw single-byte probe from the ECM's own supported-PID bitmask decode; no data read yet | Whether it answers at all, and what payload width comes back | +**Deleted 2026-09-20:** `726/0202`, all eleven of `792`'s `2A3x` DIDs (`2A32`-`2A3C`), `795/1E88`, `795/1E89`, `7E1/1E6A`, `7D3/3B00`, `7D3/3B08` and `7E0/F458` — nineteen commands in total, counting `7D3/3B4D` (Terrain Response, already renamed `LR4_3B4D_RAW` before this pass) which never had a row here. Every one was killed by the same criterion: a constant or near-constant value held across enough samples — parked and driving both — to be conclusive. + --- ## Set up for a long drive with off-roading @@ -215,7 +203,7 @@ A two-hour drive with light off-roading on 2026-09-20 was set up to exercise the features that short commuter runs never touch. What was re-tiered for it, and what to look for afterwards: -| Command | `freq` | What the drive should produce | +| Command | `freq` | What the drive was meant to produce | |---|---|---| | `7E0/F466` | 5 | Whether the 17.5% disagreement between the two mass airflow sensors holds up under load, or was an idle artifact | | `795/1E88`, `795/1E89` | 30 | First data through a rear differential lock cycle. Both have been flat at `0000` and `09C4` on every sample ever taken | @@ -228,6 +216,30 @@ Barometric pressure dropped from `freq` 1 to `freq` 5 to pay for the above. It does not change at 1 Hz and was taking 0.9 req/s of a budget that had no slack. Total demand is 10.53 req/s across 85 commands. +**Outcome, found in the scan logs afterward:** this is the drive that caused +the ECU retirement described at the top of this file. The app addressed +every module at 09:57, then dropped `726` and `761` by 10:59, `732` and +`792` by 12:40, and `7D3` by 14:07 — over an hour before the 15:14 off-road +segment even started. 10.53 req/s across 85 commands was never a demand the +app could sustain; it only ever delivers about 4.2 req/s to signalset +traffic. The suspension and differential re-tiering above (`7D3/3B01`, +`7D3/3B4D`, `795/1E88`, `795/1E89`) collected nothing, because those +modules were already gone by the time the off-road segment ran. The budget +has since been cut to 3.922 req/s across 66 commands — see the verification +task in "Open in-vehicle tasks" above. + +Three rows in that table are now answered, from earlier sessions in the same +log rather than from the drive itself. `7D3/3B4D` is dead: constant `0x00` +across 236 samples spanning several terrain modes, so a mode change was not +the missing ingredient and the command has been deleted. `795/1E88` and +`795/1E89` are dead on the same evidence and are also gone. `7E0/F466`'s +17.5% disagreement did not survive contact with data: across 1,474 samples +the two channels sum to 0.88 of the single mass airflow PID by least squares, +with individual pairs scattering far too widely to trust the split. The +17.5% figure came from one idle sample. `7E0/F470` turned out to be manifold +pressure at 1/32 kPa rather than a separate boost sensor, tracking the +manifold pressure PID to within 1.3 kPa over 525 pairs. + ## Manual-probe-only DIDs The 2026-09-20 drive's biggest finding: 36 DIDs return `7F 22 31` (request @@ -305,5 +317,4 @@ Open questions that aren't in-vehicle tasks — they need log analysis or a decision, not a drive: - Both banks are correcting lean together by 7-9% long term (B1 +9.31%, B2 +7.32%), which points at fuel delivery, MAF calibration or an unmetered air leak rather than a per-bank fault. One drive, single-digit sample counts — needs confirming. -- What `3B01`'s bit flags mean, and which bit corresponds to which height. - What `761/197C` and `761/D11C` measure. diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index b7908f4..e0b1fb5 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -10,156 +10,84 @@ }} } ]}, -{ "hdr": "761", "rax": "769", "cmd": {"22": "197C"}, "freq": 30, +{ "hdr": "761", "rax": "769", "cmd": {"22": "197C"}, "freq": 120, "signals": [ {"id": "LR4_197C_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "197C Raw", "description": "Undecoded. Nine distinct values in fourteen samples, the most variable unmined DID on the truck."} ]}, -{ "hdr": "761", "rax": "769", "cmd": {"22": "D11C"}, "freq": 30, +{ "hdr": "761", "rax": "769", "cmd": {"22": "D11C"}, "freq": 120, "signals": [ {"id": "LR4_D11C_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "D11C Raw", "description": "Undecoded. Ranges 0x3A to 0x41, which would be a plausible temperature."} ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A32"}, "freq": 600, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B01"}, "freq": 15, "signals": [ - {"id": "LR4_2A32_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A32 Raw"} - ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A33"}, "freq": 600, - "signals": [ - {"id": "LR4_2A33_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A33 Raw"} - ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A34"}, "freq": 600, - "signals": [ - {"id": "LR4_2A34_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A34 Raw"} - ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A35"}, "freq": 600, - "signals": [ - {"id": "LR4_2A35_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A35 Raw"} - ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A37"}, "freq": 600, - "signals": [ - {"id": "LR4_2A37_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A37 Raw"} - ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A38"}, "freq": 600, - "signals": [ - {"id": "LR4_2A38_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A38 Raw"} - ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A39"}, "freq": 600, - "signals": [ - {"id": "LR4_2A39_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A39 Raw"} - ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A3A"}, "freq": 600, - "signals": [ - {"id": "LR4_2A3A_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A3A Raw"} - ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A3B"}, "freq": 600, - "signals": [ - {"id": "LR4_2A3B_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A3B Raw"} - ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A3C"}, "freq": 600, - "signals": [ - {"id": "LR4_2A3C_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A3C Raw"} - ]}, -{ "hdr": "795", "rax": "79D", "cmd": {"22": "1E88"}, "freq": 30, - "signals": [ - {"id": "LR4_1E88_RAW", "hidden": true, "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "1E88 Raw", "description": "Undecoded rear differential DID. Flat at 0000 on every sample so far; a lock cycle is the test."} - ]}, -{ "hdr": "795", "rax": "79D", "cmd": {"22": "1E89"}, "freq": 30, - "signals": [ - {"id": "LR4_1E89_RAW", "hidden": true, "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "1E89 Raw", "description": "Undecoded rear differential DID. Flat at 09C4 on every sample so far."} - ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B00"}, "freq": 30, - "signals": [ - {"id": "LR4_3B00_RAW", "hidden": true, "path": "Suspension", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "3B00 Raw", "description": "Undecoded suspension DID. Flat through a real ride-height change, but on three samples only."} - ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B01"}, "freq": 10, - "signals": [ - {"id": "LR4_3B01_RAW", "hidden": true, "path": "Suspension", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "3B01 Raw", "description": "Ride-height state word. Returns single-bit values (0x100, 0x400, 0x800); which bit means which height is not yet known."} - ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B08"}, "freq": 30, - "signals": [ - {"id": "LR4_3B08_RAW", "hidden": true, "path": "Suspension", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "3B08 Raw", "description": "Undecoded suspension DID. Flat through a real ride-height change, but on three samples only."} - ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E6A"}, "freq": 600, - "signals": [ - {"id": "LR4_1E6A_RAW", "hidden": true, "path": "Drivetrain", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1E6A Raw", "description": "Undecoded transmission DID, neighbour of the gearbox temperature."} + {"id": "LR4_3B01_RAW", "hidden": true, "path": "Suspension", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "3B01 Raw", "description": "Ride-height state word, running in parallel with the ride height mode PID. 0x100 was measured against a front sensor mean of 111.6 (Normal) and 0x800 against 133.0 (Access). 0x400 has been seen once and never alongside a height sample; Off-Road by elimination, unconfirmed."} ]}, { "hdr": "7E1", "rax": "7E9", "cmd": {"22": "DD01"}, "freq": 600, "signals": [ {"id": "LR4_DD01_RAW", "hidden": true, "path": "Drivetrain", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "DD01 Raw"} ]}, -{ "hdr": "726", "rax": "72E", "cmd": {"22": "0202"}, "freq": 60, - "signals": [ - {"id": "LR4_726_0202_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "726 0202 Raw", "description": "The only non-identification DID ever found on module 726, from a sweep of 0000-03FF. Has only ever returned 00."} - ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A36"}, "freq": 30, - "signals": [ - {"id": "LR4_2A36_RAW", "hidden": true, "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A36 Distance Counter"} - ]}, -{ "hdr": "795", "cmd": {"22": "1E8A"}, "freq": 5, +{ "hdr": "795", "cmd": {"22": "1E8A"}, "freq": 30, "signals": [ {"id": "LR4_REAR_DIFF_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "max": 150, "min": -40, "add": -40, "unit": "celsius" }, "name": "Locking Diff Oil Temp"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "2B12"}, "freq": 10, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "2B12"}, "freq": 60, "signals": [ {"id": "LR4_SUSPENSION_2B12", "path": "Suspension", "fmt": { "len": 16, "max": 32767, "min": -32768, "sign": true, "unit": "millimeters" }, "name": "Suspension Height Offset"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B02"}, "freq": 30, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B02"}, "freq": 60, "signals": [ {"id": "LR4_3B02_B0", "hidden": true, "path": "Suspension", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "3B02 Byte 1"}, {"id": "LR4_3B02_B1", "hidden": true, "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 255, "unit": "scalar" }, "name": "3B02 Byte 2"}, {"id": "LR4_3B02_B2", "hidden": true, "path": "Suspension", "fmt": {"bix": 16, "len": 8, "max": 255, "unit": "scalar" }, "name": "3B02 Byte 3"}, {"id": "LR4_3B02_B3", "hidden": true, "path": "Suspension", "fmt": {"bix": 24, "len": 8, "max": 255, "unit": "scalar" }, "name": "3B02 Byte 4"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B03"}, "freq": 10, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B03"}, "freq": 30, "signals": [ {"id": "LR4_SUSPENSION_PRES_FR", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "nullmin": 0, "unit": "psi" }, "name": "Suspension Pressure Front Right"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B04"}, "freq": 10, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B04"}, "freq": 30, "signals": [ {"id": "LR4_SUSPENSION_PRES_FL", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "nullmin": 0, "unit": "psi" }, "name": "Suspension Pressure Front Left"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B05"}, "freq": 10, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B05"}, "freq": 30, "signals": [ {"id": "LR4_SUSPENSION_PRES_RR", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "nullmin": 0, "unit": "psi" }, "name": "Suspension Pressure Rear Right"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B06"}, "freq": 10, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B06"}, "freq": 30, "signals": [ {"id": "LR4_SUSPENSION_PRES_RL", "path": "Suspension", "fmt": {"bix": 8, "len": 8, "max": 51, "div": 5, "nullmin": 0, "unit": "psi" }, "name": "Suspension Pressure Rear Left"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B07"}, "freq": 10, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B07"}, "freq": 30, "signals": [ {"id": "LR4_SUSPENSION_COMPRESSOR", "path": "Suspension", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "Compressor Activity"} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B0B"}, "freq": 30, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B0B"}, "freq": 60, "signals": [ {"id": "LR4_3B0B_RAW", "hidden": true, "path": "Suspension", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "scalar" }, "name": "3B0B Raw", "description": "Undecoded suspension DID, narrow range around 0x3D5."} ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B3C"}, "freq": 10, "signals": [ {"id": "LR4_RIDE_HEIGHT", "path": "Suspension", "name": "Ride Height Mode", "fmt": {"len": 8, "map": { - "0": { "description": "Access", "value": "Access" }, - "1": { "description": "Normal", "value": "Normal" }, - "2": { "description": "Off-Road", "value": "Off-Road" }, - "3": { "description": "Extended", "value": "Extended" } + "1": { "description": "Normal", "value": "Normal" }, + "2": { "description": "Off-Road", "value": "Off-Road" }, + "4": { "description": "Access", "value": "Access" }, + "13": { "description": "In Transit", "value": "In Transit" } }} } ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B4D"}, "freq": 10, - "signals": [ - {"id": "LR4_3B4D_RAW", "hidden": true, "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "3B4D Raw", "description": "Previously labelled Drive Mode, which it is not: it has read 0 on every sample ever taken, including through ride-height changes. A Terrain Response change is the untried test."} - ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B71"}, "freq": 10, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B71"}, "freq": 15, "signals": [ {"id": "LR4_RIDE_HEIGHT_FRONT", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "Height Sensor Front (inverted)", "description": "Inverted: a falling value means the truck is rising."} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B72"}, "freq": 10, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B72"}, "freq": 15, "signals": [ {"id": "LR4_RIDE_HEIGHT_REAR", "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "Height Sensor Rear (inverted)", "description": "Inverted: a falling value means the truck is rising."} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "D11A"}, "freq": 10, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "D11A"}, "freq": 60, "signals": [ {"id": "LR4_SUSPENSION_SUPPLY_V", "path": "Suspension", "fmt": { "len": 8, "max": 40.8, "mul": 16, "div": 100, "unit": "volts" }, "name": "Suspension Module Voltage"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "033E"}, "freq": 5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "033E"}, "freq": 10, "signals": [ {"id": "LR4_FUEL_RAIL_P", "path": "Fuel", "fmt": { "len": 16, "max": 30000, "unit": "kilopascal" }, "name": "Fuel Rail Pressure"} ]}, @@ -171,11 +99,11 @@ "signals": [ {"id": "LR4_ENGINE_OIL_VOLUME_GAL", "path": "Engine", "fmt": { "len": 8, "max": 6.74, "mul": 0.0264172, "unit": "gallons" }, "name": "Oil Volume"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "03F3"}, "freq": 5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "03F3"}, "freq": 30, "signals": [ {"id": "LR4_ENGINE_OIL_TEMP", "path": "Engine", "fmt": { "len": 8, "max": 120, "min": -40, "add": -40, "unit": "celsius" }, "name": "Oil Temp", "suggestedMetric": "engineOilTemperature"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "0520"}, "freq": 5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "0520"}, "freq": 30, "signals": [ {"id": "LR4_CHARGE_AIR_TEMP", "path": "Engine", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Charge Air Temp"} ]}, @@ -183,75 +111,67 @@ "signals": [ {"id": "LR4_ODOMETER", "path": "Trips", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "kilometers" }, "name": "Odometer", "suggestedMetric": "odometer"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F403"}, "freq": 10, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F403"}, "freq": 120, "signals": [ {"id": "LR4_FUEL_SYS_B1", "path": "Fuel", "fmt": { "len": 8, "max": 255, "map": { "1": { "description": "Open loop, engine cold", "value": "OpenLoopCold" }, "2": { "description": "Closed loop", "value": "ClosedLoop" }, "4": { "description": "Open loop, load or decel fuel cut", "value": "OpenLoopLoad" }, "8": { "description": "Open loop, system fault", "value": "OpenLoopFault" }, "16": { "description": "Closed loop with a feedback fault", "value": "ClosedLoopFault" } } }, "name": "Fuel System Status B1"}, {"id": "LR4_FUEL_SYS_B2", "path": "Fuel", "fmt": { "bix": 8, "len": 8, "max": 255, "unit": "scalar" }, "name": "Fuel System Status B2", "description": "Bank 2 fuel system status. Has mirrored bank 1 on every sample so far."} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F438"}, "freq": 10, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F438"}, "freq": 60, "signals": [ {"id": "LR4_O2_LAMBDA_B2", "path": "Engine", "fmt": { "len": 16, "max": 1.999, "div": 32768, "unit": "scalar" }, "name": "O2 Lambda B2S1", "description": "Bank 2 sensor 1. Rails at FFFF on roughly half of samples; treat those as invalid rather than lean."}, {"id": "LR4_O2_VOLTAGE_B2", "path": "Engine", "fmt": { "bix": 16, "len": 16, "max": 7.999, "div": 8192, "unit": "volts" }, "name": "O2 Voltage B2S1"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F42E"}, "freq": 10, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F42E"}, "freq": 120, "signals": [ {"id": "LR4_EVAP_PURGE", "path": "Fuel", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Commanded Evap Purge"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F415"}, "freq": 20, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F415"}, "freq": 120, "signals": [ {"id": "LR4_O2_S2_VOLTAGE", "path": "Engine", "fmt": { "len": 8, "max": 1.275, "div": 200, "unit": "volts" }, "name": "O2 Voltage B1S2"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F456"}, "freq": 60, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F456"}, "freq": 120, "signals": [ {"id": "LR4_SEC_O2_TRIM_B1", "path": "Fuel", "fmt": { "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "Long Term Secondary O2 Trim B1"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F445"}, "freq": 60, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F445"}, "freq": 120, "signals": [ {"id": "LR4_THROTTLE_REL", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Relative Throttle Position"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F447"}, "freq": 60, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F447"}, "freq": 120, "signals": [ {"id": "LR4_THROTTLE_B", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Absolute Throttle Position B"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F458"}, "freq": 60, - "signals": [ - {"id": "LR4_458_RAW", "hidden": true, "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "458 Raw", "description": "Undecoded. The ECM reports PID 58 as supported; one sample so far, 0x7F."} - ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F466"}, "freq": 5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F466"}, "freq": 30, "signals": [ - {"id": "LR4_MAF_A", "path": "Engine", "fmt": { "bix": 8, "len": 16, "max": 2047.96, "div": 32, "unit": "gramsPerSecond" }, "name": "Mass Air Flow A", "description": "One of two intake tract sensors. A and B disagreed by 17.5% on the single sample taken at idle; they sum to roughly what the single MAF PID reports."}, + {"id": "LR4_MAF_A", "path": "Engine", "fmt": { "bix": 8, "len": 16, "max": 2047.96, "div": 32, "unit": "gramsPerSecond" }, "name": "Mass Air Flow A", "description": "One of two intake tract sensors. Across 1,474 samples A and B sum to 0.88 of the single MAF PID by least squares, but the scatter between individual pairs is large enough that the split between the two is not trustworthy at this polling rate. Use the single MAF PID for anything quantitative."}, {"id": "LR4_MAF_B", "path": "Engine", "fmt": { "bix": 24, "len": 16, "max": 2047.96, "div": 32, "unit": "gramsPerSecond" }, "name": "Mass Air Flow B", "description": "One of two intake tract sensors. See Mass Air Flow A."} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F467"}, "freq": 60, "signals": [ - {"id": "LR4_COOLANT_TEMP_1", "path": "Engine", "fmt": { "bix": 8, "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Coolant Temp Sensor 1"}, - {"id": "LR4_COOLANT_TEMP_2", "path": "Engine", "fmt": { "bix": 16, "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Coolant Temp Sensor 2"} + {"id": "LR4_CAC_COOLANT_TEMP", "path": "Engine", "fmt": { "bix": 16, "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Charge Cooler Coolant Temp", "description": "The AJ126 runs a separate low-temperature circuit for the supercharger intercooler. Over 135 paired samples this sat 11.7 C above ambient and 24 C below charge air temperature, which is where that circuit belongs. Sensor 1 of the same PID was dropped: it matched the engine coolant PID to 0.0 C."} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F468"}, "freq": 60, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F468"}, "freq": 120, "signals": [ - {"id": "LR4_IAT_1", "path": "Engine", "fmt": { "bix": 8, "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Intake Air Temp Sensor 1"}, - {"id": "LR4_IAT_2", "path": "Engine", "fmt": { "bix": 16, "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Intake Air Temp Sensor 2"} + {"id": "LR4_IAT_1", "path": "Engine", "fmt": { "bix": 8, "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Intake Air Temp Sensor 1", "description": "Pre-supercharger inlet air, measured 9.2 C above ambient over 135 samples."}, + {"id": "LR4_IAT_2", "path": "Engine", "fmt": { "bix": 16, "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Intake Air Temp Sensor 2", "description": "Post-supercharger charge air. Tracks the proprietary charge air temperature DID to within 2.7 C on average, so it is close to redundant with it."} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F470"}, "freq": 15, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F470"}, "freq": 120, "signals": [ - {"id": "LR4_BOOST_CMD_A", "path": "Engine", "fmt": { "bix": 8, "len": 16, "max": 2047.96875, "div": 32, "unit": "kilopascal" }, "name": "Commanded Boost Pressure A"}, - {"id": "LR4_BOOST_A", "path": "Engine", "fmt": { "bix": 24, "len": 16, "max": 2047.96875, "div": 32, "unit": "kilopascal" }, "name": "Boost Pressure Sensor A", "description": "Decoded against SAE J1979 PID 70. The support byte reports channel A present and channel B absent, so the B signals are expected to read zero."}, - {"id": "LR4_BOOST_CMD_B", "path": "Engine", "fmt": { "bix": 40, "len": 16, "max": 2047.96875, "div": 32, "unit": "kilopascal" }, "name": "Commanded Boost Pressure B"}, - {"id": "LR4_BOOST_B", "path": "Engine", "fmt": { "bix": 56, "len": 16, "max": 2047.96875, "div": 32, "unit": "kilopascal" }, "name": "Boost Pressure Sensor B", "description": "Channel B is reported absent by the support byte; expected to read zero."} + {"id": "LR4_BOOST_A", "path": "Engine", "fmt": { "bix": 24, "len": 16, "max": 2047.96875, "div": 32, "unit": "kilopascal" }, "name": "Manifold Pressure (Fine)", "description": "SAE J1979 PID 70 channel A. Over 525 samples it tracks the 1 kPa manifold pressure PID to within 1.3 kPa on average, so it is the same measurement at 1/32 kPa resolution, not a separate pre-throttle sensor. The other three channels the PID defines read a constant zero and have been removed."} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F404"}, "freq": 3, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F404"}, "freq": 5, "signals": [ {"id": "LR4_LOAD_CALC", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Calculated Load", "suggestedMetric": "engineLoad"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F405"}, "freq": 5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F405"}, "freq": 15, "signals": [ {"id": "LR4_COOLANT_TEMP", "path": "Engine", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Coolant Temp", "suggestedMetric": "engineCoolantTemperature"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F406"}, "freq": 5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F406"}, "freq": 15, "signals": [ {"id": "LR4_SHRTFT1", "path": "Fuel", "fmt": { "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "Short Term Fuel Trim B1", "suggestedMetric": "shortTermFuelTrim"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F407"}, "freq": 5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F407"}, "freq": 30, "signals": [ {"id": "LR4_LONGFT1", "path": "Fuel", "fmt": { "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "Long Term Fuel Trim B1"} ]}, @@ -263,23 +183,23 @@ "signals": [ {"id": "LR4_LONGFT2", "path": "Fuel", "fmt": { "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "Long Term Fuel Trim B2", "description": "Bank 2. There is no long-term fuel trim metric slot, so this does not surface as a connectable."} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40B"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40B"}, "freq": 5, "signals": [ {"id": "LR4_MAP", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "kilopascal" }, "name": "Manifold Pressure"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40C"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40C"}, "freq": 2, "signals": [ {"id": "LR4_RPM", "path": "Engine", "fmt": { "len": 16, "max": 16383.75, "div": 4, "unit": "rpm" }, "name": "Engine Speed", "suggestedMetric": "engineSpeed"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40D"}, "freq": 1, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40D"}, "freq": 2, "signals": [ {"id": "LR4_SPEED", "path": "Movement", "fmt": { "len": 8, "max": 255, "unit": "kilometersPerHour" }, "name": "Vehicle Speed", "suggestedMetric": "speed"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40E"}, "freq": 3, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40E"}, "freq": 15, "signals": [ {"id": "LR4_SPARK_ADV", "path": "Engine", "fmt": { "len": 8, "max": 63.5, "min": -64, "div": 2, "add": -64, "unit": "degrees" }, "name": "Timing Advance"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40F"}, "freq": 30, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40F"}, "freq": 60, "signals": [ {"id": "LR4_IAT", "path": "Engine", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Intake Air Temp"} ]}, @@ -287,11 +207,11 @@ "signals": [ {"id": "LR4_MAF", "path": "Engine", "fmt": { "len": 16, "max": 655.35, "div": 100, "unit": "gramsPerSecond" }, "name": "Mass Air Flow", "suggestedMetric": "massAirFlow"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F411"}, "freq": 3, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F411"}, "freq": 5, "signals": [ {"id": "LR4_THROTTLE_POS", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Throttle Position", "suggestedMetric": "throttlePosition"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F41F"}, "freq": 30, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F41F"}, "freq": 120, "signals": [ {"id": "LR4_RUN_TIME", "path": "Engine", "fmt": { "len": 16, "max": 65535, "unit": "seconds" }, "name": "Run Time Since Engine Start"} ]}, @@ -307,11 +227,11 @@ "signals": [ {"id": "LR4_WARMUPS", "path": "Trips", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "Warm-ups Since Codes Cleared"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F431"}, "freq": 30, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F431"}, "freq": 300, "signals": [ {"id": "LR4_DIST_SINCE_CLR", "path": "Trips", "fmt": { "len": 16, "max": 65535, "nullmin": 0, "unit": "kilometers" }, "name": "Distance Since Codes Cleared", "suggestedMetric": "distanceSinceDTCsCleared"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F433"}, "freq": 5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F433"}, "freq": 60, "signals": [ {"id": "LR4_BARO", "path": "Engine", "fmt": { "len": 8, "max": 255, "unit": "kilopascal" }, "name": "Barometric Pressure"}, {"id": "LR4_ALTITUDE", "path": "Movement", "name": "Altitude", "description": "Derived from barometric pressure by lookup, not from GPS. Accurate to a few hundred feet and wrong in unusual weather.", "fmt": {"len": 8, "map": { @@ -369,40 +289,41 @@ }} } ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F434"}, "freq": 3, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F434"}, "freq": 10, "signals": [ {"id": "LR4_O2_LAMBDA", "path": "Engine", "fmt": { "len": 16, "max": 2, "div": 32768, "nullmin": 0, "unit": "scalar" }, "name": "O2 Lambda B1S1", "suggestedMetric": "o2Lambda"}, {"id": "LR4_O2_VOLTAGE", "path": "Engine", "fmt": {"bix": 16, "len": 16, "max": 7.999, "div": 8192, "unit": "volts" }, "name": "O2 Sensor Voltage"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F43C"}, "freq": 30, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F43C"}, "freq": 60, "signals": [ {"id": "LR4_CAT_TEMP_B1", "path": "Engine", "fmt": { "len": 16, "max": 6513.5, "min": -40, "div": 10, "add": -40, "unit": "celsius" }, "name": "Catalyst Temp B1S1"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F43D"}, "freq": 30, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F43D"}, "freq": 60, "signals": [ {"id": "LR4_CAT_TEMP_B2", "path": "Engine", "fmt": { "len": 16, "max": 6513.5, "min": -40, "div": 10, "add": -40, "unit": "celsius" }, "name": "Catalyst Temp B2S1"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F442"}, "freq": 30, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F442"}, "freq": 60, "signals": [ {"id": "LR4_BAT_V", "path": "Battery", "fmt": { "len": 16, "max": 65.535, "div": 1000, "unit": "volts" }, "name": "Battery Voltage", "suggestedMetric": "starterBatteryVoltage"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F443"}, "freq": 3, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F443"}, "freq": 15, "signals": [ {"id": "LR4_LOAD_ABS", "path": "Engine", "fmt": { "len": 16, "max": 25700, "mul": 100, "div": 255, "unit": "percent" }, "name": "Absolute Load", "suggestedMetric": "absoluteEngineLoad"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F444"}, "freq": 3, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F444"}, "freq": 5, "signals": [ - {"id": "LR4_EQ_RATIO", "path": "Engine", "fmt": { "len": 16, "max": 2, "div": 32768, "unit": "scalar" }, "name": "Equivalence Ratio", "suggestedMetric": "commandedLambda"} + {"id": "LR4_EQ_RATIO", "path": "Engine", "fmt": { "len": 16, "max": 2, "div": 32768, "unit": "scalar" }, "name": "Equivalence Ratio", "suggestedMetric": "commandedLambda"}, + {"id": "LR4_FUEL_DIVISOR", "hidden": true, "path": "Engine", "fmt": { "len": 16, "max": 6.084, "div": 10771.53, "unit": "scalar" }, "name": "Fuel Rate Divisor", "description": "Commanded lambda premultiplied by 14.7 x 745 / 3600 so that mass air flow divided by this value is litres per hour. Exists only because synthetic signals support a plain ratio with no constant; it is the constant, folded into the divisor."} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F446"}, "freq": 30, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F446"}, "freq": 60, "signals": [ {"id": "LR4_AMBIENT_TEMP", "path": "Climate", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Ambient Air Temp"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F449"}, "freq": 3, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F449"}, "freq": 15, "signals": [ {"id": "LR4_PEDAL_D", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Accelerator Pedal D"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F44A"}, "freq": 3, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F44A"}, "freq": 15, "signals": [ {"id": "LR4_PEDAL_E", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Accelerator Pedal E"} ]}, @@ -410,16 +331,19 @@ "signals": [ {"id": "LR4_THROTTLE_CMD", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Commanded Throttle"} ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E68"}, "freq": 30, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E68"}, "freq": 60, "signals": [ {"id": "LR4_1E68_RAW", "hidden": true, "path": "Transmission", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "1E68 Raw (varies most)", "description": "Undecoded transmission DID, neighbour of the gearbox temperature."} ]}, -{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E69"}, "freq": 5, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E69"}, "freq": 30, "signals": [ {"id": "LR4_GEARBOX_OIL_TEMP", "path": "Drivetrain", "fmt": { "len": 8, "max": 120, "min": -40, "add": -40, "unit": "celsius" }, "name": "Gearbox Temp", "suggestedMetric": "transmissionFluidTemperature"} ]} ], "synthetics": [ + { "id": "LR4_FUEL_RATE", "path": "Fuel", "name": "Fuel Rate", "max": 120, "unit": "litersPerHour", "suggestedMetric": "fuelRate", "formula": { + "op": "ratio", "a": "LR4_MAF", "b": "LR4_FUEL_DIVISOR" + }}, { "id": "LR4_BANK_BALANCE", "path": "Engine", "name": "Bank Balance", "max": 3, "unit": "scalar", "formula": { "op": "ratio", "a": "LR4_CAT_TEMP_B1", "b": "LR4_CAT_TEMP_B2" }}, diff --git a/tests/test_cases/2016/command_support.yaml b/tests/test_cases/2016/command_support.yaml index f3265ce..53bde9e 100644 --- a/tests/test_cases/2016/command_support.yaml +++ b/tests/test_cases/2016/command_support.yaml @@ -1,31 +1,14 @@ model_year: 2016 supported_commands_by_ecu: - "726": - - "726.220202" "732": - 732.22D928 "761": - 761.22197C - 761.22D11C - "792": - - 792.222A32 - - 792.222A33 - - 792.222A34 - - 792.222A35 - - 792.222A36 - - 792.222A37 - - 792.222A38 - - 792.222A39 - - 792.222A3A - - 792.222A3B - - 792.222A3C "795": - - 795.221E88 - - 795.221E89 - 795.221E8A "7D3": - 7D3.222B12 - - 7D3.223B00 - 7D3.223B01 - 7D3.223B02 - 7D3.223B03 @@ -33,10 +16,8 @@ supported_commands_by_ecu: - 7D3.223B05 - 7D3.223B06 - 7D3.223B07 - - 7D3.223B08 - 7D3.223B0B - 7D3.223B3C - - 7D3.223B4D - 7D3.223B71 - 7D3.223B72 - 7D3.22D11A @@ -162,7 +143,6 @@ supported_commands_by_ecu: - 7E0.22F44A - 7E0.22F44C - 7E0.22F456 - - 7E0.22F458 - 7E0.22F466 - 7E0.22F467 - 7E0.22F468 @@ -198,7 +178,6 @@ supported_commands_by_ecu: - 7E1.7E9.015A - 7E1.7E9.221E68 - 7E1.7E9.221E69 - - 7E1.7E9.221E6A - 7E1.7E9.22DD01 "7E8": - 7E8.0103 From 40b93bbf9a01b8a3ce23dbe409c91b289602e9e6 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 20 Sep 2026 18:35:39 -0600 Subject: [PATCH 77/84] say where the metric gap bites, not just that it exists The suspension section, the off-road no-data section and the new charge cooler signal all needed the same caveat spelled out locally: resetting the app's vehicle profile brings those modules back to life, but none of their signals carry a suggestedMetric, so none of them will ever be recorded as history either way. Live readouts and scan logs only. Claude-Session: https://claude.ai/code/session_01Kzsf15spEW5oNrt7zCt8Z7 --- README.md | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 67a6711..56a4254 100644 --- a/README.md +++ b/README.md @@ -154,7 +154,9 @@ turned out to be genuinely separate sensors and were kept. Charge Cooler Coolant Temp: it ran 11.7°C above ambient and 24°C below charge air temperature over those same samples, which is where the AJ126's separate low-temperature intercooler circuit belongs. A genuinely new -signal, not a rename in name only. +signal, not a rename in name only — but it carries no `suggestedMetric`, +so it will never be stored as history by the app; see "Only signals with a +metric are ever recorded" under Polling. **PID 70 channel A is manifold pressure, at finer resolution — not a separate boost sensor.** This corrects "F470 was boost pressure all along," @@ -207,11 +209,11 @@ Normal standing pressures are roughly 40 psi per corner at normal ride height, rising with load and with raised height modes. **None of this module's signals carry a `suggestedMetric`, and the app -only ever stores signals that do** — see "The app only ever stores signals -that carry a `suggestedMetric`" under Polling. Corner pressures, ride -height, compressor activity and module voltage are all live-only: even -once `7D3` is un-retired and answering again, nothing from this table will -ever show up in the app's own history, only in the raw scan logs. +only ever stores signals that do** — see "Only signals with a metric are +ever recorded" under Polling. Corner pressures, ride height, compressor +activity and module voltage are all live-only: even once `7D3` is +un-retired and answering again, nothing from this table will ever show up +in the app's own history, only in the raw scan logs. --- @@ -497,6 +499,12 @@ from this drive. Until the app's learned vehicle profile is reset, no suspension or gear-selector data will be collected on a drive no matter what this signalset asks for. +And even once it is reset: none of the suspension signals carry a +`suggestedMetric`, so none of them will ever be recorded as *history* by +the app regardless — see "Only signals with a metric are ever recorded" +under Polling. Un-retiring `7D3` restores live readouts and raw scan-log +coverage, not a trip history for ride height or corner pressure. + ### Air suspension The four corner pressures are the most useful thing you have off-road. On From 969b26576ed3841b9316a2a52b7bcde7298dd133 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 20 Sep 2026 19:46:54 -0600 Subject: [PATCH 78/84] the ratchet was wrong: the app just polls what it stores I read one day of sessions and called it a one-way ratchet in which the app permanently retires ECUs, then told the owner to delete and re-add the vehicle. He pushed back and asked whether this was new. It wasn't. Taking the longest session of each day since 09-05, coverage has been 12 to 23 distinct DIDs every time. The 137-minute off-road drive polled 23 -- the widest of any long session in the period. The drive was not degraded, it was the best long session on record, and 61-of-84 is simply what this app has always done. The stable core explains itself. Thirteen commands appear in every long session since 09-05 and they are exactly thirteen of the sixteen carrying a suggestedMetric at the time. The app converges on polling what it will store. Modules with no metric-bearing command drift out of the rotation, which covers 7D3, 792, 732, 726 and 761 without needing a ratchet. Coverage recovers on its own every time the signalset changes. Nothing is stuck and nothing needs resetting from inside the app. The retraction is recorded in place rather than deleted, because the wrong version was convincing. The signalset itself is untouched: the budget cut, the nineteen deletions, the duplicate decodes, the ride height bitfield and the fuel rate all rest on direct measurement, not on this explanation. Claude-Session: https://claude.ai/code/session_01Kzsf15spEW5oNrt7zCt8Z7 --- CLAUDE.md | 36 ++++++++---- README.md | 170 +++++++++++++++++++++++++++++++++-------------------- TESTING.md | 23 ++++---- 3 files changed, 141 insertions(+), 88 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 78a7830..87119d2 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -128,19 +128,29 @@ These have all actually bitten: the main checkout, or the agent must be told explicitly to check out that branch — otherwise it silently operates on stale files and produces confident, wrong results. -5. **The app retires ECUs permanently when the signalset overdraws its - request budget, and it never retries them.** Measured on 2026-09-20: at - 09:57 the app addressed every header the signalset names; by 10:59 it - had stopped addressing `726` and `761`; by 12:40 `732` and `792`; by - 14:07 `7D3`. The modules were answering correctly when they were - dropped. On the 137-minute drive that followed, 61 of 84 commands were - never sent once — not throttled, never requested. **A command's presence - in this file does not mean it is being collected.** Check the scan logs - before relying on one. Nothing in this repo can un-retire a module; the - app's learned vehicle profile has to be reset from inside the app. The - defence is to stay under the 4.2 req/s ceiling and to delete commands - that have been proven dead rather than leaving them in at a slow `freq`, - because each one still costs a module-discovery attempt. +5. **The app settles on a working set of roughly twenty commands and + ignores the rest, however big this file is.** Taking the longest session + of each day since 2026-09-05, coverage has been 12 to 23 distinct DIDs + every time, including the 137-minute drive on 09-20 that polled 23 — the + widest of any long session in the period. Coverage spikes right after + the signalset changes (108 DIDs on the morning of 09-20, 965 during a + PID detector run) and then settles back within hours. + + The stable core is exactly the metric-carrying commands. Thirteen + commands appear in every long session since 09-05, and they are + precisely thirteen of the sixteen that carried a `suggestedMetric` at + the time. Read with trap 8, the rule is that **the app converges on + polling what it will store.** Modules with no metric-bearing command on + them — `7D3`, `792`, `732`, `726`, `761` — drift out of the rotation + entirely. + + **A command's presence in this file does not mean it is being + collected.** Check the scan logs before relying on one. But do not read + a quiet module as a broken or "retired" one: an earlier version of this + trap claimed the app permanently retires ECUs and told the owner to + reset the app's vehicle profile. That was wrong. It came from reading + one day's sessions without the months behind them, and coverage + recovers on its own every time the file changes. 6. **Standard mode-01 PIDs are already being polled by the app, constantly, and a proprietary DID may duplicate one.** Before adding a signal, check diff --git a/README.md b/README.md index 56a4254..9ff9865 100644 --- a/README.md +++ b/README.md @@ -211,9 +211,10 @@ height, rising with load and with raised height modes. **None of this module's signals carry a `suggestedMetric`, and the app only ever stores signals that do** — see "Only signals with a metric are ever recorded" under Polling. Corner pressures, ride height, compressor -activity and module voltage are all live-only: even once `7D3` is -un-retired and answering again, nothing from this table will ever show up -in the app's own history, only in the raw scan logs. +activity and module voltage are all live-only: even when `7D3` is being +polled, nothing from this table will ever show up in the app's own +history, only in the raw scan logs. It is also why the app drifts away +from asking `7D3` anything at all between signalset changes. --- @@ -487,23 +488,27 @@ suspension and rear differential. It produced none of that data. Every signal the test was aimed at lives on a module the app had already stopped addressing before the drive started: ride height, height sensors, corner pressures, compressor activity and Terrain Response all live on `7D3`, -which the app retired at 14:07 that day, over an hour before the drive -began. The two rear-differential-lock candidates lived on `795`, which the -app was still addressing, but neither DID was among the 23 commands it -chose to poll that session — see "The app retires ECUs permanently, one -session at a time" under Polling for why. +which the app had not addressed since 14:07 that day. The two +rear-differential-lock candidates lived on `795`, which the app was still +addressing, but neither DID was among the 23 commands it polled that +session. + +This is not damage and it is not new. Long sessions have settled to +between 12 and 23 commands for six weeks, and this drive's 23 was the +widest coverage of any long session in that period — see "The app +converges on a small working set" under Polling. The suspension module +carries no metric-bearing command, so the app has no reason to keep asking +it anything once the novelty of a signalset change wears off. Everything below about air suspension and the rear differential was recovered from earlier sessions already present in the same log file, not -from this drive. Until the app's learned vehicle profile is reset, no -suspension or gear-selector data will be collected on a drive no matter -what this signalset asks for. +from this drive. -And even once it is reset: none of the suspension signals carry a -`suggestedMetric`, so none of them will ever be recorded as *history* by -the app regardless — see "Only signals with a metric are ever recorded" -under Polling. Un-retiring `7D3` restores live readouts and raw scan-log -coverage, not a trip history for ride height or corner pressure. +The deeper constraint is separate and permanent: none of the suspension +signals carry a `suggestedMetric`, so none of them will ever be recorded as +*history* by the app — see "Only signals with a metric are ever recorded" +under Polling. Getting `7D3` polled again restores live readouts and raw +scan-log coverage, not a trip history for ride height or corner pressure. ### Air suspension @@ -705,52 +710,82 @@ more than double. Engine speed is back on a real cadence (2s) and carries the `engineSpeed` metric; it had not been polled since 2026-08-30 — see below for why. -### The app retires ECUs permanently, one session at a time +### The app converges on a small working set, and it is roughly what it can store -Headers the app actually addressed, by session, on 2026-09-20: +An earlier version of this section claimed the app "retires ECUs +permanently" in a one-way ratchet, and recommended resetting the app's +vehicle profile. **That was wrong, and it was wrong because it read a +single day's sessions without checking the months behind them.** The +correction is recorded here rather than deleted, because the wrong version +was convincing. -| Time | Headers addressed | -|---|---| -| 09:57 | `726`, `732`, `761`, `792`, `795`, `7D3`, `7DF`, `7E0`–`7E7` — everything this file names | -| 10:59 | `726` and `761` gone | -| 12:40 | `732` and `792` gone | -| 14:07 | `7D3` gone | -| 15:14 (session 2525, the off-road drive) | Unchanged from 14:07 | - -Once a module is dropped it is never retried. This is a ratchet, not a -fluctuation, and it isn't about the modules going bad: in the 12:40 session -every `7D3` command returned a valid response right up until the app -stopped asking. - -During session 2525's 137-minute drive, 61 of this file's 84 commands (the -count before today's cut to 66) were never sent once — not throttled, not -degraded, never requested. The 23 that were polled all start at minute 0.1 -or 0.6 and run continuously to minute 137.4, so this isn't a mid-drive -dropout either. It also isn't the stale-signalset explanation from -2026-08-30, reframed below: no commit in this file's history matches the -polled set, and four commands added earlier the same day were among the 23 -being polled — a stale copy of the file wouldn't include same-day -additions. - -**A command's presence in this file does not mean it is being collected.** -Check the scan logs before relying on one. Nothing in this repo can -un-retire a module — the app has learned that `7D3`, `792`, `732`, `726` -and `761` don't answer and has stopped addressing them, and that has to be -reset from inside the app (probably by removing and re-adding the -vehicle), not from this file. Whether staying under the 4.2 req/s ceiling -stops the ratchet from taking more modules is untested; the next drive is -the test. - -### Eight commands went quiet for three weeks — the first sighting of the ratchet, not a separate incident +What the daily history actually shows, taking the longest session of each +day since 2026-09-05 — the only sessions comparable to a drive: + +| Session | Date | Minutes | Distinct DIDs polled | +|---|---|---|---| +| 2397 | 09-05 | 67.2 | 13 | +| 2402 | 09-06 | 25.9 | 17 | +| 2426 | 09-09 | 63.9 | 17 | +| 2441 | 09-10 | 57.8 | 17 | +| 2460 | 09-11 | 63.9 | 17 | +| 2470 | 09-13 | 35.5 | 17 | +| 2495 | 09-19 | 50.0 | 19 | +| 2497 | 09-19 | 38.7 | 18 | +| 2525 | 09-20 | 137.7 | **23** | + +Long sessions have settled to between 12 and 19 commands for six weeks. +The off-road drive polled 23, which is *more than any other long session in +the period*. The drive was not degraded. It was the best long session on +record, and the 61-of-84 figure is simply what this app has always done. + +The stable core is the interesting part. Thirteen commands appear in every +long session going back to 09-05: `03F3`, `1E69`, `DD01`, `F404`, `F405`, +`F406`, `F40D`, `F410`, `F42F`, `F431`, `F434`, `F442`, `F444`. Those are +exactly thirteen of the sixteen commands that carried a `suggestedMetric` +at the time. Not approximately — exactly. The three metric-carrying +commands missing from the core are `F40C`, `F411` and `F443`, and `F411` +joined the working set later. + +Read alongside "Only signals with a metric are ever recorded" below, the +behaviour is coherent: **the app converges on polling the commands whose +values it is going to keep.** Commands without a metric get exercised for a +while after the signalset changes and then thin out, because the app has +nothing to do with their values. + +That also explains the peripheral modules without inventing a ratchet. +`7D3`, `792`, `732`, `726` and `761` do not carry a single metric-bearing +command between them. They are not being punished; there is nothing on them +the app would store. + +The one-day pattern that produced the ratchet theory is real but means +something duller. Coverage spikes after the signalset changes and then +settles: 108 distinct DIDs at 09:57 on 09-20, then 54, 58, 19 and 23 as the +day went on, with several PRs merged in between. Session 2493 on 09-19 hit +965 DIDs, which was the PID detector sweep. Coverage recovers on its own +every time the file changes. **Nothing is stuck, and nothing needs +resetting from inside the app.** + +**A command's presence in this file still does not mean it is being +collected** — check the scan logs before relying on one. But the reason is +ordinary triage by the app, not damage. + +What remains untested is whether cutting the request budget changes which +commands make the working set. Asking for 10.53 req/s against a 4.2 req/s +ceiling meant the app chose the 40% it would serve; asking for 3.922 means +it does not have to choose. Whether it then serves all 66 is exactly what +the next drive measures. + +### Eight commands went quiet for three weeks — the first sighting of the working set, not a separate incident This section originally explained an isolated 2026-08-30 incident as a -stale copy of the signalset on the app's side. It wasn't isolated. It was -the first visible symptom of the retirement ratchet described above, and -at the time nobody knew the ratchet existed. The history below is kept -as-is because the reasoning in it — ruling out the request budget and the -`freq` tiers before landing on "the app must be holding stale data" — was -a reasonable read of the evidence available that day. It just wasn't the -right answer. +stale copy of the signalset on the app's side. It wasn't isolated, and the +stale copy was only half of it. Those eight commands were sitting outside +the working set the app settles on between signalset changes, described +above. The history below is kept as-is because the reasoning in it — ruling +out the request budget and the `freq` tiers before landing on "the app must +be holding stale data" — was a reasonable read of the evidence available +that day, and because the refresh really did bring them back for a while. Between 2026-08-30 and 2026-09-19, eight commands in this file were never requested on a drive: `F40C`, `F411`, `F40E`, `F443`, `F449`, `F44A`, `F407` @@ -763,10 +798,14 @@ and `LR4_PEDAL_AGREEMENT` needing `F449` and `F44A`. polled that morning. `F40C` was requested 172 times and answered 172 times, and engine speed was recorded for the first time in fourteen months. At the time this was credited to the app picking up a fresher copy -of the signalset. Later the same day, session 2525 showed the real -pattern: the app hadn't fixed anything, it had simply not yet retired the -modules carrying those eight commands. It went on to retire four more -modules that same day. +of the signalset, and that reading has held up: coverage does spike right +after the file changes. What it does not do is stay there. By the 15:14 +session the working set was back to 23 commands, and `F40C` was outside it +again. The eight commands were never broken; they sit outside the set the +app settles on between signalset changes, which is roughly the commands +whose values it stores. `F40C` carries `engineSpeed` and should have been +in that set, and its absence is the one part of this that is still +unexplained. Getting to the "stale signalset" explanation meant ruling out the two obvious causes, and both remain worth knowing even though the explanation @@ -947,7 +986,8 @@ The narrative above tracks the file growing to 89 commands at 10.93 req/s over the course of 2026-09-20. Later the same day, session 2525 showed that budget had been measured against the wrong ceiling — 11 req/s that was never really available, against a true UDS share of about 4.2 req/s — -and that four more ECUs had been permanently retired in the meantime. The +and that the app settles on a working set of roughly twenty commands +between signalset changes regardless of what the file asks for. The response was the nineteen deletions listed under "Undecoded" (dead across all logged history, not one drive), the duplicate signals resolved under "Duplicates found and removed" (PID 67 sensor 1 deleted outright, three of @@ -988,8 +1028,8 @@ temperature or boost. **None of those can ever be looked at historically through the app.** They exist live, or in the raw scan logs, and nowhere else. -That includes the suspension work in its entirety. Even once the retired -`7D3` module is polled again, no ride height and no corner pressure will be +That includes the suspension work in its entirety. Even when the +`7D3` module is being polled, no ride height and no corner pressure will be recorded as history. It includes the charge cooler coolant temperature newly decoded from PID 67 sensor 2 — a real signal, genuinely new, that will never persist. diff --git a/TESTING.md b/TESTING.md index 12707fa..1c9714d 100644 --- a/TESTING.md +++ b/TESTING.md @@ -11,8 +11,8 @@ not on suspicion. ## Open in-vehicle tasks -- [ ] **Reset the Pelican app's learned vehicle profile — before any of the suspension or differential tasks below.** The app has permanently dropped five ECUs and will not retry them. Scan logs from 2026-09-20 show it addressing every module at 09:57, then losing `726` and `761` by 10:59, `732` and `792` by 12:40, and `7D3` by 14:07 — all while those modules were still answering correctly. The 15:14 off-road drive ran 137 minutes with 61 of 84 commands never sent once, and collected zero suspension data (ride height, terrain response and the suspension pressures all live on `7D3`) and zero differential data (the diff-lock DIDs live on `795`, which wasn't even among the 23 commands still being polled by then). **Nothing in this repo can fix this.** It needs the owner to reset the app's learned profile, most likely by removing and re-adding the vehicle in the app, before it happens again. -- [ ] **Verify the cut-down signalset on the next drive.** The polling budget was cut from 10.53 req/s to 3.922 req/s (109 commands down to 66) because measurement showed the app only ever delivers about 4.2 req/s to signalset traffic, no matter how many commands are in the file — see the profile-reset task above for what overdrawing that ceiling does. Two explicit pass criteria: (1) all 66 commands are actually being polled, and (2) no further module gets retired. +- [ ] **Get the suspension module back into the polling rotation.** `7D3` carries no metric-bearing command, and the app converges on polling only what it stores, so it drifts out of the rotation between signalset changes. It was last addressed at 14:07 on 2026-09-20 and the 15:14 off-road drive collected no suspension data at all. Coverage does come back on its own whenever the signalset changes, so merging a PR is the cheap lever: check the first drive after a merge. Do **not** delete and re-add the vehicle — nothing is stuck, and an earlier version of this task wrongly said it was. +- [ ] **Verify the cut-down signalset on the next drive.** The polling budget was cut from 10.53 to 3.922 req/s (85 commands down to 66) because measurement showed the app only ever delivers about 4.2 req/s to signalset traffic, no matter how many commands are in the file. Asking for 10.53 against a 4.2 ceiling meant the app picked which 40% to serve; asking for 3.922 means it does not have to pick. Two pass criteria: (1) all 66 commands are actually polled, and (2) coverage on a long drive beats 23 distinct DIDs, which is the best any long session has managed in six weeks. - [ ] **Re-run `22F187` against module `726`.** Every other module rejected it with NRC 31, but `726` returned a malformed reply carrying VIN bytes instead. Terminal sequence: `ATSH 726`, `ATCRA 72E`, `22F187`. (Unaffected by the profile-reset issue above — this is a hand-typed terminal probe, not app polling.) - [x] **Confirm which signalset version the Pelican app is actually holding.** Done 2026-09-20: the app was holding a stale signalset. A forced refresh brought all 109 commands into the poll cycle — `F40C` answered 172 of 172 requests, and engine speed was recorded for the first time. - [x] **A drive with a ride-height change.** Done 2026-09-20: `3B01`, `3B3C`, all four corner pressures, both height sensors and the compressor all moved. Access height did register — in the pressures and height sensors — contrary to what it looked like from the driver's seat. Update 2026-09-20 (log review): the reason Access looked unreliable was ours — `3B3C` is a bitfield, not an ordinal. Observed values across all history are `0x01` (216 samples), `0x02` (11), `0x04` (5), `0x0D` (4); the old map ran 0-3 with 0 labelled Access, and 0 never occurs. Pinned against the inverted front height sensor, where a falling value means the truck is rising: `0x01` (front mean 111.4) is Normal, `0x02` (front mean 90.4, truck highest) is Off-Road, `0x04` (front mean 133.0, truck lowest) is Access, `0x0D` (front mean 120.5) is in transit. Map corrected to `1, 2, 4, 13`. Access should register cleanly once `7D3` is being polled again — see the profile-reset task above. @@ -217,14 +217,17 @@ It does not change at 1 Hz and was taking 0.9 req/s of a budget that had no slack. Total demand is 10.53 req/s across 85 commands. **Outcome, found in the scan logs afterward:** this is the drive that caused -the ECU retirement described at the top of this file. The app addressed -every module at 09:57, then dropped `726` and `761` by 10:59, `732` and -`792` by 12:40, and `7D3` by 14:07 — over an hour before the 15:14 off-road -segment even started. 10.53 req/s across 85 commands was never a demand the -app could sustain; it only ever delivers about 4.2 req/s to signalset -traffic. The suspension and differential re-tiering above (`7D3/3B01`, -`7D3/3B4D`, `795/1E88`, `795/1E89`) collected nothing, because those -modules were already gone by the time the off-road segment ran. The budget +the working-set discovery described at the top of this file. The app addressed +every module at 09:57, right after a signalset change, then narrowed +through 54, 58 and 19 distinct DIDs as the day went on, and was down to a +23-command working set by the time the 15:14 off-road segment started. +10.53 req/s across 85 commands was never a demand the app could sustain; it +only ever delivers about 4.2 req/s to signalset traffic. The suspension and +differential re-tiering above (`7D3/3B01`, `7D3/3B4D`, `795/1E88`, +`795/1E89`) collected nothing, because none of those commands were in that +working set. Worth keeping in proportion: 23 distinct DIDs is the widest +coverage any long session has managed since 09-05, so the drive was not an +unusually bad one. The budget has since been cut to 3.922 req/s across 66 commands — see the verification task in "Open in-vehicle tasks" above. From 4e3849f1153018d19b19cfbe6c149f95a973941e Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 20 Sep 2026 19:59:43 -0600 Subject: [PATCH 79/84] put the probes back and add six more The cull was wrong. I deleted nineteen commands for reading constant, but most had between 6 and 30 samples and none of those samples covered the event the command would report. 1E88's six readings were all taken with the differential unlocked, which says nothing about a diff lock DID. A signal that only moves during a rare event looks dead until the event happens, and deleting it guarantees it never gets caught. F458 was not weak evidence, it was a misread. 62F458 7F is a positive reply carrying data byte 0x7F, not a 7F negative response. PID 58 is long term secondary O2 trim bank 2, the counterpart to PID 56 already in the file, and 0x7F is -0.78%. Now mapped as LR4_SEC_O2_TRIM_B2. All nineteen are back at exploratory cadences: the event-driven ones (1E88, 1E89, 3B4D) at 60s, 3B00 and 3B08 at 120s, the rest at 600s. The whole set costs 0.03 req/s against a 4.2 ceiling, so the budget was never the real argument for removing them. 3B4D stays despite being the one genuinely conclusive case, because at 600s it is free. Also adds six probes the ECM's own supported-PID bitmask says exist and that this file has never requested: PID 23 fuel rail gauge pressure (158 logged samples, 35 to 197 bar, the right shape for this DI rail and worth comparing against 033E), PID 01 and PID 41 monitor status, PID 13 O2 sensors present, PID 51 fuel type, PID 1C OBD standard. 91 commands at 4.043 req/s, still under the ceiling, with twenty-five more things to look at than before the cut. Claude-Session: https://claude.ai/code/session_01Kzsf15spEW5oNrt7zCt8Z7 --- CLAUDE.md | 7 ++ README.md | 79 ++++++++++------ TESTING.md | 12 +-- signalsets/v3/default.json | 100 +++++++++++++++++++++ tests/test_cases/2016/command_support.yaml | 33 ++++++- 5 files changed, 197 insertions(+), 34 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 87119d2..ad46a9c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -152,6 +152,13 @@ These have all actually bitten: one day's sessions without the months behind them, and coverage recovers on its own every time the file changes. + A corollary for pruning: a quiet command is not a dead one. Nineteen + commands were deleted on 2026-09-20 for being constant and restored the + same day, because most had between 6 and 30 samples and none of those + samples covered the event the command would report — `1E88`'s six were + all taken with the differential unlocked. A probe costs 0.0017 req/s at + `freq` 600. Deleting it costs the answer. Park it, don't cull it. + 6. **Standard mode-01 PIDs are already being polled by the app, constantly, and a proprietary DID may duplicate one.** Before adding a signal, check whether the truck already answers it somewhere cheaper, and check whether diff --git a/README.md b/README.md index 9ff9865..9ed690d 100644 --- a/README.md +++ b/README.md @@ -539,7 +539,8 @@ height sensors and the corner pressures all move together and in the directions their labels predict — see "Air suspension notes" below. `3B4D`, once considered for Drive Mode or Terrain Response, is neither: a later audit across 236 samples spanning many drives and several terrain modes -found it constant at `0x00` throughout, and it has been deleted. Terrain +found it constant at `0x00` throughout. It stays in the file as a 600s +probe. Terrain Response itself remains unidentified on this truck — nothing currently in the signalset is known to carry it. @@ -564,26 +565,49 @@ formulas eventually get worked out. | `761` / `769` | `197C`, `D11C` — the most active unmined DIDs on the truck, four distinct values each in four samples | | `7D3` / `7DB` | `3B01`, `3B02`, `3B0B` — `3B01` looks like the ride-height state word (see "Air suspension notes" under Off-road); `3B02` answers four single-byte values that look like one per corner | -Nineteen commands that used to sit in this section were deleted on -2026-09-20, on evidence across all logged history rather than a single -drive: +### Nineteen commands deleted, and restored -| Command | Evidence | Verdict | -|---|---|---| -| `726` / `0202` | One value (`0x00`) in 13 samples | Dead | -| `792` / `2A32`–`2A3C` (eleven commands) | Nine return a single constant, two return two values each; the module itself was never identified | Dead. Moved to `TESTING.md` as a manual probe | -| `795` / `1E88` | Constant `0x0000` in 6 samples | Dead. One of the two rear-diff-lock candidates | -| `795` / `1E89` | `0x09C4` in 24 of 25 samples | Dead. The other diff-lock candidate | -| `7E1` / `1E6A` | Constant `0x00` in 29 samples | Dead | -| `7D3` / `3B00` | `0x00000003` in 54 of 55 samples | Dead | -| `7D3` / `3B08` | Constant `0x00` in 64 samples | Dead | -| `7D3` / `3B4D` | Constant `0x00` across 236 samples spanning many drives and several terrain modes | Dead. This was the Terrain Response candidate — it isn't, and appears to be nothing. See "Terrain Response and 3B4D" below | -| `7E0` / `F458` | Returns a `7F` negative response | Dead | - -Deleting a command this way — evidence across the full log history rather -than one drive — is the standard this file now holds new deletions to. A -DID that stays flat through a real height change, a real terrain-mode -cycle, and everything in between doesn't need a second chance. +These were deleted on 2026-09-20 and restored the same day, because the +deletion was a mistake worth recording. +The reasoning was that each was constant across its logged samples. The +sample counts were the problem: + +| Command | Samples | Distinct values | Was the evidence conclusive? | +|---|---|---|---| +| `726` / `0202` | 13 | 1 | No | +| `792` / `2A32`–`2A3C` (eleven) | 10–19 each | 1–3 | No | +| `795` / `1E88` | 6 | 1 | No | +| `795` / `1E89` | 25 | 2 | No | +| `7E1` / `1E6A` | 29 | 1 | No | +| `7D3` / `3B00` | 55 | 2 | Borderline | +| `7D3` / `3B08` | 64 | 1 | Borderline | +| `7D3` / `3B4D` | 236 | 1 | Yes | +| `7E0` / `F458` | 1 | 1 | No, and the reading was wrong | + +Six samples is not evidence that a rear differential lock DID is dead; it +is evidence that the differential was never locked while anyone was +looking. A signal that only moves during a rare event looks constant until +the event happens, and deleting it guarantees the event is never caught. + +`F458` was worse than weak — it was misread. `62F458 7F` is a *positive* +reply carrying the data byte `0x7F`, not a `7F` negative response. PID 58 +is the long term secondary oxygen sensor trim for bank 2, the counterpart +to PID 56 which this file already carried, and `0x7F` decodes to -0.78%. +It is now mapped properly as `LR4_SEC_O2_TRIM_B2`. + +All nineteen are back, at exploratory cadences rather than their old ones: +the event-driven candidates (`1E88`, `1E89`, `3B4D`) at 60s, `3B00` and +`3B08` at 120s, and the rest parked at 600s. Restoring the whole set costs +0.03 req/s against a 4.2 req/s ceiling, so the budget was never the real +argument for removing them. `3B4D` stays in despite being the one genuinely +conclusive case, because at 600s it is free and the cost of being wrong +about it is another six weeks of not knowing. + +The standard this file now holds deletions to: a DID needs enough samples +to have covered the event it would report, not merely a lot of samples. +Hundreds of readings taken while the differential was never locked say +nothing about a differential lock DID. When in doubt, park it at 600s +instead — a probe costs 0.0017 req/s and deleting it costs the answer. **The suspension decodes check out.** Replaying every logged sample through the formats in this file gives corner pressures of 34-50 psi, a ride height @@ -595,8 +619,9 @@ candidate for Terrain Response. Across all logged history it returns a constant `0x00` — 236 samples, spanning many drives and several terrain modes, not just the one 2026-09-20 drive that first flagged it as flat. That's not "unconfirmed," it's answered: `3B4D` is not Terrain Response and -appears to be nothing. It has been deleted rather than kept as a probe — -see "Nineteen commands deleted" above. +appears to be nothing. It is nonetheless still in the file at 600s, because +that costs 0.0017 req/s and leaves the door open — see "Nineteen commands +deleted, and restored" above. What the audit could not do is say anything about suspension health. Across fourteen months only 36 minutes have all four corner pressures captured @@ -903,7 +928,7 @@ The file is now 73 commands at 10.55 req/s. A DID that moves on a real drive earns a proper decode. One that stays flat through a full cycle — including a ride-height change and a terrain-mode -switch — can be deleted for good rather than on suspicion. Do not read a +switch — can be judged on evidence rather than on suspicion. Do not read a `7F 22 31` as "unsupported" without checking whether an extended session would have changed the answer. @@ -956,7 +981,7 @@ present. That can never change, so it is recorded here instead of polled. Two still needed samples at the time: `F456` (three samples, all near zero) and `F458` (one sample, `7F`, meaning unknown). `F458` is now resolved — it returns a `7F` negative response consistently and has been -deleted; see "Nineteen commands deleted" under Undecoded. `F456` stayed in +deleted; see "Nineteen commands deleted, and restored" under Undecoded. `F456` stayed in at `freq` 120. `F470` was read against the SAE J1979 definition of PID 70: its ten bytes @@ -988,8 +1013,10 @@ that budget had been measured against the wrong ceiling — 11 req/s that was never really available, against a true UDS share of about 4.2 req/s — and that the app settles on a working set of roughly twenty commands between signalset changes regardless of what the file asks for. The -response was the nineteen deletions listed under "Undecoded" (dead across -all logged history, not one drive), the duplicate signals resolved under +response was a re-tiering rather than a cull: nineteen commands were +deleted and then restored as slow probes once it was clear the evidence +against most of them was six to thirty samples (see "Nineteen commands +deleted, and restored" under Undecoded), the duplicate signals resolved under "Duplicates found and removed" (PID 67 sensor 1 deleted outright, three of PID 70's four channels dropped as dead alongside it), and a re-tiering of everything that survived. The result is the 66-command, 3.922 req/s budget diff --git a/TESTING.md b/TESTING.md index 1c9714d..995d4d5 100644 --- a/TESTING.md +++ b/TESTING.md @@ -17,10 +17,10 @@ not on suspicion. - [x] **Confirm which signalset version the Pelican app is actually holding.** Done 2026-09-20: the app was holding a stale signalset. A forced refresh brought all 109 commands into the poll cycle — `F40C` answered 172 of 172 requests, and engine speed was recorded for the first time. - [x] **A drive with a ride-height change.** Done 2026-09-20: `3B01`, `3B3C`, all four corner pressures, both height sensors and the compressor all moved. Access height did register — in the pressures and height sensors — contrary to what it looked like from the driver's seat. Update 2026-09-20 (log review): the reason Access looked unreliable was ours — `3B3C` is a bitfield, not an ordinal. Observed values across all history are `0x01` (216 samples), `0x02` (11), `0x04` (5), `0x0D` (4); the old map ran 0-3 with 0 labelled Access, and 0 never occurs. Pinned against the inverted front height sensor, where a falling value means the truck is rising: `0x01` (front mean 111.4) is Normal, `0x02` (front mean 90.4, truck highest) is Off-Road, `0x04` (front mean 133.0, truck lowest) is Access, `0x0D` (front mean 120.5) is in transit. Map corrected to `1, 2, 4, 13`. Access should register cleanly once `7D3` is being polled again — see the profile-reset task above. - [ ] **Confirm `3B01` bit `0x400`.** `0x100` is pinned to Normal and `0x800` to Access, both measured against the height sensor. `0x400` has been seen once and never alongside a height sample — Off-Road by elimination, unconfirmed. Needs a deliberate Off-Road selection, once `7D3` is answering again. -- [ ] **Find a working rear-differential-lock DID on `795`, if the owner still wants this signal.** `1E88` (constant `0000` across 6 samples) and `1E89` (constant `09C4` in 24 of 25 samples) were both effectively dead and have been deleted. A different DID, found by manual probing, is the only way back to this. +- [ ] **Catch the rear differential locking while `1E88` and `1E89` are being sampled.** Both look constant — `1E88` flat `0000`, `1E89` flat `09C4` — but on 6 and 25 samples respectively, none of them taken with the diff actually locked. That is not evidence they are dead, it is evidence nobody was watching at the right moment. Both are now polled at 60s. Lock the diff deliberately, hold it, and check the scan logs afterwards. If they stay flat through a real lock cycle, *then* they are dead and a manual probe sweep of `795` is the next move. - [ ] **A cold start.** Needed for the warm-up curves on `113F` and `2104`, and to catch the crank dip on `1153`/`1154`. - [ ] **Identify module `792`.** Dropped from the signalset entirely on 2026-09-20 — its eleven `2A3x` DIDs came back nine constants and two near-constants, and the module itself has never been identified. Not worth polling any more; still worth one terminal sweep. Try `22F18C` and `22F191` against it the way the other six unmined modules were probed on 2026-09-19. -- [ ] **Mine the four still-unidentified modules** — `716`, `726`, `737`, `797`. Each returned a distinct ECU serial via `22F18C` but rejected `22F191`, so they are real and separate but their function is unknown. (`726`'s only known DID, `0202`, was deleted from the signalset on 2026-09-20 for staying `00` across 13 samples — the module itself is still unidentified.) +- [ ] **Mine the four still-unidentified modules** — `716`, `726`, `737`, `797`. Each returned a distinct ECU serial via `22F18C` but rejected `22F191`, so they are real and separate but their function is unknown. (`726`'s only known DID, `0202`, has stayed `00` across 13 samples, which is far too few to call it — it is parked at 600s rather than removed. The module itself is still unidentified.) - [ ] **Sweep module `760` for wheel speeds.** `760` was identified as the ABS/brake module on 2026-09-19 and has never been mined. Individual wheel speeds would enable dragging-brake detection, a tire-size mismatch check, and a better speed reference than the single `F40D` value. A parked terminal sweep — no drive needed. - [ ] **Read fault codes.** This file has no DTC coverage at all — modes `03` (stored), `07` (pending), `0A` (permanent), plus UDS service `19` for the non-OBD modules. Pending codes are the earliest warning available on a vehicle this age and have never been looked at. This probably can't be expressed in an OBDb signalset, so it stays a terminal task rather than something to add to `default.json`. - [ ] **Sanity-check the computed fuel-rate synthetic against real fill-ups.** PID `5E` isn't supported per the ECM's own supported-PID bitmask, so fuel rate can't be read directly — it's now derived from MAF and commanded lambda instead. Validated to within about 18% of the tank gauge over one 91.5 km drive; comparing against a few real fill-ups is the only way to actually calibrate it. @@ -193,7 +193,7 @@ moved" so far only means "never moved while parked." | `7E0` | `F468` | 300 | Raw single-byte probe from the ECM's own supported-PID bitmask decode; no data read yet | Whether it answers at all, and what payload width comes back | | `7E0` | `F470` | 300 | Raw single-byte probe from the ECM's own supported-PID bitmask decode; no data read yet | Whether it answers at all, and what payload width comes back | -**Deleted 2026-09-20:** `726/0202`, all eleven of `792`'s `2A3x` DIDs (`2A32`-`2A3C`), `795/1E88`, `795/1E89`, `7E1/1E6A`, `7D3/3B00`, `7D3/3B08` and `7E0/F458` — nineteen commands in total, counting `7D3/3B4D` (Terrain Response, already renamed `LR4_3B4D_RAW` before this pass) which never had a row here. Every one was killed by the same criterion: a constant or near-constant value held across enough samples — parked and driving both — to be conclusive. +**Deleted and restored 2026-09-20:** `726/0202`, all eleven of `792`'s `2A3x` DIDs (`2A32`-`2A3C`), `795/1E88`, `795/1E89`, `7E1/1E6A`, `7D3/3B00`, `7D3/3B08`, `7D3/3B4D` and `7E0/F458` — nineteen commands, removed for being constant and then put straight back. The evidence did not hold up: most had between 6 and 30 samples, and `1E88`'s six samples were all taken with the differential unlocked. Only `3B4D` (236 samples across several terrain modes) was ever conclusive, and it stays in anyway at 600s because that costs 0.0017 req/s. `F458` was simply misread — `62F458 7F` is a positive reply carrying `0x7F`, not a negative response, and it is now decoded as long term secondary O2 trim bank 2. **The rule going forward: a probe needs enough samples to have covered the event it would report, not merely a lot of samples. When in doubt, park it at 600s.** --- @@ -234,8 +234,10 @@ task in "Open in-vehicle tasks" above. Three rows in that table are now answered, from earlier sessions in the same log rather than from the drive itself. `7D3/3B4D` is dead: constant `0x00` across 236 samples spanning several terrain modes, so a mode change was not -the missing ingredient and the command has been deleted. `795/1E88` and -`795/1E89` are dead on the same evidence and are also gone. `7E0/F466`'s +the missing ingredient. It stays in at 600s regardless. `795/1E88` and +`795/1E89` are *not* settled on the same evidence — six and 25 samples, none +with the differential locked — and both are back at 60s to catch a real +lock cycle. `7E0/F466`'s 17.5% disagreement did not survive contact with data: across 1,474 samples the two channels sum to 0.88 of the single mass airflow PID by least squares, with individual pairs scattering far too widely to trust the split. The diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index e0b1fb5..d7dc935 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -111,6 +111,106 @@ "signals": [ {"id": "LR4_ODOMETER", "path": "Trips", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "kilometers" }, "name": "Odometer", "suggestedMetric": "odometer"} ]}, +{ "hdr": "726", "rax": "72E", "cmd": {"22": "0202"}, "freq": 600, + "signals": [ + {"id": "LR4_726_0202_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "726 0202 Raw", "description": "The only non-identification DID ever found on module 726, from a sweep of 0000-03FF. Has only ever returned 00."} + ]}, +{ "hdr": "7E1", "rax": "7E9", "cmd": {"22": "1E6A"}, "freq": 600, + "signals": [ + {"id": "LR4_1E6A_RAW", "hidden": true, "path": "Drivetrain", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "1E6A Raw", "description": "Undecoded transmission DID, neighbour of the gearbox temperature."} + ]}, +{ "hdr": "795", "rax": "79D", "cmd": {"22": "1E88"}, "freq": 60, + "signals": [ + {"id": "LR4_1E88_RAW", "hidden": true, "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "1E88 Raw", "description": "Undecoded rear differential DID. Flat at 0000 on every sample so far; a lock cycle is the test."} + ]}, +{ "hdr": "795", "rax": "79D", "cmd": {"22": "1E89"}, "freq": 60, + "signals": [ + {"id": "LR4_1E89_RAW", "hidden": true, "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "1E89 Raw", "description": "Undecoded rear differential DID. Flat at 09C4 on every sample so far."} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A32"}, "freq": 600, + "signals": [ + {"id": "LR4_2A32_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A32 Raw"} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A33"}, "freq": 600, + "signals": [ + {"id": "LR4_2A33_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A33 Raw"} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A34"}, "freq": 600, + "signals": [ + {"id": "LR4_2A34_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A34 Raw"} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A35"}, "freq": 600, + "signals": [ + {"id": "LR4_2A35_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A35 Raw"} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A36"}, "freq": 600, + "signals": [ + {"id": "LR4_2A36_RAW", "hidden": true, "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A36 Distance Counter"} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A37"}, "freq": 600, + "signals": [ + {"id": "LR4_2A37_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A37 Raw"} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A38"}, "freq": 600, + "signals": [ + {"id": "LR4_2A38_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A38 Raw"} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A39"}, "freq": 600, + "signals": [ + {"id": "LR4_2A39_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A39 Raw"} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A3A"}, "freq": 600, + "signals": [ + {"id": "LR4_2A3A_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A3A Raw"} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A3B"}, "freq": 600, + "signals": [ + {"id": "LR4_2A3B_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A3B Raw"} + ]}, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A3C"}, "freq": 600, + "signals": [ + {"id": "LR4_2A3C_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A3C Raw"} + ]}, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B00"}, "freq": 120, + "signals": [ + {"id": "LR4_3B00_RAW", "hidden": true, "path": "Suspension", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "3B00 Raw", "description": "Undecoded suspension DID. Flat through a real ride-height change, but on three samples only."} + ]}, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B08"}, "freq": 120, + "signals": [ + {"id": "LR4_3B08_RAW", "hidden": true, "path": "Suspension", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "3B08 Raw", "description": "Undecoded suspension DID. Flat through a real ride-height change, but on three samples only."} + ]}, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B4D"}, "freq": 60, + "signals": [ + {"id": "LR4_3B4D_RAW", "hidden": true, "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "3B4D Raw", "description": "Previously labelled Drive Mode, which it is not: it has read 0 on every sample ever taken, including through ride-height changes. A Terrain Response change is the untried test."} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F458"}, "freq": 120, + "signals": [ + {"id": "LR4_SEC_O2_TRIM_B2", "path": "Fuel", "fmt": { "len": 8, "max": 99.2, "min": -100, "mul": 100, "div": 128, "add": -100, "unit": "percent" }, "name": "Long Term Secondary O2 Trim B2", "description": "SAE J1979 PID 58, the bank 2 counterpart to PID 56. Previously carried as an undecoded raw byte and briefly deleted on the mistaken reading that its single logged reply was a negative response; 62F458 7F is a positive reply meaning -0.78%."} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F423"}, "freq": 60, + "signals": [ + {"id": "LR4_FUEL_RAIL_GAUGE_P", "path": "Fuel", "fmt": { "len": 16, "max": 655350, "mul": 10, "unit": "kilopascal" }, "name": "Fuel Rail Gauge Pressure", "description": "SAE J1979 PID 23. Answers: 158 logged samples ranging 0x015F to 0x07B6, which scales to 35 to 197 bar and is the right shape for this engine's direct injection rail. Compare against the proprietary rail pressure DID 033E, which reads far lower on the same engine; one of the two is scaled wrong and this one matches the hardware."} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F401"}, "freq": 600, + "signals": [ + {"id": "LR4_MONITOR_STATUS", "hidden": true, "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "Monitor Status Raw", "description": "SAE J1979 PID 01: MIL state, stored DTC count and readiness monitors. Listed as supported by the ECM's own bitmask but never once requested. Top byte is the DTC count with the MIL bit; a non-zero value here is the cheapest possible check for a stored fault."} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F441"}, "freq": 600, + "signals": [ + {"id": "LR4_MONITOR_THIS_CYCLE", "hidden": true, "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "Monitor Status This Cycle Raw", "description": "SAE J1979 PID 41, readiness monitors for the current drive cycle. Supported per the ECM bitmask, never requested. Changes across a drive as monitors complete, so unlike PID 01 it should not be static."} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F413"}, "freq": 600, + "signals": [ + {"id": "LR4_O2_SENSORS_PRESENT", "hidden": true, "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "O2 Sensors Present Raw", "description": "SAE J1979 PID 13, a bitmask of which oxygen sensor positions exist. Answered 0x77 on its one logged sample. Static, but it says exactly which O2 PIDs are worth probing."} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F451"}, "freq": 600, + "signals": [ + {"id": "LR4_FUEL_TYPE", "hidden": true, "path": "Fuel", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "Fuel Type Raw", "description": "SAE J1979 PID 51. Supported per the ECM bitmask, never requested. Static, one sample settles it."} + ]}, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F41C"}, "freq": 600, + "signals": [ + {"id": "LR4_OBD_STANDARD", "hidden": true, "path": "ECU", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "OBD Standard Raw", "description": "SAE J1979 PID 1C, which OBD standard this ECM claims. Supported per the bitmask, never requested. Static."} + ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F403"}, "freq": 120, "signals": [ {"id": "LR4_FUEL_SYS_B1", "path": "Fuel", "fmt": { "len": 8, "max": 255, "map": { "1": { "description": "Open loop, engine cold", "value": "OpenLoopCold" }, "2": { "description": "Closed loop", "value": "ClosedLoop" }, "4": { "description": "Open loop, load or decel fuel cut", "value": "OpenLoopLoad" }, "8": { "description": "Open loop, system fault", "value": "OpenLoopFault" }, "16": { "description": "Closed loop with a feedback fault", "value": "ClosedLoopFault" } } }, "name": "Fuel System Status B1"}, diff --git a/tests/test_cases/2016/command_support.yaml b/tests/test_cases/2016/command_support.yaml index 53bde9e..c8428f8 100644 --- a/tests/test_cases/2016/command_support.yaml +++ b/tests/test_cases/2016/command_support.yaml @@ -1,14 +1,31 @@ model_year: 2016 supported_commands_by_ecu: + "726": + - "726.220202" "732": - 732.22D928 "761": - 761.22197C - 761.22D11C + "792": + - 792.222A32 + - 792.222A33 + - 792.222A34 + - 792.222A35 + - 792.222A36 + - 792.222A37 + - 792.222A38 + - 792.222A39 + - 792.222A3A + - 792.222A3B + - 792.222A3C "795": + - 795.221E88 + - 795.221E89 - 795.221E8A "7D3": - 7D3.222B12 + - 7D3.223B00 - 7D3.223B01 - 7D3.223B02 - 7D3.223B03 @@ -16,8 +33,10 @@ supported_commands_by_ecu: - 7D3.223B05 - 7D3.223B06 - 7D3.223B07 + - 7D3.223B08 - 7D3.223B0B - 7D3.223B3C + - 7D3.223B4D - 7D3.223B71 - 7D3.223B72 - 7D3.22D11A @@ -53,6 +72,9 @@ supported_commands_by_ecu: - 7DF.015A - 7DF.015C "7E0": + - "0111:TP" + - "0142:VPWR" + - "0145:TP_R" - 0101:ACRF_RDY,ACRF_SUP,AIR_RDY,AIR_SUP,CAT_RDY,CAT_SUP,CCM_RDY,CCM_SUP,CIM_SUP,DTC_CNT,EGR_RDY,EGR_SUP,EVAP_RDY,EVAP_SUP,FUEL_RDY,FUEL_SUP,HCAT_RDY,HCAT_SUP,HTR_RDY,HTR_SUP,MIL,MIS_RDY,MIS_SUP,O2S_RDY,O2S_SUP - 0103:FUELSYS1,FUELSYS2 - 0104:LOAD_PCT @@ -67,7 +89,6 @@ supported_commands_by_ecu: - 010E:SPARKADV - 010F:IAT - 0110:MAF - - "0111:TP" - 0113:O2S11_EXISTS,O2S12_EXISTS,O2S13_EXISTS,O2S14_EXISTS,O2S21_EXISTS,O2S22_EXISTS,O2S23_EXISTS,O2S24_EXISTS - 0115:O2S12,SHRTFT11 - 0119:O2S22,SHRTFT22 @@ -84,10 +105,8 @@ supported_commands_by_ecu: - 013C:CATEMP11 - 013D:CATEMP21 - 0141:ACRFCMPL,ACRF_ENA,AIR_CMPL,AIR_ENA,CAT_CMPL,CAT_ENA,CCM_CMPL,CCM_ENA,CIM_SUP_FLAG,EGR_CMPL,EGR_ENA,EVAPCMPL,EVAP_ENA,FUEL_CMPL,FUEL_ENA,HCATCMPL,HCAT_ENA,HTR_CMPL,HTR_ENA,MIS_CMPL,MIS_ENA,O2S_CMPL,O2S_ENA - - "0142:VPWR" - 0143:LOAD_ABS - 0144:EQ_RAT - - "0145:TP_R" - 0146:AAT - 0147:TP_B - 0149:APP_D @@ -107,6 +126,7 @@ supported_commands_by_ecu: - 7E0.2203F3 - 7E0.220520 - 7E0.22DD01 + - 7E0.22F401 - 7E0.22F403 - 7E0.22F404 - 7E0.22F405 @@ -121,9 +141,12 @@ supported_commands_by_ecu: - 7E0.22F40F - 7E0.22F410 - 7E0.22F411 + - 7E0.22F413 - 7E0.22F415 + - 7E0.22F41C - 7E0.22F41F - 7E0.22F421 + - 7E0.22F423 - 7E0.22F42E - 7E0.22F42F - 7E0.22F430 @@ -133,6 +156,7 @@ supported_commands_by_ecu: - 7E0.22F438 - 7E0.22F43C - 7E0.22F43D + - 7E0.22F441 - 7E0.22F442 - 7E0.22F443 - 7E0.22F444 @@ -142,7 +166,9 @@ supported_commands_by_ecu: - 7E0.22F449 - 7E0.22F44A - 7E0.22F44C + - 7E0.22F451 - 7E0.22F456 + - 7E0.22F458 - 7E0.22F466 - 7E0.22F467 - 7E0.22F468 @@ -178,6 +204,7 @@ supported_commands_by_ecu: - 7E1.7E9.015A - 7E1.7E9.221E68 - 7E1.7E9.221E69 + - 7E1.7E9.221E6A - 7E1.7E9.22DD01 "7E8": - 7E8.0103 From 0a40eed374cfbcd02011d102220a2c772bf4bd21 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 20 Sep 2026 22:33:37 -0600 Subject: [PATCH 80/84] three things I called dead moved as soon as a feature was used The restored probes paid off within hours, and the merge did what it was supposed to: coverage went from 23 distinct DIDs across 10 modules to 70 across 13, with 87 of 90 commands polled. Every module that had drifted out came back on its own. No app reset, and deleting the vehicle would have been wrong. 3B4D is alive. It was the one deletion I called conclusive -- flat 0x00 across 236 samples -- and it returned 0x04, 0x01 and 0x00 within eight minutes of the off-road features being used. It does not track the ride height mode PID, so Terrain Response is back to being the leading candidate. Now at 30s. Six of the eleven 792 counters advance: 2A32 through 2A37 gained 14000, 480, 960, 2170, 88 and 1 over 111 km and nine hours. They are counters, not constants. What they count is still unknown because that window mixed driving with parked time, so they now poll at 120s to make one drive enough to regress against distance and running time. 3B01's last bit is pinned. 0x400 was Off-Road by elimination; it was caught twice at a front reading of 85 to 89 with the mode PID reading Off-Road. 3B01 is a mapped signal now: 0x100 Normal, 0x400 Off-Road, 0x800 Access. The ride height map checks out against a screenshot showing Access, which had never displayed before the map was fixed. All six new probes answered. MIL off with zero stored DTCs, six oxygen sensors, gasoline, OBD-II, and a rail gauge pressure that ranges 29 to 197 bar against 033E's 41 to 46 over the same evening. Also corrects two documented claims. hidden: true does not hide anything -- fifteen hidden signals are on screen in the screenshots. And non-metric signals do display live, which resolves the open question: the bandwidth buys a readout, just never history. Claude-Session: https://claude.ai/code/session_01Kzsf15spEW5oNrt7zCt8Z7 --- CLAUDE.md | 12 +++++- README.md | 84 +++++++++++++++++++++++++++++++++----- TESTING.md | 8 ++-- signalsets/v3/default.json | 25 +++++++----- 4 files changed, 103 insertions(+), 26 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index ad46a9c..9bf5517 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -159,6 +159,12 @@ These have all actually bitten: all taken with the differential unlocked. A probe costs 0.0017 req/s at `freq` 600. Deleting it costs the answer. Park it, don't cull it. + The restored probes settled this within hours. `3B4D` — the one deletion + called conclusive, flat `0x00` across 236 samples — returned `0x04`, + `0x01` and `0x00` within eight minutes of the off-road features actually + being used. Six of the eleven `792` `2A3x` DIDs turned out to be + advancing counters rather than constants. + 6. **Standard mode-01 PIDs are already being polled by the app, constantly, and a proprietary DID may duplicate one.** Before adding a signal, check whether the truck already answers it somewhere cheaper, and check whether @@ -177,7 +183,11 @@ These have all actually bitten: 14.7 x 745 / 3600, so MAF divided by it is litres per hour. 8. **Only signals carrying a `suggestedMetric` are ever written to the - app's signal database.** Measured over fifteen months of backups: the + app's signal database, but every signal displays live.** Screenshots on + 2026-09-20 confirm non-metric and `hidden: true` signals alike appear + with current values in the app's section lists — so `hidden` does not + suppress anything, and bandwidth spent on a metric-less signal still + buys a readout. What it does not buy is history. Measured over fifteen months of backups: the store has held exactly 15 distinct signals, and they are precisely the ones with a metric. Everything else is requested, answered, decoded and discarded. During a 137-minute drive on 2026-09-20 the 14 signals diff --git a/README.md b/README.md index 9ed690d..60802e6 100644 --- a/README.md +++ b/README.md @@ -603,6 +603,60 @@ argument for removing them. `3B4D` stays in despite being the one genuinely conclusive case, because at 600s it is free and the cost of being wrong about it is another six weeks of not knowing. +### What the restored probes did within hours + +The probes went back in, the change was merged, and one short evening drive +on 2026-09-20 in which the off-road features were deliberately used settled +three of them. The merge also did what it was predicted to: coverage on the +next sessions jumped from 23 distinct DIDs and 10 modules to **70 DIDs and +13 modules**, with 87 of the file's 90 commands polled. Every module that +had drifted out — `726`, `732`, `761`, `792`, `7D3` — came back without +anyone touching the app. + +**`3B4D` is alive, and it was the one deletion called conclusive.** Constant +`0x00` across 236 samples, deleted, restored at 60s on the argument that the +samples had never covered the event. Within eight minutes of the features +being used it returned `0x04`, `0x01` and `0x00`. It does not track the ride +height mode PID, so it is reporting something else, and Terrain Response is +back to being the leading candidate. It now polls at 30s and needs one +sample per selectable mode to map. + +**Six of the eleven `792` counters advance.** They were written off on 10 to +19 samples each, all taken within one morning. Nine hours and 111 km later: + +| DID | Was | Now | Gain | Per km | +|---|---|---|---|---| +| `2A32` | 404,720 | 420,200 | +14,000 | 126 | +| `2A33` | 212,490 | 212,970 | +480 | 4.3 | +| `2A34` | 2,240 | 3,200 | +960 | 8.6 | +| `2A35` | 335,400 | 337,570 | +2,170 | 19.5 | +| `2A36` | 43,275 | 43,363 | +88 | 0.8 | +| `2A37` | 107 | 108 | +1 | 0.01 | + +They are counters on a module still not identified. What they count is +unknown — none of the per-km rates is a clean unit and the elapsed window +mixes driving with nine hours parked. They now poll at 120s so a single +drive yields enough samples to regress against distance and running time. +`2A38` through `2A3C` have still never moved. + +**`3B01`'s last bit is pinned.** `0x400` was Off-Road by elimination and +unconfirmed. It was caught twice at a front sensor reading of 85 to 89, the +truck at its highest, with the mode PID reading Off-Road. `3B01` is now a +mapped signal rather than a raw word: `0x100` Normal, `0x400` Off-Road, +`0x800` Access. + +**The ride height map checks out end to end.** A screenshot at 20:19 shows +Ride Height Mode reading **Access** and the rear sensor at 128; the scan log +for the same moment has `3B3C` at `0x04`, `3B01` at `0x800` and the rear +sensor at 128. Access had never once displayed before the map was corrected. + +**All six new probes answered.** PID 01 reports the MIL off with zero stored +DTCs. PID 13 returns `0x77`, six oxygen sensors, three per bank. PID 51 is +gasoline, PID 1C is OBD-II. PID 23 ranges from 29 to 197 bar across the +logs, against the proprietary `033E` reading 41 to 46 bar over the same +evening — both are live and they disagree, which is the comparison worth +making under load. + The standard this file now holds deletions to: a DID needs enough samples to have covered the event it would report, not merely a lot of samples. Hundreds of readings taken while the differential was never locked say @@ -1061,12 +1115,13 @@ recorded as history. It includes the charge cooler coolant temperature newly decoded from PID 67 sensor 2 — a real signal, genuinely new, that will never persist. -One limit on the claim: what was measured is that these signals are never -*stored*. Whether the app renders them live is a separate question the logs -cannot answer. This repo has always assumed that an `F4xx`-aliased signal -does show up live in the app, and nothing here contradicts that; it is still -an assumption, and it is one the owner can confirm from the app in a few -seconds. +One limit on the claim, now resolved: what was measured is that these +signals are never *stored*. Whether the app renders them live was a separate +question the logs could not answer, and screenshots on 2026-09-20 settled it +— **non-metric signals do display live**, with current values, in the app's +section lists. Manifold pressure, charge air temperature, the suspension +pressures and every raw probe are all on screen. So the bandwidth spent on +them buys a real readout; what it does not buy is history. The practical rule: a fast `freq` on a signal with no metric buys a live readout and nothing else. That can be worth paying for. It should be a @@ -1099,11 +1154,18 @@ Jaguar signalset does and what has never been tried here. ### Hidden signals Eleven of the file's 84 signals (including synthetics) carry `hidden: true`: -the remaining `*_RAW` probes and the `3B02` byte splits. Hiding keeps them -from cluttering the app with values nobody can interpret yet. Note that none -of them is recorded either way — none carries a metric, so `hidden` changes -only what is shown, never what is kept. A probe earns its way out of hiding -by being decoded and named. +the remaining `*_RAW` probes and the `3B02` byte splits. + +**`hidden: true` does not appear to do anything in this app.** Screenshots +taken on 2026-09-20 show `3B00 Raw`, `3B01 Raw`, `3B02 Byte 1`, `3B4D Raw`, +`3B08 Raw`, `2A32 Raw`, `2A3A Raw`, `197C Raw`, `726 0202 Raw`, `D11C Raw`, +`Monitor Status Raw`, `O2 Sensors Present Raw`, `OBD Standard Raw` and +`Fuel Type Raw` all listed with values in the Suspension, Fuel and ECU +sections. Every one of those carries `hidden: true` in this file. Whatever +the flag is for, it is not suppressing them from the section lists, so it +should not be relied on to keep clutter down. It also does not affect +recording: none of these carries a metric, so none was ever stored either +way. Eighteen signals carry a `description`, concentrated on the probes and on the decoded signals with a catch — the inverted height sensors, the bank 2 diff --git a/TESTING.md b/TESTING.md index 995d4d5..bdedfa7 100644 --- a/TESTING.md +++ b/TESTING.md @@ -15,8 +15,8 @@ not on suspicion. - [ ] **Verify the cut-down signalset on the next drive.** The polling budget was cut from 10.53 to 3.922 req/s (85 commands down to 66) because measurement showed the app only ever delivers about 4.2 req/s to signalset traffic, no matter how many commands are in the file. Asking for 10.53 against a 4.2 ceiling meant the app picked which 40% to serve; asking for 3.922 means it does not have to pick. Two pass criteria: (1) all 66 commands are actually polled, and (2) coverage on a long drive beats 23 distinct DIDs, which is the best any long session has managed in six weeks. - [ ] **Re-run `22F187` against module `726`.** Every other module rejected it with NRC 31, but `726` returned a malformed reply carrying VIN bytes instead. Terminal sequence: `ATSH 726`, `ATCRA 72E`, `22F187`. (Unaffected by the profile-reset issue above — this is a hand-typed terminal probe, not app polling.) - [x] **Confirm which signalset version the Pelican app is actually holding.** Done 2026-09-20: the app was holding a stale signalset. A forced refresh brought all 109 commands into the poll cycle — `F40C` answered 172 of 172 requests, and engine speed was recorded for the first time. -- [x] **A drive with a ride-height change.** Done 2026-09-20: `3B01`, `3B3C`, all four corner pressures, both height sensors and the compressor all moved. Access height did register — in the pressures and height sensors — contrary to what it looked like from the driver's seat. Update 2026-09-20 (log review): the reason Access looked unreliable was ours — `3B3C` is a bitfield, not an ordinal. Observed values across all history are `0x01` (216 samples), `0x02` (11), `0x04` (5), `0x0D` (4); the old map ran 0-3 with 0 labelled Access, and 0 never occurs. Pinned against the inverted front height sensor, where a falling value means the truck is rising: `0x01` (front mean 111.4) is Normal, `0x02` (front mean 90.4, truck highest) is Off-Road, `0x04` (front mean 133.0, truck lowest) is Access, `0x0D` (front mean 120.5) is in transit. Map corrected to `1, 2, 4, 13`. Access should register cleanly once `7D3` is being polled again — see the profile-reset task above. -- [ ] **Confirm `3B01` bit `0x400`.** `0x100` is pinned to Normal and `0x800` to Access, both measured against the height sensor. `0x400` has been seen once and never alongside a height sample — Off-Road by elimination, unconfirmed. Needs a deliberate Off-Road selection, once `7D3` is answering again. +- [x] **A drive with a ride-height change.** Done 2026-09-20: `3B01`, `3B3C`, all four corner pressures, both height sensors and the compressor all moved. Access height did register — in the pressures and height sensors — contrary to what it looked like from the driver's seat. Update 2026-09-20 (log review): the reason Access looked unreliable was ours — `3B3C` is a bitfield, not an ordinal. Observed values across all history are `0x01` (216 samples), `0x02` (11), `0x04` (5), `0x0D` (4); the old map ran 0-3 with 0 labelled Access, and 0 never occurs. Pinned against the inverted front height sensor, where a falling value means the truck is rising: `0x01` (front mean 111.4) is Normal, `0x02` (front mean 90.4, truck highest) is Off-Road, `0x04` (front mean 133.0, truck lowest) is Access, `0x0D` (front mean 120.5) is in transit. Map corrected to `1, 2, 4, 13`. Confirmed 2026-09-20 from a screenshot: Ride Height Mode displays **Access**, with the rear sensor at 128, and the scan log for that same moment has `3B3C` at `0x04` and `3B01` at `0x800`. Access had never displayed before the map was corrected. +- [x] **Confirm `3B01` bit `0x400`.** Done 2026-09-20. Caught twice at a front sensor reading of 85 to 89 — the truck at its highest — with the mode PID reading Off-Road at the same moment. All three bits are now measured: `0x100` Normal, `0x400` Off-Road, `0x800` Access. `3B01` is a mapped signal now, not a raw word. - [ ] **Catch the rear differential locking while `1E88` and `1E89` are being sampled.** Both look constant — `1E88` flat `0000`, `1E89` flat `09C4` — but on 6 and 25 samples respectively, none of them taken with the diff actually locked. That is not evidence they are dead, it is evidence nobody was watching at the right moment. Both are now polled at 60s. Lock the diff deliberately, hold it, and check the scan logs afterwards. If they stay flat through a real lock cycle, *then* they are dead and a manual probe sweep of `795` is the next move. - [ ] **A cold start.** Needed for the warm-up curves on `113F` and `2104`, and to catch the crank dip on `1153`/`1154`. - [ ] **Identify module `792`.** Dropped from the signalset entirely on 2026-09-20 — its eleven `2A3x` DIDs came back nine constants and two near-constants, and the module itself has never been identified. Not worth polling any more; still worth one terminal sweep. Try `22F18C` and `22F191` against it the way the other six unmined modules were probed on 2026-09-19. @@ -185,7 +185,7 @@ moved" so far only means "never moved while parked." |---|---|---|---|---| | `761` | `197C` | 30 | Unknown, 4 distinct values in 4 samples on the 2026-09-20 drive — with `D11C`, the most active unmined DIDs on the truck | Any correlation with a cabin or body state | | `761` | `D11C` | 30 | Unknown, 3A-41 (58-65); 4 distinct values in 4 samples on the 2026-09-20 drive — with `197C`, the most active unmined DIDs on the truck | Plausible temperature; compare against F446 ambient | -| `7D3` | `3B01` | 10 | Suspension, three values seen on the 2026-09-20 ride-height change (`00000400`, `00000100`, `00000800`) — looks like a ride-height state word | Needs enough samples to map each value to a height | +| `7D3` | `3B01` | 15 | Solved 2026-09-20. All three bits measured against the front height sensor; now a mapped signal: `0x100` Normal, `0x400` Off-Road, `0x800` Access | Done | | `7E0` | `F41F` | 30 | Run time since start (PID 1F) | Records as a signal - this is the alias-mechanism test against standard 011F | | `7E1` | `DD01` | 600 | Undecoded, constant 025166 in 1 samples (all parked) | Drop if still flat after a full drive cycle | | `7E0` | `F466` | 300 | Raw single-byte probe from the ECM's own supported-PID bitmask decode; no data read yet | Whether it answers at all, and what payload width comes back | @@ -208,7 +208,7 @@ and what to look for afterwards: | `7E0/F466` | 5 | Whether the 17.5% disagreement between the two mass airflow sensors holds up under load, or was an idle artifact | | `795/1E88`, `795/1E89` | 30 | First data through a rear differential lock cycle. Both have been flat at `0000` and `09C4` on every sample ever taken | | `7D3/3B4D` | 10 | Still returns `0` on every sample. A Terrain Response mode change is the only untried thing that would identify it | -| `7D3/3B01` | 10 | Three single-bit values seen so far. Enough samples across repeated height changes should map bit to height | +| `7D3/3B01` | 15 | Three single-bit values seen so far. Enough samples across repeated height changes should map bit to height — done, see above | | `7E0/F470` | 15 | Ten undecoded bytes on a supercharged engine, under sustained load for the first time | | `7E0/F42E` | 10 | Purge duty against fuel trims over two hours, which is the cleanest test of the stuck-purge-valve hypothesis | diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index d7dc935..8f8c296 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -20,7 +20,12 @@ ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B01"}, "freq": 15, "signals": [ - {"id": "LR4_3B01_RAW", "hidden": true, "path": "Suspension", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "3B01 Raw", "description": "Ride-height state word, running in parallel with the ride height mode PID. 0x100 was measured against a front sensor mean of 111.6 (Normal) and 0x800 against 133.0 (Access). 0x400 has been seen once and never alongside a height sample; Off-Road by elimination, unconfirmed."} + {"id": "LR4_RIDE_HEIGHT_STATE", "path": "Suspension", "name": "Ride Height State", "description": "Runs in parallel with the ride height mode PID and agrees with it. All three bits are now measured against the front height sensor: 0x100 at a front reading around 110 (Normal), 0x400 around 85 with the truck at its highest (Off-Road), 0x800 at 133 with it at its lowest (Access). Remember the sensor is inverted.", "fmt": {"len": 32, "map": { + "256": { "description": "Normal", "value": "Normal" }, + "1024": { "description": "Off-Road", "value": "Off-Road" }, + "2048": { "description": "Access", "value": "Access" } + }} + } ]}, { "hdr": "7E1", "rax": "7E9", "cmd": {"22": "DD01"}, "freq": 600, "signals": [ @@ -127,27 +132,27 @@ "signals": [ {"id": "LR4_1E89_RAW", "hidden": true, "path": "Drivetrain", "fmt": { "len": 16, "max": 65535, "unit": "scalar" }, "name": "1E89 Raw", "description": "Undecoded rear differential DID. Flat at 09C4 on every sample so far."} ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A32"}, "freq": 600, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A32"}, "freq": 120, "signals": [ - {"id": "LR4_2A32_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A32 Raw"} + {"id": "LR4_2A32_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A32 Raw", "description": "A counter, not a constant. Held 404720 across 19 samples taken over a single morning and was written off; nine hours and 111 km later it read 420200. 2A32 through 2A37 all advance. What they count is unknown - 2A32 gained 126 per km, 2A33 4.3, 2A34 8.6, 2A35 19.5, 2A36 0.8, 2A37 0.009 - and pinning it needs several samples within one drive, which is why these now poll at 120s."} ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A33"}, "freq": 600, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A33"}, "freq": 120, "signals": [ {"id": "LR4_2A33_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A33 Raw"} ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A34"}, "freq": 600, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A34"}, "freq": 120, "signals": [ {"id": "LR4_2A34_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A34 Raw"} ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A35"}, "freq": 600, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A35"}, "freq": 120, "signals": [ {"id": "LR4_2A35_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "2A35 Raw"} ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A36"}, "freq": 600, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A36"}, "freq": 120, "signals": [ {"id": "LR4_2A36_RAW", "hidden": true, "path": "Tires", "fmt": { "len": 24, "max": 16777215, "nullmin": 0, "unit": "scalar" }, "name": "2A36 Distance Counter"} ]}, -{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A37"}, "freq": 600, +{ "hdr": "792", "rax": "79A", "cmd": {"22": "2A37"}, "freq": 120, "signals": [ {"id": "LR4_2A37_RAW", "hidden": true, "path": "ECU", "fmt": { "len": 24, "max": 16777215, "unit": "scalar" }, "name": "2A37 Raw"} ]}, @@ -179,9 +184,9 @@ "signals": [ {"id": "LR4_3B08_RAW", "hidden": true, "path": "Suspension", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "3B08 Raw", "description": "Undecoded suspension DID. Flat through a real ride-height change, but on three samples only."} ]}, -{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B4D"}, "freq": 60, +{ "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B4D"}, "freq": 30, "signals": [ - {"id": "LR4_3B4D_RAW", "hidden": true, "path": "Suspension", "fmt": { "len": 8, "max": 255, "nullmin": 0, "unit": "scalar" }, "name": "3B4D Raw", "description": "Previously labelled Drive Mode, which it is not: it has read 0 on every sample ever taken, including through ride-height changes. A Terrain Response change is the untried test."} + {"id": "LR4_3B4D_RAW", "hidden": true, "path": "Suspension", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "3B4D Raw", "description": "Terrain Response candidate, and back in contention. It held a constant 0x00 across 236 samples and was written off as dead; the first short drive on which the off-road features were deliberately exercised produced 0x04, 0x01 and 0x00 within eight minutes. It does not track the ride height mode PID, so it is reporting something else. Needs one sample per selectable terrain mode to map."} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F458"}, "freq": 120, "signals": [ From 724b2e1c7dc2bd8bc4d9610f114bc08cf8143a54 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 20 Sep 2026 22:43:59 -0600 Subject: [PATCH 81/84] leave a visible slot for the ride-height mode nobody has logged Holding the lower button puts the truck into a held-Access mode that stays down instead of self-levelling. It appears in none of the 484 3B3C or 142 3B01 samples, and both words have exactly one unfilled slot: 3B01 bit 9 (0x200), between Normal at 0x100, Off-Road at 0x400 and Access at 0x800; and 3B3C bit 3 (0x08), seen only inside 0x0D with the truck in motion. The problem with catching it is that a mapped signal renders nothing for a value it has not been taught, so a new state would show as a blank in the app and survive only in the scan logs. That is exactly how 3B4D went unnoticed. Both DIDs now carry an untranslated twin, Ride Height State Raw and Ride Height Mode Raw, deliberately not hidden. They cost no extra request and turn an unknown state into a number. Two more suspension DIDs are not flat either. 3B00 reads 0x03 in 111 of 113 samples with one 0x103 taken at Access, and 3B02 carries a bit-8 flag that toggles the same way; 3B08 reads 0x00 in 130 of 131 with one 0x01 taken with Off-Road engaged. One sample each is not a decode, but none is dead. Claude-Session: https://claude.ai/code/session_01Kzsf15spEW5oNrt7zCt8Z7 --- README.md | 23 +++++++++++++++++++++++ TESTING.md | 21 +++++++++++++-------- signalsets/v3/default.json | 14 ++++++++------ 3 files changed, 44 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 60802e6..a4c8667 100644 --- a/README.md +++ b/README.md @@ -645,6 +645,29 @@ truck at its highest, with the mode PID reading Off-Road. `3B01` is now a mapped signal rather than a raw word: `0x100` Normal, `0x400` Off-Road, `0x800` Access. +**There is one ride-height state nobody has logged.** Holding the lower +button puts the truck into a held-Access mode that stays down rather than +self-levelling, and it appears in none of the 484 `3B3C` or 142 `3B01` +samples. Both words have exactly one unfilled slot: `3B01` bit 9 (`0x200`), +sitting between Normal at `0x100`, Off-Road at `0x400` and Access at +`0x800`; and `3B3C` bit 3 (`0x08`), which has only ever been seen inside +`0x0D` with the truck in motion between heights. One of them is the likely +home for it. + +Because a mapped signal renders nothing for a value it has not been taught, +both DIDs now carry an untranslated twin — `Ride Height State Raw` and +`Ride Height Mode Raw`. They cost no extra request and they mean an +unrecognised state arrives as a number instead of a blank. `3B4D` showing +empty in the app is exactly that failure mode, and it is why the value went +unnoticed for so long. + +Two more suspension DIDs turn out not to be flat either. `3B00` reads +`0x03` in 111 of 113 samples with one `0x103`, taken with the truck at +Access; `3B02` carries a bit-8 flag that toggles the same way; and `3B08` +reads `0x00` in 130 of 131 with a single `0x01`, taken with Off-Road +engaged and the truck at its highest. One sample each is not a decode, but +none of the three is dead. + **The ride height map checks out end to end.** A screenshot at 20:19 shows Ride Height Mode reading **Access** and the rear sensor at 128; the scan log for the same moment has `3B3C` at `0x04`, `3B01` at `0x800` and the rear diff --git a/TESTING.md b/TESTING.md index bdedfa7..a0ac19d 100644 --- a/TESTING.md +++ b/TESTING.md @@ -11,7 +11,10 @@ not on suspicion. ## Open in-vehicle tasks -- [ ] **Get the suspension module back into the polling rotation.** `7D3` carries no metric-bearing command, and the app converges on polling only what it stores, so it drifts out of the rotation between signalset changes. It was last addressed at 14:07 on 2026-09-20 and the 15:14 off-road drive collected no suspension data at all. Coverage does come back on its own whenever the signalset changes, so merging a PR is the cheap lever: check the first drive after a merge. Do **not** delete and re-add the vehicle — nothing is stuck, and an earlier version of this task wrongly said it was. +- [x] **Get the suspension module back into the polling rotation.** Done 2026-09-20 by merging PR #7. Coverage went from 23 distinct DIDs across 10 modules to 70 across 13, with 87 of 90 commands polled. `726`, `732`, `761`, `792` and `7D3` all returned on their own. No app reset was needed, and deleting the vehicle would have been the wrong move. +- [ ] **Capture the held-Access mode** (hold the lower button and the truck stays down, for car parks). It has never appeared in any log. Both height-state DIDs have exactly one slot never filled: `3B01` bit 9 (`0x200`), sitting between Normal at `0x100`, Off-Road at `0x400` and Access at `0x800`; and `3B3C` bit 3 (`0x08`), seen only inside `0x0D` while the truck was moving between heights. One of those is its likely home. Engage it, hold it a minute, then read `Ride Height State Raw` and `Ride Height Mode Raw` — both were added so an unmapped state shows as a number rather than a blank. +- [ ] **Map `3B4D` to the Terrain Response modes.** Alive after all: constant `0x00` across 236 samples, then `0x04`, `0x01` and `0x00` within eight minutes of the off-road features being used on 2026-09-20. It does not follow the ride height mode PID, so it is reporting something else. Now at 30s. Select each terrain mode in turn, hold about a minute, and note the order. +- [ ] **Work out what the `792` counters count.** `2A32` through `2A37` all advance; `2A38` through `2A3C` still never move. Over 111 km and nine hours they gained 14,000 / 480 / 960 / 2,170 / 88 / 1, but that window mixed driving with parked time so the rates are not separable. They now poll at 120s, so one uninterrupted drive gives enough samples to regress each against distance and against running time. - [ ] **Verify the cut-down signalset on the next drive.** The polling budget was cut from 10.53 to 3.922 req/s (85 commands down to 66) because measurement showed the app only ever delivers about 4.2 req/s to signalset traffic, no matter how many commands are in the file. Asking for 10.53 against a 4.2 ceiling meant the app picked which 40% to serve; asking for 3.922 means it does not have to pick. Two pass criteria: (1) all 66 commands are actually polled, and (2) coverage on a long drive beats 23 distinct DIDs, which is the best any long session has managed in six weeks. - [ ] **Re-run `22F187` against module `726`.** Every other module rejected it with NRC 31, but `726` returned a malformed reply carrying VIN bytes instead. Terminal sequence: `ATSH 726`, `ATCRA 72E`, `22F187`. (Unaffected by the profile-reset issue above — this is a hand-typed terminal probe, not app polling.) - [x] **Confirm which signalset version the Pelican app is actually holding.** Done 2026-09-20: the app was holding a stale signalset. A forced refresh brought all 109 commands into the poll cycle — `F40C` answered 172 of 172 requests, and engine speed was recorded for the first time. @@ -19,10 +22,10 @@ not on suspicion. - [x] **Confirm `3B01` bit `0x400`.** Done 2026-09-20. Caught twice at a front sensor reading of 85 to 89 — the truck at its highest — with the mode PID reading Off-Road at the same moment. All three bits are now measured: `0x100` Normal, `0x400` Off-Road, `0x800` Access. `3B01` is a mapped signal now, not a raw word. - [ ] **Catch the rear differential locking while `1E88` and `1E89` are being sampled.** Both look constant — `1E88` flat `0000`, `1E89` flat `09C4` — but on 6 and 25 samples respectively, none of them taken with the diff actually locked. That is not evidence they are dead, it is evidence nobody was watching at the right moment. Both are now polled at 60s. Lock the diff deliberately, hold it, and check the scan logs afterwards. If they stay flat through a real lock cycle, *then* they are dead and a manual probe sweep of `795` is the next move. - [ ] **A cold start.** Needed for the warm-up curves on `113F` and `2104`, and to catch the crank dip on `1153`/`1154`. -- [ ] **Identify module `792`.** Dropped from the signalset entirely on 2026-09-20 — its eleven `2A3x` DIDs came back nine constants and two near-constants, and the module itself has never been identified. Not worth polling any more; still worth one terminal sweep. Try `22F18C` and `22F191` against it the way the other six unmined modules were probed on 2026-09-19. +- [ ] **Identify module `792`.** Still unidentified, but no longer a throwaway: six of its eleven `2A3x` DIDs are advancing counters, not constants, so whatever it is keeps a running tally of something. All eleven are back in the signalset. Worth one terminal sweep alongside the counter regression — try `22F18C` and `22F191` against it the way the other six unmined modules were probed on 2026-09-19. - [ ] **Mine the four still-unidentified modules** — `716`, `726`, `737`, `797`. Each returned a distinct ECU serial via `22F18C` but rejected `22F191`, so they are real and separate but their function is unknown. (`726`'s only known DID, `0202`, has stayed `00` across 13 samples, which is far too few to call it — it is parked at 600s rather than removed. The module itself is still unidentified.) - [ ] **Sweep module `760` for wheel speeds.** `760` was identified as the ABS/brake module on 2026-09-19 and has never been mined. Individual wheel speeds would enable dragging-brake detection, a tire-size mismatch check, and a better speed reference than the single `F40D` value. A parked terminal sweep — no drive needed. -- [ ] **Read fault codes.** This file has no DTC coverage at all — modes `03` (stored), `07` (pending), `0A` (permanent), plus UDS service `19` for the non-OBD modules. Pending codes are the earliest warning available on a vehicle this age and have never been looked at. This probably can't be expressed in an OBDb signalset, so it stays a terminal task rather than something to add to `default.json`. +- [ ] **Read fault codes.** Partly answered 2026-09-20: standard PID 01 is now polled and reports the MIL off with zero stored DTCs, so there is nothing currently set. That covers the headline only — modes `03` (stored), `07` (pending), `0A` (permanent), plus UDS service `19` for the non-OBD modules. Pending codes are the earliest warning available on a vehicle this age and have never been looked at. This probably can't be expressed in an OBDb signalset, so it stays a terminal task rather than something to add to `default.json`. - [ ] **Sanity-check the computed fuel-rate synthetic against real fill-ups.** PID `5E` isn't supported per the ECM's own supported-PID bitmask, so fuel rate can't be read directly — it's now derived from MAF and commanded lambda instead. Validated to within about 18% of the tank gauge over one 91.5 km drive; comparing against a few real fill-ups is the only way to actually calibrate it. --- @@ -193,7 +196,7 @@ moved" so far only means "never moved while parked." | `7E0` | `F468` | 300 | Raw single-byte probe from the ECM's own supported-PID bitmask decode; no data read yet | Whether it answers at all, and what payload width comes back | | `7E0` | `F470` | 300 | Raw single-byte probe from the ECM's own supported-PID bitmask decode; no data read yet | Whether it answers at all, and what payload width comes back | -**Deleted and restored 2026-09-20:** `726/0202`, all eleven of `792`'s `2A3x` DIDs (`2A32`-`2A3C`), `795/1E88`, `795/1E89`, `7E1/1E6A`, `7D3/3B00`, `7D3/3B08`, `7D3/3B4D` and `7E0/F458` — nineteen commands, removed for being constant and then put straight back. The evidence did not hold up: most had between 6 and 30 samples, and `1E88`'s six samples were all taken with the differential unlocked. Only `3B4D` (236 samples across several terrain modes) was ever conclusive, and it stays in anyway at 600s because that costs 0.0017 req/s. `F458` was simply misread — `62F458 7F` is a positive reply carrying `0x7F`, not a negative response, and it is now decoded as long term secondary O2 trim bank 2. **The rule going forward: a probe needs enough samples to have covered the event it would report, not merely a lot of samples. When in doubt, park it at 600s.** +**Deleted and restored 2026-09-20:** `726/0202`, all eleven of `792`'s `2A3x` DIDs (`2A32`-`2A3C`), `795/1E88`, `795/1E89`, `7E1/1E6A`, `7D3/3B00`, `7D3/3B08`, `7D3/3B4D` and `7E0/F458` — nineteen commands, removed for being constant and then put straight back. The evidence did not hold up: most had between 6 and 30 samples, and `1E88`'s six samples were all taken with the differential unlocked. Even `3B4D`, the one case that looked conclusive at 236 samples, was wrong: it produced three distinct values within eight minutes once the off-road features were actually used. `F458` was simply misread — `62F458 7F` is a positive reply carrying `0x7F`, not a negative response, and it is now decoded as long term secondary O2 trim bank 2. **The rule going forward: a probe needs enough samples to have covered the event it would report, not merely a lot of samples. When in doubt, park it at 600s.** --- @@ -207,7 +210,7 @@ and what to look for afterwards: |---|---|---| | `7E0/F466` | 5 | Whether the 17.5% disagreement between the two mass airflow sensors holds up under load, or was an idle artifact | | `795/1E88`, `795/1E89` | 30 | First data through a rear differential lock cycle. Both have been flat at `0000` and `09C4` on every sample ever taken | -| `7D3/3B4D` | 10 | Still returns `0` on every sample. A Terrain Response mode change is the only untried thing that would identify it | +| `7D3/3B4D` | 30 | Answered 2026-09-20: `0x04`, `0x01`, `0x00` within eight minutes of the off-road features being used. Needs one sample per terrain mode to map | | `7D3/3B01` | 15 | Three single-bit values seen so far. Enough samples across repeated height changes should map bit to height — done, see above | | `7E0/F470` | 15 | Ten undecoded bytes on a supercharged engine, under sustained load for the first time | | `7E0/F42E` | 10 | Purge duty against fuel trims over two hours, which is the cleanest test of the stuck-purge-valve hypothesis | @@ -232,9 +235,11 @@ has since been cut to 3.922 req/s across 66 commands — see the verification task in "Open in-vehicle tasks" above. Three rows in that table are now answered, from earlier sessions in the same -log rather than from the drive itself. `7D3/3B4D` is dead: constant `0x00` -across 236 samples spanning several terrain modes, so a mode change was not -the missing ingredient. It stays in at 600s regardless. `795/1E88` and +log rather than from the drive itself. `7D3/3B4D` looked dead — constant +`0x00` across 236 samples — but that verdict did not survive the evening of +2026-09-20, when deliberately using the off-road features produced `0x04`, +`0x01` and `0x00` in eight minutes. The 236 samples had simply never +covered the event. `795/1E88` and `795/1E89` are *not* settled on the same evidence — six and 25 samples, none with the differential locked — and both are back at 60s to catch a real lock cycle. `7E0/F466`'s diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 8f8c296..7c23828 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -20,12 +20,13 @@ ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B01"}, "freq": 15, "signals": [ - {"id": "LR4_RIDE_HEIGHT_STATE", "path": "Suspension", "name": "Ride Height State", "description": "Runs in parallel with the ride height mode PID and agrees with it. All three bits are now measured against the front height sensor: 0x100 at a front reading around 110 (Normal), 0x400 around 85 with the truck at its highest (Off-Road), 0x800 at 133 with it at its lowest (Access). Remember the sensor is inverted.", "fmt": {"len": 32, "map": { + {"id": "LR4_RIDE_HEIGHT_STATE", "path": "Suspension", "name": "Ride Height State", "description": "Runs in parallel with the ride height mode PID and agrees with it. All three observed bits are measured against the front height sensor: 0x100 at a front reading around 110 (Normal), 0x400 around 85 with the truck at its highest (Off-Road), 0x800 at 133 with it at its lowest (Access). Remember the sensor is inverted. Bit 9 (0x200) sits between Normal and Off-Road and has never been seen in 142 samples; the held-Access mode, where the lower button is held and the truck stays down, is the obvious candidate and has never been captured.", "fmt": {"len": 32, "map": { "256": { "description": "Normal", "value": "Normal" }, "1024": { "description": "Off-Road", "value": "Off-Road" }, "2048": { "description": "Access", "value": "Access" } }} - } + }, + {"id": "LR4_RIDE_HEIGHT_STATE_RAW", "path": "Suspension", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "Ride Height State Raw", "description": "Untranslated twin of Ride Height State. A mapped signal renders nothing for a value it has not been taught, so an unmapped state would be invisible in the app and only recoverable from the scan logs. This costs no extra request and makes a new state show up as a number."} ]}, { "hdr": "7E1", "rax": "7E9", "cmd": {"22": "DD01"}, "freq": 600, "signals": [ @@ -72,13 +73,14 @@ ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B3C"}, "freq": 10, "signals": [ - {"id": "LR4_RIDE_HEIGHT", "path": "Suspension", "name": "Ride Height Mode", "fmt": {"len": 8, "map": { + {"id": "LR4_RIDE_HEIGHT", "path": "Suspension", "name": "Ride Height Mode", "description": "A bitfield, not an ordinal: bit 0 Normal, bit 1 Off-Road, bit 2 Access. 0x0D is 0x01|0x04|0x08 and has only been seen with the truck part-way between Normal and Access, so bit 3 reads as movement rather than a mode of its own. Bit 3 has never been seen set on its own, which is where a held-Access mode would most likely appear.", "fmt": {"len": 8, "map": { "1": { "description": "Normal", "value": "Normal" }, "2": { "description": "Off-Road", "value": "Off-Road" }, "4": { "description": "Access", "value": "Access" }, "13": { "description": "In Transit", "value": "In Transit" } }} - } + }, + {"id": "LR4_RIDE_HEIGHT_RAW", "path": "Suspension", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "Ride Height Mode Raw", "description": "Untranslated twin of Ride Height Mode, for the same reason as the state word: an unmapped value renders as a blank, and a blank teaches nothing."} ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B71"}, "freq": 15, "signals": [ @@ -178,11 +180,11 @@ ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B00"}, "freq": 120, "signals": [ - {"id": "LR4_3B00_RAW", "hidden": true, "path": "Suspension", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "3B00 Raw", "description": "Undecoded suspension DID. Flat through a real ride-height change, but on three samples only."} + {"id": "LR4_3B00_RAW", "hidden": true, "path": "Suspension", "fmt": { "len": 32, "max": 4294967295, "unit": "scalar" }, "name": "3B00 Raw", "description": "Undecoded. Reads 0x03 in 111 of 113 samples; the exception is 0x103, once, with the truck sitting at Access. Bit 8 looks like a height-event flag, and 3B02 carries a bit-8 flag that behaves the same way."} ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B08"}, "freq": 120, "signals": [ - {"id": "LR4_3B08_RAW", "hidden": true, "path": "Suspension", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "3B08 Raw", "description": "Undecoded suspension DID. Flat through a real ride-height change, but on three samples only."} + {"id": "LR4_3B08_RAW", "hidden": true, "path": "Suspension", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "3B08 Raw", "description": "Undecoded. Reads 0x00 in 130 of 131 samples; the exception is 0x01, once, with Off-Road engaged and the truck at its highest. One sample is not a decode, but it is not dead either."} ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "3B4D"}, "freq": 30, "signals": [ From 1eee31c777b41ef771129bd7c8f2e510c0286bdc Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Sun, 20 Sep 2026 22:52:40 -0600 Subject: [PATCH 82/84] sweep the rest of the short drive: two decodes were wrong Decoding every signal in the file against the evening log turned up more than the three headline movers. The second word of F434 and F438 was being read as a voltage. SAE J1979 PIDs 34 to 3B carry equivalence ratio plus sensor current; the voltage variants are 24 to 2B, which this ECM does not support. Read as voltage it produced a flat 4.0 across 28,432 samples, which should have been the giveaway. Read as current it spans -0.95 to +1.36 mA around +0.16, which is what a wideband pump cell does. Both become O2 Pump Current in milliamps. D11A was called Suspension Module Voltage. It is not battery voltage: over 221 paired samples its raw value swings 57 to 105 while control module voltage moves 12.51 to 14.75, and the implied scale scatters 9%. The old scaling put it at 16.8 V. Best correlation is 0.58 against compressor activity, not enough to name it, so it goes back to an undecoded raw byte. The two fuel rail pressures are different quantities, not one scaled two ways. Over 157 pairs the ratio drifts 0.41 to 0.56, and in one stretch PID 23 sat pinned near 197 bar while 033E climbed 79 to 110. A scaling error would hold a fixed ratio. Warm-ups since codes cleared is saturated at 255 and says only that they were cleared more than 255 cycles ago. Claude-Session: https://claude.ai/code/session_01Kzsf15spEW5oNrt7zCt8Z7 --- README.md | 32 +++++++++++++++++++++++++++++--- signalsets/v3/default.json | 10 +++++----- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index a4c8667..2bf2ef0 100644 --- a/README.md +++ b/README.md @@ -97,13 +97,13 @@ VIN bytes instead of a rejection — worth a retry. | Mass Air Flow | `7E0` `22F410` | Grams of air per second | | Equivalence Ratio | `7E0` `22F444` | Commanded lambda | | O2 Lambda B1S1 | `7E0` `22F434` | Measured lambda | -| O2 Sensor Voltage | `7E0` `22F434` | Second half of the same response | +| O2 Pump Current B1S1 | `7E0` `22F434` | Second half of the same response. Current, not voltage — see "Two decodes that were wrong" | | Catalyst Temp B1S1 / B2S1 | `7E0` `22F43C` / `22F43D` | One per bank | | Oil Temp | `7E0` `2203F3` | Land Rover's own sensor. The SAE alias `F45C` was dropped — 1,169 samples against this one's 347,015 | | Oil Level | `7E0` `2203E6` | Millimetres in the sump | | Oil Volume | `7E0` `2203F2` | | | O2 Lambda B2S1 | `7E0` `22F438` | Measured lambda, bank 2 — first bank 2 lambda ever read on this truck | -| O2 Sensor Voltage B2S1 | `7E0` `22F438` | Second half of the same response | +| O2 Pump Current B2S1 | `7E0` `22F438` | Second half of the same response. Current, not voltage | | O2 Voltage B1S2 | `7E0` `22F415` | Post-catalyst sensor, bank 1 | | Relative Throttle Position | `7E0` `22F445` | A third throttle-position reading, alongside Throttle Position and Commanded Throttle | | Absolute Throttle Position B | `7E0` `22F447` | A fourth | @@ -203,7 +203,7 @@ All four corners report gauge pressure in the air spring. | Compressor Activity | `7D3` `223B07` | ~110 at rest, over 1,300 while the truck raises | | Ride Height Mode | `7D3` `223B3C` | Enum: 1 Normal, 2 Off-Road, 4 Access, 13 In Transit. Corrected 2026-09-20 — see "Air suspension notes" under Off-road | | Height Sensor Front / Rear | `7D3` `223B71` / `223B72` | **Inverted** — falls as the truck rises | -| Module Voltage | `7D3` `22D11A` | Should mirror battery voltage | +| `D11A` Raw | `7D3` `22D11A` | Was called Module Voltage; it is not battery voltage — see "Two decodes that were wrong" | Normal standing pressures are roughly 40 psi per corner at normal ride height, rising with load and with raised height modes. @@ -645,6 +645,32 @@ truck at its highest, with the mode PID reading Off-Road. `3B01` is now a mapped signal rather than a raw word: `0x100` Normal, `0x400` Off-Road, `0x800` Access. +**Two decodes in this file were wrong, and the short drive exposed both.** + +The second word of `F434` and `F438` was being read as a voltage. SAE J1979 +PIDs 34 to 3B report equivalence ratio plus sensor *current*; the voltage +variants are PIDs 24 to 2B, which this ECM does not support. Read as a +voltage it produced a flat 4.0 across 28,432 samples, which should have been +the giveaway. Read correctly it spans -0.95 to +1.36 mA around a mean of ++0.16, exactly what a wideband pump cell does. Both are now +`O2 Pump Current`, in milliamps. + +`D11A` was called Suspension Module Voltage and scaled to volts. It is not +battery voltage. Across 221 paired samples its raw value swings 57 to 105, +an 84% range, while control module voltage moved only 12.51 to 14.75, an 18% +range, and the implied volts-per-count scatters by 9%. The old scaling put +it at 16.8 V, which no 12 V system reaches. The best correlation found for +it is 0.58 against compressor activity, which is not enough to name +anything, so it goes back to being an undecoded raw byte. + +**The two fuel rail pressures are not the same measurement.** `033E` and +PID 23 were expected to be one quantity scaled two ways. Across 157 paired +samples the ratio between them drifts from 0.41 to 0.56 instead of holding +constant, and in one stretch PID 23 sat pinned near 197 bar while `033E` +climbed from 79 to 110. A scaling error gives a fixed ratio; this does not. +Two different quantities, plausibly a commanded rail target against a +measured one, and separating them needs hard sampling under load. + **There is one ride-height state nobody has logged.** Holding the lower button puts the truck into a held-Access mode that stays down rather than self-levelling, and it appears in none of the 484 `3B3C` or 142 `3B01` diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 7c23828..e2ce86f 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -92,7 +92,7 @@ ]}, { "hdr": "7D3", "rax": "7DB", "cmd": {"22": "D11A"}, "freq": 60, "signals": [ - {"id": "LR4_SUSPENSION_SUPPLY_V", "path": "Suspension", "fmt": { "len": 8, "max": 40.8, "mul": 16, "div": 100, "unit": "volts" }, "name": "Suspension Module Voltage"} + {"id": "LR4_D11A_RAW", "path": "Suspension", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "D11A Raw", "description": "Was called Suspension Module Voltage and scaled to volts. It is not battery voltage: across 221 paired samples its raw range spans 57 to 105, an 84% swing, while control module voltage moved only 12.51 to 14.75, an 18% swing, and the implied scale scatters by 9%. The old scaling also put it at 16.8 V, which no 12 V system reaches. Best correlation found so far is 0.58 against compressor activity, which is not enough to name it. Undecoded until something fits."} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "033E"}, "freq": 10, "signals": [ @@ -196,7 +196,7 @@ ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F423"}, "freq": 60, "signals": [ - {"id": "LR4_FUEL_RAIL_GAUGE_P", "path": "Fuel", "fmt": { "len": 16, "max": 655350, "mul": 10, "unit": "kilopascal" }, "name": "Fuel Rail Gauge Pressure", "description": "SAE J1979 PID 23. Answers: 158 logged samples ranging 0x015F to 0x07B6, which scales to 35 to 197 bar and is the right shape for this engine's direct injection rail. Compare against the proprietary rail pressure DID 033E, which reads far lower on the same engine; one of the two is scaled wrong and this one matches the hardware."} + {"id": "LR4_FUEL_RAIL_GAUGE_P", "path": "Fuel", "fmt": { "len": 16, "max": 655350, "mul": 10, "unit": "kilopascal" }, "name": "Fuel Rail Gauge Pressure", "description": "SAE J1979 PID 23, ranging 29 to 197 bar, the right shape for this engine's direct injection rail. It is not the same measurement as the proprietary DID 033E: across 157 paired samples the ratio between them drifts from 0.41 to 0.56 rather than holding constant, and in one stretch this PID sat pinned near 197 bar while 033E climbed from 79 to 110 bar. A fixed scaling error would give a fixed ratio, so these are two different quantities - plausibly a commanded rail target against a measured one. Worth sampling hard under load to separate them."} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F401"}, "freq": 600, "signals": [ @@ -226,7 +226,7 @@ { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F438"}, "freq": 60, "signals": [ {"id": "LR4_O2_LAMBDA_B2", "path": "Engine", "fmt": { "len": 16, "max": 1.999, "div": 32768, "unit": "scalar" }, "name": "O2 Lambda B2S1", "description": "Bank 2 sensor 1. Rails at FFFF on roughly half of samples; treat those as invalid rather than lean."}, - {"id": "LR4_O2_VOLTAGE_B2", "path": "Engine", "fmt": { "bix": 16, "len": 16, "max": 7.999, "div": 8192, "unit": "volts" }, "name": "O2 Voltage B2S1"} + {"id": "LR4_O2_CURRENT_B2", "path": "Engine", "fmt": { "bix": 16, "len": 16, "max": 128, "min": -128, "div": 256, "add": -128, "unit": "milliamps" }, "name": "O2 Pump Current B2S1", "description": "Bank 2 counterpart. See O2 Pump Current B1S1 - PID 38 reports current, not voltage."} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F42E"}, "freq": 120, "signals": [ @@ -332,7 +332,7 @@ ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F430"}, "freq": 600, "signals": [ - {"id": "LR4_WARMUPS", "path": "Trips", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "Warm-ups Since Codes Cleared"} + {"id": "LR4_WARMUPS", "path": "Trips", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "Warm-ups Since Codes Cleared", "description": "Saturated. The PID is a single byte and has been pinned at 255 for as long as it has been logged, so it says only that codes were cleared more than 255 warm-up cycles ago."} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F431"}, "freq": 300, "signals": [ @@ -399,7 +399,7 @@ { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F434"}, "freq": 10, "signals": [ {"id": "LR4_O2_LAMBDA", "path": "Engine", "fmt": { "len": 16, "max": 2, "div": 32768, "nullmin": 0, "unit": "scalar" }, "name": "O2 Lambda B1S1", "suggestedMetric": "o2Lambda"}, - {"id": "LR4_O2_VOLTAGE", "path": "Engine", "fmt": {"bix": 16, "len": 16, "max": 7.999, "div": 8192, "unit": "volts" }, "name": "O2 Sensor Voltage"} + {"id": "LR4_O2_CURRENT", "path": "Engine", "fmt": {"bix": 16, "len": 16, "max": 128, "min": -128, "div": 256, "add": -128, "unit": "milliamps" }, "name": "O2 Pump Current B1S1", "description": "The second word of SAE J1979 PID 34 is sensor current, not voltage; the voltage variants are PIDs 24 to 2B, which this ECM does not support. Read as voltage it sat at a meaningless flat 4.0 across 28,432 samples. Read as current it spans -0.95 to +1.36 mA with a mean of +0.16, which is what a wideband pump cell should do."} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F43C"}, "freq": 60, "signals": [ From aa198d46183d6354fa15500e1f9d2a5c44b802b4 Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Fri, 25 Sep 2026 00:00:58 -0600 Subject: [PATCH 83/84] fuel rate in gallons, plus mpg and the two things the schema won't do Fuel Rate now divides MAF by a lambda operand prescaled to US gallons per hour and declares gallonsPerHour, one of the schema's own units, rather than hoping the app converts. Four more fuel synthetics come from the same three polled DIDs at no extra bandwidth: gal/min, mpg, gal/100 mi, and a lambda-corrected mpg that only works if a synthetic may read another synthetic. That one is an experiment; TESTING.md says which of the two mpg signals to keep once a drive has answered it. The mpg and gal/100 mi signals assume lambda 1 because a ratio has room for two operands and an exact mpg needs three. It cost 3% over the 2026-09-23 drive. Decimal places are not fixable here. The schema's fmt has no precision field, so the float on the fuel rate and the one decimal on Fahrenheit temperatures are the app's formatting. Recorded as trap 9. Also fixes CLAUDE.md's command count and demand, stale since PR #8. --- CLAUDE.md | 18 +++++-- README.md | 99 ++++++++++++++++++++++++++++++-------- TESTING.md | 1 + signalsets/v3/default.json | 22 +++++++-- 4 files changed, 115 insertions(+), 25 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 9bf5517..d613b09 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -12,7 +12,7 @@ repeat it. ## Layout -- `signalsets/v3/default.json` — the signalset itself, 66 commands. The +- `signalsets/v3/default.json` — the signalset itself, 91 commands. The only file the app actually consumes. - `tests/test_cases/2016/command_support.yaml` — manifest of which commands each ECU supports, used by the test suite. @@ -43,7 +43,7 @@ repeat it. Measured across seven sessions, the UDS service-22 share stayed between 4.1 and 5.1 req/s no matter how big the signalset was: one session polled 108 distinct DIDs at 4.19 req/s and another polled 23 at 4.22 req/s. - Current demand is 3.922. Asking for more than the app can deliver does + Current demand is 4.100. Asking for more than the app can deliver does not slow everything down evenly — see trap 5. ## Validation @@ -180,7 +180,11 @@ These have all actually bitten: integer, so a scaling constant can be folded into a hidden operand and the ratio then comes out in real units. `LR4_FUEL_RATE` is built that way: `LR4_FUEL_DIVISOR` is commanded lambda premultiplied by - 14.7 x 745 / 3600, so MAF divided by it is litres per hour. + 14.7 x 745 / 3600 x 3.785, so MAF divided by it is US gallons per hour. + Two operands is also the ceiling: anything needing three (speed, MAF + and lambda for an exact mpg) has to drop one, which is why the mpg + synthetics assume lambda 1. Whether a synthetic may read another + synthetic is untested; `LR4_MPG_LAMBDA` exists to find out. 8. **Only signals carrying a `suggestedMetric` are ever written to the app's signal database, but every signal displays live.** Screenshots on @@ -205,6 +209,14 @@ These have all actually bitten: the scan logs. Weigh that before spending budget on a signal: a fast `freq` on a signal with no metric buys a live readout and nothing else. +9. **Nothing in the signalset controls how many decimal places the app + shows.** The schema's `fmt` has scaling, range, unit and map fields + and no precision field, and the synthetics block has even less. The + app decides: integer-scaled signals print as integers, a Celsius + signal shown in Fahrenheit picks up one decimal from the conversion, + and a synthetic ratio prints its full float. There is no `div`, `max` + or unit trick that changes this; it is a feature request for the app. + ## Where the data comes from On macOS, the Sidecar/Pelican app writes zipped SQLite backups to diff --git a/README.md b/README.md index 2bf2ef0..69c2a92 100644 --- a/README.md +++ b/README.md @@ -319,7 +319,7 @@ positive trim. ## Computed signals -The signalset defines eight synthetic signals. Seven are a **ratio between +The signalset defines twelve synthetic signals. Seven are a **ratio between two readings that should hold a known value**, which makes them suited to a display: you learn the normal number once, and anything else is a signal. The eighth, Fuel Rate, is a different shape — a real physical @@ -352,28 +352,88 @@ needs no altitude correction. The ECM's own supported-PID bitmasks (`0100 = BFBFACD3`, `0120 = A007B119`, `0140 = FED08511`, `0160 = 07010000`) say PIDs `5E` and `9D` are both unsupported. The truck does not report fuel rate. Any app showing one is -computing it, and now this signalset does too — the eighth synthetic, -added 2026-09-20. +computing it, and now this signalset does too — added 2026-09-20 in litres +per hour, switched to US gallons per hour on 2026-09-24. ``` -Litres per hour = MAF (g/s) / (Lambda × 14.7 × 745 / 3600) - = MAF / (Lambda × 3.0421) +Gallons per hour = MAF (g/s) / (Lambda × 14.7 × 745 / 3600 × 3.785) + = MAF / (Lambda × 11.516) ``` +MAF is grams of air per second; 14.7 is the stoichiometric air-to-fuel +ratio for gasoline; 745 g/L is the density of gasoline; 3600 converts +seconds to hours; 3.785 L/gal converts to US gallons. Commanded lambda +scales the stoichiometric ratio to whatever the ECU is actually targeting. + The schema's synthetic operation is a plain ratio with no constant, so the -constant was folded into a hidden operand instead: `LR4_FUEL_DIVISOR` reads -Commanded Equivalence Ratio (`22F444`) with `div` set to `10771.53` -(`32768 / 3.0421`), which yields `Lambda × 3.0421` directly. `LR4_FUEL_RATE` -is then Mass Air Flow divided by that, already in litres per hour, and -carries `suggestedMetric: fuelRate`. - -Validated against the 2026-09-20 drive: integrating the formula over 1,480 -MAF samples gives 11.21 L burned. The tank gauge fell from 87.8% to 76.9% -over the same drive, which on the 86.3 L tank is 9.48 L — agreement to +constant is folded into a hidden operand: `LR4_FUEL_DIVISOR` reads Commanded +Equivalence Ratio (`22F444`) with `div` set to `2845.54` (`32768 / 11.516`), +which yields `Lambda × 11.516` directly. `LR4_FUEL_RATE` is Mass Air Flow +divided by that, already in gallons per hour, and carries +`suggestedMetric: fuelRate`. The unit is declared `gallonsPerHour`, one of +the schema's enum values, rather than relying on the app to convert. + +#### The other ways to look at it + +Five fuel synthetics now exist. Every one is built from the same three +polled DIDs, so none costs any bandwidth; the budget is unchanged at +4.100 req/s. + +| Signal | Formula | Unit | Lambda? | +|---|---|---|---| +| Fuel Rate | MAF / (λ × 11.516) | gal/h | yes | +| Fuel Rate (gal/min) | MAF / (λ × 690.9) | scalar, labelled | yes | +| Fuel Economy (mpg) | (mph × 11.516) / MAF | scalar, labelled | assumed 1 | +| Fuel Use (gal/100 mi) | MAF / (mph × 0.1152) | scalar, labelled | assumed 1 | +| Fuel Economy (mpg, lambda-corrected, test) | mph / Fuel Rate | scalar, labelled | yes, if it works | + +Two constraints shape that table. The unit enum has `gallonsPerHour` and +nothing else for fuel: no gallons per minute, no miles per gallon, no +gallons per hundred miles, no litres per 100 km. Those signals are declared +`scalar` and carry the unit in their name. And a ratio has room for only +two operands, so an exact mpg (speed, MAF *and* lambda) is one operand too +many. The mpg and gal/100 mi signals drop lambda and assume 1.0, which is +true whenever the ECU is in closed loop — most of any drive — and wrong +under enrichment (lambda 0.8 at full throttle, so the readout is 25% +optimistic) and during decel fuel cut (commanded lambda reads 2.0, the +real consumption is zero, the readout is finite). On the 2026-09-23 drive +the stoichiometric assumption cost 3% over the trip: 17.3 mpg against 17.8 +with lambda. + +The lambda-corrected mpg is an experiment. It divides a hidden mph copy of +vehicle speed by the Fuel Rate synthetic itself, which only works if the +app resolves a synthetic operand that is another synthetic. Nothing in the +schema says either way, and no other OBDb signalset tries it. If it shows a +number on the next drive, it is the mpg to keep and the stoichiometric one +can go. If it stays blank, the app evaluates synthetics against raw +signals only, and the stoichiometric version is as good as a ratio gets. + +Ways that were considered and do not work with what this truck offers: +injector duty or pulse width (no DID found), the SAE fuel rate PIDs `5E` +and `9D` (unsupported, above), and fuel level delta over distance. The last +one is real but coarse — the gauge is 8-bit, one step is 0.34 L, and the +trip logger already records tank level at the start and end of every +journey in its own store, so it makes a check on the formula rather than a +live signal. + +Validated twice. Integrating the formula over 1,480 MAF samples on the +2026-09-20 drive gives 11.21 L (2.96 gal) burned; the tank gauge fell from +87.8% to 76.9%, which on the 86.3 L tank is 9.48 L (2.50 gal) — agreement to about 18%, on the pessimistic side, over 91.5 km (19.2 mpg by the -formula). It's an estimate, not a measurement: the gauge is 8-bit (one step -is 0.34 L), and float angle off-road makes it worse. Treat Fuel Rate as -directionally useful, not a trip computer. +formula). On the 2026-09-23 drive, 15.2 km in 21 minutes, the formula gives +0.54 gal against 0.45 gal on the gauge, where a single gauge step is +0.09 gal. Treat all five as directionally useful, not a trip computer. + +#### Decimal places are the app's call + +The stored fuel-rate values are full floats (`44.309198338607594`), and +that is what the app prints for a synthetic. Nothing in the signalset +changes it: the schema's `fmt` block has scaling, range, unit and map +fields and no precision field, and a synthetic has fewer fields still. The +same is true of the one decimal that appears on temperatures once the app +is set to Fahrenheit: the signal is an integer in Celsius, the conversion +makes it fractional, and the app's formatter keeps one place. Both are +requests for the app (support@clutch.engineering), not for this file. --- @@ -1202,8 +1262,9 @@ Jaguar signalset does and what has never been tried here. ### Hidden signals -Eleven of the file's 84 signals (including synthetics) carry `hidden: true`: -the remaining `*_RAW` probes and the `3B02` byte splits. +Thirty-seven of the file's 119 signals (including synthetics) carry +`hidden: true`: the `*_RAW` probes, the `3B02` byte splits and the +synthetic operands. **`hidden: true` does not appear to do anything in this app.** Screenshots taken on 2026-09-20 show `3B00 Raw`, `3B01 Raw`, `3B02 Byte 1`, `3B4D Raw`, diff --git a/TESTING.md b/TESTING.md index a0ac19d..afa1639 100644 --- a/TESTING.md +++ b/TESTING.md @@ -15,6 +15,7 @@ not on suspicion. - [ ] **Capture the held-Access mode** (hold the lower button and the truck stays down, for car parks). It has never appeared in any log. Both height-state DIDs have exactly one slot never filled: `3B01` bit 9 (`0x200`), sitting between Normal at `0x100`, Off-Road at `0x400` and Access at `0x800`; and `3B3C` bit 3 (`0x08`), seen only inside `0x0D` while the truck was moving between heights. One of those is its likely home. Engage it, hold it a minute, then read `Ride Height State Raw` and `Ride Height Mode Raw` — both were added so an unmapped state shows as a number rather than a blank. - [ ] **Map `3B4D` to the Terrain Response modes.** Alive after all: constant `0x00` across 236 samples, then `0x04`, `0x01` and `0x00` within eight minutes of the off-road features being used on 2026-09-20. It does not follow the ride height mode PID, so it is reporting something else. Now at 30s. Select each terrain mode in turn, hold about a minute, and note the order. - [ ] **Work out what the `792` counters count.** `2A32` through `2A37` all advance; `2A38` through `2A3C` still never move. Over 111 km and nine hours they gained 14,000 / 480 / 960 / 2,170 / 88 / 1, but that window mixed driving with parked time so the rates are not separable. They now poll at 120s, so one uninterrupted drive gives enough samples to regress each against distance and against running time. +- [ ] **Read the fuel signals on the next drive.** Fuel Rate should now print in gal/h (a warm cruise sits around 1.5 to 3 gal/h, wide open throttle near 10). If it still says L/h, the app is converting by its own unit preference and the fix is in Settings, not this file. Then check `Fuel Economy (mpg, lambda-corrected, test)`: a number means a synthetic can read another synthetic and the plain `Fuel Economy (mpg)` can go; blank means synthetics resolve raw signals only, and the test signal is the one to delete. - [ ] **Verify the cut-down signalset on the next drive.** The polling budget was cut from 10.53 to 3.922 req/s (85 commands down to 66) because measurement showed the app only ever delivers about 4.2 req/s to signalset traffic, no matter how many commands are in the file. Asking for 10.53 against a 4.2 ceiling meant the app picked which 40% to serve; asking for 3.922 means it does not have to pick. Two pass criteria: (1) all 66 commands are actually polled, and (2) coverage on a long drive beats 23 distinct DIDs, which is the best any long session has managed in six weeks. - [ ] **Re-run `22F187` against module `726`.** Every other module rejected it with NRC 31, but `726` returned a malformed reply carrying VIN bytes instead. Terminal sequence: `ATSH 726`, `ATCRA 72E`, `22F187`. (Unaffected by the profile-reset issue above — this is a hand-typed terminal probe, not app polling.) - [x] **Confirm which signalset version the Pelican app is actually holding.** Done 2026-09-20: the app was holding a stale signalset. A forced refresh brought all 109 commands into the poll cycle — `F40C` answered 172 of 172 requests, and engine speed was recorded for the first time. diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index e2ce86f..2f6d5e6 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -300,7 +300,10 @@ ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40D"}, "freq": 2, "signals": [ - {"id": "LR4_SPEED", "path": "Movement", "fmt": { "len": 8, "max": 255, "unit": "kilometersPerHour" }, "name": "Vehicle Speed", "suggestedMetric": "speed"} + {"id": "LR4_SPEED", "path": "Movement", "fmt": { "len": 8, "max": 255, "unit": "kilometersPerHour" }, "name": "Vehicle Speed", "suggestedMetric": "speed"}, + {"id": "LR4_SPEED_MPH", "hidden": true, "path": "Movement", "fmt": { "len": 8, "max": 158.4, "mul": 0.621371, "unit": "milesPerHour" }, "name": "Vehicle Speed (mph operand)", "description": "Speed in mph as a synthetic operand. Divided by the gal/h fuel rate it gives lambda-corrected mpg, if the app lets a synthetic read another synthetic. That is untested; see Fuel Economy (lambda-corrected, test)."}, + {"id": "LR4_MPG_NUMERATOR", "hidden": true, "path": "Movement", "fmt": { "len": 8, "max": 1824.6, "mul": 7.15535, "unit": "scalar" }, "name": "Fuel Economy Numerator", "description": "Speed in mph premultiplied by 14.7 x 745 / 3600 x 3.785, so that dividing it by mass air flow gives mpg at lambda 1. The synthetic ratio has room for only two operands, so commanded lambda is assumed stoichiometric. Closed-loop cruise is; enrichment and fuel cut are not."}, + {"id": "LR4_GP100_DENOMINATOR", "hidden": true, "path": "Movement", "fmt": { "len": 8, "max": 18.25, "mul": 0.0715535, "unit": "scalar" }, "name": "Gallons per 100 Miles Denominator", "description": "Speed in mph times 14.7 x 745 / 3600 x 3.785 / 100, so that mass air flow divided by it gives US gallons per 100 miles at lambda 1."} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40E"}, "freq": 15, "signals": [ @@ -420,7 +423,8 @@ { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F444"}, "freq": 5, "signals": [ {"id": "LR4_EQ_RATIO", "path": "Engine", "fmt": { "len": 16, "max": 2, "div": 32768, "unit": "scalar" }, "name": "Equivalence Ratio", "suggestedMetric": "commandedLambda"}, - {"id": "LR4_FUEL_DIVISOR", "hidden": true, "path": "Engine", "fmt": { "len": 16, "max": 6.084, "div": 10771.53, "unit": "scalar" }, "name": "Fuel Rate Divisor", "description": "Commanded lambda premultiplied by 14.7 x 745 / 3600 so that mass air flow divided by this value is litres per hour. Exists only because synthetic signals support a plain ratio with no constant; it is the constant, folded into the divisor."} + {"id": "LR4_FUEL_DIVISOR", "hidden": true, "path": "Engine", "fmt": { "len": 16, "max": 23.031, "div": 2845.54, "unit": "scalar" }, "name": "Fuel Rate Divisor (gal/h)", "description": "Commanded lambda premultiplied by 14.7 x 745 / 3600 x 3.785 so that mass air flow divided by this value is US gallons per hour. Exists only because synthetic signals support a plain ratio with no constant; it is the constant, folded into the divisor."}, + {"id": "LR4_FUEL_DIVISOR_MIN", "hidden": true, "path": "Engine", "fmt": { "len": 16, "max": 1381.86, "div": 47.426, "unit": "scalar" }, "name": "Fuel Rate Divisor (gal/min)", "description": "The gal/h divisor with a further x60 folded in, so mass air flow divided by it is US gallons per minute."} ]}, { "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F446"}, "freq": 60, "signals": [ @@ -448,9 +452,21 @@ ]} ], "synthetics": [ - { "id": "LR4_FUEL_RATE", "path": "Fuel", "name": "Fuel Rate", "max": 120, "unit": "litersPerHour", "suggestedMetric": "fuelRate", "formula": { + { "id": "LR4_FUEL_RATE", "path": "Fuel", "name": "Fuel Rate", "max": 32, "unit": "gallonsPerHour", "suggestedMetric": "fuelRate", "formula": { "op": "ratio", "a": "LR4_MAF", "b": "LR4_FUEL_DIVISOR" }}, + { "id": "LR4_FUEL_RATE_GPM", "path": "Fuel", "name": "Fuel Rate (gal/min)", "max": 0.6, "unit": "scalar", "formula": { + "op": "ratio", "a": "LR4_MAF", "b": "LR4_FUEL_DIVISOR_MIN" + }}, + { "id": "LR4_MPG", "path": "Fuel", "name": "Fuel Economy (mpg)", "max": 200, "unit": "scalar", "formula": { + "op": "ratio", "a": "LR4_MPG_NUMERATOR", "b": "LR4_MAF" + }}, + { "id": "LR4_GAL_PER_100MI", "path": "Fuel", "name": "Fuel Use (gal/100 mi)", "max": 100, "unit": "scalar", "formula": { + "op": "ratio", "a": "LR4_MAF", "b": "LR4_GP100_DENOMINATOR" + }}, + { "id": "LR4_MPG_LAMBDA", "path": "Fuel", "name": "Fuel Economy (mpg, lambda-corrected, test)", "max": 200, "unit": "scalar", "formula": { + "op": "ratio", "a": "LR4_SPEED_MPH", "b": "LR4_FUEL_RATE" + }}, { "id": "LR4_BANK_BALANCE", "path": "Engine", "name": "Bank Balance", "max": 3, "unit": "scalar", "formula": { "op": "ratio", "a": "LR4_CAT_TEMP_B1", "b": "LR4_CAT_TEMP_B2" }}, From 5dcd4232c1bea24c757247d2e4b1cfd30b7afc8f Mon Sep 17 00:00:00 2001 From: Michael Volo Date: Fri, 25 Sep 2026 00:13:16 -0600 Subject: [PATCH 84/84] poll the fuel operands faster, paid for by slowing what nobody watches MAF goes 5s to 2s and commanded lambda 5s to 3s, which is what the fuel synthetics update from. The 0.43 req/s comes from throttle position and the gear selector (10s), lambda B1S1 (15s), rail pressure, timing advance, absolute load and both pedals (30s) and MAF A/B (60s). Demand lands at 4.083 req/s. The 2026-09-23 drive shows why it felt slow: 5s commands were answered every 5.7s, 2s commands every 3.05s, and the app chose 21 commands worth 1.8 req/s, so the budget was never the constraint. Also recorded: no probe on 7D3, 732, 792, 761 or 726 has been sent since 2026-09-21, so the open suspension and Terrain Response items got nothing from these drives. --- CLAUDE.md | 2 +- README.md | 61 ++++++++++++++++++++++++++++---------- TESTING.md | 2 +- signalsets/v3/default.json | 22 +++++++------- 4 files changed, 58 insertions(+), 29 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index d613b09..da91ee7 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -43,7 +43,7 @@ repeat it. Measured across seven sessions, the UDS service-22 share stayed between 4.1 and 5.1 req/s no matter how big the signalset was: one session polled 108 distinct DIDs at 4.19 req/s and another polled 23 at 4.22 req/s. - Current demand is 4.100. Asking for more than the app can deliver does + Current demand is 4.083. Asking for more than the app can deliver does not slow everything down evenly — see trap 5. ## Validation diff --git a/README.md b/README.md index 69c2a92..40c96d0 100644 --- a/README.md +++ b/README.md @@ -877,26 +877,55 @@ the maximum frequency at which a command may be sent, expressed in seconds, so a *smaller* number polls *harder*. There is no priority field anywhere in the v3 format — command count and `freq` are the only levers. -The budget in this file, cut to fit the measured ceiling on 2026-09-20: +The budget in this file, cut to fit the measured ceiling on 2026-09-20 and +rebalanced on 2026-09-25 so the fuel readout updates every few seconds: | Interval | Commands | Contents | |---|---|---| -| 2s | 2 | Engine speed, vehicle speed | -| 5s | 6 | Calculated load, throttle position, manifold pressure, mass air flow, commanded equivalence ratio, gear selector | -| 10s | 3 | Lambda B1S1, fuel rail pressure, ride height mode | -| 15s | 9 | Timing advance, absolute load, both pedal sensors, coolant temp, short term trim B1, both height sensors, `3B01` | -| 30s | 15 | Remaining temperatures (oil, charge air, gearbox, diff), fuel trims bank 2, commanded throttle, fuel level, MAF A/B, all four corner pressures, compressor activity | -| 60s | 13 | Height offset, module voltage, lambda B2S1, ambient, barometric/altitude, battery, catalyst temps, IAT sensors, `3B02`, `3B0B`, `1E68` | -| 120s | 11 | Slower diagnostics: fuel system status, evap purge, O2 voltage B1S2, secondary O2 trim, relative/absolute throttle, IAT 1/2, manifold pressure (fine), run time, `197C`, `D11C` | +| 2s | 3 | Engine speed, vehicle speed, mass air flow | +| 3s | 1 | Commanded equivalence ratio | +| 5s | 2 | Calculated load, manifold pressure | +| 10s | 3 | Throttle position, gear selector, ride height mode | +| 15s | 6 | Coolant temp, short term trim B1, lambda B1S1, both height sensors, `3B01` | +| 30s | 20 | Remaining temperatures (oil, charge air, gearbox, diff), fuel rail pressure, timing advance, absolute load, both pedal sensors, fuel trims, commanded throttle, fuel level, all four corner pressures, compressor activity, `3B4D` | +| 60s | 17 | Height offset, MAF A/B, lambda B2S1, ambient, barometric/altitude, battery, catalyst temps, IAT, rail gauge pressure, charge cooler coolant, `3B02`, `3B0B`, `D11A`, `1E68`, `1E88`, `1E89` | +| 120s | 20 | Slower diagnostics: fuel system status, evap purge, O2 voltage B1S2, secondary O2 trims, relative/absolute throttle, IAT 1/2, manifold pressure (fine), run time, `197C`, `D11C`, `3B00`, `3B08`, `2A32` to `2A37` | | 300s | 1 | Distance since codes cleared | -| 600s | 6 | Odometer, oil level, oil volume, distance with MIL on, warm-ups since codes cleared, `DD01` | - -That's **66 commands at 3.922 req/s**, down from 85 commands at 10.528 — -comfortably under the measured 4.2 req/s ceiling, where the old figure had -looked safe against 11 req/s but was actually overdrawing the real one by -more than double. Engine speed is back on a real cadence (2s) and carries -the `engineSpeed` metric; it had not been polled since 2026-08-30 — see -below for why. +| 600s | 18 | Odometer, oil level, oil volume, distance with MIL on, warm-ups since codes cleared, monitor status, fuel type, OBD standard, `DD01`, `1E6A`, `726 0202`, `2A38` to `2A3C` | + +That's **91 commands at 4.083 req/s**, under the measured 4.2 req/s +ceiling. The 2026-09-20 cut took it from 85 commands at 10.528 to 66 at +3.922; the probes restored the same day and the decodes of 2026-09-23 took +it to 91 at 4.100; and the 2026-09-25 rebalance paid for mass air flow at +2s and commanded lambda at 3s (up from 5s each) by slowing throttle +position and the gear selector to 10s, lambda B1S1 to 15s, rail pressure, +timing advance, absolute load and both pedal sensors to 30s, and MAF A/B +to 60s. Engine speed is on a real cadence (2s) and carries the +`engineSpeed` metric; it had not been polled since 2026-08-30 — see below +for why. + +**What the drives of 2026-09-22 and 2026-09-23 actually polled.** Three +drives, 14, 10 and 22 minutes, and the app sent 19, 20 and 21 distinct +DIDs: the `7E0` `F4xx` core plus oil temp, charge air temp, gearbox temp, +diff temp and the odometer. Not one request went to `7D3`, `732`, `792`, +`761` or `726`. The last time any suspension, gear-selector or counter +probe was sent was 2026-09-21 02:20 UTC, in the session right after the +probes were restored. So the open items that need a probe to be alive +(held-Access, the Terrain Response map, the `792` counters) got nothing +from these drives, exactly as trap 5 predicts: the app converged on the +metric-bearing set and the probes dropped out of rotation. The 2026-09-23 +drive also predates the merge of the ride-height and wideband decodes, so +the reshuffle a file change usually causes has not had a drive yet. The +four sessions logged after it contain no traffic at all. + +The cadence the app delivered on that drive is worth having: commands +asked at 5s were answered every 5.7s, at 15s every 15.5s, and the two at 2s +every 3.05s. So a `freq` is honoured within about 15% except at the top, +where 2s buys 3s. The 21 commands it chose add up to about 1.8 req/s, well +under the ceiling; the app was not short of budget, it was short of +interest. The fuel operands were on the 5.7s cadence, which is why the +fuel readout felt slow. + ### The app converges on a small working set, and it is roughly what it can store diff --git a/TESTING.md b/TESTING.md index afa1639..8c80942 100644 --- a/TESTING.md +++ b/TESTING.md @@ -15,7 +15,7 @@ not on suspicion. - [ ] **Capture the held-Access mode** (hold the lower button and the truck stays down, for car parks). It has never appeared in any log. Both height-state DIDs have exactly one slot never filled: `3B01` bit 9 (`0x200`), sitting between Normal at `0x100`, Off-Road at `0x400` and Access at `0x800`; and `3B3C` bit 3 (`0x08`), seen only inside `0x0D` while the truck was moving between heights. One of those is its likely home. Engage it, hold it a minute, then read `Ride Height State Raw` and `Ride Height Mode Raw` — both were added so an unmapped state shows as a number rather than a blank. - [ ] **Map `3B4D` to the Terrain Response modes.** Alive after all: constant `0x00` across 236 samples, then `0x04`, `0x01` and `0x00` within eight minutes of the off-road features being used on 2026-09-20. It does not follow the ride height mode PID, so it is reporting something else. Now at 30s. Select each terrain mode in turn, hold about a minute, and note the order. - [ ] **Work out what the `792` counters count.** `2A32` through `2A37` all advance; `2A38` through `2A3C` still never move. Over 111 km and nine hours they gained 14,000 / 480 / 960 / 2,170 / 88 / 1, but that window mixed driving with parked time so the rates are not separable. They now poll at 120s, so one uninterrupted drive gives enough samples to regress each against distance and against running time. -- [ ] **Read the fuel signals on the next drive.** Fuel Rate should now print in gal/h (a warm cruise sits around 1.5 to 3 gal/h, wide open throttle near 10). If it still says L/h, the app is converting by its own unit preference and the fix is in Settings, not this file. Then check `Fuel Economy (mpg, lambda-corrected, test)`: a number means a synthetic can read another synthetic and the plain `Fuel Economy (mpg)` can go; blank means synthetics resolve raw signals only, and the test signal is the one to delete. +- [ ] **Read the fuel signals on the next drive.** Mass air flow is now asked at 2s and commanded lambda at 3s, so the fuel readout should move every 3 to 4 seconds instead of every 6. Fuel Rate should now print in gal/h (a warm cruise sits around 1.5 to 3 gal/h, wide open throttle near 10). If it still says L/h, the app is converting by its own unit preference and the fix is in Settings, not this file. Then check `Fuel Economy (mpg, lambda-corrected, test)`: a number means a synthetic can read another synthetic and the plain `Fuel Economy (mpg)` can go; blank means synthetics resolve raw signals only, and the test signal is the one to delete. - [ ] **Verify the cut-down signalset on the next drive.** The polling budget was cut from 10.53 to 3.922 req/s (85 commands down to 66) because measurement showed the app only ever delivers about 4.2 req/s to signalset traffic, no matter how many commands are in the file. Asking for 10.53 against a 4.2 ceiling meant the app picked which 40% to serve; asking for 3.922 means it does not have to pick. Two pass criteria: (1) all 66 commands are actually polled, and (2) coverage on a long drive beats 23 distinct DIDs, which is the best any long session has managed in six weeks. - [ ] **Re-run `22F187` against module `726`.** Every other module rejected it with NRC 31, but `726` returned a malformed reply carrying VIN bytes instead. Terminal sequence: `ATSH 726`, `ATCRA 72E`, `22F187`. (Unaffected by the profile-reset issue above — this is a hand-typed terminal probe, not app polling.) - [x] **Confirm which signalset version the Pelican app is actually holding.** Done 2026-09-20: the app was holding a stale signalset. A forced refresh brought all 109 commands into the poll cycle — `F40C` answered 172 of 172 requests, and engine speed was recorded for the first time. diff --git a/signalsets/v3/default.json b/signalsets/v3/default.json index 2f6d5e6..32b1071 100644 --- a/signalsets/v3/default.json +++ b/signalsets/v3/default.json @@ -1,5 +1,5 @@ { "commands": [ -{ "hdr": "732", "cmd": {"22": "D928"}, "freq": 5, +{ "hdr": "732", "cmd": {"22": "D928"}, "freq": 10, "signals": [ {"id": "LR4_GEAR_SELECTOR", "path": "Transmission", "name": "Gear Selector", "fmt": {"len": 8, "map": { "0": { "description": "Park", "value": "Park" }, @@ -94,7 +94,7 @@ "signals": [ {"id": "LR4_D11A_RAW", "path": "Suspension", "fmt": { "len": 8, "max": 255, "unit": "scalar" }, "name": "D11A Raw", "description": "Was called Suspension Module Voltage and scaled to volts. It is not battery voltage: across 221 paired samples its raw range spans 57 to 105, an 84% swing, while control module voltage moved only 12.51 to 14.75, an 18% swing, and the implied scale scatters by 9%. The old scaling also put it at 16.8 V, which no 12 V system reaches. Best correlation found so far is 0.58 against compressor activity, which is not enough to name it. Undecoded until something fits."} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "033E"}, "freq": 10, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "033E"}, "freq": 30, "signals": [ {"id": "LR4_FUEL_RAIL_P", "path": "Fuel", "fmt": { "len": 16, "max": 30000, "unit": "kilopascal" }, "name": "Fuel Rail Pressure"} ]}, @@ -248,7 +248,7 @@ "signals": [ {"id": "LR4_THROTTLE_B", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Absolute Throttle Position B"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F466"}, "freq": 30, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F466"}, "freq": 60, "signals": [ {"id": "LR4_MAF_A", "path": "Engine", "fmt": { "bix": 8, "len": 16, "max": 2047.96, "div": 32, "unit": "gramsPerSecond" }, "name": "Mass Air Flow A", "description": "One of two intake tract sensors. Across 1,474 samples A and B sum to 0.88 of the single MAF PID by least squares, but the scatter between individual pairs is large enough that the split between the two is not trustworthy at this polling rate. Use the single MAF PID for anything quantitative."}, {"id": "LR4_MAF_B", "path": "Engine", "fmt": { "bix": 24, "len": 16, "max": 2047.96, "div": 32, "unit": "gramsPerSecond" }, "name": "Mass Air Flow B", "description": "One of two intake tract sensors. See Mass Air Flow A."} @@ -305,7 +305,7 @@ {"id": "LR4_MPG_NUMERATOR", "hidden": true, "path": "Movement", "fmt": { "len": 8, "max": 1824.6, "mul": 7.15535, "unit": "scalar" }, "name": "Fuel Economy Numerator", "description": "Speed in mph premultiplied by 14.7 x 745 / 3600 x 3.785, so that dividing it by mass air flow gives mpg at lambda 1. The synthetic ratio has room for only two operands, so commanded lambda is assumed stoichiometric. Closed-loop cruise is; enrichment and fuel cut are not."}, {"id": "LR4_GP100_DENOMINATOR", "hidden": true, "path": "Movement", "fmt": { "len": 8, "max": 18.25, "mul": 0.0715535, "unit": "scalar" }, "name": "Gallons per 100 Miles Denominator", "description": "Speed in mph times 14.7 x 745 / 3600 x 3.785 / 100, so that mass air flow divided by it gives US gallons per 100 miles at lambda 1."} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40E"}, "freq": 15, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F40E"}, "freq": 30, "signals": [ {"id": "LR4_SPARK_ADV", "path": "Engine", "fmt": { "len": 8, "max": 63.5, "min": -64, "div": 2, "add": -64, "unit": "degrees" }, "name": "Timing Advance"} ]}, @@ -313,11 +313,11 @@ "signals": [ {"id": "LR4_IAT", "path": "Engine", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Intake Air Temp"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F410"}, "freq": 5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F410"}, "freq": 2, "signals": [ {"id": "LR4_MAF", "path": "Engine", "fmt": { "len": 16, "max": 655.35, "div": 100, "unit": "gramsPerSecond" }, "name": "Mass Air Flow", "suggestedMetric": "massAirFlow"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F411"}, "freq": 5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F411"}, "freq": 10, "signals": [ {"id": "LR4_THROTTLE_POS", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Throttle Position", "suggestedMetric": "throttlePosition"} ]}, @@ -399,7 +399,7 @@ }} } ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F434"}, "freq": 10, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F434"}, "freq": 15, "signals": [ {"id": "LR4_O2_LAMBDA", "path": "Engine", "fmt": { "len": 16, "max": 2, "div": 32768, "nullmin": 0, "unit": "scalar" }, "name": "O2 Lambda B1S1", "suggestedMetric": "o2Lambda"}, {"id": "LR4_O2_CURRENT", "path": "Engine", "fmt": {"bix": 16, "len": 16, "max": 128, "min": -128, "div": 256, "add": -128, "unit": "milliamps" }, "name": "O2 Pump Current B1S1", "description": "The second word of SAE J1979 PID 34 is sensor current, not voltage; the voltage variants are PIDs 24 to 2B, which this ECM does not support. Read as voltage it sat at a meaningless flat 4.0 across 28,432 samples. Read as current it spans -0.95 to +1.36 mA with a mean of +0.16, which is what a wideband pump cell should do."} @@ -416,11 +416,11 @@ "signals": [ {"id": "LR4_BAT_V", "path": "Battery", "fmt": { "len": 16, "max": 65.535, "div": 1000, "unit": "volts" }, "name": "Battery Voltage", "suggestedMetric": "starterBatteryVoltage"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F443"}, "freq": 15, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F443"}, "freq": 30, "signals": [ {"id": "LR4_LOAD_ABS", "path": "Engine", "fmt": { "len": 16, "max": 25700, "mul": 100, "div": 255, "unit": "percent" }, "name": "Absolute Load", "suggestedMetric": "absoluteEngineLoad"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F444"}, "freq": 5, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F444"}, "freq": 3, "signals": [ {"id": "LR4_EQ_RATIO", "path": "Engine", "fmt": { "len": 16, "max": 2, "div": 32768, "unit": "scalar" }, "name": "Equivalence Ratio", "suggestedMetric": "commandedLambda"}, {"id": "LR4_FUEL_DIVISOR", "hidden": true, "path": "Engine", "fmt": { "len": 16, "max": 23.031, "div": 2845.54, "unit": "scalar" }, "name": "Fuel Rate Divisor (gal/h)", "description": "Commanded lambda premultiplied by 14.7 x 745 / 3600 x 3.785 so that mass air flow divided by this value is US gallons per hour. Exists only because synthetic signals support a plain ratio with no constant; it is the constant, folded into the divisor."}, @@ -430,11 +430,11 @@ "signals": [ {"id": "LR4_AMBIENT_TEMP", "path": "Climate", "fmt": { "len": 8, "max": 215, "min": -40, "add": -40, "unit": "celsius" }, "name": "Ambient Air Temp"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F449"}, "freq": 15, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F449"}, "freq": 30, "signals": [ {"id": "LR4_PEDAL_D", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Accelerator Pedal D"} ]}, -{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F44A"}, "freq": 15, +{ "hdr": "7E0", "rax": "7E8", "cmd": {"22": "F44A"}, "freq": 30, "signals": [ {"id": "LR4_PEDAL_E", "path": "Engine", "fmt": { "len": 8, "max": 100, "mul": 100, "div": 255, "unit": "percent" }, "name": "Accelerator Pedal E"} ]},