rtl_433 icon indicating copy to clipboard operation
rtl_433 copied to clipboard

2021 Jeep Grand Cherokee (WK2) TPMS pressure is half

Open Tenesmusphyre opened this issue 3 months ago • 22 comments

rtl_433 version 25.02-44-ge37c0d78 branch master at 202508301514 inputs file rtl_tcp RTL-SDR

The WK2 Jeep reports protocol 82 as a Citroen TPMS, however the pressure reports 1/2 actual value. According to my OBD-II scanner, the TPMS sensors are reported as Continental. The sensor serial number also appears to be reporting correctly.

I added a test decoder for Jeep, just duplicating Citroen and multiplying the pressure by 2. This seems to be reporting accurately.

Is Citroen decoding correctly, or is this simply submitting a request to push the above change into live code? (my git skills are close to non-existent).

Tenesmusphyre avatar Sep 23 '25 00:09 Tenesmusphyre

It's a fair question if any existing code is correct. Another fair question is if there are one kind of sensor with one pressure encoding and another that is almost the same, but has a different encoding, with each specified for different cars.

It may be better to label the protocol as Continental, if that's the TPMS manufacturer, and it just happens to be found on Citroen.

I see it was added in 2017 by @zuckschwerdt who perhaps knows. (Around me I see one Citroen every 5 years.)

gdt avatar Sep 23 '25 00:09 gdt

My client code is for a specific vehicle, so I'm just multiplying by 2.

Tenesmusphyre avatar Sep 23 '25 00:09 Tenesmusphyre

Sure, but what you'd want to submit in a PR is just changing the multiplier, which would change other people's data. Which is only ok if their current data is wrong. Unless you have a way to recognize your TPMS vs their TPMS differently. I am saying that we really should try to figure out what's going on - which you are helping with by posting here.

gdt avatar Sep 23 '25 00:09 gdt

Oh, I agree. I'm really just highlighting my observation. Without knowing which is right/wrong, I'll just let my client deal with it. The other way to manage it would be to post a PR to duplicate 82, multiple by 2, and name it Jeep/Continental or some such.

Tenesmusphyre avatar Sep 23 '25 00:09 Tenesmusphyre

You are of course free to have a local fix. I often do that to make things be what I want, when I'm not sure enough to impose it on others.

gdt avatar Sep 23 '25 00:09 gdt

@gdt I think the pressure formula came from an analysis Josh McCormick and you did in Dec. 2018 on the list. We should add these findings at least as comment "Seen on 2021 Jeep Grand Cherokee (WK2), however pressure reports 1/2 actual value according to OBD, sensors are Continental."

@Tenesmusphyre is the value exact? And is it exact for lower and higher pressure too? The current calculation raw * 1.364, for you raw * 2.728, seems so random...

zuckschwerdt avatar Sep 23 '25 07:09 zuckschwerdt

@zuckschwerdt I didn't perform exhaustive testing; the sensors only transmit in motion.

I did, however, set pressures on each of the 4 tires to 33,34,35, and 36psi to identify tire location, and the results tracked. Temperature also appears reasonable. It's hard to tell exact with ambient vs actual temperature, but temperature did change slightly during a short drive and each sensor also tracked well with each other.

I can't find any pressure conversion that would include 1.364 (or 2.728), but the x2 could just be a bit shift/truncation.

Tenesmusphyre avatar Sep 23 '25 09:09 Tenesmusphyre

Additional updates. Using recorded data.

Picking a single sensor, the OBD scanner recognized it as id 705761CB. rtl_433 displayed it as 705761be. 16psi, 73F. Another (same?) packet received at the same timestamp, same rssi/snr/noise was decoded as protocol 201 with an id of c705761b. 191psi, 295F.

There's a lot of suggestive information there, but I don't know where to go next to dig deeper.

Tenesmusphyre avatar Sep 23 '25 10:09 Tenesmusphyre

If this helps, this is the packet of interest. https://triq.org/pdv/#AAB10600D000300068013C00400000849491919191919191919191919191A19192A191929191A1919291919191A2A2A19192A192919191A192A19191919291919191A2A192A2A291A291A291A291A291A291A291A19291A1929191B555

Decoded as:

Detected FSK package    @0.448152s
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
time      : @0.448152s   Protocol  : 82
model     : Citroen      type      : TPMS          id        : 705761be
state     : dc           flags     : 0             repeat    : 11            Pressure  : 16 PSI        Temperature: 73 F         maybe_battery: 36
Integrity : CHECKSUM
Modulation: FSK          Freq1     : 434.0 MHz     Freq2     : 433.9 MHz
RSSI      : 1.0 dB       SNR       : 31.7 dB       Noise     : -31.7 dB
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
time      : @0.448152s   Protocol  : 201
model     : Truck        type      : TPMS          id        : c705761b
wheel     : 224          Pressure  : 191 PSI       Temperature: 295 F        Battery Ok: 1             Flag?     : b             Integrity : CHECKSUM
Modulation: FSK          Freq1     : 434.0 MHz     Freq2     : 433.9 MHz
RSSI      : 1.0 dB       SNR       : 31.7 dB       Noise     : -31.7 dB
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

Tenesmusphyre avatar Sep 23 '25 10:09 Tenesmusphyre

Never noticed this before. Both Citroen and Truck TPMS have the same timings and XOR-checksum, slightly different data layout though.

zuckschwerdt avatar Sep 23 '25 10:09 zuckschwerdt

Note that Truck is showing up at 1/10th the rate of Citroen (13 vs 132). Just from a raw grep of the decoded original file. There are also 13 decodes with the same timestamp.

I didn't look at the individual decodes, just a brute force grep/awk/uniq of the decoded data. Odds are it's the same behavior seen above.

EDIT: I did look at the individual decodes (text). Every Truck decode has a predecessor Citroen decode with the same timestamp.

Tenesmusphyre avatar Sep 23 '25 10:09 Tenesmusphyre

Yes the Truck TPMS is offset by 4 bit to the Citroen, strange why it works at all. The Truck TPMS needs less bits, e.g. a truncated reception might trigger it.

Can you record a sample, and upload as zip here, where only Citroen is triggered and one where both are triggered? Then we can really compare Truck, Citroen, and yours in depth.

zuckschwerdt avatar Sep 23 '25 11:09 zuckschwerdt

Try this. I'm not sure if it's the same decode as above, but it's 2 stand-alone Citroen and a Citroen/Truck pair.

tpms.zip

Tenesmusphyre avatar Sep 23 '25 11:09 Tenesmusphyre

I don't reallly remember 2017 that well :-) It sounds like we are making progress in understanding what's going on. It would not shock me if there are mutiple on-air protocols that collide in decoders. I don't know anybody local with a Jeep, so for now I'll cheer you on quietly. If there is solid evidence for decoding behavior, i'm fine to discard my original 2017 thoughts as perhaps not correct.

gdt avatar Sep 23 '25 12:09 gdt

I asked on the list for Citroen users.

gdt avatar Sep 23 '25 12:09 gdt

Summary of raw data and MC decode:

  • Truck TPMS Raw PCM {401}55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 56 99 55 66 95 56 9A 59 95 56 55 59 5A 55 55 55 56 A9 96 9A AA FF 8(single last bit) 2 packets, 2.2 ms apart, lead-out of 9 bits. MC: 0 00 00 00 00 00 00 00 00 00 00 00 00 00 01 | a0 58 1b 28 10 23 00 01 e9 bf

  • Citroen TPMS Raw PCM {199} 55 55 55 56 A6 59 95 99 A6 A6 65 95 A6 65 55 56 A6 65 65 96 55 A9 66 96 7E (no last bit) 3 packets 108 ms apart, lead-out of 6 bits. MC: 00 01 | d2 8a dd 48 d4 01 d4 49 0e 59 (single 0 bit)

  • Jeep TPMS Raw PCM {203}F5 55 55 55 6A 6A 66 A5 56 66 A6 95 59 56 95 59 66 66 66 5A 65 A5 6A 95 67 E (no last bit) 3 packets, 105 ms apart, lead-out of 6 bits, lead-in of 4 bits. MC: 00 01 | dd 70 57 60 86 09 55 4d 31 e1 (single 0 bit) 00 01 | dd 70 57 60 86 0a 55 4d 31 e2 (single 0 bit) 00 01 | dd 70 57 60 86 0b 55 4d 31 e3 (single 0 bit)

So the Jeep TPMS looks very much like the Citroen TPMS but with a short lead-in (4 bit). We are not likely to always capture that lead-in before the preamble.

The Truck TPMS has much longer preamble and a longer lead-out (9 bits). We could maybe detect that. Also the Truck will have 2 identical packets, the others have repeats with the counter going up.

zuckschwerdt avatar Sep 23 '25 12:09 zuckschwerdt

It seems like we are heading for a doctrine change of treating multiple packets of a single logical transmission as a first-class entity. I think that's good but we should probably step back and think about the larger issues.

It seems that Truck can also be distinguished by the shorter 2.2 ms inter-packet interval.

It is seeming like Citroen and Jeep have hard-to-distinguish wire formats and different encodings. I guess maybe let them both decode and the user can select the protocol/id they care about, if they don't want to disable the other etc.

gdt avatar Sep 23 '25 13:09 gdt

For my own knowledge, how did you get from the capture file to Manchester, and then how does that relate to pulling in the payload? There is nothing recognizable as far as mapping it to the decode section of the device source file.

Is there a reference page I haven't found?

Tenesmusphyre avatar Sep 23 '25 18:09 Tenesmusphyre

Use our https://triq.org/pdv3/ to go from sample file to bits and then https://triq.org/bitbench/ to analyse and decode the bits. Organize sample files with https://github.com/triq-org/iqviewer and if you are on Mac get a preview with https://github.com/triq-org/iqspectrogram-quicklook

zuckschwerdt avatar Sep 23 '25 19:09 zuckschwerdt

I guess maybe let them both decode and the user can select the protocol/id they care about, if they don't want to disable the other etc.

My local copy does that. It populated as protocol 282 vs Citroen's 82. I used -R -82 (or -R 0) to filter it out and just -R 282 for the Jeep. I don't want to rebuild rtl_433 on the Pi, though, so I just have the client do the multiplication. Client is an ESP32 CYD that reads MQTT published decodes from RTL_433 to display tire pressure of the Jeep towed behind RV.

Tenesmusphyre avatar Sep 24 '25 14:09 Tenesmusphyre

@zuckschwerdt FWIW, I found Universal Radio Hacker (URH) https://github.com/jopohl/urh

"For my purposes" it worked great. Start with a .cu8, get it to FSK. Find the bit width. Decode. Filter. I don't know how it would work on more complex signals, but I was able to tear apart the Jeep and Ford TPMS signals and see where some noise was coming from on the Ford (I used the Jeep as known good sample).

As far as I can tell, other than the 1/2-pressure reported, the Jeep decode (#82) has been fine. I don't know if it's a Jeep difference or Citroen with an original oops.

Tenesmusphyre avatar Sep 28 '25 01:09 Tenesmusphyre

What's the path to closing this issue?

gdt avatar Oct 20 '25 14:10 gdt