PySwitchbot 2.6.0__tar.gz → 2.7.1__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.1}/PKG-INFO +9 -9
  2. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/README.md +8 -8
  3. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/pyproject.toml +1 -1
  4. pyswitchbot-2.7.1/switchbot/__version__.py +1 -0
  5. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parser.py +12 -0
  6. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/const/__init__.py +1 -0
  7. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/devices/ceiling_light.py +5 -1
  8. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/devices/lock.py +11 -0
  9. pyswitchbot-2.6.0/switchbot/__version__.py +0 -1
  10. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/LICENSE +0 -0
  11. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/__init__.py +0 -0
  12. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/__init__.py +0 -0
  13. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/_sensor_th.py +0 -0
  14. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/air_purifier.py +0 -0
  15. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/art_frame.py +0 -0
  16. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/blind_tilt.py +0 -0
  17. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/bot.py +0 -0
  18. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/bulb.py +0 -0
  19. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/ceiling_light.py +0 -0
  20. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/climate_panel.py +0 -0
  21. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/contact.py +0 -0
  22. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/curtain.py +0 -0
  23. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/fan.py +0 -0
  24. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/hub2.py +0 -0
  25. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/hub3.py +0 -0
  26. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/hubmini_matter.py +0 -0
  27. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/humidifier.py +0 -0
  28. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/keypad.py +0 -0
  29. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/keypad_vision.py +0 -0
  30. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/leak.py +0 -0
  31. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/light_strip.py +0 -0
  32. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/lock.py +0 -0
  33. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/meter.py +0 -0
  34. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/motion.py +0 -0
  35. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/plug.py +0 -0
  36. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/presence_sensor.py +0 -0
  37. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/relay_switch.py +0 -0
  38. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/remote.py +0 -0
  39. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/roller_shade.py +0 -0
  40. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/smart_thermostat_radiator.py +0 -0
  41. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/vacuum.py +0 -0
  42. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/adv_parsers/weather_station.py +0 -0
  43. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/api_config.py +0 -0
  44. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/const/air_purifier.py +0 -0
  45. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/const/climate.py +0 -0
  46. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/const/evaporative_humidifier.py +0 -0
  47. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/const/fan.py +0 -0
  48. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/const/hub2.py +0 -0
  49. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/const/hub3.py +0 -0
  50. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/const/light.py +0 -0
  51. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/const/lock.py +0 -0
  52. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/const/presence_sensor.py +0 -0
  53. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/devices/__init__.py +0 -0
  54. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/devices/air_purifier.py +0 -0
  55. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/devices/art_frame.py +0 -0
  56. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/devices/base_cover.py +0 -0
  57. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/devices/base_light.py +0 -0
  58. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/devices/blind_tilt.py +0 -0
  59. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/devices/bot.py +0 -0
  60. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/devices/bulb.py +0 -0
  61. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/devices/contact.py +0 -0
  62. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/devices/curtain.py +0 -0
  63. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/devices/device.py +0 -0
  64. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/devices/evaporative_humidifier.py +0 -0
  65. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/devices/fan.py +0 -0
  66. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/devices/humidifier.py +0 -0
  67. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/devices/keypad.py +0 -0
  68. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/devices/keypad_vision.py +0 -0
  69. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/devices/light_strip.py +0 -0
  70. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/devices/meter.py +0 -0
  71. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/devices/meter_pro.py +0 -0
  72. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/devices/motion.py +0 -0
  73. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/devices/plug.py +0 -0
  74. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/devices/relay_switch.py +0 -0
  75. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/devices/roller_shade.py +0 -0
  76. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/devices/smart_thermostat_radiator.py +0 -0
  77. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/devices/universal_remote.py +0 -0
  78. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/devices/vacuum.py +0 -0
  79. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/discovery.py +0 -0
  80. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/enum.py +0 -0
  81. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/helpers.py +0 -0
  82. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/switchbot/models.py +0 -0
  83. {pyswitchbot-2.6.0 → pyswitchbot-2.7.1}/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.1
4
4
  Summary: A library to communicate with Switchbot
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -93,10 +93,10 @@ from switchbot.discovery import GetSwitchbotDevices
93
93
  from switchbot.devices import lock
94
94
  from switchbot.const import SwitchbotModel
95
95
 
96
- BLE_MAC="XX:XX:XX:XX:XX:XX" # The MAC of your lock
97
- KEY_ID="XX" # The key-ID of your encryption-key for your lock
98
- ENC_KEY="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" # The encryption-key with key-ID "XX"
99
- LOCK_MODEL=SwitchbotModel.LOCK_PRO # Your lock model (here we use the Lock-Pro)
96
+ BLE_MAC = "XX:XX:XX:XX:XX:XX" # The MAC of your lock
97
+ KEY_ID = "XX" # The key-ID of your encryption-key for your lock
98
+ ENC_KEY = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" # The encryption-key with key-ID "XX"
99
+ LOCK_MODEL = SwitchbotModel.LOCK_PRO # Your lock model (here we use the Lock-Pro)
100
100
 
101
101
 
102
102
  async def main():
@@ -117,10 +117,10 @@ from switchbot.discovery import GetSwitchbotDevices
117
117
  from switchbot.devices import lock
118
118
  from switchbot.const import SwitchbotModel
119
119
 
120
- BLE_MAC="XX:XX:XX:XX:XX:XX" # The MAC of your lock
121
- KEY_ID="XX" # The key-ID of your encryption-key for your lock
122
- ENC_KEY="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" # The encryption-key with key-ID "XX"
123
- LOCK_MODEL=SwitchbotModel.LOCK_PRO # Your lock model (here we use the Lock-Pro)
120
+ BLE_MAC = "XX:XX:XX:XX:XX:XX" # The MAC of your lock
121
+ KEY_ID = "XX" # The key-ID of your encryption-key for your lock
122
+ ENC_KEY = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" # The encryption-key with key-ID "XX"
123
+ LOCK_MODEL = SwitchbotModel.LOCK_PRO # Your lock model (here we use the Lock-Pro)
124
124
 
125
125
 
126
126
  async def main():
@@ -62,10 +62,10 @@ from switchbot.discovery import GetSwitchbotDevices
62
62
  from switchbot.devices import lock
63
63
  from switchbot.const import SwitchbotModel
64
64
 
65
- BLE_MAC="XX:XX:XX:XX:XX:XX" # The MAC of your lock
66
- KEY_ID="XX" # The key-ID of your encryption-key for your lock
67
- ENC_KEY="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" # The encryption-key with key-ID "XX"
68
- LOCK_MODEL=SwitchbotModel.LOCK_PRO # Your lock model (here we use the Lock-Pro)
65
+ BLE_MAC = "XX:XX:XX:XX:XX:XX" # The MAC of your lock
66
+ KEY_ID = "XX" # The key-ID of your encryption-key for your lock
67
+ ENC_KEY = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" # The encryption-key with key-ID "XX"
68
+ LOCK_MODEL = SwitchbotModel.LOCK_PRO # Your lock model (here we use the Lock-Pro)
69
69
 
70
70
 
71
71
  async def main():
@@ -86,10 +86,10 @@ from switchbot.discovery import GetSwitchbotDevices
86
86
  from switchbot.devices import lock
87
87
  from switchbot.const import SwitchbotModel
88
88
 
89
- BLE_MAC="XX:XX:XX:XX:XX:XX" # The MAC of your lock
90
- KEY_ID="XX" # The key-ID of your encryption-key for your lock
91
- ENC_KEY="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" # The encryption-key with key-ID "XX"
92
- LOCK_MODEL=SwitchbotModel.LOCK_PRO # Your lock model (here we use the Lock-Pro)
89
+ BLE_MAC = "XX:XX:XX:XX:XX:XX" # The MAC of your lock
90
+ KEY_ID = "XX" # The key-ID of your encryption-key for your lock
91
+ ENC_KEY = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" # The encryption-key with key-ID "XX"
92
+ LOCK_MODEL = SwitchbotModel.LOCK_PRO # Your lock model (here we use the Lock-Pro)
93
93
 
94
94
 
95
95
  async def main():
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "PySwitchbot"
3
- version = "2.6.0"
3
+ version = "2.7.1"
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.1"
@@ -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
 
@@ -60,7 +60,11 @@ class SwitchbotCeilingLight(SwitchbotSequenceBaseLight):
60
60
  return None
61
61
  _version_info, _data = res
62
62
 
63
- self._state["cw"] = int.from_bytes(_data[3:5], "big")
63
+ color_temp = int.from_bytes(_data[3:5], "big")
64
+ if self.min_temp <= color_temp <= self.max_temp:
65
+ self._state["cw"] = color_temp
66
+ else:
67
+ self._state.setdefault("cw", DEFAULT_COLOR_TEMP)
64
68
 
65
69
  return {
66
70
  "isOn": bool(_data[1] & 0b10000000),
@@ -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