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.
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/PKG-INFO +1 -1
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/__init__.py +17 -1
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/drawable.py +10 -5
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/shared.py +2 -1
- valetudo_map_parser-0.1.10b7/SCR/valetudo_map_parser/config/status_text/status_text.py +95 -0
- valetudo_map_parser-0.1.10b7/SCR/valetudo_map_parser/config/status_text/translations.py +280 -0
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/types.py +8 -8
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/utils.py +13 -3
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/pyproject.toml +1 -1
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/LICENSE +0 -0
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/NOTICE.txt +0 -0
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/README.md +0 -0
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/__init__.py +0 -0
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/async_utils.py +0 -0
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/auto_crop.py +0 -0
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/color_utils.py +0 -0
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/colors.py +0 -0
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/drawable_elements.py +0 -0
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/enhanced_drawable.py +0 -0
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/fonts/FiraSans.ttf +0 -0
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/fonts/Inter-VF.ttf +0 -0
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/fonts/Lato-Regular.ttf +0 -0
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/fonts/MPLUSRegular.ttf +0 -0
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/fonts/NotoKufiArabic-VF.ttf +0 -0
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/fonts/NotoSansCJKhk-VF.ttf +0 -0
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/fonts/NotoSansKhojki.ttf +0 -0
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/optimized_element_map.py +0 -0
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/config/rand256_parser.py +0 -0
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/hypfer_draw.py +0 -0
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/hypfer_handler.py +0 -0
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/hypfer_rooms_handler.py +0 -0
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/map_data.py +0 -0
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/py.typed +0 -0
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/rand256_handler.py +0 -0
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/reimg_draw.py +0 -0
- {valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/rooms_handler.py +0 -0
{valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/__init__.py
RENAMED
@@ -1,5 +1,7 @@
|
|
1
1
|
"""Valetudo map parser.
|
2
|
-
Version: 0.1.
|
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
|
-
|
878
|
-
|
879
|
-
)
|
880
|
-
|
881
|
-
|
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 =
|
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": "
|
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/
|
446
|
+
"value": "config/fonts/FiraSans.ttf",
|
447
447
|
},
|
448
448
|
{
|
449
449
|
"label": "Inter",
|
450
|
-
"value": "config/
|
450
|
+
"value": "config/fonts/Inter-VF.ttf",
|
451
451
|
},
|
452
452
|
{
|
453
453
|
"label": "M Plus Regular",
|
454
|
-
"value": "config/
|
454
|
+
"value": "config/fonts/MPLUSRegular.ttf",
|
455
455
|
},
|
456
456
|
{
|
457
457
|
"label": "Noto Sans CJKhk",
|
458
|
-
"value": "config/
|
458
|
+
"value": "config/fonts/NotoSansCJKhk-VF.ttf",
|
459
459
|
},
|
460
460
|
{
|
461
461
|
"label": "Noto Kufi Arabic",
|
462
|
-
"value": "config/
|
462
|
+
"value": "config/fonts/NotoKufiArabic-VF.ttf",
|
463
463
|
},
|
464
464
|
{
|
465
465
|
"label": "Noto Sans Khojki",
|
466
|
-
"value": "config/
|
466
|
+
"value": "config/fonts/NotoSansKhojki.ttf",
|
467
467
|
},
|
468
468
|
{
|
469
469
|
"label": "Lato Regular",
|
470
|
-
"value": "config/
|
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:
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
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.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/hypfer_draw.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/map_data.py
RENAMED
File without changes
|
{valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/py.typed
RENAMED
File without changes
|
File without changes
|
{valetudo_map_parser-0.1.10b5 → valetudo_map_parser-0.1.10b7}/SCR/valetudo_map_parser/reimg_draw.py
RENAMED
File without changes
|
File without changes
|