valetudo-map-parser 0.1.10b5__tar.gz → 0.1.10b7__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.
Files changed (36) hide show
  1. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/PKG-INFO +1 -1
  2. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/__init__.py +17 -1
  3. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/drawable.py +10 -5
  4. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/shared.py +2 -1
  5. valetudo_map_parser-0.1.10b7/SCR/valetudo_map_parser/config/status_text/status_text.py +95 -0
  6. valetudo_map_parser-0.1.10b7/SCR/valetudo_map_parser/config/status_text/translations.py +280 -0
  7. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/types.py +8 -8
  8. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/utils.py +13 -3
  9. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/pyproject.toml +1 -1
  10. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/LICENSE +0 -0
  11. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/NOTICE.txt +0 -0
  12. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/README.md +0 -0
  13. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/__init__.py +0 -0
  14. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/async_utils.py +0 -0
  15. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/auto_crop.py +0 -0
  16. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/color_utils.py +0 -0
  17. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/colors.py +0 -0
  18. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/drawable_elements.py +0 -0
  19. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/enhanced_drawable.py +0 -0
  20. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/fonts/FiraSans.ttf +0 -0
  21. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/fonts/Inter-VF.ttf +0 -0
  22. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/fonts/Lato-Regular.ttf +0 -0
  23. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/fonts/MPLUSRegular.ttf +0 -0
  24. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/fonts/NotoKufiArabic-VF.ttf +0 -0
  25. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/fonts/NotoSansCJKhk-VF.ttf +0 -0
  26. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/fonts/NotoSansKhojki.ttf +0 -0
  27. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/optimized_element_map.py +0 -0
  28. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/rand256_parser.py +0 -0
  29. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/hypfer_draw.py +0 -0
  30. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/hypfer_handler.py +0 -0
  31. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/hypfer_rooms_handler.py +0 -0
  32. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/map_data.py +0 -0
  33. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/py.typed +0 -0
  34. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/rand256_handler.py +0 -0
  35. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/reimg_draw.py +0 -0
  36. {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/rooms_handler.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: valetudo-map-parser
3
- Version: 0.1.10b5
3
+ Version: 0.1.10b7
4
4
  Summary: A Python library to parse Valetudo map data returning a PIL Image object.
5
5
  License: Apache-2.0
6
6
  Author: Sandro Cantarella
@@ -1,5 +1,7 @@
1
1
  """Valetudo map parser.
2
- Version: 0.1.9"""
2
+ Version: 0.1.10"""
3
+
4
+ from pathlib import Path
3
5
 
4
6
  from .config.colors import ColorsManagement
5
7
  from .config.drawable import Drawable
@@ -19,12 +21,23 @@ from .config.types import (
19
21
  NumpyArray,
20
22
  ImageSize,
21
23
  )
24
+ from .config.status_text.status_text import StatusText
25
+ from .config.status_text.translations import translations as STATUS_TEXT_TRANSLATIONS
22
26
  from .hypfer_handler import HypferMapImageHandler
23
27
  from .rand256_handler import ReImageHandler
24
28
  from .rooms_handler import RoomsHandler, RandRoomsHandler
25
29
  from .map_data import HyperMapData
26
30
 
27
31
 
32
+ def get_default_font_path() -> str:
33
+ """Return the absolute path to the bundled default font directory.
34
+
35
+ This returns the path to the fonts folder; the caller can join a specific font file
36
+ to avoid hard-coding a particular font here.
37
+ """
38
+ return str((Path(__file__).resolve().parent / "config" / "fonts").resolve())
39
+
40
+
28
41
  __all__ = [
29
42
  "RoomsHandler",
30
43
  "RandRoomsHandler",
@@ -49,4 +62,7 @@ __all__ = [
49
62
  "PilPNG",
50
63
  "NumpyArray",
51
64
  "ImageSize",
65
+ "StatusText",
66
+ "STATUS_TEXT_TRANSLATIONS",
67
+ "get_default_font_path",
52
68
  ]
@@ -11,6 +11,7 @@ Optimized with NumPy and SciPy for better performance.
11
11
  from __future__ import annotations
12
12
 
13
13
  import logging
14
+ from pathlib import Path
14
15
 
15
16
  import numpy as np
16
17
  from PIL import Image, ImageDraw, ImageFont
@@ -874,11 +875,15 @@ class Drawable:
874
875
  position: bool,
875
876
  ) -> None:
876
877
  """Draw the status text on the image."""
877
- path_default_font = (
878
- "custom_components/mqtt_vacuum_camera/utils/fonts/FiraSans.ttf"
879
- )
880
- default_font = ImageFont.truetype(path_default_font, size)
881
- user_font = ImageFont.truetype(path_font, size)
878
+ module_dir = Path(__file__).resolve().parent
879
+ default_font_path = module_dir / "fonts" / "FiraSans.ttf"
880
+ default_font = ImageFont.truetype(str(default_font_path), size)
881
+
882
+ user_font_path = Path(path_font)
883
+ if not user_font_path.is_absolute():
884
+ repo_root = module_dir.parents[2]
885
+ user_font_path = (repo_root / user_font_path).resolve()
886
+ user_font = ImageFont.truetype(str(user_font_path), size)
882
887
  if position:
883
888
  x, y = 10, 10
884
889
  else:
@@ -58,6 +58,7 @@ class CameraShared:
58
58
  self.frame_number: int = 0 # camera Frame number
59
59
  self.destinations: list = [] # MQTT rand destinations
60
60
  self.rand256_active_zone: list = [] # Active zone for rand256
61
+ self.rand256_zone_coordinates: list = [] # Active zone coordinates for rand256
61
62
  self.is_rand: bool = False # MQTT rand data
62
63
  self._new_mqtt_message = False # New MQTT message
63
64
  # Initialize last_image with default gray image (250x150 minimum)
@@ -82,7 +83,7 @@ class CameraShared:
82
83
  self.user_colors = Colors # User base colors
83
84
  self.rooms_colors = Colors # Rooms colors
84
85
  self.vacuum_battery = 0 # Vacuum battery state
85
- self.vacuum_connection = None # Vacuum connection state
86
+ self.vacuum_connection = False # Vacuum connection state
86
87
  self.vacuum_state = None # Vacuum state
87
88
  self.charger_position = None # Vacuum Charger position
88
89
  self.show_vacuum_state = None # Show vacuum state on the map
@@ -0,0 +1,95 @@
1
+ """
2
+ Version: 0.1.10
3
+ Status text of the vacuum cleaners.
4
+ Class to handle the status text of the vacuum cleaners.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from ..types import LOGGER, PilPNG
10
+ from .translations import translations
11
+
12
+ LOGGER.propagate = True
13
+
14
+
15
+ class StatusText:
16
+ """
17
+ Status text of the vacuum cleaners.
18
+ """
19
+
20
+ def __init__(self, camera_shared):
21
+ self._shared = camera_shared
22
+ self.file_name = self._shared.file_name
23
+
24
+ @staticmethod
25
+ async def get_vacuum_status_translation(
26
+ language: str = "en",
27
+ ) -> dict[str, str] | None:
28
+ """
29
+ Get the vacuum status translation.
30
+ @param language: Language code, default 'en'.
31
+ @return: Mapping for the given language or None.
32
+ """
33
+ return translations.get((language or "en").lower())
34
+
35
+ async def translate_vacuum_status(self) -> str:
36
+ """Return the translated status with EN fallback and safe default."""
37
+ status = self._shared.vacuum_state or "unknown"
38
+ language = (self._shared.user_language or "en").lower()
39
+ translation = await self.get_vacuum_status_translation(language)
40
+ if not translation:
41
+ translation = translations.get("en", {})
42
+ return translation.get(status, str(status).capitalize())
43
+
44
+ async def get_status_text(self, text_img: PilPNG) -> tuple[list[str], int]:
45
+ """
46
+ Compose the image status text.
47
+ :param text_img: Image to draw the text on.
48
+ :return status_text, text_size: List of the status text and the text size.
49
+ """
50
+ status_text = ["If you read me, something really went wrong.."] # default text
51
+ text_size_coverage = 1.5 # resize factor for the text
52
+ text_size = self._shared.vacuum_status_size # default text size
53
+ charge_level = "\u03de" # unicode Koppa symbol
54
+ charging = "\u2211" # unicode Charging symbol
55
+ vacuum_state = await self.translate_vacuum_status()
56
+ if self._shared.show_vacuum_state:
57
+ status_text = [f"{self.file_name}: {vacuum_state}"]
58
+ language = (self._shared.user_language or "en").lower()
59
+ lang_map = translations.get(language) or translations.get("en", {})
60
+ if not self._shared.vacuum_connection:
61
+ mqtt_disc = lang_map.get(
62
+ "mqtt_disconnected",
63
+ translations.get("en", {}).get(
64
+ "mqtt_disconnected", "Disconnected from MQTT?"
65
+ ),
66
+ )
67
+ status_text = [f"{self.file_name}: {mqtt_disc}"]
68
+ else:
69
+ if self._shared.current_room:
70
+ in_room = self._shared.current_room.get("in_room")
71
+ if in_room:
72
+ status_text.append(f" ({in_room})")
73
+ if self._shared.vacuum_state == "docked":
74
+ if self._shared.vacuum_bat_charged():
75
+ status_text.append(" \u00b7 ")
76
+ status_text.append(f"{charging}{charge_level} ")
77
+ status_text.append(f"{self._shared.vacuum_battery}%")
78
+ else:
79
+ status_text.append(" \u00b7 ")
80
+ status_text.append(f"{charge_level} ")
81
+ ready_txt = lang_map.get(
82
+ "ready",
83
+ translations.get("en", {}).get("ready", "Ready."),
84
+ )
85
+ status_text.append(ready_txt)
86
+ else:
87
+ status_text.append(" \u00b7 ")
88
+ status_text.append(f"{charge_level}")
89
+ status_text.append(f" {self._shared.vacuum_battery}%")
90
+ if text_size >= 50 and getattr(text_img, "width", None):
91
+ text_pixels = max(1, sum(len(text) for text in status_text))
92
+ text_size = int(
93
+ (text_size_coverage * text_img.width) // text_pixels
94
+ )
95
+ return status_text, text_size
@@ -0,0 +1,280 @@
1
+ """Translations for vacuum status and status text snippets."""
2
+
3
+ translations = {
4
+ "en": {
5
+ "connected": "Connected",
6
+ "disconnected": "Disconnected",
7
+ "charging": "Charging",
8
+ "cleaning": "Cleaning",
9
+ "docked": "Docked",
10
+ "idle": "Idle",
11
+ "paused": "Paused",
12
+ "returning": "Returning",
13
+ "ready": "Ready.",
14
+ "mqtt_disconnected": "Disconnected from MQTT?",
15
+ },
16
+ "de": {
17
+ "connected": "Verbunden",
18
+ "disconnected": "Nicht verbunden",
19
+ "charging": "Laden",
20
+ "cleaning": "Reinigen",
21
+ "docked": "Angefahren",
22
+ "idle": "Inaktiv",
23
+ "paused": "Pausiert",
24
+ "returning": "Zurückkehren",
25
+ "ready": "Bereit.",
26
+ "mqtt_disconnected": "Von MQTT getrennt?",
27
+ },
28
+ "fr": {
29
+ "connected": "Connecté",
30
+ "disconnected": "Déconnecté",
31
+ "charging": "En charge",
32
+ "cleaning": "Nettoyage",
33
+ "docked": "Ancré",
34
+ "idle": "Inactif",
35
+ "paused": "En pause",
36
+ "returning": "Retour",
37
+ "ready": "Prêt.",
38
+ "mqtt_disconnected": "Déconnecté de MQTT ?",
39
+ },
40
+ "it": {
41
+ "connected": "Connesso",
42
+ "disconnected": "Disconnesso",
43
+ "charging": "Caricamento",
44
+ "cleaning": "Pulizia",
45
+ "docked": "Ancorato",
46
+ "idle": "Inattivo",
47
+ "paused": "In pausa",
48
+ "returning": "Ritorno",
49
+ "ready": "Pronto.",
50
+ "mqtt_disconnected": "Disconnesso da MQTT?",
51
+ },
52
+ "pl": {
53
+ "connected": "Połączony",
54
+ "disconnected": "Rozłączony",
55
+ "charging": "Ładowanie",
56
+ "cleaning": "Czyszczenie",
57
+ "docked": "Zaparkowany",
58
+ "idle": "Nieaktywny",
59
+ "paused": "Wstrzymany",
60
+ "returning": "Powrót",
61
+ "ready": "Gotowy.",
62
+ "mqtt_disconnected": "Odłączono od MQTT?",
63
+ },
64
+ "pt": {
65
+ "connected": "Conectado",
66
+ "disconnected": "Desconectado",
67
+ "charging": "Carregando",
68
+ "cleaning": "Limpando",
69
+ "docked": "Anclado",
70
+ "idle": "Inativo",
71
+ "paused": "Pausado",
72
+ "returning": "Retornando",
73
+ "ready": "Pronto.",
74
+ "mqtt_disconnected": "Desconectado do MQTT?",
75
+ },
76
+ "ru": {
77
+ "connected": "Подключен",
78
+ "disconnected": "Отключен",
79
+ "charging": "Заряжается",
80
+ "cleaning": "Очищается",
81
+ "docked": "Закреплен",
82
+ "idle": "Неактивен",
83
+ "paused": "Приостановлен",
84
+ "returning": "Возвращается",
85
+ "ready": "Готово.",
86
+ "mqtt_disconnected": "Отключено от MQTT?",
87
+ },
88
+ "tr": {
89
+ "connected": "Bağlandı",
90
+ "disconnected": "Bağlantı kesildi",
91
+ "charging": "Şarj ediliyor",
92
+ "cleaning": "Temizleniyor",
93
+ "docked": "Dokundu",
94
+ "idle": "Boşta",
95
+ "paused": "Duraklatıldı",
96
+ "returning": "Geri dönüyor",
97
+ "ready": "Hazır.",
98
+ "mqtt_disconnected": "MQTT bağlantısı kesildi mi?",
99
+ },
100
+ "zh": {
101
+ "connected": "已连接",
102
+ "disconnected": "未连接",
103
+ "charging": "充电中",
104
+ "cleaning": "清扫中",
105
+ "docked": "已停靠",
106
+ "idle": "空闲",
107
+ "paused": "已暂停",
108
+ "returning": "返回中",
109
+ "ready": "已就绪。",
110
+ "mqtt_disconnected": "MQTT 已断开?",
111
+ },
112
+ "ja": {
113
+ "connected": "接続済み",
114
+ "disconnected": "切断されました",
115
+ "charging": "充電中",
116
+ "cleaning": "掃除中",
117
+ "docked": "停泊中",
118
+ "idle": "アイドル",
119
+ "paused": "一時停止中",
120
+ "returning": "戻り中",
121
+ "ready": "準備完了。",
122
+ "mqtt_disconnected": "MQTT から切断されていますか?",
123
+ },
124
+ "ko": {
125
+ "connected": "연결됨",
126
+ "disconnected": "연결 해제됨",
127
+ "charging": "충전 중",
128
+ "cleaning": "청소 중",
129
+ "docked": "도킹됨",
130
+ "idle": "대기 중",
131
+ "paused": "일시 중지됨",
132
+ "returning": "돌아오는 중",
133
+ "ready": "준비 완료.",
134
+ "mqtt_disconnected": "MQTT에서 연결이 끊겼나요?",
135
+ },
136
+ "ar": {
137
+ "connected": "متصل",
138
+ "disconnected": "غير متصل",
139
+ "charging": "جار الت충ّد",
140
+ "cleaning": "washering",
141
+ "docked": "anchored",
142
+ "idle": "iddle",
143
+ "paused": "paused",
144
+ "returning": "returning",
145
+ "ready": "جاهز.",
146
+ "mqtt_disconnected": "هل تم قطع الاتصال بـ MQTT؟",
147
+ },
148
+ "hi": {
149
+ "connected": "संयुक्त",
150
+ "disconnected": "असंयुक्त",
151
+ "charging": "चार्जिंग",
152
+ "cleaning": "साफ़ कर रहा है",
153
+ "docked": "डॉक में",
154
+ "idle": "रूक गया है",
155
+ "paused": "रूक गया है",
156
+ "returning": "वापस आ रहा है",
157
+ "ready": "तैयार.",
158
+ "mqtt_disconnected": "MQTT से डिसकनेक्ट?",
159
+ },
160
+ "bn": {
161
+ "connected": "যোগাযোগ করা হয়েছে",
162
+ "disconnected": "বিরাজিত",
163
+ "charging": "চার্জিং",
164
+ "cleaning": "সাফ করা হচ্ছে",
165
+ "docked": "ডকেড",
166
+ "idle": "বিনা কর্মে",
167
+ "paused": "বিরত",
168
+ "returning": "পুনরায় আসছে",
169
+ "ready": "প্রস্তুত।",
170
+ "mqtt_disconnected": "MQTT থেকে সংযোগ বিচ্ছিন্ন?",
171
+ },
172
+ "sv": {
173
+ "connected": "Ansluten",
174
+ "disconnected": "Frånkopplad",
175
+ "charging": "Laddar",
176
+ "cleaning": "Rensar",
177
+ "docked": "Anknyttad",
178
+ "idle": "Väntande",
179
+ "paused": "Paus",
180
+ "returning": "Återvänder",
181
+ "ready": "Klar.",
182
+ "mqtt_disconnected": "Frånkopplad från MQTT?",
183
+ },
184
+ "fn": {
185
+ "connected": "Konektado",
186
+ "disconnected": "Hindi konektado",
187
+ "charging": "Kinakarga",
188
+ "cleaning": "Binabagay",
189
+ "docked": "Ankore",
190
+ "idle": "Idle",
191
+ "paused": "Napupaua",
192
+ "returning": "Nagbabalik",
193
+ "ready": "Handa.",
194
+ "mqtt_disconnected": "Na-disconnect sa MQTT?",
195
+ },
196
+ "no": {
197
+ "connected": "Tilkoblet",
198
+ "disconnected": "Frakoblet",
199
+ "charging": "Lader",
200
+ "cleaning": "Renser",
201
+ "docked": "Ankoblet",
202
+ "idle": "Inaktiv",
203
+ "paused": "Pause",
204
+ "returning": "Gir tilbake",
205
+ "ready": "Klar.",
206
+ "mqtt_disconnected": "Frakoblet fra MQTT?",
207
+ },
208
+ "cz": {
209
+ "connected": "Připojeno",
210
+ "disconnected": "Odpojeno",
211
+ "charging": "Nabíjení",
212
+ "cleaning": "Čištění",
213
+ "docked": "Zaparkováno",
214
+ "idle": "Nečinný",
215
+ "paused": "Pozastaveno",
216
+ "returning": "Vrací se",
217
+ "ready": "Připraven.",
218
+ "mqtt_disconnected": "Odpojeno od MQTT?",
219
+ },
220
+ "da": {
221
+ "connected": "Tilsluttet",
222
+ "disconnected": "Afvist",
223
+ "charging": "Oplader",
224
+ "cleaning": "Renser",
225
+ "docked": "Ankeret",
226
+ "idle": "Inaktiv",
227
+ "paused": "Pause",
228
+ "returning": "Returnerer",
229
+ "ready": "Klar.",
230
+ "mqtt_disconnected": "Afbrudt fra MQTT?",
231
+ },
232
+ "fi": {
233
+ "connected": "Yhdistetty",
234
+ "disconnected": "Yhteys katkaistu",
235
+ "charging": "Lataa",
236
+ "cleaning": "Siivous",
237
+ "docked": "Ankeroitu",
238
+ "idle": "Lähes",
239
+ "paused": "Tauko",
240
+ "returning": "Palauttaa",
241
+ "ready": "Valmis.",
242
+ "mqtt_disconnected": "Yhteys katkennut MQTT:stä?",
243
+ },
244
+ "el": {
245
+ "connected": "Συνδεδεμένος",
246
+ "disconnected": "Αποσυνδεδεμένος",
247
+ "charging": "Φορτώνει",
248
+ "cleaning": "Καθαρισμός",
249
+ "docked": "Ανκερώθηκε",
250
+ "idle": "Αδρανής",
251
+ "paused": "Παύση",
252
+ "returning": "Επιστρέφει",
253
+ "ready": "Έτοιμο.",
254
+ "mqtt_disconnected": "Αποσυνδεδεμένο από MQTT;",
255
+ },
256
+ "es": {
257
+ "connected": "Conectado",
258
+ "disconnected": "Desconectado",
259
+ "charging": "Cargando",
260
+ "cleaning": "Limpiando",
261
+ "docked": "Anclado",
262
+ "idle": "Inactivo",
263
+ "paused": "Pausado",
264
+ "returning": "Regresando",
265
+ "ready": "Listo.",
266
+ "mqtt_disconnected": "¿Desconectado de MQTT?",
267
+ },
268
+ "nl": {
269
+ "connected": "Verbonden",
270
+ "disconnected": "Niet verbonden",
271
+ "charging": "Laden",
272
+ "cleaning": "Schoonmaken",
273
+ "docked": "Aangeschoten",
274
+ "idle": "Inactief",
275
+ "paused": "Gepauzeerd",
276
+ "returning": "Terugkeren",
277
+ "ready": "Klaar.",
278
+ "mqtt_disconnected": "Verbinding met MQTT verbroken?",
279
+ },
280
+ }
@@ -283,7 +283,7 @@ DEFAULT_VALUES = {
283
283
  "auto_zoom": False,
284
284
  "zoom_lock_ratio": True,
285
285
  "show_vac_status": False,
286
- "vac_status_font": "custom_components/mqtt_vacuum_camera/utils/fonts/FiraSans.ttf",
286
+ "vac_status_font": "SCR/valetudo_map_parser/config/fonts/FiraSans.ttf",
287
287
  "vac_status_size": 50,
288
288
  "vac_status_position": True,
289
289
  "get_svg_file": False,
@@ -443,31 +443,31 @@ RATIO_VALUES = [
443
443
  FONTS_AVAILABLE = [
444
444
  {
445
445
  "label": "Fira Sans",
446
- "value": "config/utils/fonts/FiraSans.ttf",
446
+ "value": "config/fonts/FiraSans.ttf",
447
447
  },
448
448
  {
449
449
  "label": "Inter",
450
- "value": "config/utils/fonts/Inter-VF.ttf",
450
+ "value": "config/fonts/Inter-VF.ttf",
451
451
  },
452
452
  {
453
453
  "label": "M Plus Regular",
454
- "value": "config/utils/fonts/MPLUSRegular.ttf",
454
+ "value": "config/fonts/MPLUSRegular.ttf",
455
455
  },
456
456
  {
457
457
  "label": "Noto Sans CJKhk",
458
- "value": "config/utils/fonts/NotoSansCJKhk-VF.ttf",
458
+ "value": "config/fonts/NotoSansCJKhk-VF.ttf",
459
459
  },
460
460
  {
461
461
  "label": "Noto Kufi Arabic",
462
- "value": "config/utils/fonts/NotoKufiArabic-VF.ttf",
462
+ "value": "config/fonts/NotoKufiArabic-VF.ttf",
463
463
  },
464
464
  {
465
465
  "label": "Noto Sans Khojki",
466
- "value": "config/utils/fonts/NotoSansKhojki.ttf",
466
+ "value": "config/fonts/NotoSansKhojki.ttf",
467
467
  },
468
468
  {
469
469
  "label": "Lato Regular",
470
- "value": "config/utils/fonts/Lato-Regular.ttf",
470
+ "value": "config/fonts/Lato-Regular.ttf",
471
471
  },
472
472
  ]
473
473
 
@@ -14,6 +14,7 @@ from PIL import Image, ImageOps
14
14
  from .drawable import Drawable
15
15
  from .drawable_elements import DrawingConfig
16
16
  from .enhanced_drawable import EnhancedDrawable
17
+ from .status_text.status_text import StatusText
17
18
  from .types import (
18
19
  LOGGER,
19
20
  ChargerPosition,
@@ -25,6 +26,7 @@ from .types import (
25
26
  )
26
27
  from ..map_data import HyperMapData
27
28
 
29
+
28
30
  @dataclass
29
31
  class ResizeParams:
30
32
  """Resize the image to the given dimensions and aspect ratio."""
@@ -86,8 +88,6 @@ class BaseHandler:
86
88
  m_json: dict | None,
87
89
  destinations: list | None = None,
88
90
  bytes_format: bool = False,
89
- text_enabled: bool = False,
90
- vacuum_status: str | None = None,
91
91
  ) -> PilPNG | None:
92
92
  """
93
93
  Unified async function to get PIL image from JSON data for both Hypfer and Rand256 handlers.
@@ -139,7 +139,17 @@ class BaseHandler:
139
139
  # Store the new image in shared data
140
140
  if new_image is not None:
141
141
  self.shared.new_image = new_image
142
-
142
+ if self.shared.show_vacuum_state:
143
+ text_editor = StatusText(self.shared)
144
+ img_text = await text_editor.get_status_text(new_image)
145
+ Drawable.status_text(
146
+ new_image,
147
+ img_text[1],
148
+ self.shared.user_colors[8],
149
+ img_text[0],
150
+ self.shared.vacuum_status_font,
151
+ self.shared.vacuum_status_position,
152
+ )
143
153
  # Convert to binary (PNG bytes) if requested
144
154
  if bytes_format:
145
155
  with io.BytesIO() as buf:
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "valetudo-map-parser"
3
- version = "0.1.10b5"
3
+ version = "0.1.10b7"
4
4
  description = "A Python library to parse Valetudo map data returning a PIL Image object."
5
5
  authors = ["Sandro Cantarella <gsca075@gmail.com>"]
6
6
  license = "Apache-2.0"