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.
- pymammotion/data/model/device_info.py +0 -1
- pymammotion/data/state_manager.py +150 -146
- pymammotion/mammotion/devices/mammotion_bluetooth.py +3 -0
- {pymammotion-0.4.0b1.dist-info → pymammotion-0.4.0b2.dist-info}/METADATA +1 -1
- {pymammotion-0.4.0b1.dist-info → pymammotion-0.4.0b2.dist-info}/RECORD +7 -7
- {pymammotion-0.4.0b1.dist-info → pymammotion-0.4.0b2.dist-info}/LICENSE +0 -0
- {pymammotion-0.4.0b1.dist-info → pymammotion-0.4.0b2.dist-info}/WHEEL +0 -0
@@ -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
|
-
|
30
|
-
|
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
|
-
|
33
|
+
cloud_queue_command_callback: Callable[[str, dict[str, Any]], Awaitable[bytes]] | None = None
|
37
34
|
|
38
|
-
|
39
|
-
|
40
|
-
|
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
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
self
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
self
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
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
|
|
@@ -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=
|
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=
|
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=
|
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.
|
131
|
-
pymammotion-0.4.
|
132
|
-
pymammotion-0.4.
|
133
|
-
pymammotion-0.4.
|
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,,
|
File without changes
|
File without changes
|