iobroker.easee 2.0.0 → 3.0.0
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 +4 -3
- package/admin/jsonConfig.json +11 -1
- package/io-package.json +15 -2
- package/lib/{enum.js → enum.ts} +8 -10
- package/lib/observations.ts +156 -0
- package/lib/{signalr-http-client.js → signalr-http-client.ts} +34 -12
- package/lib/tools.ts +120 -0
- package/{main.js → main.ts} +318 -139
- package/package.json +10 -9
- package/admin/index_m.html +0 -149
- package/admin/style.css +0 -32
- package/admin/words.js +0 -39
- package/lib/observations.js +0 -89
- package/lib/tools.js +0 -97
- package/admin/i18n/{de/translations.json → de.json} +10 -10
- package/admin/i18n/{en/translations.json → en.json} +10 -10
- package/admin/i18n/{es/translations.json → es.json} +10 -10
- package/admin/i18n/{fr/translations.json → fr.json} +10 -10
- package/admin/i18n/{it/translations.json → it.json} +10 -10
- package/admin/i18n/{nl/translations.json → nl.json} +10 -10
- package/admin/i18n/{pl/translations.json → pl.json} +10 -10
- package/admin/i18n/{pt/translations.json → pt.json} +10 -10
- package/admin/i18n/{ru/translations.json → ru.json} +10 -10
- package/admin/i18n/{uk/translations.json → uk.json} +10 -10
- package/admin/i18n/{zh-cn/translations.json → zh-cn.json} +10 -10
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.easee",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "Adapter to connect Easee Wallbox",
|
|
5
5
|
"author": "Jens Nachtigal <info@newan.de>",
|
|
6
6
|
"contributors": [
|
|
@@ -17,41 +17,42 @@
|
|
|
17
17
|
"url": "https://github.com/iobroker-community-adapters/ioBroker.easee"
|
|
18
18
|
},
|
|
19
19
|
"engines": {
|
|
20
|
-
"node": ">= 22"
|
|
20
|
+
"node": ">= 22.19.0"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
23
|
"@iobroker/adapter-core": "^3.4.3",
|
|
24
|
-
"@microsoft/signalr": "^
|
|
24
|
+
"@microsoft/signalr": "^10.0.11",
|
|
25
25
|
"axios": "^1.7.9",
|
|
26
|
-
"
|
|
27
|
-
"tough-cookie": "^4.1.4"
|
|
26
|
+
"tough-cookie": "^6.0.2"
|
|
28
27
|
},
|
|
29
28
|
"devDependencies": {
|
|
29
|
+
"@alcalzone/esbuild-register": "^2.5.1-1",
|
|
30
30
|
"@alcalzone/release-script": "^5.2.1",
|
|
31
31
|
"@alcalzone/release-script-plugin-iobroker": "^5.2.0",
|
|
32
32
|
"@alcalzone/release-script-plugin-license": "^5.2.2",
|
|
33
33
|
"@alcalzone/release-script-plugin-manual-review": "^5.2.0",
|
|
34
|
-
"@iobroker/adapter-dev": "^1.
|
|
34
|
+
"@iobroker/adapter-dev": "^1.5.0",
|
|
35
35
|
"@iobroker/eslint-config": "^2.3.4",
|
|
36
36
|
"@iobroker/testing": "^6.3.1",
|
|
37
37
|
"@tsconfig/node22": "^22.0.6",
|
|
38
38
|
"@types/node": "^22.13.0",
|
|
39
|
+
"@types/tough-cookie": "^4.0.5",
|
|
39
40
|
"typescript": "^5.7.3"
|
|
40
41
|
},
|
|
41
|
-
"main": "main.
|
|
42
|
+
"main": "main.ts",
|
|
42
43
|
"files": [
|
|
43
44
|
"admin/",
|
|
44
45
|
"lib/",
|
|
45
46
|
"io-package.json",
|
|
46
47
|
"LICENSE",
|
|
47
|
-
"main.
|
|
48
|
+
"main.ts",
|
|
48
49
|
"package.json",
|
|
49
50
|
"README.md"
|
|
50
51
|
],
|
|
51
52
|
"scripts": {
|
|
52
53
|
"translate": "translate-adapter",
|
|
53
54
|
"release": "release-script",
|
|
54
|
-
"test:js": "mocha --config test/mocharc.custom.json \"{!(node_modules|test)/**/*.test.js,*.test.js,test/**/test!(PackageFiles|Startup).js}\"",
|
|
55
|
+
"test:js": "mocha --config test/mocharc.custom.json \"{!(node_modules|test)/**/*.test.{js,ts},*.test.{js,ts},test/**/test!(PackageFiles|Startup).{js,ts}}\"",
|
|
55
56
|
"test:package": "mocha test/package --exit",
|
|
56
57
|
"test:integration": "mocha test/integration --exit",
|
|
57
58
|
"test": "npm run test:js && npm run test:package",
|
package/admin/index_m.html
DELETED
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
<html>
|
|
2
|
-
<head>
|
|
3
|
-
<!-- Load ioBroker scripts and styles-->
|
|
4
|
-
<link rel="stylesheet" type="text/css" href="../../css/adapter.css" />
|
|
5
|
-
<link rel="stylesheet" type="text/css" href="../../lib/css/materialize.css">
|
|
6
|
-
|
|
7
|
-
<script type="text/javascript" src="../../lib/js/jquery-3.2.1.min.js"></script>
|
|
8
|
-
<script type="text/javascript" src="../../socket.io/socket.io.js"></script>
|
|
9
|
-
|
|
10
|
-
<script type="text/javascript" src="../../js/translate.js"></script>
|
|
11
|
-
<script type="text/javascript" src="../../lib/js/materialize.js"></script>
|
|
12
|
-
<script type="text/javascript" src="../../js/adapter-settings.js"></script>
|
|
13
|
-
|
|
14
|
-
<!-- Load our own files -->
|
|
15
|
-
<link rel="stylesheet" type="text/css" href="style.css" />
|
|
16
|
-
<script type="text/javascript" src="words.js"></script>
|
|
17
|
-
|
|
18
|
-
<script type="text/javascript">
|
|
19
|
-
var _secret;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
// This will be called by the admin adapter when the settings page loads
|
|
23
|
-
function load(settings, onChange) {
|
|
24
|
-
if (typeof supportsFeature !== 'function' || !supportsFeature('ADAPTER_AUTO_DECRYPT_NATIVE')) {
|
|
25
|
-
|
|
26
|
-
if (typeof systemSecret !== 'undefined') {
|
|
27
|
-
_secret = systemSecret;
|
|
28
|
-
} else {
|
|
29
|
-
_secret = (systemConfig && systemConfig.native && systemConfig.native.secret) || 'Zgfr56gFe87jJOM';
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
if (settings.client_secret) {
|
|
33
|
-
settings.client_secret = decrypt(_secret, settings.client_secret);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// example: select elements with id=key and class=value and insert value
|
|
38
|
-
if (!settings) return;
|
|
39
|
-
$('.value').each(function () {
|
|
40
|
-
var $key = $(this);
|
|
41
|
-
var id = $key.attr('id');
|
|
42
|
-
if ($key.attr('type') === 'checkbox') {
|
|
43
|
-
// do not call onChange direct, because onChange could expect some arguments
|
|
44
|
-
$key.prop('checked', settings[id])
|
|
45
|
-
.on('change', () => onChange())
|
|
46
|
-
;
|
|
47
|
-
} else {
|
|
48
|
-
// do not call onChange direct, because onChange could expect some arguments
|
|
49
|
-
$key.val(settings[id])
|
|
50
|
-
.on('change', () => onChange())
|
|
51
|
-
.on('keyup', () => onChange())
|
|
52
|
-
;
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
onChange(false);
|
|
56
|
-
|
|
57
|
-
// reinitialize all the Materialize labels on the page if you are dynamically adding inputs:
|
|
58
|
-
if (M) M.updateTextFields();
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// This will be called by the admin adapter when the user presses the save button
|
|
62
|
-
function save(callback) {
|
|
63
|
-
// example: select elements with class=value and build settings object
|
|
64
|
-
console.log(_secret);
|
|
65
|
-
var obj = {};
|
|
66
|
-
$('.value').each(function () {
|
|
67
|
-
var $this = $(this);
|
|
68
|
-
var id = $this.attr('id');
|
|
69
|
-
if ($this.attr('type') === 'checkbox') {
|
|
70
|
-
obj[id] = $this.prop('checked');
|
|
71
|
-
} else {
|
|
72
|
-
var value = $this.val();
|
|
73
|
-
if (typeof supportsFeature !== 'function' || !supportsFeature('ADAPTER_AUTO_DECRYPT_NATIVE')) {
|
|
74
|
-
if (id === 'client_secret') {
|
|
75
|
-
value = encrypt(_secret, value);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
obj[id] = value;
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
callback(obj);
|
|
82
|
-
}
|
|
83
|
-
</script>
|
|
84
|
-
</head>
|
|
85
|
-
<body>
|
|
86
|
-
|
|
87
|
-
<div class="m adapter-container">
|
|
88
|
-
|
|
89
|
-
<div class="row">
|
|
90
|
-
<div class="col s12 m4 l2">
|
|
91
|
-
<img src="easee.png" class="logo">
|
|
92
|
-
</div>
|
|
93
|
-
</div>
|
|
94
|
-
|
|
95
|
-
<div class="row">
|
|
96
|
-
<div class="col s12 m12">
|
|
97
|
-
<p class="translate title">Donate</p>
|
|
98
|
-
</div>
|
|
99
|
-
<div class="col s12 m2 center">
|
|
100
|
-
<form action="https://www.paypal.com/donate" method="post" target="_top">
|
|
101
|
-
<input type="hidden" name="hosted_button_id" value="AAFQ3WMM46LT8" />
|
|
102
|
-
<input type="image" src="https://www.paypalobjects.com/en_US/DK/i/btn/btn_donateCC_LG.gif" border="0" name="submit" title="PayPal - The safer, easier way to pay online!" alt="Donate with PayPal button" />
|
|
103
|
-
<img alt="" border="0" src="https://www.paypal.com/en_DE/i/scr/pixel.gif" width="1" height="1" />
|
|
104
|
-
</form>
|
|
105
|
-
</div>
|
|
106
|
-
<div class="col s10 m10" style="padding-top: 10px">
|
|
107
|
-
<p class="translate">donate_desc</p>
|
|
108
|
-
</div>
|
|
109
|
-
</div>
|
|
110
|
-
<div class="row">
|
|
111
|
-
<div class="col s12">
|
|
112
|
-
<h6 class="title translate">Account settings</h6>
|
|
113
|
-
</div>
|
|
114
|
-
</div>
|
|
115
|
-
<div class="row">
|
|
116
|
-
<div class="col s6 input-field">
|
|
117
|
-
<input type="text" class="value" id="username" />
|
|
118
|
-
<label for="username" class="translate">Username</label>
|
|
119
|
-
</div>
|
|
120
|
-
|
|
121
|
-
<div class="col s6 input-field">
|
|
122
|
-
<input type="password" class="value" id="client_secret" />
|
|
123
|
-
<label for="client_secret" class="translate">Password</label>
|
|
124
|
-
</div>
|
|
125
|
-
</div>
|
|
126
|
-
<div class="row">
|
|
127
|
-
<div class="col s12">
|
|
128
|
-
<h6 class="title translate">Api settings</h6>
|
|
129
|
-
</div>
|
|
130
|
-
</div>
|
|
131
|
-
<div class="row">
|
|
132
|
-
<div class="col s6 input-field">
|
|
133
|
-
<input type="number" class="value" id="polltime" />
|
|
134
|
-
<label for="polltime" class="translate">Poll interval in seconds</label>
|
|
135
|
-
</div>
|
|
136
|
-
<div class="col s6 input-field">
|
|
137
|
-
<input type="checkbox" class="value" id="signalR" />
|
|
138
|
-
<label for="option1" class="translate">Use SignalR</label>
|
|
139
|
-
</div>
|
|
140
|
-
</div>
|
|
141
|
-
<div class="row">
|
|
142
|
-
<div class="col s6 input-field">
|
|
143
|
-
<input type="checkbox" class="value" id="logtype" />
|
|
144
|
-
<label for="logtype" class="translate">detailed info logging</label>
|
|
145
|
-
</div>
|
|
146
|
-
</div>
|
|
147
|
-
</div>
|
|
148
|
-
</body>
|
|
149
|
-
</html>
|
package/admin/style.css
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/* You can delete those if you want. I just found them very helpful */
|
|
2
|
-
* {
|
|
3
|
-
box-sizing: border-box
|
|
4
|
-
}
|
|
5
|
-
.m {
|
|
6
|
-
/* Don't cut off dropdowns! */
|
|
7
|
-
overflow: initial;
|
|
8
|
-
}
|
|
9
|
-
.m.adapter-container,
|
|
10
|
-
.m.adapter-container > div.App {
|
|
11
|
-
/* Fix layout/scrolling issues with tabs */
|
|
12
|
-
height: 100%;
|
|
13
|
-
width: 100%;
|
|
14
|
-
position: relative;
|
|
15
|
-
}
|
|
16
|
-
.m .select-wrapper + label {
|
|
17
|
-
/* The positioning for dropdown labels is messed up */
|
|
18
|
-
transform: none !important;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
label > i[title] {
|
|
22
|
-
/* Display the help cursor for the tooltip icons and fix their positioning */
|
|
23
|
-
cursor: help;
|
|
24
|
-
margin-left: 0.25em;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
.dropdown-content {
|
|
28
|
-
/* Don't wrap text in dropdowns */
|
|
29
|
-
white-space: nowrap;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/* Add your styles here */
|
package/admin/words.js
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
/*global systemDictionary:true */
|
|
2
|
-
/*
|
|
3
|
-
+===================== DO NOT MODIFY ======================+
|
|
4
|
-
| This file was generated by translate-adapter, please use |
|
|
5
|
-
| `translate-adapter adminLanguages2words` to update it. |
|
|
6
|
-
+===================== DO NOT MODIFY ======================+
|
|
7
|
-
*/
|
|
8
|
-
'use strict';
|
|
9
|
-
|
|
10
|
-
systemDictionary = {
|
|
11
|
-
"API settings": { "en": "API settings", "de": "API-Einstellungen", "ru": "Настройки API", "pt": "configurações de API", "nl": "API-instellingen", "fr": "Paramètres de l'API", "it": "Impostazioni dell'API", "es": "Configuración de la API", "pl": "Ustawienia interfejsu API", "uk": "Налаштування API", "zh-cn": "API设置"},
|
|
12
|
-
"Account settings": { "en": "Account settings", "de": "Account Einstellungen", "ru": "Настройки учетной записи", "pt": "Configurações de Conta", "nl": "Account instellingen", "fr": "Paramètres du compte", "it": "Impostazioni dell'account", "es": "Configuraciones de la cuenta", "pl": "Ustawienia konta", "uk": "Налаштування аккаунта", "zh-cn": "帐号设定"},
|
|
13
|
-
"Api settings": { "en": "Api settings", "de": "API-Einstellungen", "ru": "Настройки API", "pt": "Configurações de API", "nl": "API-instellingen", "fr": "Paramètres de l'API", "it": "Impostazioni API", "es": "Configuración de api", "pl": "Ustawienia API", "uk": "", "zh-cn": "api设置"},
|
|
14
|
-
"Donate": { "en": "Donate", "de": "Spenden", "ru": "Пожертвовать", "pt": "Doar", "nl": "Doneer", "fr": "Donner", "it": "Donare", "es": "Donar", "pl": "Podarować", "uk": "Пожертвуйте", "zh-cn": "捐"},
|
|
15
|
-
"If you like the adapter and want to support the further development, you can thank me with a donation under PayPal. You are also welcome to send me feature requests for future versions of the adapter.": {"en": "If you like the adapter and want to support the further development, you can thank me with a donation under PayPal. You are also welcome to send me feature requests for future versions of the adapter.", "de": "Wenn Ihnen der Adapter gefällt und Sie die Weiterentwicklung unterstützen möchten, können Sie sich unter PayPal mit einer Spende bei mir bedanken. Gerne können Sie mir auch Feature-Anfragen für zukünftige Versionen des Adapters senden.", "ru": "Если вам понравился адаптер и вы хотите поддержать его дальнейшее развитие, вы можете отблагодарить меня пожертвованием через PayPal. Вы также можете присылать мне запросы функций для будущих версий адаптера.", "pt": "Se você gosta do adaptador e deseja apoiar o desenvolvimento, pode me agradecer com uma doação no PayPal. Você também pode me enviar solicitações de recursos para versões futuras do adaptador.", "nl": "Als je de adapter leuk vindt en de verdere ontwikkeling wilt ondersteunen, kun je me bedanken met een donatie via PayPal. U kunt mij ook functieverzoeken sturen voor toekomstige versies van de adapter.", "fr": "Si vous aimez l'adaptateur et souhaitez soutenir le développement ultérieur, vous pouvez me remercier en faisant un don via PayPal. Vous pouvez également m'envoyer des demandes de fonctionnalités pour les futures versions de l'adaptateur.", "it": "Se ti piace l'adattatore e vuoi supportare l'ulteriore sviluppo, puoi ringraziarmi con una donazione tramite PayPal. Puoi anche inviarmi richieste di funzionalità per le versioni future dell'adattatore.", "es": "Si le gusta el adaptador y desea apoyar el desarrollo posterior, puede agradecerme con una donación a través de PayPal. También puede enviarme solicitudes de funciones para futuras versiones del adaptador.", "pl": "Jeśli podoba Ci się adapter i chcesz wesprzeć dalszy rozwój, możesz mi podziękować darowizną w systemie PayPal. Zapraszam również do przesyłania mi propozycji funkcji dla przyszłych wersji adaptera.", "uk": "Якщо вам подобається адаптер і ви хочете підтримати подальший розвиток, ви можете віддячити мені пожертвою через PayPal. Ви також можете надсилати мені запити щодо функцій для майбутніх версій адаптера.", "zh-cn": "如果您喜欢该适配器并希望支持进一步的开发,您可以通过 PayPal 捐款来感谢我。也欢迎您向我发送有关适配器未来版本的功能请求。"},
|
|
16
|
-
"Password": { "en": "Password", "de": "Passwort", "ru": "Пароль", "pt": "Senha", "nl": "Wachtwoord", "fr": "Mot de passe", "it": "Parola d'ordine", "es": "Contraseña", "pl": "Hasło", "uk": "Пароль", "zh-cn": "密码"},
|
|
17
|
-
"Poll interval in seconds": { "en": "Poll interval in seconds", "de": "Abfrageintervall in Sekunden", "ru": "Интервал опроса в секундах", "pt": "Intervalo de votação em segundos", "nl": "Poll-interval in seconden", "fr": "Intervalle d'interrogation en secondes", "it": "Intervallo di polling in secondi", "es": "Intervalo de sondeo en segundos", "pl": "Interwał sondowania w sekundach", "uk": "Інтервал опитування в секундах", "zh-cn": "轮询间隔(以秒为单位)"},
|
|
18
|
-
"Use SignalR": { "en": "Use SignalR", "de": "Verwenden Sie SignalR", "ru": "Используйте сигналR", "pt": "Usar SignalR", "nl": "Gebruik SignaalR", "fr": "Utiliser SignalR", "it": "Usa SignalR", "es": "Usar SignalR", "pl": "Użyj SignalR", "uk": "Використовуйте SignalR", "zh-cn": "使用 SignalR"},
|
|
19
|
-
"Username": { "en": "Username", "de": "Nutzername", "ru": "Имя пользователя", "pt": "Nome de usuário", "nl": "Gebruikersnaam", "fr": "Nom d'utilisateur", "it": "Nome utente", "es": "Nombre de usuario", "pl": "Nazwa użytkownika", "uk": "Ім'я користувача", "zh-cn": "用户名"},
|
|
20
|
-
"Automatic": { "en": "Automatic", "de": "Automatisch", "ru": "Автоматически", "pt": "Automático", "nl": "Automatisch", "fr": "Automatique", "it": "Automatico", "es": "Automático", "pl": "Automatycznie", "uk": "Автоматично", "zh-cn": "自动"},
|
|
21
|
-
"Manual": { "en": "Manual", "de": "Manuell", "ru": "Вручную", "pt": "Manual", "nl": "Handmatig", "fr": "Manuel", "it": "Manuale", "es": "Manual", "pl": "Ręcznie", "uk": "Вручну", "zh-cn": "手动"},
|
|
22
|
-
"Session polling": { "en": "Session polling", "de": "Sitzungsabfrage", "ru": "Опрос сессий", "pt": "Consulta de sessões", "nl": "Sessiepeiling", "fr": "Interrogation des sessions", "it": "Interrogazione sessioni", "es": "Sondeo de sesiones", "pl": "Odpytanie sesji", "uk": "Опитування сеансів", "zh-cn": "会话轮询"},
|
|
23
|
-
"Session polling mode": { "en": "Session polling mode", "de": "Modus der Sitzungsabfrage", "ru": "Режим опроса сессий", "pt": "Modo de consulta de sessões", "nl": "Sessiepeilingsmodus", "fr": "Mode d'interrogation des sessions", "it": "Modalità di interrogazione sessioni", "es": "Modo de sondeo de sesiones", "pl": "Tryb odpytywania sesji", "uk": "Режим опитування сеансів", "zh-cn": "会话轮询模式"},
|
|
24
|
-
"Manual session interval per charger": { "en": "Manual session interval per charger", "de": "Manuelles Sitzungsintervall pro Wallbox", "ru": "Интервал опроса зарядной станции вручную", "pt": "Intervalo manual por carregador", "nl": "Handmatig sessie-interval per laadpunt", "fr": "Intervalle manuel par borne", "it": "Intervallo manuale per caricatore", "es": "Intervalo manual por cargador", "pl": "Ręczny interwał dla ładowarki", "uk": "Інтервал вручну для зарядної станції", "zh-cn": "每个充电桩的手动会话间隔"},
|
|
25
|
-
"Detected chargers": { "en": "Detected chargers", "de": "Erkannte Wallboxen", "ru": "Обнаруженные зарядные станции", "pt": "Carregadores detectados", "nl": "Gedetecteerde laadpunten", "fr": "Bornes détectées", "it": "Caricatori rilevati", "es": "Cargadores detectados", "pl": "Wykryte ładowarki", "uk": "Виявлені зарядні станції", "zh-cn": "检测到的充电桩数量"},
|
|
26
|
-
"Recommended interval per charger": { "en": "Recommended interval per charger", "de": "Empfohlenes Intervall pro Wallbox", "ru": "Рекомендуемый интервал для станции", "pt": "Intervalo recomendado por carregador", "nl": "Aanbevolen interval per laadpunt", "fr": "Intervalle recommandé par borne", "it": "Intervallo consigliato per caricatore", "es": "Intervalo recomendado por cargador", "pl": "Zalecany interwał dla ładowarki", "uk": "Рекомендований інтервал для станції", "zh-cn": "每个充电桩的建议间隔"},
|
|
27
|
-
"Effective interval per charger": { "en": "Effective interval per charger", "de": "Effektives Intervall pro Wallbox", "ru": "Фактический интервал для станции", "pt": "Intervalo efetivo por carregador", "nl": "Effectief interval per laadpunt", "fr": "Intervalle effectif par borne", "it": "Intervallo effettivo per caricatore", "es": "Intervalo efectivo por cargador", "pl": "Efektywny interwał dla ładowarki", "uk": "Фактичний інтервал для станції", "zh-cn": "每个充电桩的实际间隔"},
|
|
28
|
-
"Automatic mode uses seven minutes per detected charger. Manual mode sets the desired interval per charger.": {"en": "Automatic mode uses seven minutes per detected charger. Manual mode sets the desired interval per charger.", "de": "Der automatische Modus verwendet sieben Minuten pro erkannter Wallbox. Im manuellen Modus legen Sie das gewünschte Intervall pro Wallbox fest.", "ru": "Автоматический режим использует семь минут на каждую обнаруженную станцию. В ручном режиме задается интервал для каждой станции.", "pt": "O modo automático usa sete minutos por carregador detectado. O modo manual define o intervalo desejado por carregador.", "nl": "De automatische modus gebruikt zeven minuten per gedetecteerd laadpunt. In de handmatige modus stelt u het gewenste interval per laadpunt in.", "fr": "Le mode automatique utilise sept minutes par borne détectée. Le mode manuel définit l'intervalle souhaité par borne.", "it": "La modalità automatica usa sette minuti per ogni caricatore rilevato. La modalità manuale imposta l'intervallo desiderato per caricatore.", "es": "El modo automático usa siete minutos por cargador detectado. El modo manual establece el intervalo deseado por cargador.", "pl": "Tryb automatyczny używa siedmiu minut na wykrytą ładowarkę. Tryb ręczny ustawia żądany interwał dla każdej ładowarki.", "uk": "Автоматичний режим використовує сім хвилин для кожної виявленої станції. У ручному режимі задається інтервал для кожної станції.", "zh-cn": "自动模式按每个检测到的充电桩七分钟计算。手动模式设置每个充电桩所需的间隔。"},
|
|
29
|
-
"Intervals below the recommendation are conservatively clamped to the recommendation.": {"en": "Intervals below the recommendation are conservatively clamped to the recommendation.", "de": "Intervalle unterhalb der Empfehlung werden vorsichtshalber auf die Empfehlung angehoben.", "ru": "Интервалы ниже рекомендации автоматически увеличиваются до рекомендованного значения.", "pt": "Intervalos abaixo da recomendação são aumentados por precaução até o valor recomendado.", "nl": "Intervallen onder de aanbeveling worden uit voorzorg verhoogd tot de aanbeveling.", "fr": "Les intervalles inférieurs à la recommandation sont relevés par précaution à cette valeur.", "it": "Gli intervalli inferiori alla raccomandazione vengono aumentati per precauzione.", "es": "Los intervalos inferiores a la recomendación se ajustan a esta por seguridad.", "pl": "Interwały krótsze od zalecanych są ostrożnościowo wydłużane do zalecanej wartości.", "uk": "Інтервали, коротші за рекомендовані, автоматично збільшуються до рекомендованого значення.", "zh-cn": "低于建议值的间隔将保守地调整为建议值。"},
|
|
30
|
-
"The configured interval is below the recommendation and will be clamped.": {"en": "The configured interval is below the recommendation and will be clamped.", "de": "Das konfigurierte Intervall liegt unter der Empfehlung und wird entsprechend angehoben.", "ru": "Заданный интервал ниже рекомендации и будет увеличен.", "pt": "O intervalo configurado está abaixo da recomendação e será aumentado.", "nl": "Het ingestelde interval ligt onder de aanbeveling en wordt verhoogd.", "fr": "L'intervalle configuré est inférieur à la recommandation et sera relevé.", "it": "L'intervallo configurato è inferiore alla raccomandazione e verrà aumentato.", "es": "El intervalo configurado es inferior a la recomendación y se ajustará.", "pl": "Skonfigurowany interwał jest krótszy od zalecanego i zostanie wydłużony.", "uk": "Заданий інтервал коротший за рекомендований і буде збільшений.", "zh-cn": "配置的间隔低于建议值,将自动调整。"},
|
|
31
|
-
"detailed info logging": { "en": "detailed info logging", "de": "detaillierte Info-Protokollierung", "ru": "регистрация подробной информации", "pt": "registro de informações detalhadas", "nl": "gedetailleerde info logging", "fr": "journalisation des informations détaillées", "it": "registrazione di informazioni dettagliate", "es": "registro de información detallada", "pl": "szczegółowe rejestrowanie informacji", "uk": "детальна реєстрація інформації", "zh-cn": "详细信息记录"},
|
|
32
|
-
"detailed logging": { "en": "detailed logging", "de": "detailiertes Logging", "ru": "", "pt": "", "nl": "", "fr": "", "it": "", "es": "", "pl": "", "uk": "", "zh-cn": ""},
|
|
33
|
-
"donate_desc": { "en": "If you like the adapter and want to support the further development, you can thank me with a donation under <a href='https://www.paypal.com/donate?hosted_button_id=AAFQ3WMM46LT8' target='_blank'>PayPal</a>. You are also welcome to send me feature requests for future versions of the adapter.", "de": "Wenn Ihnen der Adapter gefällt und Sie die weitere Entwicklung unterstützen möchten, können Sie sich mit einer Spende unter <a href='https://www.paypal.com/donate?hosted_button_id=AAFQ3WMM46LT8' target='_blank'>PayPal</a> bei mir bedanken. Sie können mir auch gerne Funktionsanfragen für zukünftige Versionen des Adapters senden.", "ru": "Если вам понравился адаптер и вы хотите поддержать его дальнейшее развитие, вы можете поблагодарить меня, сделав пожертвование в рамках <a href='https://www.paypal.com/donate?hosted_button_id=AAFQ3WMM46LT8' target='_blank'>PayPal</a>. Вы также можете присылать мне запросы функций для будущих версий адаптера.", "pt": "Se você gosta do adaptador e deseja apoiar o desenvolvimento posterior, pode me agradecer com uma doação em <a href='https://www.paypal.com/donate?hosted_button_id=AAFQ3WMM46LT8' target='_blank'>PayPal</a>. Você também pode me enviar solicitações de recursos para versões futuras do adaptador.", "nl": "Als je de adapter leuk vindt en de verdere ontwikkeling wilt ondersteunen, kun je me bedanken met een donatie onder <a href='https://www.paypal.com/donate?hosted_button_id=AAFQ3WMM46LT8' target='_blank'>PayPal</a>. U kunt mij ook functieverzoeken sturen voor toekomstige versies van de adapter.", "fr": "Si vous aimez l'adaptateur et souhaitez soutenir le développement ultérieur, vous pouvez me remercier d'un don sous <a href='https://www.paypal.com/donate?hosted_button_id=AAFQ3WMM46LT8' target='_blank'>PayPal</a>. Vous pouvez également m'envoyer des demandes de fonctionnalités pour les futures versions de l'adaptateur.", "it": "Se ti piace l'adattatore e vuoi sostenere l'ulteriore sviluppo, puoi ringraziarmi con una donazione sotto <a href='https://www.paypal.com/donate?hosted_button_id=AAFQ3WMM46LT8' target='_blank'>PayPal</a>. Puoi anche inviarmi richieste di funzionalità per le versioni future dell'adattatore.", "es": "Si le gusta el adaptador y desea apoyar el desarrollo posterior, puede agradecerme con una donación en <a href='https://www.paypal.com/donate?hosted_button_id=AAFQ3WMM46LT8' target='_blank'>PayPal</a>. También puede enviarme solicitudes de funciones para futuras versiones del adaptador.", "pl": "Jeśli podoba Ci się adapter i chcesz wesprzeć dalszy rozwój, możesz mi podziękować darowizną w ramach <a href='https://www.paypal.com/donate?hosted_button_id=AAFQ3WMM46LT8' target='_blank'>PayPal</a>. Zapraszam również do przesyłania mi próśb o funkcje dotyczące przyszłych wersji adaptera.", "uk": "", "zh-cn": "如果您喜欢适配器并希望支持进一步的开发,可以在<a href='https://www.paypal.com/donate?hosted_button_id=AAFQ3WMM46LT8' target='_blank'>PayPal</a>下捐款以表示感谢。也欢迎您向我发送有关适配器将来版本的功能请求。"},
|
|
34
|
-
"easee adapter settings": { "en": "Adapter settings for easee", "de": "Adaptereinstellungen für easee", "ru": "Настройки адаптера для easee", "pt": "Configurações do adaptador para easee", "nl": "Adapterinstellingen voor easee", "fr": "Paramètres d'adaptateur pour easee", "it": "Impostazioni dell'adattatore per easee", "es": "Ajustes del adaptador para easee", "pl": "Ustawienia adaptera dla easee", "uk": "", "zh-cn": "easee的适配器设置"},
|
|
35
|
-
"password of Easee cloud": { "en": "password of Easee cloud", "de": "Passwort der Easee Cloud", "ru": "пароль к облаку Easee", "pt": "senha da nuvem Easee", "nl": "wachtwoord van Easee cloud", "fr": "mot de passe du cloud Easee", "it": "password di Easee nuvola", "es": "contraseña de la nube de Easee", "pl": "hasło do chmury Easee", "uk": "пароль хмари Easee", "zh-cn": "易视云密码"},
|
|
36
|
-
"polltime": { "en": "polltime", "de": "Abfrageintervall", "ru": "время опроса", "pt": "votação", "nl": "polltijd", "fr": "heure du sondage", "it": "polltime", "es": "hora de votar", "pl": "czas głosowania", "uk": "час опитування", "zh-cn": "轮询时间"},
|
|
37
|
-
"provide additional logging in info area": { "en": "provide additional logging in info area", "de": "zusätzliche Protokollierung im Info-Bereich", "ru": "обеспечить дополнительную регистрацию в информационной области", "pt": "fornecer login adicional na área de informações", "nl": "zorg voor extra aanmeldingsinfogebied", "fr": "fournir une connexion supplémentaire dans la zone d'informations", "it": "fornire ulteriori informazioni di accesso nell'area", "es": "proporcionar acceso adicional en el área de información", "pl": "zapewnić dodatkowy obszar informacji o logowaniu", "uk": "забезпечити додаткову реєстрацію в інформаційній області", "zh-cn": "在信息区域提供额外的日志记录"},
|
|
38
|
-
"username to access Easee cloud": { "en": "username to access Easee cloud", "de": "Benutzername für den Zugriff auf die Easee-Cloud", "ru": "имя пользователя для доступа к облаку Easee", "pt": "nome de usuário para acessar a nuvem Easee", "nl": "gebruikersnaam om toegang te krijgen tot de Easee-cloud", "fr": "nom d'utilisateur pour accéder au cloud Easee", "it": "nome utente per accedere a Easee cloud", "es": "nombre de usuario para acceder a la nube de Easee", "pl": "nazwę użytkownika, aby uzyskać dostęp do chmury Easee", "uk": "ім’я користувача для доступу до хмари Easee", "zh-cn": "访问易视云的用户名"},
|
|
39
|
-
};
|
package/lib/observations.js
DELETED
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
const CHARGER_STATE_OBSERVATION_IDS = [
|
|
4
|
-
46, 48, 68, 80, 96, 102, 103, 109, 111, 112, 113, 114, 120, 122, 124, 132,
|
|
5
|
-
182, 183, 184, 185, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 250,
|
|
6
|
-
];
|
|
7
|
-
|
|
8
|
-
const STATE_FIELDS_BY_OBSERVATION_ID = {
|
|
9
|
-
46: "ledMode",
|
|
10
|
-
48: "dynamicChargerCurrent",
|
|
11
|
-
68: "wiFiAPEnabled",
|
|
12
|
-
80: "chargerFirmware",
|
|
13
|
-
96: "reasonForNoCurrent",
|
|
14
|
-
102: "smartCharging",
|
|
15
|
-
103: "cableLocked",
|
|
16
|
-
109: "chargerOpMode",
|
|
17
|
-
111: "dynamicCircuitCurrentP1",
|
|
18
|
-
112: "dynamicCircuitCurrentP2",
|
|
19
|
-
113: "dynamicCircuitCurrentP3",
|
|
20
|
-
114: "outputCurrent",
|
|
21
|
-
120: "totalPower",
|
|
22
|
-
122: "energyPerHour",
|
|
23
|
-
124: "lifetimeEnergy",
|
|
24
|
-
132: "wiFiRSSI",
|
|
25
|
-
182: "inCurrentT2",
|
|
26
|
-
183: "inCurrentT3",
|
|
27
|
-
184: "inCurrentT4",
|
|
28
|
-
185: "inCurrentT5",
|
|
29
|
-
190: "inVoltageT1T2",
|
|
30
|
-
191: "inVoltageT1T3",
|
|
31
|
-
192: "inVoltageT1T4",
|
|
32
|
-
193: "inVoltageT1T5",
|
|
33
|
-
194: "inVoltageT2T3",
|
|
34
|
-
195: "inVoltageT2T4",
|
|
35
|
-
196: "inVoltageT2T5",
|
|
36
|
-
197: "inVoltageT3T4",
|
|
37
|
-
198: "inVoltageT3T5",
|
|
38
|
-
199: "inVoltageT4T5",
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
const SUPPLY_VOLTAGE_FIELDS = [
|
|
42
|
-
"inVoltageT2T3",
|
|
43
|
-
"inVoltageT1T3",
|
|
44
|
-
"inVoltageT1T4",
|
|
45
|
-
"inVoltageT1T5",
|
|
46
|
-
"inVoltageT2T4",
|
|
47
|
-
"inVoltageT2T5",
|
|
48
|
-
];
|
|
49
|
-
|
|
50
|
-
function observationsToChargerState(responseData) {
|
|
51
|
-
const observations = Array.isArray(responseData?.observations)
|
|
52
|
-
? responseData.observations
|
|
53
|
-
: [];
|
|
54
|
-
/** @type {Record<string, any>} */
|
|
55
|
-
const chargerState = Object.fromEntries(
|
|
56
|
-
Object.values(STATE_FIELDS_BY_OBSERVATION_ID).map((field) => [field, null]),
|
|
57
|
-
);
|
|
58
|
-
|
|
59
|
-
for (const observation of observations) {
|
|
60
|
-
const field = STATE_FIELDS_BY_OBSERVATION_ID[observation.id];
|
|
61
|
-
if (field !== undefined) {
|
|
62
|
-
chargerState[field] = observation.value;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const cloudObservation = observations.find(
|
|
67
|
-
(observation) => observation.id === 250,
|
|
68
|
-
);
|
|
69
|
-
if (cloudObservation) {
|
|
70
|
-
chargerState.isOnline = Boolean(cloudObservation.value);
|
|
71
|
-
}
|
|
72
|
-
chargerState.voltage = null;
|
|
73
|
-
for (const field of SUPPLY_VOLTAGE_FIELDS) {
|
|
74
|
-
const value = chargerState[field];
|
|
75
|
-
if (
|
|
76
|
-
typeof value === "number" &&
|
|
77
|
-
Number.isFinite(value) &&
|
|
78
|
-
value >= 100 &&
|
|
79
|
-
value <= 300
|
|
80
|
-
) {
|
|
81
|
-
chargerState.voltage = value;
|
|
82
|
-
break;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
return chargerState;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
module.exports = { CHARGER_STATE_OBSERVATION_IDS, observationsToChargerState };
|
package/lib/tools.js
DELETED
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
const axios = require("axios").default;
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Tests whether the given variable is a real object and not an Array
|
|
5
|
-
*
|
|
6
|
-
* @param {any} it The variable to test
|
|
7
|
-
* @returns {it is Record<string, any>} True if the variable is an object, false otherwise
|
|
8
|
-
*/
|
|
9
|
-
function isObject(it) {
|
|
10
|
-
return Object.prototype.toString.call(it) === "[object Object]";
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Tests whether the given variable is really an Array
|
|
15
|
-
*
|
|
16
|
-
* @param {any} it The variable to test
|
|
17
|
-
* @returns {it is any[]} True if the variable is an array, false otherwise
|
|
18
|
-
*/
|
|
19
|
-
function isArray(it) {
|
|
20
|
-
return Array.isArray(it);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Translates text to the target language. Automatically chooses the right translation API.
|
|
25
|
-
*
|
|
26
|
-
* @param {string} text The text to translate
|
|
27
|
-
* @param {string} targetLang The target language
|
|
28
|
-
* @param {string} [yandexApiKey] The yandex API key. You can create one for free at https://translate.yandex.com/developers
|
|
29
|
-
* @returns {Promise<string>} The translated text
|
|
30
|
-
*/
|
|
31
|
-
async function translateText(text, targetLang, yandexApiKey) {
|
|
32
|
-
if (!text) {
|
|
33
|
-
return "";
|
|
34
|
-
}
|
|
35
|
-
if (targetLang === "en") {
|
|
36
|
-
return text;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
return yandexApiKey
|
|
40
|
-
? translateYandex(text, targetLang, yandexApiKey)
|
|
41
|
-
: translateGoogle(text, targetLang);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Translates text with Yandex API
|
|
46
|
-
*
|
|
47
|
-
* @param {string} text The text to translate
|
|
48
|
-
* @param {string} targetLang The target language
|
|
49
|
-
* @param {string} apiKey The yandex API key. You can create one for free at https://translate.yandex.com/developers
|
|
50
|
-
* @returns {Promise<string>} The translated text
|
|
51
|
-
*/
|
|
52
|
-
async function translateYandex(text, targetLang, apiKey) {
|
|
53
|
-
if (targetLang === "zh-cn") {
|
|
54
|
-
targetLang = "zh";
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
const url = `https://translate.yandex.net/api/v1.5/tr.json/translate?key=${apiKey}&text=${encodeURIComponent(text)}&lang=en-${targetLang}`;
|
|
58
|
-
try {
|
|
59
|
-
const response = await axios.get(url, { timeout: 15000 });
|
|
60
|
-
if (response.data?.text && isArray(response.data.text)) {
|
|
61
|
-
return response.data.text[0];
|
|
62
|
-
}
|
|
63
|
-
throw new Error("Invalid response for translate request");
|
|
64
|
-
} catch (e) {
|
|
65
|
-
throw new Error(`Could not translate to "${targetLang}": ${e.message}`);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Translates text with Google API
|
|
71
|
-
*
|
|
72
|
-
* @param {string} text The text to translate
|
|
73
|
-
* @param {string} targetLang The target language
|
|
74
|
-
* @returns {Promise<string>} The translated text
|
|
75
|
-
*/
|
|
76
|
-
async function translateGoogle(text, targetLang) {
|
|
77
|
-
const url = `http://translate.googleapis.com/translate_a/single?client=gtx&sl=en&tl=${targetLang}&dt=t&q=${encodeURIComponent(text)}&ie=UTF-8&oe=UTF-8`;
|
|
78
|
-
try {
|
|
79
|
-
const response = await axios.get(url, { timeout: 15000 });
|
|
80
|
-
if (isArray(response.data)) {
|
|
81
|
-
return response.data[0][0][0];
|
|
82
|
-
}
|
|
83
|
-
throw new Error("Invalid response for translate request");
|
|
84
|
-
} catch (e) {
|
|
85
|
-
const errorMessage =
|
|
86
|
-
e.response?.status === 429
|
|
87
|
-
? `Rate-limited by Google Translate`
|
|
88
|
-
: e.message;
|
|
89
|
-
throw new Error(`Could not translate to "${targetLang}": ${errorMessage}`);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
module.exports = {
|
|
94
|
-
isArray,
|
|
95
|
-
isObject,
|
|
96
|
-
translateText,
|
|
97
|
-
};
|
|
@@ -2,23 +2,23 @@
|
|
|
2
2
|
"API settings": "API-Einstellungen",
|
|
3
3
|
"Account settings": "Account Einstellungen",
|
|
4
4
|
"Api settings": "API-Einstellungen",
|
|
5
|
+
"Automatic": "Automatisch",
|
|
6
|
+
"Automatic mode uses seven minutes per detected charger. Manual mode sets the desired interval per charger.": "Der automatische Modus verwendet sieben Minuten pro erkannter Wallbox. Im manuellen Modus legen Sie das gewünschte Intervall pro Wallbox fest.",
|
|
7
|
+
"Detected chargers": "Erkannte Wallboxen",
|
|
5
8
|
"Donate": "Spenden",
|
|
9
|
+
"Effective interval per charger": "Effektives Intervall pro Wallbox",
|
|
6
10
|
"If you like the adapter and want to support the further development, you can thank me with a donation under PayPal. You are also welcome to send me feature requests for future versions of the adapter.": "Wenn Ihnen der Adapter gefällt und Sie die Weiterentwicklung unterstützen möchten, können Sie sich unter PayPal mit einer Spende bei mir bedanken. Gerne können Sie mir auch Feature-Anfragen für zukünftige Versionen des Adapters senden.",
|
|
11
|
+
"Intervals below the recommendation are conservatively clamped to the recommendation.": "Intervalle unterhalb der Empfehlung werden vorsichtshalber auf die Empfehlung angehoben.",
|
|
12
|
+
"Manual": "Manuell",
|
|
13
|
+
"Manual session interval per charger": "Manuelles Sitzungsintervall pro Wallbox",
|
|
7
14
|
"Password": "Passwort",
|
|
8
15
|
"Poll interval in seconds": "Abfrageintervall in Sekunden",
|
|
9
|
-
"
|
|
10
|
-
"Username": "Nutzername",
|
|
11
|
-
"Automatic": "Automatisch",
|
|
12
|
-
"Manual": "Manuell",
|
|
16
|
+
"Recommended interval per charger": "Empfohlenes Intervall pro Wallbox",
|
|
13
17
|
"Session polling": "Sitzungsabfrage",
|
|
14
18
|
"Session polling mode": "Modus der Sitzungsabfrage",
|
|
15
|
-
"Manual session interval per charger": "Manuelles Sitzungsintervall pro Wallbox",
|
|
16
|
-
"Detected chargers": "Erkannte Wallboxen",
|
|
17
|
-
"Recommended interval per charger": "Empfohlenes Intervall pro Wallbox",
|
|
18
|
-
"Effective interval per charger": "Effektives Intervall pro Wallbox",
|
|
19
|
-
"Automatic mode uses seven minutes per detected charger. Manual mode sets the desired interval per charger.": "Der automatische Modus verwendet sieben Minuten pro erkannter Wallbox. Im manuellen Modus legen Sie das gewünschte Intervall pro Wallbox fest.",
|
|
20
|
-
"Intervals below the recommendation are conservatively clamped to the recommendation.": "Intervalle unterhalb der Empfehlung werden vorsichtshalber auf die Empfehlung angehoben.",
|
|
21
19
|
"The configured interval is below the recommendation and will be clamped.": "Das konfigurierte Intervall liegt unter der Empfehlung und wird entsprechend angehoben.",
|
|
20
|
+
"Use SignalR": "Verwenden Sie SignalR",
|
|
21
|
+
"Username": "Nutzername",
|
|
22
22
|
"detailed info logging": "detaillierte Info-Protokollierung",
|
|
23
23
|
"detailed logging": "detailiertes Logging",
|
|
24
24
|
"donate_desc": "Wenn Ihnen der Adapter gefällt und Sie die weitere Entwicklung unterstützen möchten, können Sie sich mit einer Spende unter <a href='https://www.paypal.com/donate?hosted_button_id=AAFQ3WMM46LT8' target='_blank'>PayPal</a> bei mir bedanken. Sie können mir auch gerne Funktionsanfragen für zukünftige Versionen des Adapters senden.",
|
|
@@ -2,23 +2,23 @@
|
|
|
2
2
|
"API settings": "API settings",
|
|
3
3
|
"Account settings": "Account settings",
|
|
4
4
|
"Api settings": "Api settings",
|
|
5
|
+
"Automatic": "Automatic",
|
|
6
|
+
"Automatic mode uses seven minutes per detected charger. Manual mode sets the desired interval per charger.": "Automatic mode uses seven minutes per detected charger. Manual mode sets the desired interval per charger.",
|
|
7
|
+
"Detected chargers": "Detected chargers",
|
|
5
8
|
"Donate": "Donate",
|
|
9
|
+
"Effective interval per charger": "Effective interval per charger",
|
|
6
10
|
"If you like the adapter and want to support the further development, you can thank me with a donation under PayPal. You are also welcome to send me feature requests for future versions of the adapter.": "If you like the adapter and want to support the further development, you can thank me with a donation under PayPal. You are also welcome to send me feature requests for future versions of the adapter.",
|
|
11
|
+
"Intervals below the recommendation are conservatively clamped to the recommendation.": "Intervals below the recommendation are conservatively clamped to the recommendation.",
|
|
12
|
+
"Manual": "Manual",
|
|
13
|
+
"Manual session interval per charger": "Manual session interval per charger",
|
|
7
14
|
"Password": "Password",
|
|
8
15
|
"Poll interval in seconds": "Poll interval in seconds",
|
|
9
|
-
"
|
|
10
|
-
"Username": "Username",
|
|
11
|
-
"Automatic": "Automatic",
|
|
12
|
-
"Manual": "Manual",
|
|
16
|
+
"Recommended interval per charger": "Recommended interval per charger",
|
|
13
17
|
"Session polling": "Session polling",
|
|
14
18
|
"Session polling mode": "Session polling mode",
|
|
15
|
-
"Manual session interval per charger": "Manual session interval per charger",
|
|
16
|
-
"Detected chargers": "Detected chargers",
|
|
17
|
-
"Recommended interval per charger": "Recommended interval per charger",
|
|
18
|
-
"Effective interval per charger": "Effective interval per charger",
|
|
19
|
-
"Automatic mode uses seven minutes per detected charger. Manual mode sets the desired interval per charger.": "Automatic mode uses seven minutes per detected charger. Manual mode sets the desired interval per charger.",
|
|
20
|
-
"Intervals below the recommendation are conservatively clamped to the recommendation.": "Intervals below the recommendation are conservatively clamped to the recommendation.",
|
|
21
19
|
"The configured interval is below the recommendation and will be clamped.": "The configured interval is below the recommendation and will be clamped.",
|
|
20
|
+
"Use SignalR": "Use SignalR",
|
|
21
|
+
"Username": "Username",
|
|
22
22
|
"detailed info logging": "detailed info logging",
|
|
23
23
|
"detailed logging": "detailed logging",
|
|
24
24
|
"donate_desc": "If you like the adapter and want to support the further development, you can thank me with a donation under <a href='https://www.paypal.com/donate?hosted_button_id=AAFQ3WMM46LT8' target='_blank'>PayPal</a>. You are also welcome to send me feature requests for future versions of the adapter.",
|
|
@@ -2,23 +2,23 @@
|
|
|
2
2
|
"API settings": "Configuración de la API",
|
|
3
3
|
"Account settings": "Configuraciones de la cuenta",
|
|
4
4
|
"Api settings": "Configuración de api",
|
|
5
|
+
"Automatic": "Automático",
|
|
6
|
+
"Automatic mode uses seven minutes per detected charger. Manual mode sets the desired interval per charger.": "El modo automático usa siete minutos por cargador detectado. El modo manual establece el intervalo deseado por cargador.",
|
|
7
|
+
"Detected chargers": "Cargadores detectados",
|
|
5
8
|
"Donate": "Donar",
|
|
9
|
+
"Effective interval per charger": "Intervalo efectivo por cargador",
|
|
6
10
|
"If you like the adapter and want to support the further development, you can thank me with a donation under PayPal. You are also welcome to send me feature requests for future versions of the adapter.": "Si le gusta el adaptador y desea apoyar el desarrollo posterior, puede agradecerme con una donación a través de PayPal. También puede enviarme solicitudes de funciones para futuras versiones del adaptador.",
|
|
11
|
+
"Intervals below the recommendation are conservatively clamped to the recommendation.": "Los intervalos inferiores a la recomendación se ajustan a esta por seguridad.",
|
|
12
|
+
"Manual": "Manual",
|
|
13
|
+
"Manual session interval per charger": "Intervalo manual por cargador",
|
|
7
14
|
"Password": "Contraseña",
|
|
8
15
|
"Poll interval in seconds": "Intervalo de sondeo en segundos",
|
|
9
|
-
"
|
|
10
|
-
"Username": "Nombre de usuario",
|
|
11
|
-
"Automatic": "Automático",
|
|
12
|
-
"Manual": "Manual",
|
|
16
|
+
"Recommended interval per charger": "Intervalo recomendado por cargador",
|
|
13
17
|
"Session polling": "Sondeo de sesiones",
|
|
14
18
|
"Session polling mode": "Modo de sondeo de sesiones",
|
|
15
|
-
"Manual session interval per charger": "Intervalo manual por cargador",
|
|
16
|
-
"Detected chargers": "Cargadores detectados",
|
|
17
|
-
"Recommended interval per charger": "Intervalo recomendado por cargador",
|
|
18
|
-
"Effective interval per charger": "Intervalo efectivo por cargador",
|
|
19
|
-
"Automatic mode uses seven minutes per detected charger. Manual mode sets the desired interval per charger.": "El modo automático usa siete minutos por cargador detectado. El modo manual establece el intervalo deseado por cargador.",
|
|
20
|
-
"Intervals below the recommendation are conservatively clamped to the recommendation.": "Los intervalos inferiores a la recomendación se ajustan a esta por seguridad.",
|
|
21
19
|
"The configured interval is below the recommendation and will be clamped.": "El intervalo configurado es inferior a la recomendación y se ajustará.",
|
|
20
|
+
"Use SignalR": "Usar SignalR",
|
|
21
|
+
"Username": "Nombre de usuario",
|
|
22
22
|
"detailed info logging": "registro de información detallada",
|
|
23
23
|
"detailed logging": "",
|
|
24
24
|
"donate_desc": "Si le gusta el adaptador y desea apoyar el desarrollo posterior, puede agradecerme con una donación en <a href='https://www.paypal.com/donate?hosted_button_id=AAFQ3WMM46LT8' target='_blank'>PayPal</a>. También puede enviarme solicitudes de funciones para futuras versiones del adaptador.",
|