← Engineering log
Auto Center OBD-II Bluetooth

Auto Center Reads the Car: Bluetooth OBD-II at the Mechanic Bench

Plug a $30 Bluetooth OBD-II adapter into the port under the dash and the mechanic bench reads the check-engine light, trouble codes, the VIN and live engine data, then saves the scan on the work ticket. We built it against a real van with a vLinker MC+ plugged in.

Until now Auto Center knew what trouble codes mean (the python-OBD definitions are in its catalog) but a mechanic still had to read them off a separate scan tool and type them in. A ticket on the Mechanic Bench now has a Read the car (OBD) panel that talks to any ELM327-compatible Bluetooth adapter: vLinker, OBDLink, Veepeak, Vgate and the many clones.

  • Read codes: the check-engine light, stored, pending and permanent codes with their descriptions, the VIN and the model year it encodes. Engine and transmission codes are labeled by module.
  • On the ticket: Save scan to ticket writes what the car reported into the ticket history. If the vehicle has no VIN on file, the VIN read from the car fills it in. If the car's VIN does not match the ticket, the bench says you are plugged into the wrong car and will not save the scan. Use codes in diagnosis opens the diagnosis with the codes already filled in.
  • Live data: engine speed, coolant and intake temperature, battery voltage, load, throttle, fuel level, fuel trims, speed and time since start, about once a second. Only readings the car reports as supported are asked for.
  • Clearing codes asks first. Clearing also resets the emissions readiness checks, so a car cleared just before an inspection will fail it.

Under the hood, lib/obd.js frames the adapter's replies for CAN (11- and 29-bit, including multi-frame replies like the VIN) and the older J1850, ISO 9141 and KWP buses. Node has no Bluetooth serial sockets, so a 60-line obd_bridge.py uses the Bluetooth support built into Python and passes commands over stdin and stdout. There are no native modules to build.

Testing on a real 2014 Dodge Grand Caravan turned up things a datasheet would not tell you. The first read failed with UNABLE TO CONNECT even though the adapter's lights were flashing, because the OBD port is powered with the key off but the engine computer is asleep. The bench now says "turn the key to ON" and has a Try the car again button. The vLinker MC+ shows up as two Bluetooth devices: vLinker MC-Android (classic serial, which is what we use) and vLinker MC-IOS (Bluetooth LE). The scan hides the LE one. Bluetooth pairing failed, but none is needed. A few minutes after power-up the adapter stopped showing up in scans while still accepting connections, so the bench remembers your adapter for a one-click reconnect. It also remembers the car's protocol, which cut reconnecting from 11 to 7 seconds.

A second car, a 2005 Honda Accord, uses the older ISO 9141-2 bus, where each line is a complete frame with its own checksum and the VIN arrives in five pieces. It read cleanly on the first try. Its owner expected a code from a light seen days earlier, but the car reported the light off, no stored or pending codes and every readiness check complete. That is why the guide now says which warning lights a generic adapter cannot see: airbag, ABS and most transmission warnings live in other computers.

The tests replay verbatim recordings of both cars through the real app, with the VINs replaced. ROBOS_AUTO_OBD_RECORD records another car the same way, and E2E_OBD_LIVE=1 runs the scenarios against a real adapter.

The same release changes how shop vehicles are named. Instead of a free-text name like "Sam's Camry", every screen shows make, model and year followed by the customer, such as Honda Accord 2005 — Jim Parker, with an optional nickname in brackets.

Mechanic bench Read the car panel connected to a vLinker MC-Android adapter, showing the VIN, check-engine light on, stored codes P0133 and P0420 and pending code P0442
Read codes on the recorded van, with a check-engine light added for testing. Descriptions come from the catalog.
Live engine data read over a vLinker MC+ from a running 2005 Honda Accord: 791 rpm, coolant 156 °F, load 38 percent, fuel trims, with the check-engine light off
Captured from the app while connected to a running 2005 Honda Accord (VIN blurred).