Skip to content

Commit d4afc73

Browse files
author
Ernst
committed
add first test for reslib WH52
1 parent 04e4044 commit d4afc73

File tree

6 files changed

+34
-4
lines changed

6 files changed

+34
-4
lines changed

custom_components/ble_monitor/ble_parser/__init__.py

+4
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,10 @@ def parse_advertisement(
202202
uuid16 = (service_data[3] << 8) | service_data[2]
203203
if uuid16 == 0x1809:
204204
# UUID16 = Health Thermometer service (used by Relsib)
205+
if len(service_data_list) == 3:
206+
uuid16_2 = (service_data_list[1][3] << 8) | service_data_list[1][2]
207+
if uuid16_2 == 0x181A:
208+
service_data = b"".join(service_data_list)
205209
sensor_data = parse_relsib(self, service_data, mac)
206210
break
207211
if uuid16 == 0x181A:

custom_components/ble_monitor/ble_parser/helpers.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ def to_uuid(uuid: str) -> str:
77
return str(UUID(''.join(f'{i:02X}' for i in uuid)))
88

99

10-
def to_mac(addr: str) -> str:
10+
def to_mac(addr: bytes) -> str:
1111
"""Return formatted MAC address"""
1212
return ':'.join(f'{i:02X}' for i in addr)
1313

1414

15-
def to_unformatted_mac(addr: str) -> str:
15+
def to_unformatted_mac(addr: bytes) -> str:
1616
"""Return unformatted MAC address"""
1717
return ''.join(f'{i:02X}' for i in addr[:])

custom_components/ble_monitor/ble_parser/relsib.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
_LOGGER = logging.getLogger(__name__)
88

99

10-
def parse_relsib(self, data: bytes, mac: str):
10+
def parse_relsib(self, data: bytes, mac: bytes):
1111
"""Relsib parser"""
1212
msg_length = len(data)
1313
uuid16 = (data[3] << 8) | data[2]
@@ -43,6 +43,14 @@ def parse_relsib(self, data: bytes, mac: str):
4343
result.update({"battery": 100})
4444
else:
4545
result.update({"battery": battery & 0b01111111})
46+
elif uuid16 in [0x1809] and msg_length == 22:
47+
device_type = "WH52"
48+
try:
49+
temp = round((int.from_bytes(data[4:6], byteorder='big') / 65535) * 175 - 45, 2)
50+
humi = round((int.from_bytes(data[10:11], byteorder='big') / 65535) * 175 - 45, 2)
51+
result.update({"temperature": temp, "humidity": humi})
52+
except ValueError:
53+
device_type = None
4654
elif uuid16 in [0x1809] and msg_length == 10:
4755
device_type = "WT51"
4856
try:

custom_components/ble_monitor/const.py

+1
Original file line numberDiff line numberDiff line change
@@ -2165,6 +2165,7 @@ class BLEMonitorBinarySensorEntityDescription(
21652165
'CGP23W' : 'Qingping',
21662166
'EClerk Eco' : 'Relsib',
21672167
'WT51' : 'Relsib',
2168+
'WH52' : 'Relsib',
21682169
'Blue Puck T' : 'Teltonika',
21692170
'Blue Coin T' : 'Teltonika',
21702171
'Blue Puck RHT' : 'Teltonika',

custom_components/ble_monitor/manifest.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,5 @@
1414
"btsocket>=0.2.0",
1515
"pyric>=0.1.6.3"
1616
],
17-
"version": "12.17.0"
17+
"version": "12.18.0"
1818
}

custom_components/ble_monitor/test/test_relsib.py

+17
Original file line numberDiff line numberDiff line change
@@ -105,3 +105,20 @@ def test_relsib_WT51(self):
105105
assert sensor_msg["data"]
106106
assert sensor_msg["temperature"] == 23.5
107107
assert sensor_msg["rssi"] == -62
108+
109+
def test_relsib_WH52(self):
110+
"""Test Relsib parser for Relsib WH52."""
111+
data_string = "043b230201030130ddf27cb6fa14051609184dea05161a18b14c0716a2aa30333531c2"
112+
data = bytes(bytearray.fromhex(data_string))
113+
# pylint: disable=unused-variable
114+
ble_parser = BleParser()
115+
sensor_msg, tracker_msg = ble_parser.parse_raw_data(data)
116+
117+
assert sensor_msg["firmware"] == "Relsib"
118+
assert sensor_msg["type"] == "WH52"
119+
assert sensor_msg["mac"] == "FAB67CF2DD30"
120+
assert sensor_msg["packet"] == "no packet id"
121+
assert sensor_msg["data"]
122+
assert sensor_msg["temperature"] == 8.26
123+
assert sensor_msg["humidity"] == 76.2
124+
assert sensor_msg["rssi"] == -62

0 commit comments

Comments
 (0)