Skip to content

Commit df3795f

Browse files
authored
Merge pull request #1 from jbjornstedt/xm126_distance
Add support for Acconeer XM126 Distance
2 parents 9c6e9ba + 5ba6a99 commit df3795f

File tree

3 files changed

+51
-12
lines changed

3 files changed

+51
-12
lines changed

custom_components/ble_monitor/ble_parser/acconeer.py

+29-12
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

@@ -29,18 +31,33 @@ def parse_acconeer(self, data, source_mac, rssi):
2931
if msg_length == 19 and device_id in ACCONEER_SENSOR_IDS:
3032
# Acconeer Sensors
3133
device_type = ACCONEER_SENSOR_IDS[device_id]
32-
measurements = MEASUREMENTS[device_id]
33-
(
34-
battery_level,
35-
temperature,
36-
presence,
37-
reserved2
38-
) = unpack("<HhHQ", xvalue)
39-
40-
if "presence" in measurements:
41-
result.update({
42-
"motion": 0 if presence == 0 else 1,
43-
})
34+
35+
if "Distance" in device_type:
36+
measurements = MEASUREMENTS[device_id]
37+
(
38+
battery_level,
39+
temperature,
40+
distance_mm,
41+
reserved2
42+
) = unpack("<HhHQ", xvalue)
43+
44+
if "distance_mm" in measurements:
45+
result.update({
46+
"distance_mm": distance_mm,
47+
})
48+
else:
49+
measurements = MEASUREMENTS[device_id]
50+
(
51+
battery_level,
52+
temperature,
53+
presence,
54+
reserved2
55+
) = unpack("<HhHQ", xvalue)
56+
57+
if "presence" in measurements:
58+
result.update({
59+
"motion": 0 if presence == 0 else 1,
60+
})
4461

4562
if "temperature" in measurements:
4663
result.update({

custom_components/ble_monitor/const.py

+1
Original file line numberDiff line numberDiff line change
@@ -1717,6 +1717,7 @@ class BLEMonitorBinarySensorEntityDescription(
17171717
'Laica Smart Scale' : [["weight", "impedance", "rssi"], [], []],
17181718
"Acconeer XM122" : [["temperature", "battery", "rssi"], [], ["motion"]],
17191719
"Acconeer XM126" : [["temperature", "battery", "rssi"], [], ["motion"]],
1720+
"Acconeer XM126 Distance" : [["temperature", "battery", "rssi"], [], ["distance_mm"]],
17201721
'K6 Sensor Beacon' : [["temperature", "humidity", "acceleration", "voltage", "battery", "rssi"], [], []],
17211722
'DSL-C08' : [["battery", "rssi", "voltage"], [], ["lock", "childlock"]],
17221723
'SmartDry cloth dryer' : [["temperature", "humidity", "voltage", "battery", "shake", "rssi"], [], ["switch"]],

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)