Skip to content

Commit 8235d01

Browse files
authored
feat: add support for the t201/t301 (#5)
1 parent 5e00841 commit 8235d01

File tree

3 files changed

+195
-104
lines changed

3 files changed

+195
-104
lines changed

.flake8

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
[flake8]
22
exclude = docs
3-
max-line-length = 120
3+
max-line-length = 140

src/sensorpro_ble/parser.py

Lines changed: 20 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,100 +1,63 @@
11
"""Parser for SensorPro BLE advertisements.
22
33
This file is shamelessly copied from the following repository:
4-
https://github.com/Ernst79/bleparser/blob/c42ae922e1abed2720c7fac993777e1bd59c0c93/package/bleparser/thermoplus.py
4+
https://github.com/Ernst79/bleparser/blob/c42ae922e1abed2720c7fac993777e1bd59c0c93/package/bleparser/brifit.py
55
66
MIT License applies.
77
"""
88
from __future__ import annotations
99

1010
import logging
11-
from dataclasses import dataclass
1211
from struct import unpack
1312

1413
from bluetooth_data_tools import short_address
1514
from bluetooth_sensor_state_data import BluetoothData
1615
from home_assistant_bluetooth import BluetoothServiceInfo
17-
from sensor_state_data import BinarySensorDeviceClass, SensorLibrary
16+
from sensor_state_data import SensorLibrary
1817

1918
_LOGGER = logging.getLogger(__name__)
2019

2120

22-
@dataclass
23-
class SensorProDevice:
24-
25-
model: str
26-
name: str
27-
28-
2921
DEVICE_TYPES = {
30-
0x10: SensorProDevice("16", "Lanyard/mini hygrometer"),
31-
0x11: SensorProDevice("17", "Smart hygrometer"),
32-
0x15: SensorProDevice("21", "Smart hygrometer"),
22+
0x01: "T201",
23+
0x05: "T301",
3324
}
25+
DEFAULT_MODEL = "T201"
3426
MFR_IDS = set(DEVICE_TYPES)
3527

36-
SERVICE_UUID = "0000fff0-0000-1000-8000-00805f9b34fb"
37-
3828

3929
class SensorProBluetoothDeviceData(BluetoothData):
4030
"""Date update for SensorPro Bluetooth devices."""
4131

4232
def _start_update(self, service_info: BluetoothServiceInfo) -> None:
4333
"""Update from BLE advertisement data."""
4434
_LOGGER.debug("Parsing sensorpro BLE advertisement data: %s", service_info)
45-
if SERVICE_UUID not in service_info.service_uuids:
46-
return
47-
if not MFR_IDS.intersection(service_info.manufacturer_data):
35+
if 43605 not in service_info.manufacturer_data:
4836
return
4937
changed_manufacturer_data = self.changed_manufacturer_data(service_info)
5038
if not changed_manufacturer_data:
5139
return
5240
last_id = list(changed_manufacturer_data)[-1]
53-
data = (
54-
int(last_id).to_bytes(2, byteorder="little")
55-
+ changed_manufacturer_data[last_id]
56-
)
57-
msg_length = len(data)
58-
if msg_length not in (20, 22):
41+
42+
changed = changed_manufacturer_data[last_id]
43+
if not changed.startswith(b"\x01\x01\xa4\xc1") and not changed.startswith(
44+
b"\x01\x05\xa4\xc1"
45+
):
5946
return
60-
device_id = data[0]
61-
device_type = DEVICE_TYPES[device_id]
62-
name = device_type.name
47+
data = int(last_id).to_bytes(2, byteorder="little") + changed
48+
device_id = data[3]
49+
device_type = service_info.name or DEVICE_TYPES.get(device_id) or DEFAULT_MODEL
50+
name = device_type
6351
self.set_precision(2)
6452
self.set_device_type(device_id)
6553
self.set_title(f"{name} {short_address(service_info.address)}")
6654
self.set_device_name(f"{name} {short_address(service_info.address)}")
6755
self.set_device_manufacturer("SensorPro")
68-
self._process_update(data)
69-
70-
def _process_update(self, data: bytes) -> None:
71-
"""Update from BLE advertisement data."""
72-
_LOGGER.debug("Parsing SensorPro BLE advertisement data: %s", data)
73-
if len(data) != 20:
74-
return
75-
76-
button_pushed = data[3] & 0x80
77-
xvalue = data[10:16]
78-
79-
(volt, temp, humi) = unpack("<HhH", xvalue)
80-
81-
if volt >= 3000:
82-
batt = 100
83-
elif volt >= 2600:
84-
batt = 60 + (volt - 2600) * 0.1
85-
elif volt >= 2500:
86-
batt = 40 + (volt - 2500) * 0.2
87-
elif volt >= 2450:
88-
batt = 20 + (volt - 2450) * 0.4
89-
else:
90-
batt = 0
91-
56+
xvalue = data[10:17]
57+
(volt, temp, humi, batt) = unpack(">hHHB", xvalue)
9258
self.update_predefined_sensor(SensorLibrary.BATTERY__PERCENTAGE, batt)
93-
self.update_predefined_sensor(SensorLibrary.TEMPERATURE__CELSIUS, temp / 16)
94-
self.update_predefined_sensor(SensorLibrary.HUMIDITY__PERCENTAGE, humi / 16)
59+
self.update_predefined_sensor(SensorLibrary.TEMPERATURE__CELSIUS, temp / 100)
60+
self.update_predefined_sensor(SensorLibrary.HUMIDITY__PERCENTAGE, humi / 100)
9561
self.update_predefined_sensor(
96-
SensorLibrary.VOLTAGE__ELECTRIC_POTENTIAL_VOLT, volt / 1000
97-
)
98-
self.update_predefined_binary_sensor(
99-
BinarySensorDeviceClass.OCCUPANCY, bool(button_pushed)
62+
SensorLibrary.VOLTAGE__ELECTRIC_POTENTIAL_VOLT, volt / 100
10063
)

0 commit comments

Comments
 (0)