iobroker.homewizard 0.7.5 → 0.7.6
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/README.md +11 -11
- package/build/lib/i18n-states.js +11 -0
- package/build/lib/i18n-states.js.map +2 -2
- package/build/lib/state-manager.js +45 -11
- package/build/lib/state-manager.js.map +2 -2
- package/io-package.json +14 -14
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -170,15 +170,19 @@ homewizard.0.
|
|
|
170
170
|
Placeholder for the next version (at the beginning of the line):
|
|
171
171
|
### **WORK IN PROGRESS**
|
|
172
172
|
-->
|
|
173
|
+
### 0.7.6 (2026-05-12)
|
|
174
|
+
|
|
175
|
+
- The battery mode dropdown and the tariff state no longer crash the admin with "Error in GUI" when opened.
|
|
176
|
+
|
|
173
177
|
### 0.7.5 (2026-05-10)
|
|
174
|
-
- Half-dead
|
|
175
|
-
-
|
|
176
|
-
- IP recovery
|
|
177
|
-
- Battery endpoint errors are no longer fully swallowed: 404 stays silent (device has no battery), other errors
|
|
178
|
-
- Manual pairing IP is validated as IPv4 up front — invalid input fails fast with a
|
|
178
|
+
- Half-dead connections are now detected and torn down — fixes cases where the device stopped responding but the adapter still showed "connected" with stale measurement values.
|
|
179
|
+
- The auth handshake now has a 45-second timeout — devices that accept the TCP connection but never reply to the auth protocol no longer hang forever.
|
|
180
|
+
- IP recovery and manual re-pair after factory reset no longer leave a dangling connection from before — switching to a new IP just works.
|
|
181
|
+
- Battery endpoint errors are no longer fully swallowed: 404 stays silent (device has no battery), other errors are visible in the debug log instead of being silently dropped.
|
|
182
|
+
- Manual pairing IP is validated as IPv4 up front — invalid input fails fast with a warning instead of a silent 60-second pairing timeout.
|
|
179
183
|
- A single corrupted device token can no longer take down the whole adapter — affected device is skipped with a re-pair hint, the others come up normally.
|
|
180
|
-
- Pairing supports multiple devices in one 60
|
|
181
|
-
-
|
|
184
|
+
- Pairing supports multiple devices in one 60-second window: button-press additional devices and they are added one after the other instead of the session ending after the first.
|
|
185
|
+
- Various behind-the-scenes hardening — invisible if everything was already running fine, robustness if something is unstable.
|
|
182
186
|
|
|
183
187
|
### 0.7.4 (2026-05-09)
|
|
184
188
|
- Adapter log messages are now English only, in line with the ioBroker community standard. Localized state names, descriptions and dropdown labels (11 languages) are unchanged.
|
|
@@ -189,10 +193,6 @@ homewizard.0.
|
|
|
189
193
|
### 0.7.2 (2026-05-06)
|
|
190
194
|
- Internal hardening: stricter number parsing for sensor inputs, parallel state writes, code split for testability, 38 new tests covering the HTTPS client. No user-facing changes.
|
|
191
195
|
|
|
192
|
-
### 0.7.1 (2026-05-06)
|
|
193
|
-
- WiFi signal strength is now reported in dBm (was incorrectly labelled `dB`).
|
|
194
|
-
- Faster state updates: existence checks for datapoints are cached after first creation, saving ~30 Redis lookups per second on a P1 Meter pushing 1 measurement/second.
|
|
195
|
-
|
|
196
196
|
### Support Development
|
|
197
197
|
|
|
198
198
|
This adapter is free and open source. If you find it useful, consider buying me a coffee:
|
package/build/lib/i18n-states.js
CHANGED
|
@@ -21,6 +21,7 @@ __export(i18n_states_exports, {
|
|
|
21
21
|
STATE_DESCS: () => STATE_DESCS,
|
|
22
22
|
STATE_LABELS: () => STATE_LABELS,
|
|
23
23
|
STATE_NAMES: () => STATE_NAMES,
|
|
24
|
+
resolveLabel: () => resolveLabel,
|
|
24
25
|
tDesc: () => tDesc,
|
|
25
26
|
tLabel: () => tLabel,
|
|
26
27
|
tName: () => tName
|
|
@@ -1424,11 +1425,21 @@ function tDesc(key) {
|
|
|
1424
1425
|
function tLabel(key) {
|
|
1425
1426
|
return STATE_LABELS[key];
|
|
1426
1427
|
}
|
|
1428
|
+
function resolveLabel(key, lang) {
|
|
1429
|
+
var _a, _b;
|
|
1430
|
+
const obj = STATE_LABELS[key];
|
|
1431
|
+
if (typeof obj === "string") {
|
|
1432
|
+
return obj;
|
|
1433
|
+
}
|
|
1434
|
+
const dict = obj;
|
|
1435
|
+
return (_b = (_a = dict[lang]) != null ? _a : dict.en) != null ? _b : key;
|
|
1436
|
+
}
|
|
1427
1437
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1428
1438
|
0 && (module.exports = {
|
|
1429
1439
|
STATE_DESCS,
|
|
1430
1440
|
STATE_LABELS,
|
|
1431
1441
|
STATE_NAMES,
|
|
1442
|
+
resolveLabel,
|
|
1432
1443
|
tDesc,
|
|
1433
1444
|
tLabel,
|
|
1434
1445
|
tName
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/lib/i18n-states.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Localized state names, descriptions and dropdown labels for HomeWizard\n * devices in 11 ioBroker system languages.\n *\n * ioBroker accepts plain strings or `{ en, de, ... }` translation objects for\n * `common.name`, `common.desc` and the values of `common.states`. Admin, vis\n * and the Object-Browser pick the user's language automatically \u2014 we just\n * hand them the object.\n *\n * No adapter-side language lookup needed (different from `i18n-logs.ts`,\n * where we have to pick at log-emit time because `this.log.info(...)` takes\n * a single string).\n */\n\ntype Lang = \"en\" | \"de\" | \"ru\" | \"pt\" | \"nl\" | \"fr\" | \"it\" | \"es\" | \"pl\" | \"uk\" | \"zh-cn\";\n\n/** Translation object as ioBroker expects it. */\nexport type StateName = Record<Lang, string>;\n\n/** State / channel display names (`common.name`). */\nexport const STATE_NAMES: Record<string, StateName> = {\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 instanceObjects (Adapter root) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n info: {\n en: \"Adapter Information\",\n de: \"Adapter-Informationen\",\n ru: \"\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u043E\u0431 \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u0435\",\n pt: \"Informa\u00E7\u00F5es do adaptador\",\n nl: \"Adapterinformatie\",\n fr: \"Informations sur l'adaptateur\",\n it: \"Informazioni sull'adattatore\",\n es: \"Informaci\u00F3n del adaptador\",\n pl: \"Informacje o adapterze\",\n uk: \"\u0406\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u044F \u043F\u0440\u043E \u0430\u0434\u0430\u043F\u0442\u0435\u0440\",\n \"zh-cn\": \"\u9002\u914D\u5668\u4FE1\u606F\",\n },\n infoConnection: {\n en: \"Connection status\",\n de: \"Verbindungsstatus\",\n ru: \"\u0421\u0442\u0430\u0442\u0443\u0441 \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F\",\n pt: \"Estado da liga\u00E7\u00E3o\",\n nl: \"Verbindingsstatus\",\n fr: \"\u00C9tat de la connexion\",\n it: \"Stato della connessione\",\n es: \"Estado de la conexi\u00F3n\",\n pl: \"Status po\u0142\u0105czenia\",\n uk: \"\u0421\u0442\u0430\u043D \u0437'\u0454\u0434\u043D\u0430\u043D\u043D\u044F\",\n \"zh-cn\": \"\u8FDE\u63A5\u72B6\u6001\",\n },\n startPairing: {\n en: \"Start pairing mode\",\n de: \"Pairing-Modus starten\",\n ru: \"\u041D\u0430\u0447\u0430\u0442\u044C \u0440\u0435\u0436\u0438\u043C \u0441\u043E\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u044F\",\n pt: \"Iniciar modo de emparelhamento\",\n nl: \"Koppelmodus starten\",\n fr: \"D\u00E9marrer le mode d'appairage\",\n it: \"Avvia modalit\u00E0 di accoppiamento\",\n es: \"Iniciar modo de emparejamiento\",\n pl: \"Uruchom tryb parowania\",\n uk: \"\u0417\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u0438 \u0440\u0435\u0436\u0438\u043C \u0441\u043F\u043E\u043B\u0443\u0447\u0435\u043D\u043D\u044F\",\n \"zh-cn\": \"\u542F\u52A8\u914D\u5BF9\u6A21\u5F0F\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Channel names \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n deviceInformation: {\n en: \"Device Information\",\n de: \"Ger\u00E4teinformationen\",\n ru: \"\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u043E\u0431 \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u0435\",\n pt: \"Informa\u00E7\u00F5es do dispositivo\",\n nl: \"Apparaatinformatie\",\n fr: \"Informations sur l'appareil\",\n it: \"Informazioni sul dispositivo\",\n es: \"Informaci\u00F3n del dispositivo\",\n pl: \"Informacje o urz\u0105dzeniu\",\n uk: \"\u0406\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u044F \u043F\u0440\u043E \u043F\u0440\u0438\u0441\u0442\u0440\u0456\u0439\",\n \"zh-cn\": \"\u8BBE\u5907\u4FE1\u606F\",\n },\n measurement: {\n en: \"Measurement\",\n de: \"Messdaten\",\n ru: \"\u0418\u0437\u043C\u0435\u0440\u0435\u043D\u0438\u0435\",\n pt: \"Medi\u00E7\u00E3o\",\n nl: \"Meting\",\n fr: \"Mesure\",\n it: \"Misurazione\",\n es: \"Medici\u00F3n\",\n pl: \"Pomiar\",\n uk: \"\u0412\u0438\u043C\u0456\u0440\u044E\u0432\u0430\u043D\u043D\u044F\",\n \"zh-cn\": \"\u6D4B\u91CF\",\n },\n externalMeters: {\n en: \"External Meters\",\n de: \"Externe Z\u00E4hler\",\n ru: \"\u0412\u043D\u0435\u0448\u043D\u0438\u0435 \u0441\u0447\u0451\u0442\u0447\u0438\u043A\u0438\",\n pt: \"Contadores externos\",\n nl: \"Externe meters\",\n fr: \"Compteurs externes\",\n it: \"Contatori esterni\",\n es: \"Medidores externos\",\n pl: \"Liczniki zewn\u0119trzne\",\n uk: \"\u0417\u043E\u0432\u043D\u0456\u0448\u043D\u0456 \u043B\u0456\u0447\u0438\u043B\u044C\u043D\u0438\u043A\u0438\",\n \"zh-cn\": \"\u5916\u90E8\u4EEA\u8868\",\n },\n systemSettings: {\n en: \"System Settings\",\n de: \"Systemeinstellungen\",\n ru: \"\u0421\u0438\u0441\u0442\u0435\u043C\u043D\u044B\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438\",\n pt: \"Configura\u00E7\u00F5es do sistema\",\n nl: \"Systeeminstellingen\",\n fr: \"Param\u00E8tres syst\u00E8me\",\n it: \"Impostazioni di sistema\",\n es: \"Configuraci\u00F3n del sistema\",\n pl: \"Ustawienia systemu\",\n uk: \"\u0421\u0438\u0441\u0442\u0435\u043C\u043D\u0456 \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F\",\n \"zh-cn\": \"\u7CFB\u7EDF\u8BBE\u7F6E\",\n },\n batteryControl: {\n en: \"Battery Control\",\n de: \"Batteriesteuerung\",\n ru: \"\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0431\u0430\u0442\u0430\u0440\u0435\u0435\u0439\",\n pt: \"Controlo da bateria\",\n nl: \"Batterijbesturing\",\n fr: \"Contr\u00F4le de la batterie\",\n it: \"Controllo batteria\",\n es: \"Control de bater\u00EDa\",\n pl: \"Sterowanie bateri\u0105\",\n uk: \"\u041A\u0435\u0440\u0443\u0432\u0430\u043D\u043D\u044F \u0431\u0430\u0442\u0430\u0440\u0435\u0454\u044E\",\n \"zh-cn\": \"\u7535\u6C60\u63A7\u5236\",\n },\n externalValue: {\n en: \"Value\",\n de: \"Wert\",\n ru: \"\u0417\u043D\u0430\u0447\u0435\u043D\u0438\u0435\",\n pt: \"Valor\",\n nl: \"Waarde\",\n fr: \"Valeur\",\n it: \"Valore\",\n es: \"Valor\",\n pl: \"Warto\u015B\u0107\",\n uk: \"\u0417\u043D\u0430\u0447\u0435\u043D\u043D\u044F\",\n \"zh-cn\": \"\u503C\",\n },\n externalUnit: {\n en: \"Unit\",\n de: \"Einheit\",\n ru: \"\u0415\u0434\u0438\u043D\u0438\u0446\u0430 \u0438\u0437\u043C\u0435\u0440\u0435\u043D\u0438\u044F\",\n pt: \"Unidade\",\n nl: \"Eenheid\",\n fr: \"Unit\u00E9\",\n it: \"Unit\u00E0\",\n es: \"Unidad\",\n pl: \"Jednostka\",\n uk: \"\u041E\u0434\u0438\u043D\u0438\u0446\u044F\",\n \"zh-cn\": \"\u5355\u4F4D\",\n },\n externalTimestamp: {\n en: \"Timestamp\",\n de: \"Zeitstempel\",\n ru: \"\u041C\u0435\u0442\u043A\u0430 \u0432\u0440\u0435\u043C\u0435\u043D\u0438\",\n pt: \"Carimbo de hora\",\n nl: \"Tijdstempel\",\n fr: \"Horodatage\",\n it: \"Timestamp\",\n es: \"Marca de tiempo\",\n pl: \"Znacznik czasu\",\n uk: \"\u041C\u0456\u0442\u043A\u0430 \u0447\u0430\u0441\u0443\",\n \"zh-cn\": \"\u65F6\u95F4\u6233\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Device info \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n productName: {\n en: \"Product name\",\n de: \"Produktname\",\n ru: \"\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u043F\u0440\u043E\u0434\u0443\u043A\u0442\u0430\",\n pt: \"Nome do produto\",\n nl: \"Productnaam\",\n fr: \"Nom du produit\",\n it: \"Nome del prodotto\",\n es: \"Nombre del producto\",\n pl: \"Nazwa produktu\",\n uk: \"\u041D\u0430\u0437\u0432\u0430 \u043F\u0440\u043E\u0434\u0443\u043A\u0442\u0443\",\n \"zh-cn\": \"\u4EA7\u54C1\u540D\u79F0\",\n },\n productType: {\n en: \"Product type\",\n de: \"Produkttyp\",\n ru: \"\u0422\u0438\u043F \u043F\u0440\u043E\u0434\u0443\u043A\u0442\u0430\",\n pt: \"Tipo de produto\",\n nl: \"Producttype\",\n fr: \"Type de produit\",\n it: \"Tipo di prodotto\",\n es: \"Tipo de producto\",\n pl: \"Typ produktu\",\n uk: \"\u0422\u0438\u043F \u043F\u0440\u043E\u0434\u0443\u043A\u0442\u0443\",\n \"zh-cn\": \"\u4EA7\u54C1\u7C7B\u578B\",\n },\n firmware: {\n en: \"Firmware version\",\n de: \"Firmware-Version\",\n ru: \"\u0412\u0435\u0440\u0441\u0438\u044F \u043F\u0440\u043E\u0448\u0438\u0432\u043A\u0438\",\n pt: \"Vers\u00E3o do firmware\",\n nl: \"Firmwareversie\",\n fr: \"Version du firmware\",\n it: \"Versione firmware\",\n es: \"Versi\u00F3n del firmware\",\n pl: \"Wersja firmware\",\n uk: \"\u0412\u0435\u0440\u0441\u0456\u044F \u043F\u0440\u043E\u0448\u0438\u0432\u043A\u0438\",\n \"zh-cn\": \"\u56FA\u4EF6\u7248\u672C\",\n },\n connected: {\n en: \"Device connected\",\n de: \"Ger\u00E4t verbunden\",\n ru: \"\u0423\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043E\",\n pt: \"Dispositivo conectado\",\n nl: \"Apparaat verbonden\",\n fr: \"Appareil connect\u00E9\",\n it: \"Dispositivo connesso\",\n es: \"Dispositivo conectado\",\n pl: \"Urz\u0105dzenie po\u0142\u0105czone\",\n uk: \"\u041F\u0440\u0438\u0441\u0442\u0440\u0456\u0439 \u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043E\",\n \"zh-cn\": \"\u8BBE\u5907\u5DF2\u8FDE\u63A5\",\n },\n wifiRssi: {\n en: \"WiFi signal strength\",\n de: \"WLAN-Signalst\u00E4rke\",\n ru: \"\u0421\u0438\u043B\u0430 \u0441\u0438\u0433\u043D\u0430\u043B\u0430 WiFi\",\n pt: \"For\u00E7a do sinal WiFi\",\n nl: \"WiFi-signaalsterkte\",\n fr: \"Force du signal WiFi\",\n it: \"Intensit\u00E0 del segnale WiFi\",\n es: \"Intensidad de la se\u00F1al WiFi\",\n pl: \"Si\u0142a sygna\u0142u WiFi\",\n uk: \"\u0421\u0438\u043B\u0430 \u0441\u0438\u0433\u043D\u0430\u043B\u0443 WiFi\",\n \"zh-cn\": \"WiFi \u4FE1\u53F7\u5F3A\u5EA6\",\n },\n uptime: {\n en: \"Uptime\",\n de: \"Betriebsdauer\",\n ru: \"\u0412\u0440\u0435\u043C\u044F \u0440\u0430\u0431\u043E\u0442\u044B\",\n pt: \"Tempo de atividade\",\n nl: \"Uptime\",\n fr: \"Temps de fonctionnement\",\n it: \"Tempo di attivit\u00E0\",\n es: \"Tiempo de actividad\",\n pl: \"Czas dzia\u0142ania\",\n uk: \"\u0427\u0430\u0441 \u0440\u043E\u0431\u043E\u0442\u0438\",\n \"zh-cn\": \"\u8FD0\u884C\u65F6\u95F4\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Buttons \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n removeDevice: {\n en: \"Remove device\",\n de: \"Ger\u00E4t entfernen\",\n ru: \"\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E\",\n pt: \"Remover dispositivo\",\n nl: \"Apparaat verwijderen\",\n fr: \"Supprimer l'appareil\",\n it: \"Rimuovi dispositivo\",\n es: \"Eliminar dispositivo\",\n pl: \"Usu\u0144 urz\u0105dzenie\",\n uk: \"\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u043F\u0440\u0438\u0441\u0442\u0440\u0456\u0439\",\n \"zh-cn\": \"\u79FB\u9664\u8BBE\u5907\",\n },\n rebootDevice: {\n en: \"Reboot device\",\n de: \"Ger\u00E4t neu starten\",\n ru: \"\u041F\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E\",\n pt: \"Reiniciar dispositivo\",\n nl: \"Apparaat opnieuw opstarten\",\n fr: \"Red\u00E9marrer l'appareil\",\n it: \"Riavvia dispositivo\",\n es: \"Reiniciar dispositivo\",\n pl: \"Uruchom ponownie urz\u0105dzenie\",\n uk: \"\u041F\u0435\u0440\u0435\u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438 \u043F\u0440\u0438\u0441\u0442\u0440\u0456\u0439\",\n \"zh-cn\": \"\u91CD\u542F\u8BBE\u5907\",\n },\n identify: {\n en: \"Identify (blink LED)\",\n de: \"Identifizieren (LED blinkt)\",\n ru: \"\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043E\u0432\u0430\u0442\u044C (\u043C\u0438\u0433\u0430\u043D\u0438\u0435 \u0441\u0432\u0435\u0442\u043E\u0434\u0438\u043E\u0434\u0430)\",\n pt: \"Identificar (piscar LED)\",\n nl: \"Identificeren (LED knippert)\",\n fr: \"Identifier (LED clignote)\",\n it: \"Identifica (LED lampeggia)\",\n es: \"Identificar (LED parpadea)\",\n pl: \"Identyfikuj (migni\u0119cie LED)\",\n uk: \"\u0406\u0434\u0435\u043D\u0442\u0438\u0444\u0456\u043A\u0443\u0432\u0430\u0442\u0438 (LED \u0431\u043B\u0438\u043C\u0430\u0454)\",\n \"zh-cn\": \"\u8BC6\u522B\uFF08LED \u95EA\u70C1\uFF09\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 System control \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n cloudEnabled: {\n en: \"Cloud enabled\",\n de: \"Cloud aktiviert\",\n ru: \"\u041E\u0431\u043B\u0430\u043A\u043E \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u043E\",\n pt: \"Cloud ativada\",\n nl: \"Cloud ingeschakeld\",\n fr: \"Cloud activ\u00E9\",\n it: \"Cloud abilitato\",\n es: \"Cloud activada\",\n pl: \"Cloud w\u0142\u0105czona\",\n uk: \"\u0425\u043C\u0430\u0440\u0430 \u0443\u0432\u0456\u043C\u043A\u043D\u0435\u043D\u0430\",\n \"zh-cn\": \"\u5DF2\u542F\u7528\u4E91\u7AEF\",\n },\n ledBrightness: {\n en: \"LED brightness\",\n de: \"LED-Helligkeit\",\n ru: \"\u042F\u0440\u043A\u043E\u0441\u0442\u044C \u0441\u0432\u0435\u0442\u043E\u0434\u0438\u043E\u0434\u0430\",\n pt: \"Brilho do LED\",\n nl: \"LED-helderheid\",\n fr: \"Luminosit\u00E9 de la LED\",\n it: \"Luminosit\u00E0 LED\",\n es: \"Brillo del LED\",\n pl: \"Jasno\u015B\u0107 LED\",\n uk: \"\u042F\u0441\u043A\u0440\u0430\u0432\u0456\u0441\u0442\u044C LED\",\n \"zh-cn\": \"LED \u4EAE\u5EA6\",\n },\n apiV1Enabled: {\n en: \"API v1 enabled (legacy)\",\n de: \"API v1 aktiviert (Legacy)\",\n ru: \"API v1 \u0432\u043A\u043B\u044E\u0447\u0451\u043D (\u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0439)\",\n pt: \"API v1 ativada (legacy)\",\n nl: \"API v1 ingeschakeld (legacy)\",\n fr: \"API v1 activ\u00E9e (h\u00E9rit\u00E9e)\",\n it: \"API v1 abilitata (legacy)\",\n es: \"API v1 activada (legacy)\",\n pl: \"API v1 w\u0142\u0105czone (starsze)\",\n uk: \"API v1 \u0443\u0432\u0456\u043C\u043A\u043D\u0435\u043D\u043E (\u0437\u0430\u0441\u0442\u0430\u0440\u0456\u043B\u0438\u0439)\",\n \"zh-cn\": \"\u5DF2\u542F\u7528 API v1\uFF08\u65E7\u7248\uFF09\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Battery \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n batteryMode: {\n en: \"Battery mode\",\n de: \"Batterie-Modus\",\n ru: \"\u0420\u0435\u0436\u0438\u043C \u0431\u0430\u0442\u0430\u0440\u0435\u0438\",\n pt: \"Modo da bateria\",\n nl: \"Batterijmodus\",\n fr: \"Mode de la batterie\",\n it: \"Modalit\u00E0 batteria\",\n es: \"Modo de la bater\u00EDa\",\n pl: \"Tryb baterii\",\n uk: \"\u0420\u0435\u0436\u0438\u043C \u0431\u0430\u0442\u0430\u0440\u0435\u0457\",\n \"zh-cn\": \"\u7535\u6C60\u6A21\u5F0F\",\n },\n batteryPermissions: {\n en: \"Battery permissions\",\n de: \"Batterie-Berechtigungen\",\n ru: \"\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u044F \u0431\u0430\u0442\u0430\u0440\u0435\u0438\",\n pt: \"Permiss\u00F5es da bateria\",\n nl: \"Batterijrechten\",\n fr: \"Permissions de la batterie\",\n it: \"Autorizzazioni batteria\",\n es: \"Permisos de la bater\u00EDa\",\n pl: \"Uprawnienia baterii\",\n uk: \"\u0414\u043E\u0437\u0432\u043E\u043B\u0438 \u0431\u0430\u0442\u0430\u0440\u0435\u0457\",\n \"zh-cn\": \"\u7535\u6C60\u6743\u9650\",\n },\n batteryCount: {\n en: \"Connected batteries\",\n de: \"Verbundene Batterien\",\n ru: \"\u041F\u043E\u0434\u043A\u043B\u044E\u0447\u0451\u043D\u043D\u044B\u0435 \u0431\u0430\u0442\u0430\u0440\u0435\u0438\",\n pt: \"Baterias conectadas\",\n nl: \"Verbonden batterijen\",\n fr: \"Batteries connect\u00E9es\",\n it: \"Batterie collegate\",\n es: \"Bater\u00EDas conectadas\",\n pl: \"Pod\u0142\u0105czone baterie\",\n uk: \"\u041F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0456 \u0431\u0430\u0442\u0430\u0440\u0435\u0457\",\n \"zh-cn\": \"\u5DF2\u8FDE\u63A5\u7535\u6C60\",\n },\n batteryPower: {\n en: \"Battery power\",\n de: \"Batterieleistung\",\n ru: \"\u041C\u043E\u0449\u043D\u043E\u0441\u0442\u044C \u0431\u0430\u0442\u0430\u0440\u0435\u0438\",\n pt: \"Pot\u00EAncia da bateria\",\n nl: \"Batterijvermogen\",\n fr: \"Puissance de la batterie\",\n it: \"Potenza della batteria\",\n es: \"Potencia de la bater\u00EDa\",\n pl: \"Moc baterii\",\n uk: \"\u041F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C \u0431\u0430\u0442\u0430\u0440\u0435\u0457\",\n \"zh-cn\": \"\u7535\u6C60\u529F\u7387\",\n },\n batteryTargetPower: {\n en: \"Target power\",\n de: \"Soll-Leistung\",\n ru: \"\u0426\u0435\u043B\u0435\u0432\u0430\u044F \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u044C\",\n pt: \"Pot\u00EAncia alvo\",\n nl: \"Doelvermogen\",\n fr: \"Puissance cible\",\n it: \"Potenza obiettivo\",\n es: \"Potencia objetivo\",\n pl: \"Moc docelowa\",\n uk: \"\u0426\u0456\u043B\u044C\u043E\u0432\u0430 \u043F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C\",\n \"zh-cn\": \"\u76EE\u6807\u529F\u7387\",\n },\n batteryMaxConsumption: {\n en: \"Max consumption\",\n de: \"Max. Verbrauch\",\n ru: \"\u041C\u0430\u043A\u0441. \u043F\u043E\u0442\u0440\u0435\u0431\u043B\u0435\u043D\u0438\u0435\",\n pt: \"Consumo m\u00E1x.\",\n nl: \"Max. verbruik\",\n fr: \"Consommation max.\",\n it: \"Consumo massimo\",\n es: \"Consumo m\u00E1x.\",\n pl: \"Maks. zu\u017Cycie\",\n uk: \"\u041C\u0430\u043A\u0441. \u0441\u043F\u043E\u0436\u0438\u0432\u0430\u043D\u043D\u044F\",\n \"zh-cn\": \"\u6700\u5927\u6D88\u8017\",\n },\n batteryMaxProduction: {\n en: \"Max production\",\n de: \"Max. Erzeugung\",\n ru: \"\u041C\u0430\u043A\u0441. \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0441\u0442\u0432\u043E\",\n pt: \"Produ\u00E7\u00E3o m\u00E1x.\",\n nl: \"Max. productie\",\n fr: \"Production max.\",\n it: \"Produzione massima\",\n es: \"Producci\u00F3n m\u00E1x.\",\n pl: \"Maks. produkcja\",\n uk: \"\u041C\u0430\u043A\u0441. \u0432\u0438\u0440\u043E\u0431\u043D\u0438\u0446\u0442\u0432\u043E\",\n \"zh-cn\": \"\u6700\u5927\u751F\u4EA7\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Measurement: Power \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n powerTotal: {\n en: \"Total power\",\n de: \"Gesamtleistung\",\n ru: \"\u041E\u0431\u0449\u0430\u044F \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u044C\",\n pt: \"Pot\u00EAncia total\",\n nl: \"Totaal vermogen\",\n fr: \"Puissance totale\",\n it: \"Potenza totale\",\n es: \"Potencia total\",\n pl: \"Moc ca\u0142kowita\",\n uk: \"\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0430 \u043F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C\",\n \"zh-cn\": \"\u603B\u529F\u7387\",\n },\n powerL1: {\n en: \"Power L1\",\n de: \"Leistung L1\",\n ru: \"\u041C\u043E\u0449\u043D\u043E\u0441\u0442\u044C L1\",\n pt: \"Pot\u00EAncia L1\",\n nl: \"Vermogen L1\",\n fr: \"Puissance L1\",\n it: \"Potenza L1\",\n es: \"Potencia L1\",\n pl: \"Moc L1\",\n uk: \"\u041F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C L1\",\n \"zh-cn\": \"L1 \u529F\u7387\",\n },\n powerL2: {\n en: \"Power L2\",\n de: \"Leistung L2\",\n ru: \"\u041C\u043E\u0449\u043D\u043E\u0441\u0442\u044C L2\",\n pt: \"Pot\u00EAncia L2\",\n nl: \"Vermogen L2\",\n fr: \"Puissance L2\",\n it: \"Potenza L2\",\n es: \"Potencia L2\",\n pl: \"Moc L2\",\n uk: \"\u041F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C L2\",\n \"zh-cn\": \"L2 \u529F\u7387\",\n },\n powerL3: {\n en: \"Power L3\",\n de: \"Leistung L3\",\n ru: \"\u041C\u043E\u0449\u043D\u043E\u0441\u0442\u044C L3\",\n pt: \"Pot\u00EAncia L3\",\n nl: \"Vermogen L3\",\n fr: \"Puissance L3\",\n it: \"Potenza L3\",\n es: \"Potencia L3\",\n pl: \"Moc L3\",\n uk: \"\u041F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C L3\",\n \"zh-cn\": \"L3 \u529F\u7387\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Measurement: Voltage \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n voltage: {\n en: \"Voltage\",\n de: \"Spannung\",\n ru: \"\u041D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u0435\",\n pt: \"Tens\u00E3o\",\n nl: \"Spanning\",\n fr: \"Tension\",\n it: \"Tensione\",\n es: \"Voltaje\",\n pl: \"Napi\u0119cie\",\n uk: \"\u041D\u0430\u043F\u0440\u0443\u0433\u0430\",\n \"zh-cn\": \"\u7535\u538B\",\n },\n voltageL1: {\n en: \"Voltage L1\",\n de: \"Spannung L1\",\n ru: \"\u041D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u0435 L1\",\n pt: \"Tens\u00E3o L1\",\n nl: \"Spanning L1\",\n fr: \"Tension L1\",\n it: \"Tensione L1\",\n es: \"Voltaje L1\",\n pl: \"Napi\u0119cie L1\",\n uk: \"\u041D\u0430\u043F\u0440\u0443\u0433\u0430 L1\",\n \"zh-cn\": \"L1 \u7535\u538B\",\n },\n voltageL2: {\n en: \"Voltage L2\",\n de: \"Spannung L2\",\n ru: \"\u041D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u0435 L2\",\n pt: \"Tens\u00E3o L2\",\n nl: \"Spanning L2\",\n fr: \"Tension L2\",\n it: \"Tensione L2\",\n es: \"Voltaje L2\",\n pl: \"Napi\u0119cie L2\",\n uk: \"\u041D\u0430\u043F\u0440\u0443\u0433\u0430 L2\",\n \"zh-cn\": \"L2 \u7535\u538B\",\n },\n voltageL3: {\n en: \"Voltage L3\",\n de: \"Spannung L3\",\n ru: \"\u041D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u0435 L3\",\n pt: \"Tens\u00E3o L3\",\n nl: \"Spanning L3\",\n fr: \"Tension L3\",\n it: \"Tensione L3\",\n es: \"Voltaje L3\",\n pl: \"Napi\u0119cie L3\",\n uk: \"\u041D\u0430\u043F\u0440\u0443\u0433\u0430 L3\",\n \"zh-cn\": \"L3 \u7535\u538B\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Measurement: Current \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n current: {\n en: \"Current\",\n de: \"Strom\",\n ru: \"\u0422\u043E\u043A\",\n pt: \"Corrente\",\n nl: \"Stroom\",\n fr: \"Courant\",\n it: \"Corrente\",\n es: \"Corriente\",\n pl: \"Pr\u0105d\",\n uk: \"\u0421\u0442\u0440\u0443\u043C\",\n \"zh-cn\": \"\u7535\u6D41\",\n },\n currentL1: {\n en: \"Current L1\",\n de: \"Strom L1\",\n ru: \"\u0422\u043E\u043A L1\",\n pt: \"Corrente L1\",\n nl: \"Stroom L1\",\n fr: \"Courant L1\",\n it: \"Corrente L1\",\n es: \"Corriente L1\",\n pl: \"Pr\u0105d L1\",\n uk: \"\u0421\u0442\u0440\u0443\u043C L1\",\n \"zh-cn\": \"L1 \u7535\u6D41\",\n },\n currentL2: {\n en: \"Current L2\",\n de: \"Strom L2\",\n ru: \"\u0422\u043E\u043A L2\",\n pt: \"Corrente L2\",\n nl: \"Stroom L2\",\n fr: \"Courant L2\",\n it: \"Corrente L2\",\n es: \"Corriente L2\",\n pl: \"Pr\u0105d L2\",\n uk: \"\u0421\u0442\u0440\u0443\u043C L2\",\n \"zh-cn\": \"L2 \u7535\u6D41\",\n },\n currentL3: {\n en: \"Current L3\",\n de: \"Strom L3\",\n ru: \"\u0422\u043E\u043A L3\",\n pt: \"Corrente L3\",\n nl: \"Stroom L3\",\n fr: \"Courant L3\",\n it: \"Corrente L3\",\n es: \"Corriente L3\",\n pl: \"Pr\u0105d L3\",\n uk: \"\u0421\u0442\u0440\u0443\u043C L3\",\n \"zh-cn\": \"L3 \u7535\u6D41\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Measurement: Frequency / Tariff \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n frequency: {\n en: \"Grid frequency\",\n de: \"Netzfrequenz\",\n ru: \"\u0427\u0430\u0441\u0442\u043E\u0442\u0430 \u0441\u0435\u0442\u0438\",\n pt: \"Frequ\u00EAncia da rede\",\n nl: \"Netfrequentie\",\n fr: \"Fr\u00E9quence du r\u00E9seau\",\n it: \"Frequenza di rete\",\n es: \"Frecuencia de la red\",\n pl: \"Cz\u0119stotliwo\u015B\u0107 sieci\",\n uk: \"\u0427\u0430\u0441\u0442\u043E\u0442\u0430 \u043C\u0435\u0440\u0435\u0436\u0456\",\n \"zh-cn\": \"\u7535\u7F51\u9891\u7387\",\n },\n tariff: {\n en: \"Active tariff\",\n de: \"Aktiver Tarif\",\n ru: \"\u0410\u043A\u0442\u0438\u0432\u043D\u044B\u0439 \u0442\u0430\u0440\u0438\u0444\",\n pt: \"Tarifa ativa\",\n nl: \"Actief tarief\",\n fr: \"Tarif actif\",\n it: \"Tariffa attiva\",\n es: \"Tarifa activa\",\n pl: \"Aktywna taryfa\",\n uk: \"\u0410\u043A\u0442\u0438\u0432\u043D\u0438\u0439 \u0442\u0430\u0440\u0438\u0444\",\n \"zh-cn\": \"\u5F53\u524D\u7535\u4EF7\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Measurement: Energy import/export \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n energyImportTotal: {\n en: \"Energy import total\",\n de: \"Energie-Import gesamt\",\n ru: \"\u0418\u043C\u043F\u043E\u0440\u0442 \u044D\u043D\u0435\u0440\u0433\u0438\u0438 \u0432\u0441\u0435\u0433\u043E\",\n pt: \"Energia importada total\",\n nl: \"Totale energie-import\",\n fr: \"\u00C9nergie import\u00E9e totale\",\n it: \"Energia importata totale\",\n es: \"Energ\u00EDa importada total\",\n pl: \"\u0141\u0105czny import energii\",\n uk: \"\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0438\u0439 \u0456\u043C\u043F\u043E\u0440\u0442 \u0435\u043D\u0435\u0440\u0433\u0456\u0457\",\n \"zh-cn\": \"\u80FD\u6E90\u8F93\u5165\u603B\u8BA1\",\n },\n energyImportT1: {\n en: \"Energy import T1\",\n de: \"Energie-Import T1\",\n ru: \"\u0418\u043C\u043F\u043E\u0440\u0442 \u044D\u043D\u0435\u0440\u0433\u0438\u0438 T1\",\n pt: \"Energia importada T1\",\n nl: \"Energie-import T1\",\n fr: \"\u00C9nergie import\u00E9e T1\",\n it: \"Energia importata T1\",\n es: \"Energ\u00EDa importada T1\",\n pl: \"Import energii T1\",\n uk: \"\u0406\u043C\u043F\u043E\u0440\u0442 \u0435\u043D\u0435\u0440\u0433\u0456\u0457 T1\",\n \"zh-cn\": \"\u80FD\u6E90\u8F93\u5165 T1\",\n },\n energyImportT2: {\n en: \"Energy import T2\",\n de: \"Energie-Import T2\",\n ru: \"\u0418\u043C\u043F\u043E\u0440\u0442 \u044D\u043D\u0435\u0440\u0433\u0438\u0438 T2\",\n pt: \"Energia importada T2\",\n nl: \"Energie-import T2\",\n fr: \"\u00C9nergie import\u00E9e T2\",\n it: \"Energia importata T2\",\n es: \"Energ\u00EDa importada T2\",\n pl: \"Import energii T2\",\n uk: \"\u0406\u043C\u043F\u043E\u0440\u0442 \u0435\u043D\u0435\u0440\u0433\u0456\u0457 T2\",\n \"zh-cn\": \"\u80FD\u6E90\u8F93\u5165 T2\",\n },\n energyImportT3: {\n en: \"Energy import T3\",\n de: \"Energie-Import T3\",\n ru: \"\u0418\u043C\u043F\u043E\u0440\u0442 \u044D\u043D\u0435\u0440\u0433\u0438\u0438 T3\",\n pt: \"Energia importada T3\",\n nl: \"Energie-import T3\",\n fr: \"\u00C9nergie import\u00E9e T3\",\n it: \"Energia importata T3\",\n es: \"Energ\u00EDa importada T3\",\n pl: \"Import energii T3\",\n uk: \"\u0406\u043C\u043F\u043E\u0440\u0442 \u0435\u043D\u0435\u0440\u0433\u0456\u0457 T3\",\n \"zh-cn\": \"\u80FD\u6E90\u8F93\u5165 T3\",\n },\n energyImportT4: {\n en: \"Energy import T4\",\n de: \"Energie-Import T4\",\n ru: \"\u0418\u043C\u043F\u043E\u0440\u0442 \u044D\u043D\u0435\u0440\u0433\u0438\u0438 T4\",\n pt: \"Energia importada T4\",\n nl: \"Energie-import T4\",\n fr: \"\u00C9nergie import\u00E9e T4\",\n it: \"Energia importata T4\",\n es: \"Energ\u00EDa importada T4\",\n pl: \"Import energii T4\",\n uk: \"\u0406\u043C\u043F\u043E\u0440\u0442 \u0435\u043D\u0435\u0440\u0433\u0456\u0457 T4\",\n \"zh-cn\": \"\u80FD\u6E90\u8F93\u5165 T4\",\n },\n energyExportTotal: {\n en: \"Energy export total\",\n de: \"Energie-Export gesamt\",\n ru: \"\u042D\u043A\u0441\u043F\u043E\u0440\u0442 \u044D\u043D\u0435\u0440\u0433\u0438\u0438 \u0432\u0441\u0435\u0433\u043E\",\n pt: \"Energia exportada total\",\n nl: \"Totale energie-export\",\n fr: \"\u00C9nergie export\u00E9e totale\",\n it: \"Energia esportata totale\",\n es: \"Energ\u00EDa exportada total\",\n pl: \"\u0141\u0105czny eksport energii\",\n uk: \"\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0438\u0439 \u0435\u043A\u0441\u043F\u043E\u0440\u0442 \u0435\u043D\u0435\u0440\u0433\u0456\u0457\",\n \"zh-cn\": \"\u80FD\u6E90\u8F93\u51FA\u603B\u8BA1\",\n },\n energyExportT1: {\n en: \"Energy export T1\",\n de: \"Energie-Export T1\",\n ru: \"\u042D\u043A\u0441\u043F\u043E\u0440\u0442 \u044D\u043D\u0435\u0440\u0433\u0438\u0438 T1\",\n pt: \"Energia exportada T1\",\n nl: \"Energie-export T1\",\n fr: \"\u00C9nergie export\u00E9e T1\",\n it: \"Energia esportata T1\",\n es: \"Energ\u00EDa exportada T1\",\n pl: \"Eksport energii T1\",\n uk: \"\u0415\u043A\u0441\u043F\u043E\u0440\u0442 \u0435\u043D\u0435\u0440\u0433\u0456\u0457 T1\",\n \"zh-cn\": \"\u80FD\u6E90\u8F93\u51FA T1\",\n },\n energyExportT2: {\n en: \"Energy export T2\",\n de: \"Energie-Export T2\",\n ru: \"\u042D\u043A\u0441\u043F\u043E\u0440\u0442 \u044D\u043D\u0435\u0440\u0433\u0438\u0438 T2\",\n pt: \"Energia exportada T2\",\n nl: \"Energie-export T2\",\n fr: \"\u00C9nergie export\u00E9e T2\",\n it: \"Energia esportata T2\",\n es: \"Energ\u00EDa exportada T2\",\n pl: \"Eksport energii T2\",\n uk: \"\u0415\u043A\u0441\u043F\u043E\u0440\u0442 \u0435\u043D\u0435\u0440\u0433\u0456\u0457 T2\",\n \"zh-cn\": \"\u80FD\u6E90\u8F93\u51FA T2\",\n },\n energyExportT3: {\n en: \"Energy export T3\",\n de: \"Energie-Export T3\",\n ru: \"\u042D\u043A\u0441\u043F\u043E\u0440\u0442 \u044D\u043D\u0435\u0440\u0433\u0438\u0438 T3\",\n pt: \"Energia exportada T3\",\n nl: \"Energie-export T3\",\n fr: \"\u00C9nergie export\u00E9e T3\",\n it: \"Energia esportata T3\",\n es: \"Energ\u00EDa exportada T3\",\n pl: \"Eksport energii T3\",\n uk: \"\u0415\u043A\u0441\u043F\u043E\u0440\u0442 \u0435\u043D\u0435\u0440\u0433\u0456\u0457 T3\",\n \"zh-cn\": \"\u80FD\u6E90\u8F93\u51FA T3\",\n },\n energyExportT4: {\n en: \"Energy export T4\",\n de: \"Energie-Export T4\",\n ru: \"\u042D\u043A\u0441\u043F\u043E\u0440\u0442 \u044D\u043D\u0435\u0440\u0433\u0438\u0438 T4\",\n pt: \"Energia exportada T4\",\n nl: \"Energie-export T4\",\n fr: \"\u00C9nergie export\u00E9e T4\",\n it: \"Energia esportata T4\",\n es: \"Energ\u00EDa exportada T4\",\n pl: \"Eksport energii T4\",\n uk: \"\u0415\u043A\u0441\u043F\u043E\u0440\u0442 \u0435\u043D\u0435\u0440\u0433\u0456\u0457 T4\",\n \"zh-cn\": \"\u80FD\u6E90\u8F93\u51FA T4\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Power quality \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n voltageSagL1: {\n en: \"Voltage sag count L1\",\n de: \"Spannungseinbr\u00FCche L1\",\n ru: \"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043F\u0440\u043E\u0432\u0430\u043B\u043E\u0432 \u043D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u044F L1\",\n pt: \"Contagem de quedas de tens\u00E3o L1\",\n nl: \"Spanningsdips L1\",\n fr: \"Nombre de creux de tension L1\",\n it: \"Conteggio cali di tensione L1\",\n es: \"Cuenta de ca\u00EDdas de tensi\u00F3n L1\",\n pl: \"Liczba zapad\u00F3w napi\u0119cia L1\",\n uk: \"\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u043F\u0440\u043E\u0432\u0430\u043B\u0456\u0432 \u043D\u0430\u043F\u0440\u0443\u0433\u0438 L1\",\n \"zh-cn\": \"L1 \u7535\u538B\u9AA4\u964D\u6B21\u6570\",\n },\n voltageSagL2: {\n en: \"Voltage sag count L2\",\n de: \"Spannungseinbr\u00FCche L2\",\n ru: \"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043F\u0440\u043E\u0432\u0430\u043B\u043E\u0432 \u043D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u044F L2\",\n pt: \"Contagem de quedas de tens\u00E3o L2\",\n nl: \"Spanningsdips L2\",\n fr: \"Nombre de creux de tension L2\",\n it: \"Conteggio cali di tensione L2\",\n es: \"Cuenta de ca\u00EDdas de tensi\u00F3n L2\",\n pl: \"Liczba zapad\u00F3w napi\u0119cia L2\",\n uk: \"\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u043F\u0440\u043E\u0432\u0430\u043B\u0456\u0432 \u043D\u0430\u043F\u0440\u0443\u0433\u0438 L2\",\n \"zh-cn\": \"L2 \u7535\u538B\u9AA4\u964D\u6B21\u6570\",\n },\n voltageSagL3: {\n en: \"Voltage sag count L3\",\n de: \"Spannungseinbr\u00FCche L3\",\n ru: \"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043F\u0440\u043E\u0432\u0430\u043B\u043E\u0432 \u043D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u044F L3\",\n pt: \"Contagem de quedas de tens\u00E3o L3\",\n nl: \"Spanningsdips L3\",\n fr: \"Nombre de creux de tension L3\",\n it: \"Conteggio cali di tensione L3\",\n es: \"Cuenta de ca\u00EDdas de tensi\u00F3n L3\",\n pl: \"Liczba zapad\u00F3w napi\u0119cia L3\",\n uk: \"\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u043F\u0440\u043E\u0432\u0430\u043B\u0456\u0432 \u043D\u0430\u043F\u0440\u0443\u0433\u0438 L3\",\n \"zh-cn\": \"L3 \u7535\u538B\u9AA4\u964D\u6B21\u6570\",\n },\n voltageSwellL1: {\n en: \"Voltage swell count L1\",\n de: \"Spannungserh\u00F6hungen L1\",\n ru: \"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0441\u043A\u0430\u0447\u043A\u043E\u0432 \u043D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u044F L1\",\n pt: \"Contagem de picos de tens\u00E3o L1\",\n nl: \"Spanningspieken L1\",\n fr: \"Nombre de surtensions L1\",\n it: \"Conteggio picchi di tensione L1\",\n es: \"Cuenta de picos de tensi\u00F3n L1\",\n pl: \"Liczba przepi\u0119\u0107 napi\u0119cia L1\",\n uk: \"\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u0441\u043F\u043B\u0435\u0441\u043A\u0456\u0432 \u043D\u0430\u043F\u0440\u0443\u0433\u0438 L1\",\n \"zh-cn\": \"L1 \u7535\u538B\u9AA4\u5347\u6B21\u6570\",\n },\n voltageSwellL2: {\n en: \"Voltage swell count L2\",\n de: \"Spannungserh\u00F6hungen L2\",\n ru: \"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0441\u043A\u0430\u0447\u043A\u043E\u0432 \u043D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u044F L2\",\n pt: \"Contagem de picos de tens\u00E3o L2\",\n nl: \"Spanningspieken L2\",\n fr: \"Nombre de surtensions L2\",\n it: \"Conteggio picchi di tensione L2\",\n es: \"Cuenta de picos de tensi\u00F3n L2\",\n pl: \"Liczba przepi\u0119\u0107 napi\u0119cia L2\",\n uk: \"\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u0441\u043F\u043B\u0435\u0441\u043A\u0456\u0432 \u043D\u0430\u043F\u0440\u0443\u0433\u0438 L2\",\n \"zh-cn\": \"L2 \u7535\u538B\u9AA4\u5347\u6B21\u6570\",\n },\n voltageSwellL3: {\n en: \"Voltage swell count L3\",\n de: \"Spannungserh\u00F6hungen L3\",\n ru: \"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0441\u043A\u0430\u0447\u043A\u043E\u0432 \u043D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u044F L3\",\n pt: \"Contagem de picos de tens\u00E3o L3\",\n nl: \"Spanningspieken L3\",\n fr: \"Nombre de surtensions L3\",\n it: \"Conteggio picchi di tensione L3\",\n es: \"Cuenta de picos de tensi\u00F3n L3\",\n pl: \"Liczba przepi\u0119\u0107 napi\u0119cia L3\",\n uk: \"\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u0441\u043F\u043B\u0435\u0441\u043A\u0456\u0432 \u043D\u0430\u043F\u0440\u0443\u0433\u0438 L3\",\n \"zh-cn\": \"L3 \u7535\u538B\u9AA4\u5347\u6B21\u6570\",\n },\n powerFailCount: {\n en: \"Power fail count\",\n de: \"Stromausf\u00E4lle\",\n ru: \"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0439 \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u044D\u043D\u0435\u0440\u0433\u0438\u0438\",\n pt: \"Contagem de falhas de energia\",\n nl: \"Stroomuitval-teller\",\n fr: \"Nombre de coupures de courant\",\n it: \"Conteggio interruzioni di corrente\",\n es: \"Cuenta de cortes de energ\u00EDa\",\n pl: \"Liczba awarii zasilania\",\n uk: \"\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u0432\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u044C \u0436\u0438\u0432\u043B\u0435\u043D\u043D\u044F\",\n \"zh-cn\": \"\u65AD\u7535\u6B21\u6570\",\n },\n longPowerFailCount: {\n en: \"Long power fail count\",\n de: \"Lange Stromausf\u00E4lle\",\n ru: \"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0434\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0439\",\n pt: \"Contagem de falhas longas de energia\",\n nl: \"Lange stroomuitval-teller\",\n fr: \"Nombre de coupures longues\",\n it: \"Conteggio interruzioni lunghe\",\n es: \"Cuenta de cortes largos\",\n pl: \"Liczba d\u0142ugich awarii\",\n uk: \"\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u0442\u0440\u0438\u0432\u0430\u043B\u0438\u0445 \u0432\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u044C\",\n \"zh-cn\": \"\u957F\u65F6\u95F4\u65AD\u7535\u6B21\u6570\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Capacity tariff (Belgium) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n avgPower15m: {\n en: \"Average power (15 min)\",\n de: \"Durchschnittsleistung (15 Min)\",\n ru: \"\u0421\u0440\u0435\u0434\u043D\u044F\u044F \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u044C (15 \u043C\u0438\u043D)\",\n pt: \"Pot\u00EAncia m\u00E9dia (15 min)\",\n nl: \"Gemiddeld vermogen (15 min)\",\n fr: \"Puissance moyenne (15 min)\",\n it: \"Potenza media (15 min)\",\n es: \"Potencia media (15 min)\",\n pl: \"\u015Arednia moc (15 min)\",\n uk: \"\u0421\u0435\u0440\u0435\u0434\u043D\u044F \u043F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C (15 \u0445\u0432)\",\n \"zh-cn\": \"\u5E73\u5747\u529F\u7387\uFF0815 \u5206\u949F\uFF09\",\n },\n monthlyPowerPeak: {\n en: \"Monthly power peak\",\n de: \"Monatliche Spitzenleistung\",\n ru: \"\u041C\u0435\u0441\u044F\u0447\u043D\u044B\u0439 \u043F\u0438\u043A \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u0438\",\n pt: \"Pico mensal de pot\u00EAncia\",\n nl: \"Maandelijkse piekvermogen\",\n fr: \"Puissance maximale mensuelle\",\n it: \"Picco mensile di potenza\",\n es: \"Pico mensual de potencia\",\n pl: \"Miesi\u0119czny szczyt mocy\",\n uk: \"\u041C\u0456\u0441\u044F\u0447\u043D\u0438\u0439 \u043F\u0456\u043A \u043F\u043E\u0442\u0443\u0436\u043D\u043E\u0441\u0442\u0456\",\n \"zh-cn\": \"\u6708\u5EA6\u529F\u7387\u5CF0\u503C\",\n },\n monthlyPowerPeakTimestamp: {\n en: \"Monthly peak timestamp\",\n de: \"Zeitstempel monatlicher Spitze\",\n ru: \"\u041C\u0435\u0442\u043A\u0430 \u0432\u0440\u0435\u043C\u0435\u043D\u0438 \u043C\u0435\u0441\u044F\u0447\u043D\u043E\u0433\u043E \u043F\u0438\u043A\u0430\",\n pt: \"Carimbo de hora do pico mensal\",\n nl: \"Tijdstempel maandelijkse piek\",\n fr: \"Horodatage du pic mensuel\",\n it: \"Timestamp del picco mensile\",\n es: \"Marca de tiempo del pico mensual\",\n pl: \"Znacznik czasu szczytu miesi\u0119cznego\",\n uk: \"\u041C\u0456\u0442\u043A\u0430 \u0447\u0430\u0441\u0443 \u043C\u0456\u0441\u044F\u0447\u043D\u043E\u0433\u043E \u043F\u0456\u043A\u0443\",\n \"zh-cn\": \"\u6708\u5EA6\u5CF0\u503C\u65F6\u95F4\u6233\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Apparent / reactive power \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n apparentCurrent: {\n en: \"Apparent current\",\n de: \"Scheinstrom\",\n ru: \"\u041F\u043E\u043B\u043D\u044B\u0439 \u0442\u043E\u043A\",\n pt: \"Corrente aparente\",\n nl: \"Schijnbare stroom\",\n fr: \"Courant apparent\",\n it: \"Corrente apparente\",\n es: \"Corriente aparente\",\n pl: \"Pr\u0105d pozorny\",\n uk: \"\u041F\u043E\u0432\u043D\u0438\u0439 \u0441\u0442\u0440\u0443\u043C\",\n \"zh-cn\": \"\u89C6\u5728\u7535\u6D41\",\n },\n apparentCurrentL1: {\n en: \"Apparent current L1\",\n de: \"Scheinstrom L1\",\n ru: \"\u041F\u043E\u043B\u043D\u044B\u0439 \u0442\u043E\u043A L1\",\n pt: \"Corrente aparente L1\",\n nl: \"Schijnbare stroom L1\",\n fr: \"Courant apparent L1\",\n it: \"Corrente apparente L1\",\n es: \"Corriente aparente L1\",\n pl: \"Pr\u0105d pozorny L1\",\n uk: \"\u041F\u043E\u0432\u043D\u0438\u0439 \u0441\u0442\u0440\u0443\u043C L1\",\n \"zh-cn\": \"L1 \u89C6\u5728\u7535\u6D41\",\n },\n apparentCurrentL2: {\n en: \"Apparent current L2\",\n de: \"Scheinstrom L2\",\n ru: \"\u041F\u043E\u043B\u043D\u044B\u0439 \u0442\u043E\u043A L2\",\n pt: \"Corrente aparente L2\",\n nl: \"Schijnbare stroom L2\",\n fr: \"Courant apparent L2\",\n it: \"Corrente apparente L2\",\n es: \"Corriente aparente L2\",\n pl: \"Pr\u0105d pozorny L2\",\n uk: \"\u041F\u043E\u0432\u043D\u0438\u0439 \u0441\u0442\u0440\u0443\u043C L2\",\n \"zh-cn\": \"L2 \u89C6\u5728\u7535\u6D41\",\n },\n apparentCurrentL3: {\n en: \"Apparent current L3\",\n de: \"Scheinstrom L3\",\n ru: \"\u041F\u043E\u043B\u043D\u044B\u0439 \u0442\u043E\u043A L3\",\n pt: \"Corrente aparente L3\",\n nl: \"Schijnbare stroom L3\",\n fr: \"Courant apparent L3\",\n it: \"Corrente apparente L3\",\n es: \"Corriente aparente L3\",\n pl: \"Pr\u0105d pozorny L3\",\n uk: \"\u041F\u043E\u0432\u043D\u0438\u0439 \u0441\u0442\u0440\u0443\u043C L3\",\n \"zh-cn\": \"L3 \u89C6\u5728\u7535\u6D41\",\n },\n reactiveCurrent: {\n en: \"Reactive current\",\n de: \"Blindstrom\",\n ru: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0439 \u0442\u043E\u043A\",\n pt: \"Corrente reativa\",\n nl: \"Blindstroom\",\n fr: \"Courant r\u00E9actif\",\n it: \"Corrente reattiva\",\n es: \"Corriente reactiva\",\n pl: \"Pr\u0105d bierny\",\n uk: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u0438\u0439 \u0441\u0442\u0440\u0443\u043C\",\n \"zh-cn\": \"\u65E0\u529F\u7535\u6D41\",\n },\n reactiveCurrentL1: {\n en: \"Reactive current L1\",\n de: \"Blindstrom L1\",\n ru: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0439 \u0442\u043E\u043A L1\",\n pt: \"Corrente reativa L1\",\n nl: \"Blindstroom L1\",\n fr: \"Courant r\u00E9actif L1\",\n it: \"Corrente reattiva L1\",\n es: \"Corriente reactiva L1\",\n pl: \"Pr\u0105d bierny L1\",\n uk: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u0438\u0439 \u0441\u0442\u0440\u0443\u043C L1\",\n \"zh-cn\": \"L1 \u65E0\u529F\u7535\u6D41\",\n },\n reactiveCurrentL2: {\n en: \"Reactive current L2\",\n de: \"Blindstrom L2\",\n ru: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0439 \u0442\u043E\u043A L2\",\n pt: \"Corrente reativa L2\",\n nl: \"Blindstroom L2\",\n fr: \"Courant r\u00E9actif L2\",\n it: \"Corrente reattiva L2\",\n es: \"Corriente reactiva L2\",\n pl: \"Pr\u0105d bierny L2\",\n uk: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u0438\u0439 \u0441\u0442\u0440\u0443\u043C L2\",\n \"zh-cn\": \"L2 \u65E0\u529F\u7535\u6D41\",\n },\n reactiveCurrentL3: {\n en: \"Reactive current L3\",\n de: \"Blindstrom L3\",\n ru: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0439 \u0442\u043E\u043A L3\",\n pt: \"Corrente reativa L3\",\n nl: \"Blindstroom L3\",\n fr: \"Courant r\u00E9actif L3\",\n it: \"Corrente reattiva L3\",\n es: \"Corriente reactiva L3\",\n pl: \"Pr\u0105d bierny L3\",\n uk: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u0438\u0439 \u0441\u0442\u0440\u0443\u043C L3\",\n \"zh-cn\": \"L3 \u65E0\u529F\u7535\u6D41\",\n },\n apparentPower: {\n en: \"Apparent power\",\n de: \"Scheinleistung\",\n ru: \"\u041F\u043E\u043B\u043D\u0430\u044F \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u044C\",\n pt: \"Pot\u00EAncia aparente\",\n nl: \"Schijnbaar vermogen\",\n fr: \"Puissance apparente\",\n it: \"Potenza apparente\",\n es: \"Potencia aparente\",\n pl: \"Moc pozorna\",\n uk: \"\u041F\u043E\u0432\u043D\u0430 \u043F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C\",\n \"zh-cn\": \"\u89C6\u5728\u529F\u7387\",\n },\n apparentPowerL1: {\n en: \"Apparent power L1\",\n de: \"Scheinleistung L1\",\n ru: \"\u041F\u043E\u043B\u043D\u0430\u044F \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u044C L1\",\n pt: \"Pot\u00EAncia aparente L1\",\n nl: \"Schijnbaar vermogen L1\",\n fr: \"Puissance apparente L1\",\n it: \"Potenza apparente L1\",\n es: \"Potencia aparente L1\",\n pl: \"Moc pozorna L1\",\n uk: \"\u041F\u043E\u0432\u043D\u0430 \u043F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C L1\",\n \"zh-cn\": \"L1 \u89C6\u5728\u529F\u7387\",\n },\n apparentPowerL2: {\n en: \"Apparent power L2\",\n de: \"Scheinleistung L2\",\n ru: \"\u041F\u043E\u043B\u043D\u0430\u044F \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u044C L2\",\n pt: \"Pot\u00EAncia aparente L2\",\n nl: \"Schijnbaar vermogen L2\",\n fr: \"Puissance apparente L2\",\n it: \"Potenza apparente L2\",\n es: \"Potencia aparente L2\",\n pl: \"Moc pozorna L2\",\n uk: \"\u041F\u043E\u0432\u043D\u0430 \u043F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C L2\",\n \"zh-cn\": \"L2 \u89C6\u5728\u529F\u7387\",\n },\n apparentPowerL3: {\n en: \"Apparent power L3\",\n de: \"Scheinleistung L3\",\n ru: \"\u041F\u043E\u043B\u043D\u0430\u044F \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u044C L3\",\n pt: \"Pot\u00EAncia aparente L3\",\n nl: \"Schijnbaar vermogen L3\",\n fr: \"Puissance apparente L3\",\n it: \"Potenza apparente L3\",\n es: \"Potencia aparente L3\",\n pl: \"Moc pozorna L3\",\n uk: \"\u041F\u043E\u0432\u043D\u0430 \u043F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C L3\",\n \"zh-cn\": \"L3 \u89C6\u5728\u529F\u7387\",\n },\n reactivePower: {\n en: \"Reactive power\",\n de: \"Blindleistung\",\n ru: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u0430\u044F \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u044C\",\n pt: \"Pot\u00EAncia reativa\",\n nl: \"Blindvermogen\",\n fr: \"Puissance r\u00E9active\",\n it: \"Potenza reattiva\",\n es: \"Potencia reactiva\",\n pl: \"Moc bierna\",\n uk: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u0430 \u043F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C\",\n \"zh-cn\": \"\u65E0\u529F\u529F\u7387\",\n },\n reactivePowerL1: {\n en: \"Reactive power L1\",\n de: \"Blindleistung L1\",\n ru: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u0430\u044F \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u044C L1\",\n pt: \"Pot\u00EAncia reativa L1\",\n nl: \"Blindvermogen L1\",\n fr: \"Puissance r\u00E9active L1\",\n it: \"Potenza reattiva L1\",\n es: \"Potencia reactiva L1\",\n pl: \"Moc bierna L1\",\n uk: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u0430 \u043F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C L1\",\n \"zh-cn\": \"L1 \u65E0\u529F\u529F\u7387\",\n },\n reactivePowerL2: {\n en: \"Reactive power L2\",\n de: \"Blindleistung L2\",\n ru: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u0430\u044F \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u044C L2\",\n pt: \"Pot\u00EAncia reativa L2\",\n nl: \"Blindvermogen L2\",\n fr: \"Puissance r\u00E9active L2\",\n it: \"Potenza reattiva L2\",\n es: \"Potencia reactiva L2\",\n pl: \"Moc bierna L2\",\n uk: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u0430 \u043F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C L2\",\n \"zh-cn\": \"L2 \u65E0\u529F\u529F\u7387\",\n },\n reactivePowerL3: {\n en: \"Reactive power L3\",\n de: \"Blindleistung L3\",\n ru: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u0430\u044F \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u044C L3\",\n pt: \"Pot\u00EAncia reativa L3\",\n nl: \"Blindvermogen L3\",\n fr: \"Puissance r\u00E9active L3\",\n it: \"Potenza reattiva L3\",\n es: \"Potencia reactiva L3\",\n pl: \"Moc bierna L3\",\n uk: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u0430 \u043F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C L3\",\n \"zh-cn\": \"L3 \u65E0\u529F\u529F\u7387\",\n },\n powerFactor: {\n en: \"Power factor\",\n de: \"Leistungsfaktor\",\n ru: \"\u041A\u043E\u044D\u0444\u0444\u0438\u0446\u0438\u0435\u043D\u0442 \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u0438\",\n pt: \"Fator de pot\u00EAncia\",\n nl: \"Vermogensfactor\",\n fr: \"Facteur de puissance\",\n it: \"Fattore di potenza\",\n es: \"Factor de potencia\",\n pl: \"Wsp\u00F3\u0142czynnik mocy\",\n uk: \"\u041A\u043E\u0435\u0444\u0456\u0446\u0456\u0454\u043D\u0442 \u043F\u043E\u0442\u0443\u0436\u043D\u043E\u0441\u0442\u0456\",\n \"zh-cn\": \"\u529F\u7387\u56E0\u6570\",\n },\n powerFactorL1: {\n en: \"Power factor L1\",\n de: \"Leistungsfaktor L1\",\n ru: \"\u041A\u043E\u044D\u0444\u0444\u0438\u0446\u0438\u0435\u043D\u0442 \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u0438 L1\",\n pt: \"Fator de pot\u00EAncia L1\",\n nl: \"Vermogensfactor L1\",\n fr: \"Facteur de puissance L1\",\n it: \"Fattore di potenza L1\",\n es: \"Factor de potencia L1\",\n pl: \"Wsp\u00F3\u0142czynnik mocy L1\",\n uk: \"\u041A\u043E\u0435\u0444\u0456\u0446\u0456\u0454\u043D\u0442 \u043F\u043E\u0442\u0443\u0436\u043D\u043E\u0441\u0442\u0456 L1\",\n \"zh-cn\": \"L1 \u529F\u7387\u56E0\u6570\",\n },\n powerFactorL2: {\n en: \"Power factor L2\",\n de: \"Leistungsfaktor L2\",\n ru: \"\u041A\u043E\u044D\u0444\u0444\u0438\u0446\u0438\u0435\u043D\u0442 \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u0438 L2\",\n pt: \"Fator de pot\u00EAncia L2\",\n nl: \"Vermogensfactor L2\",\n fr: \"Facteur de puissance L2\",\n it: \"Fattore di potenza L2\",\n es: \"Factor de potencia L2\",\n pl: \"Wsp\u00F3\u0142czynnik mocy L2\",\n uk: \"\u041A\u043E\u0435\u0444\u0456\u0446\u0456\u0454\u043D\u0442 \u043F\u043E\u0442\u0443\u0436\u043D\u043E\u0441\u0442\u0456 L2\",\n \"zh-cn\": \"L2 \u529F\u7387\u56E0\u6570\",\n },\n powerFactorL3: {\n en: \"Power factor L3\",\n de: \"Leistungsfaktor L3\",\n ru: \"\u041A\u043E\u044D\u0444\u0444\u0438\u0446\u0438\u0435\u043D\u0442 \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u0438 L3\",\n pt: \"Fator de pot\u00EAncia L3\",\n nl: \"Vermogensfactor L3\",\n fr: \"Facteur de puissance L3\",\n it: \"Fattore di potenza L3\",\n es: \"Factor de potencia L3\",\n pl: \"Wsp\u00F3\u0142czynnik mocy L3\",\n uk: \"\u041A\u043E\u0435\u0444\u0456\u0446\u0456\u0454\u043D\u0442 \u043F\u043E\u0442\u0443\u0436\u043D\u043E\u0441\u0442\u0456 L3\",\n \"zh-cn\": \"L3 \u529F\u7387\u56E0\u6570\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Battery measurement \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n stateOfCharge: {\n en: \"State of charge\",\n de: \"Ladezustand\",\n ru: \"\u0423\u0440\u043E\u0432\u0435\u043D\u044C \u0437\u0430\u0440\u044F\u0434\u0430\",\n pt: \"Estado de carga\",\n nl: \"Laadstatus\",\n fr: \"\u00C9tat de charge\",\n it: \"Stato di carica\",\n es: \"Estado de carga\",\n pl: \"Stan na\u0142adowania\",\n uk: \"\u0420\u0456\u0432\u0435\u043D\u044C \u0437\u0430\u0440\u044F\u0434\u0443\",\n \"zh-cn\": \"\u7535\u91CF\u72B6\u6001\",\n },\n cycles: {\n en: \"Charge cycles\",\n de: \"Ladezyklen\",\n ru: \"\u0426\u0438\u043A\u043B\u044B \u0437\u0430\u0440\u044F\u0434\u0430\",\n pt: \"Ciclos de carga\",\n nl: \"Laadcycli\",\n fr: \"Cycles de charge\",\n it: \"Cicli di carica\",\n es: \"Ciclos de carga\",\n pl: \"Cykle \u0142adowania\",\n uk: \"\u0426\u0438\u043A\u043B\u0438 \u0437\u0430\u0440\u044F\u0434\u0436\u0430\u043D\u043D\u044F\",\n \"zh-cn\": \"\u5145\u7535\u5FAA\u73AF\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Metadata \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n meterModel: {\n en: \"Meter model\",\n de: \"Z\u00E4hlertyp\",\n ru: \"\u041C\u043E\u0434\u0435\u043B\u044C \u0441\u0447\u0451\u0442\u0447\u0438\u043A\u0430\",\n pt: \"Modelo do contador\",\n nl: \"Metermodel\",\n fr: \"Mod\u00E8le de compteur\",\n it: \"Modello del contatore\",\n es: \"Modelo del medidor\",\n pl: \"Model licznika\",\n uk: \"\u041C\u043E\u0434\u0435\u043B\u044C \u043B\u0456\u0447\u0438\u043B\u044C\u043D\u0438\u043A\u0430\",\n \"zh-cn\": \"\u7535\u8868\u578B\u53F7\",\n },\n measurementTimestamp: {\n en: \"Measurement timestamp\",\n de: \"Mess-Zeitstempel\",\n ru: \"\u041C\u0435\u0442\u043A\u0430 \u0432\u0440\u0435\u043C\u0435\u043D\u0438 \u0438\u0437\u043C\u0435\u0440\u0435\u043D\u0438\u044F\",\n pt: \"Carimbo de hora da medi\u00E7\u00E3o\",\n nl: \"Meettijdstempel\",\n fr: \"Horodatage de la mesure\",\n it: \"Timestamp della misurazione\",\n es: \"Marca de tiempo de la medici\u00F3n\",\n pl: \"Znacznik czasu pomiaru\",\n uk: \"\u041C\u0456\u0442\u043A\u0430 \u0447\u0430\u0441\u0443 \u0432\u0438\u043C\u0456\u0440\u044E\u0432\u0430\u043D\u043D\u044F\",\n \"zh-cn\": \"\u6D4B\u91CF\u65F6\u95F4\u6233\",\n },\n};\n\n/** State descriptions (`common.desc`) \u2014 only for non-obvious states. */\nexport const STATE_DESCS: Record<string, StateName> = {\n voltageSag: {\n en: \"Number of voltage sag events (voltage dropped below the meter's threshold)\",\n de: \"Anzahl Spannungseinbr\u00FCche (Spannung unter Schwellwert des Z\u00E4hlers gefallen)\",\n ru: \"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043F\u0440\u043E\u0432\u0430\u043B\u043E\u0432 \u043D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u044F (\u043D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u0435 \u043D\u0438\u0436\u0435 \u043F\u043E\u0440\u043E\u0433\u0430 \u0441\u0447\u0451\u0442\u0447\u0438\u043A\u0430)\",\n pt: \"N\u00FAmero de quedas de tens\u00E3o (tens\u00E3o abaixo do limite do contador)\",\n nl: \"Aantal spanningsdips (spanning onder drempel van de meter)\",\n fr: \"Nombre de creux de tension (tension descendue sous le seuil du compteur)\",\n it: \"Numero di cali di tensione (tensione scesa sotto la soglia del contatore)\",\n es: \"N\u00FAmero de ca\u00EDdas de tensi\u00F3n (tensi\u00F3n por debajo del umbral del medidor)\",\n pl: \"Liczba zapad\u00F3w napi\u0119cia (napi\u0119cie poni\u017Cej progu licznika)\",\n uk: \"\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u043F\u0440\u043E\u0432\u0430\u043B\u0456\u0432 \u043D\u0430\u043F\u0440\u0443\u0433\u0438 (\u043D\u0430\u043F\u0440\u0443\u0433\u0430 \u043D\u0438\u0436\u0447\u0435 \u043F\u043E\u0440\u043E\u0433\u0443 \u043B\u0456\u0447\u0438\u043B\u044C\u043D\u0438\u043A\u0430)\",\n \"zh-cn\": \"\u7535\u538B\u9AA4\u964D\u6B21\u6570\uFF08\u7535\u538B\u4F4E\u4E8E\u7535\u8868\u9608\u503C\uFF09\",\n },\n voltageSwell: {\n en: \"Number of voltage swell events (voltage exceeded the meter's threshold)\",\n de: \"Anzahl Spannungserh\u00F6hungen (Spannung \u00FCber Schwellwert des Z\u00E4hlers)\",\n ru: \"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0441\u043A\u0430\u0447\u043A\u043E\u0432 \u043D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u044F (\u043D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u0435 \u0432\u044B\u0448\u0435 \u043F\u043E\u0440\u043E\u0433\u0430 \u0441\u0447\u0451\u0442\u0447\u0438\u043A\u0430)\",\n pt: \"N\u00FAmero de picos de tens\u00E3o (tens\u00E3o acima do limite do contador)\",\n nl: \"Aantal spanningspieken (spanning boven drempel van de meter)\",\n fr: \"Nombre de surtensions (tension sup\u00E9rieure au seuil du compteur)\",\n it: \"Numero di picchi di tensione (tensione oltre la soglia del contatore)\",\n es: \"N\u00FAmero de picos de tensi\u00F3n (tensi\u00F3n por encima del umbral del medidor)\",\n pl: \"Liczba przepi\u0119\u0107 (napi\u0119cie powy\u017Cej progu licznika)\",\n uk: \"\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u0441\u043F\u043B\u0435\u0441\u043A\u0456\u0432 \u043D\u0430\u043F\u0440\u0443\u0433\u0438 (\u043D\u0430\u043F\u0440\u0443\u0433\u0430 \u0432\u0438\u0449\u0435 \u043F\u043E\u0440\u043E\u0433\u0443 \u043B\u0456\u0447\u0438\u043B\u044C\u043D\u0438\u043A\u0430)\",\n \"zh-cn\": \"\u7535\u538B\u9AA4\u5347\u6B21\u6570\uFF08\u7535\u538B\u8D85\u8FC7\u7535\u8868\u9608\u503C\uFF09\",\n },\n powerFailCountDesc: {\n en: \"Total number of grid power outages recorded by the meter\",\n de: \"Gesamtzahl der vom Z\u00E4hler erfassten Stromausf\u00E4lle\",\n ru: \"\u041E\u0431\u0449\u0435\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0439 \u0441\u0435\u0442\u0438, \u0437\u0430\u0444\u0438\u043A\u0441\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0445 \u0441\u0447\u0451\u0442\u0447\u0438\u043A\u043E\u043C\",\n pt: \"N\u00FAmero total de cortes de energia registados pelo contador\",\n nl: \"Totaal aantal door de meter geregistreerde stroomuitvallen\",\n fr: \"Nombre total de coupures de courant enregistr\u00E9es par le compteur\",\n it: \"Numero totale di interruzioni di rete registrate dal contatore\",\n es: \"N\u00FAmero total de cortes de red registrados por el medidor\",\n pl: \"\u0141\u0105czna liczba awarii sieci zarejestrowanych przez licznik\",\n uk: \"\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0430 \u043A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u0432\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u044C \u043C\u0435\u0440\u0435\u0436\u0456, \u0437\u0430\u0444\u0456\u043A\u0441\u043E\u0432\u0430\u043D\u0438\u0445 \u043B\u0456\u0447\u0438\u043B\u044C\u043D\u0438\u043A\u043E\u043C\",\n \"zh-cn\": \"\u7535\u8868\u8BB0\u5F55\u7684\u7535\u7F51\u65AD\u7535\u603B\u6B21\u6570\",\n },\n longPowerFailCountDesc: {\n en: \"Number of long power outages (typically > 3 minutes)\",\n de: \"Anzahl langer Stromausf\u00E4lle (in der Regel > 3 Minuten)\",\n ru: \"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0434\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0439 (\u043E\u0431\u044B\u0447\u043D\u043E > 3 \u043C\u0438\u043D\u0443\u0442)\",\n pt: \"N\u00FAmero de cortes longos de energia (tipicamente > 3 minutos)\",\n nl: \"Aantal lange stroomuitvallen (doorgaans > 3 minuten)\",\n fr: \"Nombre de longues coupures de courant (typiquement > 3 minutes)\",\n it: \"Numero di lunghe interruzioni (tipicamente > 3 minuti)\",\n es: \"N\u00FAmero de cortes largos (generalmente > 3 minutos)\",\n pl: \"Liczba d\u0142ugich awarii (typowo > 3 minuty)\",\n uk: \"\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u0442\u0440\u0438\u0432\u0430\u043B\u0438\u0445 \u0432\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u044C (\u0437\u0430\u0437\u0432\u0438\u0447\u0430\u0439 > 3 \u0445\u0432\u0438\u043B\u0438\u043D)\",\n \"zh-cn\": \"\u957F\u65F6\u95F4\u65AD\u7535\u6B21\u6570\uFF08\u901A\u5E38\u8D85\u8FC7 3 \u5206\u949F\uFF09\",\n },\n belgiumCapacityTariff: {\n en: \"Belgian capacity tariff: 15-minute average and monthly peak (drives demand-based billing)\",\n de: \"Belgischer Kapazit\u00E4tstarif: 15-Minuten-Mittel und Monatsspitze (Grundlage f\u00FCr leistungsabh\u00E4ngige Abrechnung)\",\n ru: \"\u0411\u0435\u043B\u044C\u0433\u0438\u0439\u0441\u043A\u0438\u0439 \u0442\u0430\u0440\u0438\u0444 \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u0438: 15-\u043C\u0438\u043D\u0443\u0442\u043D\u043E\u0435 \u0441\u0440\u0435\u0434\u043D\u0435\u0435 \u0438 \u043C\u0435\u0441\u044F\u0447\u043D\u044B\u0439 \u043F\u0438\u043A (\u0434\u043B\u044F \u0440\u0430\u0441\u0447\u0451\u0442\u0430 \u043F\u043E \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u0438)\",\n pt: \"Tarifa de capacidade belga: m\u00E9dia de 15 min e pico mensal (fatura\u00E7\u00E3o por demanda)\",\n nl: \"Belgisch capaciteitstarief: 15-minuten-gemiddelde en maandpiek (vraaggebaseerde facturering)\",\n fr: \"Tarif de capacit\u00E9 belge : moyenne sur 15 min et pic mensuel (facturation \u00E0 la puissance)\",\n it: \"Tariffa di capacit\u00E0 belga: media 15 min e picco mensile (fatturazione su domanda)\",\n es: \"Tarifa de capacidad belga: promedio 15 min y pico mensual (facturaci\u00F3n por demanda)\",\n pl: \"Belgijska taryfa mocy: \u015Brednia 15-minutowa i szczyt miesi\u0119czny (rozliczenie wg mocy)\",\n uk: \"\u0411\u0435\u043B\u044C\u0433\u0456\u0439\u0441\u044C\u043A\u0438\u0439 \u0442\u0430\u0440\u0438\u0444 \u043F\u043E\u0442\u0443\u0436\u043D\u043E\u0441\u0442\u0456: 15-\u0445\u0432\u0438\u043B\u0438\u043D\u043D\u0435 \u0441\u0435\u0440\u0435\u0434\u043D\u0454 \u0442\u0430 \u043C\u0456\u0441\u044F\u0447\u043D\u0438\u0439 \u043F\u0456\u043A (\u0440\u043E\u0437\u0440\u0430\u0445\u0443\u043D\u043E\u043A \u0437\u0430 \u043F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044E)\",\n \"zh-cn\": \"\u6BD4\u5229\u65F6\u5BB9\u91CF\u7535\u4EF7\uFF1A15 \u5206\u949F\u5E73\u5747\u4E0E\u6708\u5EA6\u5CF0\u503C\uFF08\u6309\u9700\u6C42\u8BA1\u8D39\uFF09\",\n },\n powerFactorDesc: {\n en: \"Ratio of active to apparent power (range -1.0 to +1.0; 1.0 = purely resistive load)\",\n de: \"Verh\u00E4ltnis Wirkleistung zu Scheinleistung (-1.0 bis +1.0; 1.0 = rein ohmsche Last)\",\n ru: \"\u041E\u0442\u043D\u043E\u0448\u0435\u043D\u0438\u0435 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0439 \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u0438 \u043A \u043F\u043E\u043B\u043D\u043E\u0439 (\u043E\u0442 -1.0 \u0434\u043E +1.0; 1.0 = \u0447\u0438\u0441\u0442\u043E \u0440\u0435\u0437\u0438\u0441\u0442\u0438\u0432\u043D\u0430\u044F \u043D\u0430\u0433\u0440\u0443\u0437\u043A\u0430)\",\n pt: \"Raz\u00E3o entre pot\u00EAncia ativa e aparente (-1.0 a +1.0; 1.0 = carga puramente resistiva)\",\n nl: \"Verhouding actief tot schijnbaar vermogen (-1,0 tot +1,0; 1,0 = puur resistieve belasting)\",\n fr: \"Rapport puissance active/apparente (-1,0 \u00E0 +1,0 ; 1,0 = charge purement r\u00E9sistive)\",\n it: \"Rapporto tra potenza attiva e apparente (-1,0 a +1,0; 1,0 = carico puramente resistivo)\",\n es: \"Relaci\u00F3n entre potencia activa y aparente (-1,0 a +1,0; 1,0 = carga puramente resistiva)\",\n pl: \"Stosunek mocy czynnej do pozornej (-1,0 do +1,0; 1,0 = obci\u0105\u017Cenie czysto rezystancyjne)\",\n uk: \"\u0412\u0456\u0434\u043D\u043E\u0448\u0435\u043D\u043D\u044F \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0457 \u0434\u043E \u043F\u043E\u0432\u043D\u043E\u0457 \u043F\u043E\u0442\u0443\u0436\u043D\u043E\u0441\u0442\u0456 (-1,0 \u0434\u043E +1,0; 1,0 = \u0447\u0438\u0441\u0442\u043E \u0430\u043A\u0442\u0438\u0432\u043D\u0435 \u043D\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F)\",\n \"zh-cn\": \"\u6709\u529F\u529F\u7387\u4E0E\u89C6\u5728\u529F\u7387\u4E4B\u6BD4\uFF08-1.0 \u81F3 +1.0\uFF1B1.0 = \u7EAF\u963B\u6027\u8D1F\u8F7D\uFF09\",\n },\n batteryModeDesc: {\n en: \"Operating mode: zero (no grid feed-in), to_full (charge to maximum), standby\",\n de: \"Betriebsmodus: zero (keine Netzeinspeisung), to_full (auf Maximum laden), standby\",\n ru: \"\u0420\u0435\u0436\u0438\u043C \u0440\u0430\u0431\u043E\u0442\u044B: zero (\u0431\u0435\u0437 \u043F\u043E\u0434\u0430\u0447\u0438 \u0432 \u0441\u0435\u0442\u044C), to_full (\u0437\u0430\u0440\u044F\u0434 \u0434\u043E \u043C\u0430\u043A\u0441\u0438\u043C\u0443\u043C\u0430), standby\",\n pt: \"Modo de opera\u00E7\u00E3o: zero (sem inje\u00E7\u00E3o na rede), to_full (carregar ao m\u00E1ximo), standby\",\n nl: \"Bedrijfsmodus: zero (geen netinvoeding), to_full (volledig laden), standby\",\n fr: \"Mode de fonctionnement : zero (aucune injection au r\u00E9seau), to_full (charge maximale), standby\",\n it: \"Modalit\u00E0 operativa: zero (nessuna immissione in rete), to_full (carica al massimo), standby\",\n es: \"Modo de operaci\u00F3n: zero (sin inyecci\u00F3n a red), to_full (cargar al m\u00E1ximo), standby\",\n pl: \"Tryb pracy: zero (bez oddawania do sieci), to_full (\u0142aduj do pe\u0142na), standby\",\n uk: \"\u0420\u0435\u0436\u0438\u043C \u0440\u043E\u0431\u043E\u0442\u0438: zero (\u0431\u0435\u0437 \u043F\u043E\u0434\u0430\u0447\u0456 \u0432 \u043C\u0435\u0440\u0435\u0436\u0443), to_full (\u0437\u0430\u0440\u044F\u0434 \u0434\u043E \u043C\u0430\u043A\u0441\u0438\u043C\u0443\u043C\u0443), standby\",\n \"zh-cn\": \"\u8FD0\u884C\u6A21\u5F0F\uFF1Azero\uFF08\u4E0D\u5411\u7535\u7F51\u9988\u9001\uFF09\u3001to_full\uFF08\u5145\u6EE1\uFF09\u3001standby\uFF08\u5F85\u673A\uFF09\",\n },\n startPairingDesc: {\n en: \"Set to true to start mDNS discovery and pair a new HomeWizard device (60-second window)\",\n de: \"Auf true setzen, um die mDNS-Suche zu starten und ein neues HomeWizard-Ger\u00E4t zu koppeln (60 Sekunden Zeitfenster)\",\n ru: \"\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0435 true, \u0447\u0442\u043E\u0431\u044B \u043D\u0430\u0447\u0430\u0442\u044C \u043F\u043E\u0438\u0441\u043A \u0447\u0435\u0440\u0435\u0437 mDNS \u0438 \u0441\u043E\u043F\u0440\u044F\u0447\u044C \u043D\u043E\u0432\u043E\u0435 \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E HomeWizard (\u043E\u043A\u043D\u043E 60 \u0441\u0435\u043A\u0443\u043D\u0434)\",\n pt: \"Defina como true para iniciar a dete\u00E7\u00E3o mDNS e emparelhar um novo dispositivo HomeWizard (janela de 60 segundos)\",\n nl: \"Zet op true om mDNS-detectie te starten en een nieuw HomeWizard-apparaat te koppelen (60 seconden venster)\",\n fr: \"Mettez \u00E0 true pour d\u00E9marrer la d\u00E9tection mDNS et appairer un nouvel appareil HomeWizard (fen\u00EAtre de 60 secondes)\",\n it: \"Imposta su true per avviare la rilevazione mDNS e accoppiare un nuovo dispositivo HomeWizard (finestra di 60 secondi)\",\n es: \"Establece en true para iniciar la detecci\u00F3n mDNS y emparejar un nuevo dispositivo HomeWizard (ventana de 60 segundos)\",\n pl: \"Ustaw na true, aby uruchomi\u0107 wykrywanie mDNS i sparowa\u0107 nowe urz\u0105dzenie HomeWizard (okno 60 sekund)\",\n uk: \"\u0412\u0441\u0442\u0430\u043D\u043E\u0432\u0456\u0442\u044C true, \u0449\u043E\u0431 \u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u0438 \u043F\u043E\u0448\u0443\u043A \u0447\u0435\u0440\u0435\u0437 mDNS \u0456 \u0432\u0438\u043A\u043E\u043D\u0430\u0442\u0438 \u0441\u043F\u043E\u043B\u0443\u0447\u0435\u043D\u043D\u044F \u043D\u043E\u0432\u043E\u0433\u043E \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u044E HomeWizard (\u0432\u0456\u043A\u043D\u043E 60 \u0441\u0435\u043A\u0443\u043D\u0434)\",\n \"zh-cn\": \"\u8BBE\u7F6E\u4E3A true \u4EE5\u542F\u52A8 mDNS \u53D1\u73B0\u5E76\u914D\u5BF9\u65B0\u7684 HomeWizard \u8BBE\u5907\uFF0860 \u79D2\u7A97\u53E3\uFF09\",\n },\n removeDeviceDesc: {\n en: \"Set to true to disconnect, delete and remove this device permanently\",\n de: \"Auf true setzen, um dieses Ger\u00E4t zu trennen, alle Daten zu l\u00F6schen und dauerhaft zu entfernen\",\n ru: \"\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0435 true, \u0447\u0442\u043E\u0431\u044B \u043E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C, \u0443\u0434\u0430\u043B\u0438\u0442\u044C \u0438 \u043D\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u0431\u0440\u0430\u0442\u044C \u044D\u0442\u043E \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E\",\n pt: \"Defina como true para desconectar, eliminar e remover permanentemente este dispositivo\",\n nl: \"Zet op true om dit apparaat te ontkoppelen, te verwijderen en permanent te wissen\",\n fr: \"Mettez \u00E0 true pour d\u00E9connecter, supprimer et retirer d\u00E9finitivement cet appareil\",\n it: \"Imposta su true per disconnettere, eliminare e rimuovere definitivamente questo dispositivo\",\n es: \"Establece en true para desconectar, borrar y eliminar permanentemente este dispositivo\",\n pl: \"Ustaw na true, aby roz\u0142\u0105czy\u0107, usun\u0105\u0107 i trwale wyrejestrowa\u0107 to urz\u0105dzenie\",\n uk: \"\u0412\u0441\u0442\u0430\u043D\u043E\u0432\u0456\u0442\u044C true, \u0449\u043E\u0431 \u0432\u0456\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u0438, \u0432\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u0456 \u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E \u043F\u0440\u0438\u0431\u0440\u0430\u0442\u0438 \u0446\u0435\u0439 \u043F\u0440\u0438\u0441\u0442\u0440\u0456\u0439\",\n \"zh-cn\": \"\u8BBE\u7F6E\u4E3A true \u4EE5\u65AD\u5F00\u3001\u5220\u9664\u5E76\u6C38\u4E45\u79FB\u9664\u6B64\u8BBE\u5907\",\n },\n};\n\n/** Dropdown labels for `common.states` maps (admin v6+ renders translation objects per value). */\nexport const STATE_LABELS: Record<string, StateName> = {\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Tariff (1-4) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n tariff1: {\n en: \"Tariff 1 (T1)\",\n de: \"Tarif 1 (T1)\",\n ru: \"\u0422\u0430\u0440\u0438\u0444 1 (T1)\",\n pt: \"Tarifa 1 (T1)\",\n nl: \"Tarief 1 (T1)\",\n fr: \"Tarif 1 (T1)\",\n it: \"Tariffa 1 (T1)\",\n es: \"Tarifa 1 (T1)\",\n pl: \"Taryfa 1 (T1)\",\n uk: \"\u0422\u0430\u0440\u0438\u0444 1 (T1)\",\n \"zh-cn\": \"\u7535\u4EF7 1\uFF08T1\uFF09\",\n },\n tariff2: {\n en: \"Tariff 2 (T2)\",\n de: \"Tarif 2 (T2)\",\n ru: \"\u0422\u0430\u0440\u0438\u0444 2 (T2)\",\n pt: \"Tarifa 2 (T2)\",\n nl: \"Tarief 2 (T2)\",\n fr: \"Tarif 2 (T2)\",\n it: \"Tariffa 2 (T2)\",\n es: \"Tarifa 2 (T2)\",\n pl: \"Taryfa 2 (T2)\",\n uk: \"\u0422\u0430\u0440\u0438\u0444 2 (T2)\",\n \"zh-cn\": \"\u7535\u4EF7 2\uFF08T2\uFF09\",\n },\n tariff3: {\n en: \"Tariff 3 (T3)\",\n de: \"Tarif 3 (T3)\",\n ru: \"\u0422\u0430\u0440\u0438\u0444 3 (T3)\",\n pt: \"Tarifa 3 (T3)\",\n nl: \"Tarief 3 (T3)\",\n fr: \"Tarif 3 (T3)\",\n it: \"Tariffa 3 (T3)\",\n es: \"Tarifa 3 (T3)\",\n pl: \"Taryfa 3 (T3)\",\n uk: \"\u0422\u0430\u0440\u0438\u0444 3 (T3)\",\n \"zh-cn\": \"\u7535\u4EF7 3\uFF08T3\uFF09\",\n },\n tariff4: {\n en: \"Tariff 4 (T4)\",\n de: \"Tarif 4 (T4)\",\n ru: \"\u0422\u0430\u0440\u0438\u0444 4 (T4)\",\n pt: \"Tarifa 4 (T4)\",\n nl: \"Tarief 4 (T4)\",\n fr: \"Tarif 4 (T4)\",\n it: \"Tariffa 4 (T4)\",\n es: \"Tarifa 4 (T4)\",\n pl: \"Taryfa 4 (T4)\",\n uk: \"\u0422\u0430\u0440\u0438\u0444 4 (T4)\",\n \"zh-cn\": \"\u7535\u4EF7 4\uFF08T4\uFF09\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Battery mode \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n modeZero: {\n en: \"Zero (no grid feed-in)\",\n de: \"Zero (keine Netzeinspeisung)\",\n ru: \"Zero (\u0431\u0435\u0437 \u043F\u043E\u0434\u0430\u0447\u0438 \u0432 \u0441\u0435\u0442\u044C)\",\n pt: \"Zero (sem inje\u00E7\u00E3o na rede)\",\n nl: \"Zero (geen netinvoeding)\",\n fr: \"Zero (sans injection au r\u00E9seau)\",\n it: \"Zero (senza immissione in rete)\",\n es: \"Zero (sin inyecci\u00F3n a red)\",\n pl: \"Zero (bez oddawania do sieci)\",\n uk: \"Zero (\u0431\u0435\u0437 \u043F\u043E\u0434\u0430\u0447\u0456 \u0432 \u043C\u0435\u0440\u0435\u0436\u0443)\",\n \"zh-cn\": \"Zero\uFF08\u4E0D\u5411\u7535\u7F51\u9988\u9001\uFF09\",\n },\n modeToFull: {\n en: \"To full (charge to maximum)\",\n de: \"To full (auf Maximum laden)\",\n ru: \"To full (\u0437\u0430\u0440\u044F\u0434 \u0434\u043E \u043C\u0430\u043A\u0441\u0438\u043C\u0443\u043C\u0430)\",\n pt: \"To full (carregar ao m\u00E1ximo)\",\n nl: \"To full (volledig laden)\",\n fr: \"To full (charge maximale)\",\n it: \"To full (carica al massimo)\",\n es: \"To full (cargar al m\u00E1ximo)\",\n pl: \"To full (\u0142aduj do pe\u0142na)\",\n uk: \"To full (\u0437\u0430\u0440\u044F\u0434 \u0434\u043E \u043C\u0430\u043A\u0441\u0438\u043C\u0443\u043C\u0443)\",\n \"zh-cn\": \"To full\uFF08\u5145\u6EE1\uFF09\",\n },\n modeStandby: {\n en: \"Standby\",\n de: \"Standby\",\n ru: \"Standby\",\n pt: \"Standby\",\n nl: \"Standby\",\n fr: \"Standby\",\n it: \"Standby\",\n es: \"Standby\",\n pl: \"Standby\",\n uk: \"Standby\",\n \"zh-cn\": \"\u5F85\u673A\",\n },\n};\n\n/**\n * Translation object for a state name. Pass into `common.name`; ioBroker\n * Admin/vis/Object-Browser localizes automatically.\n *\n * @param key Translation key in {@link STATE_NAMES}.\n */\nexport function tName(key: keyof typeof STATE_NAMES): StateName {\n return STATE_NAMES[key];\n}\n\n/**\n * Translation object for `common.desc`. Same lookup mechanism as `tName`.\n *\n * @param key Translation key in {@link STATE_DESCS}.\n */\nexport function tDesc(key: keyof typeof STATE_DESCS): StateName {\n return STATE_DESCS[key];\n}\n\n/**\n * Translation object for a dropdown label inside a `common.states` map.\n * Admin v6+ renders translation objects per value.\n *\n * @param key Translation key in {@link STATE_LABELS}.\n */\nexport function tLabel(key: keyof typeof STATE_LABELS): StateName {\n return STATE_LABELS[key];\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * Localized state names, descriptions and dropdown labels for HomeWizard\n * devices in 11 ioBroker system languages.\n *\n * ioBroker accepts plain strings or `{ en, de, ... }` translation objects for\n * `common.name`, `common.desc` and the values of `common.states`. Admin, vis\n * and the Object-Browser pick the user's language automatically \u2014 we just\n * hand them the object.\n *\n * No adapter-side language lookup needed (different from `i18n-logs.ts`,\n * where we have to pick at log-emit time because `this.log.info(...)` takes\n * a single string).\n */\n\ntype Lang = \"en\" | \"de\" | \"ru\" | \"pt\" | \"nl\" | \"fr\" | \"it\" | \"es\" | \"pl\" | \"uk\" | \"zh-cn\";\n\n/** Translation object as ioBroker expects it. */\nexport type StateName = Record<Lang, string>;\n\n/** State / channel display names (`common.name`). */\nexport const STATE_NAMES: Record<string, StateName> = {\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 instanceObjects (Adapter root) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n info: {\n en: \"Adapter Information\",\n de: \"Adapter-Informationen\",\n ru: \"\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u043E\u0431 \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u0435\",\n pt: \"Informa\u00E7\u00F5es do adaptador\",\n nl: \"Adapterinformatie\",\n fr: \"Informations sur l'adaptateur\",\n it: \"Informazioni sull'adattatore\",\n es: \"Informaci\u00F3n del adaptador\",\n pl: \"Informacje o adapterze\",\n uk: \"\u0406\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u044F \u043F\u0440\u043E \u0430\u0434\u0430\u043F\u0442\u0435\u0440\",\n \"zh-cn\": \"\u9002\u914D\u5668\u4FE1\u606F\",\n },\n infoConnection: {\n en: \"Connection status\",\n de: \"Verbindungsstatus\",\n ru: \"\u0421\u0442\u0430\u0442\u0443\u0441 \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F\",\n pt: \"Estado da liga\u00E7\u00E3o\",\n nl: \"Verbindingsstatus\",\n fr: \"\u00C9tat de la connexion\",\n it: \"Stato della connessione\",\n es: \"Estado de la conexi\u00F3n\",\n pl: \"Status po\u0142\u0105czenia\",\n uk: \"\u0421\u0442\u0430\u043D \u0437'\u0454\u0434\u043D\u0430\u043D\u043D\u044F\",\n \"zh-cn\": \"\u8FDE\u63A5\u72B6\u6001\",\n },\n startPairing: {\n en: \"Start pairing mode\",\n de: \"Pairing-Modus starten\",\n ru: \"\u041D\u0430\u0447\u0430\u0442\u044C \u0440\u0435\u0436\u0438\u043C \u0441\u043E\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u044F\",\n pt: \"Iniciar modo de emparelhamento\",\n nl: \"Koppelmodus starten\",\n fr: \"D\u00E9marrer le mode d'appairage\",\n it: \"Avvia modalit\u00E0 di accoppiamento\",\n es: \"Iniciar modo de emparejamiento\",\n pl: \"Uruchom tryb parowania\",\n uk: \"\u0417\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u0438 \u0440\u0435\u0436\u0438\u043C \u0441\u043F\u043E\u043B\u0443\u0447\u0435\u043D\u043D\u044F\",\n \"zh-cn\": \"\u542F\u52A8\u914D\u5BF9\u6A21\u5F0F\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Channel names \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n deviceInformation: {\n en: \"Device Information\",\n de: \"Ger\u00E4teinformationen\",\n ru: \"\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u043E\u0431 \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u0435\",\n pt: \"Informa\u00E7\u00F5es do dispositivo\",\n nl: \"Apparaatinformatie\",\n fr: \"Informations sur l'appareil\",\n it: \"Informazioni sul dispositivo\",\n es: \"Informaci\u00F3n del dispositivo\",\n pl: \"Informacje o urz\u0105dzeniu\",\n uk: \"\u0406\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u044F \u043F\u0440\u043E \u043F\u0440\u0438\u0441\u0442\u0440\u0456\u0439\",\n \"zh-cn\": \"\u8BBE\u5907\u4FE1\u606F\",\n },\n measurement: {\n en: \"Measurement\",\n de: \"Messdaten\",\n ru: \"\u0418\u0437\u043C\u0435\u0440\u0435\u043D\u0438\u0435\",\n pt: \"Medi\u00E7\u00E3o\",\n nl: \"Meting\",\n fr: \"Mesure\",\n it: \"Misurazione\",\n es: \"Medici\u00F3n\",\n pl: \"Pomiar\",\n uk: \"\u0412\u0438\u043C\u0456\u0440\u044E\u0432\u0430\u043D\u043D\u044F\",\n \"zh-cn\": \"\u6D4B\u91CF\",\n },\n externalMeters: {\n en: \"External Meters\",\n de: \"Externe Z\u00E4hler\",\n ru: \"\u0412\u043D\u0435\u0448\u043D\u0438\u0435 \u0441\u0447\u0451\u0442\u0447\u0438\u043A\u0438\",\n pt: \"Contadores externos\",\n nl: \"Externe meters\",\n fr: \"Compteurs externes\",\n it: \"Contatori esterni\",\n es: \"Medidores externos\",\n pl: \"Liczniki zewn\u0119trzne\",\n uk: \"\u0417\u043E\u0432\u043D\u0456\u0448\u043D\u0456 \u043B\u0456\u0447\u0438\u043B\u044C\u043D\u0438\u043A\u0438\",\n \"zh-cn\": \"\u5916\u90E8\u4EEA\u8868\",\n },\n systemSettings: {\n en: \"System Settings\",\n de: \"Systemeinstellungen\",\n ru: \"\u0421\u0438\u0441\u0442\u0435\u043C\u043D\u044B\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438\",\n pt: \"Configura\u00E7\u00F5es do sistema\",\n nl: \"Systeeminstellingen\",\n fr: \"Param\u00E8tres syst\u00E8me\",\n it: \"Impostazioni di sistema\",\n es: \"Configuraci\u00F3n del sistema\",\n pl: \"Ustawienia systemu\",\n uk: \"\u0421\u0438\u0441\u0442\u0435\u043C\u043D\u0456 \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F\",\n \"zh-cn\": \"\u7CFB\u7EDF\u8BBE\u7F6E\",\n },\n batteryControl: {\n en: \"Battery Control\",\n de: \"Batteriesteuerung\",\n ru: \"\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0431\u0430\u0442\u0430\u0440\u0435\u0435\u0439\",\n pt: \"Controlo da bateria\",\n nl: \"Batterijbesturing\",\n fr: \"Contr\u00F4le de la batterie\",\n it: \"Controllo batteria\",\n es: \"Control de bater\u00EDa\",\n pl: \"Sterowanie bateri\u0105\",\n uk: \"\u041A\u0435\u0440\u0443\u0432\u0430\u043D\u043D\u044F \u0431\u0430\u0442\u0430\u0440\u0435\u0454\u044E\",\n \"zh-cn\": \"\u7535\u6C60\u63A7\u5236\",\n },\n externalValue: {\n en: \"Value\",\n de: \"Wert\",\n ru: \"\u0417\u043D\u0430\u0447\u0435\u043D\u0438\u0435\",\n pt: \"Valor\",\n nl: \"Waarde\",\n fr: \"Valeur\",\n it: \"Valore\",\n es: \"Valor\",\n pl: \"Warto\u015B\u0107\",\n uk: \"\u0417\u043D\u0430\u0447\u0435\u043D\u043D\u044F\",\n \"zh-cn\": \"\u503C\",\n },\n externalUnit: {\n en: \"Unit\",\n de: \"Einheit\",\n ru: \"\u0415\u0434\u0438\u043D\u0438\u0446\u0430 \u0438\u0437\u043C\u0435\u0440\u0435\u043D\u0438\u044F\",\n pt: \"Unidade\",\n nl: \"Eenheid\",\n fr: \"Unit\u00E9\",\n it: \"Unit\u00E0\",\n es: \"Unidad\",\n pl: \"Jednostka\",\n uk: \"\u041E\u0434\u0438\u043D\u0438\u0446\u044F\",\n \"zh-cn\": \"\u5355\u4F4D\",\n },\n externalTimestamp: {\n en: \"Timestamp\",\n de: \"Zeitstempel\",\n ru: \"\u041C\u0435\u0442\u043A\u0430 \u0432\u0440\u0435\u043C\u0435\u043D\u0438\",\n pt: \"Carimbo de hora\",\n nl: \"Tijdstempel\",\n fr: \"Horodatage\",\n it: \"Timestamp\",\n es: \"Marca de tiempo\",\n pl: \"Znacznik czasu\",\n uk: \"\u041C\u0456\u0442\u043A\u0430 \u0447\u0430\u0441\u0443\",\n \"zh-cn\": \"\u65F6\u95F4\u6233\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Device info \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n productName: {\n en: \"Product name\",\n de: \"Produktname\",\n ru: \"\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u043F\u0440\u043E\u0434\u0443\u043A\u0442\u0430\",\n pt: \"Nome do produto\",\n nl: \"Productnaam\",\n fr: \"Nom du produit\",\n it: \"Nome del prodotto\",\n es: \"Nombre del producto\",\n pl: \"Nazwa produktu\",\n uk: \"\u041D\u0430\u0437\u0432\u0430 \u043F\u0440\u043E\u0434\u0443\u043A\u0442\u0443\",\n \"zh-cn\": \"\u4EA7\u54C1\u540D\u79F0\",\n },\n productType: {\n en: \"Product type\",\n de: \"Produkttyp\",\n ru: \"\u0422\u0438\u043F \u043F\u0440\u043E\u0434\u0443\u043A\u0442\u0430\",\n pt: \"Tipo de produto\",\n nl: \"Producttype\",\n fr: \"Type de produit\",\n it: \"Tipo di prodotto\",\n es: \"Tipo de producto\",\n pl: \"Typ produktu\",\n uk: \"\u0422\u0438\u043F \u043F\u0440\u043E\u0434\u0443\u043A\u0442\u0443\",\n \"zh-cn\": \"\u4EA7\u54C1\u7C7B\u578B\",\n },\n firmware: {\n en: \"Firmware version\",\n de: \"Firmware-Version\",\n ru: \"\u0412\u0435\u0440\u0441\u0438\u044F \u043F\u0440\u043E\u0448\u0438\u0432\u043A\u0438\",\n pt: \"Vers\u00E3o do firmware\",\n nl: \"Firmwareversie\",\n fr: \"Version du firmware\",\n it: \"Versione firmware\",\n es: \"Versi\u00F3n del firmware\",\n pl: \"Wersja firmware\",\n uk: \"\u0412\u0435\u0440\u0441\u0456\u044F \u043F\u0440\u043E\u0448\u0438\u0432\u043A\u0438\",\n \"zh-cn\": \"\u56FA\u4EF6\u7248\u672C\",\n },\n connected: {\n en: \"Device connected\",\n de: \"Ger\u00E4t verbunden\",\n ru: \"\u0423\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043E\",\n pt: \"Dispositivo conectado\",\n nl: \"Apparaat verbonden\",\n fr: \"Appareil connect\u00E9\",\n it: \"Dispositivo connesso\",\n es: \"Dispositivo conectado\",\n pl: \"Urz\u0105dzenie po\u0142\u0105czone\",\n uk: \"\u041F\u0440\u0438\u0441\u0442\u0440\u0456\u0439 \u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043E\",\n \"zh-cn\": \"\u8BBE\u5907\u5DF2\u8FDE\u63A5\",\n },\n wifiRssi: {\n en: \"WiFi signal strength\",\n de: \"WLAN-Signalst\u00E4rke\",\n ru: \"\u0421\u0438\u043B\u0430 \u0441\u0438\u0433\u043D\u0430\u043B\u0430 WiFi\",\n pt: \"For\u00E7a do sinal WiFi\",\n nl: \"WiFi-signaalsterkte\",\n fr: \"Force du signal WiFi\",\n it: \"Intensit\u00E0 del segnale WiFi\",\n es: \"Intensidad de la se\u00F1al WiFi\",\n pl: \"Si\u0142a sygna\u0142u WiFi\",\n uk: \"\u0421\u0438\u043B\u0430 \u0441\u0438\u0433\u043D\u0430\u043B\u0443 WiFi\",\n \"zh-cn\": \"WiFi \u4FE1\u53F7\u5F3A\u5EA6\",\n },\n uptime: {\n en: \"Uptime\",\n de: \"Betriebsdauer\",\n ru: \"\u0412\u0440\u0435\u043C\u044F \u0440\u0430\u0431\u043E\u0442\u044B\",\n pt: \"Tempo de atividade\",\n nl: \"Uptime\",\n fr: \"Temps de fonctionnement\",\n it: \"Tempo di attivit\u00E0\",\n es: \"Tiempo de actividad\",\n pl: \"Czas dzia\u0142ania\",\n uk: \"\u0427\u0430\u0441 \u0440\u043E\u0431\u043E\u0442\u0438\",\n \"zh-cn\": \"\u8FD0\u884C\u65F6\u95F4\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Buttons \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n removeDevice: {\n en: \"Remove device\",\n de: \"Ger\u00E4t entfernen\",\n ru: \"\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E\",\n pt: \"Remover dispositivo\",\n nl: \"Apparaat verwijderen\",\n fr: \"Supprimer l'appareil\",\n it: \"Rimuovi dispositivo\",\n es: \"Eliminar dispositivo\",\n pl: \"Usu\u0144 urz\u0105dzenie\",\n uk: \"\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u043F\u0440\u0438\u0441\u0442\u0440\u0456\u0439\",\n \"zh-cn\": \"\u79FB\u9664\u8BBE\u5907\",\n },\n rebootDevice: {\n en: \"Reboot device\",\n de: \"Ger\u00E4t neu starten\",\n ru: \"\u041F\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E\",\n pt: \"Reiniciar dispositivo\",\n nl: \"Apparaat opnieuw opstarten\",\n fr: \"Red\u00E9marrer l'appareil\",\n it: \"Riavvia dispositivo\",\n es: \"Reiniciar dispositivo\",\n pl: \"Uruchom ponownie urz\u0105dzenie\",\n uk: \"\u041F\u0435\u0440\u0435\u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438 \u043F\u0440\u0438\u0441\u0442\u0440\u0456\u0439\",\n \"zh-cn\": \"\u91CD\u542F\u8BBE\u5907\",\n },\n identify: {\n en: \"Identify (blink LED)\",\n de: \"Identifizieren (LED blinkt)\",\n ru: \"\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043E\u0432\u0430\u0442\u044C (\u043C\u0438\u0433\u0430\u043D\u0438\u0435 \u0441\u0432\u0435\u0442\u043E\u0434\u0438\u043E\u0434\u0430)\",\n pt: \"Identificar (piscar LED)\",\n nl: \"Identificeren (LED knippert)\",\n fr: \"Identifier (LED clignote)\",\n it: \"Identifica (LED lampeggia)\",\n es: \"Identificar (LED parpadea)\",\n pl: \"Identyfikuj (migni\u0119cie LED)\",\n uk: \"\u0406\u0434\u0435\u043D\u0442\u0438\u0444\u0456\u043A\u0443\u0432\u0430\u0442\u0438 (LED \u0431\u043B\u0438\u043C\u0430\u0454)\",\n \"zh-cn\": \"\u8BC6\u522B\uFF08LED \u95EA\u70C1\uFF09\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 System control \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n cloudEnabled: {\n en: \"Cloud enabled\",\n de: \"Cloud aktiviert\",\n ru: \"\u041E\u0431\u043B\u0430\u043A\u043E \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u043E\",\n pt: \"Cloud ativada\",\n nl: \"Cloud ingeschakeld\",\n fr: \"Cloud activ\u00E9\",\n it: \"Cloud abilitato\",\n es: \"Cloud activada\",\n pl: \"Cloud w\u0142\u0105czona\",\n uk: \"\u0425\u043C\u0430\u0440\u0430 \u0443\u0432\u0456\u043C\u043A\u043D\u0435\u043D\u0430\",\n \"zh-cn\": \"\u5DF2\u542F\u7528\u4E91\u7AEF\",\n },\n ledBrightness: {\n en: \"LED brightness\",\n de: \"LED-Helligkeit\",\n ru: \"\u042F\u0440\u043A\u043E\u0441\u0442\u044C \u0441\u0432\u0435\u0442\u043E\u0434\u0438\u043E\u0434\u0430\",\n pt: \"Brilho do LED\",\n nl: \"LED-helderheid\",\n fr: \"Luminosit\u00E9 de la LED\",\n it: \"Luminosit\u00E0 LED\",\n es: \"Brillo del LED\",\n pl: \"Jasno\u015B\u0107 LED\",\n uk: \"\u042F\u0441\u043A\u0440\u0430\u0432\u0456\u0441\u0442\u044C LED\",\n \"zh-cn\": \"LED \u4EAE\u5EA6\",\n },\n apiV1Enabled: {\n en: \"API v1 enabled (legacy)\",\n de: \"API v1 aktiviert (Legacy)\",\n ru: \"API v1 \u0432\u043A\u043B\u044E\u0447\u0451\u043D (\u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0439)\",\n pt: \"API v1 ativada (legacy)\",\n nl: \"API v1 ingeschakeld (legacy)\",\n fr: \"API v1 activ\u00E9e (h\u00E9rit\u00E9e)\",\n it: \"API v1 abilitata (legacy)\",\n es: \"API v1 activada (legacy)\",\n pl: \"API v1 w\u0142\u0105czone (starsze)\",\n uk: \"API v1 \u0443\u0432\u0456\u043C\u043A\u043D\u0435\u043D\u043E (\u0437\u0430\u0441\u0442\u0430\u0440\u0456\u043B\u0438\u0439)\",\n \"zh-cn\": \"\u5DF2\u542F\u7528 API v1\uFF08\u65E7\u7248\uFF09\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Battery \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n batteryMode: {\n en: \"Battery mode\",\n de: \"Batterie-Modus\",\n ru: \"\u0420\u0435\u0436\u0438\u043C \u0431\u0430\u0442\u0430\u0440\u0435\u0438\",\n pt: \"Modo da bateria\",\n nl: \"Batterijmodus\",\n fr: \"Mode de la batterie\",\n it: \"Modalit\u00E0 batteria\",\n es: \"Modo de la bater\u00EDa\",\n pl: \"Tryb baterii\",\n uk: \"\u0420\u0435\u0436\u0438\u043C \u0431\u0430\u0442\u0430\u0440\u0435\u0457\",\n \"zh-cn\": \"\u7535\u6C60\u6A21\u5F0F\",\n },\n batteryPermissions: {\n en: \"Battery permissions\",\n de: \"Batterie-Berechtigungen\",\n ru: \"\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u044F \u0431\u0430\u0442\u0430\u0440\u0435\u0438\",\n pt: \"Permiss\u00F5es da bateria\",\n nl: \"Batterijrechten\",\n fr: \"Permissions de la batterie\",\n it: \"Autorizzazioni batteria\",\n es: \"Permisos de la bater\u00EDa\",\n pl: \"Uprawnienia baterii\",\n uk: \"\u0414\u043E\u0437\u0432\u043E\u043B\u0438 \u0431\u0430\u0442\u0430\u0440\u0435\u0457\",\n \"zh-cn\": \"\u7535\u6C60\u6743\u9650\",\n },\n batteryCount: {\n en: \"Connected batteries\",\n de: \"Verbundene Batterien\",\n ru: \"\u041F\u043E\u0434\u043A\u043B\u044E\u0447\u0451\u043D\u043D\u044B\u0435 \u0431\u0430\u0442\u0430\u0440\u0435\u0438\",\n pt: \"Baterias conectadas\",\n nl: \"Verbonden batterijen\",\n fr: \"Batteries connect\u00E9es\",\n it: \"Batterie collegate\",\n es: \"Bater\u00EDas conectadas\",\n pl: \"Pod\u0142\u0105czone baterie\",\n uk: \"\u041F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0456 \u0431\u0430\u0442\u0430\u0440\u0435\u0457\",\n \"zh-cn\": \"\u5DF2\u8FDE\u63A5\u7535\u6C60\",\n },\n batteryPower: {\n en: \"Battery power\",\n de: \"Batterieleistung\",\n ru: \"\u041C\u043E\u0449\u043D\u043E\u0441\u0442\u044C \u0431\u0430\u0442\u0430\u0440\u0435\u0438\",\n pt: \"Pot\u00EAncia da bateria\",\n nl: \"Batterijvermogen\",\n fr: \"Puissance de la batterie\",\n it: \"Potenza della batteria\",\n es: \"Potencia de la bater\u00EDa\",\n pl: \"Moc baterii\",\n uk: \"\u041F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C \u0431\u0430\u0442\u0430\u0440\u0435\u0457\",\n \"zh-cn\": \"\u7535\u6C60\u529F\u7387\",\n },\n batteryTargetPower: {\n en: \"Target power\",\n de: \"Soll-Leistung\",\n ru: \"\u0426\u0435\u043B\u0435\u0432\u0430\u044F \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u044C\",\n pt: \"Pot\u00EAncia alvo\",\n nl: \"Doelvermogen\",\n fr: \"Puissance cible\",\n it: \"Potenza obiettivo\",\n es: \"Potencia objetivo\",\n pl: \"Moc docelowa\",\n uk: \"\u0426\u0456\u043B\u044C\u043E\u0432\u0430 \u043F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C\",\n \"zh-cn\": \"\u76EE\u6807\u529F\u7387\",\n },\n batteryMaxConsumption: {\n en: \"Max consumption\",\n de: \"Max. Verbrauch\",\n ru: \"\u041C\u0430\u043A\u0441. \u043F\u043E\u0442\u0440\u0435\u0431\u043B\u0435\u043D\u0438\u0435\",\n pt: \"Consumo m\u00E1x.\",\n nl: \"Max. verbruik\",\n fr: \"Consommation max.\",\n it: \"Consumo massimo\",\n es: \"Consumo m\u00E1x.\",\n pl: \"Maks. zu\u017Cycie\",\n uk: \"\u041C\u0430\u043A\u0441. \u0441\u043F\u043E\u0436\u0438\u0432\u0430\u043D\u043D\u044F\",\n \"zh-cn\": \"\u6700\u5927\u6D88\u8017\",\n },\n batteryMaxProduction: {\n en: \"Max production\",\n de: \"Max. Erzeugung\",\n ru: \"\u041C\u0430\u043A\u0441. \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0441\u0442\u0432\u043E\",\n pt: \"Produ\u00E7\u00E3o m\u00E1x.\",\n nl: \"Max. productie\",\n fr: \"Production max.\",\n it: \"Produzione massima\",\n es: \"Producci\u00F3n m\u00E1x.\",\n pl: \"Maks. produkcja\",\n uk: \"\u041C\u0430\u043A\u0441. \u0432\u0438\u0440\u043E\u0431\u043D\u0438\u0446\u0442\u0432\u043E\",\n \"zh-cn\": \"\u6700\u5927\u751F\u4EA7\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Measurement: Power \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n powerTotal: {\n en: \"Total power\",\n de: \"Gesamtleistung\",\n ru: \"\u041E\u0431\u0449\u0430\u044F \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u044C\",\n pt: \"Pot\u00EAncia total\",\n nl: \"Totaal vermogen\",\n fr: \"Puissance totale\",\n it: \"Potenza totale\",\n es: \"Potencia total\",\n pl: \"Moc ca\u0142kowita\",\n uk: \"\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0430 \u043F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C\",\n \"zh-cn\": \"\u603B\u529F\u7387\",\n },\n powerL1: {\n en: \"Power L1\",\n de: \"Leistung L1\",\n ru: \"\u041C\u043E\u0449\u043D\u043E\u0441\u0442\u044C L1\",\n pt: \"Pot\u00EAncia L1\",\n nl: \"Vermogen L1\",\n fr: \"Puissance L1\",\n it: \"Potenza L1\",\n es: \"Potencia L1\",\n pl: \"Moc L1\",\n uk: \"\u041F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C L1\",\n \"zh-cn\": \"L1 \u529F\u7387\",\n },\n powerL2: {\n en: \"Power L2\",\n de: \"Leistung L2\",\n ru: \"\u041C\u043E\u0449\u043D\u043E\u0441\u0442\u044C L2\",\n pt: \"Pot\u00EAncia L2\",\n nl: \"Vermogen L2\",\n fr: \"Puissance L2\",\n it: \"Potenza L2\",\n es: \"Potencia L2\",\n pl: \"Moc L2\",\n uk: \"\u041F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C L2\",\n \"zh-cn\": \"L2 \u529F\u7387\",\n },\n powerL3: {\n en: \"Power L3\",\n de: \"Leistung L3\",\n ru: \"\u041C\u043E\u0449\u043D\u043E\u0441\u0442\u044C L3\",\n pt: \"Pot\u00EAncia L3\",\n nl: \"Vermogen L3\",\n fr: \"Puissance L3\",\n it: \"Potenza L3\",\n es: \"Potencia L3\",\n pl: \"Moc L3\",\n uk: \"\u041F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C L3\",\n \"zh-cn\": \"L3 \u529F\u7387\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Measurement: Voltage \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n voltage: {\n en: \"Voltage\",\n de: \"Spannung\",\n ru: \"\u041D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u0435\",\n pt: \"Tens\u00E3o\",\n nl: \"Spanning\",\n fr: \"Tension\",\n it: \"Tensione\",\n es: \"Voltaje\",\n pl: \"Napi\u0119cie\",\n uk: \"\u041D\u0430\u043F\u0440\u0443\u0433\u0430\",\n \"zh-cn\": \"\u7535\u538B\",\n },\n voltageL1: {\n en: \"Voltage L1\",\n de: \"Spannung L1\",\n ru: \"\u041D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u0435 L1\",\n pt: \"Tens\u00E3o L1\",\n nl: \"Spanning L1\",\n fr: \"Tension L1\",\n it: \"Tensione L1\",\n es: \"Voltaje L1\",\n pl: \"Napi\u0119cie L1\",\n uk: \"\u041D\u0430\u043F\u0440\u0443\u0433\u0430 L1\",\n \"zh-cn\": \"L1 \u7535\u538B\",\n },\n voltageL2: {\n en: \"Voltage L2\",\n de: \"Spannung L2\",\n ru: \"\u041D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u0435 L2\",\n pt: \"Tens\u00E3o L2\",\n nl: \"Spanning L2\",\n fr: \"Tension L2\",\n it: \"Tensione L2\",\n es: \"Voltaje L2\",\n pl: \"Napi\u0119cie L2\",\n uk: \"\u041D\u0430\u043F\u0440\u0443\u0433\u0430 L2\",\n \"zh-cn\": \"L2 \u7535\u538B\",\n },\n voltageL3: {\n en: \"Voltage L3\",\n de: \"Spannung L3\",\n ru: \"\u041D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u0435 L3\",\n pt: \"Tens\u00E3o L3\",\n nl: \"Spanning L3\",\n fr: \"Tension L3\",\n it: \"Tensione L3\",\n es: \"Voltaje L3\",\n pl: \"Napi\u0119cie L3\",\n uk: \"\u041D\u0430\u043F\u0440\u0443\u0433\u0430 L3\",\n \"zh-cn\": \"L3 \u7535\u538B\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Measurement: Current \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n current: {\n en: \"Current\",\n de: \"Strom\",\n ru: \"\u0422\u043E\u043A\",\n pt: \"Corrente\",\n nl: \"Stroom\",\n fr: \"Courant\",\n it: \"Corrente\",\n es: \"Corriente\",\n pl: \"Pr\u0105d\",\n uk: \"\u0421\u0442\u0440\u0443\u043C\",\n \"zh-cn\": \"\u7535\u6D41\",\n },\n currentL1: {\n en: \"Current L1\",\n de: \"Strom L1\",\n ru: \"\u0422\u043E\u043A L1\",\n pt: \"Corrente L1\",\n nl: \"Stroom L1\",\n fr: \"Courant L1\",\n it: \"Corrente L1\",\n es: \"Corriente L1\",\n pl: \"Pr\u0105d L1\",\n uk: \"\u0421\u0442\u0440\u0443\u043C L1\",\n \"zh-cn\": \"L1 \u7535\u6D41\",\n },\n currentL2: {\n en: \"Current L2\",\n de: \"Strom L2\",\n ru: \"\u0422\u043E\u043A L2\",\n pt: \"Corrente L2\",\n nl: \"Stroom L2\",\n fr: \"Courant L2\",\n it: \"Corrente L2\",\n es: \"Corriente L2\",\n pl: \"Pr\u0105d L2\",\n uk: \"\u0421\u0442\u0440\u0443\u043C L2\",\n \"zh-cn\": \"L2 \u7535\u6D41\",\n },\n currentL3: {\n en: \"Current L3\",\n de: \"Strom L3\",\n ru: \"\u0422\u043E\u043A L3\",\n pt: \"Corrente L3\",\n nl: \"Stroom L3\",\n fr: \"Courant L3\",\n it: \"Corrente L3\",\n es: \"Corriente L3\",\n pl: \"Pr\u0105d L3\",\n uk: \"\u0421\u0442\u0440\u0443\u043C L3\",\n \"zh-cn\": \"L3 \u7535\u6D41\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Measurement: Frequency / Tariff \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n frequency: {\n en: \"Grid frequency\",\n de: \"Netzfrequenz\",\n ru: \"\u0427\u0430\u0441\u0442\u043E\u0442\u0430 \u0441\u0435\u0442\u0438\",\n pt: \"Frequ\u00EAncia da rede\",\n nl: \"Netfrequentie\",\n fr: \"Fr\u00E9quence du r\u00E9seau\",\n it: \"Frequenza di rete\",\n es: \"Frecuencia de la red\",\n pl: \"Cz\u0119stotliwo\u015B\u0107 sieci\",\n uk: \"\u0427\u0430\u0441\u0442\u043E\u0442\u0430 \u043C\u0435\u0440\u0435\u0436\u0456\",\n \"zh-cn\": \"\u7535\u7F51\u9891\u7387\",\n },\n tariff: {\n en: \"Active tariff\",\n de: \"Aktiver Tarif\",\n ru: \"\u0410\u043A\u0442\u0438\u0432\u043D\u044B\u0439 \u0442\u0430\u0440\u0438\u0444\",\n pt: \"Tarifa ativa\",\n nl: \"Actief tarief\",\n fr: \"Tarif actif\",\n it: \"Tariffa attiva\",\n es: \"Tarifa activa\",\n pl: \"Aktywna taryfa\",\n uk: \"\u0410\u043A\u0442\u0438\u0432\u043D\u0438\u0439 \u0442\u0430\u0440\u0438\u0444\",\n \"zh-cn\": \"\u5F53\u524D\u7535\u4EF7\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Measurement: Energy import/export \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n energyImportTotal: {\n en: \"Energy import total\",\n de: \"Energie-Import gesamt\",\n ru: \"\u0418\u043C\u043F\u043E\u0440\u0442 \u044D\u043D\u0435\u0440\u0433\u0438\u0438 \u0432\u0441\u0435\u0433\u043E\",\n pt: \"Energia importada total\",\n nl: \"Totale energie-import\",\n fr: \"\u00C9nergie import\u00E9e totale\",\n it: \"Energia importata totale\",\n es: \"Energ\u00EDa importada total\",\n pl: \"\u0141\u0105czny import energii\",\n uk: \"\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0438\u0439 \u0456\u043C\u043F\u043E\u0440\u0442 \u0435\u043D\u0435\u0440\u0433\u0456\u0457\",\n \"zh-cn\": \"\u80FD\u6E90\u8F93\u5165\u603B\u8BA1\",\n },\n energyImportT1: {\n en: \"Energy import T1\",\n de: \"Energie-Import T1\",\n ru: \"\u0418\u043C\u043F\u043E\u0440\u0442 \u044D\u043D\u0435\u0440\u0433\u0438\u0438 T1\",\n pt: \"Energia importada T1\",\n nl: \"Energie-import T1\",\n fr: \"\u00C9nergie import\u00E9e T1\",\n it: \"Energia importata T1\",\n es: \"Energ\u00EDa importada T1\",\n pl: \"Import energii T1\",\n uk: \"\u0406\u043C\u043F\u043E\u0440\u0442 \u0435\u043D\u0435\u0440\u0433\u0456\u0457 T1\",\n \"zh-cn\": \"\u80FD\u6E90\u8F93\u5165 T1\",\n },\n energyImportT2: {\n en: \"Energy import T2\",\n de: \"Energie-Import T2\",\n ru: \"\u0418\u043C\u043F\u043E\u0440\u0442 \u044D\u043D\u0435\u0440\u0433\u0438\u0438 T2\",\n pt: \"Energia importada T2\",\n nl: \"Energie-import T2\",\n fr: \"\u00C9nergie import\u00E9e T2\",\n it: \"Energia importata T2\",\n es: \"Energ\u00EDa importada T2\",\n pl: \"Import energii T2\",\n uk: \"\u0406\u043C\u043F\u043E\u0440\u0442 \u0435\u043D\u0435\u0440\u0433\u0456\u0457 T2\",\n \"zh-cn\": \"\u80FD\u6E90\u8F93\u5165 T2\",\n },\n energyImportT3: {\n en: \"Energy import T3\",\n de: \"Energie-Import T3\",\n ru: \"\u0418\u043C\u043F\u043E\u0440\u0442 \u044D\u043D\u0435\u0440\u0433\u0438\u0438 T3\",\n pt: \"Energia importada T3\",\n nl: \"Energie-import T3\",\n fr: \"\u00C9nergie import\u00E9e T3\",\n it: \"Energia importata T3\",\n es: \"Energ\u00EDa importada T3\",\n pl: \"Import energii T3\",\n uk: \"\u0406\u043C\u043F\u043E\u0440\u0442 \u0435\u043D\u0435\u0440\u0433\u0456\u0457 T3\",\n \"zh-cn\": \"\u80FD\u6E90\u8F93\u5165 T3\",\n },\n energyImportT4: {\n en: \"Energy import T4\",\n de: \"Energie-Import T4\",\n ru: \"\u0418\u043C\u043F\u043E\u0440\u0442 \u044D\u043D\u0435\u0440\u0433\u0438\u0438 T4\",\n pt: \"Energia importada T4\",\n nl: \"Energie-import T4\",\n fr: \"\u00C9nergie import\u00E9e T4\",\n it: \"Energia importata T4\",\n es: \"Energ\u00EDa importada T4\",\n pl: \"Import energii T4\",\n uk: \"\u0406\u043C\u043F\u043E\u0440\u0442 \u0435\u043D\u0435\u0440\u0433\u0456\u0457 T4\",\n \"zh-cn\": \"\u80FD\u6E90\u8F93\u5165 T4\",\n },\n energyExportTotal: {\n en: \"Energy export total\",\n de: \"Energie-Export gesamt\",\n ru: \"\u042D\u043A\u0441\u043F\u043E\u0440\u0442 \u044D\u043D\u0435\u0440\u0433\u0438\u0438 \u0432\u0441\u0435\u0433\u043E\",\n pt: \"Energia exportada total\",\n nl: \"Totale energie-export\",\n fr: \"\u00C9nergie export\u00E9e totale\",\n it: \"Energia esportata totale\",\n es: \"Energ\u00EDa exportada total\",\n pl: \"\u0141\u0105czny eksport energii\",\n uk: \"\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0438\u0439 \u0435\u043A\u0441\u043F\u043E\u0440\u0442 \u0435\u043D\u0435\u0440\u0433\u0456\u0457\",\n \"zh-cn\": \"\u80FD\u6E90\u8F93\u51FA\u603B\u8BA1\",\n },\n energyExportT1: {\n en: \"Energy export T1\",\n de: \"Energie-Export T1\",\n ru: \"\u042D\u043A\u0441\u043F\u043E\u0440\u0442 \u044D\u043D\u0435\u0440\u0433\u0438\u0438 T1\",\n pt: \"Energia exportada T1\",\n nl: \"Energie-export T1\",\n fr: \"\u00C9nergie export\u00E9e T1\",\n it: \"Energia esportata T1\",\n es: \"Energ\u00EDa exportada T1\",\n pl: \"Eksport energii T1\",\n uk: \"\u0415\u043A\u0441\u043F\u043E\u0440\u0442 \u0435\u043D\u0435\u0440\u0433\u0456\u0457 T1\",\n \"zh-cn\": \"\u80FD\u6E90\u8F93\u51FA T1\",\n },\n energyExportT2: {\n en: \"Energy export T2\",\n de: \"Energie-Export T2\",\n ru: \"\u042D\u043A\u0441\u043F\u043E\u0440\u0442 \u044D\u043D\u0435\u0440\u0433\u0438\u0438 T2\",\n pt: \"Energia exportada T2\",\n nl: \"Energie-export T2\",\n fr: \"\u00C9nergie export\u00E9e T2\",\n it: \"Energia esportata T2\",\n es: \"Energ\u00EDa exportada T2\",\n pl: \"Eksport energii T2\",\n uk: \"\u0415\u043A\u0441\u043F\u043E\u0440\u0442 \u0435\u043D\u0435\u0440\u0433\u0456\u0457 T2\",\n \"zh-cn\": \"\u80FD\u6E90\u8F93\u51FA T2\",\n },\n energyExportT3: {\n en: \"Energy export T3\",\n de: \"Energie-Export T3\",\n ru: \"\u042D\u043A\u0441\u043F\u043E\u0440\u0442 \u044D\u043D\u0435\u0440\u0433\u0438\u0438 T3\",\n pt: \"Energia exportada T3\",\n nl: \"Energie-export T3\",\n fr: \"\u00C9nergie export\u00E9e T3\",\n it: \"Energia esportata T3\",\n es: \"Energ\u00EDa exportada T3\",\n pl: \"Eksport energii T3\",\n uk: \"\u0415\u043A\u0441\u043F\u043E\u0440\u0442 \u0435\u043D\u0435\u0440\u0433\u0456\u0457 T3\",\n \"zh-cn\": \"\u80FD\u6E90\u8F93\u51FA T3\",\n },\n energyExportT4: {\n en: \"Energy export T4\",\n de: \"Energie-Export T4\",\n ru: \"\u042D\u043A\u0441\u043F\u043E\u0440\u0442 \u044D\u043D\u0435\u0440\u0433\u0438\u0438 T4\",\n pt: \"Energia exportada T4\",\n nl: \"Energie-export T4\",\n fr: \"\u00C9nergie export\u00E9e T4\",\n it: \"Energia esportata T4\",\n es: \"Energ\u00EDa exportada T4\",\n pl: \"Eksport energii T4\",\n uk: \"\u0415\u043A\u0441\u043F\u043E\u0440\u0442 \u0435\u043D\u0435\u0440\u0433\u0456\u0457 T4\",\n \"zh-cn\": \"\u80FD\u6E90\u8F93\u51FA T4\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Power quality \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n voltageSagL1: {\n en: \"Voltage sag count L1\",\n de: \"Spannungseinbr\u00FCche L1\",\n ru: \"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043F\u0440\u043E\u0432\u0430\u043B\u043E\u0432 \u043D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u044F L1\",\n pt: \"Contagem de quedas de tens\u00E3o L1\",\n nl: \"Spanningsdips L1\",\n fr: \"Nombre de creux de tension L1\",\n it: \"Conteggio cali di tensione L1\",\n es: \"Cuenta de ca\u00EDdas de tensi\u00F3n L1\",\n pl: \"Liczba zapad\u00F3w napi\u0119cia L1\",\n uk: \"\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u043F\u0440\u043E\u0432\u0430\u043B\u0456\u0432 \u043D\u0430\u043F\u0440\u0443\u0433\u0438 L1\",\n \"zh-cn\": \"L1 \u7535\u538B\u9AA4\u964D\u6B21\u6570\",\n },\n voltageSagL2: {\n en: \"Voltage sag count L2\",\n de: \"Spannungseinbr\u00FCche L2\",\n ru: \"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043F\u0440\u043E\u0432\u0430\u043B\u043E\u0432 \u043D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u044F L2\",\n pt: \"Contagem de quedas de tens\u00E3o L2\",\n nl: \"Spanningsdips L2\",\n fr: \"Nombre de creux de tension L2\",\n it: \"Conteggio cali di tensione L2\",\n es: \"Cuenta de ca\u00EDdas de tensi\u00F3n L2\",\n pl: \"Liczba zapad\u00F3w napi\u0119cia L2\",\n uk: \"\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u043F\u0440\u043E\u0432\u0430\u043B\u0456\u0432 \u043D\u0430\u043F\u0440\u0443\u0433\u0438 L2\",\n \"zh-cn\": \"L2 \u7535\u538B\u9AA4\u964D\u6B21\u6570\",\n },\n voltageSagL3: {\n en: \"Voltage sag count L3\",\n de: \"Spannungseinbr\u00FCche L3\",\n ru: \"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043F\u0440\u043E\u0432\u0430\u043B\u043E\u0432 \u043D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u044F L3\",\n pt: \"Contagem de quedas de tens\u00E3o L3\",\n nl: \"Spanningsdips L3\",\n fr: \"Nombre de creux de tension L3\",\n it: \"Conteggio cali di tensione L3\",\n es: \"Cuenta de ca\u00EDdas de tensi\u00F3n L3\",\n pl: \"Liczba zapad\u00F3w napi\u0119cia L3\",\n uk: \"\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u043F\u0440\u043E\u0432\u0430\u043B\u0456\u0432 \u043D\u0430\u043F\u0440\u0443\u0433\u0438 L3\",\n \"zh-cn\": \"L3 \u7535\u538B\u9AA4\u964D\u6B21\u6570\",\n },\n voltageSwellL1: {\n en: \"Voltage swell count L1\",\n de: \"Spannungserh\u00F6hungen L1\",\n ru: \"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0441\u043A\u0430\u0447\u043A\u043E\u0432 \u043D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u044F L1\",\n pt: \"Contagem de picos de tens\u00E3o L1\",\n nl: \"Spanningspieken L1\",\n fr: \"Nombre de surtensions L1\",\n it: \"Conteggio picchi di tensione L1\",\n es: \"Cuenta de picos de tensi\u00F3n L1\",\n pl: \"Liczba przepi\u0119\u0107 napi\u0119cia L1\",\n uk: \"\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u0441\u043F\u043B\u0435\u0441\u043A\u0456\u0432 \u043D\u0430\u043F\u0440\u0443\u0433\u0438 L1\",\n \"zh-cn\": \"L1 \u7535\u538B\u9AA4\u5347\u6B21\u6570\",\n },\n voltageSwellL2: {\n en: \"Voltage swell count L2\",\n de: \"Spannungserh\u00F6hungen L2\",\n ru: \"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0441\u043A\u0430\u0447\u043A\u043E\u0432 \u043D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u044F L2\",\n pt: \"Contagem de picos de tens\u00E3o L2\",\n nl: \"Spanningspieken L2\",\n fr: \"Nombre de surtensions L2\",\n it: \"Conteggio picchi di tensione L2\",\n es: \"Cuenta de picos de tensi\u00F3n L2\",\n pl: \"Liczba przepi\u0119\u0107 napi\u0119cia L2\",\n uk: \"\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u0441\u043F\u043B\u0435\u0441\u043A\u0456\u0432 \u043D\u0430\u043F\u0440\u0443\u0433\u0438 L2\",\n \"zh-cn\": \"L2 \u7535\u538B\u9AA4\u5347\u6B21\u6570\",\n },\n voltageSwellL3: {\n en: \"Voltage swell count L3\",\n de: \"Spannungserh\u00F6hungen L3\",\n ru: \"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0441\u043A\u0430\u0447\u043A\u043E\u0432 \u043D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u044F L3\",\n pt: \"Contagem de picos de tens\u00E3o L3\",\n nl: \"Spanningspieken L3\",\n fr: \"Nombre de surtensions L3\",\n it: \"Conteggio picchi di tensione L3\",\n es: \"Cuenta de picos de tensi\u00F3n L3\",\n pl: \"Liczba przepi\u0119\u0107 napi\u0119cia L3\",\n uk: \"\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u0441\u043F\u043B\u0435\u0441\u043A\u0456\u0432 \u043D\u0430\u043F\u0440\u0443\u0433\u0438 L3\",\n \"zh-cn\": \"L3 \u7535\u538B\u9AA4\u5347\u6B21\u6570\",\n },\n powerFailCount: {\n en: \"Power fail count\",\n de: \"Stromausf\u00E4lle\",\n ru: \"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0439 \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u044D\u043D\u0435\u0440\u0433\u0438\u0438\",\n pt: \"Contagem de falhas de energia\",\n nl: \"Stroomuitval-teller\",\n fr: \"Nombre de coupures de courant\",\n it: \"Conteggio interruzioni di corrente\",\n es: \"Cuenta de cortes de energ\u00EDa\",\n pl: \"Liczba awarii zasilania\",\n uk: \"\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u0432\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u044C \u0436\u0438\u0432\u043B\u0435\u043D\u043D\u044F\",\n \"zh-cn\": \"\u65AD\u7535\u6B21\u6570\",\n },\n longPowerFailCount: {\n en: \"Long power fail count\",\n de: \"Lange Stromausf\u00E4lle\",\n ru: \"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0434\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0439\",\n pt: \"Contagem de falhas longas de energia\",\n nl: \"Lange stroomuitval-teller\",\n fr: \"Nombre de coupures longues\",\n it: \"Conteggio interruzioni lunghe\",\n es: \"Cuenta de cortes largos\",\n pl: \"Liczba d\u0142ugich awarii\",\n uk: \"\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u0442\u0440\u0438\u0432\u0430\u043B\u0438\u0445 \u0432\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u044C\",\n \"zh-cn\": \"\u957F\u65F6\u95F4\u65AD\u7535\u6B21\u6570\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Capacity tariff (Belgium) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n avgPower15m: {\n en: \"Average power (15 min)\",\n de: \"Durchschnittsleistung (15 Min)\",\n ru: \"\u0421\u0440\u0435\u0434\u043D\u044F\u044F \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u044C (15 \u043C\u0438\u043D)\",\n pt: \"Pot\u00EAncia m\u00E9dia (15 min)\",\n nl: \"Gemiddeld vermogen (15 min)\",\n fr: \"Puissance moyenne (15 min)\",\n it: \"Potenza media (15 min)\",\n es: \"Potencia media (15 min)\",\n pl: \"\u015Arednia moc (15 min)\",\n uk: \"\u0421\u0435\u0440\u0435\u0434\u043D\u044F \u043F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C (15 \u0445\u0432)\",\n \"zh-cn\": \"\u5E73\u5747\u529F\u7387\uFF0815 \u5206\u949F\uFF09\",\n },\n monthlyPowerPeak: {\n en: \"Monthly power peak\",\n de: \"Monatliche Spitzenleistung\",\n ru: \"\u041C\u0435\u0441\u044F\u0447\u043D\u044B\u0439 \u043F\u0438\u043A \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u0438\",\n pt: \"Pico mensal de pot\u00EAncia\",\n nl: \"Maandelijkse piekvermogen\",\n fr: \"Puissance maximale mensuelle\",\n it: \"Picco mensile di potenza\",\n es: \"Pico mensual de potencia\",\n pl: \"Miesi\u0119czny szczyt mocy\",\n uk: \"\u041C\u0456\u0441\u044F\u0447\u043D\u0438\u0439 \u043F\u0456\u043A \u043F\u043E\u0442\u0443\u0436\u043D\u043E\u0441\u0442\u0456\",\n \"zh-cn\": \"\u6708\u5EA6\u529F\u7387\u5CF0\u503C\",\n },\n monthlyPowerPeakTimestamp: {\n en: \"Monthly peak timestamp\",\n de: \"Zeitstempel monatlicher Spitze\",\n ru: \"\u041C\u0435\u0442\u043A\u0430 \u0432\u0440\u0435\u043C\u0435\u043D\u0438 \u043C\u0435\u0441\u044F\u0447\u043D\u043E\u0433\u043E \u043F\u0438\u043A\u0430\",\n pt: \"Carimbo de hora do pico mensal\",\n nl: \"Tijdstempel maandelijkse piek\",\n fr: \"Horodatage du pic mensuel\",\n it: \"Timestamp del picco mensile\",\n es: \"Marca de tiempo del pico mensual\",\n pl: \"Znacznik czasu szczytu miesi\u0119cznego\",\n uk: \"\u041C\u0456\u0442\u043A\u0430 \u0447\u0430\u0441\u0443 \u043C\u0456\u0441\u044F\u0447\u043D\u043E\u0433\u043E \u043F\u0456\u043A\u0443\",\n \"zh-cn\": \"\u6708\u5EA6\u5CF0\u503C\u65F6\u95F4\u6233\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Apparent / reactive power \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n apparentCurrent: {\n en: \"Apparent current\",\n de: \"Scheinstrom\",\n ru: \"\u041F\u043E\u043B\u043D\u044B\u0439 \u0442\u043E\u043A\",\n pt: \"Corrente aparente\",\n nl: \"Schijnbare stroom\",\n fr: \"Courant apparent\",\n it: \"Corrente apparente\",\n es: \"Corriente aparente\",\n pl: \"Pr\u0105d pozorny\",\n uk: \"\u041F\u043E\u0432\u043D\u0438\u0439 \u0441\u0442\u0440\u0443\u043C\",\n \"zh-cn\": \"\u89C6\u5728\u7535\u6D41\",\n },\n apparentCurrentL1: {\n en: \"Apparent current L1\",\n de: \"Scheinstrom L1\",\n ru: \"\u041F\u043E\u043B\u043D\u044B\u0439 \u0442\u043E\u043A L1\",\n pt: \"Corrente aparente L1\",\n nl: \"Schijnbare stroom L1\",\n fr: \"Courant apparent L1\",\n it: \"Corrente apparente L1\",\n es: \"Corriente aparente L1\",\n pl: \"Pr\u0105d pozorny L1\",\n uk: \"\u041F\u043E\u0432\u043D\u0438\u0439 \u0441\u0442\u0440\u0443\u043C L1\",\n \"zh-cn\": \"L1 \u89C6\u5728\u7535\u6D41\",\n },\n apparentCurrentL2: {\n en: \"Apparent current L2\",\n de: \"Scheinstrom L2\",\n ru: \"\u041F\u043E\u043B\u043D\u044B\u0439 \u0442\u043E\u043A L2\",\n pt: \"Corrente aparente L2\",\n nl: \"Schijnbare stroom L2\",\n fr: \"Courant apparent L2\",\n it: \"Corrente apparente L2\",\n es: \"Corriente aparente L2\",\n pl: \"Pr\u0105d pozorny L2\",\n uk: \"\u041F\u043E\u0432\u043D\u0438\u0439 \u0441\u0442\u0440\u0443\u043C L2\",\n \"zh-cn\": \"L2 \u89C6\u5728\u7535\u6D41\",\n },\n apparentCurrentL3: {\n en: \"Apparent current L3\",\n de: \"Scheinstrom L3\",\n ru: \"\u041F\u043E\u043B\u043D\u044B\u0439 \u0442\u043E\u043A L3\",\n pt: \"Corrente aparente L3\",\n nl: \"Schijnbare stroom L3\",\n fr: \"Courant apparent L3\",\n it: \"Corrente apparente L3\",\n es: \"Corriente aparente L3\",\n pl: \"Pr\u0105d pozorny L3\",\n uk: \"\u041F\u043E\u0432\u043D\u0438\u0439 \u0441\u0442\u0440\u0443\u043C L3\",\n \"zh-cn\": \"L3 \u89C6\u5728\u7535\u6D41\",\n },\n reactiveCurrent: {\n en: \"Reactive current\",\n de: \"Blindstrom\",\n ru: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0439 \u0442\u043E\u043A\",\n pt: \"Corrente reativa\",\n nl: \"Blindstroom\",\n fr: \"Courant r\u00E9actif\",\n it: \"Corrente reattiva\",\n es: \"Corriente reactiva\",\n pl: \"Pr\u0105d bierny\",\n uk: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u0438\u0439 \u0441\u0442\u0440\u0443\u043C\",\n \"zh-cn\": \"\u65E0\u529F\u7535\u6D41\",\n },\n reactiveCurrentL1: {\n en: \"Reactive current L1\",\n de: \"Blindstrom L1\",\n ru: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0439 \u0442\u043E\u043A L1\",\n pt: \"Corrente reativa L1\",\n nl: \"Blindstroom L1\",\n fr: \"Courant r\u00E9actif L1\",\n it: \"Corrente reattiva L1\",\n es: \"Corriente reactiva L1\",\n pl: \"Pr\u0105d bierny L1\",\n uk: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u0438\u0439 \u0441\u0442\u0440\u0443\u043C L1\",\n \"zh-cn\": \"L1 \u65E0\u529F\u7535\u6D41\",\n },\n reactiveCurrentL2: {\n en: \"Reactive current L2\",\n de: \"Blindstrom L2\",\n ru: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0439 \u0442\u043E\u043A L2\",\n pt: \"Corrente reativa L2\",\n nl: \"Blindstroom L2\",\n fr: \"Courant r\u00E9actif L2\",\n it: \"Corrente reattiva L2\",\n es: \"Corriente reactiva L2\",\n pl: \"Pr\u0105d bierny L2\",\n uk: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u0438\u0439 \u0441\u0442\u0440\u0443\u043C L2\",\n \"zh-cn\": \"L2 \u65E0\u529F\u7535\u6D41\",\n },\n reactiveCurrentL3: {\n en: \"Reactive current L3\",\n de: \"Blindstrom L3\",\n ru: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0439 \u0442\u043E\u043A L3\",\n pt: \"Corrente reativa L3\",\n nl: \"Blindstroom L3\",\n fr: \"Courant r\u00E9actif L3\",\n it: \"Corrente reattiva L3\",\n es: \"Corriente reactiva L3\",\n pl: \"Pr\u0105d bierny L3\",\n uk: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u0438\u0439 \u0441\u0442\u0440\u0443\u043C L3\",\n \"zh-cn\": \"L3 \u65E0\u529F\u7535\u6D41\",\n },\n apparentPower: {\n en: \"Apparent power\",\n de: \"Scheinleistung\",\n ru: \"\u041F\u043E\u043B\u043D\u0430\u044F \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u044C\",\n pt: \"Pot\u00EAncia aparente\",\n nl: \"Schijnbaar vermogen\",\n fr: \"Puissance apparente\",\n it: \"Potenza apparente\",\n es: \"Potencia aparente\",\n pl: \"Moc pozorna\",\n uk: \"\u041F\u043E\u0432\u043D\u0430 \u043F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C\",\n \"zh-cn\": \"\u89C6\u5728\u529F\u7387\",\n },\n apparentPowerL1: {\n en: \"Apparent power L1\",\n de: \"Scheinleistung L1\",\n ru: \"\u041F\u043E\u043B\u043D\u0430\u044F \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u044C L1\",\n pt: \"Pot\u00EAncia aparente L1\",\n nl: \"Schijnbaar vermogen L1\",\n fr: \"Puissance apparente L1\",\n it: \"Potenza apparente L1\",\n es: \"Potencia aparente L1\",\n pl: \"Moc pozorna L1\",\n uk: \"\u041F\u043E\u0432\u043D\u0430 \u043F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C L1\",\n \"zh-cn\": \"L1 \u89C6\u5728\u529F\u7387\",\n },\n apparentPowerL2: {\n en: \"Apparent power L2\",\n de: \"Scheinleistung L2\",\n ru: \"\u041F\u043E\u043B\u043D\u0430\u044F \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u044C L2\",\n pt: \"Pot\u00EAncia aparente L2\",\n nl: \"Schijnbaar vermogen L2\",\n fr: \"Puissance apparente L2\",\n it: \"Potenza apparente L2\",\n es: \"Potencia aparente L2\",\n pl: \"Moc pozorna L2\",\n uk: \"\u041F\u043E\u0432\u043D\u0430 \u043F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C L2\",\n \"zh-cn\": \"L2 \u89C6\u5728\u529F\u7387\",\n },\n apparentPowerL3: {\n en: \"Apparent power L3\",\n de: \"Scheinleistung L3\",\n ru: \"\u041F\u043E\u043B\u043D\u0430\u044F \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u044C L3\",\n pt: \"Pot\u00EAncia aparente L3\",\n nl: \"Schijnbaar vermogen L3\",\n fr: \"Puissance apparente L3\",\n it: \"Potenza apparente L3\",\n es: \"Potencia aparente L3\",\n pl: \"Moc pozorna L3\",\n uk: \"\u041F\u043E\u0432\u043D\u0430 \u043F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C L3\",\n \"zh-cn\": \"L3 \u89C6\u5728\u529F\u7387\",\n },\n reactivePower: {\n en: \"Reactive power\",\n de: \"Blindleistung\",\n ru: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u0430\u044F \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u044C\",\n pt: \"Pot\u00EAncia reativa\",\n nl: \"Blindvermogen\",\n fr: \"Puissance r\u00E9active\",\n it: \"Potenza reattiva\",\n es: \"Potencia reactiva\",\n pl: \"Moc bierna\",\n uk: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u0430 \u043F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C\",\n \"zh-cn\": \"\u65E0\u529F\u529F\u7387\",\n },\n reactivePowerL1: {\n en: \"Reactive power L1\",\n de: \"Blindleistung L1\",\n ru: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u0430\u044F \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u044C L1\",\n pt: \"Pot\u00EAncia reativa L1\",\n nl: \"Blindvermogen L1\",\n fr: \"Puissance r\u00E9active L1\",\n it: \"Potenza reattiva L1\",\n es: \"Potencia reactiva L1\",\n pl: \"Moc bierna L1\",\n uk: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u0430 \u043F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C L1\",\n \"zh-cn\": \"L1 \u65E0\u529F\u529F\u7387\",\n },\n reactivePowerL2: {\n en: \"Reactive power L2\",\n de: \"Blindleistung L2\",\n ru: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u0430\u044F \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u044C L2\",\n pt: \"Pot\u00EAncia reativa L2\",\n nl: \"Blindvermogen L2\",\n fr: \"Puissance r\u00E9active L2\",\n it: \"Potenza reattiva L2\",\n es: \"Potencia reactiva L2\",\n pl: \"Moc bierna L2\",\n uk: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u0430 \u043F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C L2\",\n \"zh-cn\": \"L2 \u65E0\u529F\u529F\u7387\",\n },\n reactivePowerL3: {\n en: \"Reactive power L3\",\n de: \"Blindleistung L3\",\n ru: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u0430\u044F \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u044C L3\",\n pt: \"Pot\u00EAncia reativa L3\",\n nl: \"Blindvermogen L3\",\n fr: \"Puissance r\u00E9active L3\",\n it: \"Potenza reattiva L3\",\n es: \"Potencia reactiva L3\",\n pl: \"Moc bierna L3\",\n uk: \"\u0420\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u0430 \u043F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044C L3\",\n \"zh-cn\": \"L3 \u65E0\u529F\u529F\u7387\",\n },\n powerFactor: {\n en: \"Power factor\",\n de: \"Leistungsfaktor\",\n ru: \"\u041A\u043E\u044D\u0444\u0444\u0438\u0446\u0438\u0435\u043D\u0442 \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u0438\",\n pt: \"Fator de pot\u00EAncia\",\n nl: \"Vermogensfactor\",\n fr: \"Facteur de puissance\",\n it: \"Fattore di potenza\",\n es: \"Factor de potencia\",\n pl: \"Wsp\u00F3\u0142czynnik mocy\",\n uk: \"\u041A\u043E\u0435\u0444\u0456\u0446\u0456\u0454\u043D\u0442 \u043F\u043E\u0442\u0443\u0436\u043D\u043E\u0441\u0442\u0456\",\n \"zh-cn\": \"\u529F\u7387\u56E0\u6570\",\n },\n powerFactorL1: {\n en: \"Power factor L1\",\n de: \"Leistungsfaktor L1\",\n ru: \"\u041A\u043E\u044D\u0444\u0444\u0438\u0446\u0438\u0435\u043D\u0442 \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u0438 L1\",\n pt: \"Fator de pot\u00EAncia L1\",\n nl: \"Vermogensfactor L1\",\n fr: \"Facteur de puissance L1\",\n it: \"Fattore di potenza L1\",\n es: \"Factor de potencia L1\",\n pl: \"Wsp\u00F3\u0142czynnik mocy L1\",\n uk: \"\u041A\u043E\u0435\u0444\u0456\u0446\u0456\u0454\u043D\u0442 \u043F\u043E\u0442\u0443\u0436\u043D\u043E\u0441\u0442\u0456 L1\",\n \"zh-cn\": \"L1 \u529F\u7387\u56E0\u6570\",\n },\n powerFactorL2: {\n en: \"Power factor L2\",\n de: \"Leistungsfaktor L2\",\n ru: \"\u041A\u043E\u044D\u0444\u0444\u0438\u0446\u0438\u0435\u043D\u0442 \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u0438 L2\",\n pt: \"Fator de pot\u00EAncia L2\",\n nl: \"Vermogensfactor L2\",\n fr: \"Facteur de puissance L2\",\n it: \"Fattore di potenza L2\",\n es: \"Factor de potencia L2\",\n pl: \"Wsp\u00F3\u0142czynnik mocy L2\",\n uk: \"\u041A\u043E\u0435\u0444\u0456\u0446\u0456\u0454\u043D\u0442 \u043F\u043E\u0442\u0443\u0436\u043D\u043E\u0441\u0442\u0456 L2\",\n \"zh-cn\": \"L2 \u529F\u7387\u56E0\u6570\",\n },\n powerFactorL3: {\n en: \"Power factor L3\",\n de: \"Leistungsfaktor L3\",\n ru: \"\u041A\u043E\u044D\u0444\u0444\u0438\u0446\u0438\u0435\u043D\u0442 \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u0438 L3\",\n pt: \"Fator de pot\u00EAncia L3\",\n nl: \"Vermogensfactor L3\",\n fr: \"Facteur de puissance L3\",\n it: \"Fattore di potenza L3\",\n es: \"Factor de potencia L3\",\n pl: \"Wsp\u00F3\u0142czynnik mocy L3\",\n uk: \"\u041A\u043E\u0435\u0444\u0456\u0446\u0456\u0454\u043D\u0442 \u043F\u043E\u0442\u0443\u0436\u043D\u043E\u0441\u0442\u0456 L3\",\n \"zh-cn\": \"L3 \u529F\u7387\u56E0\u6570\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Battery measurement \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n stateOfCharge: {\n en: \"State of charge\",\n de: \"Ladezustand\",\n ru: \"\u0423\u0440\u043E\u0432\u0435\u043D\u044C \u0437\u0430\u0440\u044F\u0434\u0430\",\n pt: \"Estado de carga\",\n nl: \"Laadstatus\",\n fr: \"\u00C9tat de charge\",\n it: \"Stato di carica\",\n es: \"Estado de carga\",\n pl: \"Stan na\u0142adowania\",\n uk: \"\u0420\u0456\u0432\u0435\u043D\u044C \u0437\u0430\u0440\u044F\u0434\u0443\",\n \"zh-cn\": \"\u7535\u91CF\u72B6\u6001\",\n },\n cycles: {\n en: \"Charge cycles\",\n de: \"Ladezyklen\",\n ru: \"\u0426\u0438\u043A\u043B\u044B \u0437\u0430\u0440\u044F\u0434\u0430\",\n pt: \"Ciclos de carga\",\n nl: \"Laadcycli\",\n fr: \"Cycles de charge\",\n it: \"Cicli di carica\",\n es: \"Ciclos de carga\",\n pl: \"Cykle \u0142adowania\",\n uk: \"\u0426\u0438\u043A\u043B\u0438 \u0437\u0430\u0440\u044F\u0434\u0436\u0430\u043D\u043D\u044F\",\n \"zh-cn\": \"\u5145\u7535\u5FAA\u73AF\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Metadata \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n meterModel: {\n en: \"Meter model\",\n de: \"Z\u00E4hlertyp\",\n ru: \"\u041C\u043E\u0434\u0435\u043B\u044C \u0441\u0447\u0451\u0442\u0447\u0438\u043A\u0430\",\n pt: \"Modelo do contador\",\n nl: \"Metermodel\",\n fr: \"Mod\u00E8le de compteur\",\n it: \"Modello del contatore\",\n es: \"Modelo del medidor\",\n pl: \"Model licznika\",\n uk: \"\u041C\u043E\u0434\u0435\u043B\u044C \u043B\u0456\u0447\u0438\u043B\u044C\u043D\u0438\u043A\u0430\",\n \"zh-cn\": \"\u7535\u8868\u578B\u53F7\",\n },\n measurementTimestamp: {\n en: \"Measurement timestamp\",\n de: \"Mess-Zeitstempel\",\n ru: \"\u041C\u0435\u0442\u043A\u0430 \u0432\u0440\u0435\u043C\u0435\u043D\u0438 \u0438\u0437\u043C\u0435\u0440\u0435\u043D\u0438\u044F\",\n pt: \"Carimbo de hora da medi\u00E7\u00E3o\",\n nl: \"Meettijdstempel\",\n fr: \"Horodatage de la mesure\",\n it: \"Timestamp della misurazione\",\n es: \"Marca de tiempo de la medici\u00F3n\",\n pl: \"Znacznik czasu pomiaru\",\n uk: \"\u041C\u0456\u0442\u043A\u0430 \u0447\u0430\u0441\u0443 \u0432\u0438\u043C\u0456\u0440\u044E\u0432\u0430\u043D\u043D\u044F\",\n \"zh-cn\": \"\u6D4B\u91CF\u65F6\u95F4\u6233\",\n },\n};\n\n/** State descriptions (`common.desc`) \u2014 only for non-obvious states. */\nexport const STATE_DESCS: Record<string, StateName> = {\n voltageSag: {\n en: \"Number of voltage sag events (voltage dropped below the meter's threshold)\",\n de: \"Anzahl Spannungseinbr\u00FCche (Spannung unter Schwellwert des Z\u00E4hlers gefallen)\",\n ru: \"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043F\u0440\u043E\u0432\u0430\u043B\u043E\u0432 \u043D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u044F (\u043D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u0435 \u043D\u0438\u0436\u0435 \u043F\u043E\u0440\u043E\u0433\u0430 \u0441\u0447\u0451\u0442\u0447\u0438\u043A\u0430)\",\n pt: \"N\u00FAmero de quedas de tens\u00E3o (tens\u00E3o abaixo do limite do contador)\",\n nl: \"Aantal spanningsdips (spanning onder drempel van de meter)\",\n fr: \"Nombre de creux de tension (tension descendue sous le seuil du compteur)\",\n it: \"Numero di cali di tensione (tensione scesa sotto la soglia del contatore)\",\n es: \"N\u00FAmero de ca\u00EDdas de tensi\u00F3n (tensi\u00F3n por debajo del umbral del medidor)\",\n pl: \"Liczba zapad\u00F3w napi\u0119cia (napi\u0119cie poni\u017Cej progu licznika)\",\n uk: \"\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u043F\u0440\u043E\u0432\u0430\u043B\u0456\u0432 \u043D\u0430\u043F\u0440\u0443\u0433\u0438 (\u043D\u0430\u043F\u0440\u0443\u0433\u0430 \u043D\u0438\u0436\u0447\u0435 \u043F\u043E\u0440\u043E\u0433\u0443 \u043B\u0456\u0447\u0438\u043B\u044C\u043D\u0438\u043A\u0430)\",\n \"zh-cn\": \"\u7535\u538B\u9AA4\u964D\u6B21\u6570\uFF08\u7535\u538B\u4F4E\u4E8E\u7535\u8868\u9608\u503C\uFF09\",\n },\n voltageSwell: {\n en: \"Number of voltage swell events (voltage exceeded the meter's threshold)\",\n de: \"Anzahl Spannungserh\u00F6hungen (Spannung \u00FCber Schwellwert des Z\u00E4hlers)\",\n ru: \"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0441\u043A\u0430\u0447\u043A\u043E\u0432 \u043D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u044F (\u043D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u0435 \u0432\u044B\u0448\u0435 \u043F\u043E\u0440\u043E\u0433\u0430 \u0441\u0447\u0451\u0442\u0447\u0438\u043A\u0430)\",\n pt: \"N\u00FAmero de picos de tens\u00E3o (tens\u00E3o acima do limite do contador)\",\n nl: \"Aantal spanningspieken (spanning boven drempel van de meter)\",\n fr: \"Nombre de surtensions (tension sup\u00E9rieure au seuil du compteur)\",\n it: \"Numero di picchi di tensione (tensione oltre la soglia del contatore)\",\n es: \"N\u00FAmero de picos de tensi\u00F3n (tensi\u00F3n por encima del umbral del medidor)\",\n pl: \"Liczba przepi\u0119\u0107 (napi\u0119cie powy\u017Cej progu licznika)\",\n uk: \"\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u0441\u043F\u043B\u0435\u0441\u043A\u0456\u0432 \u043D\u0430\u043F\u0440\u0443\u0433\u0438 (\u043D\u0430\u043F\u0440\u0443\u0433\u0430 \u0432\u0438\u0449\u0435 \u043F\u043E\u0440\u043E\u0433\u0443 \u043B\u0456\u0447\u0438\u043B\u044C\u043D\u0438\u043A\u0430)\",\n \"zh-cn\": \"\u7535\u538B\u9AA4\u5347\u6B21\u6570\uFF08\u7535\u538B\u8D85\u8FC7\u7535\u8868\u9608\u503C\uFF09\",\n },\n powerFailCountDesc: {\n en: \"Total number of grid power outages recorded by the meter\",\n de: \"Gesamtzahl der vom Z\u00E4hler erfassten Stromausf\u00E4lle\",\n ru: \"\u041E\u0431\u0449\u0435\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0439 \u0441\u0435\u0442\u0438, \u0437\u0430\u0444\u0438\u043A\u0441\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0445 \u0441\u0447\u0451\u0442\u0447\u0438\u043A\u043E\u043C\",\n pt: \"N\u00FAmero total de cortes de energia registados pelo contador\",\n nl: \"Totaal aantal door de meter geregistreerde stroomuitvallen\",\n fr: \"Nombre total de coupures de courant enregistr\u00E9es par le compteur\",\n it: \"Numero totale di interruzioni di rete registrate dal contatore\",\n es: \"N\u00FAmero total de cortes de red registrados por el medidor\",\n pl: \"\u0141\u0105czna liczba awarii sieci zarejestrowanych przez licznik\",\n uk: \"\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0430 \u043A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u0432\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u044C \u043C\u0435\u0440\u0435\u0436\u0456, \u0437\u0430\u0444\u0456\u043A\u0441\u043E\u0432\u0430\u043D\u0438\u0445 \u043B\u0456\u0447\u0438\u043B\u044C\u043D\u0438\u043A\u043E\u043C\",\n \"zh-cn\": \"\u7535\u8868\u8BB0\u5F55\u7684\u7535\u7F51\u65AD\u7535\u603B\u6B21\u6570\",\n },\n longPowerFailCountDesc: {\n en: \"Number of long power outages (typically > 3 minutes)\",\n de: \"Anzahl langer Stromausf\u00E4lle (in der Regel > 3 Minuten)\",\n ru: \"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0434\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0439 (\u043E\u0431\u044B\u0447\u043D\u043E > 3 \u043C\u0438\u043D\u0443\u0442)\",\n pt: \"N\u00FAmero de cortes longos de energia (tipicamente > 3 minutos)\",\n nl: \"Aantal lange stroomuitvallen (doorgaans > 3 minuten)\",\n fr: \"Nombre de longues coupures de courant (typiquement > 3 minutes)\",\n it: \"Numero di lunghe interruzioni (tipicamente > 3 minuti)\",\n es: \"N\u00FAmero de cortes largos (generalmente > 3 minutos)\",\n pl: \"Liczba d\u0142ugich awarii (typowo > 3 minuty)\",\n uk: \"\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u0442\u0440\u0438\u0432\u0430\u043B\u0438\u0445 \u0432\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u044C (\u0437\u0430\u0437\u0432\u0438\u0447\u0430\u0439 > 3 \u0445\u0432\u0438\u043B\u0438\u043D)\",\n \"zh-cn\": \"\u957F\u65F6\u95F4\u65AD\u7535\u6B21\u6570\uFF08\u901A\u5E38\u8D85\u8FC7 3 \u5206\u949F\uFF09\",\n },\n belgiumCapacityTariff: {\n en: \"Belgian capacity tariff: 15-minute average and monthly peak (drives demand-based billing)\",\n de: \"Belgischer Kapazit\u00E4tstarif: 15-Minuten-Mittel und Monatsspitze (Grundlage f\u00FCr leistungsabh\u00E4ngige Abrechnung)\",\n ru: \"\u0411\u0435\u043B\u044C\u0433\u0438\u0439\u0441\u043A\u0438\u0439 \u0442\u0430\u0440\u0438\u0444 \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u0438: 15-\u043C\u0438\u043D\u0443\u0442\u043D\u043E\u0435 \u0441\u0440\u0435\u0434\u043D\u0435\u0435 \u0438 \u043C\u0435\u0441\u044F\u0447\u043D\u044B\u0439 \u043F\u0438\u043A (\u0434\u043B\u044F \u0440\u0430\u0441\u0447\u0451\u0442\u0430 \u043F\u043E \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u0438)\",\n pt: \"Tarifa de capacidade belga: m\u00E9dia de 15 min e pico mensal (fatura\u00E7\u00E3o por demanda)\",\n nl: \"Belgisch capaciteitstarief: 15-minuten-gemiddelde en maandpiek (vraaggebaseerde facturering)\",\n fr: \"Tarif de capacit\u00E9 belge : moyenne sur 15 min et pic mensuel (facturation \u00E0 la puissance)\",\n it: \"Tariffa di capacit\u00E0 belga: media 15 min e picco mensile (fatturazione su domanda)\",\n es: \"Tarifa de capacidad belga: promedio 15 min y pico mensual (facturaci\u00F3n por demanda)\",\n pl: \"Belgijska taryfa mocy: \u015Brednia 15-minutowa i szczyt miesi\u0119czny (rozliczenie wg mocy)\",\n uk: \"\u0411\u0435\u043B\u044C\u0433\u0456\u0439\u0441\u044C\u043A\u0438\u0439 \u0442\u0430\u0440\u0438\u0444 \u043F\u043E\u0442\u0443\u0436\u043D\u043E\u0441\u0442\u0456: 15-\u0445\u0432\u0438\u043B\u0438\u043D\u043D\u0435 \u0441\u0435\u0440\u0435\u0434\u043D\u0454 \u0442\u0430 \u043C\u0456\u0441\u044F\u0447\u043D\u0438\u0439 \u043F\u0456\u043A (\u0440\u043E\u0437\u0440\u0430\u0445\u0443\u043D\u043E\u043A \u0437\u0430 \u043F\u043E\u0442\u0443\u0436\u043D\u0456\u0441\u0442\u044E)\",\n \"zh-cn\": \"\u6BD4\u5229\u65F6\u5BB9\u91CF\u7535\u4EF7\uFF1A15 \u5206\u949F\u5E73\u5747\u4E0E\u6708\u5EA6\u5CF0\u503C\uFF08\u6309\u9700\u6C42\u8BA1\u8D39\uFF09\",\n },\n powerFactorDesc: {\n en: \"Ratio of active to apparent power (range -1.0 to +1.0; 1.0 = purely resistive load)\",\n de: \"Verh\u00E4ltnis Wirkleistung zu Scheinleistung (-1.0 bis +1.0; 1.0 = rein ohmsche Last)\",\n ru: \"\u041E\u0442\u043D\u043E\u0448\u0435\u043D\u0438\u0435 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0439 \u043C\u043E\u0449\u043D\u043E\u0441\u0442\u0438 \u043A \u043F\u043E\u043B\u043D\u043E\u0439 (\u043E\u0442 -1.0 \u0434\u043E +1.0; 1.0 = \u0447\u0438\u0441\u0442\u043E \u0440\u0435\u0437\u0438\u0441\u0442\u0438\u0432\u043D\u0430\u044F \u043D\u0430\u0433\u0440\u0443\u0437\u043A\u0430)\",\n pt: \"Raz\u00E3o entre pot\u00EAncia ativa e aparente (-1.0 a +1.0; 1.0 = carga puramente resistiva)\",\n nl: \"Verhouding actief tot schijnbaar vermogen (-1,0 tot +1,0; 1,0 = puur resistieve belasting)\",\n fr: \"Rapport puissance active/apparente (-1,0 \u00E0 +1,0 ; 1,0 = charge purement r\u00E9sistive)\",\n it: \"Rapporto tra potenza attiva e apparente (-1,0 a +1,0; 1,0 = carico puramente resistivo)\",\n es: \"Relaci\u00F3n entre potencia activa y aparente (-1,0 a +1,0; 1,0 = carga puramente resistiva)\",\n pl: \"Stosunek mocy czynnej do pozornej (-1,0 do +1,0; 1,0 = obci\u0105\u017Cenie czysto rezystancyjne)\",\n uk: \"\u0412\u0456\u0434\u043D\u043E\u0448\u0435\u043D\u043D\u044F \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0457 \u0434\u043E \u043F\u043E\u0432\u043D\u043E\u0457 \u043F\u043E\u0442\u0443\u0436\u043D\u043E\u0441\u0442\u0456 (-1,0 \u0434\u043E +1,0; 1,0 = \u0447\u0438\u0441\u0442\u043E \u0430\u043A\u0442\u0438\u0432\u043D\u0435 \u043D\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F)\",\n \"zh-cn\": \"\u6709\u529F\u529F\u7387\u4E0E\u89C6\u5728\u529F\u7387\u4E4B\u6BD4\uFF08-1.0 \u81F3 +1.0\uFF1B1.0 = \u7EAF\u963B\u6027\u8D1F\u8F7D\uFF09\",\n },\n batteryModeDesc: {\n en: \"Operating mode: zero (no grid feed-in), to_full (charge to maximum), standby\",\n de: \"Betriebsmodus: zero (keine Netzeinspeisung), to_full (auf Maximum laden), standby\",\n ru: \"\u0420\u0435\u0436\u0438\u043C \u0440\u0430\u0431\u043E\u0442\u044B: zero (\u0431\u0435\u0437 \u043F\u043E\u0434\u0430\u0447\u0438 \u0432 \u0441\u0435\u0442\u044C), to_full (\u0437\u0430\u0440\u044F\u0434 \u0434\u043E \u043C\u0430\u043A\u0441\u0438\u043C\u0443\u043C\u0430), standby\",\n pt: \"Modo de opera\u00E7\u00E3o: zero (sem inje\u00E7\u00E3o na rede), to_full (carregar ao m\u00E1ximo), standby\",\n nl: \"Bedrijfsmodus: zero (geen netinvoeding), to_full (volledig laden), standby\",\n fr: \"Mode de fonctionnement : zero (aucune injection au r\u00E9seau), to_full (charge maximale), standby\",\n it: \"Modalit\u00E0 operativa: zero (nessuna immissione in rete), to_full (carica al massimo), standby\",\n es: \"Modo de operaci\u00F3n: zero (sin inyecci\u00F3n a red), to_full (cargar al m\u00E1ximo), standby\",\n pl: \"Tryb pracy: zero (bez oddawania do sieci), to_full (\u0142aduj do pe\u0142na), standby\",\n uk: \"\u0420\u0435\u0436\u0438\u043C \u0440\u043E\u0431\u043E\u0442\u0438: zero (\u0431\u0435\u0437 \u043F\u043E\u0434\u0430\u0447\u0456 \u0432 \u043C\u0435\u0440\u0435\u0436\u0443), to_full (\u0437\u0430\u0440\u044F\u0434 \u0434\u043E \u043C\u0430\u043A\u0441\u0438\u043C\u0443\u043C\u0443), standby\",\n \"zh-cn\": \"\u8FD0\u884C\u6A21\u5F0F\uFF1Azero\uFF08\u4E0D\u5411\u7535\u7F51\u9988\u9001\uFF09\u3001to_full\uFF08\u5145\u6EE1\uFF09\u3001standby\uFF08\u5F85\u673A\uFF09\",\n },\n startPairingDesc: {\n en: \"Set to true to start mDNS discovery and pair a new HomeWizard device (60-second window)\",\n de: \"Auf true setzen, um die mDNS-Suche zu starten und ein neues HomeWizard-Ger\u00E4t zu koppeln (60 Sekunden Zeitfenster)\",\n ru: \"\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0435 true, \u0447\u0442\u043E\u0431\u044B \u043D\u0430\u0447\u0430\u0442\u044C \u043F\u043E\u0438\u0441\u043A \u0447\u0435\u0440\u0435\u0437 mDNS \u0438 \u0441\u043E\u043F\u0440\u044F\u0447\u044C \u043D\u043E\u0432\u043E\u0435 \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E HomeWizard (\u043E\u043A\u043D\u043E 60 \u0441\u0435\u043A\u0443\u043D\u0434)\",\n pt: \"Defina como true para iniciar a dete\u00E7\u00E3o mDNS e emparelhar um novo dispositivo HomeWizard (janela de 60 segundos)\",\n nl: \"Zet op true om mDNS-detectie te starten en een nieuw HomeWizard-apparaat te koppelen (60 seconden venster)\",\n fr: \"Mettez \u00E0 true pour d\u00E9marrer la d\u00E9tection mDNS et appairer un nouvel appareil HomeWizard (fen\u00EAtre de 60 secondes)\",\n it: \"Imposta su true per avviare la rilevazione mDNS e accoppiare un nuovo dispositivo HomeWizard (finestra di 60 secondi)\",\n es: \"Establece en true para iniciar la detecci\u00F3n mDNS y emparejar un nuevo dispositivo HomeWizard (ventana de 60 segundos)\",\n pl: \"Ustaw na true, aby uruchomi\u0107 wykrywanie mDNS i sparowa\u0107 nowe urz\u0105dzenie HomeWizard (okno 60 sekund)\",\n uk: \"\u0412\u0441\u0442\u0430\u043D\u043E\u0432\u0456\u0442\u044C true, \u0449\u043E\u0431 \u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u0438 \u043F\u043E\u0448\u0443\u043A \u0447\u0435\u0440\u0435\u0437 mDNS \u0456 \u0432\u0438\u043A\u043E\u043D\u0430\u0442\u0438 \u0441\u043F\u043E\u043B\u0443\u0447\u0435\u043D\u043D\u044F \u043D\u043E\u0432\u043E\u0433\u043E \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u044E HomeWizard (\u0432\u0456\u043A\u043D\u043E 60 \u0441\u0435\u043A\u0443\u043D\u0434)\",\n \"zh-cn\": \"\u8BBE\u7F6E\u4E3A true \u4EE5\u542F\u52A8 mDNS \u53D1\u73B0\u5E76\u914D\u5BF9\u65B0\u7684 HomeWizard \u8BBE\u5907\uFF0860 \u79D2\u7A97\u53E3\uFF09\",\n },\n removeDeviceDesc: {\n en: \"Set to true to disconnect, delete and remove this device permanently\",\n de: \"Auf true setzen, um dieses Ger\u00E4t zu trennen, alle Daten zu l\u00F6schen und dauerhaft zu entfernen\",\n ru: \"\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0435 true, \u0447\u0442\u043E\u0431\u044B \u043E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C, \u0443\u0434\u0430\u043B\u0438\u0442\u044C \u0438 \u043D\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u0431\u0440\u0430\u0442\u044C \u044D\u0442\u043E \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E\",\n pt: \"Defina como true para desconectar, eliminar e remover permanentemente este dispositivo\",\n nl: \"Zet op true om dit apparaat te ontkoppelen, te verwijderen en permanent te wissen\",\n fr: \"Mettez \u00E0 true pour d\u00E9connecter, supprimer et retirer d\u00E9finitivement cet appareil\",\n it: \"Imposta su true per disconnettere, eliminare e rimuovere definitivamente questo dispositivo\",\n es: \"Establece en true para desconectar, borrar y eliminar permanentemente este dispositivo\",\n pl: \"Ustaw na true, aby roz\u0142\u0105czy\u0107, usun\u0105\u0107 i trwale wyrejestrowa\u0107 to urz\u0105dzenie\",\n uk: \"\u0412\u0441\u0442\u0430\u043D\u043E\u0432\u0456\u0442\u044C true, \u0449\u043E\u0431 \u0432\u0456\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u0438, \u0432\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u0456 \u043E\u0441\u0442\u0430\u0442\u043E\u0447\u043D\u043E \u043F\u0440\u0438\u0431\u0440\u0430\u0442\u0438 \u0446\u0435\u0439 \u043F\u0440\u0438\u0441\u0442\u0440\u0456\u0439\",\n \"zh-cn\": \"\u8BBE\u7F6E\u4E3A true \u4EE5\u65AD\u5F00\u3001\u5220\u9664\u5E76\u6C38\u4E45\u79FB\u9664\u6B64\u8BBE\u5907\",\n },\n};\n\n/**\n * Dropdown labels.\n *\n * **Do NOT pass `tLabel(key)` directly into `common.states` VALUES** \u2014 Admin\n * renders states-values as React children, and a `{en, de, \u2026}` translation\n * object triggers React Error #31 \u2192 fatal \"Error in GUI\" on dropdown open.\n *\n * For `common.states` use {@link resolveLabel} instead (plain-string with\n * EN-fallback resolved in `system.config.language` once at adapter start).\n *\n * `common.name` and `common.desc` accept translation objects (Admin/vis\n * lookup automatically). Only `common.states` VALUES need plain-string.\n */\nexport const STATE_LABELS: Record<string, StateName> = {\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Tariff (1-4) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n tariff1: {\n en: \"Tariff 1 (T1)\",\n de: \"Tarif 1 (T1)\",\n ru: \"\u0422\u0430\u0440\u0438\u0444 1 (T1)\",\n pt: \"Tarifa 1 (T1)\",\n nl: \"Tarief 1 (T1)\",\n fr: \"Tarif 1 (T1)\",\n it: \"Tariffa 1 (T1)\",\n es: \"Tarifa 1 (T1)\",\n pl: \"Taryfa 1 (T1)\",\n uk: \"\u0422\u0430\u0440\u0438\u0444 1 (T1)\",\n \"zh-cn\": \"\u7535\u4EF7 1\uFF08T1\uFF09\",\n },\n tariff2: {\n en: \"Tariff 2 (T2)\",\n de: \"Tarif 2 (T2)\",\n ru: \"\u0422\u0430\u0440\u0438\u0444 2 (T2)\",\n pt: \"Tarifa 2 (T2)\",\n nl: \"Tarief 2 (T2)\",\n fr: \"Tarif 2 (T2)\",\n it: \"Tariffa 2 (T2)\",\n es: \"Tarifa 2 (T2)\",\n pl: \"Taryfa 2 (T2)\",\n uk: \"\u0422\u0430\u0440\u0438\u0444 2 (T2)\",\n \"zh-cn\": \"\u7535\u4EF7 2\uFF08T2\uFF09\",\n },\n tariff3: {\n en: \"Tariff 3 (T3)\",\n de: \"Tarif 3 (T3)\",\n ru: \"\u0422\u0430\u0440\u0438\u0444 3 (T3)\",\n pt: \"Tarifa 3 (T3)\",\n nl: \"Tarief 3 (T3)\",\n fr: \"Tarif 3 (T3)\",\n it: \"Tariffa 3 (T3)\",\n es: \"Tarifa 3 (T3)\",\n pl: \"Taryfa 3 (T3)\",\n uk: \"\u0422\u0430\u0440\u0438\u0444 3 (T3)\",\n \"zh-cn\": \"\u7535\u4EF7 3\uFF08T3\uFF09\",\n },\n tariff4: {\n en: \"Tariff 4 (T4)\",\n de: \"Tarif 4 (T4)\",\n ru: \"\u0422\u0430\u0440\u0438\u0444 4 (T4)\",\n pt: \"Tarifa 4 (T4)\",\n nl: \"Tarief 4 (T4)\",\n fr: \"Tarif 4 (T4)\",\n it: \"Tariffa 4 (T4)\",\n es: \"Tarifa 4 (T4)\",\n pl: \"Taryfa 4 (T4)\",\n uk: \"\u0422\u0430\u0440\u0438\u0444 4 (T4)\",\n \"zh-cn\": \"\u7535\u4EF7 4\uFF08T4\uFF09\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Battery mode \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n modeZero: {\n en: \"Zero (no grid feed-in)\",\n de: \"Zero (keine Netzeinspeisung)\",\n ru: \"Zero (\u0431\u0435\u0437 \u043F\u043E\u0434\u0430\u0447\u0438 \u0432 \u0441\u0435\u0442\u044C)\",\n pt: \"Zero (sem inje\u00E7\u00E3o na rede)\",\n nl: \"Zero (geen netinvoeding)\",\n fr: \"Zero (sans injection au r\u00E9seau)\",\n it: \"Zero (senza immissione in rete)\",\n es: \"Zero (sin inyecci\u00F3n a red)\",\n pl: \"Zero (bez oddawania do sieci)\",\n uk: \"Zero (\u0431\u0435\u0437 \u043F\u043E\u0434\u0430\u0447\u0456 \u0432 \u043C\u0435\u0440\u0435\u0436\u0443)\",\n \"zh-cn\": \"Zero\uFF08\u4E0D\u5411\u7535\u7F51\u9988\u9001\uFF09\",\n },\n modeToFull: {\n en: \"To full (charge to maximum)\",\n de: \"To full (auf Maximum laden)\",\n ru: \"To full (\u0437\u0430\u0440\u044F\u0434 \u0434\u043E \u043C\u0430\u043A\u0441\u0438\u043C\u0443\u043C\u0430)\",\n pt: \"To full (carregar ao m\u00E1ximo)\",\n nl: \"To full (volledig laden)\",\n fr: \"To full (charge maximale)\",\n it: \"To full (carica al massimo)\",\n es: \"To full (cargar al m\u00E1ximo)\",\n pl: \"To full (\u0142aduj do pe\u0142na)\",\n uk: \"To full (\u0437\u0430\u0440\u044F\u0434 \u0434\u043E \u043C\u0430\u043A\u0441\u0438\u043C\u0443\u043C\u0443)\",\n \"zh-cn\": \"To full\uFF08\u5145\u6EE1\uFF09\",\n },\n modeStandby: {\n en: \"Standby\",\n de: \"Standby\",\n ru: \"Standby\",\n pt: \"Standby\",\n nl: \"Standby\",\n fr: \"Standby\",\n it: \"Standby\",\n es: \"Standby\",\n pl: \"Standby\",\n uk: \"Standby\",\n \"zh-cn\": \"\u5F85\u673A\",\n },\n};\n\n/**\n * Translation object for a state name. Pass into `common.name`; ioBroker\n * Admin/vis/Object-Browser localizes automatically.\n *\n * @param key Translation key in {@link STATE_NAMES}.\n */\nexport function tName(key: keyof typeof STATE_NAMES): StateName {\n return STATE_NAMES[key];\n}\n\n/**\n * Translation object for `common.desc`. Same lookup mechanism as `tName`.\n *\n * @param key Translation key in {@link STATE_DESCS}.\n */\nexport function tDesc(key: keyof typeof STATE_DESCS): StateName {\n return STATE_DESCS[key];\n}\n\n/**\n * Translation object for a dropdown label.\n *\n * **WARNING:** the return value is a translation object (`{en, de, \u2026}`) \u2014 it\n * MUST NOT be used directly as a `common.states` VALUE. Admin renders\n * states-values as React children and triggers React Error #31 on objects.\n * Use {@link resolveLabel} for `common.states`-VALUES.\n *\n * @param key Translation key in {@link STATE_LABELS}.\n */\nexport function tLabel(key: keyof typeof STATE_LABELS): StateName {\n return STATE_LABELS[key];\n}\n\n/**\n * Resolve a label to a plain-string in the given language with EN-fallback.\n * Use this for `common.states`-VALUES \u2014 Admin requires plain-string there.\n *\n * @param key Translation key in {@link STATE_LABELS}.\n * @param lang Two-letter ISO language code (e.g. `system.config.language`).\n * Falls back to `en` if the key is missing the requested language.\n */\nexport function resolveLabel(key: keyof typeof STATE_LABELS, lang: string): string {\n const obj = STATE_LABELS[key];\n if (typeof obj === \"string\") {\n return obj;\n }\n const dict = obj as unknown as Record<string, string>;\n return dict[lang] ?? dict.en ?? key;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -398,19 +398,19 @@ const MEASUREMENT_STATE_DEFS = [
|
|
|
398
398
|
function asName(name) {
|
|
399
399
|
return name;
|
|
400
400
|
}
|
|
401
|
-
function tariffStates() {
|
|
401
|
+
function tariffStates(lang) {
|
|
402
402
|
return {
|
|
403
|
-
1: (0, import_i18n_states.
|
|
404
|
-
2: (0, import_i18n_states.
|
|
405
|
-
3: (0, import_i18n_states.
|
|
406
|
-
4: (0, import_i18n_states.
|
|
403
|
+
1: (0, import_i18n_states.resolveLabel)("tariff1", lang),
|
|
404
|
+
2: (0, import_i18n_states.resolveLabel)("tariff2", lang),
|
|
405
|
+
3: (0, import_i18n_states.resolveLabel)("tariff3", lang),
|
|
406
|
+
4: (0, import_i18n_states.resolveLabel)("tariff4", lang)
|
|
407
407
|
};
|
|
408
408
|
}
|
|
409
|
-
function batteryModeStates() {
|
|
409
|
+
function batteryModeStates(lang) {
|
|
410
410
|
return {
|
|
411
|
-
zero: (0, import_i18n_states.
|
|
412
|
-
to_full: (0, import_i18n_states.
|
|
413
|
-
standby: (0, import_i18n_states.
|
|
411
|
+
zero: (0, import_i18n_states.resolveLabel)("modeZero", lang),
|
|
412
|
+
to_full: (0, import_i18n_states.resolveLabel)("modeToFull", lang),
|
|
413
|
+
standby: (0, import_i18n_states.resolveLabel)("modeStandby", lang)
|
|
414
414
|
};
|
|
415
415
|
}
|
|
416
416
|
class StateManager {
|
|
@@ -472,6 +472,7 @@ class StateManager {
|
|
|
472
472
|
* @param data Measurement data
|
|
473
473
|
*/
|
|
474
474
|
async updateMeasurement(config, data) {
|
|
475
|
+
var _a;
|
|
475
476
|
if (!(0, import_coerce.isPlainObject)(data)) {
|
|
476
477
|
return;
|
|
477
478
|
}
|
|
@@ -499,7 +500,7 @@ class StateManager {
|
|
|
499
500
|
def.unit,
|
|
500
501
|
void 0,
|
|
501
502
|
def.descKey ? (0, import_i18n_states.tDesc)(def.descKey) : void 0,
|
|
502
|
-
def.key === "tariff" ? tariffStates() : void 0
|
|
503
|
+
def.key === "tariff" ? tariffStates((_a = this.adapter.language) != null ? _a : "en") : void 0
|
|
503
504
|
)
|
|
504
505
|
);
|
|
505
506
|
}
|
|
@@ -607,6 +608,7 @@ class StateManager {
|
|
|
607
608
|
* @param battery Battery control data
|
|
608
609
|
*/
|
|
609
610
|
async updateBattery(config, battery) {
|
|
611
|
+
var _a;
|
|
610
612
|
if (!(0, import_coerce.isPlainObject)(battery)) {
|
|
611
613
|
return;
|
|
612
614
|
}
|
|
@@ -624,7 +626,7 @@ class StateManager {
|
|
|
624
626
|
void 0,
|
|
625
627
|
true,
|
|
626
628
|
(0, import_i18n_states.tDesc)("batteryModeDesc"),
|
|
627
|
-
batteryModeStates()
|
|
629
|
+
batteryModeStates((_a = this.adapter.language) != null ? _a : "en")
|
|
628
630
|
);
|
|
629
631
|
}
|
|
630
632
|
if (Array.isArray(record.permissions)) {
|
|
@@ -780,8 +782,40 @@ class StateManager {
|
|
|
780
782
|
common,
|
|
781
783
|
native: {}
|
|
782
784
|
});
|
|
785
|
+
if (states) {
|
|
786
|
+
await this.repairCommonStatesIfBuggy(id, states);
|
|
787
|
+
}
|
|
783
788
|
this.createdIds.add(id);
|
|
784
789
|
}
|
|
790
|
+
/**
|
|
791
|
+
* If the persisted object at `id` has `common.states` values that are not
|
|
792
|
+
* plain-string (= translation objects from older releases), replace
|
|
793
|
+
* `common.states` with the fresh map via `setObjectAsync`. Otherwise no-op.
|
|
794
|
+
*
|
|
795
|
+
* `extendObjectAsync` deep-merges and CANNOT replace an object-value with
|
|
796
|
+
* a string — only a full `setObjectAsync` replaces. Pattern proven in
|
|
797
|
+
* hassemu v1.27.2 (URL-dropdown) and v1.28.4 (mode-dropdown).
|
|
798
|
+
*
|
|
799
|
+
* @param id State ID to repair.
|
|
800
|
+
* @param fresh Plain-string `common.states` map to write.
|
|
801
|
+
*/
|
|
802
|
+
async repairCommonStatesIfBuggy(id, fresh) {
|
|
803
|
+
var _a;
|
|
804
|
+
const existing = await this.adapter.getObjectAsync(id);
|
|
805
|
+
if (!existing) {
|
|
806
|
+
return;
|
|
807
|
+
}
|
|
808
|
+
const states = (_a = existing.common) == null ? void 0 : _a.states;
|
|
809
|
+
if (!states || typeof states !== "object") {
|
|
810
|
+
return;
|
|
811
|
+
}
|
|
812
|
+
const buggy = Object.values(states).some((v) => typeof v !== "string");
|
|
813
|
+
if (!buggy) {
|
|
814
|
+
return;
|
|
815
|
+
}
|
|
816
|
+
existing.common = { ...existing.common, states: fresh };
|
|
817
|
+
await this.adapter.setObjectAsync(id, existing);
|
|
818
|
+
}
|
|
785
819
|
/**
|
|
786
820
|
* Create a button state (read: false, write: true) with initial value false
|
|
787
821
|
*
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/lib/state-manager.ts"],
|
|
4
|
-
"sourcesContent": ["import type * as utils from \"@iobroker/adapter-core\";\nimport { coerceBoolean, coerceFiniteNumber, coerceString, isPlainObject } from \"./coerce\";\nimport type { StateName, STATE_DESCS, STATE_NAMES } from \"./i18n-states\";\nimport { tDesc, tLabel, tName } from \"./i18n-states\";\nimport type { BatteryControl, DeviceConfig, Measurement, SystemInfo } from \"./types\";\n\n/** Measurement field to state definition mapping */\ninterface MeasurementStateDef {\n /** Measurement field key */\n key: string;\n /** ioBroker state ID suffix */\n id: string;\n /** Translation key for `common.name` (resolved via {@link tName}) */\n nameKey: keyof typeof STATE_NAMES;\n /** Optional translation key for `common.desc` (resolved via {@link tDesc}) */\n descKey?: keyof typeof STATE_DESCS;\n /** State value type */\n type: ioBroker.CommonType;\n /** ioBroker role */\n role: string;\n /** Unit string */\n unit?: string;\n}\n\n/**\n * Sanitize a string for use as ioBroker object ID (see adapter.FORBIDDEN_CHARS).\n *\n * @param str Raw string to sanitize\n */\nfunction sanitize(str: string): string {\n return str.replace(/[^a-zA-Z0-9_-]/g, \"_\").toLowerCase();\n}\n\nconst MEASUREMENT_STATE_DEFS: MeasurementStateDef[] = [\n // Power\n { key: \"power_w\", id: \"power_w\", nameKey: \"powerTotal\", type: \"number\", role: \"value.power\", unit: \"W\" },\n { key: \"power_l1_w\", id: \"power_l1_w\", nameKey: \"powerL1\", type: \"number\", role: \"value.power\", unit: \"W\" },\n { key: \"power_l2_w\", id: \"power_l2_w\", nameKey: \"powerL2\", type: \"number\", role: \"value.power\", unit: \"W\" },\n { key: \"power_l3_w\", id: \"power_l3_w\", nameKey: \"powerL3\", type: \"number\", role: \"value.power\", unit: \"W\" },\n // Voltage\n { key: \"voltage_v\", id: \"voltage_v\", nameKey: \"voltage\", type: \"number\", role: \"value.voltage\", unit: \"V\" },\n { key: \"voltage_l1_v\", id: \"voltage_l1_v\", nameKey: \"voltageL1\", type: \"number\", role: \"value.voltage\", unit: \"V\" },\n { key: \"voltage_l2_v\", id: \"voltage_l2_v\", nameKey: \"voltageL2\", type: \"number\", role: \"value.voltage\", unit: \"V\" },\n { key: \"voltage_l3_v\", id: \"voltage_l3_v\", nameKey: \"voltageL3\", type: \"number\", role: \"value.voltage\", unit: \"V\" },\n // Current\n { key: \"current_a\", id: \"current_a\", nameKey: \"current\", type: \"number\", role: \"value.current\", unit: \"A\" },\n { key: \"current_l1_a\", id: \"current_l1_a\", nameKey: \"currentL1\", type: \"number\", role: \"value.current\", unit: \"A\" },\n { key: \"current_l2_a\", id: \"current_l2_a\", nameKey: \"currentL2\", type: \"number\", role: \"value.current\", unit: \"A\" },\n { key: \"current_l3_a\", id: \"current_l3_a\", nameKey: \"currentL3\", type: \"number\", role: \"value.current\", unit: \"A\" },\n // Frequency\n { key: \"frequency_hz\", id: \"frequency_hz\", nameKey: \"frequency\", type: \"number\", role: \"value\", unit: \"Hz\" },\n // Energy import\n {\n key: \"energy_import_kwh\",\n id: \"energy_import_kwh\",\n nameKey: \"energyImportTotal\",\n type: \"number\",\n role: \"value.energy\",\n unit: \"kWh\",\n },\n {\n key: \"energy_import_t1_kwh\",\n id: \"energy_import_t1_kwh\",\n nameKey: \"energyImportT1\",\n type: \"number\",\n role: \"value.energy\",\n unit: \"kWh\",\n },\n {\n key: \"energy_import_t2_kwh\",\n id: \"energy_import_t2_kwh\",\n nameKey: \"energyImportT2\",\n type: \"number\",\n role: \"value.energy\",\n unit: \"kWh\",\n },\n {\n key: \"energy_import_t3_kwh\",\n id: \"energy_import_t3_kwh\",\n nameKey: \"energyImportT3\",\n type: \"number\",\n role: \"value.energy\",\n unit: \"kWh\",\n },\n {\n key: \"energy_import_t4_kwh\",\n id: \"energy_import_t4_kwh\",\n nameKey: \"energyImportT4\",\n type: \"number\",\n role: \"value.energy\",\n unit: \"kWh\",\n },\n // Energy export\n {\n key: \"energy_export_kwh\",\n id: \"energy_export_kwh\",\n nameKey: \"energyExportTotal\",\n type: \"number\",\n role: \"value.energy\",\n unit: \"kWh\",\n },\n {\n key: \"energy_export_t1_kwh\",\n id: \"energy_export_t1_kwh\",\n nameKey: \"energyExportT1\",\n type: \"number\",\n role: \"value.energy\",\n unit: \"kWh\",\n },\n {\n key: \"energy_export_t2_kwh\",\n id: \"energy_export_t2_kwh\",\n nameKey: \"energyExportT2\",\n type: \"number\",\n role: \"value.energy\",\n unit: \"kWh\",\n },\n {\n key: \"energy_export_t3_kwh\",\n id: \"energy_export_t3_kwh\",\n nameKey: \"energyExportT3\",\n type: \"number\",\n role: \"value.energy\",\n unit: \"kWh\",\n },\n {\n key: \"energy_export_t4_kwh\",\n id: \"energy_export_t4_kwh\",\n nameKey: \"energyExportT4\",\n type: \"number\",\n role: \"value.energy\",\n unit: \"kWh\",\n },\n // Tariff (common.states applied separately in updateMeasurement for translation labels)\n { key: \"tariff\", id: \"tariff\", nameKey: \"tariff\", type: \"number\", role: \"value\" },\n // Power quality\n {\n key: \"voltage_sag_l1_count\",\n id: \"quality.voltage_sag_l1_count\",\n nameKey: \"voltageSagL1\",\n descKey: \"voltageSag\",\n type: \"number\",\n role: \"value\",\n },\n {\n key: \"voltage_sag_l2_count\",\n id: \"quality.voltage_sag_l2_count\",\n nameKey: \"voltageSagL2\",\n descKey: \"voltageSag\",\n type: \"number\",\n role: \"value\",\n },\n {\n key: \"voltage_sag_l3_count\",\n id: \"quality.voltage_sag_l3_count\",\n nameKey: \"voltageSagL3\",\n descKey: \"voltageSag\",\n type: \"number\",\n role: \"value\",\n },\n {\n key: \"voltage_swell_l1_count\",\n id: \"quality.voltage_swell_l1_count\",\n nameKey: \"voltageSwellL1\",\n descKey: \"voltageSwell\",\n type: \"number\",\n role: \"value\",\n },\n {\n key: \"voltage_swell_l2_count\",\n id: \"quality.voltage_swell_l2_count\",\n nameKey: \"voltageSwellL2\",\n descKey: \"voltageSwell\",\n type: \"number\",\n role: \"value\",\n },\n {\n key: \"voltage_swell_l3_count\",\n id: \"quality.voltage_swell_l3_count\",\n nameKey: \"voltageSwellL3\",\n descKey: \"voltageSwell\",\n type: \"number\",\n role: \"value\",\n },\n {\n key: \"any_power_fail_count\",\n id: \"quality.power_fail_count\",\n nameKey: \"powerFailCount\",\n descKey: \"powerFailCountDesc\",\n type: \"number\",\n role: \"value\",\n },\n {\n key: \"long_power_fail_count\",\n id: \"quality.long_power_fail_count\",\n nameKey: \"longPowerFailCount\",\n descKey: \"longPowerFailCountDesc\",\n type: \"number\",\n role: \"value\",\n },\n // Capacity tariff (Belgium)\n {\n key: \"average_power_15m_w\",\n id: \"average_power_15m_w\",\n nameKey: \"avgPower15m\",\n descKey: \"belgiumCapacityTariff\",\n type: \"number\",\n role: \"value.power\",\n unit: \"W\",\n },\n {\n key: \"monthly_power_peak_w\",\n id: \"monthly_power_peak_w\",\n nameKey: \"monthlyPowerPeak\",\n descKey: \"belgiumCapacityTariff\",\n type: \"number\",\n role: \"value.power\",\n unit: \"W\",\n },\n {\n key: \"monthly_power_peak_timestamp\",\n id: \"monthly_power_peak_timestamp\",\n nameKey: \"monthlyPowerPeakTimestamp\",\n descKey: \"belgiumCapacityTariff\",\n type: \"string\",\n role: \"date\",\n },\n // kWh meter specifics \u2014 apparent / reactive\n {\n key: \"apparent_current_a\",\n id: \"apparent_current_a\",\n nameKey: \"apparentCurrent\",\n type: \"number\",\n role: \"value.current\",\n unit: \"A\",\n },\n {\n key: \"apparent_current_l1_a\",\n id: \"apparent_current_l1_a\",\n nameKey: \"apparentCurrentL1\",\n type: \"number\",\n role: \"value.current\",\n unit: \"A\",\n },\n {\n key: \"apparent_current_l2_a\",\n id: \"apparent_current_l2_a\",\n nameKey: \"apparentCurrentL2\",\n type: \"number\",\n role: \"value.current\",\n unit: \"A\",\n },\n {\n key: \"apparent_current_l3_a\",\n id: \"apparent_current_l3_a\",\n nameKey: \"apparentCurrentL3\",\n type: \"number\",\n role: \"value.current\",\n unit: \"A\",\n },\n {\n key: \"reactive_current_a\",\n id: \"reactive_current_a\",\n nameKey: \"reactiveCurrent\",\n type: \"number\",\n role: \"value.current\",\n unit: \"A\",\n },\n {\n key: \"reactive_current_l1_a\",\n id: \"reactive_current_l1_a\",\n nameKey: \"reactiveCurrentL1\",\n type: \"number\",\n role: \"value.current\",\n unit: \"A\",\n },\n {\n key: \"reactive_current_l2_a\",\n id: \"reactive_current_l2_a\",\n nameKey: \"reactiveCurrentL2\",\n type: \"number\",\n role: \"value.current\",\n unit: \"A\",\n },\n {\n key: \"reactive_current_l3_a\",\n id: \"reactive_current_l3_a\",\n nameKey: \"reactiveCurrentL3\",\n type: \"number\",\n role: \"value.current\",\n unit: \"A\",\n },\n {\n key: \"apparent_power_va\",\n id: \"apparent_power_va\",\n nameKey: \"apparentPower\",\n type: \"number\",\n role: \"value.power\",\n unit: \"VA\",\n },\n {\n key: \"apparent_power_l1_va\",\n id: \"apparent_power_l1_va\",\n nameKey: \"apparentPowerL1\",\n type: \"number\",\n role: \"value.power\",\n unit: \"VA\",\n },\n {\n key: \"apparent_power_l2_va\",\n id: \"apparent_power_l2_va\",\n nameKey: \"apparentPowerL2\",\n type: \"number\",\n role: \"value.power\",\n unit: \"VA\",\n },\n {\n key: \"apparent_power_l3_va\",\n id: \"apparent_power_l3_va\",\n nameKey: \"apparentPowerL3\",\n type: \"number\",\n role: \"value.power\",\n unit: \"VA\",\n },\n {\n key: \"reactive_power_var\",\n id: \"reactive_power_var\",\n nameKey: \"reactivePower\",\n type: \"number\",\n role: \"value.power\",\n unit: \"var\",\n },\n {\n key: \"reactive_power_l1_var\",\n id: \"reactive_power_l1_var\",\n nameKey: \"reactivePowerL1\",\n type: \"number\",\n role: \"value.power\",\n unit: \"var\",\n },\n {\n key: \"reactive_power_l2_var\",\n id: \"reactive_power_l2_var\",\n nameKey: \"reactivePowerL2\",\n type: \"number\",\n role: \"value.power\",\n unit: \"var\",\n },\n {\n key: \"reactive_power_l3_var\",\n id: \"reactive_power_l3_var\",\n nameKey: \"reactivePowerL3\",\n type: \"number\",\n role: \"value.power\",\n unit: \"var\",\n },\n {\n key: \"power_factor\",\n id: \"power_factor\",\n nameKey: \"powerFactor\",\n descKey: \"powerFactorDesc\",\n type: \"number\",\n role: \"value\",\n },\n {\n key: \"power_factor_l1\",\n id: \"power_factor_l1\",\n nameKey: \"powerFactorL1\",\n descKey: \"powerFactorDesc\",\n type: \"number\",\n role: \"value\",\n },\n {\n key: \"power_factor_l2\",\n id: \"power_factor_l2\",\n nameKey: \"powerFactorL2\",\n descKey: \"powerFactorDesc\",\n type: \"number\",\n role: \"value\",\n },\n {\n key: \"power_factor_l3\",\n id: \"power_factor_l3\",\n nameKey: \"powerFactorL3\",\n descKey: \"powerFactorDesc\",\n type: \"number\",\n role: \"value\",\n },\n // Battery specifics\n {\n key: \"state_of_charge_pct\",\n id: \"state_of_charge_pct\",\n nameKey: \"stateOfCharge\",\n type: \"number\",\n role: \"value.battery\",\n unit: \"%\",\n },\n { key: \"cycles\", id: \"cycles\", nameKey: \"cycles\", type: \"number\", role: \"value\" },\n // Metadata\n { key: \"meter_model\", id: \"meter_model\", nameKey: \"meterModel\", type: \"string\", role: \"text\" },\n { key: \"timestamp\", id: \"timestamp\", nameKey: \"measurementTimestamp\", type: \"string\", role: \"date\" },\n];\n\n/**\n * Translation-object cast helper \u2014 ioBroker's `common.name`/`desc` accept `StringOrTranslated`.\n *\n * @param name Translation object from {@link STATE_NAMES} or {@link STATE_DESCS}.\n */\nfunction asName(name: StateName): ioBroker.StringOrTranslated {\n return name;\n}\n\n/** Build a `common.states` map where the values are translation objects (admin v6+). */\nfunction tariffStates(): Record<string, string> {\n return {\n 1: tLabel(\"tariff1\") as unknown as string,\n 2: tLabel(\"tariff2\") as unknown as string,\n 3: tLabel(\"tariff3\") as unknown as string,\n 4: tLabel(\"tariff4\") as unknown as string,\n };\n}\nfunction batteryModeStates(): Record<string, string> {\n return {\n zero: tLabel(\"modeZero\") as unknown as string,\n to_full: tLabel(\"modeToFull\") as unknown as string,\n standby: tLabel(\"modeStandby\") as unknown as string,\n };\n}\n\n/** Manages ioBroker state creation and updates for HomeWizard devices */\nexport class StateManager {\n private readonly adapter: utils.AdapterInstance;\n /**\n * Cache of state / channel IDs that have already passed\n * `setObjectNotExistsAsync`. Skips repeat DB lookups on the hot path \u2014\n * a P1 meter pushes ~1 measurement/s with up to ~30 active fields, which\n * otherwise meant ~30 Redis lookups per second just to ask \u201Edoes it\n * exist\". On `removeDevice(prefix)` all `prefix.*` IDs are dropped.\n */\n private readonly createdIds = new Set<string>();\n\n /** @param adapter The ioBroker adapter instance */\n constructor(adapter: utils.AdapterInstance) {\n this.adapter = adapter;\n }\n\n /**\n * Create device channel and info states\n *\n * @param config Device configuration\n */\n async createDeviceStates(config: DeviceConfig): Promise<void> {\n const prefix = this.devicePrefix(config);\n\n // Device-Object: common.name keeps the user-supplied product name (or product type as fallback) \u2014\n // these are device-specific identifiers, NOT translatable.\n await this.adapter.extendObjectAsync(prefix, {\n type: \"device\",\n common: {\n name: config.productName || config.productType,\n statusStates: {\n onlineId: `${this.adapter.namespace}.${prefix}.info.connected`,\n },\n } as ioBroker.DeviceCommon,\n native: {},\n });\n\n await this.adapter.extendObjectAsync(`${prefix}.info`, {\n type: \"channel\",\n common: { name: asName(tName(\"deviceInformation\")) },\n native: {},\n });\n\n await this.createState(`${prefix}.info.productName`, tName(\"productName\"), \"string\", \"text\", false);\n await this.createState(`${prefix}.info.productType`, tName(\"productType\"), \"string\", \"text\", false);\n await this.createState(`${prefix}.info.firmware`, tName(\"firmware\"), \"string\", \"text\", false);\n await this.createState(`${prefix}.info.connected`, tName(\"connected\"), \"boolean\", \"indicator.reachable\", false);\n await this.createState(`${prefix}.info.wifi_rssi_db`, tName(\"wifiRssi\"), \"number\", \"value\", false, \"dBm\");\n await this.createState(`${prefix}.info.uptime_s`, tName(\"uptime\"), \"number\", \"value\", false, \"s\");\n\n // Remove device button\n await this.createButton(`${prefix}.remove`, tName(\"removeDevice\"), tDesc(\"removeDeviceDesc\"));\n\n // Set initial info values\n await this.adapter.setStateAsync(`${prefix}.info.productName`, {\n val: config.productName,\n ack: true,\n });\n await this.adapter.setStateAsync(`${prefix}.info.productType`, {\n val: config.productType,\n ack: true,\n });\n }\n\n /**\n * Update measurement states \u2014 only creates states that have values\n *\n * @param config Device configuration\n * @param data Measurement data\n */\n async updateMeasurement(config: DeviceConfig, data: Measurement): Promise<void> {\n if (!isPlainObject(data)) {\n return;\n }\n const prefix = this.devicePrefix(config);\n const mPrefix = `${prefix}.measurement`;\n\n // Ensure measurement channel exists (cached after first call per device)\n await this.ensureChannel(mPrefix, asName(tName(\"measurement\")));\n\n // Main measurement values \u2014 coerce per declared type. Once a state's object\n // is in the cache, ensureAndSet only does one setStateAsync per field \u2014 those\n // are independent and run in parallel via Promise.all instead of sequentially.\n const record = data;\n const writes: Promise<void>[] = [];\n for (const def of MEASUREMENT_STATE_DEFS) {\n const raw = record[def.key];\n let coerced: number | string | null = null;\n if (def.type === \"number\") {\n coerced = coerceFiniteNumber(raw);\n } else if (def.type === \"string\") {\n coerced = coerceString(raw);\n }\n if (coerced !== null) {\n writes.push(\n this.ensureAndSet(\n `${mPrefix}.${def.id}`,\n tName(def.nameKey),\n def.type,\n def.role,\n coerced,\n def.unit,\n undefined,\n def.descKey ? tDesc(def.descKey) : undefined,\n def.key === \"tariff\" ? tariffStates() : undefined,\n ),\n );\n }\n }\n await Promise.all(writes);\n\n // External meters (P1 gas/water/heat) \u2014 channel-create paths must run sequentially\n // because the parent `external` channel must exist before the per-meter channel\n // and the per-meter value/unit/timestamp states. Inside one meter, the three\n // value/unit/timestamp writes are independent and run in parallel.\n const external = record.external;\n if (Array.isArray(external) && external.length > 0) {\n for (const rawExt of external) {\n if (!isPlainObject(rawExt)) {\n continue;\n }\n const type = coerceString(rawExt.type);\n const uniqueId = coerceString(rawExt.unique_id);\n if (!type || !uniqueId) {\n continue;\n }\n\n const value = coerceFiniteNumber(rawExt.value);\n const unit = coerceString(rawExt.unit);\n const timestamp = coerceString(rawExt.timestamp);\n\n await this.ensureChannel(`${mPrefix}.external`, asName(tName(\"externalMeters\")));\n\n const extId = `${mPrefix}.external.${sanitize(type)}_${sanitize(uniqueId)}`;\n // External meter channel keeps the device-supplied type (e.g. \"gas_meter\")\n // as channel name \u2014 identifies the physical meter, not localizable.\n await this.ensureChannel(extId, type);\n\n const extWrites: Promise<void>[] = [];\n if (value !== null) {\n extWrites.push(\n this.ensureAndSet(`${extId}.value`, tName(\"externalValue\"), \"number\", \"value\", value, unit ?? undefined),\n );\n }\n if (unit) {\n extWrites.push(this.ensureAndSet(`${extId}.unit`, tName(\"externalUnit\"), \"string\", \"text\", unit));\n }\n if (timestamp) {\n extWrites.push(\n this.ensureAndSet(`${extId}.timestamp`, tName(\"externalTimestamp\"), \"string\", \"date\", timestamp),\n );\n }\n await Promise.all(extWrites);\n }\n }\n }\n\n /**\n * Update system states\n *\n * @param config Device configuration\n * @param system System info data\n */\n async updateSystem(config: DeviceConfig, system: SystemInfo): Promise<void> {\n if (!isPlainObject(system)) {\n return;\n }\n const prefix = this.devicePrefix(config);\n const record = system as Record<string, unknown>;\n\n // WiFi/uptime in info channel\n const rssi = coerceFiniteNumber(record.wifi_rssi_db);\n if (rssi !== null) {\n await this.ensureAndSet(`${prefix}.info.wifi_rssi_db`, tName(\"wifiRssi\"), \"number\", \"value\", rssi, \"dBm\");\n }\n const uptime = coerceFiniteNumber(record.uptime_s);\n if (uptime !== null) {\n await this.ensureAndSet(`${prefix}.info.uptime_s`, tName(\"uptime\"), \"number\", \"value\", uptime, \"s\");\n }\n\n // System control channel (cached after first call per device)\n await this.ensureChannel(`${prefix}.system`, asName(tName(\"systemSettings\")));\n\n const cloudEnabled = coerceBoolean(record.cloud_enabled);\n if (cloudEnabled !== null) {\n await this.ensureAndSet(\n `${prefix}.system.cloud_enabled`,\n tName(\"cloudEnabled\"),\n \"boolean\",\n \"switch\",\n cloudEnabled,\n undefined,\n true,\n );\n }\n const ledPct = coerceFiniteNumber(record.status_led_brightness_pct);\n if (ledPct !== null) {\n await this.ensureAndSet(\n `${prefix}.system.status_led_brightness_pct`,\n tName(\"ledBrightness\"),\n \"number\",\n \"level\",\n ledPct,\n \"%\",\n true,\n );\n }\n\n const apiV1 = coerceBoolean(record.api_v1_enabled);\n if (apiV1 !== null) {\n await this.ensureAndSet(\n `${prefix}.system.api_v1_enabled`,\n tName(\"apiV1Enabled\"),\n \"boolean\",\n \"switch\",\n apiV1,\n undefined,\n true,\n );\n }\n\n // Action buttons\n await this.createButton(`${prefix}.system.reboot`, tName(\"rebootDevice\"));\n await this.createButton(`${prefix}.system.identify`, tName(\"identify\"));\n }\n\n /**\n * Update battery control states\n *\n * @param config Device configuration\n * @param battery Battery control data\n */\n async updateBattery(config: DeviceConfig, battery: BatteryControl): Promise<void> {\n if (!isPlainObject(battery)) {\n return;\n }\n const prefix = this.devicePrefix(config);\n const record = battery as Record<string, unknown>;\n\n await this.ensureChannel(`${prefix}.battery`, asName(tName(\"batteryControl\")));\n\n const mode = coerceString(record.mode);\n if (mode) {\n await this.ensureAndSet(\n `${prefix}.battery.mode`,\n tName(\"batteryMode\"),\n \"string\",\n \"text\",\n mode,\n undefined,\n true,\n tDesc(\"batteryModeDesc\"),\n batteryModeStates(),\n );\n }\n if (Array.isArray(record.permissions)) {\n await this.ensureAndSet(\n `${prefix}.battery.permissions`,\n tName(\"batteryPermissions\"),\n \"string\",\n \"json\",\n JSON.stringify(record.permissions),\n undefined,\n true,\n );\n }\n\n const numberFields: Array<{\n key: string;\n id: string;\n nameKey: keyof typeof STATE_NAMES;\n role: string;\n unit?: string;\n }> = [\n { key: \"battery_count\", id: \"battery_count\", nameKey: \"batteryCount\", role: \"value\" },\n { key: \"power_w\", id: \"power_w\", nameKey: \"batteryPower\", role: \"value.power\", unit: \"W\" },\n { key: \"target_power_w\", id: \"target_power_w\", nameKey: \"batteryTargetPower\", role: \"value.power\", unit: \"W\" },\n {\n key: \"max_consumption_w\",\n id: \"max_consumption_w\",\n nameKey: \"batteryMaxConsumption\",\n role: \"value.power\",\n unit: \"W\",\n },\n {\n key: \"max_production_w\",\n id: \"max_production_w\",\n nameKey: \"batteryMaxProduction\",\n role: \"value.power\",\n unit: \"W\",\n },\n ];\n for (const field of numberFields) {\n const coerced = coerceFiniteNumber(record[field.key]);\n if (coerced !== null) {\n await this.ensureAndSet(\n `${prefix}.battery.${field.id}`,\n tName(field.nameKey),\n \"number\",\n field.role,\n coerced,\n field.unit,\n );\n }\n }\n }\n\n /**\n * Set device connected state\n *\n * @param config Device configuration\n * @param connected Connection status\n */\n async setDeviceConnected(config: DeviceConfig, connected: boolean): Promise<void> {\n const prefix = this.devicePrefix(config);\n await this.adapter.setStateAsync(`${prefix}.info.connected`, {\n val: connected,\n ack: true,\n });\n }\n\n /**\n * Remove all states for a device\n *\n * @param config Device configuration\n */\n async removeDevice(config: DeviceConfig): Promise<void> {\n const prefix = this.devicePrefix(config);\n await this.adapter.delObjectAsync(prefix, { recursive: true });\n // Drop cache entries belonging to this device \u2014 re-pairing the same\n // device must re-create channels/states from scratch.\n for (const id of this.createdIds) {\n if (id === prefix || id.startsWith(`${prefix}.`)) {\n this.createdIds.delete(id);\n }\n }\n }\n\n /**\n * Remove measurement states from old locations (pre-v0.4.0: device root instead of measurement/ channel)\n *\n * @param config Device configuration\n */\n async cleanupMovedStates(config: DeviceConfig): Promise<void> {\n const prefix = this.devicePrefix(config);\n\n // Old paths: states were at device root, now under measurement/\n const oldIds: string[] = [];\n for (const def of MEASUREMENT_STATE_DEFS) {\n oldIds.push(`${prefix}.${def.id}`);\n }\n // External was at device root too\n oldIds.push(`${prefix}.external`);\n\n for (const id of oldIds) {\n if (await this.adapter.getObjectAsync(id)) {\n await this.adapter.delObjectAsync(id, { recursive: true });\n this.adapter.log.debug(`Removed obsolete state: ${id}`);\n }\n }\n }\n\n /**\n * Get device object ID prefix\n *\n * @param config Device configuration\n */\n devicePrefix(config: DeviceConfig): string {\n return `${sanitize(config.productType)}_${sanitize(config.serial)}`;\n }\n\n /**\n * Ensure a channel object exists. Skips the DB lookup once `id` is in the\n * cache \u2014 channels are static after first creation per device.\n *\n * @param id Full channel ID (`<prefix>.<channelName>`).\n * @param name Display name (translation object or device-supplied string).\n */\n private async ensureChannel(id: string, name: ioBroker.StringOrTranslated): Promise<void> {\n if (this.createdIds.has(id)) {\n return;\n }\n await this.adapter.setObjectNotExistsAsync(id, {\n type: \"channel\",\n common: { name },\n native: {},\n });\n this.createdIds.add(id);\n }\n\n /**\n * Create a state if it doesn't exist\n *\n * @param id State ID\n * @param name State name (translation object or string for device identifiers)\n * @param type Value type\n * @param role ioBroker role\n * @param write Whether state is writable\n * @param unit Optional unit\n * @param desc Optional translation object for `common.desc`\n * @param states Optional `common.states` map\n */\n private async createState(\n id: string,\n name: StateName | string,\n type: ioBroker.CommonType,\n role: string,\n write: boolean,\n unit?: string,\n desc?: StateName,\n states?: Record<string, string>,\n ): Promise<void> {\n if (this.createdIds.has(id)) {\n return;\n }\n const common: Partial<ioBroker.StateCommon> = {\n name: typeof name === \"string\" ? name : asName(name),\n type,\n role,\n read: true,\n write,\n };\n if (unit) {\n common.unit = unit;\n }\n if (desc) {\n common.desc = asName(desc);\n }\n if (states) {\n common.states = states;\n }\n await this.adapter.setObjectNotExistsAsync(id, {\n type: \"state\",\n common: common as ioBroker.StateCommon,\n native: {},\n });\n this.createdIds.add(id);\n }\n\n /**\n * Create a button state (read: false, write: true) with initial value false\n *\n * @param id State ID\n * @param name Button label (translation object)\n * @param desc Optional translation object for `common.desc`\n */\n private async createButton(id: string, name: StateName, desc?: StateName): Promise<void> {\n if (this.createdIds.has(id)) {\n return;\n }\n const common: Partial<ioBroker.StateCommon> = {\n name: asName(name),\n type: \"boolean\",\n role: \"button\",\n read: false,\n write: true,\n };\n if (desc) {\n common.desc = asName(desc);\n }\n await this.adapter.setObjectNotExistsAsync(id, {\n type: \"state\",\n common: common as ioBroker.StateCommon,\n native: {},\n });\n await this.adapter.setStateAsync(id, { val: false, ack: true });\n this.createdIds.add(id);\n }\n\n /**\n * Ensure state exists and set value\n *\n * @param id State ID\n * @param name State name (translation object or string)\n * @param type Value type\n * @param role ioBroker role\n * @param value State value\n * @param unit Optional unit\n * @param write Whether state is writable\n * @param desc Optional translation object for `common.desc`\n * @param states Optional `common.states` map (translation objects)\n */\n private async ensureAndSet(\n id: string,\n name: StateName | string,\n type: ioBroker.CommonType,\n role: string,\n value: ioBroker.StateValue,\n unit?: string,\n write?: boolean,\n desc?: StateName,\n states?: Record<string, string>,\n ): Promise<void> {\n await this.createState(id, name, type, role, write ?? false, unit, desc, states);\n await this.adapter.setStateAsync(id, { val: value, ack: true });\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import type * as utils from \"@iobroker/adapter-core\";\nimport { coerceBoolean, coerceFiniteNumber, coerceString, isPlainObject } from \"./coerce\";\nimport type { STATE_DESCS, STATE_NAMES, StateName } from \"./i18n-states\";\nimport { resolveLabel, tDesc, tName } from \"./i18n-states\";\nimport type { BatteryControl, DeviceConfig, Measurement, SystemInfo } from \"./types\";\n\n/** Measurement field to state definition mapping */\ninterface MeasurementStateDef {\n /** Measurement field key */\n key: string;\n /** ioBroker state ID suffix */\n id: string;\n /** Translation key for `common.name` (resolved via {@link tName}) */\n nameKey: keyof typeof STATE_NAMES;\n /** Optional translation key for `common.desc` (resolved via {@link tDesc}) */\n descKey?: keyof typeof STATE_DESCS;\n /** State value type */\n type: ioBroker.CommonType;\n /** ioBroker role */\n role: string;\n /** Unit string */\n unit?: string;\n}\n\n/**\n * Sanitize a string for use as ioBroker object ID (see adapter.FORBIDDEN_CHARS).\n *\n * @param str Raw string to sanitize\n */\nfunction sanitize(str: string): string {\n return str.replace(/[^a-zA-Z0-9_-]/g, \"_\").toLowerCase();\n}\n\nconst MEASUREMENT_STATE_DEFS: MeasurementStateDef[] = [\n // Power\n { key: \"power_w\", id: \"power_w\", nameKey: \"powerTotal\", type: \"number\", role: \"value.power\", unit: \"W\" },\n { key: \"power_l1_w\", id: \"power_l1_w\", nameKey: \"powerL1\", type: \"number\", role: \"value.power\", unit: \"W\" },\n { key: \"power_l2_w\", id: \"power_l2_w\", nameKey: \"powerL2\", type: \"number\", role: \"value.power\", unit: \"W\" },\n { key: \"power_l3_w\", id: \"power_l3_w\", nameKey: \"powerL3\", type: \"number\", role: \"value.power\", unit: \"W\" },\n // Voltage\n { key: \"voltage_v\", id: \"voltage_v\", nameKey: \"voltage\", type: \"number\", role: \"value.voltage\", unit: \"V\" },\n { key: \"voltage_l1_v\", id: \"voltage_l1_v\", nameKey: \"voltageL1\", type: \"number\", role: \"value.voltage\", unit: \"V\" },\n { key: \"voltage_l2_v\", id: \"voltage_l2_v\", nameKey: \"voltageL2\", type: \"number\", role: \"value.voltage\", unit: \"V\" },\n { key: \"voltage_l3_v\", id: \"voltage_l3_v\", nameKey: \"voltageL3\", type: \"number\", role: \"value.voltage\", unit: \"V\" },\n // Current\n { key: \"current_a\", id: \"current_a\", nameKey: \"current\", type: \"number\", role: \"value.current\", unit: \"A\" },\n { key: \"current_l1_a\", id: \"current_l1_a\", nameKey: \"currentL1\", type: \"number\", role: \"value.current\", unit: \"A\" },\n { key: \"current_l2_a\", id: \"current_l2_a\", nameKey: \"currentL2\", type: \"number\", role: \"value.current\", unit: \"A\" },\n { key: \"current_l3_a\", id: \"current_l3_a\", nameKey: \"currentL3\", type: \"number\", role: \"value.current\", unit: \"A\" },\n // Frequency\n { key: \"frequency_hz\", id: \"frequency_hz\", nameKey: \"frequency\", type: \"number\", role: \"value\", unit: \"Hz\" },\n // Energy import\n {\n key: \"energy_import_kwh\",\n id: \"energy_import_kwh\",\n nameKey: \"energyImportTotal\",\n type: \"number\",\n role: \"value.energy\",\n unit: \"kWh\",\n },\n {\n key: \"energy_import_t1_kwh\",\n id: \"energy_import_t1_kwh\",\n nameKey: \"energyImportT1\",\n type: \"number\",\n role: \"value.energy\",\n unit: \"kWh\",\n },\n {\n key: \"energy_import_t2_kwh\",\n id: \"energy_import_t2_kwh\",\n nameKey: \"energyImportT2\",\n type: \"number\",\n role: \"value.energy\",\n unit: \"kWh\",\n },\n {\n key: \"energy_import_t3_kwh\",\n id: \"energy_import_t3_kwh\",\n nameKey: \"energyImportT3\",\n type: \"number\",\n role: \"value.energy\",\n unit: \"kWh\",\n },\n {\n key: \"energy_import_t4_kwh\",\n id: \"energy_import_t4_kwh\",\n nameKey: \"energyImportT4\",\n type: \"number\",\n role: \"value.energy\",\n unit: \"kWh\",\n },\n // Energy export\n {\n key: \"energy_export_kwh\",\n id: \"energy_export_kwh\",\n nameKey: \"energyExportTotal\",\n type: \"number\",\n role: \"value.energy\",\n unit: \"kWh\",\n },\n {\n key: \"energy_export_t1_kwh\",\n id: \"energy_export_t1_kwh\",\n nameKey: \"energyExportT1\",\n type: \"number\",\n role: \"value.energy\",\n unit: \"kWh\",\n },\n {\n key: \"energy_export_t2_kwh\",\n id: \"energy_export_t2_kwh\",\n nameKey: \"energyExportT2\",\n type: \"number\",\n role: \"value.energy\",\n unit: \"kWh\",\n },\n {\n key: \"energy_export_t3_kwh\",\n id: \"energy_export_t3_kwh\",\n nameKey: \"energyExportT3\",\n type: \"number\",\n role: \"value.energy\",\n unit: \"kWh\",\n },\n {\n key: \"energy_export_t4_kwh\",\n id: \"energy_export_t4_kwh\",\n nameKey: \"energyExportT4\",\n type: \"number\",\n role: \"value.energy\",\n unit: \"kWh\",\n },\n // Tariff (common.states applied separately in updateMeasurement for translation labels)\n { key: \"tariff\", id: \"tariff\", nameKey: \"tariff\", type: \"number\", role: \"value\" },\n // Power quality\n {\n key: \"voltage_sag_l1_count\",\n id: \"quality.voltage_sag_l1_count\",\n nameKey: \"voltageSagL1\",\n descKey: \"voltageSag\",\n type: \"number\",\n role: \"value\",\n },\n {\n key: \"voltage_sag_l2_count\",\n id: \"quality.voltage_sag_l2_count\",\n nameKey: \"voltageSagL2\",\n descKey: \"voltageSag\",\n type: \"number\",\n role: \"value\",\n },\n {\n key: \"voltage_sag_l3_count\",\n id: \"quality.voltage_sag_l3_count\",\n nameKey: \"voltageSagL3\",\n descKey: \"voltageSag\",\n type: \"number\",\n role: \"value\",\n },\n {\n key: \"voltage_swell_l1_count\",\n id: \"quality.voltage_swell_l1_count\",\n nameKey: \"voltageSwellL1\",\n descKey: \"voltageSwell\",\n type: \"number\",\n role: \"value\",\n },\n {\n key: \"voltage_swell_l2_count\",\n id: \"quality.voltage_swell_l2_count\",\n nameKey: \"voltageSwellL2\",\n descKey: \"voltageSwell\",\n type: \"number\",\n role: \"value\",\n },\n {\n key: \"voltage_swell_l3_count\",\n id: \"quality.voltage_swell_l3_count\",\n nameKey: \"voltageSwellL3\",\n descKey: \"voltageSwell\",\n type: \"number\",\n role: \"value\",\n },\n {\n key: \"any_power_fail_count\",\n id: \"quality.power_fail_count\",\n nameKey: \"powerFailCount\",\n descKey: \"powerFailCountDesc\",\n type: \"number\",\n role: \"value\",\n },\n {\n key: \"long_power_fail_count\",\n id: \"quality.long_power_fail_count\",\n nameKey: \"longPowerFailCount\",\n descKey: \"longPowerFailCountDesc\",\n type: \"number\",\n role: \"value\",\n },\n // Capacity tariff (Belgium)\n {\n key: \"average_power_15m_w\",\n id: \"average_power_15m_w\",\n nameKey: \"avgPower15m\",\n descKey: \"belgiumCapacityTariff\",\n type: \"number\",\n role: \"value.power\",\n unit: \"W\",\n },\n {\n key: \"monthly_power_peak_w\",\n id: \"monthly_power_peak_w\",\n nameKey: \"monthlyPowerPeak\",\n descKey: \"belgiumCapacityTariff\",\n type: \"number\",\n role: \"value.power\",\n unit: \"W\",\n },\n {\n key: \"monthly_power_peak_timestamp\",\n id: \"monthly_power_peak_timestamp\",\n nameKey: \"monthlyPowerPeakTimestamp\",\n descKey: \"belgiumCapacityTariff\",\n type: \"string\",\n role: \"date\",\n },\n // kWh meter specifics \u2014 apparent / reactive\n {\n key: \"apparent_current_a\",\n id: \"apparent_current_a\",\n nameKey: \"apparentCurrent\",\n type: \"number\",\n role: \"value.current\",\n unit: \"A\",\n },\n {\n key: \"apparent_current_l1_a\",\n id: \"apparent_current_l1_a\",\n nameKey: \"apparentCurrentL1\",\n type: \"number\",\n role: \"value.current\",\n unit: \"A\",\n },\n {\n key: \"apparent_current_l2_a\",\n id: \"apparent_current_l2_a\",\n nameKey: \"apparentCurrentL2\",\n type: \"number\",\n role: \"value.current\",\n unit: \"A\",\n },\n {\n key: \"apparent_current_l3_a\",\n id: \"apparent_current_l3_a\",\n nameKey: \"apparentCurrentL3\",\n type: \"number\",\n role: \"value.current\",\n unit: \"A\",\n },\n {\n key: \"reactive_current_a\",\n id: \"reactive_current_a\",\n nameKey: \"reactiveCurrent\",\n type: \"number\",\n role: \"value.current\",\n unit: \"A\",\n },\n {\n key: \"reactive_current_l1_a\",\n id: \"reactive_current_l1_a\",\n nameKey: \"reactiveCurrentL1\",\n type: \"number\",\n role: \"value.current\",\n unit: \"A\",\n },\n {\n key: \"reactive_current_l2_a\",\n id: \"reactive_current_l2_a\",\n nameKey: \"reactiveCurrentL2\",\n type: \"number\",\n role: \"value.current\",\n unit: \"A\",\n },\n {\n key: \"reactive_current_l3_a\",\n id: \"reactive_current_l3_a\",\n nameKey: \"reactiveCurrentL3\",\n type: \"number\",\n role: \"value.current\",\n unit: \"A\",\n },\n {\n key: \"apparent_power_va\",\n id: \"apparent_power_va\",\n nameKey: \"apparentPower\",\n type: \"number\",\n role: \"value.power\",\n unit: \"VA\",\n },\n {\n key: \"apparent_power_l1_va\",\n id: \"apparent_power_l1_va\",\n nameKey: \"apparentPowerL1\",\n type: \"number\",\n role: \"value.power\",\n unit: \"VA\",\n },\n {\n key: \"apparent_power_l2_va\",\n id: \"apparent_power_l2_va\",\n nameKey: \"apparentPowerL2\",\n type: \"number\",\n role: \"value.power\",\n unit: \"VA\",\n },\n {\n key: \"apparent_power_l3_va\",\n id: \"apparent_power_l3_va\",\n nameKey: \"apparentPowerL3\",\n type: \"number\",\n role: \"value.power\",\n unit: \"VA\",\n },\n {\n key: \"reactive_power_var\",\n id: \"reactive_power_var\",\n nameKey: \"reactivePower\",\n type: \"number\",\n role: \"value.power\",\n unit: \"var\",\n },\n {\n key: \"reactive_power_l1_var\",\n id: \"reactive_power_l1_var\",\n nameKey: \"reactivePowerL1\",\n type: \"number\",\n role: \"value.power\",\n unit: \"var\",\n },\n {\n key: \"reactive_power_l2_var\",\n id: \"reactive_power_l2_var\",\n nameKey: \"reactivePowerL2\",\n type: \"number\",\n role: \"value.power\",\n unit: \"var\",\n },\n {\n key: \"reactive_power_l3_var\",\n id: \"reactive_power_l3_var\",\n nameKey: \"reactivePowerL3\",\n type: \"number\",\n role: \"value.power\",\n unit: \"var\",\n },\n {\n key: \"power_factor\",\n id: \"power_factor\",\n nameKey: \"powerFactor\",\n descKey: \"powerFactorDesc\",\n type: \"number\",\n role: \"value\",\n },\n {\n key: \"power_factor_l1\",\n id: \"power_factor_l1\",\n nameKey: \"powerFactorL1\",\n descKey: \"powerFactorDesc\",\n type: \"number\",\n role: \"value\",\n },\n {\n key: \"power_factor_l2\",\n id: \"power_factor_l2\",\n nameKey: \"powerFactorL2\",\n descKey: \"powerFactorDesc\",\n type: \"number\",\n role: \"value\",\n },\n {\n key: \"power_factor_l3\",\n id: \"power_factor_l3\",\n nameKey: \"powerFactorL3\",\n descKey: \"powerFactorDesc\",\n type: \"number\",\n role: \"value\",\n },\n // Battery specifics\n {\n key: \"state_of_charge_pct\",\n id: \"state_of_charge_pct\",\n nameKey: \"stateOfCharge\",\n type: \"number\",\n role: \"value.battery\",\n unit: \"%\",\n },\n { key: \"cycles\", id: \"cycles\", nameKey: \"cycles\", type: \"number\", role: \"value\" },\n // Metadata\n { key: \"meter_model\", id: \"meter_model\", nameKey: \"meterModel\", type: \"string\", role: \"text\" },\n { key: \"timestamp\", id: \"timestamp\", nameKey: \"measurementTimestamp\", type: \"string\", role: \"date\" },\n];\n\n/**\n * Translation-object cast helper \u2014 ioBroker's `common.name`/`desc` accept `StringOrTranslated`.\n *\n * @param name Translation object from {@link STATE_NAMES} or {@link STATE_DESCS}.\n */\nfunction asName(name: StateName): ioBroker.StringOrTranslated {\n return name;\n}\n\n/**\n * Build a `common.states` map for tariff (T1-T4) with plain-string labels.\n *\n * **VALUES MUST be plain-string** \u2014 Admin renders states-values as React\n * children. Translation objects trigger React Error #31 \u2192 fatal \"Error in GUI\"\n * on dropdown open (verified hassemu v1.28.4, 2026-05-12).\n *\n * @param lang Two-letter ISO language code (use `adapter.language ?? \"en\"`).\n */\nfunction tariffStates(lang: string): Record<string, string> {\n return {\n 1: resolveLabel(\"tariff1\", lang),\n 2: resolveLabel(\"tariff2\", lang),\n 3: resolveLabel(\"tariff3\", lang),\n 4: resolveLabel(\"tariff4\", lang),\n };\n}\n\n/**\n * Build a `common.states` map for HWE-BAT battery.mode with plain-string labels.\n * Same constraint as {@link tariffStates}.\n *\n * @param lang Two-letter ISO language code.\n */\nfunction batteryModeStates(lang: string): Record<string, string> {\n return {\n zero: resolveLabel(\"modeZero\", lang),\n to_full: resolveLabel(\"modeToFull\", lang),\n standby: resolveLabel(\"modeStandby\", lang),\n };\n}\n\n/** Manages ioBroker state creation and updates for HomeWizard devices */\nexport class StateManager {\n private readonly adapter: utils.AdapterInstance;\n /**\n * Cache of state / channel IDs that have already passed\n * `setObjectNotExistsAsync`. Skips repeat DB lookups on the hot path \u2014\n * a P1 meter pushes ~1 measurement/s with up to ~30 active fields, which\n * otherwise meant ~30 Redis lookups per second just to ask \u201Edoes it\n * exist\". On `removeDevice(prefix)` all `prefix.*` IDs are dropped.\n */\n private readonly createdIds = new Set<string>();\n\n /** @param adapter The ioBroker adapter instance */\n constructor(adapter: utils.AdapterInstance) {\n this.adapter = adapter;\n }\n\n /**\n * Create device channel and info states\n *\n * @param config Device configuration\n */\n async createDeviceStates(config: DeviceConfig): Promise<void> {\n const prefix = this.devicePrefix(config);\n\n // Device-Object: common.name keeps the user-supplied product name (or product type as fallback) \u2014\n // these are device-specific identifiers, NOT translatable.\n await this.adapter.extendObjectAsync(prefix, {\n type: \"device\",\n common: {\n name: config.productName || config.productType,\n statusStates: {\n onlineId: `${this.adapter.namespace}.${prefix}.info.connected`,\n },\n } as ioBroker.DeviceCommon,\n native: {},\n });\n\n await this.adapter.extendObjectAsync(`${prefix}.info`, {\n type: \"channel\",\n common: { name: asName(tName(\"deviceInformation\")) },\n native: {},\n });\n\n await this.createState(`${prefix}.info.productName`, tName(\"productName\"), \"string\", \"text\", false);\n await this.createState(`${prefix}.info.productType`, tName(\"productType\"), \"string\", \"text\", false);\n await this.createState(`${prefix}.info.firmware`, tName(\"firmware\"), \"string\", \"text\", false);\n await this.createState(`${prefix}.info.connected`, tName(\"connected\"), \"boolean\", \"indicator.reachable\", false);\n await this.createState(`${prefix}.info.wifi_rssi_db`, tName(\"wifiRssi\"), \"number\", \"value\", false, \"dBm\");\n await this.createState(`${prefix}.info.uptime_s`, tName(\"uptime\"), \"number\", \"value\", false, \"s\");\n\n // Remove device button\n await this.createButton(`${prefix}.remove`, tName(\"removeDevice\"), tDesc(\"removeDeviceDesc\"));\n\n // Set initial info values\n await this.adapter.setStateAsync(`${prefix}.info.productName`, {\n val: config.productName,\n ack: true,\n });\n await this.adapter.setStateAsync(`${prefix}.info.productType`, {\n val: config.productType,\n ack: true,\n });\n }\n\n /**\n * Update measurement states \u2014 only creates states that have values\n *\n * @param config Device configuration\n * @param data Measurement data\n */\n async updateMeasurement(config: DeviceConfig, data: Measurement): Promise<void> {\n if (!isPlainObject(data)) {\n return;\n }\n const prefix = this.devicePrefix(config);\n const mPrefix = `${prefix}.measurement`;\n\n // Ensure measurement channel exists (cached after first call per device)\n await this.ensureChannel(mPrefix, asName(tName(\"measurement\")));\n\n // Main measurement values \u2014 coerce per declared type. Once a state's object\n // is in the cache, ensureAndSet only does one setStateAsync per field \u2014 those\n // are independent and run in parallel via Promise.all instead of sequentially.\n const record = data;\n const writes: Promise<void>[] = [];\n for (const def of MEASUREMENT_STATE_DEFS) {\n const raw = record[def.key];\n let coerced: number | string | null = null;\n if (def.type === \"number\") {\n coerced = coerceFiniteNumber(raw);\n } else if (def.type === \"string\") {\n coerced = coerceString(raw);\n }\n if (coerced !== null) {\n writes.push(\n this.ensureAndSet(\n `${mPrefix}.${def.id}`,\n tName(def.nameKey),\n def.type,\n def.role,\n coerced,\n def.unit,\n undefined,\n def.descKey ? tDesc(def.descKey) : undefined,\n def.key === \"tariff\" ? tariffStates(this.adapter.language ?? \"en\") : undefined,\n ),\n );\n }\n }\n await Promise.all(writes);\n\n // External meters (P1 gas/water/heat) \u2014 channel-create paths must run sequentially\n // because the parent `external` channel must exist before the per-meter channel\n // and the per-meter value/unit/timestamp states. Inside one meter, the three\n // value/unit/timestamp writes are independent and run in parallel.\n const external = record.external;\n if (Array.isArray(external) && external.length > 0) {\n for (const rawExt of external) {\n if (!isPlainObject(rawExt)) {\n continue;\n }\n const type = coerceString(rawExt.type);\n const uniqueId = coerceString(rawExt.unique_id);\n if (!type || !uniqueId) {\n continue;\n }\n\n const value = coerceFiniteNumber(rawExt.value);\n const unit = coerceString(rawExt.unit);\n const timestamp = coerceString(rawExt.timestamp);\n\n await this.ensureChannel(`${mPrefix}.external`, asName(tName(\"externalMeters\")));\n\n const extId = `${mPrefix}.external.${sanitize(type)}_${sanitize(uniqueId)}`;\n // External meter channel keeps the device-supplied type (e.g. \"gas_meter\")\n // as channel name \u2014 identifies the physical meter, not localizable.\n await this.ensureChannel(extId, type);\n\n const extWrites: Promise<void>[] = [];\n if (value !== null) {\n extWrites.push(\n this.ensureAndSet(`${extId}.value`, tName(\"externalValue\"), \"number\", \"value\", value, unit ?? undefined),\n );\n }\n if (unit) {\n extWrites.push(this.ensureAndSet(`${extId}.unit`, tName(\"externalUnit\"), \"string\", \"text\", unit));\n }\n if (timestamp) {\n extWrites.push(\n this.ensureAndSet(`${extId}.timestamp`, tName(\"externalTimestamp\"), \"string\", \"date\", timestamp),\n );\n }\n await Promise.all(extWrites);\n }\n }\n }\n\n /**\n * Update system states\n *\n * @param config Device configuration\n * @param system System info data\n */\n async updateSystem(config: DeviceConfig, system: SystemInfo): Promise<void> {\n if (!isPlainObject(system)) {\n return;\n }\n const prefix = this.devicePrefix(config);\n const record = system as Record<string, unknown>;\n\n // WiFi/uptime in info channel\n const rssi = coerceFiniteNumber(record.wifi_rssi_db);\n if (rssi !== null) {\n await this.ensureAndSet(`${prefix}.info.wifi_rssi_db`, tName(\"wifiRssi\"), \"number\", \"value\", rssi, \"dBm\");\n }\n const uptime = coerceFiniteNumber(record.uptime_s);\n if (uptime !== null) {\n await this.ensureAndSet(`${prefix}.info.uptime_s`, tName(\"uptime\"), \"number\", \"value\", uptime, \"s\");\n }\n\n // System control channel (cached after first call per device)\n await this.ensureChannel(`${prefix}.system`, asName(tName(\"systemSettings\")));\n\n const cloudEnabled = coerceBoolean(record.cloud_enabled);\n if (cloudEnabled !== null) {\n await this.ensureAndSet(\n `${prefix}.system.cloud_enabled`,\n tName(\"cloudEnabled\"),\n \"boolean\",\n \"switch\",\n cloudEnabled,\n undefined,\n true,\n );\n }\n const ledPct = coerceFiniteNumber(record.status_led_brightness_pct);\n if (ledPct !== null) {\n await this.ensureAndSet(\n `${prefix}.system.status_led_brightness_pct`,\n tName(\"ledBrightness\"),\n \"number\",\n \"level\",\n ledPct,\n \"%\",\n true,\n );\n }\n\n const apiV1 = coerceBoolean(record.api_v1_enabled);\n if (apiV1 !== null) {\n await this.ensureAndSet(\n `${prefix}.system.api_v1_enabled`,\n tName(\"apiV1Enabled\"),\n \"boolean\",\n \"switch\",\n apiV1,\n undefined,\n true,\n );\n }\n\n // Action buttons\n await this.createButton(`${prefix}.system.reboot`, tName(\"rebootDevice\"));\n await this.createButton(`${prefix}.system.identify`, tName(\"identify\"));\n }\n\n /**\n * Update battery control states\n *\n * @param config Device configuration\n * @param battery Battery control data\n */\n async updateBattery(config: DeviceConfig, battery: BatteryControl): Promise<void> {\n if (!isPlainObject(battery)) {\n return;\n }\n const prefix = this.devicePrefix(config);\n const record = battery as Record<string, unknown>;\n\n await this.ensureChannel(`${prefix}.battery`, asName(tName(\"batteryControl\")));\n\n const mode = coerceString(record.mode);\n if (mode) {\n await this.ensureAndSet(\n `${prefix}.battery.mode`,\n tName(\"batteryMode\"),\n \"string\",\n \"text\",\n mode,\n undefined,\n true,\n tDesc(\"batteryModeDesc\"),\n batteryModeStates(this.adapter.language ?? \"en\"),\n );\n }\n if (Array.isArray(record.permissions)) {\n await this.ensureAndSet(\n `${prefix}.battery.permissions`,\n tName(\"batteryPermissions\"),\n \"string\",\n \"json\",\n JSON.stringify(record.permissions),\n undefined,\n true,\n );\n }\n\n const numberFields: Array<{\n key: string;\n id: string;\n nameKey: keyof typeof STATE_NAMES;\n role: string;\n unit?: string;\n }> = [\n { key: \"battery_count\", id: \"battery_count\", nameKey: \"batteryCount\", role: \"value\" },\n { key: \"power_w\", id: \"power_w\", nameKey: \"batteryPower\", role: \"value.power\", unit: \"W\" },\n { key: \"target_power_w\", id: \"target_power_w\", nameKey: \"batteryTargetPower\", role: \"value.power\", unit: \"W\" },\n {\n key: \"max_consumption_w\",\n id: \"max_consumption_w\",\n nameKey: \"batteryMaxConsumption\",\n role: \"value.power\",\n unit: \"W\",\n },\n {\n key: \"max_production_w\",\n id: \"max_production_w\",\n nameKey: \"batteryMaxProduction\",\n role: \"value.power\",\n unit: \"W\",\n },\n ];\n for (const field of numberFields) {\n const coerced = coerceFiniteNumber(record[field.key]);\n if (coerced !== null) {\n await this.ensureAndSet(\n `${prefix}.battery.${field.id}`,\n tName(field.nameKey),\n \"number\",\n field.role,\n coerced,\n field.unit,\n );\n }\n }\n }\n\n /**\n * Set device connected state\n *\n * @param config Device configuration\n * @param connected Connection status\n */\n async setDeviceConnected(config: DeviceConfig, connected: boolean): Promise<void> {\n const prefix = this.devicePrefix(config);\n await this.adapter.setStateAsync(`${prefix}.info.connected`, {\n val: connected,\n ack: true,\n });\n }\n\n /**\n * Remove all states for a device\n *\n * @param config Device configuration\n */\n async removeDevice(config: DeviceConfig): Promise<void> {\n const prefix = this.devicePrefix(config);\n await this.adapter.delObjectAsync(prefix, { recursive: true });\n // Drop cache entries belonging to this device \u2014 re-pairing the same\n // device must re-create channels/states from scratch.\n for (const id of this.createdIds) {\n if (id === prefix || id.startsWith(`${prefix}.`)) {\n this.createdIds.delete(id);\n }\n }\n }\n\n /**\n * Remove measurement states from old locations (pre-v0.4.0: device root instead of measurement/ channel)\n *\n * @param config Device configuration\n */\n async cleanupMovedStates(config: DeviceConfig): Promise<void> {\n const prefix = this.devicePrefix(config);\n\n // Old paths: states were at device root, now under measurement/\n const oldIds: string[] = [];\n for (const def of MEASUREMENT_STATE_DEFS) {\n oldIds.push(`${prefix}.${def.id}`);\n }\n // External was at device root too\n oldIds.push(`${prefix}.external`);\n\n for (const id of oldIds) {\n if (await this.adapter.getObjectAsync(id)) {\n await this.adapter.delObjectAsync(id, { recursive: true });\n this.adapter.log.debug(`Removed obsolete state: ${id}`);\n }\n }\n }\n\n /**\n * Get device object ID prefix\n *\n * @param config Device configuration\n */\n devicePrefix(config: DeviceConfig): string {\n return `${sanitize(config.productType)}_${sanitize(config.serial)}`;\n }\n\n /**\n * Ensure a channel object exists. Skips the DB lookup once `id` is in the\n * cache \u2014 channels are static after first creation per device.\n *\n * @param id Full channel ID (`<prefix>.<channelName>`).\n * @param name Display name (translation object or device-supplied string).\n */\n private async ensureChannel(id: string, name: ioBroker.StringOrTranslated): Promise<void> {\n if (this.createdIds.has(id)) {\n return;\n }\n await this.adapter.setObjectNotExistsAsync(id, {\n type: \"channel\",\n common: { name },\n native: {},\n });\n this.createdIds.add(id);\n }\n\n /**\n * Create a state if it doesn't exist\n *\n * @param id State ID\n * @param name State name (translation object or string for device identifiers)\n * @param type Value type\n * @param role ioBroker role\n * @param write Whether state is writable\n * @param unit Optional unit\n * @param desc Optional translation object for `common.desc`\n * @param states Optional `common.states` map\n */\n private async createState(\n id: string,\n name: StateName | string,\n type: ioBroker.CommonType,\n role: string,\n write: boolean,\n unit?: string,\n desc?: StateName,\n states?: Record<string, string>,\n ): Promise<void> {\n if (this.createdIds.has(id)) {\n return;\n }\n const common: Partial<ioBroker.StateCommon> = {\n name: typeof name === \"string\" ? name : asName(name),\n type,\n role,\n read: true,\n write,\n };\n if (unit) {\n common.unit = unit;\n }\n if (desc) {\n common.desc = asName(desc);\n }\n if (states) {\n common.states = states;\n }\n await this.adapter.setObjectNotExistsAsync(id, {\n type: \"state\",\n common: common as ioBroker.StateCommon,\n native: {},\n });\n if (states) {\n // Existing datapoints from earlier releases may carry translation-object\n // VALUES in `common.states` (v0.7.0 introduced tLabel-as-string casts).\n // setObjectNotExistsAsync is a no-op for those \u2014 actively replace if any\n // value is not plain-string. Admin renders states-values as React child:\n // an object triggers React Error #31 \u2192 fatal \"Error in GUI\" on dropdown.\n await this.repairCommonStatesIfBuggy(id, states);\n }\n this.createdIds.add(id);\n }\n\n /**\n * If the persisted object at `id` has `common.states` values that are not\n * plain-string (= translation objects from older releases), replace\n * `common.states` with the fresh map via `setObjectAsync`. Otherwise no-op.\n *\n * `extendObjectAsync` deep-merges and CANNOT replace an object-value with\n * a string \u2014 only a full `setObjectAsync` replaces. Pattern proven in\n * hassemu v1.27.2 (URL-dropdown) and v1.28.4 (mode-dropdown).\n *\n * @param id State ID to repair.\n * @param fresh Plain-string `common.states` map to write.\n */\n private async repairCommonStatesIfBuggy(id: string, fresh: Record<string, string>): Promise<void> {\n const existing = await this.adapter.getObjectAsync(id);\n if (!existing) {\n return;\n }\n const states = existing.common?.states;\n if (!states || typeof states !== \"object\") {\n return;\n }\n const buggy = Object.values(states as Record<string, unknown>).some(v => typeof v !== \"string\");\n if (!buggy) {\n return;\n }\n existing.common = { ...existing.common, states: fresh } as ioBroker.StateCommon;\n await this.adapter.setObjectAsync(id, existing);\n }\n\n /**\n * Create a button state (read: false, write: true) with initial value false\n *\n * @param id State ID\n * @param name Button label (translation object)\n * @param desc Optional translation object for `common.desc`\n */\n private async createButton(id: string, name: StateName, desc?: StateName): Promise<void> {\n if (this.createdIds.has(id)) {\n return;\n }\n const common: Partial<ioBroker.StateCommon> = {\n name: asName(name),\n type: \"boolean\",\n role: \"button\",\n read: false,\n write: true,\n };\n if (desc) {\n common.desc = asName(desc);\n }\n await this.adapter.setObjectNotExistsAsync(id, {\n type: \"state\",\n common: common as ioBroker.StateCommon,\n native: {},\n });\n await this.adapter.setStateAsync(id, { val: false, ack: true });\n this.createdIds.add(id);\n }\n\n /**\n * Ensure state exists and set value\n *\n * @param id State ID\n * @param name State name (translation object or string)\n * @param type Value type\n * @param role ioBroker role\n * @param value State value\n * @param unit Optional unit\n * @param write Whether state is writable\n * @param desc Optional translation object for `common.desc`\n * @param states Optional `common.states` map (translation objects)\n */\n private async ensureAndSet(\n id: string,\n name: StateName | string,\n type: ioBroker.CommonType,\n role: string,\n value: ioBroker.StateValue,\n unit?: string,\n write?: boolean,\n desc?: StateName,\n states?: Record<string, string>,\n ): Promise<void> {\n await this.createState(id, name, type, role, write ?? false, unit, desc, states);\n await this.adapter.setStateAsync(id, { val: value, ack: true });\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "homewizard",
|
|
4
|
-
"version": "0.7.
|
|
4
|
+
"version": "0.7.6",
|
|
5
5
|
"news": {
|
|
6
|
+
"0.7.6": {
|
|
7
|
+
"en": "The battery mode dropdown and the tariff state no longer crash the admin with \"Error in GUI\" when opened.",
|
|
8
|
+
"de": "Das Battery-Mode-Dropdown und der Tariff-State stürzen beim Öffnen im Admin nicht mehr mit \"Error in GUI\" ab.",
|
|
9
|
+
"ru": "Выпадающий список battery mode и состояние tariff больше не падают в админке с \"Error in GUI\" при открытии.",
|
|
10
|
+
"pt": "O dropdown de battery mode e o estado tariff já não falham com \"Error in GUI\" ao serem abertos no admin.",
|
|
11
|
+
"nl": "De battery-mode-dropdown en de tariff-state crashen niet meer met \"Error in GUI\" bij het openen in admin.",
|
|
12
|
+
"fr": "Le dropdown battery mode et l'état tariff ne plantent plus avec \"Error in GUI\" à l'ouverture dans l'admin.",
|
|
13
|
+
"it": "Il dropdown battery mode e lo stato tariff non si bloccano più con \"Error in GUI\" all'apertura nell'admin.",
|
|
14
|
+
"es": "El dropdown de battery mode y el estado tariff ya no fallan con \"Error in GUI\" al abrirse en el admin.",
|
|
15
|
+
"pl": "Lista battery mode i stan tariff nie zawieszają się już z \"Error in GUI\" przy otwieraniu w adminie.",
|
|
16
|
+
"uk": "Випадаючий список battery mode і стан tariff більше не падають в адміні з \"Error in GUI\" при відкритті.",
|
|
17
|
+
"zh-cn": "battery mode 下拉框和 tariff 状态在 admin 中打开时不再因 \"Error in GUI\" 崩溃。"
|
|
18
|
+
},
|
|
6
19
|
"0.7.5": {
|
|
7
20
|
"en": "Robustness: WebSocket heartbeat detects half-dead connections, auth handshake has a 45 s timeout, IP recovery and re-pair leak no sockets, one bad token no longer blocks the whole adapter.",
|
|
8
21
|
"de": "Robustheit: WebSocket-Heartbeat erkennt halb-tote Verbindungen, Auth-Handshake mit 45 s Timeout, IP-Recovery und Re-Pair leaken keine Sockets, defekter Token blockiert nicht mehr den Adapter.",
|
|
@@ -80,19 +93,6 @@
|
|
|
80
93
|
"pl": "Wiele języków: nazwy i opisy datapointów, wartości menu (tariff, battery.mode) i logi w języku systemu ioBroker (11 języków). Walidacja wprowadzania baterii. Min Node 22, Admin 7.8.23.",
|
|
81
94
|
"uk": "Багатомовність: імена та описи датапоінтів, значення меню (tariff, battery.mode) та логи мовою системи ioBroker (11 мов). Перевірка вводу для батареї. Мін. Node 22, Admin 7.8.23.",
|
|
82
95
|
"zh-cn": "多语言:数据点名称、描述、下拉值(tariff、battery.mode)和用户日志使用 ioBroker 系统语言(11 种)。电池输入会被校验。最低 Node 22、Admin 7.8.23。"
|
|
83
|
-
},
|
|
84
|
-
"0.6.7": {
|
|
85
|
-
"en": "Documentation: rewrote release notes in user-friendly style across all languages.",
|
|
86
|
-
"de": "Dokumentation: Release-Notes in alle Sprachen User-orientiert neu geschrieben.",
|
|
87
|
-
"ru": "Документация: примечания к релизу переписаны в дружественном к пользователю стиле на всех языках.",
|
|
88
|
-
"pt": "Documentação: notas de release reescritas em estilo amigável ao usuário em todos os idiomas.",
|
|
89
|
-
"nl": "Documentatie: release-notes herschreven in gebruikersvriendelijke stijl in alle talen.",
|
|
90
|
-
"fr": "Documentation : notes de version réécrites dans un style adapté à l'utilisateur dans toutes les langues.",
|
|
91
|
-
"it": "Documentazione: note di release riscritte in stile user-friendly in tutte le lingue.",
|
|
92
|
-
"es": "Documentación: notas de versión reescritas en estilo amigable para el usuario en todos los idiomas.",
|
|
93
|
-
"pl": "Dokumentacja: notatki wydania przepisane w przyjaznym dla użytkownika stylu we wszystkich językach.",
|
|
94
|
-
"uk": "Документація: нотатки до релізу переписано у дружньому до користувача стилі усіма мовами.",
|
|
95
|
-
"zh-cn": "文档:所有语言的发布说明已重写为用户友好的风格。"
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
98
|
"titleLang": {
|