pymammotion 0.4.47__tar.gz → 0.4.49__tar.gz

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.
Files changed (129) hide show
  1. {pymammotion-0.4.47 → pymammotion-0.4.49}/PKG-INFO +1 -1
  2. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/aliyun/cloud_gateway.py +1 -1
  3. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/data/model/device.py +2 -1
  4. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/data/model/device_info.py +10 -4
  5. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/data/state_manager.py +11 -3
  6. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/mammotion/commands/messages/network.py +0 -5
  7. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/mammotion/devices/mammotion.py +16 -15
  8. {pymammotion-0.4.47 → pymammotion-0.4.49}/pyproject.toml +2 -2
  9. {pymammotion-0.4.47 → pymammotion-0.4.49}/LICENSE +0 -0
  10. {pymammotion-0.4.47 → pymammotion-0.4.49}/README.md +0 -0
  11. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/__init__.py +0 -0
  12. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/aliyun/__init__.py +0 -0
  13. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/aliyun/client.py +0 -0
  14. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/aliyun/model/aep_response.py +0 -0
  15. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/aliyun/model/connect_response.py +0 -0
  16. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/aliyun/model/dev_by_account_response.py +0 -0
  17. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/aliyun/model/login_by_oauth_response.py +0 -0
  18. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/aliyun/model/regions_response.py +0 -0
  19. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/aliyun/model/session_by_authcode_response.py +0 -0
  20. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/aliyun/regions.py +0 -0
  21. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/aliyun/tea/core.py +0 -0
  22. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/aliyun/tmp_constant.py +0 -0
  23. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/bluetooth/__init__.py +0 -0
  24. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/bluetooth/ble.py +0 -0
  25. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/bluetooth/ble_message.py +0 -0
  26. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/bluetooth/const.py +0 -0
  27. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/bluetooth/data/__init__.py +0 -0
  28. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/bluetooth/data/convert.py +0 -0
  29. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/bluetooth/data/framectrldata.py +0 -0
  30. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/bluetooth/data/notifydata.py +0 -0
  31. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/bluetooth/model/__init__.py +0 -0
  32. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/bluetooth/model/atomic_integer.py +0 -0
  33. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/const.py +0 -0
  34. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/data/__init__.py +0 -0
  35. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/data/model/__init__.py +0 -0
  36. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/data/model/account.py +0 -0
  37. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/data/model/device_config.py +0 -0
  38. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/data/model/device_limits.py +0 -0
  39. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/data/model/enums.py +0 -0
  40. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/data/model/excute_boarder_params.py +0 -0
  41. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/data/model/execute_boarder.py +0 -0
  42. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/data/model/generate_route_information.py +0 -0
  43. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/data/model/hash_list.py +0 -0
  44. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/data/model/location.py +0 -0
  45. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/data/model/mowing_modes.py +0 -0
  46. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/data/model/rapid_state.py +0 -0
  47. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/data/model/raw_data.py +0 -0
  48. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/data/model/region_data.py +0 -0
  49. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/data/model/report_info.py +0 -0
  50. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/data/model/work.py +0 -0
  51. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/data/mqtt/__init__.py +0 -0
  52. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/data/mqtt/event.py +0 -0
  53. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/data/mqtt/properties.py +0 -0
  54. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/data/mqtt/status.py +0 -0
  55. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/event/__init__.py +0 -0
  56. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/event/event.py +0 -0
  57. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/http/__init__.py +0 -0
  58. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/http/_init_.py +0 -0
  59. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/http/encryption.py +0 -0
  60. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/http/http.py +0 -0
  61. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/http/model/__init__.py +0 -0
  62. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/http/model/camera_stream.py +0 -0
  63. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/http/model/http.py +0 -0
  64. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/mammotion/__init__.py +0 -0
  65. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/mammotion/commands/__init__.py +0 -0
  66. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/mammotion/commands/abstract_message.py +0 -0
  67. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/mammotion/commands/mammotion_command.py +0 -0
  68. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/mammotion/commands/messages/__init__.py +0 -0
  69. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/mammotion/commands/messages/driver.py +0 -0
  70. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/mammotion/commands/messages/media.py +0 -0
  71. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/mammotion/commands/messages/navigation.py +0 -0
  72. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/mammotion/commands/messages/ota.py +0 -0
  73. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/mammotion/commands/messages/system.py +0 -0
  74. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/mammotion/commands/messages/video.py +0 -0
  75. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/mammotion/control/__init__.py +0 -0
  76. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/mammotion/control/joystick.py +0 -0
  77. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/mammotion/devices/__init__.py +0 -0
  78. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/mammotion/devices/base.py +0 -0
  79. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/mammotion/devices/mammotion_bluetooth.py +0 -0
  80. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/mammotion/devices/mammotion_cloud.py +0 -0
  81. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/mqtt/__init__.py +0 -0
  82. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/mqtt/linkkit/__init__.py +0 -0
  83. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/mqtt/linkkit/h2client.py +0 -0
  84. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/mqtt/linkkit/linkkit.py +0 -0
  85. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/mqtt/mammotion_future.py +0 -0
  86. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/mqtt/mammotion_mqtt.py +0 -0
  87. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/__init__.py +0 -0
  88. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/basestation.proto +0 -0
  89. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/basestation_pb2.py +0 -0
  90. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/basestation_pb2.pyi +0 -0
  91. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/common.proto +0 -0
  92. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/common_pb2.py +0 -0
  93. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/common_pb2.pyi +0 -0
  94. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/dev_net.proto +0 -0
  95. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/dev_net_pb2.py +0 -0
  96. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/dev_net_pb2.pyi +0 -0
  97. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/luba_msg.proto +0 -0
  98. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/luba_msg_pb2.py +0 -0
  99. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/luba_msg_pb2.pyi +0 -0
  100. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/luba_mul.proto +0 -0
  101. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/luba_mul_pb2.py +0 -0
  102. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/luba_mul_pb2.pyi +0 -0
  103. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/mctrl_driver.proto +0 -0
  104. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/mctrl_driver_pb2.py +0 -0
  105. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/mctrl_driver_pb2.pyi +0 -0
  106. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/mctrl_nav.proto +0 -0
  107. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/mctrl_nav_pb2.py +0 -0
  108. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/mctrl_nav_pb2.pyi +0 -0
  109. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/mctrl_ota.proto +0 -0
  110. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/mctrl_ota_pb2.py +0 -0
  111. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/mctrl_ota_pb2.pyi +0 -0
  112. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/mctrl_pept.proto +0 -0
  113. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/mctrl_pept_pb2.py +0 -0
  114. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/mctrl_pept_pb2.pyi +0 -0
  115. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/mctrl_sys.proto +0 -0
  116. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/mctrl_sys_pb2.py +0 -0
  117. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/proto/mctrl_sys_pb2.pyi +0 -0
  118. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/py.typed +0 -0
  119. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/utility/constant/__init__.py +0 -0
  120. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/utility/constant/device_constant.py +0 -0
  121. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/utility/conversions.py +0 -0
  122. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/utility/datatype_converter.py +0 -0
  123. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/utility/device_config.py +0 -0
  124. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/utility/device_type.py +0 -0
  125. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/utility/map.py +0 -0
  126. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/utility/movement.py +0 -0
  127. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/utility/mur_mur_hash.py +0 -0
  128. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/utility/periodic.py +0 -0
  129. {pymammotion-0.4.47 → pymammotion-0.4.49}/pymammotion/utility/rocker_util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pymammotion
3
- Version: 0.4.47
3
+ Version: 0.4.49
4
4
  Summary:
5
5
  License: GPL-3.0
6
6
  Author: Michael Arthur
@@ -732,7 +732,7 @@ class CloudIOTGateway:
732
732
  logger.debug(iot_id)
733
733
 
734
734
  response_body_str = response.body.decode("utf-8")
735
- response_body_dict = json.loads(response_body_str)
735
+ response_body_dict = json.loads(response_body_str) if response_body_str is not None else {}
736
736
 
737
737
  if int(response_body_dict.get("code")) != 200:
738
738
  logger.error(
@@ -6,7 +6,7 @@ import betterproto
6
6
  from mashumaro.mixins.orjson import DataClassORJSONMixin
7
7
 
8
8
  from pymammotion.data.model import HashList, RapidState
9
- from pymammotion.data.model.device_info import DeviceFirmwares, MowerInfo
9
+ from pymammotion.data.model.device_info import DeviceFirmwares, DeviceNonWorkingHours, MowerInfo
10
10
  from pymammotion.data.model.location import Location
11
11
  from pymammotion.data.model.report_info import ReportData
12
12
  from pymammotion.data.model.work import CurrentTaskSettings
@@ -38,6 +38,7 @@ class MowingDevice(DataClassORJSONMixin):
38
38
  err_code_list: list = field(default_factory=list)
39
39
  err_code_list_time: list | None = field(default_factory=list)
40
40
  error_codes: dict[str, ErrorInfo] = field(default_factory=dict)
41
+ non_work_hours: DeviceNonWorkingHours = field(default_factory=DeviceNonWorkingHours)
41
42
 
42
43
  def buffer(self, buffer_list: SystemUpdateBufMsg) -> None:
43
44
  """Update the device based on which buffer we are reading from."""
@@ -2,8 +2,6 @@ from dataclasses import dataclass, field
2
2
 
3
3
  from mashumaro.mixins.orjson import DataClassORJSONMixin
4
4
 
5
- from pymammotion.data.model.mowing_modes import TraversalMode, TurningMode
6
-
7
5
 
8
6
  @dataclass
9
7
  class SideLight(DataClassORJSONMixin):
@@ -16,12 +14,18 @@ class SideLight(DataClassORJSONMixin):
16
14
  action: int = 0
17
15
 
18
16
 
17
+ @dataclass
18
+ class DeviceNonWorkingHours(DataClassORJSONMixin):
19
+ start_time: str = ""
20
+ end_time: str = ""
21
+
22
+
19
23
  @dataclass
20
24
  class MowerInfo(DataClassORJSONMixin):
21
25
  blade_status: bool = False
22
26
  rain_detection: bool = False
23
- traversal_mode: TraversalMode = TraversalMode.direct
24
- turning_mode: TurningMode = TurningMode.zero_turn
27
+ traversal_mode: int = 0
28
+ turning_mode: int = 0
25
29
  side_led: SideLight = field(default_factory=SideLight)
26
30
  collector_installation_status: bool = False
27
31
  model: str = ""
@@ -29,6 +33,8 @@ class MowerInfo(DataClassORJSONMixin):
29
33
  product_key: str = ""
30
34
  model_id: str = ""
31
35
  sub_model_id: str = ""
36
+ ble_mac: str = ""
37
+ wifi_mac: str = ""
32
38
 
33
39
 
34
40
  @dataclass
@@ -11,7 +11,6 @@ from pymammotion.data.model.device import MowingDevice
11
11
  from pymammotion.data.model.device_info import SideLight
12
12
  from pymammotion.data.model.enums import ConnectionPreference
13
13
  from pymammotion.data.model.hash_list import AreaHashNameList, NavGetCommData, NavGetHashListData, Plan, SvgMessage
14
- from pymammotion.data.model.mowing_modes import TraversalMode, TurningMode
15
14
  from pymammotion.data.model.work import CurrentTaskSettings
16
15
  from pymammotion.data.mqtt.properties import ThingPropertiesMessage
17
16
  from pymammotion.data.mqtt.status import ThingStatusMessage
@@ -21,12 +20,14 @@ from pymammotion.proto import (
21
20
  DeviceProductTypeInfoT,
22
21
  DrvDevInfoResp,
23
22
  DrvDevInfoResult,
23
+ GetNetworkInfoRsp,
24
24
  LubaMsg,
25
25
  NavGetCommDataAck,
26
26
  NavGetHashListAck,
27
27
  NavPlanJobSet,
28
28
  NavReqCoverPath,
29
29
  NavSysParamMsg,
30
+ NavUnableTimeSet,
30
31
  SvgMessageAckT,
31
32
  TimeCtrlLight,
32
33
  WifiIotStatusReport,
@@ -181,9 +182,13 @@ class StateManager:
181
182
  case 3:
182
183
  self._device.mower_state.rain_detection = bool(settings.context)
183
184
  case 6:
184
- self._device.mower_state.turning_mode = TurningMode(settings.context)
185
+ self._device.mower_state.turning_mode = settings.context
185
186
  case 7:
186
- self._device.mower_state.traversal_mode = TraversalMode(settings.context)
187
+ self._device.mower_state.traversal_mode = settings.context
188
+ case "todev_unable_time_set":
189
+ nav_non_work_time: NavUnableTimeSet = nav_msg[1]
190
+ self._device.non_work_hours.start_time = nav_non_work_time.unable_start_time
191
+ self._device.non_work_hours.end_time = nav_non_work_time.unable_end_time
187
192
 
188
193
  def _update_sys_data(self, message) -> None:
189
194
  """Update system."""
@@ -226,6 +231,9 @@ class StateManager:
226
231
  if resp.res == DrvDevInfoResult.DRV_RESULT_SUC and resp.id == 1 and resp.type == 6:
227
232
  self._device.mower_state.swversion = resp.info
228
233
  self._device.device_firmwares.device_version = resp.info
234
+ case "toapp_networkinfo_rsp":
235
+ get_network_info_resp: GetNetworkInfoRsp = net_msg[1]
236
+ self._device.mower_state.wifi_mac = get_network_info_resp.wifi_mac
229
237
 
230
238
  def _update_mul_data(self, message) -> None:
231
239
  pass
@@ -192,11 +192,6 @@ class MessageNetwork(AbstractMessage, ABC):
192
192
  logger.debug("Send command - get Wifi connection information")
193
193
  return self.send_order_msg_net(build)
194
194
 
195
- def wifi_connectinfo_update2(self) -> None:
196
- hash_map = {"getMsgCmd": 1}
197
- # self.post_custom_data(self.get_json_string(
198
- # 68, hash_map)) # TODO: Fix this
199
-
200
195
  def get_record_wifi_list(self) -> bytes:
201
196
  build = DevNet(todev_ble_sync=1, todev_wifi_list_upload=DrvWifiList())
202
197
  logger.debug("Send command - get memorized WiFi list upload command")
@@ -133,21 +133,22 @@ class MammotionDeviceManager:
133
133
  return self.devices.get(mammotion_device_name)
134
134
 
135
135
  async def remove_device(self, name: str) -> None:
136
- device_for_removal = self.devices.pop(name)
137
- loop = asyncio.get_running_loop()
138
- if device_for_removal.has_cloud():
139
- should_disconnect = {
140
- device
141
- for key, device in self.devices.items()
142
- if device.cloud() is not None and device.cloud().mqtt == device_for_removal.cloud().mqtt
143
- }
144
- if len(should_disconnect) == 0:
145
- await loop.run_in_executor(None, device_for_removal.cloud().mqtt.disconnect)
146
- await device_for_removal.cloud().stop()
147
- if device_for_removal.has_ble():
148
- await device_for_removal.ble().stop()
149
-
150
- del device_for_removal
136
+ if self.devices.get(name):
137
+ device_for_removal = self.devices.pop(name)
138
+ loop = asyncio.get_running_loop()
139
+ if device_for_removal.has_cloud():
140
+ should_disconnect = {
141
+ device
142
+ for key, device in self.devices.items()
143
+ if device.cloud() is not None and device.cloud().mqtt == device_for_removal.cloud().mqtt
144
+ }
145
+ if len(should_disconnect) == 0:
146
+ await loop.run_in_executor(None, device_for_removal.cloud().mqtt.disconnect)
147
+ await device_for_removal.cloud().stop()
148
+ if device_for_removal.has_ble():
149
+ await device_for_removal.ble().stop()
150
+
151
+ del device_for_removal
151
152
 
152
153
 
153
154
  class Mammotion:
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [project]
6
6
  name = "pymammotion"
7
- version = "0.4.47"
7
+ version = "0.4.49"
8
8
  license = "GPL-3.0"
9
9
  description = ""
10
10
  readme = "README.md"
@@ -66,7 +66,7 @@ autotyping = "^24.3.0"
66
66
  ipython = "^9.0.2"
67
67
 
68
68
  [tool.bumpver]
69
- current_version = "0.4.47"
69
+ current_version = "0.4.49"
70
70
  version_pattern = "MAJOR.MINOR.PATCH"
71
71
  commit_message = "Bump version {old_version} -> {new_version}"
72
72
  commit = true
File without changes
File without changes