Skip to content

Commit 6dd8ff8

Browse files
fix: changing RoborockDeviceInfo to serializable
1 parent 599d461 commit 6dd8ff8

File tree

7 files changed

+63
-75
lines changed

7 files changed

+63
-75
lines changed

roborock/api.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,14 @@
3535
HomeData,
3636
MultiMapsList,
3737
SmartWashParameters,
38+
RoborockDeviceInfo,
3839

3940
)
4041
from .roborock_queue import RoborockQueue
4142
from .typing import (
4243
RoborockDeviceProp,
4344
RoborockCommand,
44-
RoborockDockSummary,
45-
RoborockDeviceInfo,
45+
RoborockDockSummary
4646
)
4747

4848
_LOGGER = logging.getLogger(__name__)
@@ -371,11 +371,14 @@ async def get_prop(self, device_id: str) -> RoborockDeviceProp:
371371
)
372372

373373
async def get_multi_maps_list(self, device_id) -> MultiMapsList:
374-
multi_maps_list = await self.send_command(
375-
device_id, RoborockCommand.GET_MULTI_MAPS_LIST
376-
)
377-
if isinstance(multi_maps_list, dict):
378-
return MultiMapsList(multi_maps_list)
374+
try:
375+
multi_maps_list = await self.send_command(
376+
device_id, RoborockCommand.GET_MULTI_MAPS_LIST
377+
)
378+
if isinstance(multi_maps_list, dict):
379+
return MultiMapsList(multi_maps_list)
380+
except RoborockTimeout as e:
381+
_LOGGER.error(e)
379382

380383
async def get_map_v1(self, device_id):
381384
return await self.send_command(device_id, RoborockCommand.GET_MAP_V1)

roborock/cli.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from roborock import RoborockException
99
from roborock.api import RoborockApiClient
1010
from roborock.cloud_api import RoborockMqttClient
11-
from roborock.containers import LoginData
11+
from roborock.containers import LoginData, RoborockDeviceInfo
1212
from roborock.util import run_sync
1313

1414
_LOGGER = logging.getLogger(__name__)
@@ -116,9 +116,9 @@ async def command(ctx, cmd, params):
116116
await _discover(ctx)
117117
login_data = context.login_data()
118118
home_data = login_data.home_data
119-
device_map: dict[str, str] = {}
119+
device_map: dict[str, RoborockDeviceInfo] = {}
120120
for device in home_data.devices + home_data.received_devices:
121-
device_map[device.duid] = device.local_key
121+
device_map[device.duid] = RoborockDeviceInfo({"device": device})
122122
mqtt_client = RoborockMqttClient(login_data.user_data, device_map)
123123
await mqtt_client.send_command(home_data.devices[0].duid, cmd, params)
124124
mqtt_client.__del__()

roborock/cloud_api.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,21 @@
99
from urllib.parse import urlparse
1010

1111
import paho.mqtt.client as mqtt
12-
from roborock.code_mappings import RoborockDockType
1312

1413
from roborock.api import md5hex, md5bin, RoborockClient, SPECIAL_COMMANDS
14+
from roborock.code_mappings import RoborockDockType
1515
from roborock.exceptions import (
1616
RoborockException,
1717
CommandVacuumError,
1818
VacuumError,
1919
)
2020
from .containers import (
2121
UserData,
22+
RoborockDeviceInfo,
2223
)
2324
from .roborock_queue import RoborockQueue
2425
from .typing import (
25-
RoborockCommand, RoborockDeviceProp, RoborockDeviceInfo,
26+
RoborockCommand, RoborockDeviceProp,
2627
)
2728
from .util import run_in_executor
2829

roborock/containers.py

Lines changed: 30 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,15 @@ class NetworkInfoField(str, Enum):
237237
RSSI = "rssi"
238238

239239

240+
class RoborockDeviceInfoField(str, Enum):
241+
DEVICE = "device"
242+
PRODUCT = "product"
243+
244+
245+
class RoborockLocalDeviceInfoField(str, Enum):
246+
NETWORK_INFO = "network_info"
247+
248+
240249
class RoborockBase(dict):
241250
def __init__(self, data: dict[str, any]) -> None:
242251
super().__init__()
@@ -248,8 +257,6 @@ def as_dict(self):
248257

249258

250259
class Reference(RoborockBase):
251-
def __init__(self, data: dict[str, any]) -> None:
252-
super().__init__(data)
253260

254261
@property
255262
def region(self) -> str:
@@ -269,8 +276,6 @@ def l_unknown(self) -> str:
269276

270277

271278
class RRiot(RoborockBase):
272-
def __init__(self, data: dict[str, any]) -> None:
273-
super().__init__(data)
274279

275280
@property
276281
def user(self) -> str:
@@ -294,8 +299,6 @@ def reference(self) -> Reference:
294299

295300

296301
class UserData(RoborockBase):
297-
def __init__(self, data: dict[str, any]) -> None:
298-
super().__init__(data)
299302

300303
@property
301304
def uid(self) -> int:
@@ -343,8 +346,6 @@ def avatar_url(self) -> str:
343346

344347

345348
class LoginData(RoborockBase):
346-
def __init__(self, data: dict[str, any]) -> None:
347-
super().__init__(data)
348349

349350
@property
350351
def user_data(self) -> UserData:
@@ -364,8 +365,6 @@ def email(self):
364365

365366

366367
class HomeDataProductSchema(RoborockBase):
367-
def __init__(self, data: dict[str, any]) -> None:
368-
super().__init__(data)
369368

370369
@property
371370
def id(self):
@@ -397,8 +396,6 @@ def desc(self):
397396

398397

399398
class HomeDataProduct(RoborockBase):
400-
def __init__(self, data: dict[str, any]) -> None:
401-
super().__init__(data)
402399

403400
@property
404401
def id(self) -> str:
@@ -438,8 +435,6 @@ def schema(self) -> list[HomeDataProductSchema]:
438435

439436

440437
class HomeDataDeviceStatus(RoborockBase):
441-
def __init__(self, data: dict[str, any]) -> None:
442-
super().__init__(data)
443438

444439
@property
445440
def id(self):
@@ -479,8 +474,6 @@ def schema(self):
479474

480475

481476
class HomeDataDevice(RoborockBase):
482-
def __init__(self, data: dict[str, any]) -> None:
483-
super().__init__(data)
484477

485478
@property
486479
def duid(self) -> str:
@@ -584,8 +577,6 @@ def silent_ota_switch(self) -> bool:
584577

585578

586579
class HomeDataRoom(RoborockBase):
587-
def __init__(self, data: dict[str, any]) -> None:
588-
super().__init__(data)
589580

590581
@property
591582
def id(self):
@@ -597,8 +588,6 @@ def name(self):
597588

598589

599590
class HomeData(RoborockBase):
600-
def __init__(self, data: dict[str, any]) -> None:
601-
super().__init__(data)
602591

603592
@property
604593
def id(self) -> int:
@@ -638,8 +627,6 @@ def rooms(self) -> list[HomeDataRoom]:
638627

639628

640629
class Status(RoborockBase):
641-
def __init__(self, data: dict[str, any]) -> None:
642-
super().__init__(data)
643630

644631
@property
645632
def msg_ver(self) -> int:
@@ -839,8 +826,6 @@ def unsave_map_flag(self) -> int:
839826

840827

841828
class DNDTimer(RoborockBase):
842-
def __init__(self, data: dict[str, any]) -> None:
843-
super().__init__(data)
844829

845830
@property
846831
def start_hour(self) -> int:
@@ -864,8 +849,6 @@ def enabled(self) -> int:
864849

865850

866851
class CleanSummary(RoborockBase):
867-
def __init__(self, data: dict[str, any]) -> None:
868-
super().__init__(data)
869852

870853
@property
871854
def clean_time(self) -> int:
@@ -889,8 +872,6 @@ def records(self) -> list[int]:
889872

890873

891874
class CleanRecord(RoborockBase):
892-
def __init__(self, data: dict[str, any]) -> None:
893-
super().__init__(data)
894875

895876
@property
896877
def begin(self) -> int:
@@ -946,8 +927,6 @@ def map_flag(self) -> int:
946927

947928

948929
class Consumable(RoborockBase):
949-
def __init__(self, data: dict[str, any]) -> None:
950-
super().__init__(data)
951930

952931
@property
953932
def main_brush_work_time(self) -> int:
@@ -983,8 +962,6 @@ def cleaning_brush_work_times(self) -> int:
983962

984963

985964
class MultiMapsListMapInfoBakMaps(RoborockBase):
986-
def __init__(self, data: dict[str, any]) -> None:
987-
super().__init__(data)
988965

989966
@property
990967
def mapflag(self):
@@ -996,8 +973,6 @@ def add_time(self):
996973

997974

998975
class MultiMapsListMapInfo(RoborockBase):
999-
def __init__(self, data: dict[str, any]) -> None:
1000-
super().__init__(data)
1001976

1002977
@property
1003978
def mapflag(self):
@@ -1021,8 +996,6 @@ def bak_maps(self):
1021996

1022997

1023998
class MultiMapsList(RoborockBase):
1024-
def __init__(self, data: dict[str, any]) -> None:
1025-
super().__init__(data)
1026999

10271000
@property
10281001
def max_multi_map(self) -> int:
@@ -1042,8 +1015,6 @@ def map_info(self) -> list[MultiMapsListMapInfo]:
10421015

10431016

10441017
class SmartWashParameters(RoborockBase):
1045-
def __init__(self, data: dict[str, any]) -> None:
1046-
super().__init__(data)
10471018

10481019
@property
10491020
def smart_wash(self) -> int:
@@ -1053,22 +1024,40 @@ def smart_wash(self) -> int:
10531024
def wash_interval(self) -> int:
10541025
return self.get(SmartWashField.WASH_INTERVAL)
10551026

1056-
class NetworkInfo(RoborockBase):
1057-
def __init__(self, data: dict[str, any]) -> None:
1058-
super().__init__(data)
10591027

1028+
class NetworkInfo(RoborockBase):
10601029
@property
10611030
def ssid(self) -> str:
10621031
return self.get(NetworkInfoField.SSID)
1032+
10631033
@property
10641034
def ip(self) -> str:
10651035
return self.get(NetworkInfoField.IP)
1036+
10661037
@property
10671038
def mac(self) -> str:
10681039
return self.get(NetworkInfoField.MAC)
1040+
10691041
@property
10701042
def bssid(self) -> str:
10711043
return self.get(NetworkInfoField.BSSID)
1044+
10721045
@property
10731046
def rssi(self) -> int:
10741047
return self.get(NetworkInfoField.RSSI)
1048+
1049+
1050+
class RoborockDeviceInfo(RoborockBase):
1051+
@property
1052+
def device(self) -> HomeDataDevice:
1053+
return HomeDataDevice(self.get(RoborockDeviceInfoField.DEVICE))
1054+
1055+
@property
1056+
def product(self) -> HomeDataProduct:
1057+
return HomeDataProduct(self.get(RoborockDeviceInfoField.PRODUCT))
1058+
1059+
1060+
class RoborockLocalDeviceInfo(RoborockDeviceInfo):
1061+
@property
1062+
def network_info(self) -> NetworkInfo:
1063+
return NetworkInfo(self.get(RoborockLocalDeviceInfoField.NETWORK_INFO))

roborock/local_api.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@
99
import async_timeout
1010

1111
from roborock.api import RoborockClient, SPECIAL_COMMANDS
12+
from roborock.containers import RoborockLocalDeviceInfo
1213
from roborock.exceptions import RoborockTimeout, CommandVacuumError
13-
from roborock.typing import RoborockCommand, RoborockLocalDeviceInfo
14+
from roborock.typing import RoborockCommand
1415
from roborock.util import get_running_loop_or_create_one
1516

1617
secured_prefix = 199
@@ -72,13 +73,15 @@ async def send_command(
7273
_LOGGER.debug(f"id={request_id} Response from {method}: {response}")
7374
return response
7475

76+
7577
class RoborockSocket(socket.socket):
7678
_closed = None
7779

7880
@property
7981
def is_closed(self):
8082
return self._closed
8183

84+
8285
class RoborockSocketListener:
8386
roborock_port = 58867
8487

roborock/offline/offline.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
from roborock.containers import HomeDataDevice, HomeDataDeviceField, HomeDataProduct, HomeDataProductField, NetworkInfo, \
55
NetworkInfoField
6+
from roborock.containers import RoborockLocalDeviceInfo
67
from roborock.local_api import RoborockLocalClient
7-
from roborock.typing import RoborockLocalDeviceInfo
88

99
local_ip = "<local_ip>"
1010
local_key = "<local_key>"
@@ -16,17 +16,21 @@ async def main():
1616
"level": logging.DEBUG
1717
}
1818
logging.basicConfig(**logging_config)
19-
client = RoborockLocalClient({
20-
device_id: RoborockLocalDeviceInfo(HomeDataDevice({
19+
localdevices_info = RoborockLocalDeviceInfo({
20+
"device": HomeDataDevice({
2121
HomeDataDeviceField.NAME: "test_name",
2222
HomeDataDeviceField.DUID: device_id,
2323
HomeDataDeviceField.FV: "1",
2424
HomeDataDeviceField.LOCAL_KEY: local_key
25-
}), HomeDataProduct({
25+
}),
26+
"product": HomeDataProduct({
2627
HomeDataProductField.MODEL: "test_model"
27-
}), NetworkInfo({
28+
}),
29+
"network_info": NetworkInfo({
2830
NetworkInfoField.IP: local_ip
29-
}))
31+
})})
32+
client = RoborockLocalClient({
33+
device_id: localdevices_info
3034
})
3135
await client.async_connect()
3236
props = await client.get_prop(device_id)

0 commit comments

Comments
 (0)