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:
-
"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.
-
"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.
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
B0GWH88YSV)com.zl.dev.tire.itpms)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:
"Woan" type (MACs
b0:e9:fe:xx:xx:xxandb0:a6:04:xx:xx:xx): Manufacturer Data company ID0x0969(Woan Technology, Shenzhen — the same manufacturer behind SwitchBot). Structure closely resembles SwitchBot's officially documented format (Flags + Manufacturer Data with embedded MAC + Service Data UUID0xFD3D). 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."305DBE" type (MAC
30:5d:be:11:11:11, i.e. a fixed11:11:11suffix — 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):
Breakdown into AD structures:
Temperature formula (confirmed twice)
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)
Calibration points:
U7 = 0x02(2) → 0.00 bar (tire was effectively deflated)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
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 ID0x00ACcombined with the payload structure described above (9 bytes + reversed MAC).Happy to provide additional raw data logs (including other pressure/temperature states) if useful.