From 9911cb3e1f52e8214839122331b2a644ec39c183 Mon Sep 17 00:00:00 2001 From: Patrick <14628713+patman15@users.noreply.github.com> Date: Mon, 23 Dec 2024 19:57:55 +0100 Subject: [PATCH] Filter AT commands at the end of JK messages (#125) * remove AT cmds from end of message * Update manifest.json --- custom_components/bms_ble/manifest.json | 2 +- custom_components/bms_ble/plugins/jikong_bms.py | 9 +++++++-- tests/test_jikong_bms.py | 12 +++++++----- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/custom_components/bms_ble/manifest.json b/custom_components/bms_ble/manifest.json index 66215a7..009371c 100644 --- a/custom_components/bms_ble/manifest.json +++ b/custom_components/bms_ble/manifest.json @@ -90,5 +90,5 @@ "issue_tracker": "https://github.com/patman15/BMS_BLE-HA/issues", "loggers": ["bleak_retry_connector"], "requirements": [], - "version": "1.11.0" + "version": "1.11.1" } diff --git a/custom_components/bms_ble/plugins/jikong_bms.py b/custom_components/bms_ble/plugins/jikong_bms.py index 187cc91..8e60cee 100644 --- a/custom_components/bms_ble/plugins/jikong_bms.py +++ b/custom_components/bms_ble/plugins/jikong_bms.py @@ -107,7 +107,7 @@ def _notification_handler(self, _sender, data: bytearray) -> None: if ( len(self._data) >= self.INFO_LEN - and (data.startswith((BMS.HEAD_RSP, self.HEAD_CMD))) + and (data.startswith((BMS.HEAD_RSP, BMS.HEAD_CMD))) ) or not self._data.startswith(BMS.HEAD_RSP): self._data = bytearray() @@ -133,12 +133,17 @@ def _notification_handler(self, _sender, data: bytearray) -> None: ) return + # trim AT\r\n message from the end + if self._data.endswith(BMS.BT_MODULE_MSG): + self._log.debug("trimming AT cmd") + self._data = self._data[: -len(BMS.BT_MODULE_MSG)] + # trim message in case oversized if len(self._data) > BMS.INFO_LEN: self._log.debug("wrong data length (%i): %s", len(self._data), self._data) self._data = self._data[: BMS.INFO_LEN] - crc = crc_sum(self._data[:-1]) + crc: int = crc_sum(self._data[:-1]) if self._data[-1] != crc: self._log.debug("invalid checksum 0x%X != 0x%X", self._data[-1], crc) return diff --git a/tests/test_jikong_bms.py b/tests/test_jikong_bms.py index 87240d5..c6aed78 100644 --- a/tests/test_jikong_bms.py +++ b/tests/test_jikong_bms.py @@ -39,8 +39,8 @@ b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x93" ), "ack": bytearray( - b"\xaa\x55\x90\xeb\xc8\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44" - ), + b"\xaa\x55\x90\xeb\xc8\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x41\x54\x0d\x0a" + ), # ACKnowledge message with attached AT\r\n message (needs to be filtered) "cell": bytearray( # JK02_24S (SW: 10.08) b"\x55\xaa\xeb\x90\x02\xc8\xee\x0c\xf2\x0c\xf1\x0c\xf0\x0c\xf0\x0c\xec\x0c\xf0\x0c\xed\x0c" b"\xed\x0c\xed\x0c\xed\x0c\xf0\x0c\xf1\x0c\xed\x0c\xee\x0c\xed\x0c\x00\x00\x00\x00\x00\x00" @@ -76,8 +76,8 @@ b"\x00\xfe\xbf\x21\x06\x00\x00\x00\x00\x00\x00\x00\x00\xd8" ), # Vendor_ID: JK_B2A8S20P, SN: 404092C2262, HW: V11.XA, SW: V11.48, power-on: 7, Version: 4.28.0 "ack": bytearray( - b"\xaa\x55\x90\xeb\xc8\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44" - ), + b"\xaa\x55\x90\xeb\xc8\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x41\x54\x0d\x0a" + ), # ACKnowledge message with attached AT\r\n message (needs to be filtered) "cell": bytearray( b"\x55\xaa\xeb\x90\x02\xc6\xc1\x0c\xc1\x0c\xc1\x0c\xc1\x0c\xc1\x0c\xc1\x0c\xc1\x0c\xc1\x0c" b"\xc1\x0c\xc1\x0c\xc1\x0c\xc1\x0c\xc1\x0c\xc1\x0c\xc1\x0c\xc1\x0c\x00\x00\x00\x00\x00\x00" @@ -523,7 +523,9 @@ async def test_stream_update(monkeypatch, protocol_type, reconnect_fixture) -> N async def test_invalid_response(monkeypatch) -> None: """Test data update with BMS returning invalid data.""" - monkeypatch.setattr("custom_components.bms_ble.plugins.jikong_bms.BMS.BAT_TIMEOUT", 0.1) + monkeypatch.setattr( + "custom_components.bms_ble.plugins.jikong_bms.BMS.BAT_TIMEOUT", 0.1 + ) # return type 0x03 (first requested message) with incorrect CRC monkeypatch.setattr(