PySwitchbot 2.6.0__tar.gz → 2.7.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/PKG-INFO +1 -1
  2. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/pyproject.toml +1 -1
  3. pyswitchbot-2.7.0/switchbot/__version__.py +1 -0
  4. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parser.py +12 -0
  5. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/const/__init__.py +1 -0
  6. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/devices/lock.py +11 -0
  7. pyswitchbot-2.6.0/switchbot/__version__.py +0 -1
  8. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/LICENSE +0 -0
  9. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/README.md +0 -0
  10. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/__init__.py +0 -0
  11. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/__init__.py +0 -0
  12. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/_sensor_th.py +0 -0
  13. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/air_purifier.py +0 -0
  14. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/art_frame.py +0 -0
  15. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/blind_tilt.py +0 -0
  16. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/bot.py +0 -0
  17. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/bulb.py +0 -0
  18. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/ceiling_light.py +0 -0
  19. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/climate_panel.py +0 -0
  20. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/contact.py +0 -0
  21. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/curtain.py +0 -0
  22. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/fan.py +0 -0
  23. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/hub2.py +0 -0
  24. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/hub3.py +0 -0
  25. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/hubmini_matter.py +0 -0
  26. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/humidifier.py +0 -0
  27. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/keypad.py +0 -0
  28. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/keypad_vision.py +0 -0
  29. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/leak.py +0 -0
  30. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/light_strip.py +0 -0
  31. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/lock.py +0 -0
  32. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/meter.py +0 -0
  33. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/motion.py +0 -0
  34. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/plug.py +0 -0
  35. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/presence_sensor.py +0 -0
  36. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/relay_switch.py +0 -0
  37. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/remote.py +0 -0
  38. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/roller_shade.py +0 -0
  39. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/smart_thermostat_radiator.py +0 -0
  40. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/vacuum.py +0 -0
  41. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/adv_parsers/weather_station.py +0 -0
  42. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/api_config.py +0 -0
  43. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/const/air_purifier.py +0 -0
  44. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/const/climate.py +0 -0
  45. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/const/evaporative_humidifier.py +0 -0
  46. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/const/fan.py +0 -0
  47. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/const/hub2.py +0 -0
  48. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/const/hub3.py +0 -0
  49. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/const/light.py +0 -0
  50. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/const/lock.py +0 -0
  51. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/const/presence_sensor.py +0 -0
  52. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/devices/__init__.py +0 -0
  53. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/devices/air_purifier.py +0 -0
  54. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/devices/art_frame.py +0 -0
  55. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/devices/base_cover.py +0 -0
  56. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/devices/base_light.py +0 -0
  57. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/devices/blind_tilt.py +0 -0
  58. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/devices/bot.py +0 -0
  59. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/devices/bulb.py +0 -0
  60. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/devices/ceiling_light.py +0 -0
  61. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/devices/contact.py +0 -0
  62. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/devices/curtain.py +0 -0
  63. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/devices/device.py +0 -0
  64. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/devices/evaporative_humidifier.py +0 -0
  65. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/devices/fan.py +0 -0
  66. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/devices/humidifier.py +0 -0
  67. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/devices/keypad.py +0 -0
  68. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/devices/keypad_vision.py +0 -0
  69. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/devices/light_strip.py +0 -0
  70. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/devices/meter.py +0 -0
  71. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/devices/meter_pro.py +0 -0
  72. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/devices/motion.py +0 -0
  73. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/devices/plug.py +0 -0
  74. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/devices/relay_switch.py +0 -0
  75. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/devices/roller_shade.py +0 -0
  76. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/devices/smart_thermostat_radiator.py +0 -0
  77. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/devices/universal_remote.py +0 -0
  78. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/devices/vacuum.py +0 -0
  79. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/discovery.py +0 -0
  80. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/enum.py +0 -0
  81. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/helpers.py +0 -0
  82. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/models.py +0 -0
  83. {pyswitchbot-2.6.0 → pyswitchbot-2.7.0}/switchbot/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PySwitchbot
3
- Version: 2.6.0
3
+ Version: 2.7.0
4
4
  Summary: A library to communicate with Switchbot
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "PySwitchbot"
3
- version = "2.6.0"
3
+ version = "2.7.0"
4
4
  description = "A library to communicate with Switchbot"
5
5
  authors = ["Daniel Hjelseth Hoyer"]
6
6
  license = "MIT"
@@ -0,0 +1 @@
1
+ __version__ = "2.7.0"
@@ -898,6 +898,18 @@ SUPPORTED_TYPES: dict[str | bytes, SwitchbotSupportedType] = {
898
898
  "func": process_wolock_pro,
899
899
  "manufacturer_id": 2409,
900
900
  },
901
+ b"\x00\x11\x9f\xb8": {
902
+ "modelName": SwitchbotModel.LOCK_ULTRA_MAX,
903
+ "modelFriendlyName": "Lock Ultra Max",
904
+ "func": process_lock2,
905
+ "manufacturer_id": 2409,
906
+ },
907
+ b"\x01\x11\x9f\xb8": {
908
+ "modelName": SwitchbotModel.LOCK_ULTRA_MAX,
909
+ "modelFriendlyName": "Lock Ultra Max",
910
+ "func": process_lock2,
911
+ "manufacturer_id": 2409,
912
+ },
901
913
  b"\x00\x11\x07\x60": {
902
914
  "modelName": SwitchbotModel.STANDING_FAN,
903
915
  "modelFriendlyName": "Standing Fan",
@@ -126,6 +126,7 @@ class SwitchbotModel(StrEnum):
126
126
  LOCK_VISION_PRO = "Lock Vision Pro"
127
127
  LOCK_VISION = "Lock Vision"
128
128
  LOCK_PRO_WIFI = "Lock Pro Wifi"
129
+ LOCK_ULTRA_MAX = "Lock Ultra Max"
129
130
  WEATHER_STATION = "Weather Station"
130
131
 
131
132
 
@@ -22,6 +22,7 @@ COMMAND_LOCK_INFO = {
22
22
  SwitchbotModel.LOCK_LITE: f"{COMMAND_HEADER}0f4f8101",
23
23
  SwitchbotModel.LOCK_PRO: f"{COMMAND_HEADER}0f4f8104",
24
24
  SwitchbotModel.LOCK_ULTRA: f"{COMMAND_HEADER}0f4f8107",
25
+ SwitchbotModel.LOCK_ULTRA_MAX: f"{COMMAND_HEADER}0f4f8107",
25
26
  SwitchbotModel.LOCK_VISION_PRO: f"{COMMAND_HEADER}0f4f8102",
26
27
  SwitchbotModel.LOCK_VISION: f"{COMMAND_HEADER}0f4f8102",
27
28
  SwitchbotModel.LOCK_PRO_WIFI: f"{COMMAND_HEADER}0f4f810a",
@@ -31,6 +32,7 @@ COMMAND_UNLOCK = {
31
32
  SwitchbotModel.LOCK_LITE: f"{COMMAND_HEADER}0f4e01011080",
32
33
  SwitchbotModel.LOCK_PRO: f"{COMMAND_HEADER}0f4e0101000080",
33
34
  SwitchbotModel.LOCK_ULTRA: f"{COMMAND_HEADER}0f4e0101000080",
35
+ SwitchbotModel.LOCK_ULTRA_MAX: f"{COMMAND_HEADER}0f4e0101000080",
34
36
  SwitchbotModel.LOCK_VISION_PRO: f"{COMMAND_HEADER}0f4e0101000080",
35
37
  SwitchbotModel.LOCK_VISION: f"{COMMAND_HEADER}0f4e0101000080",
36
38
  SwitchbotModel.LOCK_PRO_WIFI: f"{COMMAND_HEADER}0f4e0101000080",
@@ -40,6 +42,7 @@ COMMAND_UNLOCK_WITHOUT_UNLATCH = {
40
42
  SwitchbotModel.LOCK_LITE: f"{COMMAND_HEADER}0f4e010110a0",
41
43
  SwitchbotModel.LOCK_PRO: f"{COMMAND_HEADER}0f4e01010000a0",
42
44
  SwitchbotModel.LOCK_ULTRA: f"{COMMAND_HEADER}0f4e01010000a0",
45
+ SwitchbotModel.LOCK_ULTRA_MAX: f"{COMMAND_HEADER}0f4e01010000a0",
43
46
  SwitchbotModel.LOCK_VISION_PRO: f"{COMMAND_HEADER}0f4e01010000a0",
44
47
  SwitchbotModel.LOCK_VISION: f"{COMMAND_HEADER}0f4e01010000a0",
45
48
  SwitchbotModel.LOCK_PRO_WIFI: f"{COMMAND_HEADER}0f4e01010000a0",
@@ -49,6 +52,7 @@ COMMAND_LOCK = {
49
52
  SwitchbotModel.LOCK_LITE: f"{COMMAND_HEADER}0f4e01011000",
50
53
  SwitchbotModel.LOCK_PRO: f"{COMMAND_HEADER}0f4e0101000000",
51
54
  SwitchbotModel.LOCK_ULTRA: f"{COMMAND_HEADER}0f4e0101000000",
55
+ SwitchbotModel.LOCK_ULTRA_MAX: f"{COMMAND_HEADER}0f4e0101000000",
52
56
  SwitchbotModel.LOCK_VISION_PRO: f"{COMMAND_HEADER}0f4e0101000000",
53
57
  SwitchbotModel.LOCK_VISION: f"{COMMAND_HEADER}0f4e0101000000",
54
58
  SwitchbotModel.LOCK_PRO_WIFI: f"{COMMAND_HEADER}0f4e0101000000",
@@ -62,6 +66,7 @@ COMMAND_ENABLE_NOTIFICATIONS = {
62
66
  SwitchbotModel.LOCK_LITE: f"{COMMAND_HEADER}0e01001e00008101",
63
67
  SwitchbotModel.LOCK_PRO: f"{COMMAND_HEADER}0e01001e00008104",
64
68
  SwitchbotModel.LOCK_ULTRA: f"{COMMAND_HEADER}0e01001e00008107",
69
+ SwitchbotModel.LOCK_ULTRA_MAX: f"{COMMAND_HEADER}0e01001e00008107",
65
70
  SwitchbotModel.LOCK_VISION_PRO: f"{COMMAND_HEADER}0e01001e00008102",
66
71
  SwitchbotModel.LOCK_VISION: f"{COMMAND_HEADER}0e01001e00008102",
67
72
  SwitchbotModel.LOCK_PRO_WIFI: f"{COMMAND_HEADER}0e01001e0000810a",
@@ -102,6 +107,7 @@ class SwitchbotLock(SwitchbotSequenceDevice, SwitchbotEncryptedDevice):
102
107
  SwitchbotModel.LOCK_PRO,
103
108
  SwitchbotModel.LOCK_LITE,
104
109
  SwitchbotModel.LOCK_ULTRA,
110
+ SwitchbotModel.LOCK_ULTRA_MAX,
105
111
  SwitchbotModel.LOCK_VISION_PRO,
106
112
  SwitchbotModel.LOCK_VISION,
107
113
  SwitchbotModel.LOCK_PRO_WIFI,
@@ -143,6 +149,11 @@ class SwitchbotLock(SwitchbotSequenceDevice, SwitchbotEncryptedDevice):
143
149
 
144
150
  def _parse_basic_data(self, basic_data: bytes) -> dict[str, Any]:
145
151
  """Parse basic data from lock."""
152
+ if self._model is SwitchbotModel.LOCK_ULTRA_MAX:
153
+ # Lock Ultra Max's basic-info response format is not documented.
154
+ # Its advertisement already carries the reliable battery and state
155
+ # data, so never overwrite that data with an unverified response.
156
+ return {}
146
157
  return {
147
158
  "battery": basic_data[1],
148
159
  "firmware": basic_data[2] / 10.0,
@@ -1 +0,0 @@
1
- __version__ = "2.6.0"
File without changes
File without changes