valetudo-map-parser 0.1.9b41__py3-none-any.whl → 0.1.9b43__py3-none-any.whl
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/__init__.py +6 -3
- valetudo_map_parser/config/drawable.py +22 -2
- valetudo_map_parser/config/drawable_elements.py +312 -0
- valetudo_map_parser/config/enhanced_drawable.py +447 -0
- valetudo_map_parser/config/shared.py +27 -0
- valetudo_map_parser/config/types.py +2 -1
- valetudo_map_parser/config/utils.py +410 -1
- valetudo_map_parser/hypfer_draw.py +194 -60
- valetudo_map_parser/hypfer_handler.py +344 -40
- valetudo_map_parser/map_data.py +1 -1
- valetudo_map_parser/rand25_handler.py +224 -39
- valetudo_map_parser/reimg_draw.py +1 -1
- valetudo_map_parser-0.1.9b43.dist-info/METADATA +92 -0
- valetudo_map_parser-0.1.9b43.dist-info/RECORD +23 -0
- {valetudo_map_parser-0.1.9b41.dist-info → valetudo_map_parser-0.1.9b43.dist-info}/WHEEL +1 -1
- valetudo_map_parser-0.1.9b41.dist-info/METADATA +0 -47
- valetudo_map_parser-0.1.9b41.dist-info/RECORD +0 -21
- {valetudo_map_parser-0.1.9b41.dist-info → valetudo_map_parser-0.1.9b43.dist-info}/LICENSE +0 -0
- {valetudo_map_parser-0.1.9b41.dist-info → valetudo_map_parser-0.1.9b43.dist-info}/NOTICE.txt +0 -0
@@ -2,7 +2,7 @@
|
|
2
2
|
Image Handler Module for Valetudo Re Vacuums.
|
3
3
|
It returns the PIL PNG image frame relative to the Map Data extrapolated from the vacuum json.
|
4
4
|
It also returns calibration, rooms data to the card and other images information to the camera.
|
5
|
-
Version: 0.1.9
|
5
|
+
Version: 0.1.9.b42
|
6
6
|
"""
|
7
7
|
|
8
8
|
from __future__ import annotations
|
@@ -11,9 +11,13 @@ import logging
|
|
11
11
|
import uuid
|
12
12
|
from typing import Any
|
13
13
|
|
14
|
+
import numpy as np
|
14
15
|
from PIL import Image
|
15
16
|
|
16
17
|
from .config.auto_crop import AutoCrop
|
18
|
+
from .config.drawable import Drawable
|
19
|
+
from .config.drawable_elements import DrawableElement, DrawingConfig
|
20
|
+
from .config.enhanced_drawable import EnhancedDrawable
|
17
21
|
from .config.types import (
|
18
22
|
COLORS,
|
19
23
|
DEFAULT_IMAGE_SIZE,
|
@@ -48,6 +52,11 @@ class ReImageHandler(BaseHandler, AutoCrop):
|
|
48
52
|
self.outlines = None # Outlines data
|
49
53
|
self.calibration_data = None # Calibration data
|
50
54
|
self.data = RandImageData # Image Data
|
55
|
+
|
56
|
+
# Initialize drawing configuration using the shared utility function
|
57
|
+
from .config.utils import initialize_drawing_config
|
58
|
+
self.drawing_config, self.draw, self.enhanced_draw = initialize_drawing_config(self)
|
59
|
+
self.element_map = None # Map of element codes
|
51
60
|
self.go_to = None # Go to position data
|
52
61
|
self.img_base_layer = None # Base image layer
|
53
62
|
self.img_rotate = shared_data.image_rotate # Image rotation
|
@@ -56,6 +65,59 @@ class ReImageHandler(BaseHandler, AutoCrop):
|
|
56
65
|
self.file_name = self.shared.file_name # File name
|
57
66
|
self.imd = ImageDraw(self) # Image Draw
|
58
67
|
|
68
|
+
async def extract_room_outline_from_map(self, room_id_int, pixels):
|
69
|
+
"""Extract the outline of a room using the pixel data and element map.
|
70
|
+
|
71
|
+
Args:
|
72
|
+
room_id_int: The room ID as an integer
|
73
|
+
pixels: List of pixel coordinates in the format [[x, y, z], ...]
|
74
|
+
|
75
|
+
Returns:
|
76
|
+
List of points forming the outline of the room
|
77
|
+
"""
|
78
|
+
# Calculate x and y min/max from compressed pixels for rectangular fallback
|
79
|
+
x_values = []
|
80
|
+
y_values = []
|
81
|
+
for x, y, _ in pixels:
|
82
|
+
x_values.append(x)
|
83
|
+
y_values.append(y)
|
84
|
+
|
85
|
+
if not x_values or not y_values:
|
86
|
+
return []
|
87
|
+
|
88
|
+
min_x, max_x = min(x_values), max(x_values)
|
89
|
+
min_y, max_y = min(y_values), max(y_values)
|
90
|
+
|
91
|
+
# If we don't have an element map, return a rectangular outline
|
92
|
+
if not hasattr(self, "element_map") or self.element_map is None:
|
93
|
+
# Return rectangular outline
|
94
|
+
return [(min_x, min_y), (max_x, min_y), (max_x, max_y), (min_x, max_y)]
|
95
|
+
|
96
|
+
# Create a binary mask for this room using the pixel data
|
97
|
+
# This is more reliable than using the element_map since we're directly using the pixel data
|
98
|
+
height, width = self.element_map.shape
|
99
|
+
room_mask = np.zeros((height, width), dtype=np.uint8)
|
100
|
+
|
101
|
+
# Fill the mask with room pixels using the pixel data
|
102
|
+
for x, y, _ in pixels: # Using _ instead of z since z is unused
|
103
|
+
# Make sure we're within bounds
|
104
|
+
if 0 <= y < height and 0 <= x < width:
|
105
|
+
# Mark a pixel at this position
|
106
|
+
room_mask[y, x] = 1
|
107
|
+
|
108
|
+
# Debug log to check if we have any room pixels
|
109
|
+
num_room_pixels = np.sum(room_mask)
|
110
|
+
_LOGGER.debug(
|
111
|
+
"%s: Room %s mask has %d pixels",
|
112
|
+
self.file_name, str(room_id_int), int(num_room_pixels)
|
113
|
+
)
|
114
|
+
|
115
|
+
# Use the shared utility function to extract the room outline
|
116
|
+
from .config.utils import async_extract_room_outline
|
117
|
+
return await async_extract_room_outline(
|
118
|
+
room_mask, min_x, min_y, max_x, max_y, self.file_name, room_id_int, _LOGGER
|
119
|
+
)
|
120
|
+
|
59
121
|
async def extract_room_properties(
|
60
122
|
self, json_data: JsonType, destinations: JsonType
|
61
123
|
) -> RoomsProperties:
|
@@ -88,7 +150,27 @@ class ReImageHandler(BaseHandler, AutoCrop):
|
|
88
150
|
x_max = self.outlines[id_x][1][0]
|
89
151
|
y_min = self.outlines[id_x][0][1]
|
90
152
|
y_max = self.outlines[id_x][1][1]
|
153
|
+
|
154
|
+
# Get rectangular corners as a fallback
|
91
155
|
corners = self.get_corners(x_max, x_min, y_max, y_min)
|
156
|
+
|
157
|
+
# Try to extract a more accurate room outline from the element map
|
158
|
+
try:
|
159
|
+
# Extract the room outline using the element map
|
160
|
+
outline = await self.extract_room_outline_from_map(
|
161
|
+
room_id, self.segment_data[id_x]
|
162
|
+
)
|
163
|
+
_LOGGER.debug(
|
164
|
+
"%s: Traced outline for room %s with %d points",
|
165
|
+
self.file_name,
|
166
|
+
room_id,
|
167
|
+
len(outline),
|
168
|
+
)
|
169
|
+
except (ValueError, IndexError, TypeError, ArithmeticError) as e:
|
170
|
+
from .config.utils import handle_room_outline_error
|
171
|
+
handle_room_outline_error(self.file_name, room_id, e, _LOGGER)
|
172
|
+
outline = corners
|
173
|
+
|
92
174
|
# rand256 vacuums accept int(room_id) or str(name)
|
93
175
|
# the card will soon support int(room_id) but the camera will send name
|
94
176
|
# this avoids the manual change of the values in the card.
|
@@ -100,7 +182,7 @@ class ReImageHandler(BaseHandler, AutoCrop):
|
|
100
182
|
)
|
101
183
|
room_properties[int(room_id)] = {
|
102
184
|
"number": int(room_id),
|
103
|
-
"outline":
|
185
|
+
"outline": outline,
|
104
186
|
"name": name,
|
105
187
|
"x": (x_min + x_max) // 2,
|
106
188
|
"y": (y_min + y_max) // 2,
|
@@ -197,49 +279,120 @@ class ReImageHandler(BaseHandler, AutoCrop):
|
|
197
279
|
robot_position,
|
198
280
|
robot_position_angle,
|
199
281
|
) = await self.imd.async_get_robot_position(m_json)
|
282
|
+
|
200
283
|
if self.frame_number == 0:
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
284
|
+
# Create element map for tracking what's drawn where
|
285
|
+
self.element_map = np.zeros((size_y, size_x), dtype=np.int32)
|
286
|
+
self.element_map[:] = DrawableElement.FLOOR
|
287
|
+
|
288
|
+
# Draw base layer if floor is enabled
|
289
|
+
if self.drawing_config.is_enabled(DrawableElement.FLOOR):
|
290
|
+
room_id, img_np_array = await self.imd.async_draw_base_layer(
|
291
|
+
m_json,
|
292
|
+
size_x,
|
293
|
+
size_y,
|
294
|
+
colors["wall"],
|
295
|
+
colors["zone_clean"],
|
296
|
+
colors["background"],
|
297
|
+
DEFAULT_PIXEL_SIZE,
|
298
|
+
)
|
299
|
+
_LOGGER.info("%s: Completed base Layers", self.file_name)
|
300
|
+
|
301
|
+
# Update element map for rooms
|
302
|
+
if 0 < room_id <= 15:
|
303
|
+
# This is a simplification - in a real implementation we would
|
304
|
+
# need to identify the exact pixels that belong to each room
|
305
|
+
pass
|
306
|
+
|
307
|
+
if room_id > 0 and not self.room_propriety:
|
308
|
+
self.room_propriety = await self.get_rooms_attributes(destinations)
|
309
|
+
if self.rooms_pos:
|
310
|
+
self.robot_pos = await self.async_get_robot_in_room(
|
311
|
+
(robot_position[0] * 10),
|
312
|
+
(robot_position[1] * 10),
|
313
|
+
robot_position_angle,
|
314
|
+
)
|
315
|
+
self.img_base_layer = await self.async_copy_array(img_np_array)
|
316
|
+
else:
|
317
|
+
# If floor is disabled, create an empty image
|
318
|
+
background_color = self.drawing_config.get_property(
|
319
|
+
DrawableElement.FLOOR, "color", colors["background"]
|
320
|
+
)
|
321
|
+
img_np_array = await self.draw.create_empty_image(
|
322
|
+
size_x, size_y, background_color
|
323
|
+
)
|
324
|
+
self.img_base_layer = await self.async_copy_array(img_np_array)
|
220
325
|
return self.img_base_layer, robot_position, robot_position_angle
|
221
326
|
|
222
327
|
async def _draw_map_elements(
|
223
328
|
self, img_np_array, m_json, colors, robot_position, robot_position_angle
|
224
329
|
):
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
)
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
330
|
+
# Create element map for tracking what's drawn where if it doesn't exist
|
331
|
+
if self.element_map is None:
|
332
|
+
self.element_map = np.zeros(
|
333
|
+
(img_np_array.shape[0], img_np_array.shape[1]), dtype=np.int32
|
334
|
+
)
|
335
|
+
self.element_map[:] = DrawableElement.FLOOR
|
336
|
+
|
337
|
+
# Draw charger if enabled
|
338
|
+
if self.drawing_config.is_enabled(DrawableElement.CHARGER):
|
339
|
+
img_np_array, self.charger_pos = await self.imd.async_draw_charger(
|
340
|
+
img_np_array, m_json, colors["charger"]
|
341
|
+
)
|
342
|
+
# Update element map for charger position
|
343
|
+
if self.charger_pos:
|
344
|
+
charger_radius = 15
|
345
|
+
for dy in range(-charger_radius, charger_radius + 1):
|
346
|
+
for dx in range(-charger_radius, charger_radius + 1):
|
347
|
+
if dx * dx + dy * dy <= charger_radius * charger_radius:
|
348
|
+
cx, cy = (
|
349
|
+
int(self.charger_pos[0] + dx),
|
350
|
+
int(self.charger_pos[1] + dy),
|
351
|
+
)
|
352
|
+
if (
|
353
|
+
0 <= cy < self.element_map.shape[0]
|
354
|
+
and 0 <= cx < self.element_map.shape[1]
|
355
|
+
):
|
356
|
+
self.element_map[cy, cx] = DrawableElement.CHARGER
|
357
|
+
|
358
|
+
# Draw zones if enabled
|
359
|
+
if self.drawing_config.is_enabled(DrawableElement.RESTRICTED_AREA):
|
360
|
+
img_np_array = await self.imd.async_draw_zones(
|
361
|
+
m_json, img_np_array, colors["zone_clean"]
|
362
|
+
)
|
363
|
+
|
364
|
+
# Draw virtual restrictions if enabled
|
365
|
+
if self.drawing_config.is_enabled(DrawableElement.VIRTUAL_WALL):
|
366
|
+
img_np_array = await self.imd.async_draw_virtual_restrictions(
|
367
|
+
m_json, img_np_array, colors["no_go"]
|
368
|
+
)
|
369
|
+
|
370
|
+
# Draw path if enabled
|
371
|
+
if self.drawing_config.is_enabled(DrawableElement.PATH):
|
372
|
+
img_np_array = await self.imd.async_draw_path(
|
373
|
+
img_np_array, m_json, colors["move"]
|
374
|
+
)
|
375
|
+
|
376
|
+
# Draw go-to flag if enabled
|
377
|
+
if self.drawing_config.is_enabled(DrawableElement.GO_TO_TARGET):
|
378
|
+
img_np_array = await self.imd.async_draw_go_to_flag(
|
379
|
+
img_np_array, m_json, colors["go_to"]
|
380
|
+
)
|
381
|
+
|
382
|
+
# Draw robot if enabled
|
383
|
+
if robot_position and self.drawing_config.is_enabled(DrawableElement.ROBOT):
|
384
|
+
# Get robot color (allows for customization)
|
385
|
+
robot_color = self.drawing_config.get_property(
|
386
|
+
DrawableElement.ROBOT, "color", colors["robot"]
|
387
|
+
)
|
388
|
+
|
389
|
+
img_np_array = await self.imd.async_draw_robot_on_map(
|
390
|
+
img_np_array, robot_position, robot_position_angle, robot_color
|
391
|
+
)
|
392
|
+
|
393
|
+
# Update element map for robot position
|
394
|
+
from .config.utils import update_element_map_with_robot
|
395
|
+
update_element_map_with_robot(self.element_map, robot_position, DrawableElement.ROBOT)
|
243
396
|
img_np_array = await self.async_auto_trim_and_zoom_image(
|
244
397
|
img_np_array,
|
245
398
|
detect_colour=colors["background"],
|
@@ -371,3 +524,35 @@ class ReImageHandler(BaseHandler, AutoCrop):
|
|
371
524
|
self.calibration_data.append(calibration_point)
|
372
525
|
|
373
526
|
return self.calibration_data
|
527
|
+
|
528
|
+
# Element selection methods
|
529
|
+
def enable_element(self, element_code: DrawableElement) -> None:
|
530
|
+
"""Enable drawing of a specific element."""
|
531
|
+
self.drawing_config.enable_element(element_code)
|
532
|
+
|
533
|
+
def disable_element(self, element_code: DrawableElement) -> None:
|
534
|
+
"""Disable drawing of a specific element."""
|
535
|
+
from .config.utils import manage_drawable_elements
|
536
|
+
manage_drawable_elements(self, "disable", element_code=element_code)
|
537
|
+
|
538
|
+
def set_elements(self, element_codes: list[DrawableElement]) -> None:
|
539
|
+
"""Enable only the specified elements, disable all others."""
|
540
|
+
from .config.utils import manage_drawable_elements
|
541
|
+
manage_drawable_elements(self, "set_elements", element_codes=element_codes)
|
542
|
+
|
543
|
+
def set_element_property(
|
544
|
+
self, element_code: DrawableElement, property_name: str, value
|
545
|
+
) -> None:
|
546
|
+
"""Set a drawing property for an element."""
|
547
|
+
from .config.utils import manage_drawable_elements
|
548
|
+
manage_drawable_elements(self, "set_property", element_code=element_code, property_name=property_name, value=value)
|
549
|
+
|
550
|
+
def get_element_at_position(self, x: int, y: int) -> DrawableElement:
|
551
|
+
"""Get the element code at a specific position."""
|
552
|
+
from .config.utils import get_element_at_position
|
553
|
+
return get_element_at_position(self.element_map, x, y)
|
554
|
+
|
555
|
+
def get_room_at_position(self, x: int, y: int) -> int:
|
556
|
+
"""Get the room ID at a specific position, or None if not a room."""
|
557
|
+
from .config.utils import get_room_at_position
|
558
|
+
return get_room_at_position(self.element_map, x, y, DrawableElement.ROOM_1)
|
@@ -0,0 +1,92 @@
|
|
1
|
+
Metadata-Version: 2.3
|
2
|
+
Name: valetudo-map-parser
|
3
|
+
Version: 0.1.9b43
|
4
|
+
Summary: A Python library to parse Valetudo map data returning a PIL Image object.
|
5
|
+
License: Apache-2.0
|
6
|
+
Author: Sandro Cantarella
|
7
|
+
Author-email: gsca075@gmail.com
|
8
|
+
Requires-Python: >=3.12
|
9
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
10
|
+
Classifier: Programming Language :: Python :: 3
|
11
|
+
Classifier: Programming Language :: Python :: 3.12
|
12
|
+
Classifier: Programming Language :: Python :: 3.13
|
13
|
+
Requires-Dist: Pillow (>=10.3.0)
|
14
|
+
Requires-Dist: numpy (>=1.26.4)
|
15
|
+
Project-URL: Bug Tracker, https://github.com/sca075/Python-package-valetudo-map-parser/issues
|
16
|
+
Project-URL: Changelog, https://github.com/sca075/Python-package-valetudo-map-parser/releases
|
17
|
+
Project-URL: Homepage, https://github.com/sca075/Python-package-valetudo-map-parser
|
18
|
+
Project-URL: Repository, https://github.com/sca075/Python-package-valetudo-map-parser
|
19
|
+
Description-Content-Type: text/markdown
|
20
|
+
|
21
|
+
# Python-package-valetudo-map-parser
|
22
|
+
|
23
|
+
---
|
24
|
+
### What is it:
|
25
|
+
❗This is an _unofficial_ project and is not created, maintained, or in any sense linked to [valetudo.cloud](https://valetudo.cloud)
|
26
|
+
|
27
|
+
A Python library that converts Valetudo vacuum JSON map data into PIL (Python Imaging Library) images. This package is primarily developed for and used in the [MQTT Vacuum Camera](https://github.com/sca075/mqtt_vacuum_camera) project.
|
28
|
+
|
29
|
+
---
|
30
|
+
|
31
|
+
### Features:
|
32
|
+
- Processes map data from Valetudo-compatible robot vacuums
|
33
|
+
- Supports both Hypfer and Rand256 vacuum data formats
|
34
|
+
- Renders comprehensive map visualizations including:
|
35
|
+
- Walls and obstacles
|
36
|
+
- Robot position and cleaning path
|
37
|
+
- Room segments and boundaries
|
38
|
+
- Cleaning zones
|
39
|
+
- Virtual restrictions
|
40
|
+
- LiDAR data
|
41
|
+
- Provides auto-cropping and dynamic zooming
|
42
|
+
- Supports image rotation and aspect ratio management
|
43
|
+
- Enables custom color schemes
|
44
|
+
- Handles multilingual labels
|
45
|
+
- Implements thread-safe data sharing
|
46
|
+
|
47
|
+
### Installation:
|
48
|
+
```bash
|
49
|
+
pip install valetudo_map_parser
|
50
|
+
```
|
51
|
+
|
52
|
+
### Requirements:
|
53
|
+
- Python 3.12 or higher
|
54
|
+
- Dependencies:
|
55
|
+
- Pillow (PIL) for image processing
|
56
|
+
- NumPy for array operations
|
57
|
+
|
58
|
+
### Usage:
|
59
|
+
The library is configured using a dictionary format. See our [sample code](https://github.com/sca075/Python-package-valetudo-map-parser/blob/main/tests/test.py) for implementation examples.
|
60
|
+
|
61
|
+
Key functionalities:
|
62
|
+
- Decodes raw data from Rand256 format
|
63
|
+
- Processes JSON data from compatible vacuums
|
64
|
+
- Returns Pillow PNG images
|
65
|
+
- Provides calibration and room property extraction
|
66
|
+
- Supports asynchronous operations
|
67
|
+
|
68
|
+
### Development Status:
|
69
|
+
Current version: 0.1.9.b41
|
70
|
+
- Full functionality available in versions >= 0.1.9
|
71
|
+
- Actively maintained and enhanced
|
72
|
+
- Uses Poetry for dependency management
|
73
|
+
- Implements comprehensive testing
|
74
|
+
- Enforces code quality through ruff, isort, and pylint
|
75
|
+
|
76
|
+
### Contributing:
|
77
|
+
Contributions are welcome! You can help by:
|
78
|
+
- Submitting code improvements
|
79
|
+
- Enhancing documentation
|
80
|
+
- Reporting issues
|
81
|
+
- Suggesting new features
|
82
|
+
|
83
|
+
### Disclaimer:
|
84
|
+
This project is provided "as is" without warranty of any kind. Users assume all risks associated with its use.
|
85
|
+
|
86
|
+
### License:
|
87
|
+
Apache-2.0
|
88
|
+
|
89
|
+
---
|
90
|
+
For more information about Valetudo, visit [valetudo.cloud](https://valetudo.cloud)
|
91
|
+
Integration with Home Assistant: [MQTT Vacuum Camera](https://github.com/sca075/mqtt_vacuum_camera)
|
92
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
valetudo_map_parser/__init__.py,sha256=INujZn4exaXUjqMN8nZkGJIziDWlW59t65fJ34HJX44,956
|
2
|
+
valetudo_map_parser/config/__init__.py,sha256=DQ9plV3ZF_K25Dp5ZQHPDoG-40dQoJNdNi-dfNeR3Zc,48
|
3
|
+
valetudo_map_parser/config/auto_crop.py,sha256=6OvRsWzXMXBaSEvgwpaaisNdozDKiDyTmPjknFxoUMc,12624
|
4
|
+
valetudo_map_parser/config/colors.py,sha256=IzTT9JvF12YGGJxaTiEJRuwUdCCsFCLzsR9seCDfYWs,6515
|
5
|
+
valetudo_map_parser/config/colors_man.py,sha256=9b5c6XmpMzhEiunwfIjVkOk1lDyV-UFoasACdkGXfbo,7833
|
6
|
+
valetudo_map_parser/config/drawable.py,sha256=kTqAC6MKvUe5KbncuHpqnILxtkdxkpU_vESPdbAVXVs,18419
|
7
|
+
valetudo_map_parser/config/drawable_elements.py,sha256=KzXKxJjsNf06e-cUVatSX5uwsn9OkGEIlOq7Li3n9aA,12119
|
8
|
+
valetudo_map_parser/config/enhanced_drawable.py,sha256=ehn0mXdpzHLQEamHE2rBdRv_xXWwfd9gvM5ndgDnoMQ,16825
|
9
|
+
valetudo_map_parser/config/rand25_parser.py,sha256=kIayyqVZBfQfAMkiArzqrrj9vqZB3pkgT0Y5ufrQmGA,16448
|
10
|
+
valetudo_map_parser/config/shared.py,sha256=GIEMF-M6BVA6SFBrql7chV7TciWNMLJ8geqwHB0NrW8,11253
|
11
|
+
valetudo_map_parser/config/types.py,sha256=uEJY-yYHHJWW3EZjg7hERSFrC2XuKzzRGT3C0z31Aw0,18359
|
12
|
+
valetudo_map_parser/config/utils.py,sha256=RJ5GI4sSyMJN8JVi1mafDZ3DX2IUBuR2bKjLpH_bNp4,33368
|
13
|
+
valetudo_map_parser/hypfer_draw.py,sha256=HymZVqRrvoIUt5MVWYp4jzY5KD9U_U5F8f82SWXoO58,20042
|
14
|
+
valetudo_map_parser/hypfer_handler.py,sha256=M-rIoXMcqYYsWw0iGulEeXGDi-a9K8KLUa8IMBxdZ9M,28164
|
15
|
+
valetudo_map_parser/map_data.py,sha256=zRKa5r_mV67m_APWBN6VAtdi8D5aBwFthEgKeoFBa9w,19473
|
16
|
+
valetudo_map_parser/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
17
|
+
valetudo_map_parser/rand25_handler.py,sha256=ia-cwVHUwkV8OMm36mvFJRBa7bsKFM9T7NrcpmILhYM,23968
|
18
|
+
valetudo_map_parser/reimg_draw.py,sha256=1q8LkNTPHEA9Tsapc_JnVw51kpPYNhaBU-KmHkefCQY,12507
|
19
|
+
valetudo_map_parser-0.1.9b43.dist-info/LICENSE,sha256=Lh-qBbuRV0-jiCIBhfV7NgdwFxQFOXH3BKOzK865hRs,10480
|
20
|
+
valetudo_map_parser-0.1.9b43.dist-info/METADATA,sha256=laAJsOpHGG3LppeMizLNoljVOfAnHXzbCdaXjr0NQYc,3289
|
21
|
+
valetudo_map_parser-0.1.9b43.dist-info/NOTICE.txt,sha256=5lTOuWiU9aiEnJ2go8sc7lTJ7ntMBx0g0GFnNrswCY4,2533
|
22
|
+
valetudo_map_parser-0.1.9b43.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
|
23
|
+
valetudo_map_parser-0.1.9b43.dist-info/RECORD,,
|
@@ -1,47 +0,0 @@
|
|
1
|
-
Metadata-Version: 2.3
|
2
|
-
Name: valetudo-map-parser
|
3
|
-
Version: 0.1.9b41
|
4
|
-
Summary: A Python library to parse Valetudo map data returning a PIL Image object.
|
5
|
-
License: Apache-2.0
|
6
|
-
Author: Sandro Cantarella
|
7
|
-
Author-email: gsca075@gmail.com
|
8
|
-
Requires-Python: >=3.12
|
9
|
-
Classifier: License :: OSI Approved :: Apache Software License
|
10
|
-
Classifier: Programming Language :: Python :: 3
|
11
|
-
Classifier: Programming Language :: Python :: 3.12
|
12
|
-
Classifier: Programming Language :: Python :: 3.13
|
13
|
-
Requires-Dist: Pillow (>=10.3.0)
|
14
|
-
Requires-Dist: numpy (>=1.26.4)
|
15
|
-
Project-URL: Bug Tracker, https://github.com/sca075/Python-package-valetudo-map-parser/issues
|
16
|
-
Project-URL: Changelog, https://github.com/sca075/Python-package-valetudo-map-parser/releases
|
17
|
-
Project-URL: Homepage, https://github.com/sca075/Python-package-valetudo-map-parser
|
18
|
-
Project-URL: Repository, https://github.com/sca075/Python-package-valetudo-map-parser
|
19
|
-
Description-Content-Type: text/markdown
|
20
|
-
|
21
|
-
# Python-package-valetudo-map-parser
|
22
|
-
#
|
23
|
-
|
24
|
-
---
|
25
|
-
### What is it:
|
26
|
-
❗This is an _unofficial_ project and is not created, maintained, or in any sense linked to [valetudo.cloud](https://valetudo.cloud)
|
27
|
-
|
28
|
-
Library to Covert Valetudo's Vacuums Json data in a PIL image.
|
29
|
-
|
30
|
-
---
|
31
|
-
|
32
|
-
It is developed and used in the [MQTT Vacuum Camera](https://github.com/sca075/mqtt_vacuum_camera).
|
33
|
-
As python package this code relay on Pythons base and popular pakages such Pillow and Numpy.
|
34
|
-
|
35
|
-
This library can be import by simply using ```pip install valetudo_map_parser```.
|
36
|
-
|
37
|
-
- It is configured with a dictionary format (on GitHub repo test [sample code](https://github.com/sca075/Python-package-valetudo-map-parser/blob/main/tests/test.py)).
|
38
|
-
- It decodes Raw data provided from Rand256.
|
39
|
-
- It provides functions to decode the json data provided from the vacuums.
|
40
|
-
- It returns a Pillow PNG image.
|
41
|
-
|
42
|
-
|
43
|
-
We are still working on the final release at current this library will be fully functional with >= v0.1.9.
|
44
|
-
|
45
|
-
Anyone can contribute to make this code batter, with code, docs or simply creating issues if any faced.
|
46
|
-
In any cases please be aware that "as it is" of course apply if you decide to use it.
|
47
|
-
|
@@ -1,21 +0,0 @@
|
|
1
|
-
valetudo_map_parser/__init__.py,sha256=Wmd20bdI1btzMq-0x8NxGYWskTjdUmD-Fem9MTfziwU,810
|
2
|
-
valetudo_map_parser/config/__init__.py,sha256=DQ9plV3ZF_K25Dp5ZQHPDoG-40dQoJNdNi-dfNeR3Zc,48
|
3
|
-
valetudo_map_parser/config/auto_crop.py,sha256=6OvRsWzXMXBaSEvgwpaaisNdozDKiDyTmPjknFxoUMc,12624
|
4
|
-
valetudo_map_parser/config/colors.py,sha256=IzTT9JvF12YGGJxaTiEJRuwUdCCsFCLzsR9seCDfYWs,6515
|
5
|
-
valetudo_map_parser/config/colors_man.py,sha256=9b5c6XmpMzhEiunwfIjVkOk1lDyV-UFoasACdkGXfbo,7833
|
6
|
-
valetudo_map_parser/config/drawable.py,sha256=CNuNBn1LNWaL2N30tS4jNaJhD5zV4wfGxXOhu0uaMZk,17788
|
7
|
-
valetudo_map_parser/config/rand25_parser.py,sha256=kIayyqVZBfQfAMkiArzqrrj9vqZB3pkgT0Y5ufrQmGA,16448
|
8
|
-
valetudo_map_parser/config/shared.py,sha256=-3HPvFDu-31P14NLXxjZP1eaN1k-l7oYWWNHlRL7IeM,10142
|
9
|
-
valetudo_map_parser/config/types.py,sha256=TAqFjELB7eZTFXq7kYvcgVqOcjprutRsuoQWPj54Rjc,18358
|
10
|
-
valetudo_map_parser/config/utils.py,sha256=yPutV-FEQlDB2z3LhOOFznoprHCApF-zrQMiOtkcO-k,19198
|
11
|
-
valetudo_map_parser/hypfer_draw.py,sha256=akeaReXXQJX2Xp4deC8fQoWpWmcKKPPBsFRNToEyZyc,14944
|
12
|
-
valetudo_map_parser/hypfer_handler.py,sha256=f_1oG69BA94sjcZ8O9Y6A1H-YyEutbvERzqnwgremvg,13001
|
13
|
-
valetudo_map_parser/map_data.py,sha256=6FbQfgxFB6E4kcOWokReJOVSekVaE1kStyhTQhAhiOg,19469
|
14
|
-
valetudo_map_parser/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
15
|
-
valetudo_map_parser/rand25_handler.py,sha256=UGRy-2IIgxZ880LlD95-vGrVdUREvM2iC1vbKhlh2eY,15249
|
16
|
-
valetudo_map_parser/reimg_draw.py,sha256=V0JUASavKVnEtAhv7nOV4pjsRxZrNsjIUtctbKO8wvk,12507
|
17
|
-
valetudo_map_parser-0.1.9b41.dist-info/LICENSE,sha256=Lh-qBbuRV0-jiCIBhfV7NgdwFxQFOXH3BKOzK865hRs,10480
|
18
|
-
valetudo_map_parser-0.1.9b41.dist-info/METADATA,sha256=GFf-n6q6CxlHAC7FctF6MumKEJjXFXQKUtgGQWN5FVQ,2093
|
19
|
-
valetudo_map_parser-0.1.9b41.dist-info/NOTICE.txt,sha256=5lTOuWiU9aiEnJ2go8sc7lTJ7ntMBx0g0GFnNrswCY4,2533
|
20
|
-
valetudo_map_parser-0.1.9b41.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
|
21
|
-
valetudo_map_parser-0.1.9b41.dist-info/RECORD,,
|
File without changes
|
{valetudo_map_parser-0.1.9b41.dist-info → valetudo_map_parser-0.1.9b43.dist-info}/NOTICE.txt
RENAMED
File without changes
|