valetudo-map-parser 0.1.9b28__tar.gz → 0.1.9b29__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.
- {valetudo_map_parser-0.1.9b28 → valetudo_map_parser-0.1.9b29}/PKG-INFO +1 -1
- {valetudo_map_parser-0.1.9b28 → valetudo_map_parser-0.1.9b29}/SCR/valetudo_map_parser/config/auto_crop.py +18 -14
- valetudo_map_parser-0.1.9b29/SCR/valetudo_map_parser/config/colors_man.py +248 -0
- {valetudo_map_parser-0.1.9b28 → valetudo_map_parser-0.1.9b29}/SCR/valetudo_map_parser/config/utils.py +5 -1
- {valetudo_map_parser-0.1.9b28 → valetudo_map_parser-0.1.9b29}/SCR/valetudo_map_parser/hypfer_handler.py +1 -1
- {valetudo_map_parser-0.1.9b28 → valetudo_map_parser-0.1.9b29}/SCR/valetudo_map_parser/rand25_handler.py +4 -2
- {valetudo_map_parser-0.1.9b28 → valetudo_map_parser-0.1.9b29}/pyproject.toml +1 -1
- valetudo_map_parser-0.1.9b28/SCR/valetudo_map_parser/config/colors_man.py +0 -0
- {valetudo_map_parser-0.1.9b28 → valetudo_map_parser-0.1.9b29}/LICENSE +0 -0
- {valetudo_map_parser-0.1.9b28 → valetudo_map_parser-0.1.9b29}/NOTICE.txt +0 -0
- {valetudo_map_parser-0.1.9b28 → valetudo_map_parser-0.1.9b29}/README.md +0 -0
- {valetudo_map_parser-0.1.9b28 → valetudo_map_parser-0.1.9b29}/SCR/valetudo_map_parser/__init__.py +0 -0
- {valetudo_map_parser-0.1.9b28 → valetudo_map_parser-0.1.9b29}/SCR/valetudo_map_parser/config/__init__.py +0 -0
- {valetudo_map_parser-0.1.9b28 → valetudo_map_parser-0.1.9b29}/SCR/valetudo_map_parser/config/colors.py +0 -0
- {valetudo_map_parser-0.1.9b28 → valetudo_map_parser-0.1.9b29}/SCR/valetudo_map_parser/config/drawable.py +0 -0
- {valetudo_map_parser-0.1.9b28 → valetudo_map_parser-0.1.9b29}/SCR/valetudo_map_parser/config/rand25_parser.py +0 -0
- {valetudo_map_parser-0.1.9b28 → valetudo_map_parser-0.1.9b29}/SCR/valetudo_map_parser/config/shared.py +0 -0
- {valetudo_map_parser-0.1.9b28 → valetudo_map_parser-0.1.9b29}/SCR/valetudo_map_parser/config/types.py +0 -0
- {valetudo_map_parser-0.1.9b28 → valetudo_map_parser-0.1.9b29}/SCR/valetudo_map_parser/hypfer_draw.py +0 -0
- {valetudo_map_parser-0.1.9b28 → valetudo_map_parser-0.1.9b29}/SCR/valetudo_map_parser/map_data.py +0 -0
- {valetudo_map_parser-0.1.9b28 → valetudo_map_parser-0.1.9b29}/SCR/valetudo_map_parser/py.typed +0 -0
- {valetudo_map_parser-0.1.9b28 → valetudo_map_parser-0.1.9b29}/SCR/valetudo_map_parser/reimg_draw.py +0 -0
@@ -25,16 +25,20 @@ class TrimError(Exception):
|
|
25
25
|
class AutoCrop:
|
26
26
|
"""Auto Crop Class for trimming and zooming images."""
|
27
27
|
|
28
|
-
def __init__(self, image_handler):
|
28
|
+
def __init__(self, image_handler, shared):
|
29
29
|
self.imh = image_handler
|
30
|
-
self.file_name =
|
30
|
+
self.file_name = shared.file_name
|
31
|
+
self.shared = shared
|
31
32
|
|
32
33
|
@staticmethod
|
33
34
|
def validate_crop_dimensions(shared):
|
34
35
|
"""Ensure width and height are valid before processing cropping."""
|
35
36
|
if shared.image_ref_width <= 0 or shared.image_ref_height <= 0:
|
36
|
-
_LOGGER.warning(
|
37
|
-
|
37
|
+
_LOGGER.warning(
|
38
|
+
"Auto-crop failed: Invalid dimensions (width=%s, height=%s). Using original image.",
|
39
|
+
shared.image_ref_width,
|
40
|
+
shared.image_ref_height,
|
41
|
+
)
|
38
42
|
return False
|
39
43
|
return True
|
40
44
|
|
@@ -66,18 +70,18 @@ class AutoCrop:
|
|
66
70
|
),
|
67
71
|
)
|
68
72
|
# Ensure shared reference dimensions are updated
|
69
|
-
if hasattr(self.
|
70
|
-
self.
|
73
|
+
if hasattr(self.shared, "image_ref_height") and hasattr(
|
74
|
+
self.shared, "image_ref_width"
|
71
75
|
):
|
72
|
-
self.
|
73
|
-
self.
|
76
|
+
self.shared.image_ref_height = trimmed_height
|
77
|
+
self.shared.image_ref_width = trimmed_width
|
74
78
|
else:
|
75
79
|
_LOGGER.warning(
|
76
80
|
"Shared attributes for image dimensions are not initialized."
|
77
81
|
)
|
78
82
|
return trimmed_width, trimmed_height
|
79
83
|
|
80
|
-
async def _async_auto_crop_data(self, tdata: TrimsData
|
84
|
+
async def _async_auto_crop_data(self, tdata: TrimsData): # , tdata=None
|
81
85
|
"""Load the auto crop data from the Camera config."""
|
82
86
|
if not self.imh.auto_crop:
|
83
87
|
trims_data = TrimCropData.from_dict(dict(tdata.to_dict())).to_list()
|
@@ -101,8 +105,8 @@ class AutoCrop:
|
|
101
105
|
|
102
106
|
async def _init_auto_crop(self):
|
103
107
|
"""Initialize the auto crop data."""
|
104
|
-
if not self.imh.auto_crop and self.
|
105
|
-
self.imh.auto_crop = await self._async_auto_crop_data(self.
|
108
|
+
if not self.imh.auto_crop and self.shared.vacuum_state == "docked":
|
109
|
+
self.imh.auto_crop = await self._async_auto_crop_data(self.shared.trims)
|
106
110
|
if self.imh.auto_crop:
|
107
111
|
self.auto_crop_offset()
|
108
112
|
else:
|
@@ -139,8 +143,8 @@ class AutoCrop:
|
|
139
143
|
|
140
144
|
if (
|
141
145
|
zoom
|
142
|
-
and self.
|
143
|
-
and self.
|
146
|
+
and self.shared.vacuum_state == "cleaning"
|
147
|
+
and self.shared.image_auto_zoom
|
144
148
|
):
|
145
149
|
# Zoom the image based on the robot's position.
|
146
150
|
_LOGGER.debug(
|
@@ -247,7 +251,7 @@ class AutoCrop:
|
|
247
251
|
self.imh.trim_right,
|
248
252
|
self.imh.trim_down,
|
249
253
|
).to_list()
|
250
|
-
# if self.
|
254
|
+
# if self.shared.vacuum_state == "docked":
|
251
255
|
# await (
|
252
256
|
# self._async_save_auto_crop_data()
|
253
257
|
# ) # Save the crop data to the disk
|
@@ -0,0 +1,248 @@
|
|
1
|
+
"""
|
2
|
+
Colors RGBA
|
3
|
+
Version: v2025.02.0
|
4
|
+
"""
|
5
|
+
|
6
|
+
import logging
|
7
|
+
|
8
|
+
from .types import (
|
9
|
+
ALPHA_BACKGROUND,
|
10
|
+
ALPHA_CHARGER,
|
11
|
+
ALPHA_GO_TO,
|
12
|
+
ALPHA_MOVE,
|
13
|
+
ALPHA_NO_GO,
|
14
|
+
ALPHA_ROBOT,
|
15
|
+
ALPHA_ROOM_0,
|
16
|
+
ALPHA_ROOM_1,
|
17
|
+
ALPHA_ROOM_2,
|
18
|
+
ALPHA_ROOM_3,
|
19
|
+
ALPHA_ROOM_4,
|
20
|
+
ALPHA_ROOM_5,
|
21
|
+
ALPHA_ROOM_6,
|
22
|
+
ALPHA_ROOM_7,
|
23
|
+
ALPHA_ROOM_8,
|
24
|
+
ALPHA_ROOM_9,
|
25
|
+
ALPHA_ROOM_10,
|
26
|
+
ALPHA_ROOM_11,
|
27
|
+
ALPHA_ROOM_12,
|
28
|
+
ALPHA_ROOM_13,
|
29
|
+
ALPHA_ROOM_14,
|
30
|
+
ALPHA_ROOM_15,
|
31
|
+
ALPHA_TEXT,
|
32
|
+
ALPHA_WALL,
|
33
|
+
ALPHA_ZONE_CLEAN,
|
34
|
+
COLOR_BACKGROUND,
|
35
|
+
COLOR_CHARGER,
|
36
|
+
COLOR_GO_TO,
|
37
|
+
COLOR_MOVE,
|
38
|
+
COLOR_NO_GO,
|
39
|
+
COLOR_ROBOT,
|
40
|
+
COLOR_ROOM_0,
|
41
|
+
COLOR_ROOM_1,
|
42
|
+
COLOR_ROOM_2,
|
43
|
+
COLOR_ROOM_3,
|
44
|
+
COLOR_ROOM_4,
|
45
|
+
COLOR_ROOM_5,
|
46
|
+
COLOR_ROOM_6,
|
47
|
+
COLOR_ROOM_7,
|
48
|
+
COLOR_ROOM_8,
|
49
|
+
COLOR_ROOM_9,
|
50
|
+
COLOR_ROOM_10,
|
51
|
+
COLOR_ROOM_11,
|
52
|
+
COLOR_ROOM_12,
|
53
|
+
COLOR_ROOM_13,
|
54
|
+
COLOR_ROOM_14,
|
55
|
+
COLOR_ROOM_15,
|
56
|
+
COLOR_TEXT,
|
57
|
+
COLOR_WALL,
|
58
|
+
COLOR_ZONE_CLEAN,
|
59
|
+
)
|
60
|
+
|
61
|
+
color_transparent = (0, 0, 0, 0)
|
62
|
+
color_charger = (0, 128, 0, 255)
|
63
|
+
color_move = (238, 247, 255, 255)
|
64
|
+
color_robot = (255, 255, 204, 255)
|
65
|
+
color_no_go = (255, 0, 0, 255)
|
66
|
+
color_go_to = (0, 255, 0, 255)
|
67
|
+
color_background = (0, 125, 255, 255)
|
68
|
+
color_zone_clean = (255, 255, 255, 25)
|
69
|
+
color_wall = (255, 255, 0, 255)
|
70
|
+
color_text = (255, 255, 255, 255)
|
71
|
+
color_grey = (125, 125, 125, 255)
|
72
|
+
color_black = (0, 0, 0, 255)
|
73
|
+
color_room_0 = (135, 206, 250, 255)
|
74
|
+
color_room_1 = (176, 226, 255, 255)
|
75
|
+
color_room_2 = (164, 211, 238, 255)
|
76
|
+
color_room_3 = (141, 182, 205, 255)
|
77
|
+
color_room_4 = (96, 123, 139, 255)
|
78
|
+
color_room_5 = (224, 255, 255, 255)
|
79
|
+
color_room_6 = (209, 238, 238, 255)
|
80
|
+
color_room_7 = (180, 205, 205, 255)
|
81
|
+
color_room_8 = (122, 139, 139, 255)
|
82
|
+
color_room_9 = (175, 238, 238, 255)
|
83
|
+
color_room_10 = (84, 153, 199, 255)
|
84
|
+
color_room_11 = (133, 193, 233, 255)
|
85
|
+
color_room_12 = (245, 176, 65, 255)
|
86
|
+
color_room_13 = (82, 190, 128, 255)
|
87
|
+
color_room_14 = (72, 201, 176, 255)
|
88
|
+
color_room_15 = (165, 105, 18, 255)
|
89
|
+
|
90
|
+
rooms_color = [
|
91
|
+
color_room_0,
|
92
|
+
color_room_1,
|
93
|
+
color_room_2,
|
94
|
+
color_room_3,
|
95
|
+
color_room_4,
|
96
|
+
color_room_5,
|
97
|
+
color_room_6,
|
98
|
+
color_room_7,
|
99
|
+
color_room_8,
|
100
|
+
color_room_9,
|
101
|
+
color_room_10,
|
102
|
+
color_room_11,
|
103
|
+
color_room_12,
|
104
|
+
color_room_13,
|
105
|
+
color_room_14,
|
106
|
+
color_room_15,
|
107
|
+
]
|
108
|
+
|
109
|
+
base_colors_array = [
|
110
|
+
color_wall,
|
111
|
+
color_zone_clean,
|
112
|
+
color_robot,
|
113
|
+
color_background,
|
114
|
+
color_move,
|
115
|
+
color_charger,
|
116
|
+
color_no_go,
|
117
|
+
color_go_to,
|
118
|
+
color_text,
|
119
|
+
]
|
120
|
+
|
121
|
+
color_array = [
|
122
|
+
base_colors_array[0], # color_wall
|
123
|
+
base_colors_array[6], # color_no_go
|
124
|
+
base_colors_array[7], # color_go_to
|
125
|
+
color_black,
|
126
|
+
base_colors_array[2], # color_robot
|
127
|
+
base_colors_array[5], # color_charger
|
128
|
+
color_text,
|
129
|
+
base_colors_array[4], # color_move
|
130
|
+
base_colors_array[3], # color_background
|
131
|
+
base_colors_array[1], # color_zone_clean
|
132
|
+
color_transparent,
|
133
|
+
rooms_color,
|
134
|
+
]
|
135
|
+
|
136
|
+
_LOGGER = logging.getLogger(__name__)
|
137
|
+
|
138
|
+
|
139
|
+
class ColorsManagment:
|
140
|
+
"""Class to manage the colors.
|
141
|
+
Imports and updates the colors from the user configuration."""
|
142
|
+
|
143
|
+
def __init__(self, shared_var):
|
144
|
+
self.shared_var = shared_var
|
145
|
+
|
146
|
+
@staticmethod
|
147
|
+
def add_alpha_to_rgb(alpha_channels, rgb_colors):
|
148
|
+
"""
|
149
|
+
Add alpha channel to RGB colors using corresponding alpha channels.
|
150
|
+
|
151
|
+
Args:
|
152
|
+
alpha_channels (List[Optional[float]]): List of alpha channel values (0.0-255.0).
|
153
|
+
rgb_colors (List[Tuple[int, int, int]]): List of RGB colors.
|
154
|
+
|
155
|
+
Returns:
|
156
|
+
List[Tuple[int, int, int, int]]: List of RGBA colors with alpha channel added.
|
157
|
+
"""
|
158
|
+
if len(alpha_channels) != len(rgb_colors):
|
159
|
+
_LOGGER.error("Input lists must have the same length.")
|
160
|
+
return []
|
161
|
+
|
162
|
+
result = []
|
163
|
+
for alpha, rgb in zip(alpha_channels, rgb_colors):
|
164
|
+
try:
|
165
|
+
alpha_int = int(alpha)
|
166
|
+
if alpha_int < 0:
|
167
|
+
alpha_int = 0
|
168
|
+
elif alpha_int > 255:
|
169
|
+
alpha_int = 255
|
170
|
+
|
171
|
+
if rgb is None:
|
172
|
+
result.append((0, 0, 0, alpha_int))
|
173
|
+
else:
|
174
|
+
result.append((rgb[0], rgb[1], rgb[2], alpha_int))
|
175
|
+
except (ValueError, TypeError):
|
176
|
+
result.append(None)
|
177
|
+
|
178
|
+
return result
|
179
|
+
|
180
|
+
def set_initial_colours(self, device_info: dict) -> None:
|
181
|
+
"""Set the initial colours for the map."""
|
182
|
+
try:
|
183
|
+
user_colors = [
|
184
|
+
device_info.get(COLOR_WALL, color_wall),
|
185
|
+
device_info.get(COLOR_ZONE_CLEAN, color_zone_clean),
|
186
|
+
device_info.get(COLOR_ROBOT, color_robot),
|
187
|
+
device_info.get(COLOR_BACKGROUND, color_background),
|
188
|
+
device_info.get(COLOR_MOVE, color_move),
|
189
|
+
device_info.get(COLOR_CHARGER, color_charger),
|
190
|
+
device_info.get(COLOR_NO_GO, color_no_go),
|
191
|
+
device_info.get(COLOR_GO_TO, color_go_to),
|
192
|
+
device_info.get(COLOR_TEXT, color_text),
|
193
|
+
]
|
194
|
+
user_alpha = [
|
195
|
+
device_info.get(ALPHA_WALL, 255),
|
196
|
+
device_info.get(ALPHA_ZONE_CLEAN, 255),
|
197
|
+
device_info.get(ALPHA_ROBOT, 255),
|
198
|
+
device_info.get(ALPHA_BACKGROUND, 255),
|
199
|
+
device_info.get(ALPHA_MOVE, 255),
|
200
|
+
device_info.get(ALPHA_CHARGER, 255),
|
201
|
+
device_info.get(ALPHA_NO_GO, 255),
|
202
|
+
device_info.get(ALPHA_GO_TO, 255),
|
203
|
+
device_info.get(ALPHA_TEXT, 255),
|
204
|
+
]
|
205
|
+
rooms_colors = [
|
206
|
+
device_info.get(COLOR_ROOM_0, color_room_0),
|
207
|
+
device_info.get(COLOR_ROOM_1, color_room_1),
|
208
|
+
device_info.get(COLOR_ROOM_2, color_room_2),
|
209
|
+
device_info.get(COLOR_ROOM_3, color_room_3),
|
210
|
+
device_info.get(COLOR_ROOM_4, color_room_4),
|
211
|
+
device_info.get(COLOR_ROOM_5, color_room_5),
|
212
|
+
device_info.get(COLOR_ROOM_6, color_room_6),
|
213
|
+
device_info.get(COLOR_ROOM_7, color_room_7),
|
214
|
+
device_info.get(COLOR_ROOM_8, color_room_8),
|
215
|
+
device_info.get(COLOR_ROOM_9, color_room_9),
|
216
|
+
device_info.get(COLOR_ROOM_10, color_room_10),
|
217
|
+
device_info.get(COLOR_ROOM_11, color_room_11),
|
218
|
+
device_info.get(COLOR_ROOM_12, color_room_12),
|
219
|
+
device_info.get(COLOR_ROOM_13, color_room_13),
|
220
|
+
device_info.get(COLOR_ROOM_14, color_room_14),
|
221
|
+
device_info.get(COLOR_ROOM_15, color_room_15),
|
222
|
+
]
|
223
|
+
rooms_alpha = [
|
224
|
+
device_info.get(ALPHA_ROOM_0, 255),
|
225
|
+
device_info.get(ALPHA_ROOM_1, 255),
|
226
|
+
device_info.get(ALPHA_ROOM_2, 255),
|
227
|
+
device_info.get(ALPHA_ROOM_3, 255),
|
228
|
+
device_info.get(ALPHA_ROOM_4, 255),
|
229
|
+
device_info.get(ALPHA_ROOM_5, 255),
|
230
|
+
device_info.get(ALPHA_ROOM_6, 255),
|
231
|
+
device_info.get(ALPHA_ROOM_7, 255),
|
232
|
+
device_info.get(ALPHA_ROOM_8, 255),
|
233
|
+
device_info.get(ALPHA_ROOM_9, 255),
|
234
|
+
device_info.get(ALPHA_ROOM_10, 255),
|
235
|
+
device_info.get(ALPHA_ROOM_11, 255),
|
236
|
+
device_info.get(ALPHA_ROOM_12, 255),
|
237
|
+
device_info.get(ALPHA_ROOM_13, 255),
|
238
|
+
device_info.get(ALPHA_ROOM_14, 255),
|
239
|
+
device_info.get(ALPHA_ROOM_15, 255),
|
240
|
+
]
|
241
|
+
self.shared_var.update_user_colors(
|
242
|
+
self.add_alpha_to_rgb(user_alpha, user_colors)
|
243
|
+
)
|
244
|
+
self.shared_var.update_rooms_colors(
|
245
|
+
self.add_alpha_to_rgb(rooms_alpha, rooms_colors)
|
246
|
+
)
|
247
|
+
except (ValueError, IndexError, UnboundLocalError) as e:
|
248
|
+
_LOGGER.error("Error while populating colors: %s", e)
|
@@ -489,7 +489,11 @@ async def async_resize_image(params: ResizeParams):
|
|
489
489
|
if wsf == 0 or hsf == 0 or params.width <= 0 or params.height <= 0:
|
490
490
|
_LOGGER.warning(
|
491
491
|
"Invalid aspect ratio parameters: width=%s, height=%s, wsf=%s, hsf=%s. Returning original image.",
|
492
|
-
params.width,
|
492
|
+
params.width,
|
493
|
+
params.height,
|
494
|
+
wsf,
|
495
|
+
hsf,
|
496
|
+
)
|
493
497
|
return params.pil_img # Return original image if invalid
|
494
498
|
|
495
499
|
new_aspect_ratio = wsf / hsf
|
@@ -53,7 +53,7 @@ class HypferMapImageHandler(BaseHandler):
|
|
53
53
|
self.offset_left = self.shared.offset_left # offset left
|
54
54
|
self.offset_right = self.shared.offset_right # offset right
|
55
55
|
self.imd = ImDraw(self)
|
56
|
-
self.ac = AutoCrop(self)
|
56
|
+
self.ac = AutoCrop(self, self.shared)
|
57
57
|
self.color_grey = (128, 128, 128, 255)
|
58
58
|
self.file_name = self.shared.file_name # file name of the vacuum.
|
59
59
|
|
@@ -64,7 +64,7 @@ class ReImageHandler(BaseHandler):
|
|
64
64
|
self.offset_left = self.shared.offset_left # offset left
|
65
65
|
self.offset_right = self.shared.offset_right # offset right
|
66
66
|
self.imd = ImageDraw(self) # Image Draw
|
67
|
-
self.crop = AutoCrop(self)
|
67
|
+
self.crop = AutoCrop(self, self.shared)
|
68
68
|
|
69
69
|
async def extract_room_properties(
|
70
70
|
self, json_data: JsonType, destinations: JsonType
|
@@ -260,7 +260,9 @@ class ReImageHandler(BaseHandler):
|
|
260
260
|
|
261
261
|
async def _finalize_image(self, pil_img):
|
262
262
|
if not self.shared.image_ref_width or not self.shared.image_ref_height:
|
263
|
-
_LOGGER.warning(
|
263
|
+
_LOGGER.warning(
|
264
|
+
"Image finalization failed: Invalid image dimensions. Returning original image."
|
265
|
+
)
|
264
266
|
return pil_img
|
265
267
|
if self.check_zoom_and_aspect_ratio():
|
266
268
|
resize_params = prepare_resize_params(self, pil_img, True)
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{valetudo_map_parser-0.1.9b28 → valetudo_map_parser-0.1.9b29}/SCR/valetudo_map_parser/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{valetudo_map_parser-0.1.9b28 → valetudo_map_parser-0.1.9b29}/SCR/valetudo_map_parser/hypfer_draw.py
RENAMED
File without changes
|
{valetudo_map_parser-0.1.9b28 → valetudo_map_parser-0.1.9b29}/SCR/valetudo_map_parser/map_data.py
RENAMED
File without changes
|
{valetudo_map_parser-0.1.9b28 → valetudo_map_parser-0.1.9b29}/SCR/valetudo_map_parser/py.typed
RENAMED
File without changes
|
{valetudo_map_parser-0.1.9b28 → valetudo_map_parser-0.1.9b29}/SCR/valetudo_map_parser/reimg_draw.py
RENAMED
File without changes
|