YipiiYipii IoT Docs

CAN Adapters

Which Teltonika CAN adapter does what, the vehicle data each one reports, and the API for reading capabilities and sending control actions.

Share

A Teltonika CAN adapter sits between the tracker and the vehicle bus. Depending on the model it reports vehicle data — fuel, odometer, RPM, door status, VIN — and, on one model only, actuates the vehicle.

Choosing an adapter

LV-CAN200ALL-CAN300CAN-CONTROLCAN-CONTROL + IMMO
Read CAN datayesyesyesyes
Light vehicles and EVsyesyesyesyes
Trucks, buses, agriculturalyes
Lock / unlock, trunk, horn, lightsyesyes
Block the enginenoyes

Engine blocking requires the IMMO variant specifically. The base CAN-CONTROL has no engine-lock function at all — this is a different part number, not a setting. Ordering the wrong one means re-ordering, not reconfiguring.

Capability is also per vehicle. Across Teltonika's published lists, over vehicles that support any control at all:

ActionCAN-CONTROLCAN-CONTROL + IMMO
Turn signals94.0%94.1%
Lock / unlock77.5%77.0%
Trunk release47.2%46.6%
Engine locknot offered54.9%
Comfort closure (windows)31.6%31.2%
Horn16.3%16.1%

Provisioning

An adapter reads nothing until it is given the program number for the vehicle it is attached to.

That number is printed on the mounting scheme packed with the adapter — it is not in the supported-vehicle lists and cannot be looked up from public data. Capture it at install time. It is then set remotely and verified.

The adapter's software date must be newer than the connection scheme's date, or the program number cannot be written. Check with the adapter info command before suspecting the wiring.

Data reported

334 CAN elements are decoded and published in the tracker's IO data with a can prefix, so a bus reading is never confused with the OBD or GPS field of the same name — canVehicleSpeed comes off the vehicle bus, vehicleSpeed is OBD, speed is GPS-derived.

Commonly used fields:

FieldUnitsNotes
canFuelLevelLitersl
canFuelLevelPercent%
canTotalMileagemdashboard odometer
canEngineRpmrpm
canEngineTemperature°Ccan be negative
canEngineLoad%
canFuelRatel/h
canDoorStatusbitmasksee below
canVintext
canVehiclesRangeOnBatterymelectric vehicles
canAdblueLevelPercent%
canDriver1Idtexttachograph driver card

Door and security state

canDoorStatus is a bitmask, so it is also published as individual booleans — use these rather than comparing the raw number:

canDoorFrontLeftOpen, canDoorFrontRightOpen, canDoorRearLeftOpen, canDoorRearRightOpen, canHoodOpen, canTrunkOpen, and a canAnyOpeningOpen roll-up.

Vehicles that report the security-state block also publish canSsfIgnition, canSsfHandbrakeIsActive, canSsfCarIsClosed and the per-door equivalents as booleans.

When the ignition is off, some fields hold their last value (mileage, fuel level, engine hours) while others reset to zero (speed, RPM, pedal position). A zero speed with the ignition off is not a measurement — check the field's timestamp.

API

Read what a vehicle can do

GET /api/{account}/asset/{asset}/control/capabilities
{
  "status": "success",
  "data": {
    "adapter": "cancontrol_immo",
    "program_number": 11862,
    "line_status": "ok",
    "profile": {
      "variant": "CAN-CONTROL+IMMO",
      "brand": "VOLKSWAGEN",
      "model": "TRANSPORTER T6",
      "comfort_closure": true,
      "capabilities": { "lock_all_doors": true, "trunk_release": false }
    },
    "actions": { "LOCK": true, "UNLOCK": true, "TRUNK": false, "IMMOBILISE": true },
    "reasons": { "TRUNK": "not_supported_by_vehicle" },
    "requires_confirmation": ["IMMOBILISE"]
  }
}

Call this before rendering controls. An action that is false should not be shown at all — a disabled control implies "later", while absence is accurate.

Send an action

POST /api/{account}/asset/{asset}/control
{ "action": "LOCK", "confirm": false }

IMMOBILISE requires "confirm": true.

A 202 means the command reached the vehicle:

{
  "status": "success",
  "command_id": 84213,
  "action": "LOCK",
  "state": "delivered_awaiting_vehicle_confirmation"
}

Do not retry on a missing confirmation. Every CAN control command is a toggle — sending it twice can undo it. Poll the command's status instead, and confirm against the vehicle's reported state.

Refusals return 422 (policy) or 200 with a reason (device state):

ReasonMeaning
no_adapter_detectedNo CAN adapter fitted
adapter_is_read_onlyLV-CAN200 / ALL-CAN300 fitted
program_number_not_setAdapter not configured for its vehicle
vehicle_profile_unmatchedNo published capability profile for this model
requires_immo_adapter_variantEngine control needs the IMMO adapter
not_supported_by_vehicleThis model cannot do this action
confirmation_requiredDestructive action sent without confirmation
device_offlineTracker not connected
vehicle_moving / ignition_onSafety interlock
stale_positionVehicle state too old to act on
cooldownSame action sent moments ago

Authorised drivers

GET  /api/{account}/asset/{asset}/authorised-drivers
PUT  /api/{account}/asset/{asset}/authorised-drivers
GET  /api/{account}/asset/{asset}/authorised-drivers/sync-status
POST /api/{account}/asset/{asset}/authorised-drivers/immobiliser

PUT replaces the whole list and queues the difference to the device.

sync-status returns synced, syncing or out_of_sync. Surface out_of_sync to the user: until it clears, the vehicle is enforcing its previous list.

Was this page helpful?

On this page