|
@@ -0,0 +1,72 @@
|
|
|
|
|
+import pytest
|
|
|
|
|
+
|
|
|
|
|
+from switchbot import SwitchbotModel, parse_advertisement_data
|
|
|
|
|
+
|
|
|
|
|
+from .test_adv_parser import generate_advertisement_data, generate_ble_device
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+@pytest.mark.parametrize("pairing", [False, True])
|
|
|
|
|
+@pytest.mark.parametrize("light_level", [1, 15, 16, 20])
|
|
|
|
|
+@pytest.mark.parametrize("sensor_inserted", [False, True])
|
|
|
|
|
+@pytest.mark.parametrize("motion", [False, True])
|
|
|
|
|
+def test_hub4_advertisement(pairing, light_level, sensor_inserted, motion):
|
|
|
|
|
+ service = bytes([0, 0, 100, int(pairing), 0x12, 0x82, 0x48])
|
|
|
|
|
+ manufacturer = bytearray.fromhex("01020304050601ff000000008003993480")
|
|
|
|
|
+ manufacturer[12] = 0x80 | (0 if sensor_inserted else 0x20) | light_level
|
|
|
|
|
+ manufacturer[16] = 0x80 if motion else 0
|
|
|
|
|
+ result = parse_advertisement_data(
|
|
|
|
|
+ generate_ble_device("01:02:03:04:05:06", "Hub4"),
|
|
|
|
|
+ generate_advertisement_data(
|
|
|
|
|
+ manufacturer_data={2409: bytes(manufacturer)},
|
|
|
|
|
+ service_data={"0000fd3d-0000-1000-8000-00805f9b34fb": service},
|
|
|
|
|
+ ),
|
|
|
|
|
+ )
|
|
|
|
|
+ assert result is not None
|
|
|
|
|
+ assert result.data["modelName"] is SwitchbotModel.HUB4
|
|
|
|
|
+ assert result.data["modelFriendlyName"] == "Hub4"
|
|
|
|
|
+ assert result.data["model"] == service[3:]
|
|
|
|
|
+ assert result.data["data"] == {
|
|
|
|
|
+ "sequence_number": 1,
|
|
|
|
|
+ "network_state": 2,
|
|
|
|
|
+ "sensor_inserted": sensor_inserted,
|
|
|
|
|
+ "lightLevel": light_level,
|
|
|
|
|
+ "temperature_alarm": False,
|
|
|
|
|
+ "humidity_alarm": False,
|
|
|
|
|
+ "temp": {"c": 25.3, "f": 77.5},
|
|
|
|
|
+ "temperature": 25.3,
|
|
|
|
|
+ "humidity": 52,
|
|
|
|
|
+ "motion_detected": motion,
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+@pytest.mark.parametrize("manufacturer", [None, b"", bytes(16)])
|
|
|
|
|
+def test_hub4_short_manufacturer_data(manufacturer):
|
|
|
|
|
+ result = parse_advertisement_data(
|
|
|
|
|
+ generate_ble_device("01:02:03:04:05:06", "Hub4"),
|
|
|
|
|
+ generate_advertisement_data(
|
|
|
|
|
+ manufacturer_data={2409: manufacturer},
|
|
|
|
|
+ service_data={
|
|
|
|
|
+ "0000fd3d-0000-1000-8000-00805f9b34fb": bytes.fromhex("00006400128248")
|
|
|
|
|
+ },
|
|
|
|
|
+ ),
|
|
|
|
|
+ )
|
|
|
|
|
+ assert result.data["data"] == {}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def test_hub4_passive_advertisement():
|
|
|
|
|
+ result = parse_advertisement_data(
|
|
|
|
|
+ generate_ble_device("01:02:03:04:05:06", "Hub4"),
|
|
|
|
|
+ generate_advertisement_data(
|
|
|
|
|
+ manufacturer_data={
|
|
|
|
|
+ 2409: bytes.fromhex("01020304050601ff000000009493193480")
|
|
|
|
|
+ },
|
|
|
|
|
+ ),
|
|
|
|
|
+ SwitchbotModel.HUB4,
|
|
|
|
|
+ )
|
|
|
|
|
+ assert result.data["modelName"] is SwitchbotModel.HUB4
|
|
|
|
|
+ assert result.data["data"]["lightLevel"] == 20
|
|
|
|
|
+ assert result.data["data"]["temperature"] == -25.3
|
|
|
|
|
+ assert result.data["data"]["temperature_alarm"] is True
|
|
|
|
|
+ assert result.data["data"]["humidity_alarm"] is True
|
|
|
|
|
+ assert "illuminance" not in result.data["data"]
|
|
|
|
|
+ assert result.active is False
|