From 8b93e9512a369c316353ddcd87372283bf893f1c Mon Sep 17 00:00:00 2001 From: Ernst Klamer Date: Mon, 4 Mar 2024 14:48:01 +0100 Subject: [PATCH] Add XMPIRO2SXS --- .../ble_monitor/ble_parser/xiaomi.py | 1 + custom_components/ble_monitor/const.py | 2 ++ custom_components/ble_monitor/manifest.json | 2 +- .../ble_monitor/test/test_xiaomi_parser.py | 28 ++++++++++++++++++ docs/_devices/Xiaomi_XMPIRO2SXS.md | 23 ++++++++++++++ docs/assets/images/XMPIRO2SXS.png | Bin 0 -> 10049 bytes 6 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 docs/_devices/Xiaomi_XMPIRO2SXS.md create mode 100644 docs/assets/images/XMPIRO2SXS.png diff --git a/custom_components/ble_monitor/ble_parser/xiaomi.py b/custom_components/ble_monitor/ble_parser/xiaomi.py index a8f3284a..c647cbda 100755 --- a/custom_components/ble_monitor/ble_parser/xiaomi.py +++ b/custom_components/ble_monitor/ble_parser/xiaomi.py @@ -76,6 +76,7 @@ 0x11C2: "SV40", 0x3F0F: "RS1BB", 0x38BB: "PTX", + 0x3531: "XMPIRO2SXS", } # Structured objects for data conversions diff --git a/custom_components/ble_monitor/const.py b/custom_components/ble_monitor/const.py index 30e8b801..a2f9bd04 100755 --- a/custom_components/ble_monitor/const.py +++ b/custom_components/ble_monitor/const.py @@ -1780,6 +1780,7 @@ class BLEMonitorBinarySensorEntityDescription( 'K9BB-1BTN' : [["battery", "rssi"], ["one btn switch"], []], 'MS1BB(MI)' : [["battery", "rssi"], ["button"], ["opening"]], 'HS1BB(MI)' : [["illuminance", "battery", "rssi"], [], ["motion"]], + 'XMPIRO2SXS' : [["illuminance", "battery", "rssi"], [], ["motion"]], 'XMWXKG01YL' : [["rssi"], ["two btn switch left", "two btn switch right"], []], 'XMWXKG01LM' : [["battery", "rssi"], ["one btn switch"], []], 'PTX' : [["battery", "rssi"], ["one btn switch"], []], @@ -1894,6 +1895,7 @@ class BLEMonitorBinarySensorEntityDescription( 'XMZNMS04LM' : 'Xiaomi', 'XMZNMS08LM' : 'Xiaomi', 'MJZNZ018H' : 'Xiaomi', + 'XMPIRO2SXS' : 'Xiaomi', 'ZX1' : '8H Sleep', 'CGC1' : 'Qingping', 'CGD1' : 'Qingping', diff --git a/custom_components/ble_monitor/manifest.json b/custom_components/ble_monitor/manifest.json index f3c70c40..84aa1039 100644 --- a/custom_components/ble_monitor/manifest.json +++ b/custom_components/ble_monitor/manifest.json @@ -14,5 +14,5 @@ "btsocket>=0.2.0", "pyric>=0.1.6.3" ], - "version": "12.10.0" + "version": "12.10.1" } diff --git a/custom_components/ble_monitor/test/test_xiaomi_parser.py b/custom_components/ble_monitor/test/test_xiaomi_parser.py index 622478dd..2a92de0e 100644 --- a/custom_components/ble_monitor/test/test_xiaomi_parser.py +++ b/custom_components/ble_monitor/test/test_xiaomi_parser.py @@ -1064,3 +1064,31 @@ def test_Xiaomi_PTX(self): assert sensor_msg["one btn switch"] == "toggle" assert sensor_msg["button switch"] == "single press" assert sensor_msg["rssi"] == -52 + + def test_Xiaomi_XMPIRO2SXS(self): + """Test Xiaomi parser for XMPIRO2SXS.""" + self.aeskeys = {} + data_string = "043E260201000043ea2d958edc1a020106161695fe485931350b64799117331ef4020000c5d2f6acCC" + data = bytes(bytearray.fromhex(data_string)) + + aeskey = "685d647dc5e7bc9bcfcf5a1357bd2114" + + is_ext_packet = True if data[3] == 0x0D else False + mac = (data[8 if is_ext_packet else 7:14 if is_ext_packet else 13])[::-1] + mac_address = mac.hex() + p_mac = bytes.fromhex(mac_address.replace(":", "").lower()) + p_key = bytes.fromhex(aeskey.lower()) + self.aeskeys[p_mac] = p_key + # pylint: disable=unused-variable + ble_parser = BleParser(aeskeys=self.aeskeys) + sensor_msg, tracker_msg = ble_parser.parse_raw_data(data) + + assert sensor_msg["firmware"] == "Xiaomi (MiBeacon V5 encrypted)" + assert sensor_msg["type"] == "XMPIRO2SXS" + assert sensor_msg["mac"] == "DC8E952DEA43" + assert sensor_msg["packet"] == 11 + assert sensor_msg["data"] + assert sensor_msg["motion"] == 1 + assert sensor_msg["motion timer"] == 1 + assert sensor_msg["illuminance"] == 51.0 + assert sensor_msg["rssi"] == -52 diff --git a/docs/_devices/Xiaomi_XMPIRO2SXS.md b/docs/_devices/Xiaomi_XMPIRO2SXS.md new file mode 100644 index 00000000..a3da2cf6 --- /dev/null +++ b/docs/_devices/Xiaomi_XMPIRO2SXS.md @@ -0,0 +1,23 @@ +--- +manufacturer: Xiaomi +name: Xiaomi Human Body Sensor 2S +model: XMPIRO2SXS +image: XMPIRO2SXS.png +physical_description: +broadcasted_properties: + - illuminance + - motion + - battery + - rssi +broadcasted_property_notes: + - property: illuminance + note: is measured in lux. + - property: motion + note: Motion state is ‘motion detected’ or ‘clear’. +broadcast_rate: +active_scan: +encryption_key: True +custom_firmware: +notes: > + - You can use the [reset_timer](configuration_params#reset_timer) option if you want to use a different time to set the sensor to `motion clear`. +--- diff --git a/docs/assets/images/XMPIRO2SXS.png b/docs/assets/images/XMPIRO2SXS.png new file mode 100644 index 0000000000000000000000000000000000000000..25a8dc23e30a21593da31dc10972e4da1d767d0f GIT binary patch literal 10049 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