pymammotion 0.4.0a2__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.
- pymammotion/__init__.py +5 -4
- pymammotion/aliyun/client.py +235 -0
- pymammotion/aliyun/cloud_gateway.py +312 -64
- pymammotion/aliyun/model/aep_response.py +1 -2
- pymammotion/aliyun/model/dev_by_account_response.py +170 -23
- pymammotion/aliyun/model/login_by_oauth_response.py +2 -3
- pymammotion/aliyun/model/regions_response.py +3 -3
- pymammotion/aliyun/model/session_by_authcode_response.py +2 -2
- pymammotion/aliyun/model/thing_response.py +12 -0
- pymammotion/aliyun/regions.py +62 -0
- pymammotion/aliyun/tea/core.py +297 -0
- pymammotion/bluetooth/ble.py +7 -9
- pymammotion/bluetooth/ble_message.py +10 -14
- pymammotion/const.py +3 -0
- pymammotion/data/model/__init__.py +1 -2
- pymammotion/data/model/device.py +95 -27
- pymammotion/data/model/device_config.py +4 -4
- pymammotion/data/model/device_info.py +35 -0
- pymammotion/data/model/device_limits.py +10 -10
- pymammotion/data/model/enums.py +12 -2
- pymammotion/data/model/errors.py +12 -0
- pymammotion/data/model/events.py +14 -0
- pymammotion/data/model/generate_geojson.py +521 -0
- pymammotion/data/model/generate_route_information.py +2 -2
- pymammotion/data/model/hash_list.py +370 -57
- pymammotion/data/model/location.py +4 -4
- pymammotion/data/model/mowing_modes.py +17 -1
- pymammotion/data/model/raw_data.py +2 -10
- pymammotion/data/model/region_data.py +10 -11
- pymammotion/data/model/report_info.py +31 -5
- pymammotion/data/model/work.py +27 -0
- pymammotion/data/mower_state_manager.py +316 -0
- pymammotion/data/mqtt/event.py +73 -28
- pymammotion/data/mqtt/mammotion_properties.py +257 -0
- pymammotion/data/mqtt/properties.py +93 -78
- pymammotion/data/mqtt/status.py +18 -17
- pymammotion/event/event.py +27 -6
- pymammotion/homeassistant/__init__.py +3 -0
- pymammotion/homeassistant/mower_api.py +484 -0
- pymammotion/homeassistant/rtk_api.py +54 -0
- pymammotion/http/encryption.py +5 -6
- pymammotion/http/http.py +574 -28
- pymammotion/http/model/__init__.py +0 -0
- pymammotion/{aliyun/model/stream_subscription_response.py → http/model/camera_stream.py} +14 -2
- pymammotion/http/model/http.py +129 -4
- pymammotion/http/model/response_factory.py +61 -0
- pymammotion/http/model/rtk.py +16 -0
- pymammotion/mammotion/commands/abstract_message.py +7 -5
- pymammotion/mammotion/commands/mammotion_command.py +30 -1
- pymammotion/mammotion/commands/messages/basestation.py +43 -0
- pymammotion/mammotion/commands/messages/driver.py +61 -29
- pymammotion/mammotion/commands/messages/media.py +68 -15
- pymammotion/mammotion/commands/messages/navigation.py +61 -25
- pymammotion/mammotion/commands/messages/network.py +17 -23
- pymammotion/mammotion/commands/messages/ota.py +18 -18
- pymammotion/mammotion/commands/messages/system.py +32 -49
- pymammotion/mammotion/commands/messages/video.py +15 -16
- pymammotion/mammotion/devices/__init__.py +27 -3
- pymammotion/mammotion/devices/base.py +40 -131
- pymammotion/mammotion/devices/mammotion.py +436 -201
- pymammotion/mammotion/devices/mammotion_bluetooth.py +57 -47
- pymammotion/mammotion/devices/mammotion_cloud.py +134 -105
- pymammotion/mammotion/devices/mammotion_mower_ble.py +49 -0
- pymammotion/mammotion/devices/mammotion_mower_cloud.py +39 -0
- pymammotion/mammotion/devices/managers/managers.py +81 -0
- pymammotion/mammotion/devices/mower_device.py +124 -0
- pymammotion/mammotion/devices/mower_manager.py +107 -0
- pymammotion/mammotion/devices/rtk_ble.py +89 -0
- pymammotion/mammotion/devices/rtk_cloud.py +113 -0
- pymammotion/mammotion/devices/rtk_device.py +50 -0
- pymammotion/mammotion/devices/rtk_manager.py +122 -0
- pymammotion/mqtt/__init__.py +2 -1
- pymammotion/mqtt/aliyun_mqtt.py +232 -0
- pymammotion/mqtt/linkkit/__init__.py +5 -0
- pymammotion/mqtt/linkkit/h2client.py +585 -0
- pymammotion/mqtt/linkkit/linkkit.py +3023 -0
- pymammotion/mqtt/mammotion_mqtt.py +176 -169
- pymammotion/mqtt/mqtt_models.py +66 -0
- pymammotion/proto/__init__.py +4839 -4
- pymammotion/proto/basestation.proto +8 -0
- pymammotion/proto/basestation_pb2.py +11 -9
- pymammotion/proto/basestation_pb2.pyi +16 -2
- pymammotion/proto/dev_net.proto +79 -55
- pymammotion/proto/dev_net_pb2.py +60 -56
- pymammotion/proto/dev_net_pb2.pyi +49 -6
- pymammotion/proto/luba_msg.proto +2 -1
- pymammotion/proto/luba_msg_pb2.py +6 -6
- pymammotion/proto/luba_msg_pb2.pyi +1 -0
- pymammotion/proto/luba_mul.proto +62 -1
- pymammotion/proto/luba_mul_pb2.py +38 -22
- pymammotion/proto/luba_mul_pb2.pyi +94 -7
- pymammotion/proto/mctrl_driver.proto +44 -4
- pymammotion/proto/mctrl_driver_pb2.py +26 -14
- pymammotion/proto/mctrl_driver_pb2.pyi +66 -11
- pymammotion/proto/mctrl_nav.proto +93 -52
- pymammotion/proto/mctrl_nav_pb2.py +75 -67
- pymammotion/proto/mctrl_nav_pb2.pyi +142 -56
- pymammotion/proto/mctrl_ota.proto +40 -2
- pymammotion/proto/mctrl_ota_pb2.py +23 -13
- pymammotion/proto/mctrl_ota_pb2.pyi +67 -4
- pymammotion/proto/mctrl_pept.proto +8 -3
- pymammotion/proto/mctrl_pept_pb2.py +8 -6
- pymammotion/proto/mctrl_pept_pb2.pyi +14 -6
- pymammotion/proto/mctrl_sys.proto +325 -86
- pymammotion/proto/mctrl_sys_pb2.py +162 -98
- pymammotion/proto/mctrl_sys_pb2.pyi +451 -25
- pymammotion/proto/message_pool.py +3 -0
- pymammotion/proto/py.typed +0 -0
- pymammotion/utility/constant/device_constant.py +29 -5
- pymammotion/utility/datatype_converter.py +13 -12
- pymammotion/utility/device_config.py +522 -130
- pymammotion/utility/device_type.py +218 -21
- pymammotion/utility/map.py +238 -51
- pymammotion/utility/mur_mur_hash.py +159 -0
- {pymammotion-0.4.0a2.dist-info → pymammotion-0.5.51.dist-info}/METADATA +26 -31
- pymammotion-0.5.51.dist-info/RECORD +152 -0
- {pymammotion-0.4.0a2.dist-info → pymammotion-0.5.51.dist-info}/WHEEL +1 -1
- pymammotion/aliyun/cloud_service.py +0 -65
- pymammotion/data/model/plan.py +0 -58
- pymammotion/data/state_manager.py +0 -129
- pymammotion/proto/basestation.py +0 -59
- pymammotion/proto/common.py +0 -12
- pymammotion/proto/dev_net.py +0 -381
- pymammotion/proto/luba_msg.py +0 -81
- pymammotion/proto/luba_mul.py +0 -76
- pymammotion/proto/mctrl_driver.py +0 -100
- pymammotion/proto/mctrl_nav.py +0 -664
- pymammotion/proto/mctrl_ota.py +0 -48
- pymammotion/proto/mctrl_pept.py +0 -41
- pymammotion/proto/mctrl_sys.py +0 -574
- pymammotion-0.4.0a2.dist-info/RECORD +0 -131
- /pymammotion/http/{_init_.py → __init__.py} +0 -0
- {pymammotion-0.4.0a2.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,34 +1,30 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: pymammotion
|
|
3
|
-
Version: 0.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
Requires-Python:
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
Requires-Dist:
|
|
15
|
-
Requires-Dist:
|
|
16
|
-
Requires-Dist:
|
|
17
|
-
Requires-Dist:
|
|
18
|
-
Requires-Dist:
|
|
19
|
-
Requires-Dist:
|
|
20
|
-
Requires-Dist:
|
|
21
|
-
Requires-Dist:
|
|
22
|
-
Requires-Dist:
|
|
23
|
-
Requires-Dist:
|
|
24
|
-
Requires-Dist:
|
|
25
|
-
Requires-Dist: jsonic
|
|
26
|
-
Requires-Dist:
|
|
27
|
-
Requires-Dist:
|
|
28
|
-
Requires-Dist: orjson (>=3.9.15,<4.0.0)
|
|
29
|
-
Requires-Dist: paho-mqtt (>=1.6.1,<2.0.0)
|
|
30
|
-
Requires-Dist: protobuf (>=4.23.1)
|
|
31
|
-
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
|
|
32
28
|
Description-Content-Type: text/markdown
|
|
33
29
|
|
|
34
30
|
# PyMammotion - Python API for Mammotion Mowers [](https://discord.gg/vpZdWhJX8x)
|
|
@@ -97,4 +93,3 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
|
|
|
97
93
|
|
|
98
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.
|
|
99
95
|
|
|
100
|
-
|
|
@@ -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,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)
|
pymammotion/data/model/plan.py
DELETED
|
@@ -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,129 +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.data.model.device import MowingDevice
|
|
10
|
-
from pymammotion.data.model.device_info import SideLight
|
|
11
|
-
from pymammotion.data.model.hash_list import AreaHashNameList
|
|
12
|
-
from pymammotion.data.mqtt.properties import ThingPropertiesMessage
|
|
13
|
-
from pymammotion.proto.dev_net import WifiIotStatusReport
|
|
14
|
-
from pymammotion.proto.luba_msg import LubaMsg
|
|
15
|
-
from pymammotion.proto.mctrl_nav import AppGetAllAreaHashName, NavGetCommDataAck, NavGetHashListAck, SvgMessageAckT
|
|
16
|
-
from pymammotion.proto.mctrl_sys import DeviceProductTypeInfoT, TimeCtrlLight
|
|
17
|
-
|
|
18
|
-
logger = logging.getLogger(__name__)
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
class StateManager:
|
|
22
|
-
"""Manage state."""
|
|
23
|
-
|
|
24
|
-
_device: MowingDevice
|
|
25
|
-
last_updated_at: datetime = datetime.now()
|
|
26
|
-
|
|
27
|
-
def __init__(self, device: MowingDevice) -> None:
|
|
28
|
-
self._device = device
|
|
29
|
-
self.gethash_ack_callback: Optional[Callable[[NavGetHashListAck], Awaitable[None]]] = None
|
|
30
|
-
self.get_commondata_ack_callback: Optional[Callable[[NavGetCommDataAck | SvgMessageAckT], Awaitable[None]]] = (
|
|
31
|
-
None
|
|
32
|
-
)
|
|
33
|
-
self.on_notification_callback: Optional[Callable[[tuple[str, Any | None]], 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(res)
|
|
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_svg_msg":
|
|
85
|
-
common_data: SvgMessageAckT = nav_msg[1]
|
|
86
|
-
updated = self._device.map.update(common_data)
|
|
87
|
-
if updated:
|
|
88
|
-
await self.get_commondata_ack_callback(common_data)
|
|
89
|
-
|
|
90
|
-
case "toapp_all_hash_name":
|
|
91
|
-
hash_names: AppGetAllAreaHashName = nav_msg[1]
|
|
92
|
-
converted_list = [AreaHashNameList(name=item.name, hash=item.hash) for item in hash_names.hashnames]
|
|
93
|
-
self._device.map.area_name = converted_list
|
|
94
|
-
|
|
95
|
-
async def _update_sys_data(self, message) -> None:
|
|
96
|
-
"""Update system."""
|
|
97
|
-
sys_msg = betterproto.which_one_of(message.sys, "SubSysMsg")
|
|
98
|
-
match sys_msg[0]:
|
|
99
|
-
case "system_update_buf":
|
|
100
|
-
self._device.buffer(sys_msg[1])
|
|
101
|
-
case "toapp_report_data":
|
|
102
|
-
self._device.update_report_data(sys_msg[1])
|
|
103
|
-
case "mow_to_app_info":
|
|
104
|
-
self._device.mow_info(sys_msg[1])
|
|
105
|
-
case "system_tard_state_tunnel":
|
|
106
|
-
self._device.run_state_update(sys_msg[1])
|
|
107
|
-
case "todev_time_ctrl_light":
|
|
108
|
-
ctrl_light: TimeCtrlLight = sys_msg[1]
|
|
109
|
-
side_led: SideLight = SideLight.from_dict(ctrl_light.to_dict(casing=betterproto.Casing.SNAKE))
|
|
110
|
-
self._device.mower_state.side_led = side_led
|
|
111
|
-
case "device_product_type_info":
|
|
112
|
-
device_product_type: DeviceProductTypeInfoT = sys_msg[1]
|
|
113
|
-
self._device.mower_state.model_id = device_product_type.main_product_type
|
|
114
|
-
|
|
115
|
-
def _update_driver_data(self, message) -> None:
|
|
116
|
-
pass
|
|
117
|
-
|
|
118
|
-
def _update_net_data(self, message) -> None:
|
|
119
|
-
net_msg = betterproto.which_one_of(message.net, "NetSubType")
|
|
120
|
-
match net_msg[0]:
|
|
121
|
-
case "toapp_wifi_iot_status":
|
|
122
|
-
wifi_iot_status: WifiIotStatusReport = net_msg[1]
|
|
123
|
-
self._device.mower_state.product_key = wifi_iot_status.productkey
|
|
124
|
-
|
|
125
|
-
def _update_mul_data(self, message) -> None:
|
|
126
|
-
pass
|
|
127
|
-
|
|
128
|
-
def _update_ota_data(self, message) -> None:
|
|
129
|
-
pass
|