writing / industrial-edge 8 public repos
← writing ↑ part of Ag / Industrial
industrialedge opendbc-ag ↗

Industrial edge — a sprayer diagnostic, a field curriculum, a protocol library

The closed-tooling problem

The machine is opaque, and the fix lives in one head.

Off-highway equipment runs on CAN and ISOBUS buses with far less open tooling than cars have — so a captured bus is opaque, and a field fix lives only in the head of whoever worked it out. The class is closed-tooling domains: making an opaque machine readable, and a one-time repair repeatable.

What it is

Two related field artifacts in agricultural / industrial edge work — a GPS-dropout diagnostic and a firmware-flash field curriculum — plus the public protocol library they connect to. The diagnostic and curriculum are the field side of the job; opendbc-ag, an MIT-licensed agricultural CAN-bus protocol library, is the protocol side — and the part that is public and inspectable. A DBC file maps raw CAN frames to named signals, so the corpus is the thing that makes a captured ag-equipment bus readable.

2,690
unique PGNs in the corpus
2,780
signals
3
DBC files, distinct public sources
76
tests passing in CI
What's honest about the scope. opendbc-ag is public, MIT-licensed, at v0.1.0 — the first repo through the project-delivery pipeline; a reference CAN trace corpus and field-specific pinouts are flagged as future work requiring hardware capture, and are not yet present. The diagnostic is the method with equipment specifics kept general, not a public artifact; the curriculum is a written procedure, not a tool or a deployed system.

Where it generalizes

This is the OT / edge layer — where operational technology meets IT: making industrial buses inspectable and field procedures repeatable. It is asset-management and edge-diagnostic work. opendbc-ag is public; the field diagnostic and the curriculum are method and documentation, kept general.

Two halves of the same job

Find the fault. Then write it down.

A diagnostic and a curriculum on the same self-propelled sprayer: isolate an intermittent fault to a segment of the signal path, then write the fix down so others can perform it without the person who first worked it out.

01

One symptom, several possible causes

raven-viper — a diagnostic for intermittent GPS dropout on a self-propelled agricultural sprayer's GPS-guided steering system. The steering loses its position fix, and that symptom sits at the end of a signal path with several possible upstream causes.

02

Isolated segment by segment

The diagnostic isolates the dropout along that path — receiver, bus, steering controller — separating a hardware fault from a firmware or configuration cause. Each segment is checked in turn, so a single intermittent symptom resolves to a located cause rather than a guess, and the same fault, when it recurs, points to the same segment.

03

The fix, written down

sprayer-apprenticeship — a documentation-only curriculum that walks a small group through the sprayer firmware-flash procedure end to end. It is the second half of the same job: once a fix exists, it gets written down so others can perform it without the person who first worked it out.

04

Verified at every step

The curriculum covers each step of the flash procedure: what the step does, what can go wrong there, and how to verify it succeeded before moving on. Failure modes are named in advance, and a verification check at each stage means a mistake surfaces where it happened rather than at the end — a one-time fix turned into a teachable, repeatable procedure.

Field equipment and equipment-specific particulars — brand and firmware-version specifics included — are kept general. What the artifacts demonstrate is the method: take an intermittent failure on a real bus-connected machine, decompose the signal path, and attribute the fault to a segment.

The public anchor

A shared baseline where none existed.

opendbc-ag is a community-maintainable repository of CAN DBC files for agricultural equipment — the ag analog to comma.ai's automotive opendbc. It fills a gap: no widely shared MIT-licensed ag-CAN DBC corpus exists; the commercial incumbent is closed and non-redistributable, and community projects each maintain partial DBCs without a shared baseline. opendbc-ag aims to be that baseline — content anyone can fork, modify, and ship.

Coverage

The corpus totals 2,690 unique PGNs and 2,780 signals across three DBC files, each from a distinct public source. A live coverage matrix is auto-regenerated by CI on every DBC change.

AgIsoStack
iso11783_from_agisostack.dbc — 46 frames, 84 signals derived from AgIsoStack++ (MIT); signal-rich: speed/distance, guidance, time/date, language, maintain-power, heartbeat
VDMA
iso11783_from_vdma.dbc — 2,627 frames and signals from the isobus.net VDMA Data Dictionary; PGN-level only — placeholders awaiting community signal-level enrichment
J1939
j1939_ag_subset.dbc — 17 frames, 69 signals a hand-curated SAE J1939 ag-relevant subset; signal-rich
The signal count is honest about its shape: 2,627 of the 2,780 signals are PGN-level _RawPayload placeholders from the VDMA file, awaiting community PRs. The developed, signal-level definitions live in the AgIsoStack and J1939 DBCs.

How the corpus is built

01

Extract to JSON first

Each DBC file is produced by a dedicated extractor that writes an intermediate JSON, then converts it to DBC via canmatrix. The two-stage pipeline keeps generation reproducible and the intermediate auditable.

02

Three extractors, three sources

An AgIsoStack++ C++ extractor, a VDMA HTML scraper, and a hand-curated J1939 list each feed their own JSON, which becomes the matching DBC.

03

Provenance on every signal

Every signal in the final artifact carries a comment naming its public source, so provenance traces from the shipped DBC back to the original published page or line of code.

Licensing

License
MIT
Runtime dependencies
permissive only — no GPL/AGPL canmatrix + cantools (BSD-2) · numpy (BSD-3) · scrape stack (Apache-2.0 / MIT) · python-can (LGPL-3.0, link-only)

Enforced by code, not by review

Anyone can open a PR. CI holds the line.

Scope is pure-standard PGNs only — ISO 11783 (ISOBUS) public summaries and the SAE J1939 ag-relevant subset; no reverse-engineered proprietary OEM PGNs. Two principles drive the design: scope policy is enforced by code, so CI rejects violations without a maintainer reading every line — and duplicate detection is enforced by code too.

ci.yml

Parse everything, test everything

A Python 3.10/3.11/3.12/3.13 matrix installs the package, parses every DBC via canmatrix, and runs the full test suite — 76 passing, 2 xfailed for documented inferrer edge cases. A separate soft-fail audit job runs pip-audit.

hard fail · blocks merge
consistency.yml

No proprietary ranges, no duplicates

Rejects any PGN ID in the proprietary 0xEF00 or 0xFF00..0xFFFF ranges, and any PGN ID appearing in more than one DBC file. Cross-DBC duplicates are easy to introduce by accident when three extractors target overlapping ranges, so the build makes them an error rather than a runtime correctness bug.

hard fail · blocks merge
coverage.yml

Coverage that updates itself

On push to main, regenerates the coverage doc and commits the diff.

best-effort · informational

The test suite

smoke / parse invariantsscope predicate · 28 testssignal-naming rulesheuristic inferrercoverage generatorlog anonymizer3 extractor parsers

Nine test files in all. A synthetic CAN fixture is regenerated by a deterministic script — byte-identical output — and seeds known signal patterns, so the inferrer's heuristics can be checked against ground truth.

Scope policy and the legal frame

BucketWhat falls in it
In scopePGNs in standard ISO 11783 / J1939 ranges, sourced from public summaries
Out of scope — CI-enforcedPGNs in the proprietary 0xEF00 and 0xFF00..0xFFFF ranges
Out of scope — by policyTranscribed paywalled-spec text, reverse-engineered OEM proprietary frame definitions, and material whose primary purpose is circumvention

The project ships a legal-context document that situates the scope against the ag repair-rights landscape — the FTC's 2025 action against Deere, the federal FARM Act, Iowa HF 2763, and the DMCA §1201 exemption process (the tractor-software repair exemption granted in 2021 and renewed in 2024). The document is explicit that it is context, not legal advice.

The public-standards-only scope is chosen partly because it is unambiguous across every plausible regulatory outcome: a focused scope is simpler to maintain, lowers contributor coordination overhead, supports downstream use as a dependency, and stays stable as the repair-rights debate resolves.