Skip to content

Commit e8adfd9

Browse files
Michal4Kbdraco
andauthored
Fix compatibilty for old/US firmware (#217)
Co-authored-by: J. Nick Koston <[email protected]>
1 parent c6d7585 commit e8adfd9

File tree

3 files changed

+73
-3
lines changed

3 files changed

+73
-3
lines changed

switchbot/adv_parsers/lock.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,5 @@ def process_wolock(data: bytes | None, mfr_data: bytes | None) -> dict[str, bool
2727
"unclosed_alarm": bool(mfr_data[8] & 0b00100000),
2828
"unlocked_alarm": bool(mfr_data[8] & 0b00010000),
2929
"auto_lock_paused": bool(mfr_data[8] & 0b00000010),
30-
"night_latch": bool(mfr_data[9] & 0b00000001),
30+
"night_latch": bool(mfr_data[9] & 0b00000001) if len(mfr_data) > 9 else False,
3131
}

switchbot/devices/lock.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,8 @@ async def unlock(self) -> bool:
173173
async def unlock_without_unlatch(self) -> bool:
174174
"""Send unlock command. This command will not unlatch the door."""
175175
return await self._lock_unlock(
176-
COMMAND_UNLOCK_WITHOUT_UNLATCH, {LockStatus.UNLOCKED, LockStatus.UNLOCKING, LockStatus.NOT_FULLY_LOCKED}
176+
COMMAND_UNLOCK_WITHOUT_UNLATCH,
177+
{LockStatus.UNLOCKED, LockStatus.UNLOCKING, LockStatus.NOT_FULLY_LOCKED},
177178
)
178179

179180
def _parse_basic_data(self, basic_data: bytes) -> dict[str, Any]:
@@ -249,7 +250,7 @@ def is_auto_lock_paused(self) -> bool:
249250
def is_night_latch_enabled(self) -> bool:
250251
"""Return True if Night Latch is enabled on EU firmware."""
251252
return self._get_adv_value("night_latch")
252-
253+
253254
async def _get_lock_info(self) -> bytes | None:
254255
"""Return lock info of device."""
255256
_data = await self._send_command(key=COMMAND_LOCK_INFO, retry=self._retry_count)

tests/test_adv_parser.py

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1284,3 +1284,72 @@ def test_parsing_lock_passive():
12841284
rssi=-67,
12851285
active=False,
12861286
)
1287+
1288+
def test_parsing_lock_active_old_firmware():
1289+
"""Test parsing lock with active data. Old firmware."""
1290+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
1291+
adv_data = generate_advertisement_data(
1292+
manufacturer_data={2409: b"\xf1\t\x9fE\x1a]\x07\x83\x00"},
1293+
service_data={"0000fd3d-0000-1000-8000-00805f9b34fb": b"o\x80d"},
1294+
rssi=-67,
1295+
)
1296+
result = parse_advertisement_data(ble_device, adv_data)
1297+
assert result == SwitchBotAdvertisement(
1298+
address="aa:bb:cc:dd:ee:ff",
1299+
data={
1300+
"data": {
1301+
"auto_lock_paused": False,
1302+
"battery": 100,
1303+
"calibration": True,
1304+
"door_open": False,
1305+
"double_lock_mode": False,
1306+
"night_latch": False,
1307+
"status": LockStatus.LOCKED,
1308+
"unclosed_alarm": False,
1309+
"unlocked_alarm": False,
1310+
"update_from_secondary_lock": False,
1311+
},
1312+
"isEncrypted": False,
1313+
"model": "o",
1314+
"modelFriendlyName": "Lock",
1315+
"modelName": SwitchbotModel.LOCK,
1316+
"rawAdvData": b"o\x80d",
1317+
},
1318+
device=ble_device,
1319+
rssi=-67,
1320+
active=True,
1321+
)
1322+
1323+
1324+
def test_parsing_lock_passive_old_firmware():
1325+
"""Test parsing lock with active data. Old firmware."""
1326+
ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
1327+
adv_data = generate_advertisement_data(
1328+
manufacturer_data={2409: b"\xf1\t\x9fE\x1a]\x07\x83\x00"}, rssi=-67
1329+
)
1330+
result = parse_advertisement_data(ble_device, adv_data, SwitchbotModel.LOCK)
1331+
assert result == SwitchBotAdvertisement(
1332+
address="aa:bb:cc:dd:ee:ff",
1333+
data={
1334+
"data": {
1335+
"auto_lock_paused": False,
1336+
"battery": None,
1337+
"calibration": True,
1338+
"door_open": False,
1339+
"double_lock_mode": False,
1340+
"night_latch": False,
1341+
"status": LockStatus.LOCKED,
1342+
"unclosed_alarm": False,
1343+
"unlocked_alarm": False,
1344+
"update_from_secondary_lock": False,
1345+
},
1346+
"isEncrypted": False,
1347+
"model": "o",
1348+
"modelFriendlyName": "Lock",
1349+
"modelName": SwitchbotModel.LOCK,
1350+
"rawAdvData": None,
1351+
},
1352+
device=ble_device,
1353+
rssi=-67,
1354+
active=False,
1355+
)

0 commit comments

Comments
 (0)