pymammotion 0.4.35__tar.gz → 0.4.37__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.35 → pymammotion-0.4.37}/PKG-INFO +1 -1
  2. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/http/http.py +46 -1
  3. pymammotion-0.4.35/pymammotion/aliyun/model/stream_subscription_response.py → pymammotion-0.4.37/pymammotion/http/model/camera_stream.py +13 -0
  4. pymammotion-0.4.37/pymammotion/mammotion/control/__init__.py +0 -0
  5. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/mammotion/devices/mammotion.py +28 -34
  6. pymammotion-0.4.37/pymammotion/py.typed +0 -0
  7. {pymammotion-0.4.35 → pymammotion-0.4.37}/pyproject.toml +2 -2
  8. {pymammotion-0.4.35 → pymammotion-0.4.37}/LICENSE +0 -0
  9. {pymammotion-0.4.35 → pymammotion-0.4.37}/README.md +0 -0
  10. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/__init__.py +0 -0
  11. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/aliyun/__init__.py +0 -0
  12. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/aliyun/client.py +0 -0
  13. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/aliyun/cloud_gateway.py +0 -0
  14. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/aliyun/model/aep_response.py +0 -0
  15. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/aliyun/model/connect_response.py +0 -0
  16. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/aliyun/model/dev_by_account_response.py +0 -0
  17. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/aliyun/model/login_by_oauth_response.py +0 -0
  18. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/aliyun/model/regions_response.py +0 -0
  19. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/aliyun/model/session_by_authcode_response.py +0 -0
  20. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/aliyun/regions.py +0 -0
  21. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/aliyun/tea/core.py +0 -0
  22. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/aliyun/tmp_constant.py +0 -0
  23. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/bluetooth/__init__.py +0 -0
  24. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/bluetooth/ble.py +0 -0
  25. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/bluetooth/ble_message.py +0 -0
  26. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/bluetooth/const.py +0 -0
  27. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/bluetooth/data/__init__.py +0 -0
  28. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/bluetooth/data/convert.py +0 -0
  29. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/bluetooth/data/framectrldata.py +0 -0
  30. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/bluetooth/data/notifydata.py +0 -0
  31. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/bluetooth/model/__init__.py +0 -0
  32. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/bluetooth/model/atomic_integer.py +0 -0
  33. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/const.py +0 -0
  34. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/data/__init__.py +0 -0
  35. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/data/model/__init__.py +0 -0
  36. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/data/model/account.py +0 -0
  37. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/data/model/device.py +0 -0
  38. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/data/model/device_config.py +0 -0
  39. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/data/model/device_info.py +0 -0
  40. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/data/model/device_limits.py +0 -0
  41. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/data/model/enums.py +0 -0
  42. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/data/model/excute_boarder_params.py +0 -0
  43. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/data/model/execute_boarder.py +0 -0
  44. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/data/model/generate_route_information.py +0 -0
  45. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/data/model/hash_list.py +0 -0
  46. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/data/model/location.py +0 -0
  47. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/data/model/mowing_modes.py +0 -0
  48. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/data/model/rapid_state.py +0 -0
  49. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/data/model/raw_data.py +0 -0
  50. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/data/model/region_data.py +0 -0
  51. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/data/model/report_info.py +0 -0
  52. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/data/model/work.py +0 -0
  53. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/data/mqtt/__init__.py +0 -0
  54. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/data/mqtt/event.py +0 -0
  55. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/data/mqtt/properties.py +0 -0
  56. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/data/mqtt/status.py +0 -0
  57. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/data/state_manager.py +0 -0
  58. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/event/__init__.py +0 -0
  59. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/event/event.py +0 -0
  60. {pymammotion-0.4.35/pymammotion/mammotion → pymammotion-0.4.37/pymammotion/http}/__init__.py +0 -0
  61. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/http/_init_.py +0 -0
  62. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/http/encryption.py +0 -0
  63. {pymammotion-0.4.35/pymammotion/mammotion/commands → pymammotion-0.4.37/pymammotion/http/model}/__init__.py +0 -0
  64. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/http/model/http.py +0 -0
  65. {pymammotion-0.4.35/pymammotion/mammotion/commands/messages → pymammotion-0.4.37/pymammotion/mammotion}/__init__.py +0 -0
  66. {pymammotion-0.4.35/pymammotion/mammotion/control → pymammotion-0.4.37/pymammotion/mammotion/commands}/__init__.py +0 -0
  67. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/mammotion/commands/abstract_message.py +0 -0
  68. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/mammotion/commands/mammotion_command.py +0 -0
  69. /pymammotion-0.4.35/pymammotion/py.typed → /pymammotion-0.4.37/pymammotion/mammotion/commands/messages/__init__.py +0 -0
  70. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/mammotion/commands/messages/driver.py +0 -0
  71. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/mammotion/commands/messages/media.py +0 -0
  72. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/mammotion/commands/messages/navigation.py +0 -0
  73. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/mammotion/commands/messages/network.py +0 -0
  74. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/mammotion/commands/messages/ota.py +0 -0
  75. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/mammotion/commands/messages/system.py +0 -0
  76. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/mammotion/commands/messages/video.py +0 -0
  77. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/mammotion/control/joystick.py +0 -0
  78. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/mammotion/devices/__init__.py +0 -0
  79. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/mammotion/devices/base.py +0 -0
  80. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/mammotion/devices/mammotion_bluetooth.py +0 -0
  81. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/mammotion/devices/mammotion_cloud.py +0 -0
  82. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/mqtt/__init__.py +0 -0
  83. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/mqtt/linkkit/__init__.py +0 -0
  84. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/mqtt/linkkit/h2client.py +0 -0
  85. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/mqtt/linkkit/linkkit.py +0 -0
  86. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/mqtt/mammotion_future.py +0 -0
  87. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/mqtt/mammotion_mqtt.py +0 -0
  88. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/__init__.py +0 -0
  89. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/basestation.proto +0 -0
  90. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/basestation_pb2.py +0 -0
  91. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/basestation_pb2.pyi +0 -0
  92. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/common.proto +0 -0
  93. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/common_pb2.py +0 -0
  94. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/common_pb2.pyi +0 -0
  95. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/dev_net.proto +0 -0
  96. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/dev_net_pb2.py +0 -0
  97. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/dev_net_pb2.pyi +0 -0
  98. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/luba_msg.proto +0 -0
  99. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/luba_msg_pb2.py +0 -0
  100. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/luba_msg_pb2.pyi +0 -0
  101. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/luba_mul.proto +0 -0
  102. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/luba_mul_pb2.py +0 -0
  103. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/luba_mul_pb2.pyi +0 -0
  104. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/mctrl_driver.proto +0 -0
  105. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/mctrl_driver_pb2.py +0 -0
  106. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/mctrl_driver_pb2.pyi +0 -0
  107. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/mctrl_nav.proto +0 -0
  108. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/mctrl_nav_pb2.py +0 -0
  109. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/mctrl_nav_pb2.pyi +0 -0
  110. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/mctrl_ota.proto +0 -0
  111. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/mctrl_ota_pb2.py +0 -0
  112. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/mctrl_ota_pb2.pyi +0 -0
  113. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/mctrl_pept.proto +0 -0
  114. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/mctrl_pept_pb2.py +0 -0
  115. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/mctrl_pept_pb2.pyi +0 -0
  116. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/mctrl_sys.proto +0 -0
  117. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/mctrl_sys_pb2.py +0 -0
  118. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/proto/mctrl_sys_pb2.pyi +0 -0
  119. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/utility/constant/__init__.py +0 -0
  120. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/utility/constant/device_constant.py +0 -0
  121. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/utility/conversions.py +0 -0
  122. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/utility/datatype_converter.py +0 -0
  123. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/utility/device_config.py +0 -0
  124. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/utility/device_type.py +0 -0
  125. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/utility/map.py +0 -0
  126. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/utility/movement.py +0 -0
  127. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/utility/mur_mur_hash.py +0 -0
  128. {pymammotion-0.4.35 → pymammotion-0.4.37}/pymammotion/utility/periodic.py +0 -0
  129. {pymammotion-0.4.35 → pymammotion-0.4.37}/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.35
3
+ Version: 0.4.37
4
4
  Summary:
5
5
  License: GPL-3.0
6
6
  Author: Michael Arthur
@@ -3,9 +3,9 @@ from typing import cast
3
3
 
4
4
  from aiohttp import ClientSession
5
5
 
6
- from pymammotion.aliyun.model.stream_subscription_response import StreamSubscriptionResponse
7
6
  from pymammotion.const import MAMMOTION_API_DOMAIN, MAMMOTION_CLIENT_ID, MAMMOTION_CLIENT_SECRET, MAMMOTION_DOMAIN
8
7
  from pymammotion.http.encryption import EncryptionUtils
8
+ from pymammotion.http.model.camera_stream import StreamSubscriptionResponse, VideoResourceResponse
9
9
  from pymammotion.http.model.http import ErrorInfo, LoginResponseData, Response
10
10
 
11
11
 
@@ -108,6 +108,51 @@ class MammotionHTTP:
108
108
  # Assuming the data format matches the expected structure
109
109
  return Response[StreamSubscriptionResponse].from_dict(data)
110
110
 
111
+ async def get_stream_subscription_mini_or_x_series(
112
+ self, iot_id: str, is_yuka: bool
113
+ ) -> Response[StreamSubscriptionResponse]:
114
+ """Get agora.io data for view camera stream (New models 2025)"""
115
+
116
+ # Prepare the payload with cameraStates based on is_yuka flag
117
+ payload = {"deviceId": iot_id, "mode": 0, "cameraStates": []}
118
+
119
+ # Add appropriate cameraStates based on the is_yuka flag
120
+ if is_yuka:
121
+ payload["cameraStates"] = [{"cameraState": 1}, {"cameraState": 0}, {"cameraState": 1}]
122
+ else:
123
+ payload["cameraStates"] = [{"cameraState": 1}, {"cameraState": 0}, {"cameraState": 0}]
124
+
125
+ async with ClientSession(MAMMOTION_API_DOMAIN) as session:
126
+ async with session.post(
127
+ "/device-server/v1/stream/token",
128
+ json=payload,
129
+ headers={
130
+ "Authorization": f"{self._headers.get('Authorization', "")}",
131
+ "Content-Type": "application/json",
132
+ "User-Agent": "okhttp/3.14.9",
133
+ },
134
+ ) as resp:
135
+ data = await resp.json()
136
+ # TODO catch errors from mismatch like token expire etc
137
+ # Assuming the data format matches the expected structure
138
+ return Response[StreamSubscriptionResponse].from_dict(data)
139
+
140
+ async def get_video_resource(self, iot_id: str) -> Response[VideoResourceResponse]:
141
+ """Get video resource for new models (2025 series)"""
142
+ async with ClientSession(MAMMOTION_API_DOMAIN) as session:
143
+ async with session.get(
144
+ f"/device-server/v1/video-resource/{iot_id}",
145
+ headers={
146
+ "Authorization": f"{self._headers.get('Authorization', '')}",
147
+ "Content-Type": "application/json",
148
+ "User-Agent": "okhttp/3.14.9",
149
+ },
150
+ ) as resp:
151
+ data = await resp.json()
152
+ # TODO catch errors from mismatch like token expire etc
153
+ # Assuming the data format matches the expected structure
154
+ return Response[VideoResourceResponse].from_dict(data)
155
+
111
156
  async def refresh_login(self, account: str, password: str | None = None) -> Response[LoginResponseData]:
112
157
  if self._password is None and password is not None:
113
158
  self._password = password
@@ -16,3 +16,16 @@ class StreamSubscriptionResponse(DataClassORJSONMixin):
16
16
  channelName: str
17
17
  token: str
18
18
  uid: int
19
+ license: str | None = None
20
+ availableTime: int | None = None
21
+
22
+
23
+ @dataclass
24
+ class VideoResourceResponse(DataClassORJSONMixin):
25
+ id: str
26
+ deviceId: str
27
+ deviceName: str
28
+ cycleType: int
29
+ usageYearMonth: str
30
+ totalTime: int
31
+ availableTime: int
@@ -3,7 +3,6 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import asyncio
6
- from enum import Enum
7
6
  import logging
8
7
  from typing import Any
9
8
 
@@ -15,41 +14,36 @@ from pymammotion.data.model.device import MowingDevice
15
14
  from pymammotion.data.model.enums import ConnectionPreference
16
15
  from pymammotion.data.state_manager import StateManager
17
16
  from pymammotion.http.http import MammotionHTTP
17
+ from pymammotion.http.model.camera_stream import StreamSubscriptionResponse, VideoResourceResponse
18
+ from pymammotion.http.model.http import Response
18
19
  from pymammotion.mammotion.devices.mammotion_bluetooth import MammotionBaseBLEDevice
19
20
  from pymammotion.mammotion.devices.mammotion_cloud import MammotionBaseCloudDevice, MammotionCloud
20
21
  from pymammotion.mqtt import MammotionMQTT
22
+ from pymammotion.utility.device_type import DeviceType
21
23
 
22
24
  TIMEOUT_CLOUD_RESPONSE = 10
23
25
 
24
26
  _LOGGER = logging.getLogger(__name__)
25
27
 
26
28
 
27
- class ConnectionPreference(Enum):
28
- """Enum for connection preference."""
29
-
30
- EITHER = 0
31
- WIFI = 1
32
- BLUETOOTH = 2
33
-
34
-
35
29
  class MammotionMixedDeviceManager:
36
- preference: ConnectionPreference
37
- _ble_device: MammotionBaseBLEDevice | None = None
38
- _cloud_device: MammotionBaseCloudDevice | None = None
39
-
40
30
  def __init__(
41
31
  self,
42
32
  name: str,
33
+ mammotion_http: MammotionHTTP,
43
34
  cloud_device: Device | None = None,
44
35
  ble_device: BLEDevice | None = None,
45
36
  mqtt: MammotionCloud | None = None,
46
37
  preference: ConnectionPreference = ConnectionPreference.BLUETOOTH,
47
38
  ) -> None:
39
+ self._ble_device: MammotionBaseBLEDevice | None = None
40
+ self._cloud_device: MammotionBaseCloudDevice | None = None
48
41
  self.name = name
49
42
  self._state_manager = StateManager(MowingDevice())
50
43
  self._state_manager.get_device().name = name
51
44
  self.add_ble(cloud_device, ble_device)
52
45
  self.add_cloud(cloud_device, mqtt)
46
+ self.mammotion_http = mammotion_http
53
47
  self.preference = preference
54
48
  self._state_manager.preference = preference
55
49
 
@@ -169,19 +163,6 @@ class Mammotion:
169
163
  """Initialize MammotionDevice."""
170
164
  self._login_lock = asyncio.Lock()
171
165
 
172
- def add_ble_device(
173
- self,
174
- cloud_device: Device,
175
- ble_device: BLEDevice,
176
- preference: ConnectionPreference = ConnectionPreference.BLUETOOTH,
177
- ) -> None:
178
- if ble_device:
179
- self.device_manager.add_device(
180
- MammotionMixedDeviceManager(
181
- name=ble_device.name, cloud_device=cloud_device, ble_device=ble_device, preference=preference
182
- )
183
- )
184
-
185
166
  async def login_and_initiate_cloud(self, account, password, force: bool = False) -> None:
186
167
  async with self._login_lock:
187
168
  exists: MammotionCloud | None = self.mqtt_list.get(account)
@@ -231,6 +212,7 @@ class Mammotion:
231
212
  if device.deviceName.startswith(("Luba-", "Yuka-")) and mower_device is None:
232
213
  mixed_device = MammotionMixedDeviceManager(
233
214
  name=device.deviceName,
215
+ mammotion_http=mqtt_client.cloud_client.mammotion_http,
234
216
  cloud_device=device,
235
217
  mqtt=mqtt_client,
236
218
  preference=ConnectionPreference.WIFI,
@@ -315,15 +297,27 @@ class Mammotion:
315
297
  return await device.cloud().start_map_sync()
316
298
  # TODO work with both with EITHER
317
299
 
318
- async def get_stream_subscription(self, name: str):
300
+ async def get_stream_subscription(self, name: str, iot_id: str) -> Response[StreamSubscriptionResponse] | Any:
319
301
  device = self.get_device_by_name(name)
320
- if device.preference is ConnectionPreference.WIFI:
321
- if device.has_cloud():
322
- _stream_response = await device.cloud().mqtt.cloud_client.mammotion_http.get_stream_subscription(
323
- device.cloud().iot_id
324
- )
325
- _LOGGER.debug(_stream_response)
326
- return _stream_response
302
+ if DeviceType.is_mini_or_x_series(name):
303
+ _stream_response = await device.mammotion_http.get_stream_subscription_mini_or_x_series(
304
+ iot_id, DeviceType.is_yuka(name)
305
+ )
306
+ _LOGGER.debug(_stream_response)
307
+ return _stream_response
308
+ else:
309
+ _stream_response = await device.mammotion_http.get_stream_subscription(iot_id)
310
+ _LOGGER.debug(_stream_response)
311
+ return _stream_response
312
+
313
+ async def get_video_resource(self, name: str, iot_id: str) -> Response[VideoResourceResponse] | None:
314
+ device = self.get_device_by_name(name)
315
+
316
+ if DeviceType.is_mini_or_x_series(name):
317
+ _video_resource_response = await device.mammotion_http.get_video_resource(iot_id)
318
+ _LOGGER.debug(_video_resource_response)
319
+ return _video_resource_response
320
+ return None
327
321
 
328
322
  def mower(self, name: str) -> MowingDevice | None:
329
323
  device = self.get_device_by_name(name)
File without changes
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [project]
6
6
  name = "pymammotion"
7
- version = "0.4.35"
7
+ version = "0.4.37"
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.35"
69
+ current_version = "0.4.37"
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