pymammotion 0.4.0b1__py3-none-any.whl → 0.4.0b2__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.
@@ -35,4 +35,3 @@ class DeviceFirmwares(DataClassORJSONMixin):
35
35
  right_motor_driver: str = ""
36
36
  rtk_rover_station: str = ""
37
37
  rtk_version: str = ""
38
- version: str = ""
@@ -12,162 +12,166 @@ from pymammotion.data.model.device_info import SideLight
12
12
  from pymammotion.data.model.hash_list import AreaHashNameList
13
13
  from pymammotion.data.mqtt.properties import ThingPropertiesMessage
14
14
  from pymammotion.data.mqtt.status import ThingStatusMessage
15
- from pymammotion.proto.dev_net import DrvDevInfoResp, WifiIotStatusReport
15
+ from pymammotion.proto.dev_net import DrvDevInfoResp, DrvDevInfoResult, WifiIotStatusReport
16
16
  from pymammotion.proto.luba_msg import LubaMsg
17
17
  from pymammotion.proto.mctrl_nav import AppGetAllAreaHashName, NavGetCommDataAck, NavGetHashListAck, SvgMessageAckT
18
- from pymammotion.proto.mctrl_sys import DeviceProductTypeInfoT, TimeCtrlLight
18
+ from pymammotion.proto.mctrl_sys import DeviceFwInfo, DeviceProductTypeInfoT, TimeCtrlLight
19
19
 
20
20
  logger = logging.getLogger(__name__)
21
21
 
22
22
 
23
23
  class StateManager:
24
- """Manage state."""
24
+ """Manage state."""
25
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.cloud_gethash_ack_callback: Callable[[NavGetHashListAck], Awaitable[None]] | None = None
32
- self.cloud_get_commondata_ack_callback: Callable[[NavGetCommDataAck | SvgMessageAckT], Awaitable[None]] | None = None
33
- self.cloud_on_notification_callback: Callable[[tuple[str, Any | None]], Awaitable[None]] | None = None
26
+ _device: MowingDevice
27
+ last_updated_at: datetime = datetime.now()
28
+ cloud_gethash_ack_callback: Callable[[NavGetHashListAck], Awaitable[None]] | None = None
29
+ cloud_get_commondata_ack_callback: Callable[[NavGetCommDataAck | SvgMessageAckT], Awaitable[None]] | None = None
30
+ cloud_on_notification_callback: Callable[[tuple[str, Any | None]], Awaitable[None]] | None = None
34
31
 
35
32
  # possibly don't need anymore
36
- self.cloud_queue_command_callback: Callable[[str, dict[str, Any]], Awaitable[bytes]] | None = None
33
+ cloud_queue_command_callback: Callable[[str, dict[str, Any]], Awaitable[bytes]] | None = None
37
34
 
38
- self.ble_gethash_ack_callback: Callable[[NavGetHashListAck], Awaitable[None]] | None = None
39
- self.ble_get_commondata_ack_callback: Callable[[NavGetCommDataAck | SvgMessageAckT], Awaitable[None]] | None = None
40
- self.ble_on_notification_callback: Callable[[tuple[str, Any | None]], Awaitable[None]] | None = None
35
+ ble_gethash_ack_callback: Callable[[NavGetHashListAck], Awaitable[None]] | None = None
36
+ ble_get_commondata_ack_callback: Callable[[NavGetCommDataAck | SvgMessageAckT], Awaitable[None]] | None = None
37
+ ble_on_notification_callback: Callable[[tuple[str, Any | None]], Awaitable[None]] | None = None
41
38
 
42
39
  # possibly don't need anymore
43
- self.ble_queue_command_callback: Callable[[str, dict[str, Any]], Awaitable[bytes]] | None = None
44
- self.last_updated_at = datetime.now()
45
-
46
- def get_device(self) -> MowingDevice:
47
- """Get device."""
48
- return self._device
49
-
50
- def set_device(self, device: MowingDevice) -> None:
51
- """Set device."""
52
- self._device = device
53
-
54
- async def properties(self, properties: ThingPropertiesMessage) -> None:
55
- self._device.mqtt_properties = properties
56
-
57
- async def status(self, status: ThingStatusMessage) -> None:
58
- if not self._device.online:
59
- self._device.online = True
60
- self._device.status_properties = status
61
-
62
- @property
63
- def online(self) -> bool:
64
- return self._device.online
65
-
66
- @online.setter
67
- def online(self, value: bool) -> None:
68
- self._device.online = value
69
-
70
- async def gethash_ack_callback(self, msg: NavGetHashListAck):
71
- if self.cloud_gethash_ack_callback:
72
- await self.cloud_gethash_ack_callback(msg)
73
- if self.ble_gethash_ack_callback:
74
- await self.ble_gethash_ack_callback(msg)
75
-
76
- async def on_notification_callback(self, res: tuple[str, Any | None]):
77
- if self.cloud_on_notification_callback:
78
- await self.cloud_on_notification_callback(res)
79
- if self.ble_on_notification_callback:
80
- await self.ble_on_notification_callback(res)
81
-
82
- async def get_commondata_ack_callback(self, comm_data: NavGetCommDataAck | SvgMessageAckT):
83
- if self.cloud_get_commondata_ack_callback:
84
- await self.cloud_get_commondata_ack_callback(comm_data)
85
- if self.ble_get_commondata_ack_callback:
86
- await self.ble_get_commondata_ack_callback(comm_data)
87
-
88
- async def notification(self, message: LubaMsg) -> None:
89
- """Handle protobuf notifications."""
90
- res = betterproto.which_one_of(message, "LubaSubMsg")
91
- self.last_updated_at = datetime.now()
92
-
93
- match res[0]:
94
- case "nav":
95
- await self._update_nav_data(message)
96
- case "sys":
97
- await self._update_sys_data(message)
98
- case "driver":
99
- self._update_driver_data(message)
100
- case "net":
101
- self._update_net_data(message)
102
- case "mul":
103
- self._update_mul_data(message)
104
- case "ota":
105
- self._update_ota_data(message)
106
-
107
- await self.on_notification_callback(res)
108
-
109
- async def _update_nav_data(self, message) -> None:
110
- """Update nav data."""
111
- nav_msg = betterproto.which_one_of(message.nav, "SubNavMsg")
112
- match nav_msg[0]:
113
- case "toapp_gethash_ack":
114
- hashlist_ack: NavGetHashListAck = nav_msg[1]
115
- self._device.map.update_root_hash_list(hashlist_ack)
116
- await self.gethash_ack_callback(nav_msg[1])
117
- case "toapp_get_commondata_ack":
118
- common_data: NavGetCommDataAck = nav_msg[1]
119
- updated = self._device.map.update(common_data)
120
- if updated:
121
- await self.get_commondata_ack_callback(common_data)
122
- case "toapp_svg_msg":
123
- common_data: SvgMessageAckT = nav_msg[1]
124
- updated = self._device.map.update(common_data)
125
- if updated:
126
- await self.get_commondata_ack_callback(common_data)
127
-
128
- case "toapp_all_hash_name":
129
- hash_names: AppGetAllAreaHashName = nav_msg[1]
130
- converted_list = [AreaHashNameList(name=item.name, hash=item.hash) for item in hash_names.hashnames]
131
- self._device.map.area_name = converted_list
132
-
133
- async def _update_sys_data(self, message) -> None:
134
- """Update system."""
135
- sys_msg = betterproto.which_one_of(message.sys, "SubSysMsg")
136
- match sys_msg[0]:
137
- case "system_update_buf":
138
- self._device.buffer(sys_msg[1])
139
- case "toapp_report_data":
140
- self._device.update_report_data(sys_msg[1])
141
- case "mow_to_app_info":
142
- self._device.mow_info(sys_msg[1])
143
- case "system_tard_state_tunnel":
144
- self._device.run_state_update(sys_msg[1])
145
- case "todev_time_ctrl_light":
146
- ctrl_light: TimeCtrlLight = sys_msg[1]
147
- side_led: SideLight = SideLight.from_dict(ctrl_light.to_dict(casing=betterproto.Casing.SNAKE))
148
- self._device.mower_state.side_led = side_led
149
- case "device_product_type_info":
150
- device_product_type: DeviceProductTypeInfoT = sys_msg[1]
151
- self._device.mower_state.model_id = device_product_type.main_product_type
152
-
153
- def _update_driver_data(self, message) -> None:
154
- pass
155
-
156
- def _update_net_data(self, message) -> None:
157
- net_msg = betterproto.which_one_of(message.net, "NetSubType")
158
- match net_msg[0]:
159
- case "toapp_wifi_iot_status":
160
- wifi_iot_status: WifiIotStatusReport = net_msg[1]
161
- self._device.mower_state.product_key = wifi_iot_status.productkey
162
- case "toapp_devinfo_resp":
163
- toapp_devinfo_resp: DrvDevInfoResp = net_msg[1]
164
- for resp in toapp_devinfo_resp.resp_ids:
165
- if resp.res == "DRV_RESULT_SUC":
166
- self._device.mower_state.swversion = resp.info
167
- self._device.device_firmwares.device_version = resp.info
168
-
169
- def _update_mul_data(self, message) -> None:
170
- pass
171
-
172
- def _update_ota_data(self, message) -> None:
173
- pass
40
+ ble_queue_command_callback: Callable[[str, dict[str, Any]], Awaitable[bytes]] | None = None
41
+
42
+ def __init__(self, device: MowingDevice) -> None:
43
+ self._device = device
44
+ self.last_updated_at = datetime.now()
45
+
46
+ def get_device(self) -> MowingDevice:
47
+ """Get device."""
48
+ return self._device
49
+
50
+ def set_device(self, device: MowingDevice) -> None:
51
+ """Set device."""
52
+ self._device = device
53
+
54
+ def properties(self, thing_properties: ThingPropertiesMessage) -> None:
55
+ self._device.mqtt_properties = thing_properties
56
+
57
+ def status(self, thing_status: ThingStatusMessage) -> None:
58
+ if not self._device.online:
59
+ self._device.online = True
60
+ self._device.status_properties = thing_status
61
+
62
+ @property
63
+ def online(self) -> bool:
64
+ return self._device.online
65
+
66
+ @online.setter
67
+ def online(self, value: bool) -> None:
68
+ self._device.online = value
69
+
70
+ async def gethash_ack_callback(self, msg: NavGetHashListAck) -> None:
71
+ if self.cloud_gethash_ack_callback:
72
+ await self.cloud_gethash_ack_callback(msg)
73
+ if self.ble_gethash_ack_callback:
74
+ await self.ble_gethash_ack_callback(msg)
75
+
76
+ async def on_notification_callback(self, res: tuple[str, Any | None]) -> None:
77
+ if self.cloud_on_notification_callback:
78
+ await self.cloud_on_notification_callback(res)
79
+ if self.ble_on_notification_callback:
80
+ await self.ble_on_notification_callback(res)
81
+
82
+ async def get_commondata_ack_callback(self, comm_data: NavGetCommDataAck | SvgMessageAckT) -> None:
83
+ if self.cloud_get_commondata_ack_callback:
84
+ await self.cloud_get_commondata_ack_callback(comm_data)
85
+ if self.ble_get_commondata_ack_callback:
86
+ await self.ble_get_commondata_ack_callback(comm_data)
87
+
88
+ async def notification(self, message: LubaMsg) -> None:
89
+ """Handle protobuf notifications."""
90
+ res = betterproto.which_one_of(message, "LubaSubMsg")
91
+ self.last_updated_at = datetime.now()
92
+
93
+ match res[0]:
94
+ case "nav":
95
+ await self._update_nav_data(message)
96
+ case "sys":
97
+ await self._update_sys_data(message)
98
+ case "driver":
99
+ self._update_driver_data(message)
100
+ case "net":
101
+ self._update_net_data(message)
102
+ case "mul":
103
+ self._update_mul_data(message)
104
+ case "ota":
105
+ self._update_ota_data(message)
106
+
107
+ await self.on_notification_callback(res)
108
+
109
+ async def _update_nav_data(self, message) -> None:
110
+ """Update nav data."""
111
+ nav_msg = betterproto.which_one_of(message.nav, "SubNavMsg")
112
+ match nav_msg[0]:
113
+ case "toapp_gethash_ack":
114
+ hashlist_ack: NavGetHashListAck = nav_msg[1]
115
+ self._device.map.update_root_hash_list(hashlist_ack)
116
+ await self.gethash_ack_callback(nav_msg[1])
117
+ case "toapp_get_commondata_ack":
118
+ common_data: NavGetCommDataAck = nav_msg[1]
119
+ updated = self._device.map.update(common_data)
120
+ if updated:
121
+ await self.get_commondata_ack_callback(common_data)
122
+ case "toapp_svg_msg":
123
+ common_data: SvgMessageAckT = nav_msg[1]
124
+ updated = self._device.map.update(common_data)
125
+ if updated:
126
+ await self.get_commondata_ack_callback(common_data)
127
+
128
+ case "toapp_all_hash_name":
129
+ hash_names: AppGetAllAreaHashName = nav_msg[1]
130
+ converted_list = [AreaHashNameList(name=item.name, hash=item.hash) for item in hash_names.hashnames]
131
+ self._device.map.area_name = converted_list
132
+
133
+ async def _update_sys_data(self, message) -> None:
134
+ """Update system."""
135
+ sys_msg = betterproto.which_one_of(message.sys, "SubSysMsg")
136
+ match sys_msg[0]:
137
+ case "system_update_buf":
138
+ self._device.buffer(sys_msg[1])
139
+ case "toapp_report_data":
140
+ self._device.update_report_data(sys_msg[1])
141
+ case "mow_to_app_info":
142
+ self._device.mow_info(sys_msg[1])
143
+ case "system_tard_state_tunnel":
144
+ self._device.run_state_update(sys_msg[1])
145
+ case "todev_time_ctrl_light":
146
+ ctrl_light: TimeCtrlLight = sys_msg[1]
147
+ side_led: SideLight = SideLight.from_dict(ctrl_light.to_dict(casing=betterproto.Casing.SNAKE))
148
+ self._device.mower_state.side_led = side_led
149
+ case "device_product_type_info":
150
+ device_product_type: DeviceProductTypeInfoT = sys_msg[1]
151
+ self._device.mower_state.model_id = device_product_type.main_product_type
152
+ case "toapp_dev_fw_info":
153
+ device_fw_info: DeviceFwInfo = sys_msg[1]
154
+ self._device.device_firmwares.device_version = device_fw_info.version
155
+ self._device.mower_state.swversion = device_fw_info.version
156
+
157
+ def _update_driver_data(self, message) -> None:
158
+ pass
159
+
160
+ def _update_net_data(self, message) -> None:
161
+ net_msg = betterproto.which_one_of(message.net, "NetSubType")
162
+ match net_msg[0]:
163
+ case "toapp_wifi_iot_status":
164
+ wifi_iot_status: WifiIotStatusReport = net_msg[1]
165
+ self._device.mower_state.product_key = wifi_iot_status.productkey
166
+ case "toapp_devinfo_resp":
167
+ toapp_devinfo_resp: DrvDevInfoResp = net_msg[1]
168
+ for resp in toapp_devinfo_resp.resp_ids:
169
+ if resp.res == DrvDevInfoResult.DRV_RESULT_SUC and resp.id == 1 and resp.type == 6:
170
+ self._device.mower_state.swversion = resp.info
171
+ self._device.device_firmwares.device_version = resp.info
172
+
173
+ def _update_mul_data(self, message) -> None:
174
+ pass
175
+
176
+ def _update_ota_data(self, message) -> None:
177
+ pass
@@ -351,6 +351,9 @@ class MammotionBaseBLEDevice(MammotionBaseDevice):
351
351
  if self._notify_future and not self._notify_future.done():
352
352
  self._notify_future.set_result(data)
353
353
 
354
+ if self._execute_timed_disconnect is None:
355
+ await self._execute_forced_disconnect()
356
+
354
357
  self._reset_disconnect_timer()
355
358
  await self._state_manager.notification(new_msg)
356
359
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pymammotion
3
- Version: 0.4.0b1
3
+ Version: 0.4.0b2
4
4
  Summary:
5
5
  License: GPL-3.0
6
6
  Author: Michael Arthur
@@ -25,7 +25,7 @@ pymammotion/data/model/__init__.py,sha256=aSyroxYQQS-WMRi6WmWm2js4wLa9nmsi160gx9
25
25
  pymammotion/data/model/account.py,sha256=vJM-KTf2q6eBfVC-UlNHBSmJvqHiCawZ40vnuhXhaz8,140
26
26
  pymammotion/data/model/device.py,sha256=lZEuWfEr4My0BUjY3OdIpUui91t9KbONhBc2t9oS2ro,6883
27
27
  pymammotion/data/model/device_config.py,sha256=wjayKnzoPDmBhqWZKTPDSueNEPCIWCB20tFEDSGIUsM,2602
28
- pymammotion/data/model/device_info.py,sha256=8FxHok09_uy99qBmgPiZw-MYbyqxXolF9eEw-8cQxSw,899
28
+ pymammotion/data/model/device_info.py,sha256=p7fXL4ozWUF8rD4QSfrmyLK1Jv-uXXxcJ5mXiDjp6Fo,877
29
29
  pymammotion/data/model/device_limits.py,sha256=saW3iUvGq8WEn6CASn5hS5tVJpSeak4FDy_gnHtYqTQ,1955
30
30
  pymammotion/data/model/enums.py,sha256=EpKmO8yVUZyEnTY4yH0DMMVKYNQM42zpW1maUu0i3IE,1582
31
31
  pymammotion/data/model/excute_boarder_params.py,sha256=9CpUqrygcle1C_1hDW-riLmm4map4ZbE842NXjcomEI,1394
@@ -43,7 +43,7 @@ pymammotion/data/mqtt/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdr
43
43
  pymammotion/data/mqtt/event.py,sha256=r14gzZVxmlGVAwFdZQ1CUsMZFHHwRKnbt2VHnjugP28,5123
44
44
  pymammotion/data/mqtt/properties.py,sha256=pX5JRVmmpVO04CSPm5xAGcSWA_OeLd0JnBagLsfiSEc,3755
45
45
  pymammotion/data/mqtt/status.py,sha256=DuNC3JdewLPKNqNHx76_FPXRvheYSiM-CdiVTCCYY8s,1079
46
- pymammotion/data/state_manager.py,sha256=4NLSzJIfYi2fS_Y8qRgCyAo0eMd3qpmjJ961L_5Iy4o,7009
46
+ pymammotion/data/state_manager.py,sha256=J7QbfCge1mGlz2jzcRfqix560tybG1E1x2inVgVqt-I,7810
47
47
  pymammotion/event/__init__.py,sha256=mgATR6vPHACNQ-0zH5fi7NdzeTCDV1CZyaWPmtUusi8,115
48
48
  pymammotion/event/event.py,sha256=bj2RirSIRyBs0QvkcrOtwZWUX_8F3m1sySuHVyKmZLs,2143
49
49
  pymammotion/http/_init_.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -67,7 +67,7 @@ pymammotion/mammotion/control/joystick.py,sha256=QfBVxM_gxpWsZAGO90whtgxCI2tIZ3T
67
67
  pymammotion/mammotion/devices/__init__.py,sha256=f2qQFPgLGmV85W2hSlMUh5BYuht9o_Ar_JEAAMD4fsE,102
68
68
  pymammotion/mammotion/devices/base.py,sha256=evNKt1PDDGPkm4wleIEC2dtHuyDP_nHRCg35nrQg6qg,10260
69
69
  pymammotion/mammotion/devices/mammotion.py,sha256=-x9hf_M-_3fp5srHGBuMmO5DBsSDnwVGMyEiAEz5dW8,12685
70
- pymammotion/mammotion/devices/mammotion_bluetooth.py,sha256=tfD8TIgKVd57Hrr-totXP0-WFSRFYBuoV5Dw0EpvOi4,19509
70
+ pymammotion/mammotion/devices/mammotion_bluetooth.py,sha256=G7gprsdvKiBHr4S2myRuLL-PWldtsnlLIsiW8yWvpP0,19613
71
71
  pymammotion/mammotion/devices/mammotion_cloud.py,sha256=nd1Uj6rF8UKHJbHC6nlPRrNQPggPXxfpydT0o0cWbMM,13835
72
72
  pymammotion/mqtt/__init__.py,sha256=Ocs5e-HLJvTuDpVXyECEsWIvwsUaxzj7lZ9mSYutNDY,105
73
73
  pymammotion/mqtt/linkkit/__init__.py,sha256=ENgc3ynd2kd9gMQR3-kgmCu6Ed9Y6XCIzU0zFReUlkk,80
@@ -127,7 +127,7 @@ pymammotion/utility/map.py,sha256=GYscVMg2cX3IPlNpCBNHDW0S55yS1WGRf1iHnNZ7TfQ,22
127
127
  pymammotion/utility/movement.py,sha256=N75oAoAgFydqoaOedYIxGUHmuTCtPzAOtb-d_29tpfI,615
128
128
  pymammotion/utility/periodic.py,sha256=MbeSb9cfhxzYmdT_RiE0dZe3H9IfbQW_zSqhmSX2RUc,3321
129
129
  pymammotion/utility/rocker_util.py,sha256=6tX7sS87qoQC_tsxbx3NLL-HgS08wtzXiZkhDiz7uo0,7179
130
- pymammotion-0.4.0b1.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
131
- pymammotion-0.4.0b1.dist-info/METADATA,sha256=QzBQE6mluKSxxyVSZan9r9lsbv9EYV57h3mw789NUdE,3886
132
- pymammotion-0.4.0b1.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
133
- pymammotion-0.4.0b1.dist-info/RECORD,,
130
+ pymammotion-0.4.0b2.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
131
+ pymammotion-0.4.0b2.dist-info/METADATA,sha256=_g95yCpcFO-w6GISykIZO69Jo-COe2h7-GD6dVTOkCk,3886
132
+ pymammotion-0.4.0b2.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
133
+ pymammotion-0.4.0b2.dist-info/RECORD,,