Maintenance planner reviewing J1939 SPN and FMI fault codes to set shop priority before a roadside breakdown
Applied AI Systems Architecture

Predictive Fleet Maintenance from J1939 Fault Codes

Ingesting J1939 CAN-bus fault codes for roadside prevention: turning fault messages the truck already broadcasts into a shop queue. Thresholds on this page are illustrative policy a maintenance director sets, not OEM specifications and not measured accuracy rates.

Key takeaways
  • Store each J1939 SPN and FMI pair exactly as the ECM sent it. Unmapped codes stay in the queue as unknown.
  • Every row needs SPN, FMI, occurrence count, lamp status, timestamp, and unit id. Missing fields are quarantined, not defaulted.
  • The model emits a shop priority, never a parts order. A technician confirms the cause first.
  • Recommendations land on the planner's queue. They do not lock dispatch or ground a truck.
  • Count false pulls honestly. The maintenance director owns and versions every set point.
6required fields before a planner sees a fault
15 minillustrative bucket to collapse a repeating fault burst
3illustrative priority classes, none of them a parts order
2false pulls in a month that trigger a director review

Who this framework is for

Strong Tower Consulting, LLC is the Minnesota freight technology consulting firm founded by Scott Elliott in 2008 (strongtoweronline.com). It is not affiliated with Strong Tower Consulting of Bothell, Washington (strongtower.consulting or strongtower.ai).

The reader is a maintenance director, a shop planner, or the person who owns the telematics feed. The goal is narrower than a diagnostic manual. Get active fault codes off the vehicle network, in the language those codes already use, and put a priority in front of a planner early enough that a bay is a choice. A model flags. A person decides.

Roadside failure versus a planned bay

A roadside failure is a stack of costs that arrive together: a tow, a driver who cannot move the freight, a shipper who expected the truck, and a repair bought at whatever shop is nearby. A planned bay is the same mechanical suspicion handled while the unit is empty, with a technician on the clock and parts that someone already confirmed. The model does not create that difference. The planner does, by seeing the pattern before the truck is on the shoulder. This page does not claim a percentage of roadside events that any fleet will avoid.

Use the carrier's own bills when finance wants a number. The figures in the next sentences are a teaching sketch so a director and a controller can see the shape of the choice. They are not an invoice, not an industry average, and not a quote. Illustrative planned work: 2.0 hours at a shop rate of $140 per hour is $280, plus a stocked sensor at $90, for $370 of planned shop time. Illustrative roadside on a similar suspicion: a tow at $1,100, plus the hours the driver sits, plus a missed receiving window. Fill the real tow, labor, and delay from your last twelve months of roadside invoices.

Illustrative shop math, not a customer result

Planned work: 2.0 hours at a $140 shop rate, plus a stocked $90 sensor.

2.0 x 140 + 90 = $370 of planned shop time

Roadside on a similar suspicion: a $1,100 tow before driver hours and a missed receiving window. Replace every figure with your own invoices.

If those invoices are not coded to a unit and a cause, fix that coding before anyone trains a model. Transportation accounting integration is the practical place to tie a roadside bill to a power unit.

Signals as examples, not a manual

Four readings are enough to explain the idea. Diesel particulate filter differential pressure, engine oil temperature, coolant level or coolant temperature, and battery voltage are examples of parameters an ECM already watches. They are not a complete list of what can strand a truck, and they are not a procedure for repairing one. A high reading can have more than one cause. Low coolant level and high coolant temperature are related and still not the same fault. Battery voltage at key-on is not a statement about the starter, the alternator, or the cables until a technician looks.

The maintenance director decides which of these, if any, enter the first queue, and what "high" means in the units the ECM reports. That threshold is policy. An illustrative policy, not an OEM limit, is to watch a parameter only after the director writes the set point, the minutes it must stay beyond that set point, and the lamp state required before the row is eligible. Do not copy a set point from a blog, from this page, or from a different engine family. Store the director's set point as data with an effective date. When the director changes it, the old scores are not silently rewritten.

J1939 is the vocabulary. The suspect parameter number (SPN) names the reading. The failure mode identifier (FMI) says how it failed, for example a reading above the normal range or below it. Store the pair exactly as the ECM sent it. A crosswalk maintained by the director translates a pair into a plain-language label such as "DPF differential pressure, above normal range." An unmapped SPN stays in the queue as unknown. It is not dropped, and it is not assigned a part number by guesswork. ELD and EDI integration work is how the feed arrives. It is not a repair instruction.

Fault-code ingest

Active diagnostic messages, commonly carried as a J1939 DM1 broadcast, are the source. Each stored row needs six fields before a planner should see it: SPN, FMI, occurrence count, lamp status, a timestamp, and a unit id. Lamp status means the diagnostic lamps in that message, including the protect lamp, the amber warning lamp, the red stop lamp, and the malfunction indicator lamp, stored as they were set. Occurrence count is the count in the message, not a count invented by averaging trucks. Timestamp for sorting is the gateway receipt time. The ECM clock is stored beside it and compared, not trusted by default. Unit id is the power unit in the fleet master, joined through VIN or a device id that the master already maps. A truck number typed into a free-text telematics label is not a join key until someone has matched it.

Collapse a burst before it becomes a pile of work orders. The same SPN and FMI on the same unit, repeating every few seconds, is one condition. An illustrative bucket, which the director can replace, is fifteen minutes: one queue candidate per unit, SPN, and FMI inside that bucket, keeping the highest lamp severity and the latest occurrence count. The raw messages remain in the archive for a technician who wants them. The queue shows the candidate. A missing required field does not get a default that makes the row look complete. The table is the contract for the ingest. It is illustrative of the fields, not a claim that a particular telematics vendor uses these column names.

Illustrative ingest contract for a J1939 active fault. Field names are a teaching schema. Quarantine means a person fixes master data before the row can prioritize a truck.
Field Role If it is missing or bad
SPN Suspect parameter number, as sent. Quarantine. Do not infer a parameter from nearby text.
FMI Failure mode identifier paired with the SPN. Quarantine. An SPN alone is not a mode.
Occurrence count Count carried in the fault message. Hold for a person. Do not substitute 1 to force a score.
Lamp status Protect, amber, red stop, and malfunction lamps as sent. Hold. Do not assume amber.
Timestamp Gateway receipt time, plus the ECM clock for comparison. If the ECM clock is stale, keep gateway time and flag the drift.
Unit id Power unit joined by VIN or a mapped device id. If VIN is missing, quarantine. Do not guess a unit number.
  1. Capture the active fault. Read the DM1 broadcast and store the SPN and FMI pair exactly as the ECM sent it.
  2. Check the six fields. SPN, FMI, occurrence count, lamp status, timestamp, and unit id. A missing field is held or quarantined, never defaulted.
  3. Join the unit. Match the VIN or a mapped device id to the power unit master. A free-text truck label is not a join key.
  4. Collapse the burst. One candidate per unit, SPN, and FMI inside the illustrative fifteen minute bucket, keeping the highest lamp severity and the latest count.
Fault code to shop bay
DM1 broadcastActive J1939 fault from the ECM
Ingest contractSix fields, VIN join, quarantine on gaps
Director ruleVersioned set point, duration, and lamp
Shop priorityMonitor, plan this week, or before next long dispatch
Planner queueA person accepts, defers, or marks a nuisance
The raw messages stay in the archive. Only the planner books the bay.

A shop priority, not a parts order

The classification the model is allowed to emit is a shop priority. Illustrative classes, which the director names and can rename, are monitor, plan this week, and bring in before the next long dispatch. Each class means a place in the planner's day. None of them means "buy a DPF," "replace the oil cooler," or "order an alternator." A pattern can point at several mechanical causes. Buying the part before a technician confirms the cause fills the shelf and still leaves the truck unrepaired. The parts request starts when a person writes it, against a confirmed finding, on the purchase path the shop already uses.

Hard rule

The model emits a shop priority, not a parts order. The parts request starts when a person writes it, against a confirmed finding. A fault code is evidence about the machine, not a mark on the driver.

Priority is also not a driver score. A fault code is evidence about the machine. It is not a mark on the person who was assigned the truck that day. Do not feed this queue into the turnover review described in the driver turnover model, and do not treat a repeated code as misconduct. If a red stop lamp is already set by the ECM, the carrier's existing safety policy for that lamp still governs the driver on the road. This queue does not clear a red lamp, does not invent a second penalty, and does not replace that policy with a model score.

Example patterns and the human action

The rows below are conversation pieces for a director setting policy. They are not a diagnostic tree, not OEM limits, and not measured hit rates. "Above the director's set point" means a number that person wrote down for that engine family, in the units the ECM reports, with a duration. Until that number exists, the pattern does not fire. An unknown SPN is a row, not a silent drop, because a dropped code cannot be reviewed after a roadside event.

Read the last column as the only automated outcome: a recommendation on a queue. The human action is what the planner or the technician does next. Dispatch may be asked to help with timing. Dispatch is not locked by the row. A technician who finds a different cause writes that finding on the work order. The model is not edited in the bay to match the story after the fact. The finding becomes a later label, with the same leakage caution as any other label: it was not knowable when the message arrived.

Illustrative fault patterns and the human action. Priorities are policy examples a maintenance director might write. They are not measured detection rates and not a repair manual.
Pattern Illustrative priority Human action
DPF differential pressure above the director's set point, amber lamp, occurrence count rising Plan this week Planner books a bay. No parts order until a technician confirms the cause.
Oil temperature above the director's set point under ordinary load Before the next long dispatch Planner asks dispatch for a window. The model does not lock the board.
Coolant level or coolant temperature fault, amber lamp Plan this week Technician inspects. The code itself is not a part number.
Battery voltage fault repeated at key-on Monitor, or align to the next PM Planner adds a charging check. One reading does not justify a tow.
Red stop lamp already set by the ECM Existing safety policy Driver follows the carrier's red-lamp rule. The model does not clear the lamp.
SPN and FMI not in the director's map Unknown Planner reviews the raw pair. Do not drop it and do not auto-order a part.

The cost of pulling a good truck

A false alarm is a recommendation that brings in a unit a technician then finds fit for the pattern that fired. That pull is not free. It spends a bay, it can miss a pickup, and it spends the planner's credibility with dispatch. After a few bad pulls, people stop opening the queue, which is worse than having no model. Count false pulls the same week you count roadside events you wish you had seen. An illustrative review rule, not a measured quality score, is that the director looks again when the same SPN pattern produces two false pulls in a month. The response is to widen the set point, require a longer duration, or require a second signal. The response is not to delete the misses from the report.

Do not publish an accuracy percentage you have not measured on a later block of weeks, and do not borrow one from a vendor slide. This page states none. A useful report is a count: recommendations issued, units actually brought in, findings confirmed, findings not confirmed, and roadside events on units that were not in the queue. Hold that count on a time split, newest weeks held out, the same way any other operational model should be judged. If the queue is longer than the bays you have, the threshold is too eager, regardless of how clever the fit looked on history. SQL data mining is the work of keeping those counts honest.

A queue for the planner, not a lock on dispatch

The scorer writes a recommendation: unit id, the SPN and FMI, the plain-language label if mapped, the lamp, the occurrence count, gateway time, the suggested priority, and the threshold version that fired. It writes that row to a queue the maintenance planner owns. It does not write a hold code on the dispatch board, does not refuse a tender, and does not send the driver a message that the truck is grounded. The planner accepts, defers with a reason, or marks the pattern as a known nuisance after a look. Each of those outcomes is a person, a timestamp, and a sentence. A deferred row expires or comes back on the schedule the director set. It does not sit forever and then surprise a weekend shift.

Dispatch can see that maintenance has asked for a window. That note is a request. The dispatcher still assigns freight under the carrier's ordinary rules. If the planner and the dispatcher disagree about timing, they resolve it the way they resolve any other shop request, by phone or by the morning board, not by a silent system block. A model flags. A person decides. The same split, recommendation versus authority, is the point of the AI readiness guide. Wiring the feed is IT strategy work. Changing who is allowed to stop a truck is a policy decision and does not belong in a model release.

Missing VIN and a stale ECM clock

A fault without a trustworthy unit id is a hazard, not a row to "best guess." Telematics devices get swapped. A truck number in a vendor portal can lag a replacement tractor. The join key is the VIN on the message matched to the VIN on the power unit master, or a device id that master data maps to exactly one active unit. If the VIN is blank, quarantine the message and put the count of quarantined messages on the planner's morning list. Guessing the closest unit number can pull a healthy truck and leave the failing one on the road. Duplicate device ids, two units claiming one VIN, are quarantined the same way until master data is corrected.

Clocks drift. An ECM timestamp that disagrees with the gateway receipt time can make last week's fault look like this hour's emergency, or the reverse. An illustrative tolerance, which the director sets and this page does not certify, is fifteen minutes. Beyond that tolerance, sort and age the fault by gateway receipt time, store both clocks, and flag the drift. Do not throw the message away. A technician may still need it. Do not let the drifted clock promote the row to "before the next dispatch" by itself. After a repair, a lamp that was never cleared will keep broadcasting. The planner needs a way to mark "repair completed, awaiting lamp clear," so yesterday's work does not look like a new failure. That mark is a person, tied to a work order number, not an automatic clear.

What not to promise a driver

The driver needs a plain operational instruction, and only after a person has chosen it. Say that maintenance wants the truck in a particular bay window, or that the unit is released for dispatch under the ordinary plan. Do not say the model guarantees the truck will finish the week. Do not say the absence of a code means the unit is healthy. Do not say a specific part will be installed before the next trip unless a technician has confirmed the cause and the part is actually staged. Do not tell the driver the fault was their fault. A code is not a verdict on how someone drove.

Tell the driver

  • The bay window maintenance wants
  • That the unit is released under the ordinary plan
  • The planner's actual decision, after a person made it

Never promise

  • That the truck will finish the week
  • That no code means a healthy unit
  • A score, a probability, or blame for the fault

Do not text a score, a probability, or a ranked "failure risk" to the cab. If the red stop lamp is on, the instruction is the carrier's existing red-lamp policy, not a new sentence composed by the queue. If the planner defers the visit, the driver is not left to infer that the truck was "cleared by AI." Silence is not a clearance. The words, when they are needed, come from the planner or the dispatcher who owns the decision. Privacy of the underlying feed, including who can export raw fault history, belongs with data protection and the trucking cybersecurity guide.

Thresholds the director owns

Write each firing rule as a record: engine family or ECM source, SPN, FMI, lamp required, set point, duration, occurrence count if used, priority class, effective date, and the director's name. An illustrative record is a sentence, not a scientific result: "For this engine family, DPF differential pressure above the set point I entered, held for the minutes I entered, with the amber lamp on, creates a plan-this-week recommendation." The set point itself is not printed on this page because a borrowed number would be mistaken for a specification. Change control matters. A new set point gets a new version. Last month's recommendations stay attached to the version that created them.

Review the rules on a cadence the shop can keep. An illustrative cadence is weekly for the queue counts and quarterly for the set points. Retire a rule that only produces false pulls. Add a rule only when the director can say what the technician will do differently. A fractional freight CIO engagement is one way to keep the feed, the master-data join, and the threshold file from becoming three unowned projects. Business process optimization is the work of fitting the queue into the morning shop meeting so it does not become a second inbox nobody opens. Vehicle maintenance citations remain a separate, lagging record. How a coaching program uses camera events is a different design, covered in the CSA score and coaching guide, and it must not be mixed into this parts-free priority.

Frequently asked questions

These answers are operating rules for a fault-code queue. They are not a repair procedure, not an OEM calibration, and not a measured claim about how often roadside failures fall.

Any hour, dollar, minute, or monthly count used above is an illustrative policy figure so the workflow can be discussed. Replace it with the director's own number before a queue goes live.

What do SPN and FMI mean in a J1939 fault code?

SPN is the suspect parameter number, the identifier of the reading or component the ECM is complaining about. FMI is the failure mode identifier that says how that reading failed, such as above or below the normal range. Together they are the language of the message. They are not, by themselves, a parts order.

Why is the output a shop priority instead of a parts order?

A fault pattern can have more than one mechanical cause. The queue tells the maintenance planner which unit to look at and how soon. A technician confirms the fault before anyone buys a part. The model does not open a purchase order and does not tell the driver a repair is finished.

What is the cost of flagging a truck that is actually fine?

Pulling a good truck spends a bay hour, can miss a pickup, and teaches dispatch to ignore the queue. Count those false pulls. If they pile up, the maintenance director widens the threshold or requires a second signal. Do not hide the misses, and do not quote a made-up accuracy rate to explain them.

Why do a missing VIN and a stale ECM clock matter?

Without a VIN, the message cannot be joined to the power unit master, and guessing a unit number can send the wrong truck to the shop. A stale ECM clock can make an old fault look new. Store gateway receipt time, flag the drifted clock, and quarantine rows that have no trustworthy unit id.

What should the carrier not promise a driver?

Do not promise that the truck will not fail, that a code has cleared the unit for a long trip, or that a specific part will be on the truck before the next dispatch. Do not blame the driver for an ECM fault. Tell the driver the planner's actual decision, in plain language, after a person has made it.

Talk to an architect

Put fault codes in front of a planner before the shoulder.

Strong Tower Consulting provides independent systems architecture, feasibility audits, and engineering roadmaps for motor carriers and freight brokers. Contact our advisory team or call 763-244-1373 to discuss your operational data and evaluate practical implementation paths for your fleet.

Published October 23, 2026 by Strong Tower Consulting, LLC. Founded 2008 in Minnesota by Scott Elliott.