Add LR4 commands - #5

Open
mwvolo wants to merge 63 commits into
OBDb:mainfrom
mwvolo:main
Open

Add LR4 commands#5
mwvolo wants to merge 63 commits into
OBDb:mainfrom
mwvolo:main

Conversation

@mwvolo

@mwvolomwvolo commented Jul 12, 2025

Copy link
Copy Markdown

Partially working on 2016 LR4
Adds (additional to core - confirmed working):

  • LANDROVER_PARKED (yes/no, reversed on main LR repo)
  • LANDROVER_ENGINE_LOAD (0-100%)
  • LANDROVER_IAT - Intake Air Temp (ºC)
  • LANDROVER_MAF - Mass Air Flow (g/Sec)
  • LANDROVER_ENGINE_OIL_TEMP (ªC)
  • LANDROVER_BOOST (1-5)

Other commands are [WIP]

@mwvolomwvolo closed this Jul 18, 2025
@jverkoey

Copy link
Copy Markdown
Member

Heya! Was following along; did you need some help getting this one over the finish line?

@mwvolo

mwvolo commented Jul 19, 2025

Copy link
Copy Markdown
Author

Ha! Figured I was making a lot of noise, but I'll reopen for you to follow along!
Is there a way for me to validate json locally?

I am pretty excited by how much I've uncovered so far--big trip coming up and excited to use it!

@mwvolomwvolo reopened this Jul 19, 2025
mwvolo added 30 commits October 4, 2025 20:31
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.
…obes
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.
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.
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.
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.
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.
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.
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.
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.
…d 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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@mwvolo@jverkoey
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add LR4 commands - #5

Open
mwvolo wants to merge 63 commits into
OBDb:mainfrom
mwvolo:main
Open

Add LR4 commands#5
mwvolo wants to merge 63 commits into
OBDb:mainfrom
mwvolo:main

Conversation

@mwvolo

@mwvolomwvolo commented Jul 12, 2025

Copy link
Copy Markdown

Partially working on 2016 LR4
Adds (additional to core - confirmed working):

  • LANDROVER_PARKED (yes/no, reversed on main LR repo)
  • LANDROVER_ENGINE_LOAD (0-100%)
  • LANDROVER_IAT - Intake Air Temp (ºC)
  • LANDROVER_MAF - Mass Air Flow (g/Sec)
  • LANDROVER_ENGINE_OIL_TEMP (ªC)
  • LANDROVER_BOOST (1-5)

Other commands are [WIP]

@mwvolomwvolo closed this Jul 18, 2025
@jverkoey

Copy link
Copy Markdown
Member

Heya! Was following along; did you need some help getting this one over the finish line?

@mwvolo

mwvolo commented Jul 19, 2025

Copy link
Copy Markdown
Author

Ha! Figured I was making a lot of noise, but I'll reopen for you to follow along!
Is there a way for me to validate json locally?

I am pretty excited by how much I've uncovered so far--big trip coming up and excited to use it!

@mwvolomwvolo reopened this Jul 19, 2025
mwvolo added 30 commits October 4, 2025 20:31
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.
…obes
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.
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.
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.
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.
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.
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.
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.
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.
…d 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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@mwvolo@jverkoey
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add LR4 commands - #5

Open
mwvolo wants to merge 63 commits into
OBDb:mainfrom
mwvolo:main
Open

Add LR4 commands#5
mwvolo wants to merge 63 commits into
OBDb:mainfrom
mwvolo:main

Conversation

@mwvolo

@mwvolomwvolo commented Jul 12, 2025

Copy link
Copy Markdown

Partially working on 2016 LR4
Adds (additional to core - confirmed working):

  • LANDROVER_PARKED (yes/no, reversed on main LR repo)
  • LANDROVER_ENGINE_LOAD (0-100%)
  • LANDROVER_IAT - Intake Air Temp (ºC)
  • LANDROVER_MAF - Mass Air Flow (g/Sec)
  • LANDROVER_ENGINE_OIL_TEMP (ªC)
  • LANDROVER_BOOST (1-5)

Other commands are [WIP]

@mwvolomwvolo closed this Jul 18, 2025
@jverkoey

Copy link
Copy Markdown
Member

Heya! Was following along; did you need some help getting this one over the finish line?

@mwvolo

mwvolo commented Jul 19, 2025

Copy link
Copy Markdown
Author

Ha! Figured I was making a lot of noise, but I'll reopen for you to follow along!
Is there a way for me to validate json locally?

I am pretty excited by how much I've uncovered so far--big trip coming up and excited to use it!

@mwvolomwvolo reopened this Jul 19, 2025
mwvolo added 30 commits October 4, 2025 20:31
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.
…obes
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.
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.
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.
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.
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.
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.
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.
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.
…d 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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@mwvolo@jverkoey
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add LR4 commands - #5

Open
mwvolo wants to merge 63 commits into
OBDb:mainfrom
mwvolo:main
Open

Add LR4 commands#5
mwvolo wants to merge 63 commits into
OBDb:mainfrom
mwvolo:main

Conversation

@mwvolo

@mwvolomwvolo commented Jul 12, 2025

Copy link
Copy Markdown

Partially working on 2016 LR4
Adds (additional to core - confirmed working):

  • LANDROVER_PARKED (yes/no, reversed on main LR repo)
  • LANDROVER_ENGINE_LOAD (0-100%)
  • LANDROVER_IAT - Intake Air Temp (ºC)
  • LANDROVER_MAF - Mass Air Flow (g/Sec)
  • LANDROVER_ENGINE_OIL_TEMP (ªC)
  • LANDROVER_BOOST (1-5)

Other commands are [WIP]

@mwvolomwvolo closed this Jul 18, 2025
@jverkoey

Copy link
Copy Markdown
Member

Heya! Was following along; did you need some help getting this one over the finish line?

@mwvolo

mwvolo commented Jul 19, 2025

Copy link
Copy Markdown
Author

Ha! Figured I was making a lot of noise, but I'll reopen for you to follow along!
Is there a way for me to validate json locally?

I am pretty excited by how much I've uncovered so far--big trip coming up and excited to use it!

@mwvolomwvolo reopened this Jul 19, 2025
mwvolo added 30 commits October 4, 2025 20:31
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.
…obes
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.
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.
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.
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.
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.
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.
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.
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.
…d 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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@mwvolo@jverkoey
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add LR4 commands - #5

Open
mwvolo wants to merge 63 commits into
OBDb:mainfrom
mwvolo:main
Open

Add LR4 commands#5
mwvolo wants to merge 63 commits into
OBDb:mainfrom
mwvolo:main

Conversation

@mwvolo

@mwvolomwvolo commented Jul 12, 2025

Copy link
Copy Markdown

Partially working on 2016 LR4
Adds (additional to core - confirmed working):

  • LANDROVER_PARKED (yes/no, reversed on main LR repo)
  • LANDROVER_ENGINE_LOAD (0-100%)
  • LANDROVER_IAT - Intake Air Temp (ºC)
  • LANDROVER_MAF - Mass Air Flow (g/Sec)
  • LANDROVER_ENGINE_OIL_TEMP (ªC)
  • LANDROVER_BOOST (1-5)

Other commands are [WIP]

@mwvolomwvolo closed this Jul 18, 2025
@jverkoey

Copy link
Copy Markdown
Member

Heya! Was following along; did you need some help getting this one over the finish line?

@mwvolo

mwvolo commented Jul 19, 2025

Copy link
Copy Markdown
Author

Ha! Figured I was making a lot of noise, but I'll reopen for you to follow along!
Is there a way for me to validate json locally?

I am pretty excited by how much I've uncovered so far--big trip coming up and excited to use it!

@mwvolomwvolo reopened this Jul 19, 2025
mwvolo added 30 commits October 4, 2025 20:31
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.
…obes
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.
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.
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.
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.
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.
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.
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.
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.
…d 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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@mwvolo@jverkoey
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add LR4 commands - #5

Open
mwvolo wants to merge 63 commits into
OBDb:mainfrom
mwvolo:main
Open

Add LR4 commands#5
mwvolo wants to merge 63 commits into
OBDb:mainfrom
mwvolo:main

Conversation

@mwvolo

@mwvolomwvolo commented Jul 12, 2025

Copy link
Copy Markdown

Partially working on 2016 LR4
Adds (additional to core - confirmed working):

  • LANDROVER_PARKED (yes/no, reversed on main LR repo)
  • LANDROVER_ENGINE_LOAD (0-100%)
  • LANDROVER_IAT - Intake Air Temp (ºC)
  • LANDROVER_MAF - Mass Air Flow (g/Sec)
  • LANDROVER_ENGINE_OIL_TEMP (ªC)
  • LANDROVER_BOOST (1-5)

Other commands are [WIP]

@mwvolomwvolo closed this Jul 18, 2025
@jverkoey

Copy link
Copy Markdown
Member

Heya! Was following along; did you need some help getting this one over the finish line?

@mwvolo

mwvolo commented Jul 19, 2025

Copy link
Copy Markdown
Author

Ha! Figured I was making a lot of noise, but I'll reopen for you to follow along!
Is there a way for me to validate json locally?

I am pretty excited by how much I've uncovered so far--big trip coming up and excited to use it!

@mwvolomwvolo reopened this Jul 19, 2025
mwvolo added 30 commits October 4, 2025 20:31
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.
…obes
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.
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.
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.
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.
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.
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.
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.
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.
…d 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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@mwvolo@jverkoey
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add LR4 commands - #5

Open
mwvolo wants to merge 63 commits into
OBDb:mainfrom
mwvolo:main
Open

Add LR4 commands#5
mwvolo wants to merge 63 commits into
OBDb:mainfrom
mwvolo:main

Conversation

@mwvolo

@mwvolomwvolo commented Jul 12, 2025

Copy link
Copy Markdown

Partially working on 2016 LR4
Adds (additional to core - confirmed working):

  • LANDROVER_PARKED (yes/no, reversed on main LR repo)
  • LANDROVER_ENGINE_LOAD (0-100%)
  • LANDROVER_IAT - Intake Air Temp (ºC)
  • LANDROVER_MAF - Mass Air Flow (g/Sec)
  • LANDROVER_ENGINE_OIL_TEMP (ªC)
  • LANDROVER_BOOST (1-5)

Other commands are [WIP]

@mwvolomwvolo closed this Jul 18, 2025
@jverkoey

Copy link
Copy Markdown
Member

Heya! Was following along; did you need some help getting this one over the finish line?

@mwvolo

mwvolo commented Jul 19, 2025

Copy link
Copy Markdown
Author

Ha! Figured I was making a lot of noise, but I'll reopen for you to follow along!
Is there a way for me to validate json locally?

I am pretty excited by how much I've uncovered so far--big trip coming up and excited to use it!

@mwvolomwvolo reopened this Jul 19, 2025
mwvolo added 30 commits October 4, 2025 20:31
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.
…obes
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.
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.
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.
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.
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.
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.
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.
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.
…d 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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@mwvolo@jverkoey
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add LR4 commands - #5

Open
mwvolo wants to merge 63 commits into
OBDb:mainfrom
mwvolo:main
Open

Add LR4 commands#5
mwvolo wants to merge 63 commits into
OBDb:mainfrom
mwvolo:main

Conversation

@mwvolo

@mwvolomwvolo commented Jul 12, 2025

Copy link
Copy Markdown

Partially working on 2016 LR4
Adds (additional to core - confirmed working):

  • LANDROVER_PARKED (yes/no, reversed on main LR repo)
  • LANDROVER_ENGINE_LOAD (0-100%)
  • LANDROVER_IAT - Intake Air Temp (ºC)
  • LANDROVER_MAF - Mass Air Flow (g/Sec)
  • LANDROVER_ENGINE_OIL_TEMP (ªC)
  • LANDROVER_BOOST (1-5)

Other commands are [WIP]

@mwvolomwvolo closed this Jul 18, 2025
@jverkoey

Copy link
Copy Markdown
Member

Heya! Was following along; did you need some help getting this one over the finish line?

@mwvolo

mwvolo commented Jul 19, 2025

Copy link
Copy Markdown
Author

Ha! Figured I was making a lot of noise, but I'll reopen for you to follow along!
Is there a way for me to validate json locally?

I am pretty excited by how much I've uncovered so far--big trip coming up and excited to use it!

@mwvolomwvolo reopened this Jul 19, 2025
mwvolo added 30 commits October 4, 2025 20:31
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.
…obes
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.
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.
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.
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.
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.
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.
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.
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.
…d 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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@mwvolo@jverkoey