From 405b81358496bcdbb2854ec38a0e9d1802b19384 Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Mon, 14 Nov 2022 23:12:07 +0100 Subject: [PATCH 01/17] Add multi maps --- miio/integrations/vacuum/roborock/vacuum.py | 33 +++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/miio/integrations/vacuum/roborock/vacuum.py b/miio/integrations/vacuum/roborock/vacuum.py index 3f45dfac2..da4d9cf18 100644 --- a/miio/integrations/vacuum/roborock/vacuum.py +++ b/miio/integrations/vacuum/roborock/vacuum.py @@ -30,6 +30,7 @@ CleaningSummary, ConsumableStatus, DNDStatus, + MultiMapList, SoundInstallStatus, SoundStatus, Timer, @@ -221,6 +222,8 @@ def __init__( ): super().__init__(ip, token, start_id, debug, model=model) self.manual_seqnum = -1 + self._multi_maps: Optional[MultiMapList] = None + self._multi_map_enum = None @command() def start(self): @@ -440,6 +443,36 @@ def map(self): # returns ['retry'] without internet return self.send("get_map_v1") + @command() + def get_multi_maps(self, skip_cache=False) -> MultiMapList: + """Return list of multi maps.""" + if self._multi_maps is not None and not skip_cache: + return self._multi_maps + + self._multi_maps = MultiMapList(self.send("get_multi_maps_list")[0]) + return self._multi_maps + + @command() + def multi_map_enum(self, skip_cache=False) -> Optional[enum.Enum]: + """Enum of the available map names.""" + if self._multi_map_enum is not None and not skip_cache: + return self._multi_map_enum + + multi_maps = self.get_multi_maps() + + self._multi_map_enum = enum.Enum("multi_map_enum", multi_maps.map_name_dict) + return self._multi_map_enum + + @command(click.argument("multi_map_id", type=int)) + def load_multi_map(self, multi_map_id: int): + """Change the current map used.""" + return self.send("load_multi_map", [multi_map_id])[0] == "ok" + + @command() + def load_multi_map_by_enum(self, multi_map_enum): + """Change the current map used by enum.""" + return self.load_multi_map(multi_map_enum.value) + @command(click.argument("start", type=bool)) def edit_map(self, start): """Start map editing?""" From 62a2a1c3dfce11de40ae7e904ef6b2c3e196e364 Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Mon, 14 Nov 2022 23:22:33 +0100 Subject: [PATCH 02/17] Add multi map info --- .../vacuum/roborock/vacuumcontainers.py | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/miio/integrations/vacuum/roborock/vacuumcontainers.py b/miio/integrations/vacuum/roborock/vacuumcontainers.py index a7d81a92b..f717faefd 100644 --- a/miio/integrations/vacuum/roborock/vacuumcontainers.py +++ b/miio/integrations/vacuum/roborock/vacuumcontainers.py @@ -1,3 +1,4 @@ +import logging from datetime import datetime, time, timedelta from enum import IntEnum from typing import Any, Dict, List, Optional, Union @@ -12,6 +13,8 @@ from .vacuum_enums import MopIntensity, MopMode +_LOGGER = logging.getLogger(__name__) + def pretty_area(x: float) -> float: return int(x) / 1000000 @@ -94,6 +97,46 @@ def pretty_area(x: float) -> float: } +class MultiMapList(DeviceStatus): + """Contains a information about the maps/floors of the vacuum.""" + + def __init__(self, data: Dict[str, Any]) -> None: + # {'max_multi_map': 4, 'max_bak_map': 1, 'multi_map_count': 3, 'map_info': [ + # {'mapFlag': 0, 'add_time': 1664448893, 'length': 10, 'name': 'Downstairs', 'bak_maps': [{'mapFlag': 4, 'add_time': 1663577737}]}, + # {'mapFlag': 1, 'add_time': 1663580330, 'length': 8, 'name': 'Upstairs', 'bak_maps': [{'mapFlag': 5, 'add_time': 1663577752}]}, + # {'mapFlag': 2, 'add_time': 1663580384, 'length': 5, 'name': 'Attic', 'bak_maps': [{'mapFlag': 6, 'add_time': 1663577765}]} + # ]} + self.data = data + if self.map_count != len(self.data["map_info"]): + _LOGGER.warning("Roborock multi_map_count does not equal amount of maps") + + self._map_name_dict = {} + for idx, map in enumerate(self.data["map_info"]): + self._map_name_dict[map["name"]] = map["mapFlag"] + if map["mapFlag"] != idx: + _LOGGER.warning("Roborock mapFlag does not equal map_info list index") + + @property + def map_count(self) -> int: + """Amount of multi maps stored.""" + return self.data["multi_map_count"] + + @property + def map_id_list(self) -> List[int]: + """List of multi map ids.""" + return list(self._map_name_dict.values()) + + @property + def map_list(self) -> List[Dict[str, Any]]: + """List of map info.""" + return self.data["map_info"] + + @property + def map_name_dict(self) -> Dict[str, int]: + """Dictionary of map names (keys) with there ids (values).""" + return self._map_name_dict + + class VacuumStatus(VacuumDeviceStatus): """Container for status reports from the vacuum.""" @@ -284,6 +327,20 @@ def map(self) -> bool: """Map token.""" return bool(self.data["map_present"]) + @property + @setting( + "Multi map", + choices_attribute="multi_map_enum", + setter_name="load_multi_map_by_enum", + icon="mdi:floor-plan", + ) + def multi_map_id(self) -> int: + """The id of the current map with regards to the multi map feature, + + [3,7,11,15] -> [0,1,2,3]. + """ + return int((self.data["map_status"] + 1) / 4 - 1) + @property def in_zone_cleaning(self) -> bool: """Return True if the vacuum is in zone cleaning mode.""" @@ -502,6 +559,11 @@ def area(self) -> float: """Total cleaned area.""" return pretty_area(self.data["area"]) + @property + def multi_map_id(self) -> int: + """Map id used (multi map feature) during the cleaning run.""" + return self.data.get("map_flag", 0) + @property def error_code(self) -> int: """Error code.""" From 9242f162165e430f314b4b98178932f2cade045f Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Mon, 14 Nov 2022 23:27:19 +0100 Subject: [PATCH 03/17] fix tests --- .../vacuum/roborock/tests/test_vacuum.py | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/miio/integrations/vacuum/roborock/tests/test_vacuum.py b/miio/integrations/vacuum/roborock/tests/test_vacuum.py index f88df3e4f..109a0c5da 100644 --- a/miio/integrations/vacuum/roborock/tests/test_vacuum.py +++ b/miio/integrations/vacuum/roborock/tests/test_vacuum.py @@ -71,6 +71,36 @@ def __init__(self, *args, **kwargs): "end_hour": 8, } ] + self.dummies["multi_maps"] = [ + { + "max_multi_map": 4, + "max_bak_map": 1, + "multi_map_count": 3, + "map_info": [ + { + "mapFlag": 0, + "add_time": 1664448893, + "length": 10, + "name": "Downstairs", + "bak_maps": [{"mapFlag": 4, "add_time": 1663577737}], + }, + { + "mapFlag": 1, + "add_time": 1663580330, + "length": 8, + "name": "Upstairs", + "bak_maps": [{"mapFlag": 5, "add_time": 1663577752}], + }, + { + "mapFlag": 2, + "add_time": 1663580384, + "length": 5, + "name": "Attic", + "bak_maps": [{"mapFlag": 6, "add_time": 1663577765}], + }, + ], + } + ] self.return_values = { "get_status": lambda x: [self.state], @@ -86,6 +116,7 @@ def __init__(self, *args, **kwargs): "miIO.info": "dummy info", "get_clean_record": lambda x: [[1488347071, 1488347123, 16, 0, 0, 0]], "get_dnd_timer": lambda x: self.dummies["dnd_timer"], + "get_multi_maps_list": lambda x: self.dummies["multi_maps"], } super().__init__(args, kwargs) From 21b842aefae4cb26423b56a17e435386c904bda4 Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Tue, 15 Nov 2022 22:18:16 +0100 Subject: [PATCH 04/17] fix import enum --- miio/integrations/vacuum/roborock/vacuum.py | 1 + 1 file changed, 1 insertion(+) diff --git a/miio/integrations/vacuum/roborock/vacuum.py b/miio/integrations/vacuum/roborock/vacuum.py index e94e9ae55..b50398c30 100644 --- a/miio/integrations/vacuum/roborock/vacuum.py +++ b/miio/integrations/vacuum/roborock/vacuum.py @@ -1,5 +1,6 @@ import contextlib import datetime +import enum import json import logging import math From 35db117297aef423919b969492626e2252ad14f4 Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Mon, 28 Nov 2022 18:08:47 +0100 Subject: [PATCH 05/17] remove warnings --- miio/integrations/vacuum/roborock/vacuumcontainers.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/miio/integrations/vacuum/roborock/vacuumcontainers.py b/miio/integrations/vacuum/roborock/vacuumcontainers.py index f717faefd..f67d79cdf 100644 --- a/miio/integrations/vacuum/roborock/vacuumcontainers.py +++ b/miio/integrations/vacuum/roborock/vacuumcontainers.py @@ -107,14 +107,10 @@ def __init__(self, data: Dict[str, Any]) -> None: # {'mapFlag': 2, 'add_time': 1663580384, 'length': 5, 'name': 'Attic', 'bak_maps': [{'mapFlag': 6, 'add_time': 1663577765}]} # ]} self.data = data - if self.map_count != len(self.data["map_info"]): - _LOGGER.warning("Roborock multi_map_count does not equal amount of maps") self._map_name_dict = {} for idx, map in enumerate(self.data["map_info"]): self._map_name_dict[map["name"]] = map["mapFlag"] - if map["mapFlag"] != idx: - _LOGGER.warning("Roborock mapFlag does not equal map_info list index") @property def map_count(self) -> int: From 7a11028b04ca34d248f00fad2e7c49b494709895 Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Mon, 28 Nov 2022 18:11:13 +0100 Subject: [PATCH 06/17] Update vacuum.py --- miio/integrations/vacuum/roborock/vacuum.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/miio/integrations/vacuum/roborock/vacuum.py b/miio/integrations/vacuum/roborock/vacuum.py index b50398c30..6d36f8810 100644 --- a/miio/integrations/vacuum/roborock/vacuum.py +++ b/miio/integrations/vacuum/roborock/vacuum.py @@ -366,18 +366,18 @@ def map(self): return self.send("get_map_v1") @command() - def get_multi_maps(self, skip_cache=False) -> MultiMapList: + def get_multi_maps(self) -> MultiMapList: """Return list of multi maps.""" - if self._multi_maps is not None and not skip_cache: + if self._multi_maps is not None: return self._multi_maps self._multi_maps = MultiMapList(self.send("get_multi_maps_list")[0]) return self._multi_maps @command() - def multi_map_enum(self, skip_cache=False) -> Optional[enum.Enum]: + def multi_map_enum(self) -> Optional[enum.Enum]: """Enum of the available map names.""" - if self._multi_map_enum is not None and not skip_cache: + if self._multi_map_enum is not None: return self._multi_map_enum multi_maps = self.get_multi_maps() From d2690b47a5f67f62c1b3d00fc392360860bcf82a Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Mon, 28 Nov 2022 18:34:44 +0100 Subject: [PATCH 07/17] consolidate load_multi_map setter --- miio/integrations/vacuum/roborock/vacuum.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/miio/integrations/vacuum/roborock/vacuum.py b/miio/integrations/vacuum/roborock/vacuum.py index 6d36f8810..0a9f2cec7 100644 --- a/miio/integrations/vacuum/roborock/vacuum.py +++ b/miio/integrations/vacuum/roborock/vacuum.py @@ -386,14 +386,15 @@ def multi_map_enum(self) -> Optional[enum.Enum]: return self._multi_map_enum @command(click.argument("multi_map_id", type=int)) - def load_multi_map(self, multi_map_id: int): + def load_multi_map(self, multi_map_enum: Optional[enum.Enum] = None, multi_map_id: Optional[int] = None): """Change the current map used.""" - return self.send("load_multi_map", [multi_map_id])[0] == "ok" + if multi_map_enum is None and multi_map_id is None: + _LOGGER.error("Either multi_map_enum or multi_map_id is required.") - @command() - def load_multi_map_by_enum(self, multi_map_enum): - """Change the current map used by enum.""" - return self.load_multi_map(multi_map_enum.value) + if multi_map_enum is not None: + multi_map_id = multi_map_enum.value + + return self.send("load_multi_map", [multi_map_id])[0] == "ok" @command(click.argument("start", type=bool)) def edit_map(self, start): From 82fa40550e4e45d80464b3546a94b4ba3645c076 Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Mon, 28 Nov 2022 19:05:37 +0100 Subject: [PATCH 08/17] fix black --- miio/integrations/vacuum/roborock/vacuum.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/miio/integrations/vacuum/roborock/vacuum.py b/miio/integrations/vacuum/roborock/vacuum.py index fded62111..8996bb1e7 100644 --- a/miio/integrations/vacuum/roborock/vacuum.py +++ b/miio/integrations/vacuum/roborock/vacuum.py @@ -390,7 +390,11 @@ def multi_map_enum(self) -> Optional[enum.Enum]: return self._multi_map_enum @command(click.argument("multi_map_id", type=int)) - def load_multi_map(self, multi_map_enum: Optional[enum.Enum] = None, multi_map_id: Optional[int] = None): + def load_multi_map( + self, + multi_map_enum: Optional[enum.Enum] = None, + multi_map_id: Optional[int] = None, + ): """Change the current map used.""" if multi_map_enum is None and multi_map_id is None: _LOGGER.error("Either multi_map_enum or multi_map_id is required.") From 9adc3f658e677832260cdecc70fe9259b77bfb43 Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Mon, 28 Nov 2022 19:06:34 +0100 Subject: [PATCH 09/17] fix setter --- miio/integrations/vacuum/roborock/vacuumcontainers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/miio/integrations/vacuum/roborock/vacuumcontainers.py b/miio/integrations/vacuum/roborock/vacuumcontainers.py index f67d79cdf..7d13dc8ae 100644 --- a/miio/integrations/vacuum/roborock/vacuumcontainers.py +++ b/miio/integrations/vacuum/roborock/vacuumcontainers.py @@ -327,7 +327,7 @@ def map(self) -> bool: @setting( "Multi map", choices_attribute="multi_map_enum", - setter_name="load_multi_map_by_enum", + setter_name="load_multi_map", icon="mdi:floor-plan", ) def multi_map_id(self) -> int: From 0563f53c3fa8513dfd634e3201dac71a960f6d66 Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Mon, 28 Nov 2022 19:13:05 +0100 Subject: [PATCH 10/17] simplify --- miio/integrations/vacuum/roborock/vacuumcontainers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/miio/integrations/vacuum/roborock/vacuumcontainers.py b/miio/integrations/vacuum/roborock/vacuumcontainers.py index 7d13dc8ae..b92867ade 100644 --- a/miio/integrations/vacuum/roborock/vacuumcontainers.py +++ b/miio/integrations/vacuum/roborock/vacuumcontainers.py @@ -109,7 +109,7 @@ def __init__(self, data: Dict[str, Any]) -> None: self.data = data self._map_name_dict = {} - for idx, map in enumerate(self.data["map_info"]): + for map in self.data["map_info"]: self._map_name_dict[map["name"]] = map["mapFlag"] @property From 66b6c192a219d7ca3bc0562c2901bbc7749672aa Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Mon, 5 Dec 2022 18:33:52 +0100 Subject: [PATCH 11/17] raise ValueError --- miio/integrations/vacuum/roborock/vacuum.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/miio/integrations/vacuum/roborock/vacuum.py b/miio/integrations/vacuum/roborock/vacuum.py index 8996bb1e7..70c179499 100644 --- a/miio/integrations/vacuum/roborock/vacuum.py +++ b/miio/integrations/vacuum/roborock/vacuum.py @@ -397,7 +397,7 @@ def load_multi_map( ): """Change the current map used.""" if multi_map_enum is None and multi_map_id is None: - _LOGGER.error("Either multi_map_enum or multi_map_id is required.") + raise ValueError("Either multi_map_enum or multi_map_id is required.") if multi_map_enum is not None: multi_map_id = multi_map_enum.value From 5f797fc8351ec93960f170abd5f745054dc953fb Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Mon, 5 Dec 2022 19:06:16 +0100 Subject: [PATCH 12/17] rename "multi map" to "map" --- miio/integrations/vacuum/roborock/vacuum.py | 48 +++++++++---------- .../vacuum/roborock/vacuumcontainers.py | 16 +++---- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/miio/integrations/vacuum/roborock/vacuum.py b/miio/integrations/vacuum/roborock/vacuum.py index 70c179499..38d000e61 100644 --- a/miio/integrations/vacuum/roborock/vacuum.py +++ b/miio/integrations/vacuum/roborock/vacuum.py @@ -47,7 +47,7 @@ CleaningSummary, ConsumableStatus, DNDStatus, - MultiMapList, + MapList, SoundInstallStatus, SoundStatus, Timer, @@ -137,8 +137,8 @@ def __init__( ip, token, start_id, debug, lazy_discover, timeout, model=model ) self.manual_seqnum = -1 - self._multi_maps: Optional[MultiMapList] = None - self._multi_map_enum = None + self._maps: Optional[MapList] = None + self._map_enum = None @command() def start(self): @@ -370,39 +370,39 @@ def map(self): return self.send("get_map_v1") @command() - def get_multi_maps(self) -> MultiMapList: - """Return list of multi maps.""" - if self._multi_maps is not None: - return self._multi_maps + def get_maps(self) -> MapList: + """Return list of maps.""" + if self._maps is not None: + return self._maps - self._multi_maps = MultiMapList(self.send("get_multi_maps_list")[0]) - return self._multi_maps + self._maps = MapList(self.send("get_multi_maps_list")[0]) + return self._maps @command() - def multi_map_enum(self) -> Optional[enum.Enum]: + def map_enum(self) -> Optional[enum.Enum]: """Enum of the available map names.""" - if self._multi_map_enum is not None: - return self._multi_map_enum + if self._map_enum is not None: + return self._map_enum - multi_maps = self.get_multi_maps() + maps = self.get_maps() - self._multi_map_enum = enum.Enum("multi_map_enum", multi_maps.map_name_dict) - return self._multi_map_enum + self._map_enum = enum.Enum("map_enum", maps.map_name_dict) + return self._map_enum - @command(click.argument("multi_map_id", type=int)) - def load_multi_map( + @command(click.argument("map_id", type=int)) + def load_map( self, - multi_map_enum: Optional[enum.Enum] = None, - multi_map_id: Optional[int] = None, + map_enum: Optional[enum.Enum] = None, + map_id: Optional[int] = None, ): """Change the current map used.""" - if multi_map_enum is None and multi_map_id is None: - raise ValueError("Either multi_map_enum or multi_map_id is required.") + if map_enum is None and map_id is None: + raise ValueError("Either map_enum or map_id is required.") - if multi_map_enum is not None: - multi_map_id = multi_map_enum.value + if map_enum is not None: + map_id = map_enum.value - return self.send("load_multi_map", [multi_map_id])[0] == "ok" + return self.send("load_multi_map", [map_id])[0] == "ok" @command(click.argument("start", type=bool)) def edit_map(self, start): diff --git a/miio/integrations/vacuum/roborock/vacuumcontainers.py b/miio/integrations/vacuum/roborock/vacuumcontainers.py index b92867ade..30e3fd260 100644 --- a/miio/integrations/vacuum/roborock/vacuumcontainers.py +++ b/miio/integrations/vacuum/roborock/vacuumcontainers.py @@ -97,7 +97,7 @@ def pretty_area(x: float) -> float: } -class MultiMapList(DeviceStatus): +class MapList(DeviceStatus): """Contains a information about the maps/floors of the vacuum.""" def __init__(self, data: Dict[str, Any]) -> None: @@ -114,12 +114,12 @@ def __init__(self, data: Dict[str, Any]) -> None: @property def map_count(self) -> int: - """Amount of multi maps stored.""" + """Amount of maps stored.""" return self.data["multi_map_count"] @property def map_id_list(self) -> List[int]: - """List of multi map ids.""" + """List of map ids.""" return list(self._map_name_dict.values()) @property @@ -325,12 +325,12 @@ def map(self) -> bool: @property @setting( - "Multi map", - choices_attribute="multi_map_enum", - setter_name="load_multi_map", + "Map", + choices_attribute="map_enum", + setter_name="load_map", icon="mdi:floor-plan", ) - def multi_map_id(self) -> int: + def map_id(self) -> int: """The id of the current map with regards to the multi map feature, [3,7,11,15] -> [0,1,2,3]. @@ -556,7 +556,7 @@ def area(self) -> float: return pretty_area(self.data["area"]) @property - def multi_map_id(self) -> int: + def map_id(self) -> int: """Map id used (multi map feature) during the cleaning run.""" return self.data.get("map_flag", 0) From 7b07d577fff85b36def6b224a1680bd998059b66 Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Mon, 5 Dec 2022 19:07:58 +0100 Subject: [PATCH 13/17] rename to current_map_id --- miio/integrations/vacuum/roborock/vacuumcontainers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/miio/integrations/vacuum/roborock/vacuumcontainers.py b/miio/integrations/vacuum/roborock/vacuumcontainers.py index 30e3fd260..4ee604808 100644 --- a/miio/integrations/vacuum/roborock/vacuumcontainers.py +++ b/miio/integrations/vacuum/roborock/vacuumcontainers.py @@ -325,12 +325,12 @@ def map(self) -> bool: @property @setting( - "Map", + "Current map", choices_attribute="map_enum", setter_name="load_map", icon="mdi:floor-plan", ) - def map_id(self) -> int: + def current_map_id(self) -> int: """The id of the current map with regards to the multi map feature, [3,7,11,15] -> [0,1,2,3]. From ddf1ad4ffc644b89637428f16824ef8c784ff112 Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Mon, 5 Dec 2022 19:12:53 +0100 Subject: [PATCH 14/17] rename function to _map_enum, variable to _map_enum_cache --- miio/integrations/vacuum/roborock/vacuum.py | 13 ++++++------- .../vacuum/roborock/vacuumcontainers.py | 2 +- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/miio/integrations/vacuum/roborock/vacuum.py b/miio/integrations/vacuum/roborock/vacuum.py index 38d000e61..5983956c0 100644 --- a/miio/integrations/vacuum/roborock/vacuum.py +++ b/miio/integrations/vacuum/roborock/vacuum.py @@ -138,7 +138,7 @@ def __init__( ) self.manual_seqnum = -1 self._maps: Optional[MapList] = None - self._map_enum = None + self._map_enum_cache = None @command() def start(self): @@ -378,16 +378,15 @@ def get_maps(self) -> MapList: self._maps = MapList(self.send("get_multi_maps_list")[0]) return self._maps - @command() - def map_enum(self) -> Optional[enum.Enum]: + def _map_enum(self) -> Optional[enum.Enum]: """Enum of the available map names.""" - if self._map_enum is not None: - return self._map_enum + if self._map_enum_cache is not None: + return self._map_enum_cache maps = self.get_maps() - self._map_enum = enum.Enum("map_enum", maps.map_name_dict) - return self._map_enum + self._map_enum_cache = enum.Enum("map_enum", maps.map_name_dict) + return self._map_enum_cache @command(click.argument("map_id", type=int)) def load_map( diff --git a/miio/integrations/vacuum/roborock/vacuumcontainers.py b/miio/integrations/vacuum/roborock/vacuumcontainers.py index 4ee604808..04de1c1d0 100644 --- a/miio/integrations/vacuum/roborock/vacuumcontainers.py +++ b/miio/integrations/vacuum/roborock/vacuumcontainers.py @@ -326,7 +326,7 @@ def map(self) -> bool: @property @setting( "Current map", - choices_attribute="map_enum", + choices_attribute="_map_enum", setter_name="load_map", icon="mdi:floor-plan", ) From e40d1ba9c89930aa4f743db0d0ad7cdc3052120b Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Mon, 5 Dec 2022 19:33:44 +0100 Subject: [PATCH 15/17] Add test_get_maps_dict --- .../vacuum/roborock/tests/test_vacuum.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/miio/integrations/vacuum/roborock/tests/test_vacuum.py b/miio/integrations/vacuum/roborock/tests/test_vacuum.py index 109a0c5da..00774cb9d 100644 --- a/miio/integrations/vacuum/roborock/tests/test_vacuum.py +++ b/miio/integrations/vacuum/roborock/tests/test_vacuum.py @@ -342,6 +342,25 @@ def test_history_empty(self): assert len(self.device.clean_history().ids) == 0 + def test_get_maps_dict(self): + MAP_LIST = [ + {'mapFlag': 0, 'add_time': 1664448893, 'length': 10, 'name': 'Downstairs', 'bak_maps': [{'mapFlag': 4, 'add_time': 1663577737}]}, + {'mapFlag': 1, 'add_time': 1663580330, 'length': 8, 'name': 'Upstairs', 'bak_maps': [{'mapFlag': 5, 'add_time': 1663577752}]}, + {'mapFlag': 2, 'add_time': 1663580384, 'length': 5, 'name': 'Attic', 'bak_maps': [{'mapFlag': 6, 'add_time': 1663577765}]} + ] + + with patch.object( + self.device, + "send", + return_value=[{'max_multi_map': 4, 'max_bak_map': 1, 'multi_map_count': 3, 'map_info': MAP_LIST}], + ): + maps = self.device.get_maps() + + assert maps.map_count == 3 + assert maps.map_id_list == [0, 1, 2] + assert maps.map_list == MAP_LIST + assert maps.map_name_dict == {"Downstairs": 0, "Upstairs": 1, "Attic": 2} + def test_info_no_cloud(self): """Test the info functionality for non-cloud connected device.""" from miio.exceptions import DeviceInfoUnavailableException From b60163805fb76e6b6629dc0dbdeed3cec87d1823 Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Mon, 5 Dec 2022 19:36:37 +0100 Subject: [PATCH 16/17] fix black --- .../vacuum/roborock/tests/test_vacuum.py | 37 ++++++++++++++++--- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/miio/integrations/vacuum/roborock/tests/test_vacuum.py b/miio/integrations/vacuum/roborock/tests/test_vacuum.py index 00774cb9d..c06a19d30 100644 --- a/miio/integrations/vacuum/roborock/tests/test_vacuum.py +++ b/miio/integrations/vacuum/roborock/tests/test_vacuum.py @@ -344,18 +344,43 @@ def test_history_empty(self): def test_get_maps_dict(self): MAP_LIST = [ - {'mapFlag': 0, 'add_time': 1664448893, 'length': 10, 'name': 'Downstairs', 'bak_maps': [{'mapFlag': 4, 'add_time': 1663577737}]}, - {'mapFlag': 1, 'add_time': 1663580330, 'length': 8, 'name': 'Upstairs', 'bak_maps': [{'mapFlag': 5, 'add_time': 1663577752}]}, - {'mapFlag': 2, 'add_time': 1663580384, 'length': 5, 'name': 'Attic', 'bak_maps': [{'mapFlag': 6, 'add_time': 1663577765}]} + { + "mapFlag": 0, + "add_time": 1664448893, + "length": 10, + "name": "Downstairs", + "bak_maps": [{"mapFlag": 4, "add_time": 1663577737}], + }, + { + "mapFlag": 1, + "add_time": 1663580330, + "length": 8, + "name": "Upstairs", + "bak_maps": [{"mapFlag": 5, "add_time": 1663577752}], + }, + { + "mapFlag": 2, + "add_time": 1663580384, + "length": 5, + "name": "Attic", + "bak_maps": [{"mapFlag": 6, "add_time": 1663577765}], + }, ] - + with patch.object( self.device, "send", - return_value=[{'max_multi_map': 4, 'max_bak_map': 1, 'multi_map_count': 3, 'map_info': MAP_LIST}], + return_value=[ + { + "max_multi_map": 4, + "max_bak_map": 1, + "multi_map_count": 3, + "map_info": MAP_LIST, + } + ], ): maps = self.device.get_maps() - + assert maps.map_count == 3 assert maps.map_id_list == [0, 1, 2] assert maps.map_list == MAP_LIST From 816b5a0fcd734977c0a6f3341e634f42386b0080 Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Mon, 5 Dec 2022 19:51:11 +0100 Subject: [PATCH 17/17] fix tests --- miio/integrations/vacuum/roborock/tests/test_vacuum.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/miio/integrations/vacuum/roborock/tests/test_vacuum.py b/miio/integrations/vacuum/roborock/tests/test_vacuum.py index c06a19d30..8608fa680 100644 --- a/miio/integrations/vacuum/roborock/tests/test_vacuum.py +++ b/miio/integrations/vacuum/roborock/tests/test_vacuum.py @@ -38,6 +38,8 @@ def __init__(self, *args, **kwargs): "msg_seq": 320, "water_box_status": 1, } + self._maps = None + self._map_enum_cache = None self.dummies = {} self.dummies["consumables"] = [