1+ from __future__ import annotations
2+
13from typing import Any
24
35from bleak .backends .device import BLEDevice
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
2151def generate_advertisement_data (** kwargs : Any ) -> AdvertisementData :
2252 """Generate advertisement data with defaults."""
@@ -28,7 +58,7 @@ def generate_advertisement_data(**kwargs: Any) -> AdvertisementData:
2858
2959def 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 \xab F\xac \x8f \x92 |\x0f \x00 \x11 \x04 " },
3464 service_data = {"0000fd3d-0000-1000-8000-00805f9b34fb" : b"c\xc0 X\x00 \x11 \x04 " },
@@ -60,7 +90,7 @@ def test_parse_advertisement_data_curtain():
6090
6191def 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 \xab F\xac \x8f \x92 |\x0f \x00 \x11 \x04 " },
6696 service_data = {},
@@ -92,7 +122,7 @@ def test_parse_advertisement_data_curtain_passive():
92122
93123def 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
131161def 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
175205def 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
219249def 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 \" \x0f d\x11 \x04 " },
@@ -256,7 +286,7 @@ def test_parse_advertisement_data_curtain_fully_closed():
256286
257287def 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
295325def 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 \xab F\xac \x8f \x92 |\x0f \x00 \x11 \x04 " },
300330 service_data = {
@@ -329,7 +359,7 @@ def test_parse_advertisement_data_contact():
329359
330360def 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 \xab F\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
341371def 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
367397def 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
411441def 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
455485def 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"\xcb 9\xcd \xc4 =FA,\x00 F\x01 \x8f \xc4 " },
460490 service_data = {
@@ -490,7 +520,7 @@ def test_contact_sensor_mfr():
490520
491521def 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"\xcb 9\xcd \xc4 =FA,\x00 F\x01 \x8f \xc4 " },
496526 service_data = {},
@@ -524,7 +554,7 @@ def test_contact_sensor_mfr_no_service_data():
524554
525555def 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 \x00 F\x01 \x8f \xc4 "
@@ -559,7 +589,7 @@ def test_contact_sensor_srv():
559589
560590def 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"\xcb 9\xcd \xc4 =F\x84 \x9c \x00 \x17 \x00 QD" },
565595 service_data = {
@@ -595,7 +625,7 @@ def test_contact_sensor_open():
595625
596626def 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"\xcb 9\xcd \xc4 =F\x89 \x8c \x00 +\x00 \x19 \x84 " },
601631 service_data = {
@@ -631,7 +661,7 @@ def test_contact_sensor_closed():
631661
632662def 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
662692def 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 \xcb z\x03 \xe4 !\x00 \x00 " },
667697 service_data = {"0000fd3d-0000-1000-8000-00805f9b34fb" : b"u\x00 d" },
@@ -696,7 +726,7 @@ def test_bulb_active():
696726
697727def 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 \x00 d\x02 \xb0 \x00 \x00 \x00 \x00 \x00 \x00 "
@@ -733,7 +763,7 @@ def test_lightstrip_passive():
733763
734764def 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 }]\xeb C\xde \x03 \x06 \x98 5" },
739769 service_data = {"0000fd3d-0000-1000-8000-00805f9b34fb" : b"T\x00 \xe4 \x06 \x98 5" },
@@ -765,7 +795,7 @@ def test_wosensor_passive_and_active():
765795
766796def 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 \x98 5" },
@@ -797,7 +827,7 @@ def test_wosensor_active():
797827
798828def 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 }]\xeb C\xde \x03 \x06 \x98 5" },
803833 service_data = {},
@@ -829,7 +859,7 @@ def test_wosensor_passive_only():
829859
830860def 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 \xbc Ij\x1c \x00 f" },
835865 service_data = {"0000fd3d-0000-1000-8000-00805f9b34fb" : b"s\x00 \xe2 \x00 f\x01 " },
@@ -866,7 +896,7 @@ def test_motion_sensor_clear():
866896
867897def 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 \xbc Ij\x1c \x00 f" },
872902 service_data = {},
@@ -903,7 +933,7 @@ def test_motion_sensor_clear_passive():
903933
904934def 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 \xbc Ii\\ \x00 8" },
909939 service_data = {"0000fd3d-0000-1000-8000-00805f9b34fb" : b"s@\xe2 \x00 8\x01 " },
@@ -940,7 +970,7 @@ def test_motion_sensor_motion():
940970
941971def 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 \xbc Ii\\ \x00 8" },
946976 service_data = {},
@@ -977,7 +1007,7 @@ def test_motion_sensor_motion_passive():
9771007
9781008def 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 \xbc Is,\x04 g" },
9831013 service_data = {"0000fd3d-0000-1000-8000-00805f9b34fb" : b"s\x00 \xe2 \x04 g\x02 " },
@@ -1014,7 +1044,7 @@ def test_motion_sensor_is_light_passive():
10141044
10151045def 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 \x04 g\x02 " },
@@ -1050,7 +1080,7 @@ def test_motion_sensor_is_light_active():
10501080
10511081
10521082def 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 \xbc Ivl\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
10881118def 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 \xbc Ii\\ \x00 8" },
10931123 service_data = {},
@@ -1124,7 +1154,7 @@ def test_motion_sensor_motion_passive():
11241154
11251155def 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 \x9f E\x1a ]\x07 \x83 \x00 " },
11301160 service_data = {"0000fd3d-0000-1000-8000-00805f9b34fb" : b"o\x80 d" },
@@ -1159,7 +1189,7 @@ def test_parsing_lock_active():
11591189
11601190def 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 \x9f E\x1a ]\x07 \x83 \x00 " }, rssi = - 67
11651195 )
0 commit comments