def test_Xiaomi_LYWSD03MMC_encrypted(self): """Test Xiaomi parser for LYWSD03MMC with encryption.""" self.aeskeys = {} data_string = "043e2a02010000f4830238c1a41e0201061a1695fe58585b0550f4830238c1a495ef58763c26000097e2abb5e2" data = bytes(bytearray.fromhex(data_string)) aeskey = "e9ea895fac7cca6d30532432a516f3a8" 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_data(data) assert sensor_msg["firmware"] == "Xiaomi (MiBeacon V5 encrypted)" assert sensor_msg["type"] == "LYWSD03MMC" assert sensor_msg["mac"] == "A4C1380283F4" assert sensor_msg["packet"] == 80 assert sensor_msg["data"] assert sensor_msg["humidity"] == 46.7 assert sensor_msg["rssi"] == -30
def test_ha_ble_temperature_and_humidity_encrypted(self): """Test HA BLE parser for temperature and humidity (encrypted) measurement""" self.aeskeys = {} data_string = "043E2302010000A5808FE648541702010613161e18fba435e4d3c312fb0011223357d90a99CC" data = bytes(bytearray.fromhex(data_string)) aeskey = "231d39c1d7cc1ab1aee224cd096db932" p_mac = bytes.fromhex("5448E68F80A5") p_key = bytes.fromhex(aeskey.lower()) self.aeskeys[p_mac] = p_key allow_list = self.aeskeys.keys() # pylint: disable=unused-variable ble_parser = BleParser(aeskeys=self.aeskeys, discovery=False, sensor_whitelist=allow_list) sensor_msg, tracker_msg = ble_parser.parse_data(data) assert sensor_msg["firmware"] == "HA BLE (encrypted)" assert sensor_msg["type"] == "HA BLE DIY" assert sensor_msg["mac"] == "5448E68F80A5" assert sensor_msg["packet"] == 857870592 assert sensor_msg["data"] assert sensor_msg["temperature"] == 25.06 assert sensor_msg["humidity"] == 50.55 assert sensor_msg["rssi"] == -52
def test_Xiaomi_YLKG07YL_rotate(self): """Test Xiaomi parser for YLKG07YL, YLKG08YL while rotating dimmer.""" self.aeskeys = {} data_string = "043e25020103008b98c54124f819181695fe5830b603368b98c54124f88bb8f2661351000000d6ef" data = bytes(bytearray.fromhex(data_string)) aeskey = "b853075158487ca39a5b5ea9" 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_data(data) assert sensor_msg["firmware"] == "Xiaomi (MiBeacon V3 encrypted)" assert sensor_msg["type"] == "YLKG07YL/YLKG08YL" assert sensor_msg["mac"] == "F82441C5988B" assert sensor_msg["packet"] == 54 assert sensor_msg["data"] assert sensor_msg["dimmer"] == 1 assert sensor_msg["button"] == "rotate left" assert sensor_msg["rssi"] == -17
def test_Xiaomi_CGDK2(self): """Test Xiaomi parser for CGDK2.""" self.aeskeys = {} data_string = "043e2a02010000892012342d581e0201061a1695fe58586f0607892012342d585f176dd54f0200002fa453faaf" data = bytes(bytearray.fromhex(data_string)) aeskey = "a3bfe9853dd85a620debe3620caaa351" 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_data(data) assert sensor_msg["firmware"] == "Xiaomi (MiBeacon V5 encrypted)" assert sensor_msg["type"] == "CGDK2" assert sensor_msg["mac"] == "582D34122089" assert sensor_msg["packet"] == 7 assert sensor_msg["data"] assert sensor_msg["temperature"] == 22.6 assert sensor_msg["rssi"] == -81
def test_Xiaomi_RTCGQ02LM(self): """Test Xiaomi parser for RTCGQ02LM with wrong encryption key.""" self.aeskeys = {} data_string = "043e2b020103000fc4e044ef541f0201061b1695fe58598d0a170fc4e044ef547cc27a5c03a1000000790df258bb" data = bytes(bytearray.fromhex(data_string)) aeskey = "FFD8CE9C08AE7533A79BDAF0BB755E96" 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_data(data) assert sensor_msg["firmware"] == "Xiaomi (MiBeacon V5 encrypted)" assert sensor_msg["type"] == "RTCGQ02LM" assert sensor_msg["mac"] == "54EF44E0C40F" assert sensor_msg["packet"] == 23 assert sensor_msg["data"] is False assert sensor_msg["rssi"] == -69
def test_Xiaomi_YLKG07YL_press(self): """Test Xiaomi parser for YLKG07YL, YLKG08YL while pressing dimmer (no rotation).""" self.aeskeys = {} data_string = "043E25020103008B98C54124F819181695FE5830B603D28B98C54124F8C3491476757E00000099DE" data = bytes(bytearray.fromhex(data_string)) aeskey = "b853075158487ca39a5b5ea9" 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_data(data) assert sensor_msg["firmware"] == "Xiaomi (MiBeacon V3 encrypted)" assert sensor_msg["type"] == "YLKG07YL/YLKG08YL" assert sensor_msg["mac"] == "F82441C5988B" assert sensor_msg["packet"] == 210 assert sensor_msg["data"] assert sensor_msg["dimmer"] == 1 assert sensor_msg["button"] == "short press" assert sensor_msg["rssi"] == -34
def test_Xiaomi_JTYJGD03MI_press(self): """Test Xiaomi parser for JTYJGD03MI.""" self.aeskeys = {} data_string = "043e2b02010000bc9ce344ef541f0201061b1695fe5859970964bc9ce344ef5422206088fd000000003a148fb3cb" data = bytes(bytearray.fromhex(data_string)) aeskey = "5b51a7c91cde6707c9ef18dfda143a58" 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_data(data) assert sensor_msg["firmware"] == "Xiaomi (MiBeacon V5 encrypted)" assert sensor_msg["type"] == "JTYJGD03MI" assert sensor_msg["mac"] == "54EF44E39CBC" assert sensor_msg["packet"] == 100 assert sensor_msg["data"] assert sensor_msg["button"] == "single press" assert sensor_msg["rssi"] == -53
def test_Xiaomi_CGG1(self): """Test Xiaomi parser for CGG1.""" self.aeskeys = {} data_string = "043e2a020100005f12342d585a1e0201061a1695fe5858480b685f12342d585a0b1841e2aa000e00a4964fb5b6" data = bytes(bytearray.fromhex(data_string)) aeskey = "814aac74c4f17b6c1581e1ab87816b99" p_mac = bytes.fromhex("5A582D34125F") p_key = bytes.fromhex(aeskey.lower()) self.aeskeys[p_mac] = p_key allow_list = self.aeskeys.keys() # pylint: disable=unused-variable ble_parser = BleParser(aeskeys=self.aeskeys, discovery=False, sensor_whitelist=allow_list) sensor_msg, tracker_msg = ble_parser.parse_data(data) assert sensor_msg["firmware"] == "Xiaomi (MiBeacon V5 encrypted)" assert sensor_msg["type"] == "CGG1-ENCRYPTED" assert sensor_msg["mac"] == "5A582D34125F" assert sensor_msg["packet"] == 104 assert sensor_msg["data"] assert sensor_msg["humidity"] == 59.6 assert sensor_msg["rssi"] == -74
def test_Xiaomi_XMWSDJ04MMC(self): """Test Xiaomi parser for XMWSDJ04MMC with encryption.""" self.aeskeys = {} data_string = "043e260201000004702565112c1a020106161695fe48590312a41b776e7c96add7000000f2bf545bce" data = bytes(bytearray.fromhex(data_string)) aeskey = "b2cf9a553d53571b5657defd582d676e" 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_data(data) assert sensor_msg["firmware"] == "Xiaomi (MiBeacon V5 encrypted)" assert sensor_msg["type"] == "XMWSDJ04MMC" assert sensor_msg["mac"] == "2C1165257004" assert sensor_msg["packet"] == 164 assert sensor_msg["data"] assert sensor_msg["humidity"] == 45.0 assert sensor_msg["rssi"] == -50
def test_inode_energy_meter(self): """Test inode parser for iNode Energy Monitor.""" data_string = "043E2102010000473A6D6F1200150201060EFF90820400CFE40000DC05B0ED10020A08A5" data = bytes(bytearray.fromhex(data_string)) # pylint: disable=unused-variable ble_parser = BleParser() sensor_msg, tracker_msg = ble_parser.parse_data(data) assert sensor_msg["firmware"] == "iNode" assert sensor_msg["type"] == "iNode Energy Meter" assert sensor_msg["mac"] == "00126F6D3A47" assert sensor_msg["packet"] == "0400cfe40000dc05b0ed10" assert sensor_msg["data"] assert sensor_msg["energy"] == 39.05 assert sensor_msg["energy unit"] == "kWh" assert sensor_msg["power"] == 160.0 assert sensor_msg["power unit"] == "W" assert sensor_msg["constant"] == 1500 assert sensor_msg["battery"] == 100 assert sensor_msg["voltage"] == 2.88 assert sensor_msg["light level"] == 0.0 assert sensor_msg["week day"] == 0 assert sensor_msg["week day total"] == 4333 assert sensor_msg["rssi"] == -91
def test_ruuvitag_v5(self): """Test ruuvitag v5 parser.""" data_string = "043E2B02010301F27A52FAD4CD1F0201061BFF990405138A5F61C4F0FFE4FFDC0414C5B6EC29B3F27A52FAD4CDBC" data = bytes(bytearray.fromhex(data_string)) # pylint: disable=unused-variable ble_parser = BleParser() sensor_msg, tracker_msg = ble_parser.parse_data(data) assert sensor_msg["firmware"] == "Ruuvitag V5" assert sensor_msg["type"] == "Ruuvitag" assert sensor_msg["mac"] == "CDD4FA527AF2" assert sensor_msg["packet"] == 10675 assert sensor_msg["data"] assert sensor_msg["temperature"] == 25.01 assert sensor_msg["humidity"] == 61.04 assert sensor_msg["pressure"] == 1004.16 assert sensor_msg["acceleration"] == 1044.9956937710317 assert sensor_msg["acceleration x"] == -28 assert sensor_msg["acceleration y"] == -36 assert sensor_msg["acceleration z"] == 1044 assert sensor_msg["voltage"] == 3.181 assert sensor_msg["battery"] == 100 assert sensor_msg["tx power"] == 4 assert sensor_msg["motion"] == 0 assert sensor_msg["motion timer"] == 0 assert sensor_msg["rssi"] == -68
def test_altbeacon_tracker(self): '''Test AltBeacon parser only tracker ''' data_string = '043E280201020105988527406D1C1BFFFFFFBEACD3162F5AF3EE494799DB09756062D0FC005A0005C400D4' data = bytes(bytearray.fromhex(data_string)) # pylint: disable=unused-variable ble_parser = BleParser(tracker_whitelist=[ bytearray.fromhex('d3162f5af3ee494799db09756062d0fc') ]) sensor_msg, tracker_msg = ble_parser.parse_data(data) assert sensor_msg['type'] == 'AltBeacon' assert sensor_msg['packet'] == 'no packet id' assert sensor_msg['firmware'] == 'AltBeacon' assert sensor_msg['manufacturer'] == 'Other' assert sensor_msg['rssi'] == -44 assert sensor_msg['mac'] == '6D:40:27:85:98:05' assert str(UUID( sensor_msg['uuid'])) == 'd3162f5a-f3ee-4947-99db-09756062d0fc' assert sensor_msg['uuid'] == 'd3162f5af3ee494799db09756062d0fc' assert sensor_msg['major'] == 90 assert sensor_msg['minor'] == 5 assert sensor_msg['measured power'] == -60 assert tracker_msg[ 'tracker_id'] == b'\xd3\x16/Z\xf3\xeeIG\x99\xdb\tu`b\xd0\xfc' assert sensor_msg is not None
def test_atc_custom_encrypted(self): """Test ATC parser for ATC custom format (encrypted).""" self.aeskeys = {} data_string = "043e1b02010000b2188d38c1a40f0e161a1811d603fbfa7b6dfb1e26fde2" data = bytes(bytearray.fromhex(data_string)) aeskey = "b9ea895fac7eea6d30532432a516f3a3" 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_data(data) assert sensor_msg["firmware"] == "ATC (Custom encrypted)" assert sensor_msg["type"] == "ATC" assert sensor_msg["mac"] == "A4C1388D18B2" assert sensor_msg["packet"] == 17 assert sensor_msg["data"] assert sensor_msg["temperature"] == 23.45 assert sensor_msg["humidity"] == 41.73 assert sensor_msg["voltage"] == 2.749 assert sensor_msg["battery"] == 61 assert sensor_msg["rssi"] == -30
def test_qingping_no_data(self): """Test Qingping parser with message with no data.""" data_string = "043E1F020100000CA4288CCF04130201060B16CDFD080E0AA4288CCF048CCF0481CB" data = bytes(bytearray.fromhex(data_string)) # pylint: disable=unused-variable ble_parser = BleParser() sensor_msg, tracker_msg = ble_parser.parse_data(data) assert sensor_msg is None
def test_ibeacon_iphone_ble_packet_var_2(self): '''Test iBeacon parser incorrect iphone ble packet ''' data_string = '043E1D02010001433EA2C96B6A1102011A020A0C0AFF4C001005441CBD08C5BB' data = bytes(bytearray.fromhex(data_string)) # pylint: disable=unused-variable ble_parser = BleParser() sensor_msg, tracker_msg = ble_parser.parse_data(data) assert sensor_msg is None assert tracker_msg is None
def test_relsib_power_adapter_plugged(self): """Test Relsib parser for AA20 packet type while using power adapter instead of battery.""" data_string = "043e2b0201030130ddf27cb6fa1f040945436f191620aa24080000200a750943030080f08000c2eb0b010b0300b6" data = bytes(bytearray.fromhex(data_string)) # pylint: disable=unused-variable ble_parser = BleParser() sensor_msg, tracker_msg = ble_parser.parse_data(data) assert sensor_msg["firmware"] == "Relsib (EClerk Eco v9a)" assert sensor_msg["type"] == "EClerk Eco" assert sensor_msg["mac"] == "FAB67CF2DD30" assert sensor_msg["battery"] == 100
def test_blue_coin_T(self): """Test Teltonika parser for Blue Coin T.""" data_string = "043e210201000196826a022bf01502010605166e2ad0090b0943205420383031424239d1" data = bytes(bytearray.fromhex(data_string)) # pylint: disable=unused-variable ble_parser = BleParser() sensor_msg, tracker_msg = ble_parser.parse_data(data) assert sensor_msg["firmware"] == "Teltonika" assert sensor_msg["type"] == "Blue Coin T" assert sensor_msg["mac"] == "F02B026A8296" assert sensor_msg["packet"] == "no packet id" assert sensor_msg["data"] assert sensor_msg["temperature"] == 25.12 assert sensor_msg["rssi"] == -47
def test_blue_puck_T(self): """Test Teltonika parser for Blue Puck T.""" data_string = "043e1e02010001e7e193546ec61202010605166e2a860b08095055434b5f5431dd" data = bytes(bytearray.fromhex(data_string)) # pylint: disable=unused-variable ble_parser = BleParser() sensor_msg, tracker_msg = ble_parser.parse_data(data) assert sensor_msg["firmware"] == "Teltonika" assert sensor_msg["type"] == "Blue Puck T" assert sensor_msg["mac"] == "C66E5493E1E7" assert sensor_msg["packet"] == "no packet id" assert sensor_msg["data"] assert sensor_msg["temperature"] == 29.5 assert sensor_msg["rssi"] == -35
def test_qingping_CGPR1_3(self): """Test Qingping parser for CGPR1 (light).""" data_string = "043E2102010000005E60342D58150201061116CDFD4812005E60342D581101010F0130AF" data = bytes(bytearray.fromhex(data_string)) # pylint: disable=unused-variable ble_parser = BleParser() sensor_msg, tracker_msg = ble_parser.parse_data(data) assert sensor_msg["firmware"] == "Qingping" assert sensor_msg["type"] == "CGPR1" assert sensor_msg["mac"] == "582D34605E00" assert sensor_msg["packet"] == 48 assert sensor_msg["data"] assert sensor_msg["light"] == 1 assert sensor_msg["rssi"] == -81
def test_inkbird_iBBQ_1_probes(self): """Test Inkbird parser for Inkbird iBBQ with 1 probe.""" data_string = "043e2102010000d7652e9aec28150201060302f0ff0dff0000000028ec9a2e65d7f000b5" data = bytes(bytearray.fromhex(data_string)) # pylint: disable=unused-variable ble_parser = BleParser() sensor_msg, tracker_msg = ble_parser.parse_data(data) assert sensor_msg["firmware"] == "Inkbird" assert sensor_msg["type"] == "iBBQ-1" assert sensor_msg["mac"] == "28EC9A2E65D7" assert sensor_msg["packet"] == "no packet id" assert sensor_msg["data"] assert sensor_msg["temperature probe 1"] == 24.0 assert sensor_msg["rssi"] == -75
def test_ha_ble_illuminance(self): """Test HA BLE parser for illuminance measurement""" data_string = "043E1802010000A5808FE648540C02010608161C180405138A14DC" data = bytes(bytearray.fromhex(data_string)) # pylint: disable=unused-variable ble_parser = BleParser() sensor_msg, tracker_msg = ble_parser.parse_data(data) assert sensor_msg["firmware"] == "HA BLE" assert sensor_msg["type"] == "HA BLE DIY" assert sensor_msg["mac"] == "5448E68F80A5" assert sensor_msg["packet"] == "no packet id" assert sensor_msg["data"] assert sensor_msg["illuminance"] == 13460.67 assert sensor_msg["rssi"] == -36
def test_ha_ble_pressure(self): """Test HA BLE parser for pressure measurement""" data_string = "043E1B02010000A5808FE648540F0201060B161C1802000C0404138A01DC" data = bytes(bytearray.fromhex(data_string)) # pylint: disable=unused-variable ble_parser = BleParser() sensor_msg, tracker_msg = ble_parser.parse_data(data) assert sensor_msg["firmware"] == "HA BLE" assert sensor_msg["type"] == "HA BLE DIY" assert sensor_msg["mac"] == "5448E68F80A5" assert sensor_msg["packet"] == 12 assert sensor_msg["data"] assert sensor_msg["pressure"] == 1008.83 assert sensor_msg["rssi"] == -36
def test_ha_ble_packet_and_battery(self): """Test HA BLE parser for battery measurement and packet number""" data_string = "043E1902010000A5808FE648540D02010609161C18020009020161CC" data = bytes(bytearray.fromhex(data_string)) # pylint: disable=unused-variable ble_parser = BleParser() sensor_msg, tracker_msg = ble_parser.parse_data(data) assert sensor_msg["firmware"] == "HA BLE" assert sensor_msg["type"] == "HA BLE DIY" assert sensor_msg["mac"] == "5448E68F80A5" assert sensor_msg["packet"] == 9 assert sensor_msg["data"] assert sensor_msg["battery"] == 97 assert sensor_msg["rssi"] == -52
def test_qingping_CGPR1_1(self): """Test Qingping parser for CGPR1 (illuminance).""" data_string = "043E2702010000005E60342D581B0201061716CDFD0812005E60342D580201640F011C09048B090000AF" data = bytes(bytearray.fromhex(data_string)) # pylint: disable=unused-variable ble_parser = BleParser() sensor_msg, tracker_msg = ble_parser.parse_data(data) assert sensor_msg["firmware"] == "Qingping" assert sensor_msg["type"] == "CGPR1" assert sensor_msg["mac"] == "582D34605E00" assert sensor_msg["packet"] == 28 assert sensor_msg["data"] assert sensor_msg["illuminance"] == 2443 assert sensor_msg["battery"] == 100 assert sensor_msg["rssi"] == -81
def test_ha_ble_modified_mac(self): """Test HA BLE parser for binary sensor with modified MAC""" data_string = "043E1D02010000A5808FE64854110201060D161C18020F0186A6808FE64854CC" data = bytes(bytearray.fromhex(data_string)) # pylint: disable=unused-variable ble_parser = BleParser() sensor_msg, tracker_msg = ble_parser.parse_data(data) assert sensor_msg["firmware"] == "HA BLE" assert sensor_msg["type"] == "HA BLE DIY" assert sensor_msg["mac"] == "5448E68F80A6" assert sensor_msg["packet"] == "no packet id" assert sensor_msg["data"] assert sensor_msg["binary"] == 1 assert sensor_msg["rssi"] == -52
def test_ha_ble_opening(self): """Test HA BLE parser for dew point measurement""" data_string = "043E1602010000A5808FE648540A02010606161C18021100CC" data = bytes(bytearray.fromhex(data_string)) # pylint: disable=unused-variable ble_parser = BleParser() sensor_msg, tracker_msg = ble_parser.parse_data(data) assert sensor_msg["firmware"] == "HA BLE" assert sensor_msg["type"] == "HA BLE DIY" assert sensor_msg["mac"] == "5448E68F80A5" assert sensor_msg["packet"] == "no packet id" assert sensor_msg["data"] assert sensor_msg["opening"] == 0 assert sensor_msg["rssi"] == -52
def test_ha_ble_voltage(self): """Test HA BLE parser for voltage measurement""" data_string = "043E1702010000A5808FE648540B02010607161C18030C020CDC" data = bytes(bytearray.fromhex(data_string)) # pylint: disable=unused-variable ble_parser = BleParser() sensor_msg, tracker_msg = ble_parser.parse_data(data) assert sensor_msg["firmware"] == "HA BLE" assert sensor_msg["type"] == "HA BLE DIY" assert sensor_msg["mac"] == "5448E68F80A5" assert sensor_msg["packet"] == "no packet id" assert sensor_msg["data"] assert sensor_msg["voltage"] == 3.074 assert sensor_msg["rssi"] == -36
def test_qingping_CGPR1_2(self): """Test Qingping parser for CGPR1 (illuminance + motion).""" data_string = "043E2402010000005E60342D58180201061416CDFD4812005E60342D580804008B09000F0122AF" data = bytes(bytearray.fromhex(data_string)) # pylint: disable=unused-variable ble_parser = BleParser() sensor_msg, tracker_msg = ble_parser.parse_data(data) assert sensor_msg["firmware"] == "Qingping" assert sensor_msg["type"] == "CGPR1" assert sensor_msg["mac"] == "582D34605E00" assert sensor_msg["packet"] == 34 assert sensor_msg["data"] assert sensor_msg["illuminance"] == 2443 assert sensor_msg["motion"] == 0 assert sensor_msg["rssi"] == -81
def test_Govee_H5183(self): """Test Govee H5183 parser.""" data_string = "043e2b02010000edaeac38c1a41f0303518302010511ff5DA1B401000101E400800A2813240000000000000000a9" data = bytes(bytearray.fromhex(data_string)) # pylint: disable=unused-variable ble_parser = BleParser() sensor_msg, tracker_msg = ble_parser.parse_data(data) assert sensor_msg["firmware"] == "Govee" assert sensor_msg["type"] == "H5183" assert sensor_msg["mac"] == "A4C138ACAEED" assert sensor_msg["packet"] == "no packet id" assert sensor_msg["data"] assert sensor_msg["temperature probe 1"] == 26.0 assert sensor_msg["temperature alarm"] == 49.0 assert sensor_msg["rssi"] == -87
def test_blue_puck_RHT(self): """Test Teltonika parser for Blue Puck RHT.""" data_string = "043e230201000196826a022bf01702010605166e2aa30404166f2a2308095055434b5f5448bd" data = bytes(bytearray.fromhex(data_string)) # pylint: disable=unused-variable ble_parser = BleParser() sensor_msg, tracker_msg = ble_parser.parse_data(data) assert sensor_msg["firmware"] == "Teltonika" assert sensor_msg["type"] == "Blue Puck RHT" assert sensor_msg["mac"] == "F02B026A8296" assert sensor_msg["packet"] == "no packet id" assert sensor_msg["data"] assert sensor_msg["temperature"] == 11.87 assert sensor_msg["humidity"] == 35 assert sensor_msg["rssi"] == -67