homebridge-roborock-vacuum 2.2.9 → 2.2.10

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.2.10
4
+
5
+ - **Fix (connectivity)**: Vacuums whose home data reports protocol `1.0` but that only speak L01 on the LAN, such as the S8 MaxV Ultra (`roborock.vacuum.a97`) on firmware 02.39.x, are controlled locally again (#61). The plugin talked `1.0` to them, the vacuum ignored every local request, and each one timed out after 10 s before falling back to the cloud. Before connecting to a vacuum that reports `1.0`, the plugin now sends it an L01 hello on a separate connection; if the vacuum answers, its local connection uses L01, while cloud requests keep `1.0`. Vacuums that speak `1.0` do not answer, so connecting to them takes up to 3 s longer, and nothing else changes for them. The log shows `reports protocol 1.0 but answers L01 locally` when a vacuum is switched
6
+ - **Fix (connectivity)**: Local L01 connections are no longer dropped after a minute of inactivity (#61). L01 vacuums close a connection that carries no traffic for 60 s, and the plugin reconnected only after another 60 s, so the vacuum spent about half the time without a local connection and commands went through the cloud. The plugin now sends a keepalive ping every 30 s on L01 connections. `1.0` connections stay open by themselves and get no ping
7
+ - **Docs**: The S8 MaxV Ultra is listed among the supported models, and the README explains the local protocol detection
8
+
3
9
  ## 2.2.9
4
10
 
5
11
  - **Fix (Matter)**: Rooms are now published on a map (#60). They used to be published without one, and Apple Home showed no rooms. Room selection works as before
package/README.md CHANGED
@@ -34,7 +34,7 @@ This plugin is inspired by and adapted from the [ioBroker.roborock](https://gith
34
34
 
35
35
  The plugin works with vacuums that are on your **Roborock app** account. These models are known to work:
36
36
 
37
- S4, S4 Max, S5 Max, S6, S6 Pure, S6 MaxV, S7, S7 MaxV (Ultra), S7 Pro Ultra, S7 Max Ultra, S8, S8 Pro Ultra, Q5+, Q5 Pro, Q7, Q7 Max, Q8 Max, Qrevo, Qrevo Pro, Qrevo S, Qrevo Curv, Saros 10, and the models `roborock.vacuum.a95`, `roborock.vacuum.a159` and `roborock.vacuum.ss07`.
37
+ S4, S4 Max, S5 Max, S6, S6 Pure, S6 MaxV, S7, S7 MaxV (Ultra), S7 Pro Ultra, S7 Max Ultra, S8, S8 Pro Ultra, S8 MaxV Ultra, Q5+, Q5 Pro, Q7, Q7 Max, Q8 Max, Qrevo, Qrevo Pro, Qrevo S, Qrevo Curv, Saros 10, and the models `roborock.vacuum.a95`, `roborock.vacuum.a159` and `roborock.vacuum.ss07`.
38
38
 
39
39
  Most other vacuums in the Roborock app work as well; which extras (dock mop wash, consumables, clean modes) appear depends on what the model reports. A vacuum that is set up only in the Xiaomi Home app is not on your Roborock account, so the plugin cannot see it.
40
40
 
@@ -149,6 +149,11 @@ online start** to create the cache, so a brand-new install cannot start offline,
149
149
  and a vacuum that is shared from another Roborock account can only be controlled
150
150
  through the cloud.
151
151
 
152
+ Some firmwares (such as the S8 MaxV Ultra on 02.39.x) speak a different local
153
+ protocol than the one the cloud reports for them. The plugin detects this when
154
+ it connects and logs `reports protocol 1.0 but answers L01 locally`; nothing
155
+ needs to be configured.
156
+
152
157
  ## Dock mop-wash switch
153
158
 
154
159
  On vacuums whose dock can wash the mop (G10, S7 Pro/MaxV Ultra, S7 Max Ultra, S8 Pro Ultra, Q Revo family, …) the plugin adds a switch that starts and stops a dock mop wash:
package/dist/crypto.js CHANGED
@@ -8,7 +8,7 @@ exports.decryptSession = decryptSession;
8
8
  const crypto_1 = __importDefault(require("crypto"));
9
9
  const fs_1 = __importDefault(require("fs"));
10
10
  const path_1 = __importDefault(require("path"));
11
- const KEY_FILENAME = 'roborock.token.key';
11
+ const KEY_FILENAME = "roborock.token.key";
12
12
  function loadOrCreateKey(storagePath) {
13
13
  const keyPath = path_1.default.join(storagePath, KEY_FILENAME);
14
14
  try {
@@ -28,16 +28,16 @@ function loadOrCreateKey(storagePath) {
28
28
  function encryptSession(session, storagePath) {
29
29
  const key = loadOrCreateKey(storagePath);
30
30
  const iv = crypto_1.default.randomBytes(12);
31
- const cipher = crypto_1.default.createCipheriv('aes-256-gcm', key, iv);
32
- const plaintext = Buffer.from(JSON.stringify(session), 'utf8');
31
+ const cipher = crypto_1.default.createCipheriv("aes-256-gcm", key, iv);
32
+ const plaintext = Buffer.from(JSON.stringify(session), "utf8");
33
33
  const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);
34
34
  const tag = cipher.getAuthTag();
35
35
  const payload = {
36
- iv: iv.toString('base64'),
37
- tag: tag.toString('base64'),
38
- data: ciphertext.toString('base64'),
36
+ iv: iv.toString("base64"),
37
+ tag: tag.toString("base64"),
38
+ data: ciphertext.toString("base64"),
39
39
  };
40
- return Buffer.from(JSON.stringify(payload), 'utf8').toString('base64');
40
+ return Buffer.from(JSON.stringify(payload), "utf8").toString("base64");
41
41
  }
42
42
  function decryptSession(encrypted, storagePath) {
43
43
  if (!encrypted) {
@@ -45,14 +45,17 @@ function decryptSession(encrypted, storagePath) {
45
45
  }
46
46
  try {
47
47
  const key = loadOrCreateKey(storagePath);
48
- const raw = Buffer.from(encrypted, 'base64').toString('utf8');
48
+ const raw = Buffer.from(encrypted, "base64").toString("utf8");
49
49
  const payload = JSON.parse(raw);
50
- const iv = Buffer.from(payload.iv, 'base64');
51
- const tag = Buffer.from(payload.tag, 'base64');
52
- const ciphertext = Buffer.from(payload.data, 'base64');
53
- const decipher = crypto_1.default.createDecipheriv('aes-256-gcm', key, iv);
50
+ const iv = Buffer.from(payload.iv, "base64");
51
+ const tag = Buffer.from(payload.tag, "base64");
52
+ const ciphertext = Buffer.from(payload.data, "base64");
53
+ const decipher = crypto_1.default.createDecipheriv("aes-256-gcm", key, iv);
54
54
  decipher.setAuthTag(tag);
55
- const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]).toString('utf8');
55
+ const plaintext = Buffer.concat([
56
+ decipher.update(ciphertext),
57
+ decipher.final(),
58
+ ]).toString("utf8");
56
59
  return JSON.parse(plaintext);
57
60
  }
58
61
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":";;AAEA;;GAEG;AACH,MAAqB,sBAAsB;IACzC,YACmB,MAAc,EACd,SAAkB;QADlB,WAAM,GAAN,MAAM,CAAQ;QACd,cAAS,GAAT,SAAS,CAAS;IAClC,CAAC;IAEJ,8DAA8D;IAC9D,KAAK,CAAC,GAAG,QAAe;QACtB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC;IAED,8DAA8D;IAC9D,IAAI,CAAC,GAAG,QAAe;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,8DAA8D;IAC9D,IAAI,CAAC,GAAG,QAAe;QACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC;IACF,CAAC;IAEA,8DAA8D;IAC9D,KAAK,CAAC,GAAG,QAAe;QACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;CACF;AAnCD,yCAmCC"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":";;AAEA;;GAEG;AACH,MAAqB,sBAAsB;IACzC,YACmB,MAAc,EACd,SAAkB;QADlB,WAAM,GAAN,MAAM,CAAQ;QACd,cAAS,GAAT,SAAS,CAAS;IAClC,CAAC;IAEJ,8DAA8D;IAC9D,KAAK,CAAC,GAAG,QAAe;QACtB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC;IAED,8DAA8D;IAC9D,IAAI,CAAC,GAAG,QAAe;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,8DAA8D;IAC9D,IAAI,CAAC,GAAG,QAAe;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,8DAA8D;IAC9D,KAAK,CAAC,GAAG,QAAe;QACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;CACF;AAnCD,yCAmCC"}
package/dist/settings.js CHANGED
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PLATFORM_NAME = exports.PLUGIN_NAME = void 0;
4
4
  // Name of the plugin (must match the `name` of the package.json).
5
- exports.PLUGIN_NAME = 'homebridge-roborock-vacuum';
5
+ exports.PLUGIN_NAME = "homebridge-roborock-vacuum";
6
6
  // The platform the plugin creates (see config.json).
7
- exports.PLATFORM_NAME = 'RoborockVacuumPlatform';
7
+ exports.PLATFORM_NAME = "RoborockVacuumPlatform";
8
8
  //# sourceMappingURL=settings.js.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "homebridge-roborock-vacuum",
3
3
  "displayName": "Homebridge Roborock Vacuum",
4
- "version": "2.2.9",
4
+ "version": "2.2.10",
5
5
  "description": "Homebridge plugin that brings Roborock robot vacuums to Apple Home over HomeKit or Matter, with local control on your network.",
6
6
  "license": "MIT",
7
7
  "keywords": [
@@ -1,188 +1,188 @@
1
1
  {
2
- "125": "Lebensdauer der Hauptbürste",
3
- "126": "Lebensdauer der Seitenbürste",
4
- "127": "Leben filtern",
5
- "Enable Map Creation": "Kartenerstellung aktivieren",
6
- "Login": "Anmeldung",
7
- "Map Creation Interval": "Kartenerstellungsintervall",
8
- "Password": "Passwort",
9
- "Update interval": "Aktualisierungsintervall",
10
- "adbumper_status": "Adbumber-Status",
11
- "app_charge": "Kehren Sie zum Dock zurück",
12
- "app_goto_target": "Gehe zum Ziel",
13
- "app_pause": "Unterbrechen Sie die Reinigung",
14
- "app_segment_clean": "Beginnen Sie mit der Zimmerreinigung",
15
- "app_set_dryer_setting": "Trockner-Add-on aktivieren",
16
- "app_set_dryer_status": "Trocknerstatus einstellen",
17
- "app_spot": "Beginnen Sie mit der punktuellen Reinigung",
18
- "app_start": "Beginnt mit der Reinigung",
19
- "app_start_collect_dust": "Beginnen Sie mit der Staubsammlung",
20
- "app_start_wash": "Beginnen Sie mit dem Moppwaschen",
21
- "app_stop": "Stoppt die Reinigung",
22
- "app_stop_collect_dust": "Stoppen Sie die Staubansammlung",
23
- "app_stop_wash": "Stoppen Sie das Moppwaschen",
24
- "app_zoned_clean": "Zonenreinigung starten",
25
- "auto_dust_collection": "Automatische Staubabsaugung",
26
- "avoid_count": "Vermeiden Sie das Zählen",
27
- "back_type": "Zurück Typ",
28
- "battery": "Batterieprozentsatz",
29
- "camera_description": "Informationen zu verschiedenen Kamera-Stream-Formaten.",
30
- "camera_status": "Kamera",
31
- "carpet_clean_mode": "Teppichvermeidungsmodus",
32
- "carpet_clean_mode_0": "Vermeiden",
33
- "carpet_clean_mode_1": "Erheben",
34
- "carpet_clean_mode_2": "Ignorieren",
35
- "carpet_mode": "Teppich-Boost",
36
- "carpet_mode_off": "aus",
37
- "carpet_mode_on": "An",
38
- "charge_status": "Ladestatus",
39
- "clean_area": "Gereinigter Bereich",
40
- "clean_count": "Gesamte Reinigungszyklen",
41
- "clean_percent": "Reinigungsprozentsatz abgeschlossen",
42
- "clean_time": "Reinigungszeit",
43
- "cleaningRecords_description": "Beschreibung der Reinigungsaufzeichnungen.",
44
- "cleaning_brush_work_times": "Wie oft wurde die Hochgeschwindigkeits-Wartungsbürste verwendet?",
45
- "collision_avoid_status": "Kollisionsvermeidungsstatus",
46
- "commands_description": "Beschreibung jedes Roboterbefehls.",
47
- "consumables_description": "Kartierung von Verbrauchsmaterialien.",
48
- "debug_mode": "Debug-Modus",
49
- "deviceStatus_description": "Kartierung von Roboterzuständen.",
50
- "distance_off": "Distanz aus",
51
- "dnd_enabled": "DND aktiviert",
52
- "dock_error_status": "Dock-Fehlerstatus",
53
- "dock_type": "Docktyp",
54
- "dry_status": "Trocknungsstatus",
55
- "dss": "Keine Ahnung",
56
- "dust_collection_count": "Gesamtreinigungsaufzeichnungen",
57
- "dust_collection_status": "Staubsammelstatus",
58
- "dust_collection_work_times": "Staubsammelzeiten",
59
- "error_0": "Kein Fehler",
60
- "error_1": "Fehler am Lasersensor",
61
- "error_10": "Filter verstopft",
62
- "error_11": "Magnetfeld erkannt",
63
- "error_12": "Niedriger Batteriestatus",
64
- "error_13": "Ladeproblem",
65
- "error_14": "Batteriefehler",
66
- "error_15": "Fehler des Wandsensors",
67
- "error_16": "Unebene Oberfläche",
68
- "error_17": "Ausfall der Seitenbürste",
69
- "error_18": "Ausfall des Sauggebläses",
70
- "error_19": "Ladestation ohne Stromversorgung",
71
- "error_2": "Fehler des Kollisionssensors",
72
- "error_20": "Unbekannter Fehler",
73
- "error_21": "Problem mit dem Laserdrucksensor",
74
- "error_22": "Problem mit dem Ladesensor",
75
- "error_23": "Dockproblem",
76
- "error_24": "Sperrzone oder unsichtbare Wand erkannt",
77
- "error_254": "Behälter voll",
78
- "error_255": "Interner Fehler",
79
- "error_3": "Rad schwimmt",
80
- "error_4": "Fehler des Klippensensors",
81
- "error_5": "Hauptbürste blockiert",
82
- "error_6": "Seitenbürste blockiert",
83
- "error_7": "Rad blockiert",
84
- "error_8": "Gerät steckt fest",
85
- "error_9": "Staubbehälter fehlt",
86
- "error_code": "Fehlercode",
87
- "error_description": "Kartierung von Roboterfehlern.",
88
- "error_m1": "Unbekannter Fehler",
89
- "fan_power": "Lüfterleistung",
90
- "fan_power_101": "Ruhig",
91
- "fan_power_102": "Ausgewogen",
92
- "fan_power_103": "Turbo",
93
- "fan_power_104": "Max",
94
- "fan_power_105": "Aus",
95
- "fan_power_108": "MAX+",
96
- "fan_power_description": "Zuordnung der Lüfter-Leistungszustände.",
97
- "filter_element_work_time": "Betriebsstunden des Filterelements",
98
- "filter_life": "Leben filtern",
99
- "filter_work_time": "Filtern Sie die verbrauchten Stunden",
100
- "find_me": "Finde den Roboter",
101
- "home_sec_enable_password": "Home Security-Aktivierungspasswort",
102
- "home_sec_status": "Home-Security-Status",
103
- "in_cleaning": "Putzt",
104
- "in_fresh_state": "Im frischen Zustand",
105
- "in_returning": "Kommt zurück",
106
- "is_exploring": "Erforscht",
107
- "is_locating": "Ist Ortung",
108
- "lab_status": "Laborstatus",
109
- "last_clean_t": "Letztes sauberes Mal",
110
- "lock_status": "Sperrstatus",
111
- "main_brush_life": "Lebensdauer der Hauptbürste",
112
- "main_brush_work_time": "Hauptbürste stundenlang im Einsatz",
113
- "map_present": "Karte vorhanden",
114
- "map_status": "Derzeit ausgewählte Karte",
115
- "mop_forbidden_enable": "Wischen verboten aktivieren",
116
- "mop_mode": "Wischmodus",
117
- "mop_mode_300": "Standard",
118
- "mop_mode_301": "Tief",
119
- "mop_mode_303": "Tief+",
120
- "mop_mode_description": "Beschreibung der Wischmodi.",
121
- "msg_seq": "Nachrichtensequenz",
122
- "msg_ver": "Nachrichtenversion",
123
- "option1": "Option 1",
124
- "option2": "",
125
- "rdt": "???",
126
- "resetConsumables_description": "Beschreibung der rücksetzbaren Verbrauchsmaterialien.",
127
- "resume_segment_clean": "Nehmen Sie die Zimmerreinigung wieder auf",
128
- "resume_zoned_clean": "Setzen Sie die Zonenreinigung fort",
129
- "roborock adapter settings": "Adaptereinstellungen für roborock",
130
- "rss": "Signalqualität",
131
- "rtsp": "RTSP-Stream",
132
- "sensor_dirty_time": "Zeit seit der letzten Reinigung der Sensoren",
133
- "set_carpet_clean_mode": "Teppichvermeidungsmodus",
134
- "set_carpet_mode": "Teppich-Boost",
135
- "set_custom_mode": "Stellen Sie den benutzerdefinierten Modus oder die Saugleistung ein",
136
- "set_mop_mode": "Mop-Route",
137
- "set_water_box_custom_mode": "Scrub-Intensität",
138
- "side_brush_life": "Lebensdauer der Seitenbürste",
139
- "side_brush_work_time": "Seitenbürste stundenlang im Einsatz",
140
- "state": "Zustand",
141
- "state_0": "Unbekannt",
142
- "state_1": "Initiieren",
143
- "state_10": "Angehalten",
144
- "state_100": "Voll aufgeladen",
145
- "state_11": "Punktuelle Reinigung",
146
- "state_12": "Fehlerhaft",
147
- "state_13": "Herunterfahren",
148
- "state_14": "Aktualisierung",
149
- "state_15": "Docking",
150
- "state_16": "Gehe zu",
151
- "state_17": "Zonensauber",
152
- "state_18": "Zimmer sauber",
153
- "state_2": "Schlafen",
154
- "state_22": "Staubbehälter entleeren",
155
- "state_23": "Den Mopp waschen",
156
- "state_26": "Ich werde den Mopp waschen",
157
- "state_28": "Im Anruf",
158
- "state_29": "Kartierung",
159
- "state_3": "Leerlauf",
160
- "state_4": "Fernbedienung",
161
- "state_5": "Reinigung",
162
- "state_6": "Rückkehrdock",
163
- "state_7": "Manueller Modus",
164
- "state_8": "Aufladen",
165
- "state_9": "Ladefehler",
166
- "state_description": "Kartierung von Roboteraktivitätszuständen.",
167
- "stop_zoned_clean": "Stoppen Sie die Zonenreinigung",
168
- "strainer_work_times": "Wie oft wurde der Wasserfilter verwendet?",
169
- "stream_html": "HTML-Stream",
170
- "stream_mp4": "MP4-Stream",
171
- "switch_map_mode": "Kartenmodus wechseln",
172
- "unsave_map_flag": "Markierung „Karte nicht speichern“.",
173
- "unsave_map_reason": "Grund für das Aufheben der Kartenspeicherung",
174
- "wash_count": "Anzahl der Wäschen",
175
- "wash_phase": "Waschphase",
176
- "wash_ready": "Bereit zum Waschen",
177
- "wash_status": "Waschstatus",
178
- "water_box_carriage_status": "Status des Wasserkastentransports",
179
- "water_box_custom_mode": "Benutzerdefinierter Wasserverbrauchsmodus",
180
- "water_box_custom_mode_200": "Aus",
181
- "water_box_custom_mode_201": "Leicht",
182
- "water_box_custom_mode_202": "Mäßig",
183
- "water_box_custom_mode_203": "Intensiv",
184
- "water_box_mode": "Zu verwendende Wassermenge",
185
- "water_box_status": "Status der Wasserbox",
186
- "water_shortage_status": "Status der Wasserknappheit",
187
- "webserverPort": "Webserver-Port"
2
+ "125": "Lebensdauer der Hauptbürste",
3
+ "126": "Lebensdauer der Seitenbürste",
4
+ "127": "Leben filtern",
5
+ "Enable Map Creation": "Kartenerstellung aktivieren",
6
+ "Login": "Anmeldung",
7
+ "Map Creation Interval": "Kartenerstellungsintervall",
8
+ "Password": "Passwort",
9
+ "Update interval": "Aktualisierungsintervall",
10
+ "adbumper_status": "Adbumber-Status",
11
+ "app_charge": "Kehren Sie zum Dock zurück",
12
+ "app_goto_target": "Gehe zum Ziel",
13
+ "app_pause": "Unterbrechen Sie die Reinigung",
14
+ "app_segment_clean": "Beginnen Sie mit der Zimmerreinigung",
15
+ "app_set_dryer_setting": "Trockner-Add-on aktivieren",
16
+ "app_set_dryer_status": "Trocknerstatus einstellen",
17
+ "app_spot": "Beginnen Sie mit der punktuellen Reinigung",
18
+ "app_start": "Beginnt mit der Reinigung",
19
+ "app_start_collect_dust": "Beginnen Sie mit der Staubsammlung",
20
+ "app_start_wash": "Beginnen Sie mit dem Moppwaschen",
21
+ "app_stop": "Stoppt die Reinigung",
22
+ "app_stop_collect_dust": "Stoppen Sie die Staubansammlung",
23
+ "app_stop_wash": "Stoppen Sie das Moppwaschen",
24
+ "app_zoned_clean": "Zonenreinigung starten",
25
+ "auto_dust_collection": "Automatische Staubabsaugung",
26
+ "avoid_count": "Vermeiden Sie das Zählen",
27
+ "back_type": "Zurück Typ",
28
+ "battery": "Batterieprozentsatz",
29
+ "camera_description": "Informationen zu verschiedenen Kamera-Stream-Formaten.",
30
+ "camera_status": "Kamera",
31
+ "carpet_clean_mode": "Teppichvermeidungsmodus",
32
+ "carpet_clean_mode_0": "Vermeiden",
33
+ "carpet_clean_mode_1": "Erheben",
34
+ "carpet_clean_mode_2": "Ignorieren",
35
+ "carpet_mode": "Teppich-Boost",
36
+ "carpet_mode_off": "aus",
37
+ "carpet_mode_on": "An",
38
+ "charge_status": "Ladestatus",
39
+ "clean_area": "Gereinigter Bereich",
40
+ "clean_count": "Gesamte Reinigungszyklen",
41
+ "clean_percent": "Reinigungsprozentsatz abgeschlossen",
42
+ "clean_time": "Reinigungszeit",
43
+ "cleaningRecords_description": "Beschreibung der Reinigungsaufzeichnungen.",
44
+ "cleaning_brush_work_times": "Wie oft wurde die Hochgeschwindigkeits-Wartungsbürste verwendet?",
45
+ "collision_avoid_status": "Kollisionsvermeidungsstatus",
46
+ "commands_description": "Beschreibung jedes Roboterbefehls.",
47
+ "consumables_description": "Kartierung von Verbrauchsmaterialien.",
48
+ "debug_mode": "Debug-Modus",
49
+ "deviceStatus_description": "Kartierung von Roboterzuständen.",
50
+ "distance_off": "Distanz aus",
51
+ "dnd_enabled": "DND aktiviert",
52
+ "dock_error_status": "Dock-Fehlerstatus",
53
+ "dock_type": "Docktyp",
54
+ "dry_status": "Trocknungsstatus",
55
+ "dss": "Keine Ahnung",
56
+ "dust_collection_count": "Gesamtreinigungsaufzeichnungen",
57
+ "dust_collection_status": "Staubsammelstatus",
58
+ "dust_collection_work_times": "Staubsammelzeiten",
59
+ "error_0": "Kein Fehler",
60
+ "error_1": "Fehler am Lasersensor",
61
+ "error_10": "Filter verstopft",
62
+ "error_11": "Magnetfeld erkannt",
63
+ "error_12": "Niedriger Batteriestatus",
64
+ "error_13": "Ladeproblem",
65
+ "error_14": "Batteriefehler",
66
+ "error_15": "Fehler des Wandsensors",
67
+ "error_16": "Unebene Oberfläche",
68
+ "error_17": "Ausfall der Seitenbürste",
69
+ "error_18": "Ausfall des Sauggebläses",
70
+ "error_19": "Ladestation ohne Stromversorgung",
71
+ "error_2": "Fehler des Kollisionssensors",
72
+ "error_20": "Unbekannter Fehler",
73
+ "error_21": "Problem mit dem Laserdrucksensor",
74
+ "error_22": "Problem mit dem Ladesensor",
75
+ "error_23": "Dockproblem",
76
+ "error_24": "Sperrzone oder unsichtbare Wand erkannt",
77
+ "error_254": "Behälter voll",
78
+ "error_255": "Interner Fehler",
79
+ "error_3": "Rad schwimmt",
80
+ "error_4": "Fehler des Klippensensors",
81
+ "error_5": "Hauptbürste blockiert",
82
+ "error_6": "Seitenbürste blockiert",
83
+ "error_7": "Rad blockiert",
84
+ "error_8": "Gerät steckt fest",
85
+ "error_9": "Staubbehälter fehlt",
86
+ "error_code": "Fehlercode",
87
+ "error_description": "Kartierung von Roboterfehlern.",
88
+ "error_m1": "Unbekannter Fehler",
89
+ "fan_power": "Lüfterleistung",
90
+ "fan_power_101": "Ruhig",
91
+ "fan_power_102": "Ausgewogen",
92
+ "fan_power_103": "Turbo",
93
+ "fan_power_104": "Max",
94
+ "fan_power_105": "Aus",
95
+ "fan_power_108": "MAX+",
96
+ "fan_power_description": "Zuordnung der Lüfter-Leistungszustände.",
97
+ "filter_element_work_time": "Betriebsstunden des Filterelements",
98
+ "filter_life": "Leben filtern",
99
+ "filter_work_time": "Filtern Sie die verbrauchten Stunden",
100
+ "find_me": "Finde den Roboter",
101
+ "home_sec_enable_password": "Home Security-Aktivierungspasswort",
102
+ "home_sec_status": "Home-Security-Status",
103
+ "in_cleaning": "Putzt",
104
+ "in_fresh_state": "Im frischen Zustand",
105
+ "in_returning": "Kommt zurück",
106
+ "is_exploring": "Erforscht",
107
+ "is_locating": "Ist Ortung",
108
+ "lab_status": "Laborstatus",
109
+ "last_clean_t": "Letztes sauberes Mal",
110
+ "lock_status": "Sperrstatus",
111
+ "main_brush_life": "Lebensdauer der Hauptbürste",
112
+ "main_brush_work_time": "Hauptbürste stundenlang im Einsatz",
113
+ "map_present": "Karte vorhanden",
114
+ "map_status": "Derzeit ausgewählte Karte",
115
+ "mop_forbidden_enable": "Wischen verboten aktivieren",
116
+ "mop_mode": "Wischmodus",
117
+ "mop_mode_300": "Standard",
118
+ "mop_mode_301": "Tief",
119
+ "mop_mode_303": "Tief+",
120
+ "mop_mode_description": "Beschreibung der Wischmodi.",
121
+ "msg_seq": "Nachrichtensequenz",
122
+ "msg_ver": "Nachrichtenversion",
123
+ "option1": "Option 1",
124
+ "option2": "",
125
+ "rdt": "???",
126
+ "resetConsumables_description": "Beschreibung der rücksetzbaren Verbrauchsmaterialien.",
127
+ "resume_segment_clean": "Nehmen Sie die Zimmerreinigung wieder auf",
128
+ "resume_zoned_clean": "Setzen Sie die Zonenreinigung fort",
129
+ "roborock adapter settings": "Adaptereinstellungen für roborock",
130
+ "rss": "Signalqualität",
131
+ "rtsp": "RTSP-Stream",
132
+ "sensor_dirty_time": "Zeit seit der letzten Reinigung der Sensoren",
133
+ "set_carpet_clean_mode": "Teppichvermeidungsmodus",
134
+ "set_carpet_mode": "Teppich-Boost",
135
+ "set_custom_mode": "Stellen Sie den benutzerdefinierten Modus oder die Saugleistung ein",
136
+ "set_mop_mode": "Mop-Route",
137
+ "set_water_box_custom_mode": "Scrub-Intensität",
138
+ "side_brush_life": "Lebensdauer der Seitenbürste",
139
+ "side_brush_work_time": "Seitenbürste stundenlang im Einsatz",
140
+ "state": "Zustand",
141
+ "state_0": "Unbekannt",
142
+ "state_1": "Initiieren",
143
+ "state_10": "Angehalten",
144
+ "state_100": "Voll aufgeladen",
145
+ "state_11": "Punktuelle Reinigung",
146
+ "state_12": "Fehlerhaft",
147
+ "state_13": "Herunterfahren",
148
+ "state_14": "Aktualisierung",
149
+ "state_15": "Docking",
150
+ "state_16": "Gehe zu",
151
+ "state_17": "Zonensauber",
152
+ "state_18": "Zimmer sauber",
153
+ "state_2": "Schlafen",
154
+ "state_22": "Staubbehälter entleeren",
155
+ "state_23": "Den Mopp waschen",
156
+ "state_26": "Ich werde den Mopp waschen",
157
+ "state_28": "Im Anruf",
158
+ "state_29": "Kartierung",
159
+ "state_3": "Leerlauf",
160
+ "state_4": "Fernbedienung",
161
+ "state_5": "Reinigung",
162
+ "state_6": "Rückkehrdock",
163
+ "state_7": "Manueller Modus",
164
+ "state_8": "Aufladen",
165
+ "state_9": "Ladefehler",
166
+ "state_description": "Kartierung von Roboteraktivitätszuständen.",
167
+ "stop_zoned_clean": "Stoppen Sie die Zonenreinigung",
168
+ "strainer_work_times": "Wie oft wurde der Wasserfilter verwendet?",
169
+ "stream_html": "HTML-Stream",
170
+ "stream_mp4": "MP4-Stream",
171
+ "switch_map_mode": "Kartenmodus wechseln",
172
+ "unsave_map_flag": "Markierung „Karte nicht speichern“.",
173
+ "unsave_map_reason": "Grund für das Aufheben der Kartenspeicherung",
174
+ "wash_count": "Anzahl der Wäschen",
175
+ "wash_phase": "Waschphase",
176
+ "wash_ready": "Bereit zum Waschen",
177
+ "wash_status": "Waschstatus",
178
+ "water_box_carriage_status": "Status des Wasserkastentransports",
179
+ "water_box_custom_mode": "Benutzerdefinierter Wasserverbrauchsmodus",
180
+ "water_box_custom_mode_200": "Aus",
181
+ "water_box_custom_mode_201": "Leicht",
182
+ "water_box_custom_mode_202": "Mäßig",
183
+ "water_box_custom_mode_203": "Intensiv",
184
+ "water_box_mode": "Zu verwendende Wassermenge",
185
+ "water_box_status": "Status der Wasserbox",
186
+ "water_shortage_status": "Status der Wasserknappheit",
187
+ "webserverPort": "Webserver-Port"
188
188
  }