Skip to content

Commit e511458

Browse files
authored
Fix compat with bleak 0.20 and later (#199)
* Fix compat with bleak 0.20 and later * Fix compat with bleak 0.20 and later
1 parent d835cfa commit e511458

File tree

2 files changed

+64
-34
lines changed

2 files changed

+64
-34
lines changed

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
packages=["switchbot", "switchbot.devices", "switchbot.adv_parsers"],
66
install_requires=[
77
"async_timeout>=4.0.1",
8-
"bleak>=0.17.0",
8+
"bleak>=0.20.0",
99
"bleak-retry-connector>=2.9.0",
1010
"cryptography>=38.0.3",
1111
"boto3>=1.20.24",

tests/test_adv_parser.py

Lines changed: 63 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from __future__ import annotations
2+
13
from typing import Any
24

35
from bleak.backends.device import BLEDevice
@@ -17,6 +19,34 @@
1719
"tx_power": -127,
1820
}
1921

22+
BLE_DEVICE_DEFAULTS = {
23+
"name": None,
24+
"rssi": -127,
25+
"details": None,
26+
}
27+
28+
29+
def generate_ble_device(
30+
address: str | None = None,
31+
name: str | None = None,
32+
details: Any | None = None,
33+
rssi: int | None = None,
34+
**kwargs: Any,
35+
) -> BLEDevice:
36+
"""Generate a BLEDevice with defaults."""
37+
new = kwargs.copy()
38+
if address is not None:
39+
new["address"] = address
40+
if name is not None:
41+
new["name"] = name
42+
if details is not None:
43+
new["details"] = details
44+
if rssi is not None:
45+
new["rssi"] = rssi
46+
for key, value in BLE_DEVICE_DEFAULTS.items():
47+
new.setdefault(key, value)
48+
return BLEDevice(**new)
49+
2050

2151
def generate_advertisement_data(**kwargs: Any) -> AdvertisementData:
2252
"""Generate advertisement data with defaults."""
@@ -28,7 +58,7 @@ def generate_advertisement_data(**kwargs: Any) -> AdvertisementData:
2858

2959
def test_parse_advertisement_data_curtain():
3060
"""Test parse_advertisement_data for curtain."""
31-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
61+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
3262
adv_data = generate_advertisement_data(
3363
manufacturer_data={2409: b"\xe7\xabF\xac\x8f\x92|\x0f\x00\x11\x04"},
3464
service_data={"0000fd3d-0000-1000-8000-00805f9b34fb": b"c\xc0X\x00\x11\x04"},
@@ -60,7 +90,7 @@ def test_parse_advertisement_data_curtain():
6090

6191
def test_parse_advertisement_data_curtain_passive():
6292
"""Test parse_advertisement_data for curtain passive."""
63-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
93+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
6494
adv_data = generate_advertisement_data(
6595
manufacturer_data={2409: b"\xe7\xabF\xac\x8f\x92|\x0f\x00\x11\x04"},
6696
service_data={},
@@ -92,7 +122,7 @@ def test_parse_advertisement_data_curtain_passive():
92122

93123
def test_parse_advertisement_data_curtain_position_zero():
94124
"""Test parse_advertisement_data for curtain position zero."""
95-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
125+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
96126
adv_data = generate_advertisement_data(
97127
local_name="WoCurtain",
98128
manufacturer_data={89: b"\xc1\xc7'}U\xab"},
@@ -130,7 +160,7 @@ def test_parse_advertisement_data_curtain_position_zero():
130160

131161
def test_parse_advertisement_data_curtain_firmware_six_position_100():
132162
"""Test parse_advertisement_data with firmware six for curtain position 100."""
133-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
163+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
134164
adv_data = generate_advertisement_data(
135165
local_name="WoCurtain",
136166
manufacturer_data={
@@ -174,7 +204,7 @@ def test_parse_advertisement_data_curtain_firmware_six_position_100():
174204

175205
def test_parse_advertisement_data_curtain_firmware_six_position_100_other_rssi():
176206
"""Test parse_advertisement_data with firmware six for curtain position 100 other rssi."""
177-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
207+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
178208
adv_data = generate_advertisement_data(
179209
local_name="WoCurtain",
180210
manufacturer_data={
@@ -218,7 +248,7 @@ def test_parse_advertisement_data_curtain_firmware_six_position_100_other_rssi()
218248

219249
def test_parse_advertisement_data_curtain_fully_closed():
220250
"""Test parse_advertisement_data with firmware six fully closed."""
221-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
251+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
222252
adv_data = generate_advertisement_data(
223253
local_name="WoCurtain",
224254
manufacturer_data={2409: b"\xc1\xc7'}U\xab\"\x0fd\x11\x04"},
@@ -256,7 +286,7 @@ def test_parse_advertisement_data_curtain_fully_closed():
256286

257287
def test_parse_advertisement_data_curtain_fully_open():
258288
"""Test parse_advertisement_data with firmware six fully open."""
259-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
289+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
260290
adv_data = generate_advertisement_data(
261291
local_name="WoCurtain",
262292
manufacturer_data={2409: b"\xc1\xc7'}U\xab%\x0f\x00\x11\x04"},
@@ -294,7 +324,7 @@ def test_parse_advertisement_data_curtain_fully_open():
294324

295325
def test_parse_advertisement_data_contact():
296326
"""Test parse_advertisement_data for the contact sensor."""
297-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
327+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
298328
adv_data = generate_advertisement_data(
299329
manufacturer_data={2409: b"\xe7\xabF\xac\x8f\x92|\x0f\x00\x11\x04"},
300330
service_data={
@@ -329,7 +359,7 @@ def test_parse_advertisement_data_contact():
329359

330360
def test_parse_advertisement_data_empty():
331361
"""Test parse_advertisement_data with empty data does not blow up."""
332-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
362+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
333363
adv_data = generate_advertisement_data(
334364
manufacturer_data={2403: b"\xe7\xabF\xac\x8f\x92|\x0f\x00\x11\x04"},
335365
service_data={"0000fd3d-0000-1000-8000-00805f9b34fb": b""},
@@ -340,7 +370,7 @@ def test_parse_advertisement_data_empty():
340370

341371
def test_new_bot_firmware():
342372
"""Test parsing adv data from new bot firmware."""
343-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
373+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
344374
adv_data = generate_advertisement_data(
345375
manufacturer_data={89: b"\xd8.\xad\xcd\r\x85"},
346376
service_data={"00000d00-0000-1000-8000-00805f9b34fb": b"H\x10\xe1"},
@@ -366,7 +396,7 @@ def test_new_bot_firmware():
366396

367397
def test_parse_advertisement_data_curtain_firmware_six_fully_closed():
368398
"""Test parse_advertisement_data with firmware six fully closed."""
369-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
399+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
370400
adv_data = generate_advertisement_data(
371401
local_name="WoCurtain",
372402
manufacturer_data={
@@ -410,7 +440,7 @@ def test_parse_advertisement_data_curtain_firmware_six_fully_closed():
410440

411441
def test_parse_advertisement_data_curtain_firmware_six_fully_open():
412442
"""Test parse_advertisement_data with firmware six fully open."""
413-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
443+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
414444
adv_data = generate_advertisement_data(
415445
local_name="WoCurtain",
416446
manufacturer_data={
@@ -454,7 +484,7 @@ def test_parse_advertisement_data_curtain_firmware_six_fully_open():
454484

455485
def test_contact_sensor_mfr():
456486
"""Test parsing adv data from new bot firmware."""
457-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
487+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
458488
adv_data = generate_advertisement_data(
459489
manufacturer_data={2409: b"\xcb9\xcd\xc4=FA,\x00F\x01\x8f\xc4"},
460490
service_data={
@@ -490,7 +520,7 @@ def test_contact_sensor_mfr():
490520

491521
def test_contact_sensor_mfr_no_service_data():
492522
"""Test contact sensor with passive data only."""
493-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
523+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
494524
adv_data = generate_advertisement_data(
495525
manufacturer_data={2409: b"\xcb9\xcd\xc4=FA,\x00F\x01\x8f\xc4"},
496526
service_data={},
@@ -524,7 +554,7 @@ def test_contact_sensor_mfr_no_service_data():
524554

525555
def test_contact_sensor_srv():
526556
"""Test parsing adv data from new bot firmware."""
527-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
557+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
528558
adv_data = generate_advertisement_data(
529559
service_data={
530560
"0000fd3d-0000-1000-8000-00805f9b34fb": b"d\x00\xda\x04\x00F\x01\x8f\xc4"
@@ -559,7 +589,7 @@ def test_contact_sensor_srv():
559589

560590
def test_contact_sensor_open():
561591
"""Test parsing mfr adv data from new bot firmware."""
562-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
592+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
563593
adv_data = generate_advertisement_data(
564594
manufacturer_data={2409: b"\xcb9\xcd\xc4=F\x84\x9c\x00\x17\x00QD"},
565595
service_data={
@@ -595,7 +625,7 @@ def test_contact_sensor_open():
595625

596626
def test_contact_sensor_closed():
597627
"""Test parsing mfr adv data from new bot firmware."""
598-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
628+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
599629
adv_data = generate_advertisement_data(
600630
manufacturer_data={2409: b"\xcb9\xcd\xc4=F\x89\x8c\x00+\x00\x19\x84"},
601631
service_data={
@@ -631,7 +661,7 @@ def test_contact_sensor_closed():
631661

632662
def test_switchbot_passive():
633663
"""Test parsing switchbot as passive."""
634-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
664+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
635665
adv_data = generate_advertisement_data(
636666
manufacturer_data={89: bytes.fromhex("d51cfb397856")},
637667
service_data={},
@@ -661,7 +691,7 @@ def test_switchbot_passive():
661691

662692
def test_bulb_active():
663693
"""Test parsing bulb as active."""
664-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
694+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
665695
adv_data = generate_advertisement_data(
666696
manufacturer_data={2409: b"\x84\xf7\x03\xb4\xcbz\x03\xe4!\x00\x00"},
667697
service_data={"0000fd3d-0000-1000-8000-00805f9b34fb": b"u\x00d"},
@@ -696,7 +726,7 @@ def test_bulb_active():
696726

697727
def test_lightstrip_passive():
698728
"""Test parsing lightstrip as passive."""
699-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
729+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
700730
adv_data = generate_advertisement_data(
701731
manufacturer_data={
702732
2409: b"`U\xf9(\xe5\x96\x00d\x02\xb0\x00\x00\x00\x00\x00\x00"
@@ -733,7 +763,7 @@ def test_lightstrip_passive():
733763

734764
def test_wosensor_passive_and_active():
735765
"""Test parsing wosensor as passive with active data as well."""
736-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
766+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
737767
adv_data = generate_advertisement_data(
738768
manufacturer_data={2409: b"\xd7\xc1}]\xebC\xde\x03\x06\x985"},
739769
service_data={"0000fd3d-0000-1000-8000-00805f9b34fb": b"T\x00\xe4\x06\x985"},
@@ -765,7 +795,7 @@ def test_wosensor_passive_and_active():
765795

766796
def test_wosensor_active():
767797
"""Test parsing wosensor with active data as well."""
768-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
798+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
769799
adv_data = generate_advertisement_data(
770800
manufacturer_data={},
771801
service_data={"0000fd3d-0000-1000-8000-00805f9b34fb": b"T\x00\xe4\x06\x985"},
@@ -797,7 +827,7 @@ def test_wosensor_active():
797827

798828
def test_wosensor_passive_only():
799829
"""Test parsing wosensor with only passive data."""
800-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
830+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
801831
adv_data = generate_advertisement_data(
802832
manufacturer_data={2409: b"\xd7\xc1}]\xebC\xde\x03\x06\x985"},
803833
service_data={},
@@ -829,7 +859,7 @@ def test_wosensor_passive_only():
829859

830860
def test_motion_sensor_clear():
831861
"""Test parsing motion sensor with clear data."""
832-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
862+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
833863
adv_data = generate_advertisement_data(
834864
manufacturer_data={2409: b"\xc0!\x9a\xe8\xbcIj\x1c\x00f"},
835865
service_data={"0000fd3d-0000-1000-8000-00805f9b34fb": b"s\x00\xe2\x00f\x01"},
@@ -866,7 +896,7 @@ def test_motion_sensor_clear():
866896

867897
def test_motion_sensor_clear_passive():
868898
"""Test parsing motion sensor with clear data."""
869-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
899+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
870900
adv_data = generate_advertisement_data(
871901
manufacturer_data={2409: b"\xc0!\x9a\xe8\xbcIj\x1c\x00f"},
872902
service_data={},
@@ -903,7 +933,7 @@ def test_motion_sensor_clear_passive():
903933

904934
def test_motion_sensor_motion():
905935
"""Test parsing motion sensor with motion data."""
906-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
936+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
907937
adv_data = generate_advertisement_data(
908938
manufacturer_data={2409: b"\xc0!\x9a\xe8\xbcIi\\\x008"},
909939
service_data={"0000fd3d-0000-1000-8000-00805f9b34fb": b"s@\xe2\x008\x01"},
@@ -940,7 +970,7 @@ def test_motion_sensor_motion():
940970

941971
def test_motion_sensor_motion_passive():
942972
"""Test parsing motion sensor with motion data."""
943-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
973+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
944974
adv_data = generate_advertisement_data(
945975
manufacturer_data={2409: b"\xc0!\x9a\xe8\xbcIi\\\x008"},
946976
service_data={},
@@ -977,7 +1007,7 @@ def test_motion_sensor_motion_passive():
9771007

9781008
def test_motion_sensor_is_light_passive():
9791009
"""Test parsing motion sensor with motion data."""
980-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
1010+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
9811011
adv_data = generate_advertisement_data(
9821012
manufacturer_data={2409: b"\xc0!\x9a\xe8\xbcIs,\x04g"},
9831013
service_data={"0000fd3d-0000-1000-8000-00805f9b34fb": b"s\x00\xe2\x04g\x02"},
@@ -1014,7 +1044,7 @@ def test_motion_sensor_is_light_passive():
10141044

10151045
def test_motion_sensor_is_light_active():
10161046
"""Test parsing motion sensor with motion data."""
1017-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
1047+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
10181048
adv_data = generate_advertisement_data(
10191049
manufacturer_data={},
10201050
service_data={"0000fd3d-0000-1000-8000-00805f9b34fb": b"s\x00\xe2\x04g\x02"},
@@ -1050,7 +1080,7 @@ def test_motion_sensor_is_light_active():
10501080

10511081

10521082
def test_motion_with_light_detected():
1053-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
1083+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
10541084
adv_data = generate_advertisement_data(
10551085
manufacturer_data={2409: b"\xc0!\x9a\xe8\xbcIvl\x00,"},
10561086
service_data={"0000fd3d-0000-1000-8000-00805f9b34fb": b"s@\xe2\x00,\x02"},
@@ -1087,7 +1117,7 @@ def test_motion_with_light_detected():
10871117

10881118
def test_motion_sensor_motion_passive():
10891119
"""Test parsing motion sensor with motion data."""
1090-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
1120+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
10911121
adv_data = generate_advertisement_data(
10921122
manufacturer_data={2409: b"\xc0!\x9a\xe8\xbcIi\\\x008"},
10931123
service_data={},
@@ -1124,7 +1154,7 @@ def test_motion_sensor_motion_passive():
11241154

11251155
def test_parsing_lock_active():
11261156
"""Test parsing lock with active data."""
1127-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
1157+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
11281158
adv_data = generate_advertisement_data(
11291159
manufacturer_data={2409: b"\xf1\t\x9fE\x1a]\x07\x83\x00 "},
11301160
service_data={"0000fd3d-0000-1000-8000-00805f9b34fb": b"o\x80d"},
@@ -1159,7 +1189,7 @@ def test_parsing_lock_active():
11591189

11601190
def test_parsing_lock_passive():
11611191
"""Test parsing lock with active data."""
1162-
ble_device = BLEDevice("aa:bb:cc:dd:ee:ff", "any")
1192+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
11631193
adv_data = generate_advertisement_data(
11641194
manufacturer_data={2409: b"\xf1\t\x9fE\x1a]\x07\x83\x00 "}, rssi=-67
11651195
)

0 commit comments

Comments
 (0)