Skip to content

Reverse-engineered another TPMS sensor type ("WODHMIEY", APP: "ITPMS (K)") #27

Description

@mf76130

I got new sensor, did add them to HA using my Shelly BT and a script on it, maybe you want to add them for others into your system.
AI did make a summary of what we did and what might be helpful for you:

Reverse-engineered another TPMS sensor type ("WODHMIEY", app "ITPMS (K)")

Product

  • Seller/Brand: WODHMIEY
  • Product: "TPMS Tire Pressure Monitoring System Motorcycle/Car" (Amazon.de, ASIN B0GWH88YSV)
  • Companion app: ITPMS (K) (Android package name starts with com.zl.dev.tire.itpms)
  • Sensor marking: Each sensor has a QR code sticker printed with a plain-text ID (e.g. 305DBE), which is scanned for pairing. This ID shows up identically as the device name in the app ("Front wheel-305DBE") and matches the first 3 bytes of the BLE MAC address.

Important: the kit contains two different chip types!

The kit ships with at least two different BLE implementations that look identical but speak completely different protocols:

  1. "Woan" type (MACs b0:e9:fe:xx:xx:xx and b0:a6:04:xx:xx:xx): Manufacturer Data company ID 0x0969 (Woan Technology, Shenzhen — the same manufacturer behind SwitchBot). Structure closely resembles SwitchBot's officially documented format (Flags + Manufacturer Data with embedded MAC + Service Data UUID 0xFD3D). Key finding: over several hours and multiple full pressure cycles (0 → 2.4 bar), not a single byte changes except a rolling counter. Live readings clearly are not present in the advertisement for this type — likely only retrievable via a (possibly encrypted) GATT connection. Not analyzed further.

  2. "305DBE" type (MAC 30:5d:be:11:11:11, i.e. a fixed 11:11:11 suffix — looks like an OEM default address rather than a randomized one): this is the type that actually carries live readings in the advertisement! Described in detail below.

This issue covers only type 2 ("305DBE").

Advertisement structure (type "305DBE")

Example raw packet (full hex string, as output by a Bluetooth scanner):

0201060303b0fb12ffac00c03e54000a17008d28111111be5d30

Breakdown into AD structures:

Bytes Meaning
02 01 06 Flags: LE General Discoverable, BR/EDR Not Supported
03 03 b0fb Complete List of 16-bit Service UUIDs: 0xFBB0
12 ff ac00 [...] 11 11 11 be 5d 30 Manufacturer Specific Data (Length 0x12, Type 0xFF)

Temperature formula (confirmed twice)

Temperature(°C) = U2(decimal) − 55

Confirmed data points:

  • U2 = 0x54 (84) → 84−55 = 29 °C ✓ (app showed 29 °C)
  • U2 = 0x56 (86) → 86−55 = 31 °C ✓ (app showed 31 °C)

Pressure formula (preliminary, only 2 calibration points)

Pressure(bar) ≈ (U7(decimal) − 2) / 103

Calibration points:

  • Stable "near-0-bar" state (repeated identically 3×) → U7 = 0x02 (2) → 0.00 bar (tire was effectively deflated)
  • Stable state after refilling → formula yielded 2.41 bar, app showed 2.4 bar at the same time (0.01 bar off)

This formula is only roughly calibrated (linear, 2 points, no guarantee for higher pressures or edge cases). Additional calibration points over time would help refine it or reveal a non-linear relationship.

Behavioral note: caching while stationary

While the vehicle is stationary, the sensor keeps re-sending the same (stale) reading for extended periods (observed: up to ~1 hour), even if the actual pressure changed in the meantime. It only takes a fresh measurement after (presumed) vibration/movement or some internal wake-up interval. While actively working on the tire (deflating/inflating), updates were noticeably more frequent (seconds to a few minutes). This is harmless for home automation purposes (pressure barely changes while parked), but important to know when calibrating.

Open questions

  • Meaning of U0, U1, U3, U5 not determined (likely status/alarm/battery flags)
  • Battery level not decoded
  • Pressure formula calibrated with only 2 points — additional reference measurements at other pressures would be valuable
  • The pairing QR code printed on each sensor was not analyzed further — might be relevant for a GATT connection/encryption, but wasn't needed for plain advertisement decoding

Suggestion

This format could be added as a new "Type D" (or similar) in tpms_ble, alongside the existing types A (TPMSII app), B (SYTPMS app), and C (Michelin). Detection signature: Manufacturer Data company ID 0x00AC combined with the payload structure described above (9 bytes + reversed MAC).

Happy to provide additional raw data logs (including other pressure/temperature states) if useful.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions