pymammotion 0.2.62__py3-none-any.whl → 0.5.51__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.

Potentially problematic release.


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

Files changed (135) hide show
  1. pymammotion/__init__.py +9 -6
  2. pymammotion/aliyun/client.py +235 -0
  3. pymammotion/aliyun/cloud_gateway.py +320 -69
  4. pymammotion/aliyun/model/aep_response.py +1 -2
  5. pymammotion/aliyun/model/dev_by_account_response.py +170 -23
  6. pymammotion/aliyun/model/login_by_oauth_response.py +2 -3
  7. pymammotion/aliyun/model/regions_response.py +3 -3
  8. pymammotion/aliyun/model/session_by_authcode_response.py +2 -2
  9. pymammotion/aliyun/model/thing_response.py +12 -0
  10. pymammotion/aliyun/regions.py +62 -0
  11. pymammotion/aliyun/tea/core.py +297 -0
  12. pymammotion/bluetooth/ble.py +11 -15
  13. pymammotion/bluetooth/ble_message.py +389 -106
  14. pymammotion/bluetooth/model/atomic_integer.py +54 -0
  15. pymammotion/const.py +3 -0
  16. pymammotion/data/model/__init__.py +1 -2
  17. pymammotion/data/model/device.py +92 -240
  18. pymammotion/data/model/device_config.py +10 -24
  19. pymammotion/data/model/device_info.py +35 -0
  20. pymammotion/data/model/device_limits.py +49 -0
  21. pymammotion/data/model/enums.py +12 -2
  22. pymammotion/data/model/errors.py +12 -0
  23. pymammotion/data/model/events.py +14 -0
  24. pymammotion/data/model/generate_geojson.py +521 -0
  25. pymammotion/data/model/generate_route_information.py +3 -4
  26. pymammotion/data/model/hash_list.py +384 -48
  27. pymammotion/data/model/location.py +4 -4
  28. pymammotion/data/model/mowing_modes.py +24 -1
  29. pymammotion/data/model/raw_data.py +215 -0
  30. pymammotion/data/model/region_data.py +10 -11
  31. pymammotion/data/model/report_info.py +62 -6
  32. pymammotion/data/model/work.py +27 -0
  33. pymammotion/data/mower_state_manager.py +316 -0
  34. pymammotion/data/mqtt/event.py +73 -28
  35. pymammotion/data/mqtt/mammotion_properties.py +257 -0
  36. pymammotion/data/mqtt/properties.py +93 -78
  37. pymammotion/data/mqtt/status.py +18 -17
  38. pymammotion/event/event.py +32 -8
  39. pymammotion/homeassistant/__init__.py +3 -0
  40. pymammotion/homeassistant/mower_api.py +484 -0
  41. pymammotion/homeassistant/rtk_api.py +54 -0
  42. pymammotion/http/__init__.py +0 -0
  43. pymammotion/http/encryption.py +220 -0
  44. pymammotion/http/http.py +652 -44
  45. pymammotion/http/model/__init__.py +0 -0
  46. pymammotion/{aliyun/model/stream_subscription_response.py → http/model/camera_stream.py} +14 -2
  47. pymammotion/http/model/http.py +160 -9
  48. pymammotion/http/model/response_factory.py +61 -0
  49. pymammotion/http/model/rtk.py +16 -0
  50. pymammotion/mammotion/commands/abstract_message.py +7 -5
  51. pymammotion/mammotion/commands/mammotion_command.py +32 -3
  52. pymammotion/mammotion/commands/messages/basestation.py +43 -0
  53. pymammotion/mammotion/commands/messages/driver.py +61 -29
  54. pymammotion/mammotion/commands/messages/media.py +68 -15
  55. pymammotion/mammotion/commands/messages/navigation.py +61 -25
  56. pymammotion/mammotion/commands/messages/network.py +93 -100
  57. pymammotion/mammotion/commands/messages/ota.py +18 -18
  58. pymammotion/mammotion/commands/messages/system.py +97 -72
  59. pymammotion/mammotion/commands/messages/video.py +17 -12
  60. pymammotion/mammotion/devices/__init__.py +27 -3
  61. pymammotion/mammotion/devices/base.py +50 -127
  62. pymammotion/mammotion/devices/mammotion.py +447 -212
  63. pymammotion/mammotion/devices/mammotion_bluetooth.py +105 -60
  64. pymammotion/mammotion/devices/mammotion_cloud.py +157 -105
  65. pymammotion/mammotion/devices/mammotion_mower_ble.py +49 -0
  66. pymammotion/mammotion/devices/mammotion_mower_cloud.py +39 -0
  67. pymammotion/mammotion/devices/managers/managers.py +81 -0
  68. pymammotion/mammotion/devices/mower_device.py +124 -0
  69. pymammotion/mammotion/devices/mower_manager.py +107 -0
  70. pymammotion/mammotion/devices/rtk_ble.py +89 -0
  71. pymammotion/mammotion/devices/rtk_cloud.py +113 -0
  72. pymammotion/mammotion/devices/rtk_device.py +50 -0
  73. pymammotion/mammotion/devices/rtk_manager.py +122 -0
  74. pymammotion/mqtt/__init__.py +2 -1
  75. pymammotion/mqtt/aliyun_mqtt.py +232 -0
  76. pymammotion/mqtt/linkkit/__init__.py +5 -0
  77. pymammotion/mqtt/linkkit/h2client.py +585 -0
  78. pymammotion/mqtt/linkkit/linkkit.py +3023 -0
  79. pymammotion/mqtt/mammotion_mqtt.py +176 -169
  80. pymammotion/mqtt/mqtt_models.py +66 -0
  81. pymammotion/proto/__init__.py +4839 -4
  82. pymammotion/proto/basestation.proto +8 -0
  83. pymammotion/proto/basestation_pb2.py +11 -9
  84. pymammotion/proto/basestation_pb2.pyi +16 -2
  85. pymammotion/proto/dev_net.proto +79 -55
  86. pymammotion/proto/dev_net_pb2.py +60 -56
  87. pymammotion/proto/dev_net_pb2.pyi +49 -6
  88. pymammotion/proto/luba_msg.proto +2 -1
  89. pymammotion/proto/luba_msg_pb2.py +6 -6
  90. pymammotion/proto/luba_msg_pb2.pyi +1 -0
  91. pymammotion/proto/luba_mul.proto +62 -1
  92. pymammotion/proto/luba_mul_pb2.py +38 -22
  93. pymammotion/proto/luba_mul_pb2.pyi +94 -7
  94. pymammotion/proto/mctrl_driver.proto +44 -4
  95. pymammotion/proto/mctrl_driver_pb2.py +26 -14
  96. pymammotion/proto/mctrl_driver_pb2.pyi +66 -11
  97. pymammotion/proto/mctrl_nav.proto +97 -51
  98. pymammotion/proto/mctrl_nav_pb2.py +75 -67
  99. pymammotion/proto/mctrl_nav_pb2.pyi +142 -56
  100. pymammotion/proto/mctrl_ota.proto +40 -2
  101. pymammotion/proto/mctrl_ota_pb2.py +23 -13
  102. pymammotion/proto/mctrl_ota_pb2.pyi +67 -4
  103. pymammotion/proto/mctrl_pept.proto +8 -3
  104. pymammotion/proto/mctrl_pept_pb2.py +8 -6
  105. pymammotion/proto/mctrl_pept_pb2.pyi +14 -6
  106. pymammotion/proto/mctrl_sys.proto +325 -86
  107. pymammotion/proto/mctrl_sys_pb2.py +162 -98
  108. pymammotion/proto/mctrl_sys_pb2.pyi +451 -25
  109. pymammotion/proto/message_pool.py +3 -0
  110. pymammotion/proto/py.typed +0 -0
  111. pymammotion/utility/constant/device_constant.py +65 -21
  112. pymammotion/utility/datatype_converter.py +13 -12
  113. pymammotion/utility/device_config.py +755 -0
  114. pymammotion/utility/device_type.py +218 -21
  115. pymammotion/utility/map.py +238 -51
  116. pymammotion/utility/mur_mur_hash.py +159 -0
  117. {pymammotion-0.2.62.dist-info → pymammotion-0.5.51.dist-info}/METADATA +27 -31
  118. pymammotion-0.5.51.dist-info/RECORD +152 -0
  119. {pymammotion-0.2.62.dist-info → pymammotion-0.5.51.dist-info}/WHEEL +1 -1
  120. pymammotion/aliyun/cloud_service.py +0 -65
  121. pymammotion/data/model/plan.py +0 -58
  122. pymammotion/data/state_manager.py +0 -130
  123. pymammotion/proto/basestation.py +0 -59
  124. pymammotion/proto/common.py +0 -12
  125. pymammotion/proto/dev_net.py +0 -381
  126. pymammotion/proto/luba_msg.py +0 -81
  127. pymammotion/proto/luba_mul.py +0 -76
  128. pymammotion/proto/mctrl_driver.py +0 -100
  129. pymammotion/proto/mctrl_nav.py +0 -660
  130. pymammotion/proto/mctrl_ota.py +0 -48
  131. pymammotion/proto/mctrl_pept.py +0 -41
  132. pymammotion/proto/mctrl_sys.py +0 -574
  133. pymammotion-0.2.62.dist-info/RECORD +0 -125
  134. /pymammotion/{http/_init_.py → bluetooth/model/__init__.py} +0 -0
  135. {pymammotion-0.2.62.dist-info → pymammotion-0.5.51.dist-info/licenses}/LICENSE +0 -0
@@ -0,0 +1,159 @@
1
+ import struct
2
+
3
+
4
+ class MurMurHashUtil:
5
+ MASK_32 = 0xFFFFFFFF
6
+ MULTIPLIER = 1540483477
7
+
8
+ @staticmethod
9
+ def get_unsigned_int(i: int) -> int:
10
+ """Convert signed int to unsigned (32-bit)"""
11
+ return i & MurMurHashUtil.MASK_32
12
+
13
+ @staticmethod
14
+ def hash(data: bytes) -> int:
15
+ """MurmurHash2 64-bit implementation"""
16
+ pos = 0
17
+ data_len = len(data)
18
+
19
+ remaining = data_len ^ 97
20
+ j = 0
21
+
22
+ # Process 8 bytes at a time
23
+ while (data_len - pos) >= 8:
24
+ val1 = struct.unpack_from("<i", data, pos)[0]
25
+ pos += 4
26
+
27
+ unsigned_int_1 = MurMurHashUtil.get_unsigned_int(val1)
28
+ temp1 = (unsigned_int_1 * MurMurHashUtil.MULTIPLIER) & MurMurHashUtil.MASK_32
29
+ temp2 = (temp1 ^ (temp1 >> 24)) & MurMurHashUtil.MASK_32
30
+ temp3 = (temp2 * MurMurHashUtil.MULTIPLIER) & MurMurHashUtil.MASK_32
31
+
32
+ remaining = ((remaining * MurMurHashUtil.MULTIPLIER) & MurMurHashUtil.MASK_32) ^ temp3
33
+ remaining = remaining & MurMurHashUtil.MASK_32
34
+
35
+ val2 = struct.unpack_from("<i", data, pos)[0]
36
+ pos += 4
37
+
38
+ unsigned_int_2 = MurMurHashUtil.get_unsigned_int(val2)
39
+ temp1 = (unsigned_int_2 * MurMurHashUtil.MULTIPLIER) & MurMurHashUtil.MASK_32
40
+ temp2 = (temp1 ^ (temp1 >> 24)) & MurMurHashUtil.MASK_32
41
+ temp3 = (temp2 * MurMurHashUtil.MULTIPLIER) & MurMurHashUtil.MASK_32
42
+
43
+ j = ((j * MurMurHashUtil.MULTIPLIER) & MurMurHashUtil.MASK_32) ^ temp3
44
+ j = j & MurMurHashUtil.MASK_32
45
+
46
+ # Process remaining 4 bytes if available
47
+ if (data_len - pos) >= 4:
48
+ val = struct.unpack_from("<i", data, pos)[0]
49
+ pos += 4
50
+
51
+ unsigned_int_3 = MurMurHashUtil.get_unsigned_int(val)
52
+ temp1 = (unsigned_int_3 * MurMurHashUtil.MULTIPLIER) & MurMurHashUtil.MASK_32
53
+ temp2 = (temp1 ^ (temp1 >> 24)) & MurMurHashUtil.MASK_32
54
+ temp3 = (temp2 * MurMurHashUtil.MULTIPLIER) & MurMurHashUtil.MASK_32
55
+
56
+ remaining = ((remaining * MurMurHashUtil.MULTIPLIER) & MurMurHashUtil.MASK_32) ^ temp3
57
+ remaining = remaining & MurMurHashUtil.MASK_32
58
+
59
+ # Process tail bytes (1-3 bytes)
60
+ bytes_remaining = data_len - pos
61
+
62
+ if bytes_remaining == 1:
63
+ byte_val = data[pos] if data[pos] < 128 else data[pos] - 256
64
+ j = (j ^ (MurMurHashUtil.get_unsigned_int(byte_val) & 255)) & MurMurHashUtil.MASK_32
65
+ j = (j * MurMurHashUtil.MULTIPLIER) & MurMurHashUtil.MASK_32
66
+
67
+ elif bytes_remaining == 2:
68
+ byte_val1 = data[pos + 1] if data[pos + 1] < 128 else data[pos + 1] - 256
69
+ j = (j ^ ((MurMurHashUtil.get_unsigned_int(byte_val1) & 255) << 8)) & MurMurHashUtil.MASK_32
70
+
71
+ byte_val0 = data[pos] if data[pos] < 128 else data[pos] - 256
72
+ j = (j ^ (MurMurHashUtil.get_unsigned_int(byte_val0) & 255)) & MurMurHashUtil.MASK_32
73
+ j = (j * MurMurHashUtil.MULTIPLIER) & MurMurHashUtil.MASK_32
74
+
75
+ elif bytes_remaining == 3:
76
+ byte_val2 = data[pos + 2] if data[pos + 2] < 128 else data[pos + 2] - 256
77
+ j = (j ^ ((MurMurHashUtil.get_unsigned_int(byte_val2) & 255) << 16)) & MurMurHashUtil.MASK_32
78
+
79
+ byte_val1 = data[pos + 1] if data[pos + 1] < 128 else data[pos + 1] - 256
80
+ j = (j ^ ((MurMurHashUtil.get_unsigned_int(byte_val1) & 255) << 8)) & MurMurHashUtil.MASK_32
81
+
82
+ byte_val0 = data[pos] if data[pos] < 128 else data[pos] - 256
83
+ j = (j ^ (MurMurHashUtil.get_unsigned_int(byte_val0) & 255)) & MurMurHashUtil.MASK_32
84
+ j = (j * MurMurHashUtil.MULTIPLIER) & MurMurHashUtil.MASK_32
85
+
86
+ # Final avalanche
87
+ j4 = MurMurHashUtil.MULTIPLIER
88
+
89
+ j5 = remaining ^ (j >> 18)
90
+ j5 = (j5 & MurMurHashUtil.MASK_32) * j4
91
+ j5 = j5 & MurMurHashUtil.MASK_32
92
+
93
+ j6 = j ^ (j5 >> 22)
94
+ j6 = (j6 & MurMurHashUtil.MASK_32) * j4
95
+ j6 = j6 & MurMurHashUtil.MASK_32
96
+
97
+ j7 = j5 ^ (j6 >> 17)
98
+ j7 = (j7 & MurMurHashUtil.MASK_32) * j4
99
+ j7 = j7 & MurMurHashUtil.MASK_32
100
+
101
+ # Combine high and low parts
102
+ j8 = j7 << 32
103
+
104
+ low = j6 ^ (j7 >> 19)
105
+ low = (low & MurMurHashUtil.MASK_32) * j4
106
+ low = low & MurMurHashUtil.MASK_32
107
+
108
+ result = j8 | low
109
+
110
+ # Convert to signed 64-bit
111
+ if result > 0x7FFFFFFFFFFFFFFF:
112
+ result = result - 0x10000000000000000
113
+
114
+ return result
115
+
116
+ @staticmethod
117
+ def hash_string(s: str) -> int:
118
+ """Hash a string using UTF-8 encoding"""
119
+ return MurMurHashUtil.hash(s.encode("utf-8"))
120
+
121
+ @staticmethod
122
+ def read_unsigned_long(value: int) -> int:
123
+ """Convert to unsigned by masking with Long.MAX_VALUE"""
124
+ return value & 0x7FFFFFFFFFFFFFFF
125
+
126
+ @staticmethod
127
+ def hash_unsigned(data: str | bytes) -> int:
128
+ """Get unsigned hash value
129
+ Can accept bytes or string
130
+ """
131
+ if isinstance(data, str):
132
+ hash_val = MurMurHashUtil.hash_string(data)
133
+ else:
134
+ hash_val = MurMurHashUtil.hash(data)
135
+
136
+ return MurMurHashUtil.read_unsigned_long(hash_val)
137
+
138
+ @staticmethod
139
+ def long_to_bytes(value: int) -> bytes:
140
+ """Convert long to bytes exactly as Java does:
141
+ 1. Pack as big-endian (ByteBuffer default)
142
+ 2. Reverse all bytes
143
+ """
144
+ if value < 0:
145
+ value = value & 0xFFFFFFFFFFFFFFFF
146
+
147
+ big_endian = struct.pack(">Q", value)
148
+ return big_endian[::-1]
149
+
150
+ @staticmethod
151
+ def hash_unsigned_list(values: list[int]) -> int:
152
+ """Hash a list of long values"""
153
+ data = b""
154
+
155
+ for val in values:
156
+ data += MurMurHashUtil.long_to_bytes(val)
157
+
158
+ hash_val = MurMurHashUtil.hash(data)
159
+ return MurMurHashUtil.read_unsigned_long(hash_val)
@@ -1,33 +1,30 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: pymammotion
3
- Version: 0.2.62
4
- Summary:
5
- License: GNU-3.0
6
- Author: Michael Arthur
7
- Author-email: michael@jumblesoft.co.nz
8
- Requires-Python: >=3.10,<3.13
9
- Classifier: License :: Other/Proprietary License
10
- Classifier: Programming Language :: Python :: 3
11
- Classifier: Programming Language :: Python :: 3.10
12
- Classifier: Programming Language :: Python :: 3.11
13
- Classifier: Programming Language :: Python :: 3.12
14
- Requires-Dist: aiohttp (>=3.9.1,<4.0.0)
15
- Requires-Dist: alibabacloud-apigateway-util (>=0.0.2,<0.0.3)
16
- Requires-Dist: alibabacloud-iot-api-gateway (>=0.0.4,<0.0.5)
17
- Requires-Dist: alicloud-gateway-iot (>=1.0.0,<2.0.0)
18
- Requires-Dist: aliyun-iot-linkkit (>=1.2.12,<2.0.0)
19
- Requires-Dist: aliyun-python-sdk-iot (>=8.57.0,<9.0.0)
20
- Requires-Dist: async-timeout (>=4.0.3,<5.0.0)
21
- Requires-Dist: betterproto (>=1.2.5,<2.0.0)
22
- Requires-Dist: bleak (>=0.21.0)
23
- Requires-Dist: bleak-retry-connector (>=3.5.0,<4.0.0)
24
- Requires-Dist: jsonic (>=1.0.0,<2.0.0)
25
- Requires-Dist: mashumaro (>=3.13,<4.0)
26
- Requires-Dist: numpy (>=1.26.0)
27
- Requires-Dist: orjson (>=3.9.15,<4.0.0)
28
- Requires-Dist: paho-mqtt (>=1.6.1,<2.0.0)
29
- Requires-Dist: protobuf (>=4.23.1)
30
- Requires-Dist: py-jsonic (>=0.0.2,<0.0.3)
3
+ Version: 0.5.51
4
+ Author: jLynx
5
+ Author-email: Michael Arthur <michael@jumblesoft.co.nz>
6
+ License-Expression: GPL-3.0
7
+ License-File: LICENSE
8
+ Requires-Python: <4.0,>=3.12
9
+ Requires-Dist: aiohttp>=3.9.1
10
+ Requires-Dist: alibabacloud-apigateway-util<0.0.3,>=0.0.2
11
+ Requires-Dist: alibabacloud-iot-api-gateway<0.0.5,>=0.0.4
12
+ Requires-Dist: alicloud-gateway-iot<2,>=1.0.0
13
+ Requires-Dist: async-timeout<5,>=4.0.3
14
+ Requires-Dist: betterproto2>=0.9.1
15
+ Requires-Dist: bleak-retry-connector>=3.5.0
16
+ Requires-Dist: bleak>=0.21.0
17
+ Requires-Dist: crcmod~=1.7
18
+ Requires-Dist: cryptography>=43.0.1
19
+ Requires-Dist: jsonic<2,>=1.0.0
20
+ Requires-Dist: mashumaro~=3.13
21
+ Requires-Dist: numpy>=1.26.0
22
+ Requires-Dist: orjson<4,>=3.9.15
23
+ Requires-Dist: paho-mqtt<3,>=2.1.0
24
+ Requires-Dist: protobuf>=4.23.1
25
+ Requires-Dist: py-jsonic<0.0.3,>=0.0.2
26
+ Requires-Dist: pyjwt>=2.10.1
27
+ Requires-Dist: shapely>=2.1.2
31
28
  Description-Content-Type: text/markdown
32
29
 
33
30
  # PyMammotion - Python API for Mammotion Mowers [![Discord](https://img.shields.io/discord/1247286396297678879)](https://discord.gg/vpZdWhJX8x)
@@ -68,7 +65,7 @@ pip install pymammotion
68
65
  PyMammotion uses `betterproto` and `protoc` for generating protobuf models. To set up the development environment:
69
66
 
70
67
  1. Clone the repository
71
- 2. ???
68
+ 2. poetry install --with=dev
72
69
  3. Profit
73
70
 
74
71
  ## Contributing 🤝
@@ -96,4 +93,3 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
96
93
 
97
94
  The trademarks "Mammotion," "Luba," and "Yuka" referenced herein are registered trademarks of their respective owners. The author of this software repository is not affiliated with, endorsed by, or connected to these trademark owners in any way.
98
95
 
99
-
@@ -0,0 +1,152 @@
1
+ pymammotion/__init__.py,sha256=1qcHKu-sHbn1Jc2PCiYX0S_GDKg6g-FneTEw1x4IcNs,1661
2
+ pymammotion/const.py,sha256=SUB5OQEIBoJ_K6gzIZhx4yVxwWO24yGsEMYPy0MUiKE,499
3
+ pymammotion/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ pymammotion/aliyun/__init__.py,sha256=T1lkX7TRYiL4nqYanG4l4MImV-SlavSbuooC-W-uUGw,29
5
+ pymammotion/aliyun/client.py,sha256=gS15-fAYn3nViwFY3zMlS_2T9mZokFLUyuHADaXH-O8,9777
6
+ pymammotion/aliyun/cloud_gateway.py,sha256=aIKO0pJ1OwWoz9Xt0MQd1XZCr0Tkw8_1e4WoX60ExF4,35575
7
+ pymammotion/aliyun/regions.py,sha256=ctlRGrmdE4-xgItl9slCANYOV502qVN5lkAU4lj92sk,2518
8
+ pymammotion/aliyun/tmp_constant.py,sha256=M4Hq_lrGB3LZdX6R2XohRPFoK1NDnNV-pTJwJcJ9838,6650
9
+ pymammotion/aliyun/model/aep_response.py,sha256=EY4uMTJ4F9rvbcXnAOc5YKi7q__9kIVgfDwfyr65Gk0,421
10
+ pymammotion/aliyun/model/connect_response.py,sha256=Yz-fEbDzgGPTo5Of2oAjmFkSv08T7ze80pQU4k-gKIU,824
11
+ pymammotion/aliyun/model/dev_by_account_response.py,sha256=PTkHRJQzEdqJRIGKEaU_4Q45O2KdupxRjZGR757xzvw,6788
12
+ pymammotion/aliyun/model/login_by_oauth_response.py,sha256=g7JnvEjoa3SplHd-UqCuK6x0qtODpHlDyJCHRz7tfDI,1228
13
+ pymammotion/aliyun/model/regions_response.py,sha256=HSnpPcgpjr6VNXBQHw__gn-xWCkQ-MZ-Tmus9_va9mI,635
14
+ pymammotion/aliyun/model/session_by_authcode_response.py,sha256=0owdNcGFIP7rsVqLIf9rT-iOtvWmKCt2AW0cUUXwFiQ,427
15
+ pymammotion/aliyun/model/thing_response.py,sha256=23gUpB8EX3jNICp-p4Gytxs4qAfzKVr8anUA9JCl4XM,273
16
+ pymammotion/aliyun/tea/core.py,sha256=4SjhRkbPMbw-uI0lQnCN0SBNAHAgVFrpHeaauuu6nZY,10200
17
+ pymammotion/bluetooth/__init__.py,sha256=LAl8jqZ1fPh-3mLmViNQsP3s814C1vsocYUa6oSaXt0,36
18
+ pymammotion/bluetooth/ble.py,sha256=XQWJBpSzeIawCrLTsVrq9LI6jmM_ALVTttUkosK2BRM,2480
19
+ pymammotion/bluetooth/ble_message.py,sha256=qROCOsz68kfxWeEK3Hm4dfvsbA3SpxJRhX7sEmJAMZU,18797
20
+ pymammotion/bluetooth/const.py,sha256=CCqyHsYbB0BAYjwdhXt_n6eWWxmhlUrAFjvVv57mbvE,1749
21
+ pymammotion/bluetooth/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
+ pymammotion/bluetooth/data/convert.py,sha256=6DMwvzVr9FWCoQFIKSI2poFXjISc_m6X59g8FlVO0-o,800
23
+ pymammotion/bluetooth/data/framectrldata.py,sha256=qxhGQsTGsfPx-CarEMLkgBn_RJ6I2-exmr9AX2U4pFg,995
24
+ pymammotion/bluetooth/data/notifydata.py,sha256=jeROpoFmaZfNTidkLLm5VYeFbeIgDSi8waJ0nVLRUTA,1995
25
+ pymammotion/bluetooth/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
+ pymammotion/bluetooth/model/atomic_integer.py,sha256=jtSqeqd6It3TvzZN7TJyYHQNRuItuw0Bg-cL0AUEBhY,1666
27
+ pymammotion/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
+ pymammotion/data/mower_state_manager.py,sha256=rSgcIcrbQDUnCz05IhEaJ-n7VuI-hBvBov3ieVPd3qM,14488
29
+ pymammotion/data/model/__init__.py,sha256=UVRbSXGOjYnWv30ZEvzT5QRpdVqAbyeToo-t0QBWyi4,292
30
+ pymammotion/data/model/account.py,sha256=vJM-KTf2q6eBfVC-UlNHBSmJvqHiCawZ40vnuhXhaz8,140
31
+ pymammotion/data/model/device.py,sha256=B9hJfNII239vBd8ghvcDKjT84NY-WdRQIuysZUm50RM,8781
32
+ pymammotion/data/model/device_config.py,sha256=cLfvO_xs8GhEQbhTZLOfhYK5OX4T337M9OZkyQ_GNWQ,2652
33
+ pymammotion/data/model/device_info.py,sha256=YRs-7kcnzS5qNeZTvLTNewv8RZ_Qx51pXrebSKYj7Ks,1411
34
+ pymammotion/data/model/device_limits.py,sha256=m8HdxD-RaAkPm7jHYb9GLxMEH9IfzBPz0ZypmsLnId4,1946
35
+ pymammotion/data/model/enums.py,sha256=LVLP-9ypW0NxwyTeizxPVFNX3INWGfhSR9obM_vl0-M,1782
36
+ pymammotion/data/model/errors.py,sha256=lBHq2cE8P5fc6Q4JXgrkJXzFKTWgxsoPOyMlTaJWbWk,396
37
+ pymammotion/data/model/events.py,sha256=fa8xG6kB2NgZKzpd-T9TKRcVEme_fdB5VnHuF2Qa62s,392
38
+ pymammotion/data/model/excute_boarder_params.py,sha256=9CpUqrygcle1C_1hDW-riLmm4map4ZbE842NXjcomEI,1394
39
+ pymammotion/data/model/execute_boarder.py,sha256=9rd_h4fbcsXxgnLOd2rO2hWyD1abnTGc47QTEpp8DD0,1103
40
+ pymammotion/data/model/generate_geojson.py,sha256=XXIOeCV3ypiA4rhO2qVX560mrUM-KwaXgT8c5lI4rXA,16276
41
+ pymammotion/data/model/generate_route_information.py,sha256=-_c8pk10zwRh-O2vJ0i3DDCOQbv9CRJ7YNWpfsIpajI,807
42
+ pymammotion/data/model/hash_list.py,sha256=sT1xxNSs-5RuIpoxO18WDEU0KLHNP1lEOhYHQTF317Y,16251
43
+ pymammotion/data/model/location.py,sha256=BirPRZDjZEi_pEg2RquCOfCRR8cV4THuWyHoJM8gAAg,919
44
+ pymammotion/data/model/mowing_modes.py,sha256=4rMn1H8w2iU2aBwpmAhPh_sT81yqrocrWWUIaU7DCIc,1171
45
+ pymammotion/data/model/rapid_state.py,sha256=mIdhAG_LZXpVcybxqTLgLXkNOmVmDTn04B9PGIDA8Ls,1251
46
+ pymammotion/data/model/raw_data.py,sha256=x2xuqVC8CQuV3ui3QK4G5EqRET9EsNljHLHR11ByYgo,6471
47
+ pymammotion/data/model/region_data.py,sha256=OP4hXYX2U1gNxU7VFsHQfQbE1Bze_nvVFQ0ZT7XZJsg,2909
48
+ pymammotion/data/model/report_info.py,sha256=Dr5lKUZSbyaNs44PyLRuKin2KVmPvup-XXPkZ5IzIWo,3989
49
+ pymammotion/data/model/work.py,sha256=AfKMItFqnRtAlVHzKCfYY-BQy-WFDYZBzdj-9Yc03bo,655
50
+ pymammotion/data/mqtt/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
51
+ pymammotion/data/mqtt/event.py,sha256=JPzu2XCgyLwcdKsN9vqg94WMvHtsGH6vHHSFGstILjo,6911
52
+ pymammotion/data/mqtt/mammotion_properties.py,sha256=oMsHkMJQxLjiUu8wXtWiLV7cmUPM8sJk2GBVsBeIfNU,8528
53
+ pymammotion/data/mqtt/properties.py,sha256=40r6rW7bL1R4v1PFEhBMF7Z45UfpgafhsAou5JyB6NU,5152
54
+ pymammotion/data/mqtt/status.py,sha256=jZ1Qx8tRhtBOguL7MOtR0jhsA1cRmVKoPJszho5A2Bs,1644
55
+ pymammotion/event/__init__.py,sha256=mgATR6vPHACNQ-0zH5fi7NdzeTCDV1CZyaWPmtUusi8,115
56
+ pymammotion/event/event.py,sha256=Z8WYxv_-5khEqKjL1w4c_Et24G1Kdm8QFuIBylD3h3U,3021
57
+ pymammotion/homeassistant/__init__.py,sha256=j0aQZKWR41pCDR3g1y2p_zfp033pESECcqXiefRg1DQ,107
58
+ pymammotion/homeassistant/mower_api.py,sha256=75spHV7tlduFBN_JGe3VWojLXQ8kBzOZLQlg8YPaU-w,20836
59
+ pymammotion/homeassistant/rtk_api.py,sha256=XVc6S0zN2dl2PWXGJ3bAFRba4AICofg1hYCUE84czTw,2516
60
+ pymammotion/http/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
+ pymammotion/http/encryption.py,sha256=lzXu3WwBdQlzjXxWnlJuRgkCrKdPbxx5drhMitVKIEk,8287
62
+ pymammotion/http/http.py,sha256=OKJMDmWvp0T7Er9zgpdx4fGAk8GkJHplo-r9xLdl3GE,29674
63
+ pymammotion/http/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
64
+ pymammotion/http/model/camera_stream.py,sha256=ilxQNny_w9Frwt-m8kbHinvyjDv4Bx8C2swfZ2lTEDE,600
65
+ pymammotion/http/model/http.py,sha256=PymW658jcAxYNmO3l3NBXMATc8WK_lZuZfj_9seMbBQ,6433
66
+ pymammotion/http/model/response_factory.py,sha256=OoS7_f2yh8TUecTKlQhf6bFKdsihn9b7k1cgoyaw7XY,2183
67
+ pymammotion/http/model/rtk.py,sha256=pR2mi6_Y8oTPlqDXWLk7oaUqmcgcrBQ0f3MJdC0_CUg,491
68
+ pymammotion/mammotion/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
+ pymammotion/mammotion/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
70
+ pymammotion/mammotion/commands/abstract_message.py,sha256=M4qL-Yw5g3fTgS9jB9LUSgJSAqpUf7MME-2mfv471Sk,808
71
+ pymammotion/mammotion/commands/mammotion_command.py,sha256=wX1bPtlPbYZfAw_TOLkVk5QCTZbQQXNIswQg8bfmcpI,3647
72
+ pymammotion/mammotion/commands/messages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
+ pymammotion/mammotion/commands/messages/basestation.py,sha256=a1LEF4C25ynILeQLx-FOOU4d-N_vMkXSh_etojJjIDM,1442
74
+ pymammotion/mammotion/commands/messages/driver.py,sha256=tJUM1WhlWFs92PbZW5QSG-TMo6nemAUkcUDzI_6gETU,4695
75
+ pymammotion/mammotion/commands/messages/media.py,sha256=KJyMzSZkwQrHWjAWfAI88Y7-jmfN3-WYtY193KaomT4,2930
76
+ pymammotion/mammotion/commands/messages/navigation.py,sha256=QO6MNLB-nu1G2kDIOu6eFu6oCtGwM-bA6TsVLBiY670,24806
77
+ pymammotion/mammotion/commands/messages/network.py,sha256=7K6aqt29ymTSUG0iEv4kIRD0Dv6rfHNctE00UvuMpG4,7264
78
+ pymammotion/mammotion/commands/messages/ota.py,sha256=Nk3Tlp6n7hkbkuy355BlqbozHIHzsYnrH2cDO8QGaLk,1446
79
+ pymammotion/mammotion/commands/messages/system.py,sha256=1Xchdx7Y0-kbrM-knSEUhwELu9PyF7DjtsCFt7_BCXw,13343
80
+ pymammotion/mammotion/commands/messages/video.py,sha256=5D5Azt6Q63K-OeC2eSPmmrGgFLmGIi21jPuESCYVgnE,1296
81
+ pymammotion/mammotion/control/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
+ pymammotion/mammotion/control/joystick.py,sha256=QfBVxM_gxpWsZAGO90whtgxCI2tIZ3TTad9wHIPsU9s,5640
83
+ pymammotion/mammotion/devices/__init__.py,sha256=YYphpxf0zr1Xc_dOBKsCzcO5zSwlewuhZNjAbmy6cHI,1012
84
+ pymammotion/mammotion/devices/base.py,sha256=MLLup0ZQI1GvyEF980BTtIeuayRZJijR1kvk77U1DS0,6518
85
+ pymammotion/mammotion/devices/mammotion.py,sha256=3Scbn8qZhJixy9qkxZ59bZrZv47ECSdUVlUnl0kmMR8,24282
86
+ pymammotion/mammotion/devices/mammotion_bluetooth.py,sha256=bwl1wphx2ev3iuDBTFTJbeujtll0L2ZBYDRzTcKBZes,19203
87
+ pymammotion/mammotion/devices/mammotion_cloud.py,sha256=8MosSefZtymgHhKxkp7nSHq7b5D6sNPobxoKYVMBy-I,15139
88
+ pymammotion/mammotion/devices/mammotion_mower_ble.py,sha256=GLc-f9TFhpGp2OYnVestzFqPSyGBMHX2YmrAnnmYu0I,1947
89
+ pymammotion/mammotion/devices/mammotion_mower_cloud.py,sha256=JwCQICv8S31c1ll23JIWFFJEwzbTss182MvE4ZiQxWs,1877
90
+ pymammotion/mammotion/devices/mower_device.py,sha256=UYsYSZoyzs_2aiKTkSamQAgbPdxnPmza3gcsOTQfVh8,5782
91
+ pymammotion/mammotion/devices/mower_manager.py,sha256=m2U90ZlNgSmdPAh8BtKtyMVt5ZTBpfxNs5RT_lsUTls,4280
92
+ pymammotion/mammotion/devices/rtk_ble.py,sha256=egZo4VJYS1_9r7e8f8FA21tD-bVthc-YgJbTtf0cNSI,3601
93
+ pymammotion/mammotion/devices/rtk_cloud.py,sha256=gFzcnlSyWnyFLTYR-WOLpjIQD8Y1k844ZTkd-gdyIIk,4816
94
+ pymammotion/mammotion/devices/rtk_device.py,sha256=8wUCPqS6Xkox7sFj8AaXlVbzh67X9HarqldddBoWqBE,1917
95
+ pymammotion/mammotion/devices/rtk_manager.py,sha256=m963cKvfx2ThjYJpKb5_KrjqUPpvxK-DLVoF7TNXyP4,4392
96
+ pymammotion/mammotion/devices/managers/managers.py,sha256=d2z7oo2kMCsZ_YHSOBO9LazMSQxov0NNbr4EzJtxlYs,2495
97
+ pymammotion/mqtt/__init__.py,sha256=9nhy9GS8EbzOAPOrXHBTd_olePq8mctIkwMruDDSeWw,155
98
+ pymammotion/mqtt/aliyun_mqtt.py,sha256=CmGsxHfCYkhE5mJFPyV7NXcJs7srvpQo_6PVjDyK3Nk,10144
99
+ pymammotion/mqtt/mammotion_future.py,sha256=_OWqKOlUGl2yT1xOsXFQYpGd-1zQ63OxqXgy7KRQgYc,710
100
+ pymammotion/mqtt/mammotion_mqtt.py,sha256=MUkwx4kaofrdppqMRUCzDjincIqi3OGo3g072ALpvDE,8765
101
+ pymammotion/mqtt/mqtt_models.py,sha256=3JXP9Nals-3f27pYUqxD9WrfQHf5tpnal1j4R6vr-CM,1760
102
+ pymammotion/mqtt/linkkit/__init__.py,sha256=ENgc3ynd2kd9gMQR3-kgmCu6Ed9Y6XCIzU0zFReUlkk,80
103
+ pymammotion/mqtt/linkkit/h2client.py,sha256=w9Nvi_nY4CLD_fw-pHtYChwQf7e2TiAGeqkY_sF4cf0,19659
104
+ pymammotion/mqtt/linkkit/linkkit.py,sha256=SGWny2_LKa8qg8RD0Bgd3a4S_fMqpYxJ7a9eFRvgcN0,132923
105
+ pymammotion/proto/__init__.py,sha256=tiNljAXKL-CkTfIgnJ0dzXhMTHuprHL9xThyNqoVR88,151190
106
+ pymammotion/proto/basestation.proto,sha256=YiSsDmT0DY_ep6DHay13SbhxGMhentYt0BmJrVQrwLQ,1198
107
+ pymammotion/proto/basestation_pb2.py,sha256=suenbpMz9JZCXdGJGdiPaapppRz9Cf4IDzAXUfdIG3w,3083
108
+ pymammotion/proto/basestation_pb2.pyi,sha256=lGcTPlGaLdHEQ1A39YITbMG_vs1cVaqHAg5TsPvzexc,4652
109
+ pymammotion/proto/common.proto,sha256=op8TCU1ppCMeP-izK2tXMoJXQyZXdgj1EgOKcd14A-A,81
110
+ pymammotion/proto/common_pb2.py,sha256=8OpJ04lLq8sAktY6CkP8TxVGar9x858sCf6FqLy7Rs4,1030
111
+ pymammotion/proto/common_pb2.pyi,sha256=skF2ydSIQIvoobjiCUjXVD-pTfJiAILbaUl6nkdh2SY,460
112
+ pymammotion/proto/dev_net.proto,sha256=EXZp8PV-_l6-Y6o55ANAudmgKP4YPc2oGNvXa1emD0I,6027
113
+ pymammotion/proto/dev_net_pb2.py,sha256=BHMv7iUEtBf6OnaZTwnshOdyY94zlLLr7f00xarTeYY,13906
114
+ pymammotion/proto/dev_net_pb2.pyi,sha256=LrAYzN1NcZ-uuINOzU-77WmGuUIw5pQMrlxlWv9funQ,23993
115
+ pymammotion/proto/luba_msg.proto,sha256=JHK9JqIIKEnamO7mI_67z4dj5yGXi5MGTtNA8I1QBNE,1695
116
+ pymammotion/proto/luba_msg_pb2.py,sha256=-dEGD7lCHeItY5D7dAZ391l7qqjWKafbx8tavl7qqgU,4564
117
+ pymammotion/proto/luba_msg_pb2.pyi,sha256=_pTiOzssrVbEty_yIjHpnQWbTNtFfKfqSC_wvpVT_bI,4325
118
+ pymammotion/proto/luba_mul.proto,sha256=jAJN9Sts0PfqmLYDdte5NIY36oOrMP0bbqat6RuigYI,2135
119
+ pymammotion/proto/luba_mul_pb2.py,sha256=MDZotppPPglKfTuBuWNjw6iHXbUVAH_PXPyl9VVF7sc,5724
120
+ pymammotion/proto/luba_mul_pb2.pyi,sha256=KsTOSGRTvcO1qO7wxuu827zRT7Eb7xnUN-KRd7dgm6s,7713
121
+ pymammotion/proto/mctrl_driver.proto,sha256=35U29NukN3ZT4davrrwOWtszmMX8R_8D39sWVMgixnY,2181
122
+ pymammotion/proto/mctrl_driver_pb2.py,sha256=gDk7woW1L3yyNx_Yufxa0_cjJnDIMW7EMqXBwhNsXKk,5512
123
+ pymammotion/proto/mctrl_driver_pb2.pyi,sha256=yVKNGzAWaQTFI1DQ6ytnHKofUmGqDmLqmNq_9TXofMQ,8494
124
+ pymammotion/proto/mctrl_nav.proto,sha256=qIhKkmP5yLCc85LmFq6OCC2cE_-S_CYoV0fHHWE4ohc,12804
125
+ pymammotion/proto/mctrl_nav_pb2.py,sha256=h7orPnijActaK0WAZF5LNeB3EDI7yqEPL_hWzmnEWVU,26271
126
+ pymammotion/proto/mctrl_nav_pb2.pyi,sha256=3u3yZ-H5TdKWAJh4bjuGNKXALVGotyfzKekK-eQZ5Xk,55825
127
+ pymammotion/proto/mctrl_ota.proto,sha256=feIooPeE-FgkLpjd0pWp6maAMaJOUIjIlbXk_FHDrD4,1337
128
+ pymammotion/proto/mctrl_ota_pb2.py,sha256=Fs5IQbGBZSvLqxertw1JRaYOGd2EhNI41lgSHkrGWPs,3762
129
+ pymammotion/proto/mctrl_ota_pb2.pyi,sha256=sXX19_q1SfLKMKzdPnmcy6eIslt1NASlD0hlMNNYCQY,5913
130
+ pymammotion/proto/mctrl_pept.proto,sha256=E-kp3dLPTbnrnRz4x1hFHfIbv4IYs2lHL8Nhs73qla4,807
131
+ pymammotion/proto/mctrl_pept_pb2.py,sha256=7rM3ZSn2XyPD0k2FUhL0zDrHmyC15ZUJgMXqx0biptg,2436
132
+ pymammotion/proto/mctrl_pept_pb2.pyi,sha256=rYmmllXOmHqz7PRn7IWGSkGjKmJRHI4HNA7ZkYipK_g,3308
133
+ pymammotion/proto/mctrl_sys.proto,sha256=XdmmJTkVmy7M93--tQIhM7w2B0YZdsTjSXqmD6kbd1g,15938
134
+ pymammotion/proto/mctrl_sys_pb2.py,sha256=N12eEXmpJZh5VvjN7QdNZAwWLABKtfHR5VGTzA-kxDY,33162
135
+ pymammotion/proto/mctrl_sys_pb2.pyi,sha256=N1sJJMx7qWsj1kKYoQJ4JEZanZetLZ5JThs1IXCChUE,61557
136
+ pymammotion/proto/message_pool.py,sha256=4-cRhhiM6bmfpUJZ8qxc8LEyqHBHpLCcotjbyZxl7JM,71
137
+ pymammotion/proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
138
+ pymammotion/utility/conversions.py,sha256=v3YICy0zZwwBBzrUZgabI7GRfiDBnkiAX2qdtk3NxOY,89
139
+ pymammotion/utility/datatype_converter.py,sha256=A9qHBTbnq2PniAyBKxx3Qrk08aF5SIXGK1lDIY1siPU,4424
140
+ pymammotion/utility/device_config.py,sha256=65Jl73-dQDs4yMXwYXZW_bsgSvnwpFBZDu8OQPEIgx8,27877
141
+ pymammotion/utility/device_type.py,sha256=RdxBdkqzd03Q0MCCkbfqLj_CKrks8nNV4ji50UvJbH8,17024
142
+ pymammotion/utility/map.py,sha256=1SdHmysJPSsQPd69QHm-xPkkN452iBF4TRZa2FAtyro,9372
143
+ pymammotion/utility/movement.py,sha256=N75oAoAgFydqoaOedYIxGUHmuTCtPzAOtb-d_29tpfI,615
144
+ pymammotion/utility/mur_mur_hash.py,sha256=5h2qew1eY3a1PrCzgQLsHeo_Q33ropgG1E23uzmZ72o,5864
145
+ pymammotion/utility/periodic.py,sha256=MbeSb9cfhxzYmdT_RiE0dZe3H9IfbQW_zSqhmSX2RUc,3321
146
+ pymammotion/utility/rocker_util.py,sha256=6tX7sS87qoQC_tsxbx3NLL-HgS08wtzXiZkhDiz7uo0,7179
147
+ pymammotion/utility/constant/__init__.py,sha256=tcY0LDeD-qDDHx2LKt55KOyv9ZI0UfCNM6fknLCmm8s,110
148
+ pymammotion/utility/constant/device_constant.py,sha256=X27pgHJaz9ljhepz-m0p6Dvpylg6ASB8om2PlFOd_nU,8250
149
+ pymammotion-0.5.51.dist-info/METADATA,sha256=XWYNt0F9nEobZajVggj_KRqbQybQB2cw44skILxb8Fk,3600
150
+ pymammotion-0.5.51.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
151
+ pymammotion-0.5.51.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
152
+ pymammotion-0.5.51.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.9.0
2
+ Generator: hatchling 1.27.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,65 +0,0 @@
1
- import base64
2
-
3
- from aliyunsdkcore import client
4
- from aliyunsdkiot.request.v20180120.GetDeviceStatusRequest import GetDeviceStatusRequest
5
- from aliyunsdkiot.request.v20180120.InvokeThingServiceRequest import (
6
- InvokeThingServiceRequest,
7
- )
8
-
9
-
10
- class CloudService:
11
- # com.aliyun.iot.aep.sdk
12
- # https://domestic.mammotion.com/privacy/ - lists all aliyun packages
13
- def __init__(self) -> None:
14
- self.selectDeviceIOTID = ""
15
- accessKeyId = "<your accessKey>"
16
- accessKeySecret = "<your accessSecret>"
17
- self.clt = client.AcsClient(accessKeyId, accessKeySecret, "ap-southeast")
18
-
19
- """
20
- String printBase64Binary = DatatypeConverter.printBase64Binary(byteArray);
21
- JSONObject jSONObject = new JSONObject();
22
- JSONObject jSONObject2 = new JSONObject();
23
- try {
24
- jSONObject2.put("content", printBase64Binary);
25
- jSONObject.put("args", jSONObject2);
26
- jSONObject.put("iotId", this.selectDeviceIOTID);
27
- jSONObject.put("identifier", "device_protobuf_sync_service");
28
- } catch (JSONException e) {
29
- e.printStackTrace();
30
- }
31
-
32
- """
33
-
34
- def invoke_thing_service(self, data: bytearray) -> None:
35
- base64_encoded = base64.b64encode(data).decode("utf-8")
36
-
37
- # Create a dictionary structure
38
- data = {
39
- "args": {"content": base64_encoded},
40
- "DEVICE_IOTID": self.selectDeviceIOTID,
41
- "identifier": "device_protobuf_sync_service",
42
- }
43
-
44
- request = InvokeThingServiceRequest()
45
- request.set_accept_format("json")
46
-
47
- request.set_Args("Args")
48
- request.set_Identifier("Identifier")
49
- request.set_IotId("IotId")
50
- request.set_ProductKey("ProductKey")
51
-
52
- response = self.clt.do_action_with_exception(request)
53
- # python2: print(response)
54
- print(response)
55
-
56
- def get_device_status(self) -> None:
57
- request = GetDeviceStatusRequest()
58
- request.set_accept_format("json")
59
-
60
- request.set_IotId("IotId")
61
- request.set_ProductKey("ProductKey")
62
- request.set_DeviceName("DeviceName")
63
-
64
- response = self.clt.do_action_with_exception(request)
65
- print(response)
@@ -1,58 +0,0 @@
1
- from typing import List
2
-
3
-
4
- class Plan:
5
- def __init__(self) -> None:
6
- self.pver: int = 0
7
- self.sub_cmd: int = 0
8
- self.area: int = 0
9
- self.work_time: int = 0
10
- self.version: str = ""
11
- self.id: str = ""
12
- self.user_id: str = ""
13
- self.device_id: str = ""
14
- self.plan_id: str = ""
15
- self.task_id: str = ""
16
- self.job_id: str = ""
17
- self.start_time: str = ""
18
- self.end_time: str = ""
19
- self.week: int = 0
20
- self.knife_height: int = 0
21
- self.model: int = 0
22
- self.edge_mode: int = 0
23
- self.required_time: int = 0
24
- self.route_angle: int = 0
25
- self.route_model: int = 0
26
- self.route_spacing: int = 0
27
- self.ultrasonic_barrier: int = 0
28
- self.total_plan_num: int = 0
29
- self.plan_index: int = 0
30
- self.result: int = 0
31
- self.speed: float = 0.0
32
- self.task_name: str = ""
33
- self.job_name: str = ""
34
- self.zone_hashs: list[int] = []
35
- self.reserved: str = ""
36
- self.weeks: list[int] = []
37
- self.start_date: str = ""
38
- self.end_date: str = ""
39
- self.job_type: int = 0
40
- self.interval_days: int = 0
41
- self.count_down: int = 0
42
- self.is_enable: bool = True
43
- self.is_mow_work: bool = True
44
- self.is_sweeping_work: bool = True
45
- self.mowing_laps: int = 0
46
- self.path_order: int = 0
47
- self.demond_angle: int = 90
48
-
49
- def __str__(self) -> str:
50
- return f"Plan(pver={self.pver}, sub_cmd={self.sub_cmd}, area={self.area}, work_time={self.work_time}, version='{self.version}', id='{self.id}', user_id='{self.user_id}', device_id='{self.device_id}', plan_id='{self.plan_id}', task_id='{self.task_id}', job_id='{self.job_id}', start_time='{self.start_time}', end_time='{self.end_time}', week={self.week}, knife_height={self.knife_height}, model={self.model}, edge_mode={self.edge_mode}, required_time={self.required_time}, route_angle={self.route_angle}, route_model={self.route_model}, route_spacing={self.route_spacing}, ultrasonic_barrier={self.ultrasonic_barrier}, total_plan_num={self.total_plan_num}, plan_index={self.plan_index}, result={self.result}, speed={self.speed}, task_name='{self.task_name}', job_name='{self.job_name}', zone_hashs={self.zone_hashs}, reserved='{self.reserved}', weeks={self.weeks}, start_date='{self.start_date}', end_date='{self.end_date}', job_type={self.job_type}, interval_days={self.interval_days}, count_down={self.count_down}, is_enable={self.is_enable}, mowing_laps={self.mowing_laps}, path_order={self.path_order}, demond_angle={self.demond_angle}, is_mow_work={self.is_mow_work}, is_sweeping_work={self.is_sweeping_work})"
51
-
52
- def __eq__(self, other):
53
- if isinstance(other, Plan):
54
- return self.plan_id == other.plan_id
55
- return False
56
-
57
- def __hash__(self):
58
- return hash(self.plan_id)
@@ -1,130 +0,0 @@
1
- """Manage state from notifications into MowingDevice."""
2
-
3
- import logging
4
- from datetime import datetime
5
- from typing import Any, Awaitable, Callable, Optional
6
-
7
- import betterproto
8
-
9
- from pymammotion.proto.dev_net import WifiIotStatusReport
10
- from pymammotion.aliyun.cloud_gateway import SetupException
11
- from pymammotion.data.model.device import MowingDevice
12
- from pymammotion.data.model.device_info import SideLight
13
- from pymammotion.data.model.hash_list import AreaHashNameList
14
- from pymammotion.data.mqtt.properties import ThingPropertiesMessage
15
- from pymammotion.proto.luba_msg import LubaMsg
16
- from pymammotion.proto.mctrl_nav import AppGetAllAreaHashName, NavGetCommDataAck, NavGetHashListAck
17
- from pymammotion.proto.mctrl_sys import TimeCtrlLight, DeviceProductTypeInfoT
18
- from pymammotion.utility.constant import WorkMode
19
-
20
- logger = logging.getLogger(__name__)
21
-
22
-
23
- class StateManager:
24
- """Manage state."""
25
-
26
- _device: MowingDevice
27
- last_updated_at: datetime = datetime.now()
28
-
29
- def __init__(self, device: MowingDevice) -> None:
30
- self._device = device
31
- self.gethash_ack_callback: Optional[Callable[[NavGetHashListAck], Awaitable[None]]] = None
32
- self.get_commondata_ack_callback: Optional[Callable[[NavGetCommDataAck], Awaitable[None]]] = None
33
- self.on_notification_callback: Optional[Callable[[], Awaitable[None]]] = None
34
- self.queue_command_callback: Optional[Callable[[str, dict[str, Any]], Awaitable[bytes]]] = None
35
- self.last_updated_at = datetime.now()
36
-
37
- def get_device(self) -> MowingDevice:
38
- """Get device."""
39
- return self._device
40
-
41
- def set_device(self, device: MowingDevice) -> None:
42
- """Set device."""
43
- self._device = device
44
-
45
- async def properties(self, properties: ThingPropertiesMessage) -> None:
46
- params = properties.params
47
- self._device.mqtt_properties = params
48
-
49
- async def notification(self, message: LubaMsg) -> None:
50
- """Handle protobuf notifications."""
51
- res = betterproto.which_one_of(message, "LubaSubMsg")
52
- self.last_updated_at = datetime.now()
53
-
54
- match res[0]:
55
- case "nav":
56
- await self._update_nav_data(message)
57
- case "sys":
58
- await self._update_sys_data(message)
59
- case "driver":
60
- self._update_driver_data(message)
61
- case "net":
62
- self._update_net_data(message)
63
- case "mul":
64
- self._update_mul_data(message)
65
- case "ota":
66
- self._update_ota_data(message)
67
-
68
- if self.on_notification_callback:
69
- await self.on_notification_callback()
70
-
71
- async def _update_nav_data(self, message) -> None:
72
- """Update nav data."""
73
- nav_msg = betterproto.which_one_of(message.nav, "SubNavMsg")
74
- match nav_msg[0]:
75
- case "toapp_gethash_ack":
76
- hashlist_ack: NavGetHashListAck = nav_msg[1]
77
- self._device.map.update_root_hash_list(hashlist_ack)
78
- await self.gethash_ack_callback(nav_msg[1])
79
- case "toapp_get_commondata_ack":
80
- common_data: NavGetCommDataAck = nav_msg[1]
81
- updated = self._device.map.update(common_data)
82
- if updated:
83
- await self.get_commondata_ack_callback(common_data)
84
- case "toapp_all_hash_name":
85
- hash_names: AppGetAllAreaHashName = nav_msg[1]
86
- converted_list = [AreaHashNameList(name=item.name, hash=item.hash) for item in hash_names.hashnames]
87
- self._device.map.area_name = converted_list
88
-
89
- async def _update_sys_data(self, message) -> None:
90
- """Update system."""
91
- sys_msg = betterproto.which_one_of(message.sys, "SubSysMsg")
92
- match sys_msg[0]:
93
- case "system_update_buf":
94
- self._device.buffer(sys_msg[1])
95
- case "toapp_report_data":
96
- self._device.update_report_data(sys_msg[1])
97
- if self.queue_command_callback:
98
- if self._device.sys.toapp_report_data.dev.sys_status != WorkMode.MODE_WORKING:
99
- try:
100
- await self.queue_command_callback("get_report_cfg_stop")
101
- except SetupException as exc:
102
- # can't do anything about it yet
103
- logger.debug(exc)
104
- case "mow_to_app_info":
105
- self._device.mow_info(sys_msg[1])
106
- case "system_tard_state_tunnel":
107
- self._device.run_state_update(sys_msg[1])
108
- case "todev_time_ctrl_light":
109
- ctrl_light: TimeCtrlLight = sys_msg[1]
110
- side_led: SideLight = SideLight.from_dict(ctrl_light.to_dict(casing=betterproto.Casing.SNAKE))
111
- self._device.mower_state.side_led = side_led
112
- case "device_product_type_info":
113
- device_product_type: DeviceProductTypeInfoT = sys_msg[1]
114
- self._device.mower_state.model_id = device_product_type.main_product_type
115
-
116
- def _update_driver_data(self, message) -> None:
117
- pass
118
-
119
- def _update_net_data(self, message) -> None:
120
- net_msg = betterproto.which_one_of(message.net, "NetSubType")
121
- match net_msg[0]:
122
- case "toapp_wifi_iot_status":
123
- wifi_iot_status: WifiIotStatusReport = net_msg[1]
124
- self._device.mower_state.product_key = wifi_iot_status.productkey
125
-
126
- def _update_mul_data(self, message) -> None:
127
- pass
128
-
129
- def _update_ota_data(self, message) -> None:
130
- pass