1
0

test_hub4.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import pytest
  2. from switchbot import SwitchbotModel, parse_advertisement_data
  3. from .test_adv_parser import generate_advertisement_data, generate_ble_device
  4. @pytest.mark.parametrize("pairing", [False, True])
  5. @pytest.mark.parametrize("light_level", [1, 15, 16, 20])
  6. @pytest.mark.parametrize("sensor_inserted", [False, True])
  7. @pytest.mark.parametrize("motion", [False, True])
  8. def test_hub4_advertisement(pairing, light_level, sensor_inserted, motion):
  9. service = bytes([0, 0, 100, int(pairing), 0x12, 0x82, 0x48])
  10. manufacturer = bytearray.fromhex("01020304050601ff000000008003993480")
  11. manufacturer[12] = 0x80 | (0 if sensor_inserted else 0x20) | light_level
  12. manufacturer[16] = 0x80 if motion else 0
  13. result = parse_advertisement_data(
  14. generate_ble_device("01:02:03:04:05:06", "Hub4"),
  15. generate_advertisement_data(
  16. manufacturer_data={2409: bytes(manufacturer)},
  17. service_data={"0000fd3d-0000-1000-8000-00805f9b34fb": service},
  18. ),
  19. )
  20. assert result is not None
  21. assert result.data["modelName"] is SwitchbotModel.HUB4
  22. assert result.data["modelFriendlyName"] == "Hub4"
  23. assert result.data["model"] == service[3:]
  24. assert result.data["data"] == {
  25. "sequence_number": 1,
  26. "network_state": 2,
  27. "sensor_inserted": sensor_inserted,
  28. "lightLevel": light_level,
  29. "temperature_alarm": False,
  30. "humidity_alarm": False,
  31. "temp": {"c": 25.3, "f": 77.5},
  32. "temperature": 25.3,
  33. "humidity": 52,
  34. "motion_detected": motion,
  35. }
  36. @pytest.mark.parametrize("manufacturer", [None, b"", bytes(16)])
  37. def test_hub4_short_manufacturer_data(manufacturer):
  38. result = parse_advertisement_data(
  39. generate_ble_device("01:02:03:04:05:06", "Hub4"),
  40. generate_advertisement_data(
  41. manufacturer_data={2409: manufacturer},
  42. service_data={
  43. "0000fd3d-0000-1000-8000-00805f9b34fb": bytes.fromhex("00006400128248")
  44. },
  45. ),
  46. )
  47. assert result.data["data"] == {}
  48. def test_hub4_passive_advertisement():
  49. result = parse_advertisement_data(
  50. generate_ble_device("01:02:03:04:05:06", "Hub4"),
  51. generate_advertisement_data(
  52. manufacturer_data={
  53. 2409: bytes.fromhex("01020304050601ff000000009493193480")
  54. },
  55. ),
  56. SwitchbotModel.HUB4,
  57. )
  58. assert result.data["modelName"] is SwitchbotModel.HUB4
  59. assert result.data["data"]["lightLevel"] == 20
  60. assert result.data["data"]["temperature"] == -25.3
  61. assert result.data["data"]["temperature_alarm"] is True
  62. assert result.data["data"]["humidity_alarm"] is True
  63. assert "illuminance" not in result.data["data"]
  64. assert result.active is False