From 60fbedef7d14e74289528b794af2c1225f22b6ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9gory=20M=C3=A9nadier?= Date: Mon, 26 Jan 2026 15:04:12 +0100 Subject: [PATCH 1/6] Add TMS Michelin support frame type 0x03 --- .../ble_monitor/ble_parser/__init__.py | 6 +++ .../ble_monitor/ble_parser/michelin_tms.py | 48 +++++++++++++++++++ custom_components/ble_monitor/const.py | 3 ++ 3 files changed, 57 insertions(+) create mode 100644 custom_components/ble_monitor/ble_parser/michelin_tms.py diff --git a/custom_components/ble_monitor/ble_parser/__init__.py b/custom_components/ble_monitor/ble_parser/__init__.py index 2f2fd31d..e6667f22 100644 --- a/custom_components/ble_monitor/ble_parser/__init__.py +++ b/custom_components/ble_monitor/ble_parser/__init__.py @@ -50,6 +50,7 @@ from .tilt import parse_tilt from .xiaogui import parse_xiaogui from .xiaomi import parse_xiaomi +from .michelin_tms import parse_michelin_tms _LOGGER = logging.getLogger(__name__) @@ -297,6 +298,11 @@ def parse_advertisement( comp_id = (man_spec_data[3] << 8) | man_spec_data[2] data_len = man_spec_data[0] # Filter on Company Identifier + if comp_id == 0x0828: + # Michelin TMS + _LOGGER.debug("TMS DATA") + sensor_data = parse_michelin_tms(self, man_spec_data, mac) + break if comp_id == 0x0001 and data_len in [0x09, 0x0C, 0x22, 0x25]: # Govee H5101/H5102/H5106/H5177 sensor_data = parse_govee(self, man_spec_data, service_class_uuid16, local_name, mac) diff --git a/custom_components/ble_monitor/ble_parser/michelin_tms.py b/custom_components/ble_monitor/ble_parser/michelin_tms.py new file mode 100644 index 00000000..7f256fde --- /dev/null +++ b/custom_components/ble_monitor/ble_parser/michelin_tms.py @@ -0,0 +1,48 @@ +"""Parser for Michelin TMS BLE advertisements.""" +import logging +from struct import unpack + +from .helpers import to_mac, to_unformatted_mac + +_LOGGER = logging.getLogger(__name__) + +def parse_michelin_tms(self, data: bytes, mac: bytes): + """Parser for Michelin TMS.""" + msg_length = len(data) + firmware = "TMS" + result = {"firmware": firmware} + frame_type = data[5] + device_type = "TMS AL" + if frame_type == 0x03: + if msg_length != 14: + _LOGGER.error("Found %s bytes from sensor: %s", msg_length, to_mac(mac)) + return + (raw_temp, raw_volt, absolute_pressure_bar, tyre_id, step, frame_counter) = unpack( + " Date: Tue, 27 Jan 2026 10:56:53 +0100 Subject: [PATCH 2/6] Add TMS Michelin support frame type 0x03 --- .../ble_monitor/ble_parser/__init__.py | 3 +-- .../{michelin_tms.py => michelin.py} | 13 +++++----- custom_components/ble_monitor/const.py | 6 ++--- .../ble_monitor/test/test_michelin.py | 26 +++++++++++++++++++ 4 files changed, 37 insertions(+), 11 deletions(-) rename custom_components/ble_monitor/ble_parser/{michelin_tms.py => michelin.py} (87%) create mode 100644 custom_components/ble_monitor/test/test_michelin.py diff --git a/custom_components/ble_monitor/ble_parser/__init__.py b/custom_components/ble_monitor/ble_parser/__init__.py index e6667f22..6753b11f 100644 --- a/custom_components/ble_monitor/ble_parser/__init__.py +++ b/custom_components/ble_monitor/ble_parser/__init__.py @@ -50,7 +50,7 @@ from .tilt import parse_tilt from .xiaogui import parse_xiaogui from .xiaomi import parse_xiaomi -from .michelin_tms import parse_michelin_tms +from .michelin import parse_michelin_tms _LOGGER = logging.getLogger(__name__) @@ -300,7 +300,6 @@ def parse_advertisement( # Filter on Company Identifier if comp_id == 0x0828: # Michelin TMS - _LOGGER.debug("TMS DATA") sensor_data = parse_michelin_tms(self, man_spec_data, mac) break if comp_id == 0x0001 and data_len in [0x09, 0x0C, 0x22, 0x25]: diff --git a/custom_components/ble_monitor/ble_parser/michelin_tms.py b/custom_components/ble_monitor/ble_parser/michelin.py similarity index 87% rename from custom_components/ble_monitor/ble_parser/michelin_tms.py rename to custom_components/ble_monitor/ble_parser/michelin.py index 7f256fde..9671035f 100644 --- a/custom_components/ble_monitor/ble_parser/michelin_tms.py +++ b/custom_components/ble_monitor/ble_parser/michelin.py @@ -9,15 +9,15 @@ def parse_michelin_tms(self, data: bytes, mac: bytes): """Parser for Michelin TMS.""" msg_length = len(data) - firmware = "TMS" - result = {"firmware": firmware} + device_type = "TMS" + result = {"type": device_type} frame_type = data[5] - device_type = "TMS AL" - if frame_type == 0x03: + + if frame_type in [0x03, 0x04]: if msg_length != 14: _LOGGER.error("Found %s bytes from sensor: %s", msg_length, to_mac(mac)) return - (raw_temp, raw_volt, absolute_pressure_bar, tyre_id, step, frame_counter) = unpack( + (raw_temp, raw_volt, absolute_pressure_bar, tyre_id, steps, frame_counter) = unpack( " Date: Tue, 27 Jan 2026 11:12:32 +0100 Subject: [PATCH 3/6] Add TMS Michelin Add docs --- docs/_devices/Michelin_TMS.md | 22 ++++++++++++++++++++++ docs/assets/images/Michelin_TMS_AL.jpg | Bin 0 -> 53511 bytes 2 files changed, 22 insertions(+) create mode 100644 docs/_devices/Michelin_TMS.md create mode 100644 docs/assets/images/Michelin_TMS_AL.jpg diff --git a/docs/_devices/Michelin_TMS.md b/docs/_devices/Michelin_TMS.md new file mode 100644 index 00000000..89846764 --- /dev/null +++ b/docs/_devices/Michelin_TMS.md @@ -0,0 +1,22 @@ +--- +manufacturer: MFP Michelin +name: "TMS" +model: TMS +image: "Michelin_TMS_AL.jpg" +physical_description: "Round body, no screen" +broadcasted_properties: + - temperature + - absolute pressure + - battery + - tire ID + - step (internal FSM) + - count (number of transmitted frames) + - rssi +broadcasted_property_notes: +broadcast_rate: +active_scan: +encryption_key: +custom_firmware: +notes: + - Sold under TMS AF, AL and AQ +--- diff --git a/docs/assets/images/Michelin_TMS_AL.jpg b/docs/assets/images/Michelin_TMS_AL.jpg new file mode 100644 index 0000000000000000000000000000000000000000..21bf36c8afa70412d15caf952ce25051a86e9308 GIT binary patch literal 53511 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 P;?#dagugPzetz>iU_3t7 literal 0 HcmV?d00001 From 23334d8f7ff73e2bf1b23484a749088c4178419c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9gory=20M=C3=A9nadier?= Date: Mon, 9 Mar 2026 11:42:23 +0100 Subject: [PATCH 4/6] Add TMS Michelin Fix test_michelin.py --- .../ble_monitor/ble_parser/michelin.py | 9 +++++---- custom_components/ble_monitor/const.py | 4 ++-- .../ble_monitor/test/test_michelin.py | 17 ++++++++--------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/custom_components/ble_monitor/ble_parser/michelin.py b/custom_components/ble_monitor/ble_parser/michelin.py index 9671035f..d8250613 100644 --- a/custom_components/ble_monitor/ble_parser/michelin.py +++ b/custom_components/ble_monitor/ble_parser/michelin.py @@ -10,11 +10,12 @@ def parse_michelin_tms(self, data: bytes, mac: bytes): """Parser for Michelin TMS.""" msg_length = len(data) device_type = "TMS" - result = {"type": device_type} + firmware = "TMS" + result = {"firmware": firmware} frame_type = data[5] if frame_type in [0x03, 0x04]: - if msg_length != 14: + if msg_length != 18: _LOGGER.error("Found %s bytes from sensor: %s", msg_length, to_mac(mac)) return (raw_temp, raw_volt, absolute_pressure_bar, tyre_id, steps, frame_counter) = unpack( @@ -41,9 +42,9 @@ def parse_michelin_tms(self, data: bytes, mac: bytes): result.update({ "mac": to_unformatted_mac(mac), - "firmware": "TMS", + "firmware": firmware, "type": device_type, "packet": "no packet id", "data": True }) - return result + return result \ No newline at end of file diff --git a/custom_components/ble_monitor/const.py b/custom_components/ble_monitor/const.py index 629c5d74..13f12e2d 100755 --- a/custom_components/ble_monitor/const.py +++ b/custom_components/ble_monitor/const.py @@ -2355,7 +2355,7 @@ class BLEMonitorBinarySensorEntityDescription( 'ST10' : 'MOCREO', 'MS1' : 'MOCREO', 'MS2' : 'MOCREO', - 'TMS' : 'MICHELIN', + 'TMS' : 'Michelin', 'S-MATE' : 'Sonoff', 'R5' : 'Sonoff', } @@ -2441,7 +2441,7 @@ class BLEMonitorBinarySensorEntityDescription( 'XMOSB01XS' : 'Xiaomi', 'RS1BB' : 'Linptech', 'ES3' : 'Linptech', - 'TMS' : 'MICHELIN', + 'TMS' : 'Michelin', } diff --git a/custom_components/ble_monitor/test/test_michelin.py b/custom_components/ble_monitor/test/test_michelin.py index 677d2e7b..8aded7c3 100644 --- a/custom_components/ble_monitor/test/test_michelin.py +++ b/custom_components/ble_monitor/test/test_michelin.py @@ -1,11 +1,10 @@ """The tests for the Michelin TMS ble_parser.""" from ble_monitor.ble_parser import BleParser - class TestMichelin: """Tests for the Michelin TMS parser""" def test_parse_michelin_tms(self): - data_string = "043E2002010000332211A703BC1B02010611FF2808010351C6C00350345301C6000000D1" + data_string = "043e2102010300e07c03a703bc1502010611ff280801034fc8d403505643017d511e00bc" data = bytes(bytearray.fromhex(data_string)) # pylint: disable=unused-variable @@ -14,13 +13,13 @@ def test_parse_michelin_tms(self): assert sensor_msg["firmware"] == "TMS" assert sensor_msg["type"] == "TMS" - assert sensor_msg["mac"] == "BC03A7112233" + assert sensor_msg["mac"] == "BC03A7037CE0" assert sensor_msg["packet"] == "no packet id" assert sensor_msg["data"] == True - assert sensor_msg["temperature"] == 22 - assert sensor_msg["voltage"] == 2.98 - assert sensor_msg["pressure"] == 960 - assert sensor_msg["count"] == 198 + assert sensor_msg["temperature"] == 19 + assert sensor_msg["voltage"] == 3.0 + assert sensor_msg["pressure"] == 980 + assert sensor_msg["count"] == 1986941 assert sensor_msg["steps"] == 1 - assert sensor_msg["text"] == "P4S" - assert sensor_msg["rssi"] == -47 \ No newline at end of file + assert sensor_msg["text"] == "PVC" + assert sensor_msg["rssi"] == -68 \ No newline at end of file From e8f2f8fa246cf65d2422c7085bffbbeb356ef94b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9gory=20M=C3=A9nadier?= Date: Mon, 9 Mar 2026 16:48:47 +0100 Subject: [PATCH 5/6] Add TMS Michelin Fix test_michelin.py --- custom_components/ble_monitor/ble_parser/michelin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/custom_components/ble_monitor/ble_parser/michelin.py b/custom_components/ble_monitor/ble_parser/michelin.py index d8250613..fcb49c2c 100644 --- a/custom_components/ble_monitor/ble_parser/michelin.py +++ b/custom_components/ble_monitor/ble_parser/michelin.py @@ -29,7 +29,7 @@ def parse_michelin_tms(self, data: bytes, mac: bytes): "pressure": absolute_pressure_bar, "count": frame_counter, "steps": steps, - "text": tyre_id, + "text": tyre_id.decode('utf-8', errors='replace'), }) else: From 03d78028e5238aa71ad38956f2872d415015b92b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9gory=20M=C3=A9nadier?= Date: Tue, 10 Mar 2026 11:18:51 +0100 Subject: [PATCH 6/6] Adding support of TMS Michelin Fix python linter --- custom_components/ble_monitor/ble_parser/__init__.py | 2 +- custom_components/ble_monitor/ble_parser/michelin.py | 4 ++-- custom_components/ble_monitor/test/test_michelin.py | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/custom_components/ble_monitor/ble_parser/__init__.py b/custom_components/ble_monitor/ble_parser/__init__.py index 37ace57d..1ceb0bf4 100644 --- a/custom_components/ble_monitor/ble_parser/__init__.py +++ b/custom_components/ble_monitor/ble_parser/__init__.py @@ -29,6 +29,7 @@ from .kegtron import parse_kegtron from .kkm import parse_kkm from .laica import parse_laica +from .michelin import parse_michelin_tms from .mikrotik import parse_mikrotik from .miscale import parse_miscale from .moat import parse_moat @@ -50,7 +51,6 @@ from .tilt import parse_tilt from .xiaogui import parse_xiaogui from .xiaomi import parse_xiaomi -from .michelin import parse_michelin_tms _LOGGER = logging.getLogger(__name__) diff --git a/custom_components/ble_monitor/ble_parser/michelin.py b/custom_components/ble_monitor/ble_parser/michelin.py index fcb49c2c..7d7c4986 100644 --- a/custom_components/ble_monitor/ble_parser/michelin.py +++ b/custom_components/ble_monitor/ble_parser/michelin.py @@ -6,6 +6,7 @@ _LOGGER = logging.getLogger(__name__) + def parse_michelin_tms(self, data: bytes, mac: bytes): """Parser for Michelin TMS.""" msg_length = len(data) @@ -13,7 +14,6 @@ def parse_michelin_tms(self, data: bytes, mac: bytes): firmware = "TMS" result = {"firmware": firmware} frame_type = data[5] - if frame_type in [0x03, 0x04]: if msg_length != 18: _LOGGER.error("Found %s bytes from sensor: %s", msg_length, to_mac(mac)) @@ -47,4 +47,4 @@ def parse_michelin_tms(self, data: bytes, mac: bytes): "packet": "no packet id", "data": True }) - return result \ No newline at end of file + return result diff --git a/custom_components/ble_monitor/test/test_michelin.py b/custom_components/ble_monitor/test/test_michelin.py index 8aded7c3..c42f6e2d 100644 --- a/custom_components/ble_monitor/test/test_michelin.py +++ b/custom_components/ble_monitor/test/test_michelin.py @@ -22,4 +22,5 @@ def test_parse_michelin_tms(self): assert sensor_msg["count"] == 1986941 assert sensor_msg["steps"] == 1 assert sensor_msg["text"] == "PVC" - assert sensor_msg["rssi"] == -68 \ No newline at end of file + assert sensor_msg["rssi"] == -68 + \ No newline at end of file