Teltonika FT platform: external voltage (AVL 800) is never decoded

Juan Sánchez 11 hours ago

Teltonika FT platform: external voltage (AVL 800) is never decoded

TeltonikaProtocolDecoder reads external voltage from AVL ID 66, registered for
every model:

register(66, any, (p, b) -> p.set(Position.KEY_POWER, b.readUnsignedShort() / 1000.0));

The newer FT platform (FTC880, TFT100…) does not use ID 66. Per Teltonika's
own documentation, FT and TFT100 devices accept 10–90 V, which does not fit
the two-byte range of ID 66, so external voltage was moved to ID 800, four
bytes, in millivolts
.

ID 800 is not registered anywhere in the decoder, so it lands as a generic
io800 attribute and Position.KEY_POWER is never set for these devices.

Frame from an FTC880 on 6.15.3, Codec 8E, single record. No GPS fix; network
identifiers and odometer zeroed and the CRC recomputed:

00000000000000968e010000019b76daa80000000000000000000000000000000000000000
1b000b00150500450000716400c80300ed0200ef0000f000012f00017f0333d20833d30a00
0a0011ffd30012ffe70013002300430fd400440000004600ee00b5000000b6000000ce0000
01820000000600100000000000c70000000000cd0000000000f10000000003200000324904
7c00000000000000000100003e0b

Decoded IO element:

  • 1-byte group: 239 = 0, 240 = 0
  • 2-byte group: 67 = 4052, 68 = 0
  • 4-byte group: 800 = 12873

Resulting attributes: {"io800":12873,"battery":4.052,…} — no power.

The consequence is that power is absent across the whole FT family, so
low-voltage alarms, power-cut logic, charging state and voltage reports are all
blind there.

ID 800 does not appear in the FMB parameter table, so registering it for all
models cannot collide:

register(800, any, (p, b) -> p.set(Position.KEY_POWER, b.readUnsignedInt() / 1000.0));

Related: AVL 68 (battery current) is registered for fmbXXX only, but it is a
permanent element on FT as well.

Thank you!!!

Anton Tananaev 11 hours ago

Documentation link?

Juan Sánchez 11 hours ago

Yes, both from Teltonika's own wiki:

The frame in the PR (Creating it now) is from an FTC880 and carries external voltage only on ID 800, so KEY_POWER is currently never set for these devices.

Juan Sánchez 11 hours ago

Documentation links are in the PR I just opened: https://github.com/traccar/traccar/pull/6016

Summary:

The PR registers ID 800 as KEY_POWER for all models (it does not exist on the FMB table, so no collision) and adds a real FTC880 test frame — network identifiers and odometer zeroed, CRC recomputed — asserting KEY_POWER == 12.873. Verified with ./gradlew checkstyle test --tests '*TeltonikaProtocolDecoderTest' on Temurin JDK 25.

Juan Sánchez 10 hours ago

I've expanded this PR to cover the FT platform more completely, since the same
gap affects more than just voltage. It now also decodes battery level, sleep
mode, battery current and the towing / jamming / idling / unplug / auto-geofence
alarms for FT devices — all IDs that the "AVL ID differences between FMB and FT
platforms" page confirms are unchanged between platforms. External voltage (800)
is included here too, so this supersedes the voltage-only version. Accident (247)
is intentionally left out, as it does not exist on FT.