Skip to content

Commit 23ac778

Browse files
authored
Merge pull request #1337 from jbjornstedt/xm126_merge_fix
Add support for Acconeer XM126 distance sensor
2 parents 1482f8d + 6e6bed8 commit 23ac778

File tree

3 files changed

+64
-10
lines changed

3 files changed

+64
-10
lines changed

custom_components/ble_monitor/ble_parser/acconeer.py

+41-10
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@
88

99
ACCONEER_SENSOR_IDS = {
1010
0x80: "Acconeer XM122",
11+
0x90: "Acconeer XM126 Distance",
1112
0x91: "Acconeer XM126",
1213
}
1314

1415
MEASUREMENTS = {
1516
0x80: ["presence", "temperature"],
17+
0x90: ["distance_mm", "temperature"],
1618
0x91: ["presence", "temperature"],
1719
}
1820

@@ -28,22 +30,51 @@ def parse_acconeer(self, data: bytes, mac: str):
2830
if msg_length == 19 and device_id in ACCONEER_SENSOR_IDS:
2931
# Acconeer Sensors
3032
device_type = ACCONEER_SENSOR_IDS[device_id]
31-
measurements = MEASUREMENTS[device_id]
32-
(battery_level, temperature, presence, _) = unpack("<HhHQ", xvalue)
3333

34-
if "presence" in measurements:
34+
if "Distance" in device_type:
35+
measurements = MEASUREMENTS[device_id]
36+
(
37+
battery_level,
38+
temperature,
39+
distance_mm,
40+
reserved2
41+
) = unpack("<HhHQ", xvalue)
42+
43+
if "distance_mm" in measurements:
44+
result.update({
45+
"distance mm": distance_mm,
46+
})
47+
48+
if "temperature" in measurements:
49+
result.update({
50+
"temperature": temperature,
51+
})
52+
3553
result.update({
36-
"motion": 0 if presence == 0 else 1,
54+
"battery": battery_level,
3755
})
56+
else:
57+
measurements = MEASUREMENTS[device_id]
58+
(
59+
battery_level,
60+
temperature,
61+
presence,
62+
reserved2
63+
) = unpack("<HhHQ", xvalue)
64+
65+
if "presence" in measurements:
66+
result.update({
67+
"motion": 0 if presence == 0 else 1,
68+
})
69+
70+
if "temperature" in measurements:
71+
result.update({
72+
"temperature": temperature,
73+
})
3874

39-
if "temperature" in measurements:
4075
result.update({
41-
"temperature": temperature,
76+
"battery": battery_level,
4277
})
43-
44-
result.update({
45-
"battery": battery_level,
46-
})
4778
else:
4879
device_type = None
4980

custom_components/ble_monitor/const.py

+2
Original file line numberDiff line numberDiff line change
@@ -1858,6 +1858,7 @@ class BLEMonitorBinarySensorEntityDescription(
18581858
'Laica Smart Scale' : [["weight", "impedance", "rssi"], [], []],
18591859
"Acconeer XM122" : [["temperature", "battery", "rssi"], [], ["motion"]],
18601860
"Acconeer XM126" : [["temperature", "battery", "rssi"], [], ["motion"]],
1861+
"Acconeer XM126 Distance" : [["temperature", "battery", "rssi"], ["distance mm"], []],
18611862
'K6 Sensor Beacon' : [["temperature", "humidity", "acceleration", "voltage", "battery", "rssi"], [], []],
18621863
'DSL-C08' : [["battery", "rssi", "voltage"], [], ["lock", "childlock"]],
18631864
'SmartDry cloth dryer' : [["temperature", "humidity", "voltage", "battery", "shake", "rssi"], [], ["switch"]],
@@ -1994,6 +1995,7 @@ class BLEMonitorBinarySensorEntityDescription(
19941995
'Laica Smart Scale' : 'Laica',
19951996
'Acconeer XM122' : 'Acconeer',
19961997
'Acconeer XM126' : 'Acconeer',
1998+
'Acconeer XM126 Distance' : 'Acconeer',
19971999
'K6 Sensor Beacon' : 'KKM',
19982000
'SmartDry cloth dryer' : 'SmartDry',
19992001
}

custom_components/ble_monitor/test/test_acconeer_parser.py

+21
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,24 @@ def test_acconeer_xm126(self):
4444
assert sensor_msg["temperature"] == 22
4545
assert sensor_msg["motion"] == 1
4646
assert sensor_msg["rssi"] == -62
47+
48+
49+
def test_acconeer_xm126_distance(self):
50+
"""Test acconeer parser for Acconeer XM126 Distance."""
51+
data_string = "043e22020103013412b69009e01602010612ffc0ac906400160058050000000000000000c2"
52+
53+
data = bytes(bytearray.fromhex(data_string))
54+
55+
# pylint: disable=unused-variable
56+
ble_parser = BleParser()
57+
sensor_msg, tracker_msg = ble_parser.parse_raw_data(data)
58+
59+
assert sensor_msg["firmware"] == "Acconeer"
60+
assert sensor_msg["type"] == "Acconeer XM126 Distance"
61+
assert sensor_msg["mac"] == "E00990B61234"
62+
assert sensor_msg["packet"] == "6400160058050000000000000000"
63+
assert sensor_msg["data"]
64+
assert sensor_msg["battery"] == 100
65+
assert sensor_msg["temperature"] == 22
66+
assert sensor_msg["distance mm"] == 1368
67+
assert sensor_msg["rssi"] == -62

0 commit comments

Comments
 (0)