Skip to content

Commit 522734a

Browse files
fix: minor changes
1 parent 484b849 commit 522734a

File tree

8 files changed

+47
-30
lines changed

8 files changed

+47
-30
lines changed

roborock/api.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@
2323
CleanSummary,
2424
Consumable,
2525
DNDTimer,
26+
DeviceData,
2627
DustCollectionMode,
2728
HomeData,
2829
ModelStatus,
2930
MultiMapsList,
3031
NetworkInfo,
31-
RoborockDeviceInfo,
3232
RoomMapping,
3333
SmartWashParams,
3434
Status,
@@ -86,7 +86,7 @@ async def request(self, method: str, url: str, params=None, data=None, headers=N
8686

8787

8888
class RoborockClient:
89-
def __init__(self, endpoint: str, device_info: RoborockDeviceInfo) -> None:
89+
def __init__(self, endpoint: str, device_info: DeviceData) -> None:
9090
self.device_info = device_info
9191
self._endpoint = endpoint
9292
self._nonce = secrets.token_bytes(16)
@@ -192,7 +192,12 @@ async def _async_response(self, request_id: int, protocol_id: int = 0) -> tuple[
192192
finally:
193193
del self._waiting_queue[request_id]
194194

195-
def _get_payload(self, method: RoborockCommand, params: Optional[list | dict] = None, secured=False):
195+
def _get_payload(
196+
self,
197+
method: RoborockCommand,
198+
params: Optional[list | dict] = None,
199+
secured=False,
200+
):
196201
timestamp = math.floor(time.time())
197202
request_id = randint(10000, 99999)
198203
inner = {
@@ -244,7 +249,10 @@ async def get_clean_summary(self) -> CleanSummary | None:
244249
elif isinstance(clean_summary, list):
245250
clean_time, clean_area, clean_count, records = unpack_list(clean_summary, 4)
246251
return CleanSummary(
247-
clean_time=clean_time, clean_area=clean_area, clean_count=clean_count, records=records
252+
clean_time=clean_time,
253+
clean_area=clean_area,
254+
clean_count=clean_count,
255+
records=records,
248256
)
249257
except RoborockTimeout as e:
250258
_LOGGER.error(e)

roborock/cli.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from roborock import RoborockException
1111
from roborock.api import RoborockApiClient
1212
from roborock.cloud_api import RoborockMqttClient
13-
from roborock.containers import LoginData, RoborockDeviceInfo
13+
from roborock.containers import LoginData, DeviceData
1414
from roborock.util import run_sync
1515

1616
_LOGGER = logging.getLogger(__name__)
@@ -131,7 +131,7 @@ async def command(ctx, cmd, device_id, params):
131131
)
132132
if model is None:
133133
raise RoborockException(f"Could not find model for device {device.name}")
134-
device_info = RoborockDeviceInfo(device=device, model=model)
134+
device_info = DeviceData(device=device, model=model)
135135
mqtt_client = RoborockMqttClient(login_data.user_data, device_info)
136136
await mqtt_client.send_command(cmd, params)
137137
mqtt_client.__del__()

roborock/cloud_api.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import paho.mqtt.client as mqtt
1212

1313
from .api import COMMANDS_SECURED, KEEPALIVE, RoborockClient, md5hex
14-
from .containers import RoborockDeviceInfo, UserData
14+
from .containers import DeviceData, UserData
1515
from .exceptions import CommandVacuumError, RoborockException, VacuumError
1616
from .protocol import MessageParser, Utils
1717
from .roborock_future import RoborockFuture
@@ -27,7 +27,7 @@ class RoborockMqttClient(RoborockClient, mqtt.Client):
2727
_thread: threading.Thread
2828
_client_id: str
2929

30-
def __init__(self, user_data: UserData, device_info: RoborockDeviceInfo) -> None:
30+
def __init__(self, user_data: UserData, device_info: DeviceData) -> None:
3131
rriot = user_data.rriot
3232
if rriot is None:
3333
raise RoborockException("Got no rriot data from user_data")

roborock/containers.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -428,12 +428,19 @@ class NetworkInfo(RoborockBase):
428428

429429

430430
@dataclass
431-
class RoborockDeviceInfo(RoborockBase):
431+
class DeviceData(RoborockBase):
432432
device: HomeDataDevice
433433
model: str
434+
host: Optional[str] = None
434435

435436

436437
@dataclass
437438
class RoomMapping(RoborockBase):
438439
segment_id: int
439440
iot_id: str
441+
442+
443+
@dataclass
444+
class BroadcastMessage(RoborockBase):
445+
duid: str
446+
ip: str

roborock/local_api.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77

88
import async_timeout
99

10+
from . import DeviceData
1011
from .api import COMMANDS_SECURED, QUEUE_TIMEOUT, RoborockClient
11-
from .containers import RoborockDeviceInfo
1212
from .exceptions import CommandVacuumError, RoborockConnectionException, RoborockException
1313
from .protocol import AP_CONFIG, MessageParser
1414
from .roborock_message import RoborockMessage
@@ -19,10 +19,12 @@
1919

2020

2121
class RoborockLocalClient(RoborockClient, asyncio.Protocol):
22-
def __init__(self, device_info: RoborockDeviceInfo, ip: str):
23-
super().__init__("abc", device_info)
22+
def __init__(self, device_data: DeviceData):
23+
if device_data.host is None:
24+
raise RoborockException("Host is required")
25+
super().__init__("abc", device_data)
2426
self.loop = get_running_loop_or_create_one()
25-
self.ip = ip
27+
self.host = device_data.host
2628
self._batch_structs: list[RoborockMessage] = []
2729
self._executing = False
2830
self.remaining = b""
@@ -47,13 +49,13 @@ async def async_connect(self) -> None:
4749
try:
4850
if not self.is_connected():
4951
async with async_timeout.timeout(QUEUE_TIMEOUT):
50-
_LOGGER.info(f"Connecting to {self.ip}")
52+
_LOGGER.info(f"Connecting to {self.host}")
5153
self.transport, _ = await self.loop.create_connection( # type: ignore
52-
lambda: self, self.ip, 58867
54+
lambda: self, self.host, 58867
5355
)
54-
_LOGGER.info(f"Connected to {self.ip}")
56+
_LOGGER.info(f"Connected to {self.host}")
5557
except Exception as e:
56-
raise RoborockConnectionException(f"Failed connecting to {self.ip}") from e
58+
raise RoborockConnectionException(f"Failed connecting to {self.host}") from e
5759

5860
def sync_disconnect(self) -> None:
5961
if self.transport and not self.loop.is_closed():

roborock/protocol.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
from Crypto.Cipher import AES
3030
from Crypto.Util.Padding import pad, unpad
3131

32-
from roborock import RoborockException
32+
from roborock import BroadcastMessage, RoborockException
3333
from roborock.roborock_message import RoborockMessage
3434

3535
_LOGGER = logging.getLogger(__name__)
@@ -43,16 +43,16 @@ class RoborockProtocol(asyncio.DatagramProtocol):
4343
def __init__(self, timeout: int = 5):
4444
self.timeout = timeout
4545
self.transport: BaseTransport | None = None
46-
self.devices_found: dict = {}
46+
self.devices_found: list[BroadcastMessage] = []
4747
self._mutex = Lock()
4848

4949
def __del__(self):
5050
self.close()
5151

5252
def datagram_received(self, data, _):
5353
[broadcast_message], _ = BroadcastParser.parse(data)
54-
parsed_message = json.loads(broadcast_message.payload)
55-
self.devices_found[parsed_message.get("duid")] = parsed_message.get("ip")
54+
parsed_message = BroadcastMessage.from_dict(json.loads(broadcast_message.payload))
55+
self.devices_found.append(parsed_message)
5656

5757
async def discover(self):
5858
async with self._mutex:
@@ -63,7 +63,7 @@ async def discover(self):
6363
return self.devices_found
6464
finally:
6565
self.close()
66-
self.devices_found = {}
66+
self.devices_found = []
6767

6868
def close(self):
6969
self.transport.close() if self.transport else None

tests/conftest.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22

33
from roborock import HomeData, UserData
44
from roborock.cloud_api import RoborockMqttClient
5-
from roborock.containers import RoborockDeviceInfo
5+
from roborock.containers import DeviceData
66
from tests.mock_data import HOME_DATA_RAW, USER_DATA
77

88

99
@pytest.fixture(name="mqtt_client")
1010
def mqtt_client():
1111
user_data = UserData.from_dict(USER_DATA)
1212
home_data = HomeData.from_dict(HOME_DATA_RAW)
13-
device_info = RoborockDeviceInfo(
13+
device_info = DeviceData(
1414
device=home_data.devices[0],
1515
model=home_data.products[0].model,
1616
)

tests/test_api.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
)
1313
from roborock.api import PreparedRequest, RoborockApiClient
1414
from roborock.cloud_api import RoborockMqttClient
15-
from roborock.containers import RoborockDeviceInfo, S7MaxVStatus
15+
from roborock.containers import DeviceData, S7MaxVStatus
1616
from tests.mock_data import BASE_URL_REQUEST, GET_CODE_RESPONSE, HOME_DATA_RAW, STATUS, USER_DATA
1717

1818

@@ -26,7 +26,7 @@ def test_can_create_prepared_request():
2626

2727
def test_can_create_mqtt_roborock():
2828
home_data = HomeData.from_dict(HOME_DATA_RAW)
29-
device_info = RoborockDeviceInfo(device=home_data.devices[0], model=home_data.products[0].model)
29+
device_info = DeviceData(device=home_data.devices[0], model=home_data.products[0].model)
3030
RoborockMqttClient(UserData.from_dict(USER_DATA), device_info)
3131

3232

@@ -75,7 +75,7 @@ async def test_get_home_data():
7575
@pytest.mark.asyncio
7676
async def test_get_dust_collection_mode():
7777
home_data = HomeData.from_dict(HOME_DATA_RAW)
78-
device_info = RoborockDeviceInfo(device=home_data.devices[0], model=home_data.products[0].model)
78+
device_info = DeviceData(device=home_data.devices[0], model=home_data.products[0].model)
7979
rmc = RoborockMqttClient(UserData.from_dict(USER_DATA), device_info)
8080
with patch("roborock.cloud_api.RoborockMqttClient.send_command") as command:
8181
command.return_value = {"mode": 1}
@@ -87,7 +87,7 @@ async def test_get_dust_collection_mode():
8787
@pytest.mark.asyncio
8888
async def test_get_mop_wash_mode():
8989
home_data = HomeData.from_dict(HOME_DATA_RAW)
90-
device_info = RoborockDeviceInfo(device=home_data.devices[0], model=home_data.products[0].model)
90+
device_info = DeviceData(device=home_data.devices[0], model=home_data.products[0].model)
9191
rmc = RoborockMqttClient(UserData.from_dict(USER_DATA), device_info)
9292
with patch("roborock.cloud_api.RoborockMqttClient.send_command") as command:
9393
command.return_value = {"smart_wash": 0, "wash_interval": 1500}
@@ -100,7 +100,7 @@ async def test_get_mop_wash_mode():
100100
@pytest.mark.asyncio
101101
async def test_get_washing_mode():
102102
home_data = HomeData.from_dict(HOME_DATA_RAW)
103-
device_info = RoborockDeviceInfo(device=home_data.devices[0], model=home_data.products[0].model)
103+
device_info = DeviceData(device=home_data.devices[0], model=home_data.products[0].model)
104104
rmc = RoborockMqttClient(UserData.from_dict(USER_DATA), device_info)
105105
with patch("roborock.cloud_api.RoborockMqttClient.send_command") as command:
106106
command.return_value = {"wash_mode": 2}
@@ -113,7 +113,7 @@ async def test_get_washing_mode():
113113
@pytest.mark.asyncio
114114
async def test_get_prop():
115115
home_data = HomeData.from_dict(HOME_DATA_RAW)
116-
device_info = RoborockDeviceInfo(device=home_data.devices[0], model=home_data.products[0].model)
116+
device_info = DeviceData(device=home_data.devices[0], model=home_data.products[0].model)
117117
rmc = RoborockMqttClient(UserData.from_dict(USER_DATA), device_info)
118118
with patch("roborock.cloud_api.RoborockMqttClient.get_status") as get_status, patch(
119119
"roborock.cloud_api.RoborockMqttClient.send_command"

0 commit comments

Comments
 (0)