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.
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.
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.
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.
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.
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.
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.
iso11783_from_agisostack.dbc — 46 frames, 84 signals derived from AgIsoStack++ (MIT); signal-rich: speed/distance, guidance, time/date, language, maintain-power, heartbeat 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_ag_subset.dbc — 17 frames, 69 signals a hand-curated SAE J1939 ag-relevant subset; signal-rich _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
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.
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.
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
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.
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.
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.
Coverage that updates itself
On push to main, regenerates the coverage doc and commits the diff.
The test suite
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
| Bucket | What falls in it |
|---|---|
| In scope | PGNs in standard ISO 11783 / J1939 ranges, sourced from public summaries |
| Out of scope — CI-enforced | PGNs in the proprietary 0xEF00 and 0xFF00..0xFFFF ranges |
| Out of scope — by policy | Transcribed 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.