pymammotion 0.2.31__py3-none-any.whl → 0.2.32__py3-none-any.whl

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.
@@ -593,6 +593,7 @@ class CloudIOTGateway:
593
593
  logger.debug(response.headers)
594
594
  logger.debug(response.status_code)
595
595
  logger.debug(response.body)
596
+ logger.debug(iot_id)
596
597
 
597
598
  response_body_str = response.body.decode("utf-8")
598
599
  response_body_dict = json.loads(response_body_str)
@@ -635,5 +636,5 @@ class CloudIOTGateway:
635
636
  return self._client_id
636
637
 
637
638
  @property
638
- def login_by_oath_response(self):
639
+ def login_by_oauth_response(self):
639
640
  return self._login_by_oauth_response
@@ -1,4 +1,4 @@
1
- from dataclasses import dataclass
1
+ from dataclasses import dataclass, field
2
2
 
3
3
  from pymammotion.utility.device_type import DeviceType
4
4
 
@@ -35,6 +35,7 @@ class OperationSettings:
35
35
  border_mode: int = 1 # border laps
36
36
  obstacle_laps: int = 1
37
37
  start_progress: int = 0
38
+ areas: list[int] = field(default_factory=list)
38
39
 
39
40
 
40
41
  def create_path_order(operation_mode: OperationSettings, device_name: str) -> str:
@@ -59,7 +60,7 @@ def create_path_order(operation_mode: OperationSettings, device_name: str) -> st
59
60
  bArr[6] = b
60
61
  if DeviceType.is_luba1(device_name):
61
62
  bArr[4] = operation_mode.toward_mode
62
- return str(bArr, "UTF-8")
63
+ return bArr.decode()
63
64
 
64
65
 
65
66
  def calculate_yuka_mode(operation_mode: OperationSettings) -> int:
@@ -1,7 +1,7 @@
1
- from dataclasses import dataclass
1
+ from dataclasses import dataclass, field
2
2
  from enum import IntEnum
3
3
 
4
- from pymammotion.proto.mctrl_nav import NavGetCommDataAck
4
+ from pymammotion.proto.mctrl_nav import NavGetCommDataAck, AreaHashName
5
5
 
6
6
 
7
7
  class PathType(IntEnum):
@@ -24,11 +24,11 @@ class HashList:
24
24
  [hashID, FrameList].
25
25
  hashlist for all our hashIDs for verification
26
26
  """
27
-
28
27
  area: dict # type 0
29
28
  path: dict # type 2
30
29
  obstacle: dict # type 1
31
30
  hashlist: list[int]
31
+ area_name: list[AreaHashName] = field(default_factory=list)
32
32
 
33
33
  def set_hashlist(self, hashlist: list[int]) -> None:
34
34
  self.hashlist = hashlist
@@ -49,6 +49,9 @@ class HashList:
49
49
  def update(self, hash_data: NavGetCommDataAck) -> bool:
50
50
  """Update the map data."""
51
51
  if hash_data.type == PathType.AREA:
52
+ existing_name = next((area for area in self.area_name if area.hash == hash_data.hash), None)
53
+ if not existing_name:
54
+ self.area_name.append(AreaHashName(name=f"area {len(self.area_name)+1}", hash=hash_data.hash))
52
55
  return self._add_hash_data(self.area, hash_data)
53
56
 
54
57
  if hash_data.type == PathType.OBSTACLE:
@@ -43,7 +43,7 @@ class BypassStrategy(IntEnum):
43
43
  direct_touch = 0
44
44
  slow_touch = 1
45
45
  less_touch = 2
46
- no_touch = 3 # luba 2 yuka only or possibly value of 10
46
+ no_touch = 10 # luba 2 yuka only or possibly value of 10
47
47
 
48
48
 
49
49
  class PathAngleSetting(IntEnum):
@@ -1,6 +1,7 @@
1
+ import base64
1
2
  from base64 import b64decode
2
3
  from dataclasses import dataclass
3
- from typing import Any, Literal, Optional, Union
4
+ from typing import Any, Literal, Optional, Union, Mapping
4
5
 
5
6
  from google.protobuf import json_format
6
7
  from mashumaro.mixins.orjson import DataClassORJSONMixin
@@ -36,7 +37,9 @@ class Base64EncodedProtobuf(SerializableType):
36
37
 
37
38
  @dataclass
38
39
  class DeviceProtobufMsgEventValue(DataClassORJSONMixin):
39
- content: Base64EncodedProtobuf
40
+ content: str
41
+
42
+
40
43
 
41
44
 
42
45
  @dataclass
@@ -61,7 +64,7 @@ class DeviceNotificationEventCode(DataClassORJSONMixin):
61
64
 
62
65
  @dataclass
63
66
  class DeviceNotificationEventValue(DataClassORJSONMixin):
64
- data: DeviceNotificationEventCode
67
+ data: str # parsed to DeviceNotificationEventCode
65
68
 
66
69
 
67
70
  @dataclass
@@ -147,15 +150,15 @@ class ThingEventMessage(DataClassORJSONMixin):
147
150
  identifier = params_dict.get("identifier")
148
151
  if identifier is None:
149
152
  """Request configuration event."""
150
- params_obj = DeviceConfigurationRequestEvent(**params_dict)
153
+ params_obj = DeviceConfigurationRequestEvent.from_dict(params_dict)
151
154
  elif identifier == "device_protobuf_msg_event":
152
- params_obj = DeviceProtobufMsgEventParams(**params_dict)
155
+ params_obj = DeviceProtobufMsgEventParams.from_dict(params_dict)
153
156
  elif identifier == "device_warning_event":
154
- params_obj = DeviceWarningEventParams(**params_dict)
157
+ params_obj = DeviceWarningEventParams.from_dict(params_dict)
155
158
  elif identifier == "device_config_req_event":
156
159
  params_obj = payload.get("params", {})
157
160
  elif identifier == "device_notification_event":
158
- params_obj = DeviceNotificationEventParams(**params_dict)
161
+ params_obj = DeviceNotificationEventParams.from_dict(params_dict)
159
162
  else:
160
163
  raise ValueError(f"Unknown identifier: {identifier} {params_dict}")
161
164
 
@@ -6,7 +6,7 @@ import betterproto
6
6
 
7
7
  from pymammotion.data.model.device import MowingDevice
8
8
  from pymammotion.proto.luba_msg import LubaMsg
9
- from pymammotion.proto.mctrl_nav import NavGetCommDataAck, NavGetHashListAck
9
+ from pymammotion.proto.mctrl_nav import NavGetCommDataAck, NavGetHashListAck, AppGetAllAreaHashName
10
10
 
11
11
 
12
12
  class StateManager:
@@ -62,6 +62,10 @@ class StateManager:
62
62
  updated = self._device.map.update(common_data)
63
63
  if updated:
64
64
  await self.get_commondata_ack_callback(common_data)
65
+ case "toapp_all_hash_name":
66
+ hash_names: AppGetAllAreaHashName = nav_msg[1]
67
+ self._device.map.area_name = hash_names.hashnames
68
+
65
69
 
66
70
  def _update_sys_data(self, message) -> None:
67
71
  """Update system."""
@@ -1,4 +1,5 @@
1
1
  import asyncio
2
+ from typing import Any
2
3
 
3
4
 
4
5
  class Event:
@@ -54,9 +55,12 @@ class DataEvent:
54
55
  def __init__(self) -> None:
55
56
  self.on_data_event = Event()
56
57
 
57
- async def data_event(self, data) -> None:
58
+ async def data_event(self, data: Any) -> None:
58
59
  # This function will be executed when data is received.
59
- await self.on_data_event(data)
60
+ if data:
61
+ await self.on_data_event(data)
62
+ else:
63
+ await self.on_data_event(None)
60
64
 
61
65
  def add_subscribers(self, obj_method) -> None:
62
66
  self.on_data_event += obj_method
@@ -375,20 +375,21 @@ class MessageNavigation(AbstractMessage, ABC):
375
375
 
376
376
  def generate_route_information(self, generate_route_information: GenerateRouteInformation) -> bytes:
377
377
  logger.debug(f"Generate route data source:{generate_route_information}")
378
+
378
379
  build = NavReqCoverPath(
379
380
  pver=1,
380
381
  sub_cmd=0,
381
382
  zone_hashs=generate_route_information.one_hashs,
382
- job_mode=generate_route_information.job_mode,
383
- edge_mode=generate_route_information.edge_mode,
384
- knife_height=generate_route_information.blade_height,
385
- speed=generate_route_information.speed,
386
- ultra_wave=generate_route_information.ultra_wave,
387
- channel_width=generate_route_information.channel_width,
388
- channel_mode=generate_route_information.channel_mode,
389
- toward=generate_route_information.toward,
390
- toward_included_angle=generate_route_information.toward_included_angle, # luba 2 yuka only
391
- toward_mode=generate_route_information.toward_mode, # luba 2 yuka only
383
+ job_mode=int(generate_route_information.job_mode),
384
+ edge_mode=int(generate_route_information.edge_mode),
385
+ knife_height=int(generate_route_information.blade_height),
386
+ speed=float(generate_route_information.speed),
387
+ ultra_wave=int(generate_route_information.ultra_wave),
388
+ channel_width=int(generate_route_information.channel_width),
389
+ channel_mode=int(generate_route_information.channel_mode),
390
+ toward=int(generate_route_information.toward),
391
+ toward_included_angle=int(generate_route_information.toward_included_angle), # luba 2 yuka only
392
+ toward_mode=int(generate_route_information.toward_mode), # luba 2 yuka only
392
393
  reserved=generate_route_information.path_order,
393
394
  )
394
395
  logger.debug(f"{self.get_device_name()}Generate route====={build}")
@@ -402,14 +403,14 @@ class MessageNavigation(AbstractMessage, ABC):
402
403
  pver=1,
403
404
  sub_cmd=3,
404
405
  zone_hashs=generate_route_information.one_hashs,
405
- job_mode=generate_route_information.job_mode,
406
- edge_mode=generate_route_information.edge_mode,
407
- knife_height=generate_route_information.blade_height,
408
- speed=generate_route_information.speed,
409
- ultra_wave=generate_route_information.ultra_wave,
410
- channel_width=generate_route_information.channel_width,
411
- channel_mode=generate_route_information.channel_mode,
412
- toward=generate_route_information.toward,
406
+ job_mode=int(generate_route_information.job_mode),
407
+ edge_mode=int(generate_route_information.edge_mode),
408
+ knife_height=int(generate_route_information.blade_height),
409
+ speed=float(generate_route_information.speed),
410
+ ultra_wave=int(generate_route_information.ultra_wave),
411
+ channel_width=int(generate_route_information.channel_width),
412
+ channel_mode=int(generate_route_information.channel_mode),
413
+ toward=int(generate_route_information.toward),
413
414
  reserved=generate_route_information.path_order,
414
415
  )
415
416
  logger.debug(f"{self.get_device_name()} Generate route ===== {build}")
@@ -5,13 +5,14 @@ from typing import Any, Awaitable, Callable
5
5
 
6
6
  import betterproto
7
7
 
8
- from pymammotion.aliyun.dataclass.connect_response import Device
8
+ from pymammotion.aliyun.dataclass.dev_by_account_response import Device
9
9
  from pymammotion.data.model import RegionData
10
10
  from pymammotion.data.model.device import MowingDevice
11
11
  from pymammotion.data.state_manager import StateManager
12
12
  from pymammotion.proto import has_field
13
13
  from pymammotion.proto.luba_msg import LubaMsg
14
14
  from pymammotion.proto.mctrl_nav import NavGetCommDataAck, NavGetHashListAck
15
+ from pymammotion.utility.device_type import DeviceType
15
16
  from pymammotion.utility.movement import get_percent, transform_both_speeds
16
17
 
17
18
  _LOGGER = logging.getLogger(__name__)
@@ -197,17 +198,30 @@ class MammotionBaseDevice:
197
198
 
198
199
  async def start_map_sync(self) -> None:
199
200
  """Start sync of map data."""
201
+ try:
202
+ # work out why this crashes sometimes for better proto
203
+
204
+ if self._cloud_device:
205
+ if not DeviceType.is_luba1(self._cloud_device.deviceName, self._cloud_device.productKey):
206
+ await self.queue_command("get_area_name_list", device_id=self._cloud_device.deviceName)
207
+ if has_field(self._mower.net.toapp_wifi_iot_status):
208
+ if not DeviceType.is_luba1(self._mower.net.toapp_wifi_iot_status.devicename):
209
+ await self.queue_command("get_area_name_list",
210
+ device_id=self._mower.net.toapp_wifi_iot_status.devicename)
211
+ except Exception:
212
+ """Do nothing for now."""
213
+
200
214
  await self.queue_command("read_plan", sub_cmd=2, plan_index=0)
201
215
 
202
- await self.queue_command("get_all_boundary_hash_list", sub_cmd=0)
216
+ if not has_field(self.mower.nav.toapp_gethash_ack):
217
+ await self.queue_command("get_all_boundary_hash_list", sub_cmd=0)
218
+ await self.queue_command("get_hash_response", total_frame=1, current_frame=1)
219
+ else:
220
+ for data_hash in self.mower.nav.toapp_gethash_ack.data_couple:
221
+ await self.queue_command("synchronize_hash_data", hash_num=data_hash)
222
+
203
223
 
204
- await self.queue_command("get_hash_response", total_frame=1, current_frame=1)
205
224
 
206
- # work out why this crashes sometimes for better proto
207
- if self._cloud_device:
208
- await self.queue_command("get_area_name_list", device_id=self._cloud_device.deviceName)
209
- if has_field(self._mower.net.toapp_wifi_iot_status):
210
- await self.queue_command("get_area_name_list", device_id=self._mower.net.toapp_wifi_iot_status.devicename)
211
225
 
212
226
  # sub_cmd 3 is job hashes??
213
227
  # sub_cmd 4 is dump location (yuka)
@@ -75,6 +75,9 @@ class MammotionMixedDeviceManager:
75
75
  def replace_ble(self, ble_device: MammotionBaseBLEDevice) -> None:
76
76
  self._ble_device = ble_device
77
77
 
78
+ def replace_mqtt(self, mqtt: MammotionCloud) -> None:
79
+ self._cloud_device._mqtt = mqtt
80
+
78
81
  def has_cloud(self) -> bool:
79
82
  return self._cloud_device is not None
80
83
 
@@ -159,6 +162,10 @@ class Mammotion:
159
162
  self.devices.add_device(
160
163
  MammotionMixedDeviceManager(name=device.deviceName, cloud_device=device, mqtt=self.mqtt)
161
164
  )
165
+ elif device.deviceName.startswith(("Luba-", "Yuka-")) and self.devices.get_device(device.deviceName):
166
+ device = self.devices.get_device(device.deviceName)
167
+ device.replace_mqtt(self.mqtt)
168
+
162
169
 
163
170
  def set_disconnect_strategy(self, disconnect: bool) -> None:
164
171
  for device_name, device in self.devices.devices:
@@ -42,8 +42,10 @@ class MammotionCloud:
42
42
  # temporary for testing only
43
43
  # self._start_sync_task = self.loop.call_later(30, lambda: asyncio.ensure_future(self.start_sync(0)))
44
44
 
45
- def on_ready(self) -> None:
46
- self.on_ready_event.data_event(None)
45
+ async def on_ready(self) -> None:
46
+ loop = asyncio.get_event_loop()
47
+ loop.create_task(self.process_queue())
48
+ await self.on_ready_event.data_event(None)
47
49
 
48
50
  def is_connected(self) -> bool:
49
51
  return self._mqtt_client.is_connected
@@ -63,7 +65,7 @@ class MammotionCloud:
63
65
  async def on_disconnected(self) -> None:
64
66
  """Callback for when MQTT disconnects."""
65
67
 
66
- async def _process_queue(self) -> None:
68
+ async def process_queue(self) -> None:
67
69
  while True:
68
70
  # Get the next item from the queue
69
71
  iot_id, key, command, future = await self.command_queue.get()
@@ -113,7 +115,8 @@ class MammotionCloud:
113
115
  _LOGGER.debug("Thing event received")
114
116
  event = ThingEventMessage.from_dicts(payload)
115
117
  params = event.params
116
- if params.get("identifier", None) is None:
118
+ if isinstance(params, dict) or params.identifier is None:
119
+ _LOGGER.debug("Received dict params: %s", params)
117
120
  return
118
121
  if params.identifier == "device_protobuf_msg_event" and event.method == "thing.events":
119
122
  _LOGGER.debug("Protobuf event")
@@ -158,11 +161,8 @@ class MammotionBaseCloudDevice(MammotionBaseDevice):
158
161
 
159
162
  async def on_ready(self) -> None:
160
163
  """Callback for when MQTT is subscribed to events."""
161
- loop = asyncio.get_event_loop()
162
-
163
164
  await self._ble_sync()
164
165
  await self.run_periodic_sync_task()
165
- loop.create_task(self._process_queue())
166
166
  if self.on_ready_callback:
167
167
  await self.on_ready_callback()
168
168
 
@@ -186,6 +186,7 @@ class MammotionBaseCloudDevice(MammotionBaseDevice):
186
186
  160, lambda: asyncio.ensure_future(self.run_periodic_sync_task())
187
187
  )
188
188
 
189
+
189
190
  async def queue_command(self, key: str, **kwargs: Any) -> bytes:
190
191
  # Create a future to hold the result
191
192
  _LOGGER.debug("Queueing command: %s", key)
@@ -221,9 +222,9 @@ class MammotionBaseCloudDevice(MammotionBaseDevice):
221
222
  params = event.params
222
223
  if event.params.iotId != self.iot_id:
223
224
  return
224
- binary_data = base64.b64decode(params.value.content.proto)
225
- self._update_raw_data(cast(bytes, binary_data))
226
- new_msg = LubaMsg().parse(cast(bytes, binary_data))
225
+ binary_data = base64.b64decode(params.value.content)
226
+ self._update_raw_data(binary_data)
227
+ new_msg = LubaMsg().parse(binary_data)
227
228
 
228
229
  if (
229
230
  self._commands.get_device_product_key() == ""
@@ -175,7 +175,7 @@ class MammotionMQTT:
175
175
  event = ThingEventMessage(**payload)
176
176
  params = event.params
177
177
  if params.identifier == "device_protobuf_msg_event":
178
- content = LubaMsg().parse(base64.b64decode(params.value.content.proto))
178
+ content = LubaMsg().parse(base64.b64decode(params.value.content))
179
179
 
180
180
  logger.info("Unhandled protobuf event: %s", betterproto.which_one_of(content, "LubaSubMsg"))
181
181
  elif params.identifier == "device_warning_event":
@@ -142,7 +142,7 @@ class NavGetHashList(betterproto.Message):
142
142
  sub_cmd: int = betterproto.int32_field(2)
143
143
  total_frame: int = betterproto.int32_field(3)
144
144
  current_frame: int = betterproto.int32_field(4)
145
- data_hash: float = betterproto.fixed64_field(5)
145
+ data_hash: int = betterproto.fixed64_field(5)
146
146
  reserved: str = betterproto.string_field(6)
147
147
 
148
148
 
@@ -152,7 +152,7 @@ class NavGetHashListAck(betterproto.Message):
152
152
  sub_cmd: int = betterproto.int32_field(2)
153
153
  total_frame: int = betterproto.int32_field(3)
154
154
  current_frame: int = betterproto.int32_field(4)
155
- data_hash: float = betterproto.fixed64_field(5)
155
+ data_hash: int = betterproto.fixed64_field(5)
156
156
  hash_len: int = betterproto.int32_field(6)
157
157
  reserved: str = betterproto.string_field(7)
158
158
  result: int = betterproto.int32_field(8)
@@ -170,7 +170,7 @@ class NavGetCommData(betterproto.Message):
170
170
  paternal_hash_b: int = betterproto.int64_field(7)
171
171
  total_frame: int = betterproto.int32_field(8)
172
172
  current_frame: int = betterproto.int32_field(9)
173
- data_hash: float = betterproto.fixed64_field(10)
173
+ data_hash: int = betterproto.fixed64_field(10)
174
174
  reserved: str = betterproto.string_field(11)
175
175
 
176
176
 
@@ -181,12 +181,12 @@ class NavGetCommDataAck(betterproto.Message):
181
181
  result: int = betterproto.int32_field(3)
182
182
  action: int = betterproto.int32_field(4)
183
183
  type: int = betterproto.int32_field(5)
184
- hash: float = betterproto.fixed64_field(6)
185
- paternal_hash_a: float = betterproto.fixed64_field(7)
186
- paternal_hash_b: float = betterproto.fixed64_field(8)
184
+ hash: int = betterproto.fixed64_field(6)
185
+ paternal_hash_a: int = betterproto.fixed64_field(7)
186
+ paternal_hash_b: int = betterproto.fixed64_field(8)
187
187
  total_frame: int = betterproto.int32_field(9)
188
188
  current_frame: int = betterproto.int32_field(10)
189
- data_hash: float = betterproto.fixed64_field(11)
189
+ data_hash: int = betterproto.fixed64_field(11)
190
190
  data_len: int = betterproto.int32_field(12)
191
191
  data_couple: list["CommDataCouple"] = betterproto.message_field(13)
192
192
  reserved: str = betterproto.string_field(14)
@@ -206,8 +206,8 @@ class NavReqCoverPath(betterproto.Message):
206
206
  channel_mode: int = betterproto.int32_field(10)
207
207
  toward: int = betterproto.int32_field(11)
208
208
  speed: float = betterproto.float_field(12)
209
- zone_hashs: list[float] = betterproto.fixed64_field(13)
210
- path_hash: float = betterproto.fixed64_field(14)
209
+ zone_hashs: list[int] = betterproto.fixed64_field(13)
210
+ path_hash: int = betterproto.fixed64_field(14)
211
211
  reserved: str = betterproto.string_field(15)
212
212
  result: int = betterproto.int32_field(16)
213
213
  toward_mode: int = betterproto.int32_field(17)
@@ -226,12 +226,12 @@ class NavUploadZigZagResult(betterproto.Message):
226
226
  current_zone_path_num: int = betterproto.int32_field(8)
227
227
  current_zone_path_id: int = betterproto.int32_field(9)
228
228
  current_zone: int = betterproto.int32_field(10)
229
- current_hash: float = betterproto.fixed64_field(11)
229
+ current_hash: int = betterproto.fixed64_field(11)
230
230
  total_frame: int = betterproto.int32_field(12)
231
231
  current_frame: int = betterproto.int32_field(13)
232
232
  channel_mode: int = betterproto.int32_field(14)
233
233
  channel_mode_id: int = betterproto.int32_field(15)
234
- data_hash: float = betterproto.fixed64_field(16)
234
+ data_hash: int = betterproto.fixed64_field(16)
235
235
  data_len: int = betterproto.int32_field(17)
236
236
  reserved: str = betterproto.string_field(18)
237
237
  data_couple: list["CommDataCouple"] = betterproto.message_field(19)
@@ -242,10 +242,10 @@ class NavUploadZigZagResult(betterproto.Message):
242
242
  class NavUploadZigZagResultAck(betterproto.Message):
243
243
  pver: int = betterproto.int32_field(1)
244
244
  current_zone: int = betterproto.int32_field(2)
245
- current_hash: float = betterproto.fixed64_field(3)
245
+ current_hash: int = betterproto.fixed64_field(3)
246
246
  total_frame: int = betterproto.int32_field(4)
247
247
  current_frame: int = betterproto.int32_field(5)
248
- data_hash: float = betterproto.fixed64_field(6)
248
+ data_hash: int = betterproto.fixed64_field(6)
249
249
  reserved: str = betterproto.string_field(7)
250
250
  sub_cmd: int = betterproto.int32_field(8)
251
251
 
@@ -270,8 +270,8 @@ class NavTaskIdRw(betterproto.Message):
270
270
 
271
271
  @dataclass
272
272
  class NavSysHashOverview(betterproto.Message):
273
- commonhash_overview: float = betterproto.fixed64_field(1)
274
- path_hash_overview: float = betterproto.fixed64_field(2)
273
+ commonhash_overview: int = betterproto.fixed64_field(1)
274
+ path_hash_overview: int = betterproto.fixed64_field(2)
275
275
 
276
276
 
277
277
  @dataclass
@@ -281,7 +281,7 @@ class NavTaskBreakPoint(betterproto.Message):
281
281
  toward: int = betterproto.int32_field(3)
282
282
  flag: int = betterproto.int32_field(4)
283
283
  action: int = betterproto.int32_field(5)
284
- zone_hash: float = betterproto.fixed64_field(6)
284
+ zone_hash: int = betterproto.fixed64_field(6)
285
285
 
286
286
 
287
287
  @dataclass
@@ -314,13 +314,13 @@ class NavPlanJobSet(betterproto.Message):
314
314
  speed: float = betterproto.float_field(26)
315
315
  task_name: str = betterproto.string_field(27)
316
316
  job_name: str = betterproto.string_field(28)
317
- zone_hashs: list[float] = betterproto.fixed64_field(29)
317
+ zone_hashs: list[int] = betterproto.fixed64_field(29)
318
318
  reserved: str = betterproto.string_field(30)
319
319
  start_date: str = betterproto.string_field(31)
320
320
  end_date: str = betterproto.string_field(32)
321
321
  trigger_type: int = betterproto.int32_field(33)
322
322
  day: int = betterproto.int32_field(34)
323
- weeks: list[float] = betterproto.fixed32_field(35)
323
+ weeks: list[int] = betterproto.fixed32_field(35)
324
324
  remained_seconds: int = betterproto.int64_field(36)
325
325
  toward_mode: int = betterproto.int32_field(37)
326
326
  toward_included_angle: int = betterproto.int32_field(38)
@@ -388,19 +388,19 @@ class AppRequestCoverPathsT(betterproto.Message):
388
388
  sub_cmd: int = betterproto.int32_field(2)
389
389
  total_frame: int = betterproto.int32_field(3)
390
390
  current_frame: int = betterproto.int32_field(4)
391
- data_hash: float = betterproto.fixed64_field(5)
391
+ data_hash: int = betterproto.fixed64_field(5)
392
392
  transaction_id: int = betterproto.int64_field(6)
393
393
  reserved: list[int] = betterproto.int64_field(7)
394
- hash_list: list[float] = betterproto.fixed64_field(8)
394
+ hash_list: list[int] = betterproto.fixed64_field(8)
395
395
 
396
396
 
397
397
  @dataclass
398
398
  class CoverPathPacketT(betterproto.Message):
399
- path_hash: float = betterproto.fixed64_field(1)
399
+ path_hash: int = betterproto.fixed64_field(1)
400
400
  path_type: int = betterproto.int32_field(2)
401
401
  path_total: int = betterproto.int32_field(3)
402
402
  path_cur: int = betterproto.int32_field(4)
403
- zone_hash: float = betterproto.fixed64_field(5)
403
+ zone_hash: int = betterproto.fixed64_field(5)
404
404
  data_couple: list["CommDataCouple"] = betterproto.message_field(6)
405
405
 
406
406
 
@@ -415,7 +415,7 @@ class CoverPathUploadT(betterproto.Message):
415
415
  current_frame: int = betterproto.int32_field(7)
416
416
  total_path_num: int = betterproto.int32_field(8)
417
417
  vaild_path_num: int = betterproto.int32_field(9)
418
- data_hash: float = betterproto.fixed64_field(10)
418
+ data_hash: int = betterproto.fixed64_field(10)
419
419
  transaction_id: int = betterproto.int64_field(11)
420
420
  reserved: list[int] = betterproto.int64_field(12)
421
421
  data_len: int = betterproto.int32_field(13)
@@ -424,7 +424,7 @@ class CoverPathUploadT(betterproto.Message):
424
424
 
425
425
  @dataclass
426
426
  class ZoneStartPrecentT(betterproto.Message):
427
- data_hash: float = betterproto.fixed64_field(1)
427
+ data_hash: int = betterproto.fixed64_field(1)
428
428
  x: float = betterproto.float_field(2)
429
429
  y: float = betterproto.float_field(3)
430
430
  index: int = betterproto.int32_field(4)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pymammotion
3
- Version: 0.2.31
3
+ Version: 0.2.32
4
4
  Summary:
5
5
  License: GNU-3.0
6
6
  Author: Michael Arthur
@@ -1,6 +1,6 @@
1
1
  pymammotion/__init__.py,sha256=jHCQrpJaG1jAoID9T4RT3g4JsZc0JpJqIcqjnA7cXd0,1605
2
2
  pymammotion/aliyun/__init__.py,sha256=T1lkX7TRYiL4nqYanG4l4MImV-SlavSbuooC-W-uUGw,29
3
- pymammotion/aliyun/cloud_gateway.py,sha256=d2A4F-bCZD4Oz4wdBdyFBKBvFf1GZxCKvFRcDDpczRs,22686
3
+ pymammotion/aliyun/cloud_gateway.py,sha256=Fktzd7ej9b02hr0Dl82_EgUkDCCzWqcp92_wd8D2vaw,22716
4
4
  pymammotion/aliyun/cloud_service.py,sha256=px7dUKow5Z7VyebjYzuKkzkm77XbUXYiFiYO_2e-UQ0,2207
5
5
  pymammotion/aliyun/dataclass/aep_response.py,sha256=8f6GIP58ve8gd6AL3HBoXxsy0n2q4ygWvjELGnoOnVc,452
6
6
  pymammotion/aliyun/dataclass/connect_response.py,sha256=Yz-fEbDzgGPTo5Of2oAjmFkSv08T7ze80pQU4k-gKIU,824
@@ -22,25 +22,25 @@ pymammotion/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,
22
22
  pymammotion/data/model/__init__.py,sha256=aSyroxYQQS-WMRi6WmWm2js4wLa9nmsi160gx9tts4o,323
23
23
  pymammotion/data/model/account.py,sha256=vJM-KTf2q6eBfVC-UlNHBSmJvqHiCawZ40vnuhXhaz8,140
24
24
  pymammotion/data/model/device.py,sha256=ejIMloTHlJcBi-qNFewTDt1K0pPJYpgjtJqqqhUqR1g,11182
25
- pymammotion/data/model/device_config.py,sha256=fsUSfYsICD7oTZm9dIaNTNSwo54A94n9VAWJcJvEz2Y,2574
25
+ pymammotion/data/model/device_config.py,sha256=Y3J2zIrmbk_9GLpscAVxRiIIVm9-Qq7OZ49tOh4Ffqo,2627
26
26
  pymammotion/data/model/enums.py,sha256=EpKmO8yVUZyEnTY4yH0DMMVKYNQM42zpW1maUu0i3IE,1582
27
27
  pymammotion/data/model/excute_boarder_params.py,sha256=9CpUqrygcle1C_1hDW-riLmm4map4ZbE842NXjcomEI,1394
28
28
  pymammotion/data/model/execute_boarder.py,sha256=9rd_h4fbcsXxgnLOd2rO2hWyD1abnTGc47QTEpp8DD0,1103
29
29
  pymammotion/data/model/generate_route_information.py,sha256=MkUBoqGtCAKmiVQ4Q1pEoDVHZs5uLIo7vhfWT4nGbtY,801
30
- pymammotion/data/model/hash_list.py,sha256=-2z_g9bhr3A7EK_J-oYrOpg6MjUnhliO__76HLUdDSo,2690
30
+ pymammotion/data/model/hash_list.py,sha256=4nZv5zE-jMJvKYmdr3aaO80qYNJYNDgiHjn-thbGUvs,3024
31
31
  pymammotion/data/model/location.py,sha256=H1h4Rhr0z_mDplNf1CP_ZCA3zM4_FJ_nMqzkbaoh7To,787
32
- pymammotion/data/model/mowing_modes.py,sha256=UxQrRAHQNC_lJTOA0ms2wuLAAi5UEVTkvvSZjnFpUjE,826
32
+ pymammotion/data/model/mowing_modes.py,sha256=5TrHSijUyPtIDWpNtgzx_vFQukRJWRz4gIrUaXggKPw,827
33
33
  pymammotion/data/model/plan.py,sha256=mcadkSL7fQXy0iJ0q786I3GEQY4i6kmQXfW6Ri69lcQ,2906
34
34
  pymammotion/data/model/rapid_state.py,sha256=BdJFD_DlhrVneg-PqEruqCoMty-CR7q_9Qna-hk1yd8,1171
35
35
  pymammotion/data/model/region_data.py,sha256=FLuL6kA7lbbh_idRh1eT9EosDqh4SpAqzpqHuQRDM88,2888
36
36
  pymammotion/data/model/report_info.py,sha256=gBSOmylSUdsYyIDsRms0L0nhQBx4V4LO-4tERvFpqXU,4475
37
37
  pymammotion/data/mqtt/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
38
- pymammotion/data/mqtt/event.py,sha256=omGNFYLjPKV_IY0remhEc8vcx2LkI_spZNysosPIvUM,4536
38
+ pymammotion/data/mqtt/event.py,sha256=wzh92MsvivgsJaOgqSJ6zQOssRdO3c0sFTHhXFa4HdU,4591
39
39
  pymammotion/data/mqtt/properties.py,sha256=HkBPghr26L9_b4QaOi1DtPgb0UoPIOGSe9wb3kgnM6Y,2815
40
40
  pymammotion/data/mqtt/status.py,sha256=zqnlo-MzejEQZszl0i0Wucoc3E76x6UtI9JLxoBnu54,1067
41
- pymammotion/data/state_manager.py,sha256=OQlfLeCYFglgJZdHeqG8djaCwVDC-SqDqDeqz7Q7LR4,3171
41
+ pymammotion/data/state_manager.py,sha256=fhV5icW9q4rCsHdD8lh4wvaDSzq6NP2116Wgdc7mR_U,3364
42
42
  pymammotion/event/__init__.py,sha256=mgATR6vPHACNQ-0zH5fi7NdzeTCDV1CZyaWPmtUusi8,115
43
- pymammotion/event/event.py,sha256=LFUhjUhlFRL2mEo1WKpn_jUJq_8K_Sw1EBWCYenWF0I,1932
43
+ pymammotion/event/event.py,sha256=P1JuP_Jy-pti8sN-zRDzUQSchx9ynoHmDEohL4gwhGA,2038
44
44
  pymammotion/http/_init_.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
45
  pymammotion/http/http.py,sha256=OZHjQY9ZLdlsKK6MDqqV79JIH9WYWJe3-ey-WWbe2z4,2642
46
46
  pymammotion/http/model/http.py,sha256=_aVrtZZyR4EdR6GcuqMP9vH8qBLN7nKu0U2OeraCcG0,1607
@@ -51,7 +51,7 @@ pymammotion/mammotion/commands/mammotion_command.py,sha256=84XxnatnBm_5WQ_KOa2N0
51
51
  pymammotion/mammotion/commands/messages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
52
  pymammotion/mammotion/commands/messages/driver.py,sha256=ANIOEtjF23k7W_R_Yfgzxmc7p1KSBCF-l-tijUtw0Yg,3709
53
53
  pymammotion/mammotion/commands/messages/media.py,sha256=ps0l06CXy5Ej--gTNCsyKttwo7yHLVrJUpn-wNJYecs,1150
54
- pymammotion/mammotion/commands/messages/navigation.py,sha256=igP_SJfZPc7g9AaqP0qqN3tgnuZiaD9nqYdJG33_JQ0,23589
54
+ pymammotion/mammotion/commands/messages/navigation.py,sha256=4rXBL-mViWc38K6x1w5O-GjwV8UWS5xZXkf4aHYjs8A,23684
55
55
  pymammotion/mammotion/commands/messages/network.py,sha256=gD7NKVKg8U2KNbPvgOxvTJXbznWdpdPQo9jBsQSx4OI,8027
56
56
  pymammotion/mammotion/commands/messages/ota.py,sha256=XkeuWBZtpYMMBze6r8UN7dJXbe2FxUNGNnjwBpXJKM0,1240
57
57
  pymammotion/mammotion/commands/messages/system.py,sha256=xm9Nj3wva9leVV1tyzfS_Hf53t-j7Nk8RBlFd00CQFM,10972
@@ -59,13 +59,13 @@ pymammotion/mammotion/commands/messages/video.py,sha256=_8lJsU4sLm2CGnc7RDkueA0A
59
59
  pymammotion/mammotion/control/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
60
  pymammotion/mammotion/control/joystick.py,sha256=QfBVxM_gxpWsZAGO90whtgxCI2tIZ3TTad9wHIPsU9s,5640
61
61
  pymammotion/mammotion/devices/__init__.py,sha256=f2qQFPgLGmV85W2hSlMUh5BYuht9o_Ar_JEAAMD4fsE,102
62
- pymammotion/mammotion/devices/base.py,sha256=p_YUOolzcEvJGtyPPileAvc5jwYmTtEh0TsIG1LpvQ8,10692
63
- pymammotion/mammotion/devices/mammotion.py,sha256=am2Rpsi1SdOaABrKC3ONBkQh17gfFcWTKAmV5mZsKK8,9301
62
+ pymammotion/mammotion/devices/base.py,sha256=s3xnEHzPIbo9LU0WB7I-y04JiX0CjR5g35Q_-kpWE70,11346
63
+ pymammotion/mammotion/devices/mammotion.py,sha256=CVyhm3cSrX4ZLgMLHmFoWjyhBsPrwZbSKI5AuJC6jOs,9630
64
64
  pymammotion/mammotion/devices/mammotion_bluetooth.py,sha256=3XUjhE2sb_2aZnJlevmwxd99zR_4qZOfaK86h6hKV5E,17303
65
- pymammotion/mammotion/devices/mammotion_cloud.py,sha256=09r1DfTPbE1JaH9xz46BzMrt5gn5dZa7HaYaiuN64SU,9856
65
+ pymammotion/mammotion/devices/mammotion_cloud.py,sha256=mCzj-SOSke6mU010NQcO-r9qtHyPXCCY0OlYiO-MA9A,9915
66
66
  pymammotion/mqtt/__init__.py,sha256=Ocs5e-HLJvTuDpVXyECEsWIvwsUaxzj7lZ9mSYutNDY,105
67
67
  pymammotion/mqtt/mammotion_future.py,sha256=_OWqKOlUGl2yT1xOsXFQYpGd-1zQ63OxqXgy7KRQgYc,710
68
- pymammotion/mqtt/mammotion_mqtt.py,sha256=pugfSXAEwrA-jPzUgBH5QvoON_B1iE6_Ouib8pLi_so,8301
68
+ pymammotion/mqtt/mammotion_mqtt.py,sha256=QZuqp2G5nywCFSwGNSayPI5JVL789yOxyr0UM0G7wzg,8295
69
69
  pymammotion/proto/__init__.py,sha256=v3_P1LOsYRBN9qCAhaWrWMX7GWHrox9XD3hdZQxcPZM,190
70
70
  pymammotion/proto/basestation.proto,sha256=_x5gAz3FkZXS1jtq4GgZgaDCuRU-UV-7HTFdsfQ3zbo,1034
71
71
  pymammotion/proto/basestation.py,sha256=js64_N2xQYRxWPRdVNEapO0qe7vBlfYnjW5sE8hi7hw,2026
@@ -92,7 +92,7 @@ pymammotion/proto/mctrl_driver.py,sha256=sseY2MxUtaQZvg7fvbA_gNvtqx9MVDW_rvUcfA2
92
92
  pymammotion/proto/mctrl_driver_pb2.py,sha256=bfLwZb5Hehb6OIkgFrZMkQ0oTBXoOBxpruszKz-UM1U,3785
93
93
  pymammotion/proto/mctrl_driver_pb2.pyi,sha256=9_rcQELsSeOfeIQMTEFIpeXICpDe3arQeA4kAYWNSWw,5860
94
94
  pymammotion/proto/mctrl_nav.proto,sha256=3OQ8DDP5yaZpKBcqeflGLQ5v5YE5AdBOftkKLRne2Tg,12530
95
- pymammotion/proto/mctrl_nav.py,sha256=hRnCl2BkwbzDS167QOapwQnB15n0t3XY-H8NyZqT3DM,24993
95
+ pymammotion/proto/mctrl_nav.py,sha256=J1DxdKO0JbYzVbE4ZEAd8MYMeCPYrdjSRw9NBX6oMsA,24945
96
96
  pymammotion/proto/mctrl_nav_pb2.py,sha256=LAHfEmGfNVZCN6vuLSZF6s2wd1Qk-siaWe4mdPWPdxc,24213
97
97
  pymammotion/proto/mctrl_nav_pb2.pyi,sha256=qmGYfKh2o63e5ppl9QIWnwDbmGVUVOf7EqhC9ApE5fg,51336
98
98
  pymammotion/proto/mctrl_ota.proto,sha256=4iHr-v1R0QiNndCnv3b6mhXiERLukB67ZzhTgt1iMc0,629
@@ -117,7 +117,7 @@ pymammotion/utility/map.py,sha256=GYscVMg2cX3IPlNpCBNHDW0S55yS1WGRf1iHnNZ7TfQ,22
117
117
  pymammotion/utility/movement.py,sha256=N75oAoAgFydqoaOedYIxGUHmuTCtPzAOtb-d_29tpfI,615
118
118
  pymammotion/utility/periodic.py,sha256=MbeSb9cfhxzYmdT_RiE0dZe3H9IfbQW_zSqhmSX2RUc,3321
119
119
  pymammotion/utility/rocker_util.py,sha256=6tX7sS87qoQC_tsxbx3NLL-HgS08wtzXiZkhDiz7uo0,7179
120
- pymammotion-0.2.31.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
121
- pymammotion-0.2.31.dist-info/METADATA,sha256=0SSRrtVWHluLV_1KNTCVu3LIfBqjsFxlprMpvDV6eKI,4052
122
- pymammotion-0.2.31.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
123
- pymammotion-0.2.31.dist-info/RECORD,,
120
+ pymammotion-0.2.32.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
121
+ pymammotion-0.2.32.dist-info/METADATA,sha256=4T0TPLB0YtQxWV71xVzvnd_Iw7RVuxf_EzCQVPTs30U,4052
122
+ pymammotion-0.2.32.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
123
+ pymammotion-0.2.32.dist-info/RECORD,,