Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions custom_components/dreame_vacuum/dreame/device.py
Original file line number Diff line number Diff line change
Expand Up @@ -6521,13 +6521,13 @@ def set_low_lying_area(self, areas=[]) -> dict[str, Any] | None:
areas = []

if self._map_manager:
if self.status.current_map and self.status.current_map.low_lying_areas is None:
if not self.capability.low_lying_areas:
raise InvalidActionException("Low lying areas are not supported on this device")

if self.status.current_map and not self.status.has_saved_map:
raise InvalidActionException("Cannot edit low lying areas on current map")

raise InvalidActionException("Low lying area editing not supported yet!")
return self.update_map_data_async(self._map_manager.editor.set_low_lying_areas(areas))

def set_predefined_points(self, points=[]) -> dict[str, Any] | None:
"""Set predefined points on current saved map."""
Expand Down
111 changes: 93 additions & 18 deletions custom_components/dreame_vacuum/dreame/map.py
Original file line number Diff line number Diff line change
Expand Up @@ -908,11 +908,13 @@ def _add_map_data(self, partial_map: MapDataPartial) -> None:
map_data.pixel_type = copy.deepcopy(saved_map_data.pixel_type)
map_data.dimensions = copy.deepcopy(saved_map_data.dimensions)
map_data.charger_position = copy.deepcopy(saved_map_data.charger_position)
map_data.no_go_areas = saved_map_data.no_go_areas
map_data.no_mopping_areas = saved_map_data.no_mopping_areas
map_data.virtual_walls = saved_map_data.virtual_walls
map_data.robot_position = None
map_data.docked = True
map_data.no_go_areas = saved_map_data.no_go_areas
map_data.no_mopping_areas = saved_map_data.no_mopping_areas
map_data.virtual_walls = saved_map_data.virtual_walls
map_data.low_lying_areas = saved_map_data.low_lying_areas
map_data.low_lying_area_key = saved_map_data.low_lying_area_key
map_data.robot_position = None
map_data.docked = True
# map_data.restored_map = True
map_data.path = None
map_data.need_optimization = False
Expand Down Expand Up @@ -2541,7 +2543,71 @@ def set_curtains(self, curtains) -> None:
self.refresh_map(self._selected_map_id)
self.refresh_map()

def set_predefined_points(self, predefined_points) -> None:
def set_low_lying_areas(self, areas) -> dict[str, list[dict[str, Any]]] | None:
map_data = self._map_data
if not map_data or not self._selected_map_id:
return

low_lying_areas = []
for index, area in enumerate(areas or [], 1):
x_coords = sorted([area[0], area[2]])
y_coords = sorted([area[1], area[3]])
area_size = round(abs((x_coords[1] - x_coords[0]) * (y_coords[1] - y_coords[0])) / 1000000, 2)
polygon = [
x_coords[0],
y_coords[0],
x_coords[1],
y_coords[0],
x_coords[1],
y_coords[1],
x_coords[0],
y_coords[1],
]
low_lying_areas.append(
Polygon(
index,
x_coords[0],
y_coords[0],
x_coords[1],
y_coords[0],
x_coords[1],
y_coords[1],
x_coords[0],
y_coords[1],
polygon,
1,
0,
None,
area_size,
)
)

map_data.low_lying_areas = low_lying_areas
low_lying_area_key = map_data.low_lying_area_key or "sneak_areas"

self._set_updated_frame_id(map_data.frame_id)
if (
self._saved_map_data
and self._selected_map_id is not None
and self._selected_map_id in self._saved_map_data
):
self._saved_map_data[self._selected_map_id].low_lying_areas = map_data.low_lying_areas
self._saved_map_data[self._selected_map_id].low_lying_area_key = low_lying_area_key
self.refresh_map(self._selected_map_id)
self.refresh_map()

areas_payload = [
{
"id": area.id,
"roi": area.polygon,
"type": area.type,
"hide": area.hidden,
}
for area in map_data.low_lying_areas
]
return {low_lying_area_key: areas_payload}

def set_predefined_points(self, predefined_points) -> None:
map_data = self._map_data
if not map_data or not self._selected_map_id or map_data.predefined_points is None:
return
Expand Down Expand Up @@ -4879,11 +4945,13 @@ def decode_map_data_from_partial(partial_map: MapDataPartial, rotation: int = 0)
map_data.ramps = saved_map_data.ramps
map_data.carpets = saved_map_data.carpets
map_data.deleted_carpets = saved_map_data.deleted_carpets
map_data.detected_carpets = saved_map_data.detected_carpets
map_data.router_position = saved_map_data.router_position
map_data.curtains = saved_map_data.curtains
map_data.hidden_segments = saved_map_data.hidden_segments
map_data.predefined_points = saved_map_data.predefined_points
map_data.detected_carpets = saved_map_data.detected_carpets
map_data.router_position = saved_map_data.router_position
map_data.curtains = saved_map_data.curtains
map_data.low_lying_areas = saved_map_data.low_lying_areas
map_data.low_lying_area_key = saved_map_data.low_lying_area_key
map_data.hidden_segments = saved_map_data.hidden_segments
map_data.predefined_points = saved_map_data.predefined_points
map_data.cleaning_sequence = saved_map_data.cleaning_sequence
if map_data.cleaning_sequence is not None and map_data.version == 1:
map_data.version = 2
Expand Down Expand Up @@ -5340,10 +5408,15 @@ def parse_carpets(carpets):
)
)

low_lying_area_key = "sneak_areas_end" if "sneak_areas_end" in data_json else "sneak_areas"
low_lying_areas = (
changes["sneak_areas"] if changes and "sneak_areas" in changes else data_json.get(low_lying_area_key)
)
low_lying_area_key = "sneak_areas_end" if "sneak_areas_end" in data_json else "sneak_areas"
map_data.low_lying_area_key = low_lying_area_key
low_lying_areas = (
changes.get(low_lying_area_key)
or changes.get("sneak_areas_end")
or changes.get("sneak_areas")
if changes
else data_json.get(low_lying_area_key)
)

if low_lying_areas and not map_data.low_lying_areas:
map_data.low_lying_areas = []
Expand Down Expand Up @@ -5505,9 +5578,11 @@ def parse_carpets(carpets):
if deleted_objects:
if "ai_obstacle" in deleted_objects:
map_data.deleted_obstacles = deleted_objects["ai_obstacle"]
if "sneak_areas" in deleted_objects:
map_data.deleted_low_lying_areas = deleted_objects["sneak_areas"]
if "rec_vw" in deleted_objects:
if "sneak_areas" in deleted_objects:
map_data.deleted_low_lying_areas = deleted_objects["sneak_areas"]
if "sneak_areas_end" in deleted_objects:
map_data.deleted_low_lying_areas = deleted_objects["sneak_areas_end"]
if "rec_vw" in deleted_objects:
map_data.deleted_recommended_area_type = deleted_objects["rec_vw"] ## TODO: Handle this

if not map_data.walls and walls_info and "storeys" in walls_info:
Expand Down
3 changes: 2 additions & 1 deletion custom_components/dreame_vacuum/dreame/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -4522,7 +4522,8 @@ def __init__(self) -> None:
self.carpets: Optional[List[Carpet]] = None # Data json: vw.addcpt
self.deleted_carpets: Optional[List[Carpet]] = None # Data json: vw.nocpt
self.detected_carpets: Optional[List[Carpet]] = None # Data json: carpet_info
self.low_lying_areas: Optional[List[Polygon]] = None # Data json: sneak_areas or sneak_areas_end
self.low_lying_areas: Optional[List[Polygon]] = None # Data json: sneak_areas or sneak_areas_end
self.low_lying_area_key: Optional[str] = None # Data json: sneak_areas or sneak_areas_end
self.cleaning_sequence: Optional[Dict[int, int]] = None # Data json: cleanareaorder
self.mop_type: Optional[Dict[int, str]] = None # Data json: mop_type_with_order
self.current_mop_type: Optional[Dict[int, str]] = None # Data json: moptype
Expand Down