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

@@ -1,72 +1,259 @@
1
1
  import math
2
2
 
3
3
  import numpy as np
4
+ from numpy.typing import NDArray
4
5
 
5
- from pymammotion.data.model.location import Point
6
+ from pymammotion.data.model.location import LocationPoint
6
7
 
7
8
 
8
9
  class CoordinateConverter:
9
- def __init__(self, latitude_rad: float, longitude_rad: float) -> None:
10
- # Initialize constants
11
- self.WGS84A = 6378137.0
12
- self.f_ = 3.3528106647474805e-21
13
- self.b_ = (1.0 - self.f_) * self.WGS84A
14
- self.e2_ = (2.0 - self.f_) * self.f_
15
- self.e2m_ = (1.0 - self.f_) * (1.0 - self.f_)
16
- self.ep2_ = ((self.WGS84A**2) - (self.b_**2)) / (self.b_**2)
17
-
18
- # Initialize rotation matrix
19
- self.R_ = np.zeros((3, 3))
20
-
21
- # Variables to store initial LLA
22
- self.x0_ = 0.0
23
- self.y0_ = 0.0
24
- self.z0_ = 0.0
25
-
26
- # Call set_init_lla with provided lat/lon
27
- self.set_init_lla(latitude_rad, longitude_rad)
28
-
29
- def set_init_lla(self, lat_rad, lon_rad) -> None:
10
+ """Converts between ENU (East-North-Up) and LLA (Latitude-Longitude-Altitude) coordinate systems.
11
+
12
+ Uses WGS84 ellipsoid model for Earth coordinate transformations.
13
+ """
14
+
15
+ # WGS84 ellipsoid constants
16
+ WGS84A: float = 6378137.0 # Semi-major axis (equatorial radius) in meters
17
+ FLATTENING: float = 0.0033528106647474805 # WGS84 flattening factor
18
+
19
+ def __init__(self, latitude_rad: float, longitude_rad: float, yaw_rad: float = 0.0) -> None:
20
+ """Initialize the coordinate converter.
21
+
22
+ Args:
23
+ latitude_rad: Reference latitude in radians
24
+ longitude_rad: Reference longitude in radians
25
+ yaw_rad: Reference yaw angle in radians (default: 0.0)
26
+
27
+ """
28
+ # WGS84 ellipsoid parameters
29
+ self.semi_major_axis: float = self.WGS84A
30
+ self.flattening: float = self.FLATTENING
31
+ self.semi_minor_axis: float = (1.0 - self.flattening) * self.WGS84A
32
+
33
+ # Eccentricity parameters
34
+ self.first_eccentricity_squared: float = (2.0 - self.flattening) * self.flattening
35
+ self.eccentricity_ratio_squared: float = (1.0 - self.flattening) * (1.0 - self.flattening)
36
+ self.second_eccentricity_squared: float = (self.semi_major_axis**2 - self.semi_minor_axis**2) / (
37
+ self.semi_minor_axis**2
38
+ )
39
+
40
+ # Rotation matrix for coordinate transformation
41
+ self.rotation_matrix: NDArray[np.float64] = np.zeros((3, 3), dtype=np.float64)
42
+
43
+ # ECEF origin coordinates
44
+ self.x0: float = 0.0
45
+ self.y0: float = 0.0
46
+ self.z0: float = 0.0
47
+
48
+ # Yaw angle
49
+ self.yaw: float = yaw_rad
50
+
51
+ # Initialize with provided reference point
52
+ self.set_init_lla(latitude_rad, longitude_rad, yaw_rad)
53
+
54
+ def set_init_lla(self, latitude_rad: float, longitude_rad: float, yaw_rad: float = 0.0) -> None:
55
+ """Set the initial LLA reference point and yaw angle.
56
+
57
+ Args:
58
+ latitude_rad: Reference latitude in radians
59
+ longitude_rad: Reference longitude in radians
60
+ yaw_rad: Reference yaw angle in radians (default: 0.0)
61
+
62
+ """
63
+ self.yaw = yaw_rad
64
+
65
+ sin_lat = math.sin(latitude_rad)
66
+ cos_lat = math.cos(latitude_rad)
67
+ sin_lon = math.sin(longitude_rad)
68
+ cos_lon = math.cos(longitude_rad)
69
+
70
+ # Radius of curvature in the prime vertical
71
+ N = self.semi_major_axis / math.sqrt(1.0 - self.first_eccentricity_squared * (sin_lat**2))
72
+
73
+ # Calculate ECEF origin coordinates (altitude = 0)
74
+ horizontal_distance = N * cos_lat
75
+ self.x0 = horizontal_distance * cos_lon
76
+ self.y0 = horizontal_distance * sin_lon
77
+ self.z0 = self.eccentricity_ratio_squared * N * sin_lat
78
+
79
+ # Build rotation matrix (ECEF to ENU)
80
+ self.rotation_matrix[0, 0] = -sin_lon
81
+ self.rotation_matrix[0, 1] = cos_lon
82
+ self.rotation_matrix[0, 2] = 0.0
83
+
84
+ self.rotation_matrix[1, 0] = -cos_lon * sin_lat
85
+ self.rotation_matrix[1, 1] = -sin_lon * sin_lat
86
+ self.rotation_matrix[1, 2] = cos_lat
87
+
88
+ self.rotation_matrix[2, 0] = cos_lon * cos_lat
89
+ self.rotation_matrix[2, 1] = sin_lon * cos_lat
90
+ self.rotation_matrix[2, 2] = sin_lat
91
+
92
+ def enu_to_lla(self, east: float, north: float) -> LocationPoint:
93
+ """Convert ENU (East-North-Up) coordinates to LLA (Latitude-Longitude-Altitude).
94
+
95
+ Args:
96
+ east: East coordinate in meters
97
+ north: North coordinate in meters
98
+
99
+ Returns:
100
+ Point with latitude and longitude in degrees
101
+
102
+ """
103
+ # Transform ENU to ECEF (Earth-Centered, Earth-Fixed) coordinates
104
+ # using rotation matrix and origin offset
105
+ ecef_x = self.rotation_matrix[0, 0] * north + self.rotation_matrix[1, 0] * east + self.x0
106
+ ecef_y = self.rotation_matrix[0, 1] * north + self.rotation_matrix[1, 1] * east + self.y0
107
+ ecef_z = self.rotation_matrix[0, 2] * north + self.rotation_matrix[1, 2] * east + self.z0
108
+
109
+ # Calculate horizontal distance from Earth's axis
110
+ horizontal_distance = math.hypot(ecef_x, ecef_y)
111
+
112
+ # Initial latitude estimate using simplified formula
113
+ initial_latitude = math.atan2(self.semi_major_axis * ecef_z, self.semi_minor_axis * horizontal_distance)
114
+
115
+ sin_initial_lat = math.sin(initial_latitude)
116
+ cos_initial_lat = math.cos(initial_latitude)
117
+
118
+ # Calculate longitude (straightforward conversion from ECEF)
119
+ longitude_deg = math.degrees(math.atan2(ecef_y, ecef_x))
120
+
121
+ # Calculate precise latitude using iterative correction
122
+ # This accounts for Earth's ellipsoidal shape
123
+ latitude_rad = math.atan2(
124
+ ecef_z + self.second_eccentricity_squared * self.semi_minor_axis * (sin_initial_lat**3),
125
+ horizontal_distance - self.first_eccentricity_squared * self.semi_major_axis * (cos_initial_lat**3),
126
+ )
127
+ latitude_deg = math.degrees(latitude_rad)
128
+
129
+ return LocationPoint(latitude=latitude_deg, longitude=longitude_deg)
130
+
131
+ def lla_to_enu(self, longitude_deg: float, latitude_deg: float) -> list[float]:
132
+ """Convert LLA (Latitude-Longitude-Altitude) to ENU (East-North-Up) coordinates.
133
+
134
+ Args:
135
+ longitude_deg: Longitude in degrees
136
+ latitude_deg: Latitude in degrees
137
+
138
+ Returns:
139
+ List of [east, north] coordinates in meters
140
+
141
+ """
142
+ # Convert to radians
143
+ lat_rad = math.radians(latitude_deg)
144
+ lon_rad = math.radians(longitude_deg)
145
+
30
146
  sin_lat = math.sin(lat_rad)
31
147
  cos_lat = math.cos(lat_rad)
32
148
  sin_lon = math.sin(lon_rad)
33
149
  cos_lon = math.cos(lon_rad)
34
150
 
35
- sqrt = self.WGS84A / math.sqrt(1.0 - (self.e2_ * (sin_lat**2)))
36
- d3 = sqrt * cos_lat
151
+ # Calculate radius of curvature
152
+ N = self.semi_major_axis / math.sqrt(1.0 - self.first_eccentricity_squared * (sin_lat**2))
37
153
 
38
- self.x0_ = d3 * cos_lon
39
- self.y0_ = d3 * sin_lon
40
- self.z0_ = self.e2m_ * sqrt * sin_lat
154
+ # Convert to ECEF (altitude = 0)
155
+ horizontal = N * cos_lat
156
+ ecef_x = horizontal * cos_lon
157
+ ecef_y = horizontal * sin_lon
158
+ ecef_z = self.eccentricity_ratio_squared * N * sin_lat
41
159
 
42
- self.R_[0][0] = -sin_lon
43
- self.R_[0][1] = cos_lon
44
- self.R_[0][2] = 0.0
160
+ # Translate to origin
161
+ dx = ecef_x - self.x0
162
+ dy = ecef_y - self.y0
163
+ dz = ecef_z - self.z0
45
164
 
46
- self.R_[1][0] = -cos_lon * sin_lat
47
- self.R_[1][1] = -sin_lon * sin_lat
48
- self.R_[1][2] = cos_lat
165
+ # Rotate to ENU frame
166
+ east = self.rotation_matrix[0, 0] * dx + self.rotation_matrix[0, 1] * dy + self.rotation_matrix[0, 2] * dz
167
+ north = self.rotation_matrix[1, 0] * dx + self.rotation_matrix[1, 1] * dy + self.rotation_matrix[1, 2] * dz
49
168
 
50
- self.R_[2][0] = cos_lon * cos_lat
51
- self.R_[2][1] = sin_lon * cos_lat
52
- self.R_[2][2] = sin_lat
169
+ # Apply yaw rotation (inverse)
170
+ rotated_east = math.cos(-self.yaw) * east - math.sin(-self.yaw) * north
171
+ rotated_north = math.sin(-self.yaw) * east + math.cos(-self.yaw) * north
53
172
 
54
- def enu_to_lla(self, e, n) -> Point:
55
- d3 = self.R_[0][0] * n + self.R_[1][0] * e + self.x0_
56
- d4 = self.R_[0][1] * n + self.R_[1][1] * e + self.y0_
57
- d5 = self.R_[0][2] * n + self.R_[1][2] * e + self.z0_
173
+ return [round(rotated_east, 3), round(rotated_north, 3)]
58
174
 
59
- hypot = math.hypot(d3, d4)
60
- atan2_lat = math.atan2(self.WGS84A * d5, self.b_ * hypot)
175
+ def get_transform_yaw_with_yaw(self, yaw_degrees: float) -> float:
176
+ """Transform a yaw angle from global coordinates to local coordinates.
61
177
 
62
- sin_lat = math.sin(atan2_lat)
63
- cos_lat = math.cos(atan2_lat)
178
+ This applies the inverse of the reference yaw rotation to convert a global
179
+ heading angle into the local coordinate frame.
64
180
 
65
- lon = math.atan2(d4, d3) * 180.0 / math.pi
66
- lat = (
67
- math.atan2(d5 + self.ep2_ * self.b_ * (sin_lat**3), hypot - self.e2_ * self.WGS84A * (cos_lat**3))
68
- * 180.0
69
- / math.pi
70
- )
181
+ Args:
182
+ yaw_degrees: Input yaw angle in degrees
183
+
184
+ Returns:
185
+ Transformed yaw angle in degrees
186
+
187
+ """
188
+ # Convert input angle to radians
189
+ yaw_rad = math.radians(yaw_degrees)
190
+
191
+ # Apply inverse rotation: -self.yaw
192
+ inverse_yaw = -self.yaw
193
+
194
+ # Using angle addition formula: atan2(sin(a+b), cos(a+b))
195
+ # where a = inverse_yaw, b = yaw_rad
196
+ sin_sum = math.sin(inverse_yaw) * math.cos(yaw_rad) + math.cos(inverse_yaw) * math.sin(yaw_rad)
197
+ cos_sum = math.cos(inverse_yaw) * math.cos(yaw_rad) - math.sin(inverse_yaw) * math.sin(yaw_rad)
198
+
199
+ # Calculate resulting angle and convert back to degrees
200
+ result_rad = math.atan2(sin_sum, cos_sum)
201
+ result_degrees = math.degrees(result_rad)
202
+
203
+ return result_degrees
204
+
205
+ def get_angle_yaw(self) -> float:
206
+ """Get the current yaw angle in degrees.
207
+
208
+ Returns:
209
+ Yaw angle in degrees
210
+
211
+ """
212
+ return math.degrees(self.yaw)
213
+
214
+ def get_yaw(self) -> float:
215
+ """Get the current yaw angle in radians.
216
+
217
+ Returns:
218
+ Yaw angle in radians
219
+
220
+ """
221
+ return self.yaw
222
+
223
+ def set_yaw(self, yaw_rad: float) -> None:
224
+ """Set the yaw angle.
225
+
226
+ Args:
227
+ yaw_rad: Yaw angle in radians
228
+
229
+ """
230
+ self.yaw = yaw_rad
231
+
232
+ def set_yaw_degrees(self, yaw_degrees: float) -> None:
233
+ """Set the yaw angle from degrees.
234
+
235
+ Args:
236
+ yaw_degrees: Yaw angle in degrees
237
+
238
+ """
239
+ self.yaw = math.radians(yaw_degrees)
240
+
241
+
242
+ # Usage example
243
+ if __name__ == "__main__":
244
+ # Initialize converter with reference point
245
+ converter = CoordinateConverter(
246
+ latitude_rad=math.radians(40.0), longitude_rad=math.radians(-105.0), yaw_rad=math.radians(45.0)
247
+ )
248
+
249
+ # Convert ENU to LLA
250
+ point = converter.enu_to_lla(east=100.0, north=200.0)
251
+ print(f"Latitude: {point.latitude}, Longitude: {point.longitude}")
252
+
253
+ # Convert LLA to ENU
254
+ enu = converter.lla_to_enu(longitude_deg=-105.0, latitude_deg=40.0)
255
+ print(f"East: {enu[0]}, North: {enu[1]}")
71
256
 
72
- return Point(latitude=lat, longitude=lon)
257
+ # Transform yaw angle
258
+ transformed_yaw = converter.get_transform_yaw_with_yaw(90.0)
259
+ print(f"Transformed yaw: {transformed_yaw}°")
@@ -124,7 +124,7 @@ class MurMurHashUtil:
124
124
  return value & 0x7FFFFFFFFFFFFFFF
125
125
 
126
126
  @staticmethod
127
- def hash_unsigned(data) -> int:
127
+ def hash_unsigned(data: str | bytes) -> int:
128
128
  """Get unsigned hash value
129
129
  Can accept bytes or string
130
130
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pymammotion
3
- Version: 0.5.44
3
+ Version: 0.5.53
4
4
  Author: jLynx
5
5
  Author-email: Michael Arthur <michael@jumblesoft.co.nz>
6
6
  License-Expression: GPL-3.0
@@ -11,7 +11,7 @@ Requires-Dist: alibabacloud-apigateway-util<0.0.3,>=0.0.2
11
11
  Requires-Dist: alibabacloud-iot-api-gateway<0.0.5,>=0.0.4
12
12
  Requires-Dist: alicloud-gateway-iot<2,>=1.0.0
13
13
  Requires-Dist: async-timeout<5,>=4.0.3
14
- Requires-Dist: betterproto2<0.9,>=0.8.0
14
+ Requires-Dist: betterproto2>=0.9.1
15
15
  Requires-Dist: bleak-retry-connector>=3.5.0
16
16
  Requires-Dist: bleak>=0.21.0
17
17
  Requires-Dist: crcmod~=1.7
@@ -24,6 +24,7 @@ Requires-Dist: paho-mqtt<3,>=2.1.0
24
24
  Requires-Dist: protobuf>=4.23.1
25
25
  Requires-Dist: py-jsonic<0.0.3,>=0.0.2
26
26
  Requires-Dist: pyjwt>=2.10.1
27
+ Requires-Dist: shapely>=2.1.2
27
28
  Description-Content-Type: text/markdown
28
29
 
29
30
  # PyMammotion - Python API for Mammotion Mowers [![Discord](https://img.shields.io/discord/1247286396297678879)](https://discord.gg/vpZdWhJX8x)
@@ -8,7 +8,7 @@ pymammotion/aliyun/regions.py,sha256=ctlRGrmdE4-xgItl9slCANYOV502qVN5lkAU4lj92sk
8
8
  pymammotion/aliyun/tmp_constant.py,sha256=M4Hq_lrGB3LZdX6R2XohRPFoK1NDnNV-pTJwJcJ9838,6650
9
9
  pymammotion/aliyun/model/aep_response.py,sha256=EY4uMTJ4F9rvbcXnAOc5YKi7q__9kIVgfDwfyr65Gk0,421
10
10
  pymammotion/aliyun/model/connect_response.py,sha256=Yz-fEbDzgGPTo5Of2oAjmFkSv08T7ze80pQU4k-gKIU,824
11
- pymammotion/aliyun/model/dev_by_account_response.py,sha256=9L-ST-U64gYh0FtmXO94ArMgsnB3vdMmq2w20tF4hrQ,7051
11
+ pymammotion/aliyun/model/dev_by_account_response.py,sha256=PTkHRJQzEdqJRIGKEaU_4Q45O2KdupxRjZGR757xzvw,6788
12
12
  pymammotion/aliyun/model/login_by_oauth_response.py,sha256=g7JnvEjoa3SplHd-UqCuK6x0qtODpHlDyJCHRz7tfDI,1228
13
13
  pymammotion/aliyun/model/regions_response.py,sha256=HSnpPcgpjr6VNXBQHw__gn-xWCkQ-MZ-Tmus9_va9mI,635
14
14
  pymammotion/aliyun/model/session_by_authcode_response.py,sha256=0owdNcGFIP7rsVqLIf9rT-iOtvWmKCt2AW0cUUXwFiQ,427
@@ -25,25 +25,27 @@ pymammotion/bluetooth/data/notifydata.py,sha256=jeROpoFmaZfNTidkLLm5VYeFbeIgDSi8
25
25
  pymammotion/bluetooth/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
26
  pymammotion/bluetooth/model/atomic_integer.py,sha256=jtSqeqd6It3TvzZN7TJyYHQNRuItuw0Bg-cL0AUEBhY,1666
27
27
  pymammotion/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
- pymammotion/data/mower_state_manager.py,sha256=-iLTn6zrnhQYzKCto-SoLeu9OpIxa_YQ_7V8mLf3g4A,14390
28
+ pymammotion/data/mower_state_manager.py,sha256=2E77AM0nF-2pPNW1_s7Z96dxPOBsKOe9-or-n9ahUE8,16979
29
29
  pymammotion/data/model/__init__.py,sha256=UVRbSXGOjYnWv30ZEvzT5QRpdVqAbyeToo-t0QBWyi4,292
30
30
  pymammotion/data/model/account.py,sha256=vJM-KTf2q6eBfVC-UlNHBSmJvqHiCawZ40vnuhXhaz8,140
31
- pymammotion/data/model/device.py,sha256=MeaB0ucFuNU5E4RAQ6qC8sTqdPJMw3lsMXR_YmYvqEM,8350
31
+ pymammotion/data/model/device.py,sha256=B9hJfNII239vBd8ghvcDKjT84NY-WdRQIuysZUm50RM,8781
32
32
  pymammotion/data/model/device_config.py,sha256=cLfvO_xs8GhEQbhTZLOfhYK5OX4T337M9OZkyQ_GNWQ,2652
33
- pymammotion/data/model/device_info.py,sha256=vjqHlRbHOyEkkaIoTwAp14CZMY5R5o609SbThfOO-gg,1390
33
+ pymammotion/data/model/device_info.py,sha256=YRs-7kcnzS5qNeZTvLTNewv8RZ_Qx51pXrebSKYj7Ks,1411
34
34
  pymammotion/data/model/device_limits.py,sha256=m8HdxD-RaAkPm7jHYb9GLxMEH9IfzBPz0ZypmsLnId4,1946
35
35
  pymammotion/data/model/enums.py,sha256=LVLP-9ypW0NxwyTeizxPVFNX3INWGfhSR9obM_vl0-M,1782
36
36
  pymammotion/data/model/errors.py,sha256=lBHq2cE8P5fc6Q4JXgrkJXzFKTWgxsoPOyMlTaJWbWk,396
37
+ pymammotion/data/model/events.py,sha256=fa8xG6kB2NgZKzpd-T9TKRcVEme_fdB5VnHuF2Qa62s,392
37
38
  pymammotion/data/model/excute_boarder_params.py,sha256=9CpUqrygcle1C_1hDW-riLmm4map4ZbE842NXjcomEI,1394
38
39
  pymammotion/data/model/execute_boarder.py,sha256=9rd_h4fbcsXxgnLOd2rO2hWyD1abnTGc47QTEpp8DD0,1103
40
+ pymammotion/data/model/generate_geojson.py,sha256=jGDdj5q6RdWyNtWFFLhtOHmEISY4-pngXFKCEwCf9WI,19360
39
41
  pymammotion/data/model/generate_route_information.py,sha256=-_c8pk10zwRh-O2vJ0i3DDCOQbv9CRJ7YNWpfsIpajI,807
40
- pymammotion/data/model/hash_list.py,sha256=jikG45FlsIBXaPzFN84WVN7Mn-c1yi3BmMC46aw2c3k,14817
41
- pymammotion/data/model/location.py,sha256=PwmITejfI4pm7PI4rzqSuuHetwle6IJr_CV95435s2M,871
42
+ pymammotion/data/model/hash_list.py,sha256=rRH7p6WlFC7n9uNwlDfd9TxaYK0zvSMX2OQtIxyNmQA,15373
43
+ pymammotion/data/model/location.py,sha256=BirPRZDjZEi_pEg2RquCOfCRR8cV4THuWyHoJM8gAAg,919
42
44
  pymammotion/data/model/mowing_modes.py,sha256=4rMn1H8w2iU2aBwpmAhPh_sT81yqrocrWWUIaU7DCIc,1171
43
45
  pymammotion/data/model/rapid_state.py,sha256=mIdhAG_LZXpVcybxqTLgLXkNOmVmDTn04B9PGIDA8Ls,1251
44
46
  pymammotion/data/model/raw_data.py,sha256=x2xuqVC8CQuV3ui3QK4G5EqRET9EsNljHLHR11ByYgo,6471
45
47
  pymammotion/data/model/region_data.py,sha256=OP4hXYX2U1gNxU7VFsHQfQbE1Bze_nvVFQ0ZT7XZJsg,2909
46
- pymammotion/data/model/report_info.py,sha256=3nXBFRfdKWnZj4YfBcrPwhBRpq58ICMQlrESfI1tTMg,3808
48
+ pymammotion/data/model/report_info.py,sha256=Dr5lKUZSbyaNs44PyLRuKin2KVmPvup-XXPkZ5IzIWo,3989
47
49
  pymammotion/data/model/work.py,sha256=AfKMItFqnRtAlVHzKCfYY-BQy-WFDYZBzdj-9Yc03bo,655
48
50
  pymammotion/data/mqtt/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
49
51
  pymammotion/data/mqtt/event.py,sha256=JPzu2XCgyLwcdKsN9vqg94WMvHtsGH6vHHSFGstILjo,6911
@@ -51,13 +53,13 @@ pymammotion/data/mqtt/mammotion_properties.py,sha256=oMsHkMJQxLjiUu8wXtWiLV7cmUP
51
53
  pymammotion/data/mqtt/properties.py,sha256=40r6rW7bL1R4v1PFEhBMF7Z45UfpgafhsAou5JyB6NU,5152
52
54
  pymammotion/data/mqtt/status.py,sha256=jZ1Qx8tRhtBOguL7MOtR0jhsA1cRmVKoPJszho5A2Bs,1644
53
55
  pymammotion/event/__init__.py,sha256=mgATR6vPHACNQ-0zH5fi7NdzeTCDV1CZyaWPmtUusi8,115
54
- pymammotion/event/event.py,sha256=Z8WYxv_-5khEqKjL1w4c_Et24G1Kdm8QFuIBylD3h3U,3021
56
+ pymammotion/event/event.py,sha256=P2yphZfJwMCefVE4h4hLTDPqCCVd63tSUo667gWF72c,3153
55
57
  pymammotion/homeassistant/__init__.py,sha256=j0aQZKWR41pCDR3g1y2p_zfp033pESECcqXiefRg1DQ,107
56
- pymammotion/homeassistant/mower_api.py,sha256=bQPCAre0tD3dO4vr07vfKOENmnA8Fv0NVMMq_fkt0ik,19207
57
- pymammotion/homeassistant/rtk_api.py,sha256=YyTF_14cWvvT31H-LYD715W82KsWfkV1nwXsJcHfQ7I,2445
58
+ pymammotion/homeassistant/mower_api.py,sha256=75spHV7tlduFBN_JGe3VWojLXQ8kBzOZLQlg8YPaU-w,20836
59
+ pymammotion/homeassistant/rtk_api.py,sha256=XVc6S0zN2dl2PWXGJ3bAFRba4AICofg1hYCUE84czTw,2516
58
60
  pymammotion/http/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
59
61
  pymammotion/http/encryption.py,sha256=lzXu3WwBdQlzjXxWnlJuRgkCrKdPbxx5drhMitVKIEk,8287
60
- pymammotion/http/http.py,sha256=kFHvHV73zeTaRvdi-GbWD59YdXrszPTQI24I7EljDT4,29372
62
+ pymammotion/http/http.py,sha256=OKJMDmWvp0T7Er9zgpdx4fGAk8GkJHplo-r9xLdl3GE,29674
61
63
  pymammotion/http/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
64
  pymammotion/http/model/camera_stream.py,sha256=ilxQNny_w9Frwt-m8kbHinvyjDv4Bx8C2swfZ2lTEDE,600
63
65
  pymammotion/http/model/http.py,sha256=PymW658jcAxYNmO3l3NBXMATc8WK_lZuZfj_9seMbBQ,6433
@@ -71,7 +73,7 @@ pymammotion/mammotion/commands/messages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5J
71
73
  pymammotion/mammotion/commands/messages/basestation.py,sha256=a1LEF4C25ynILeQLx-FOOU4d-N_vMkXSh_etojJjIDM,1442
72
74
  pymammotion/mammotion/commands/messages/driver.py,sha256=tJUM1WhlWFs92PbZW5QSG-TMo6nemAUkcUDzI_6gETU,4695
73
75
  pymammotion/mammotion/commands/messages/media.py,sha256=KJyMzSZkwQrHWjAWfAI88Y7-jmfN3-WYtY193KaomT4,2930
74
- pymammotion/mammotion/commands/messages/navigation.py,sha256=iirpqbbLqGWafwK5AB_xXyUvytZ-sAxrTYEqXI14Flg,23424
76
+ pymammotion/mammotion/commands/messages/navigation.py,sha256=QO6MNLB-nu1G2kDIOu6eFu6oCtGwM-bA6TsVLBiY670,24806
75
77
  pymammotion/mammotion/commands/messages/network.py,sha256=7K6aqt29ymTSUG0iEv4kIRD0Dv6rfHNctE00UvuMpG4,7264
76
78
  pymammotion/mammotion/commands/messages/ota.py,sha256=Nk3Tlp6n7hkbkuy355BlqbozHIHzsYnrH2cDO8QGaLk,1446
77
79
  pymammotion/mammotion/commands/messages/system.py,sha256=1Xchdx7Y0-kbrM-knSEUhwELu9PyF7DjtsCFt7_BCXw,13343
@@ -80,12 +82,12 @@ pymammotion/mammotion/control/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5N
80
82
  pymammotion/mammotion/control/joystick.py,sha256=QfBVxM_gxpWsZAGO90whtgxCI2tIZ3TTad9wHIPsU9s,5640
81
83
  pymammotion/mammotion/devices/__init__.py,sha256=YYphpxf0zr1Xc_dOBKsCzcO5zSwlewuhZNjAbmy6cHI,1012
82
84
  pymammotion/mammotion/devices/base.py,sha256=MLLup0ZQI1GvyEF980BTtIeuayRZJijR1kvk77U1DS0,6518
83
- pymammotion/mammotion/devices/mammotion.py,sha256=bI86oDE3wRAaq01xLTxDqCwdlle3oAHWJy1xfQvIl58,23827
85
+ pymammotion/mammotion/devices/mammotion.py,sha256=3Scbn8qZhJixy9qkxZ59bZrZv47ECSdUVlUnl0kmMR8,24282
84
86
  pymammotion/mammotion/devices/mammotion_bluetooth.py,sha256=bwl1wphx2ev3iuDBTFTJbeujtll0L2ZBYDRzTcKBZes,19203
85
87
  pymammotion/mammotion/devices/mammotion_cloud.py,sha256=8MosSefZtymgHhKxkp7nSHq7b5D6sNPobxoKYVMBy-I,15139
86
88
  pymammotion/mammotion/devices/mammotion_mower_ble.py,sha256=GLc-f9TFhpGp2OYnVestzFqPSyGBMHX2YmrAnnmYu0I,1947
87
89
  pymammotion/mammotion/devices/mammotion_mower_cloud.py,sha256=JwCQICv8S31c1ll23JIWFFJEwzbTss182MvE4ZiQxWs,1877
88
- pymammotion/mammotion/devices/mower_device.py,sha256=VUgoJYlMKMOuy9j6MzxDmOIe6y7ziG-O-gUdDQPhkUM,5627
90
+ pymammotion/mammotion/devices/mower_device.py,sha256=UYsYSZoyzs_2aiKTkSamQAgbPdxnPmza3gcsOTQfVh8,5782
89
91
  pymammotion/mammotion/devices/mower_manager.py,sha256=m2U90ZlNgSmdPAh8BtKtyMVt5ZTBpfxNs5RT_lsUTls,4280
90
92
  pymammotion/mammotion/devices/rtk_ble.py,sha256=egZo4VJYS1_9r7e8f8FA21tD-bVthc-YgJbTtf0cNSI,3601
91
93
  pymammotion/mammotion/devices/rtk_cloud.py,sha256=gFzcnlSyWnyFLTYR-WOLpjIQD8Y1k844ZTkd-gdyIIk,4816
@@ -100,7 +102,7 @@ pymammotion/mqtt/mqtt_models.py,sha256=3JXP9Nals-3f27pYUqxD9WrfQHf5tpnal1j4R6vr-
100
102
  pymammotion/mqtt/linkkit/__init__.py,sha256=ENgc3ynd2kd9gMQR3-kgmCu6Ed9Y6XCIzU0zFReUlkk,80
101
103
  pymammotion/mqtt/linkkit/h2client.py,sha256=w9Nvi_nY4CLD_fw-pHtYChwQf7e2TiAGeqkY_sF4cf0,19659
102
104
  pymammotion/mqtt/linkkit/linkkit.py,sha256=SGWny2_LKa8qg8RD0Bgd3a4S_fMqpYxJ7a9eFRvgcN0,132923
103
- pymammotion/proto/__init__.py,sha256=COJw6Gq52RGTIqyWZNz_emMIg4nC2lQ9aDxq1xEtQP8,151189
105
+ pymammotion/proto/__init__.py,sha256=tiNljAXKL-CkTfIgnJ0dzXhMTHuprHL9xThyNqoVR88,151190
104
106
  pymammotion/proto/basestation.proto,sha256=YiSsDmT0DY_ep6DHay13SbhxGMhentYt0BmJrVQrwLQ,1198
105
107
  pymammotion/proto/basestation_pb2.py,sha256=suenbpMz9JZCXdGJGdiPaapppRz9Cf4IDzAXUfdIG3w,3083
106
108
  pymammotion/proto/basestation_pb2.pyi,sha256=lGcTPlGaLdHEQ1A39YITbMG_vs1cVaqHAg5TsPvzexc,4652
@@ -129,7 +131,7 @@ pymammotion/proto/mctrl_pept.proto,sha256=E-kp3dLPTbnrnRz4x1hFHfIbv4IYs2lHL8Nhs7
129
131
  pymammotion/proto/mctrl_pept_pb2.py,sha256=7rM3ZSn2XyPD0k2FUhL0zDrHmyC15ZUJgMXqx0biptg,2436
130
132
  pymammotion/proto/mctrl_pept_pb2.pyi,sha256=rYmmllXOmHqz7PRn7IWGSkGjKmJRHI4HNA7ZkYipK_g,3308
131
133
  pymammotion/proto/mctrl_sys.proto,sha256=XdmmJTkVmy7M93--tQIhM7w2B0YZdsTjSXqmD6kbd1g,15938
132
- pymammotion/proto/mctrl_sys_pb2.py,sha256=HujvgOTzE4PKct_-fdaXXwnt5E_HqLMH4WOEQ0zDZO8,33160
134
+ pymammotion/proto/mctrl_sys_pb2.py,sha256=N12eEXmpJZh5VvjN7QdNZAwWLABKtfHR5VGTzA-kxDY,33162
133
135
  pymammotion/proto/mctrl_sys_pb2.pyi,sha256=N1sJJMx7qWsj1kKYoQJ4JEZanZetLZ5JThs1IXCChUE,61557
134
136
  pymammotion/proto/message_pool.py,sha256=4-cRhhiM6bmfpUJZ8qxc8LEyqHBHpLCcotjbyZxl7JM,71
135
137
  pymammotion/proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -137,14 +139,14 @@ pymammotion/utility/conversions.py,sha256=v3YICy0zZwwBBzrUZgabI7GRfiDBnkiAX2qdtk
137
139
  pymammotion/utility/datatype_converter.py,sha256=A9qHBTbnq2PniAyBKxx3Qrk08aF5SIXGK1lDIY1siPU,4424
138
140
  pymammotion/utility/device_config.py,sha256=65Jl73-dQDs4yMXwYXZW_bsgSvnwpFBZDu8OQPEIgx8,27877
139
141
  pymammotion/utility/device_type.py,sha256=RdxBdkqzd03Q0MCCkbfqLj_CKrks8nNV4ji50UvJbH8,17024
140
- pymammotion/utility/map.py,sha256=GYscVMg2cX3IPlNpCBNHDW0S55yS1WGRf1iHnNZ7TfQ,2227
142
+ pymammotion/utility/map.py,sha256=1SdHmysJPSsQPd69QHm-xPkkN452iBF4TRZa2FAtyro,9372
141
143
  pymammotion/utility/movement.py,sha256=N75oAoAgFydqoaOedYIxGUHmuTCtPzAOtb-d_29tpfI,615
142
- pymammotion/utility/mur_mur_hash.py,sha256=nurSJKhLVvysNjXy9X4JYsEVOwEc-dElp3Oo0_ZWoSA,5851
144
+ pymammotion/utility/mur_mur_hash.py,sha256=5h2qew1eY3a1PrCzgQLsHeo_Q33ropgG1E23uzmZ72o,5864
143
145
  pymammotion/utility/periodic.py,sha256=MbeSb9cfhxzYmdT_RiE0dZe3H9IfbQW_zSqhmSX2RUc,3321
144
146
  pymammotion/utility/rocker_util.py,sha256=6tX7sS87qoQC_tsxbx3NLL-HgS08wtzXiZkhDiz7uo0,7179
145
147
  pymammotion/utility/constant/__init__.py,sha256=tcY0LDeD-qDDHx2LKt55KOyv9ZI0UfCNM6fknLCmm8s,110
146
- pymammotion/utility/constant/device_constant.py,sha256=MJE1DEOg86oWNSXYGx3xxJ542KEuSJNZ0VJLN4eHbUg,8237
147
- pymammotion-0.5.44.dist-info/METADATA,sha256=j5hdf_HwYZX4m0Xonw8HbB4ni588m89hKvKPGFmijNw,3575
148
- pymammotion-0.5.44.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
149
- pymammotion-0.5.44.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
150
- pymammotion-0.5.44.dist-info/RECORD,,
148
+ pymammotion/utility/constant/device_constant.py,sha256=X27pgHJaz9ljhepz-m0p6Dvpylg6ASB8om2PlFOd_nU,8250
149
+ pymammotion-0.5.53.dist-info/METADATA,sha256=oZidy-rbvALypkgwv1TEInZqcOGqzhnMFsE37J5UYAM,3600
150
+ pymammotion-0.5.53.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
151
+ pymammotion-0.5.53.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
152
+ pymammotion-0.5.53.dist-info/RECORD,,