pymammotion 0.4.54__tar.gz → 0.4.56__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.

Potentially problematic release.


This version of pymammotion might be problematic. Click here for more details.

Files changed (129) hide show
  1. {pymammotion-0.4.54 → pymammotion-0.4.56}/PKG-INFO +1 -1
  2. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/aliyun/client.py +2 -1
  3. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/data/state_manager.py +3 -3
  4. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/http/http.py +15 -3
  5. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/mammotion/commands/messages/system.py +1 -0
  6. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/mammotion/devices/mammotion_bluetooth.py +2 -1
  7. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/mammotion/devices/mammotion_cloud.py +2 -1
  8. {pymammotion-0.4.54 → pymammotion-0.4.56}/pyproject.toml +2 -2
  9. {pymammotion-0.4.54 → pymammotion-0.4.56}/LICENSE +0 -0
  10. {pymammotion-0.4.54 → pymammotion-0.4.56}/README.md +0 -0
  11. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/__init__.py +0 -0
  12. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/aliyun/__init__.py +0 -0
  13. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/aliyun/cloud_gateway.py +0 -0
  14. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/aliyun/model/aep_response.py +0 -0
  15. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/aliyun/model/connect_response.py +0 -0
  16. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/aliyun/model/dev_by_account_response.py +0 -0
  17. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/aliyun/model/login_by_oauth_response.py +0 -0
  18. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/aliyun/model/regions_response.py +0 -0
  19. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/aliyun/model/session_by_authcode_response.py +0 -0
  20. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/aliyun/regions.py +0 -0
  21. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/aliyun/tea/core.py +0 -0
  22. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/aliyun/tmp_constant.py +0 -0
  23. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/bluetooth/__init__.py +0 -0
  24. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/bluetooth/ble.py +0 -0
  25. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/bluetooth/ble_message.py +0 -0
  26. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/bluetooth/const.py +0 -0
  27. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/bluetooth/data/__init__.py +0 -0
  28. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/bluetooth/data/convert.py +0 -0
  29. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/bluetooth/data/framectrldata.py +0 -0
  30. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/bluetooth/data/notifydata.py +0 -0
  31. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/bluetooth/model/__init__.py +0 -0
  32. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/bluetooth/model/atomic_integer.py +0 -0
  33. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/const.py +0 -0
  34. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/data/__init__.py +0 -0
  35. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/data/model/__init__.py +0 -0
  36. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/data/model/account.py +0 -0
  37. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/data/model/device.py +0 -0
  38. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/data/model/device_config.py +0 -0
  39. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/data/model/device_info.py +0 -0
  40. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/data/model/device_limits.py +0 -0
  41. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/data/model/enums.py +0 -0
  42. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/data/model/excute_boarder_params.py +0 -0
  43. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/data/model/execute_boarder.py +0 -0
  44. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/data/model/generate_route_information.py +0 -0
  45. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/data/model/hash_list.py +0 -0
  46. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/data/model/location.py +0 -0
  47. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/data/model/mowing_modes.py +0 -0
  48. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/data/model/rapid_state.py +0 -0
  49. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/data/model/raw_data.py +0 -0
  50. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/data/model/region_data.py +0 -0
  51. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/data/model/report_info.py +0 -0
  52. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/data/model/work.py +0 -0
  53. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/data/mqtt/__init__.py +0 -0
  54. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/data/mqtt/event.py +0 -0
  55. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/data/mqtt/properties.py +0 -0
  56. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/data/mqtt/status.py +0 -0
  57. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/event/__init__.py +0 -0
  58. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/event/event.py +0 -0
  59. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/http/__init__.py +0 -0
  60. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/http/_init_.py +0 -0
  61. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/http/encryption.py +0 -0
  62. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/http/model/__init__.py +0 -0
  63. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/http/model/camera_stream.py +0 -0
  64. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/http/model/http.py +0 -0
  65. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/mammotion/__init__.py +0 -0
  66. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/mammotion/commands/__init__.py +0 -0
  67. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/mammotion/commands/abstract_message.py +0 -0
  68. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/mammotion/commands/mammotion_command.py +0 -0
  69. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/mammotion/commands/messages/__init__.py +0 -0
  70. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/mammotion/commands/messages/driver.py +0 -0
  71. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/mammotion/commands/messages/media.py +0 -0
  72. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/mammotion/commands/messages/navigation.py +0 -0
  73. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/mammotion/commands/messages/network.py +0 -0
  74. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/mammotion/commands/messages/ota.py +0 -0
  75. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/mammotion/commands/messages/video.py +0 -0
  76. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/mammotion/control/__init__.py +0 -0
  77. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/mammotion/control/joystick.py +0 -0
  78. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/mammotion/devices/__init__.py +0 -0
  79. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/mammotion/devices/base.py +0 -0
  80. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/mammotion/devices/mammotion.py +0 -0
  81. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/mqtt/__init__.py +0 -0
  82. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/mqtt/linkkit/__init__.py +0 -0
  83. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/mqtt/linkkit/h2client.py +0 -0
  84. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/mqtt/linkkit/linkkit.py +0 -0
  85. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/mqtt/mammotion_future.py +0 -0
  86. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/mqtt/mammotion_mqtt.py +0 -0
  87. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/__init__.py +0 -0
  88. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/basestation.proto +0 -0
  89. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/basestation_pb2.py +0 -0
  90. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/basestation_pb2.pyi +0 -0
  91. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/common.proto +0 -0
  92. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/common_pb2.py +0 -0
  93. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/common_pb2.pyi +0 -0
  94. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/dev_net.proto +0 -0
  95. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/dev_net_pb2.py +0 -0
  96. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/dev_net_pb2.pyi +0 -0
  97. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/luba_msg.proto +0 -0
  98. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/luba_msg_pb2.py +0 -0
  99. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/luba_msg_pb2.pyi +0 -0
  100. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/luba_mul.proto +0 -0
  101. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/luba_mul_pb2.py +0 -0
  102. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/luba_mul_pb2.pyi +0 -0
  103. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/mctrl_driver.proto +0 -0
  104. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/mctrl_driver_pb2.py +0 -0
  105. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/mctrl_driver_pb2.pyi +0 -0
  106. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/mctrl_nav.proto +0 -0
  107. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/mctrl_nav_pb2.py +0 -0
  108. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/mctrl_nav_pb2.pyi +0 -0
  109. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/mctrl_ota.proto +0 -0
  110. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/mctrl_ota_pb2.py +0 -0
  111. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/mctrl_ota_pb2.pyi +0 -0
  112. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/mctrl_pept.proto +0 -0
  113. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/mctrl_pept_pb2.py +0 -0
  114. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/mctrl_pept_pb2.pyi +0 -0
  115. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/mctrl_sys.proto +0 -0
  116. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/mctrl_sys_pb2.py +0 -0
  117. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/proto/mctrl_sys_pb2.pyi +0 -0
  118. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/py.typed +0 -0
  119. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/utility/constant/__init__.py +0 -0
  120. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/utility/constant/device_constant.py +0 -0
  121. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/utility/conversions.py +0 -0
  122. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/utility/datatype_converter.py +0 -0
  123. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/utility/device_config.py +0 -0
  124. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/utility/device_type.py +0 -0
  125. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/utility/map.py +0 -0
  126. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/utility/movement.py +0 -0
  127. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/utility/mur_mur_hash.py +0 -0
  128. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/utility/periodic.py +0 -0
  129. {pymammotion-0.4.54 → pymammotion-0.4.56}/pymammotion/utility/rocker_util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pymammotion
3
- Version: 0.4.54
3
+ Version: 0.4.56
4
4
  Summary:
5
5
  License: GPL-3.0
6
6
  Author: Michael Arthur
@@ -1,3 +1,4 @@
1
+ from datetime import UTC, datetime
1
2
  import time
2
3
 
3
4
  from Tea.exceptions import UnretryableException
@@ -103,7 +104,7 @@ class Client:
103
104
  _request.headers = TeaCore.merge(
104
105
  {
105
106
  "host": self._domain,
106
- "date": UtilClient.get_date_utcstring(),
107
+ "date": datetime.now(UTC).strftime("%a, %d %b %Y %H:%M:%S GMT"),
107
108
  "x-ca-nonce": UtilClient.get_nonce(),
108
109
  "x-ca-key": self._app_key,
109
110
  "x-ca-signaturemethod": "HmacSHA256",
@@ -1,7 +1,7 @@
1
1
  """Manage state from notifications into MowingDevice."""
2
2
 
3
3
  from collections.abc import Awaitable, Callable
4
- from datetime import datetime
4
+ from datetime import UTC, datetime
5
5
  import logging
6
6
  from typing import Any
7
7
 
@@ -41,7 +41,7 @@ class StateManager:
41
41
 
42
42
  def __init__(self, device: MowingDevice) -> None:
43
43
  self._device: MowingDevice = device
44
- self.last_updated_at = datetime.now()
44
+ self.last_updated_at = datetime.now(UTC)
45
45
  self.preference = ConnectionPreference.WIFI
46
46
  self.cloud_gethash_ack_callback: Callable[[NavGetHashListAck], Awaitable[None]] | None = None
47
47
  self.cloud_get_commondata_ack_callback: (
@@ -115,7 +115,7 @@ class StateManager:
115
115
  async def notification(self, message: LubaMsg) -> None:
116
116
  """Handle protobuf notifications."""
117
117
  res = betterproto.which_one_of(message, "LubaSubMsg")
118
- self.last_updated_at = datetime.now()
118
+ self.last_updated_at = datetime.now(UTC)
119
119
  # additional catch all if we don't get a status update
120
120
  if not self._device.online:
121
121
  self._device.online = True
@@ -106,7 +106,11 @@ class MammotionHTTP:
106
106
  data = await resp.json()
107
107
  # TODO catch errors from mismatch like token expire etc
108
108
  # Assuming the data format matches the expected structure
109
- return Response[StreamSubscriptionResponse].from_dict(data)
109
+ response = Response[StreamSubscriptionResponse].from_dict(data)
110
+ if response.code != 0:
111
+ return response
112
+ response.data = StreamSubscriptionResponse.from_dict(data.get("data", {}))
113
+ return response
110
114
 
111
115
  async def get_stream_subscription_mini_or_x_series(
112
116
  self, iot_id: str, is_yuka: bool
@@ -135,7 +139,11 @@ class MammotionHTTP:
135
139
  data = await resp.json()
136
140
  # TODO catch errors from mismatch like token expire etc
137
141
  # Assuming the data format matches the expected structure
138
- return Response[StreamSubscriptionResponse].from_dict(data)
142
+ response = Response[StreamSubscriptionResponse].from_dict(data)
143
+ if response.code != 0:
144
+ return response
145
+ response.data = StreamSubscriptionResponse.from_dict(data.get("data", {}))
146
+ return response
139
147
 
140
148
  async def get_video_resource(self, iot_id: str) -> Response[VideoResourceResponse]:
141
149
  """Get video resource for new models (2025 series)"""
@@ -151,7 +159,11 @@ class MammotionHTTP:
151
159
  data = await resp.json()
152
160
  # TODO catch errors from mismatch like token expire etc
153
161
  # Assuming the data format matches the expected structure
154
- return Response[VideoResourceResponse].from_dict(data)
162
+ response = Response[VideoResourceResponse].from_dict(data)
163
+ if response.code != 0:
164
+ return response
165
+ response.data = VideoResourceResponse.from_dict(data.get("data", {}))
166
+ return response
155
167
 
156
168
  async def refresh_login(self, account: str, password: str | None = None) -> Response[LoginResponseData]:
157
169
  if self._password is None and password is not None:
@@ -202,6 +202,7 @@ class MessageSystem(AbstractMessage, ABC):
202
202
  # return self.send_order_msg_sys(build2)
203
203
 
204
204
  def send_sys_set_date_time(self) -> bytes:
205
+ # TODO get HA timezone
205
206
  calendar = datetime.datetime.now()
206
207
  i = calendar.year
207
208
  i2 = calendar.month
@@ -345,7 +345,8 @@ class MammotionBaseBLEDevice(MammotionBaseDevice):
345
345
  return
346
346
 
347
347
  new_msg = LubaMsg().parse(data)
348
- if betterproto.serialized_on_wire(new_msg.net):
348
+ res = betterproto.which_one_of(new_msg, "LubaSubMsg")
349
+ if res[0] == "net":
349
350
  if new_msg.net.todev_ble_sync != 0 or has_field(new_msg.net.toapp_wifi_iot_status):
350
351
  if has_field(new_msg.net.toapp_wifi_iot_status) and self._commands.get_device_product_key() == "":
351
352
  self._commands.set_device_product_key(new_msg.net.toapp_wifi_iot_status.productkey)
@@ -326,7 +326,8 @@ class MammotionBaseCloudDevice(MammotionBaseDevice):
326
326
  ):
327
327
  self._commands.set_device_product_key(event.params.productKey)
328
328
 
329
- if betterproto.serialized_on_wire(new_msg.net):
329
+ res = betterproto.which_one_of(new_msg, "LubaSubMsg")
330
+ if res[0] == "net":
330
331
  if new_msg.net.todev_ble_sync != 0 or has_field(new_msg.net.toapp_wifi_iot_status):
331
332
  return
332
333
 
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [project]
6
6
  name = "pymammotion"
7
- version = "0.4.54"
7
+ version = "0.4.56"
8
8
  license = "GPL-3.0"
9
9
  description = ""
10
10
  readme = "README.md"
@@ -66,7 +66,7 @@ autotyping = "^24.3.0"
66
66
  ipython = "^9.0.2"
67
67
 
68
68
  [tool.bumpver]
69
- current_version = "0.4.54"
69
+ current_version = "0.4.56"
70
70
  version_pattern = "MAJOR.MINOR.PATCH"
71
71
  commit_message = "Bump version {old_version} -> {new_version}"
72
72
  commit = true
File without changes
File without changes