iobroker.al-ko 0.3.5 → 0.3.7
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 +12 -1
- package/admin/i18n/de/translations.json +6 -1
- package/admin/i18n/en/translations.json +7 -2
- package/admin/i18n/es/translations.json +6 -1
- package/admin/i18n/fr/translations.json +6 -1
- package/admin/i18n/it/translations.json +6 -1
- package/admin/i18n/nl/translations.json +6 -1
- package/admin/i18n/pl/translations.json +6 -1
- package/admin/i18n/pt/translations.json +6 -1
- package/admin/i18n/ru/translations.json +6 -1
- package/admin/i18n/uk/translations.json +6 -1
- package/admin/i18n/zh-cn/translations.json +6 -1
- package/admin/jsonConfig.json +7 -22
- package/docs/de/README.md +12 -1
- package/docs/en/README.md +11 -1
- package/io-package.json +46 -6
- package/main.js +212 -55
- package/package.json +9 -11
- package/whitelist.json +3 -1
package/README.md
CHANGED
|
@@ -53,13 +53,24 @@ Do **not** contact AL-KO customer service regarding this project.
|
|
|
53
53
|
|
|
54
54
|
## Changelog
|
|
55
55
|
|
|
56
|
+
### 0.3.7 (2026-05-07)
|
|
57
|
+
- Updated dependencies (including axios security fixes)
|
|
58
|
+
- Require Node.js >= 22
|
|
59
|
+
- Stability improvements
|
|
60
|
+
|
|
61
|
+
### 0.3.6 (2026-04-26)
|
|
62
|
+
- Fixed invalid state roles (`value.number` removed, correct usage of `value` and `level`)
|
|
63
|
+
- Fixed whitelist handling for writable states
|
|
64
|
+
- Improved object structure according to review feedback
|
|
65
|
+
|
|
56
66
|
### 0.3.5 (2026-03-26)
|
|
57
67
|
|
|
58
68
|
- Enable npm trusted publishing
|
|
59
69
|
- Fix GitHub Actions workflow warnings
|
|
60
70
|
|
|
71
|
+
|
|
61
72
|
➡ Full changelog here:
|
|
62
|
-
[
|
|
73
|
+
[CHANGELOG_OLD.md](./CHANGELOG_OLD.md)
|
|
63
74
|
|
|
64
75
|
---
|
|
65
76
|
|
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
2
|
+
"clientId": "Client-ID",
|
|
3
|
+
"clientSecret": "Client-Secret",
|
|
4
|
+
"password": "Passwort",
|
|
5
|
+
"username": "Benutzername",
|
|
6
|
+
"username_placeholder": "Geben Sie den Benutzernamen Ihres AL-KO-Kontos ein",
|
|
7
|
+
"wsDebug": "Aktivieren Sie die WebSocket-Nachrichtenprotokollierung"
|
|
3
8
|
}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
3
|
-
|
|
2
|
+
"username": "Username",
|
|
3
|
+
"username_placeholder": "Enter your AL-KO account username",
|
|
4
|
+
"password": "Password",
|
|
5
|
+
"clientId": "Client ID",
|
|
6
|
+
"clientSecret": "Client Secret",
|
|
7
|
+
"wsDebug": "Enable WebSocket message logging"
|
|
8
|
+
}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
2
|
+
"clientId": "ID de cliente",
|
|
3
|
+
"clientSecret": "Secreto del cliente",
|
|
4
|
+
"password": "Contraseña",
|
|
5
|
+
"username": "Nombre de usuario",
|
|
6
|
+
"username_placeholder": "Ingrese el nombre de usuario de su cuenta AL-KO",
|
|
7
|
+
"wsDebug": "Habilitar el registro de mensajes de WebSocket"
|
|
3
8
|
}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
2
|
+
"clientId": "Identifiant client",
|
|
3
|
+
"clientSecret": "Secret client",
|
|
4
|
+
"password": "Mot de passe",
|
|
5
|
+
"username": "Nom d'utilisateur",
|
|
6
|
+
"username_placeholder": "Entrez le nom d'utilisateur de votre compte AL-KO",
|
|
7
|
+
"wsDebug": "Activer la journalisation des messages WebSocket"
|
|
3
8
|
}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
2
|
+
"clientId": "ID cliente",
|
|
3
|
+
"clientSecret": "Segreto del cliente",
|
|
4
|
+
"password": "Password",
|
|
5
|
+
"username": "Nome utente",
|
|
6
|
+
"username_placeholder": "Inserisci il nome utente del tuo account AL-KO",
|
|
7
|
+
"wsDebug": "Abilita la registrazione dei messaggi WebSocket"
|
|
3
8
|
}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
2
|
+
"clientId": "Klant-ID",
|
|
3
|
+
"clientSecret": "Klantgeheim",
|
|
4
|
+
"password": "Wachtwoord",
|
|
5
|
+
"username": "Gebruikersnaam",
|
|
6
|
+
"username_placeholder": "Vul de gebruikersnaam van uw AL-KO-account in",
|
|
7
|
+
"wsDebug": "Schakel WebSocket-berichtregistratie in"
|
|
3
8
|
}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
2
|
+
"clientId": "Identyfikator klienta",
|
|
3
|
+
"clientSecret": "Sekret Klienta",
|
|
4
|
+
"password": "Hasło",
|
|
5
|
+
"username": "Nazwa użytkownika",
|
|
6
|
+
"username_placeholder": "Wprowadź nazwę użytkownika swojego konta AL-KO",
|
|
7
|
+
"wsDebug": "Włącz rejestrowanie komunikatów WebSocket"
|
|
3
8
|
}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
2
|
+
"clientId": "ID do cliente",
|
|
3
|
+
"clientSecret": "Segredo do cliente",
|
|
4
|
+
"password": "Senha",
|
|
5
|
+
"username": "Nome de usuário",
|
|
6
|
+
"username_placeholder": "Digite o nome de usuário da sua conta AL-KO",
|
|
7
|
+
"wsDebug": "Habilitar registro de mensagens WebSocket"
|
|
3
8
|
}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
2
|
+
"clientId": "Идентификатор клиента",
|
|
3
|
+
"clientSecret": "Секрет клиента",
|
|
4
|
+
"password": "Пароль",
|
|
5
|
+
"username": "Имя пользователя",
|
|
6
|
+
"username_placeholder": "Введите имя пользователя вашей учетной записи AL-KO",
|
|
7
|
+
"wsDebug": "Включить ведение журнала сообщений WebSocket"
|
|
3
8
|
}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
2
|
+
"clientId": "ID клієнта",
|
|
3
|
+
"clientSecret": "Секрет клієнта",
|
|
4
|
+
"password": "Пароль",
|
|
5
|
+
"username": "Ім'я користувача",
|
|
6
|
+
"username_placeholder": "Введіть ім’я користувача облікового запису AL-KO",
|
|
7
|
+
"wsDebug": "Увімкнути журнал повідомлень WebSocket"
|
|
3
8
|
}
|
package/admin/jsonConfig.json
CHANGED
|
@@ -1,23 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "panel",
|
|
3
|
-
"
|
|
4
|
-
"en": "General",
|
|
5
|
-
"de": "Allgemein",
|
|
6
|
-
"ru": "Общие",
|
|
7
|
-
"pt": "Geral",
|
|
8
|
-
"nl": "Algemeen",
|
|
9
|
-
"fr": "Général",
|
|
10
|
-
"it": "Generale",
|
|
11
|
-
"es": "General",
|
|
12
|
-
"pl": "Ogólne",
|
|
13
|
-
"uk": "Загальні",
|
|
14
|
-
"zh-cn": "常规"
|
|
15
|
-
},
|
|
3
|
+
"i18n": true,
|
|
16
4
|
"items": {
|
|
17
5
|
"username": {
|
|
18
6
|
"type": "text",
|
|
19
|
-
"label":
|
|
20
|
-
"placeholder": "
|
|
7
|
+
"label": "username",
|
|
8
|
+
"placeholder": "username_placeholder",
|
|
21
9
|
"xs": 12,
|
|
22
10
|
"sm": 6,
|
|
23
11
|
"md": 6,
|
|
@@ -26,7 +14,7 @@
|
|
|
26
14
|
},
|
|
27
15
|
"password": {
|
|
28
16
|
"type": "password",
|
|
29
|
-
"label":
|
|
17
|
+
"label": "password",
|
|
30
18
|
"xs": 12,
|
|
31
19
|
"sm": 6,
|
|
32
20
|
"md": 6,
|
|
@@ -35,7 +23,7 @@
|
|
|
35
23
|
},
|
|
36
24
|
"clientId": {
|
|
37
25
|
"type": "text",
|
|
38
|
-
"label":
|
|
26
|
+
"label": "clientId",
|
|
39
27
|
"xs": 12,
|
|
40
28
|
"sm": 6,
|
|
41
29
|
"md": 6,
|
|
@@ -44,7 +32,7 @@
|
|
|
44
32
|
},
|
|
45
33
|
"clientSecret": {
|
|
46
34
|
"type": "password",
|
|
47
|
-
"label":
|
|
35
|
+
"label": "clientSecret",
|
|
48
36
|
"xs": 12,
|
|
49
37
|
"sm": 6,
|
|
50
38
|
"md": 6,
|
|
@@ -53,10 +41,7 @@
|
|
|
53
41
|
},
|
|
54
42
|
"wsDebug": {
|
|
55
43
|
"type": "checkbox",
|
|
56
|
-
"label":
|
|
57
|
-
"en": "Enable WebSocket message logging",
|
|
58
|
-
"de": "WebSocket-Nachrichten protokollieren"
|
|
59
|
-
},
|
|
44
|
+
"label": "wsDebug",
|
|
60
45
|
"default": false,
|
|
61
46
|
"xs": 12,
|
|
62
47
|
"sm": 6,
|
package/docs/de/README.md
CHANGED
|
@@ -48,6 +48,17 @@ AL-KO bietet **keinen offiziellen Support** hierfür.
|
|
|
48
48
|
|
|
49
49
|
## Änderungen (Auszug)
|
|
50
50
|
|
|
51
|
+
### 0.3.7 (2026-05-07)
|
|
52
|
+
- Abhängigkeiten aktualisiert (inkl. Axios Sicherheitsfixes)
|
|
53
|
+
- Node.js >= 22 erforderlich
|
|
54
|
+
- Stabilitätsverbesserungen
|
|
55
|
+
|
|
56
|
+
### 0.3.6 (2026-04-26)
|
|
57
|
+
|
|
58
|
+
- Ungültige State-Rollen korrigiert (`value.number` entfernt, korrekte Verwendung von `value` und `level`)
|
|
59
|
+
- Whitelist für schreibbare States korrigiert
|
|
60
|
+
- Objektstruktur gemäß Review-Anforderungen verbessert
|
|
61
|
+
|
|
51
62
|
### 0.3.5 (2026-03-26)
|
|
52
63
|
|
|
53
64
|
- npm Trusted Publishing aktiviert
|
|
@@ -74,7 +85,7 @@ AL-KO bietet **keinen offiziellen Support** hierfür.
|
|
|
74
85
|
- Logging für WebSocket-Close-Code und Reason ergänzt
|
|
75
86
|
|
|
76
87
|
Alle Änderungen siehe vollständigen Changelog:
|
|
77
|
-
➡ [
|
|
88
|
+
➡ [CHANGELOG_OLD.md](../../CHANGELOG_OLD.md)
|
|
78
89
|
|
|
79
90
|
Wesentliche Neuerungen:
|
|
80
91
|
|
package/docs/en/README.md
CHANGED
|
@@ -48,13 +48,23 @@ It is a **community-developed project**.
|
|
|
48
48
|
|
|
49
49
|
## Changes (Summary)
|
|
50
50
|
|
|
51
|
+
### 0.3.7 (2026-05-07)
|
|
52
|
+
- Updated dependencies (including axios security fixes)
|
|
53
|
+
- Require Node.js >= 22
|
|
54
|
+
- Stability improvements
|
|
55
|
+
|
|
56
|
+
### 0.3.6 (2026-04-26)
|
|
57
|
+
- Fixed invalid state roles (`value.number` removed, correct usage of `value` and `level`)
|
|
58
|
+
- Fixed whitelist handling for writable states
|
|
59
|
+
- Improved object structure according to review feedback
|
|
60
|
+
|
|
51
61
|
### 0.3.5 (2026-03-26)
|
|
52
62
|
|
|
53
63
|
- Enable npm trusted publishing
|
|
54
64
|
- Fix GitHub Actions workflow warnings
|
|
55
65
|
|
|
56
66
|
See full changelog here:
|
|
57
|
-
➡ [
|
|
67
|
+
➡ [CHANGELOG_OLD.md](../../CHANGELOG_OLD.md)
|
|
58
68
|
|
|
59
69
|
Key updates:
|
|
60
70
|
|
package/io-package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "al-ko",
|
|
4
|
-
"version": "0.3.
|
|
4
|
+
"version": "0.3.7",
|
|
5
5
|
"tier": 3,
|
|
6
6
|
"titleLang": {
|
|
7
7
|
"en": "AL-KO",
|
|
@@ -29,8 +29,10 @@
|
|
|
29
29
|
"uk": "Адаптер для газонокосарок AL-KO Robolinho",
|
|
30
30
|
"zh-cn": "AL-KO Robolinho 割草机适配器"
|
|
31
31
|
},
|
|
32
|
-
"authors": [
|
|
33
|
-
"
|
|
32
|
+
"authors": [
|
|
33
|
+
"Hubert Zechner <hubertiob@posteo.at>"
|
|
34
|
+
],
|
|
35
|
+
"licenseInformation": {
|
|
34
36
|
"type": "free",
|
|
35
37
|
"license": "MIT",
|
|
36
38
|
"link": "https://opensource.org/licenses/MIT"
|
|
@@ -40,6 +42,32 @@
|
|
|
40
42
|
"de": "docs/de/README.md"
|
|
41
43
|
},
|
|
42
44
|
"news": {
|
|
45
|
+
"0.3.7": {
|
|
46
|
+
"en": "Update dependencies (axios security fixes), require Node.js >= 22, improve stability",
|
|
47
|
+
"de": "Abhängigkeiten aktualisiert (Axios Sicherheitsfixes), Node.js >= 22 erforderlich, Stabilität verbessert",
|
|
48
|
+
"ru": "Обновлены зависимости (исправления безопасности axios), требуется Node.js >= 22, повышена стабильность",
|
|
49
|
+
"pt": "Atualizadas as dependências (correções de segurança do axios), requer Node.js >= 22, melhorias de estabilidade",
|
|
50
|
+
"nl": "Afhankelijkheden bijgewerkt (axios beveiligingsfixes), Node.js >= 22 vereist, stabiliteit verbeterd",
|
|
51
|
+
"fr": "Mise à jour des dépendances (correctifs de sécurité axios), Node.js >= 22 requis, amélioration de la stabilité",
|
|
52
|
+
"it": "Aggiornate le dipendenze (fix di sicurezza axios), richiesto Node.js >= 22, migliorata la stabilità",
|
|
53
|
+
"es": "Dependencias actualizadas (correcciones de seguridad de axios), se requiere Node.js >= 22, mejoras de estabilidad",
|
|
54
|
+
"pl": "Zaktualizowano zależności (poprawki bezpieczeństwa axios), wymagany Node.js >= 22, poprawiona stabilność",
|
|
55
|
+
"uk": "Оновлено залежності (виправлення безпеки axios), потрібен Node.js >= 22, покращено стабільність",
|
|
56
|
+
"zh-cn": "更新依赖(axios 安全修复),需要 Node.js >= 22,提高稳定性"
|
|
57
|
+
},
|
|
58
|
+
"0.3.6": {
|
|
59
|
+
"en": "Fix state roles (remove invalid value.number, align value/level), correct whitelist handling for writable states, and finalize object structure according to review feedback",
|
|
60
|
+
"de": "State-Rollen korrigiert (value.number entfernt, value/level angepasst), Whitelist für schreibbare States korrigiert und Objektstruktur gemäß Review-Anforderungen finalisiert",
|
|
61
|
+
"ru": "Исправлены роли состояний (удалён value.number, выровнены value/level), исправлена whitelist для записываемых состояний и завершена структура объектов согласно требованиям ревью",
|
|
62
|
+
"pt": "Corrigidas as roles dos estados (removido value.number, ajustado value/level), corrigida a whitelist para estados graváveis e finalizada a estrutura de objetos conforme revisão",
|
|
63
|
+
"nl": "State-rollen gecorrigeerd (value.number verwijderd, value/level aangepast), whitelist voor schrijfbare states gecorrigeerd en objectstructuur volgens review afgerond",
|
|
64
|
+
"fr": "Correction des rôles d’état (suppression de value.number, ajustement value/level), correction de la whitelist des états modifiables et finalisation de la structure d’objets selon la revue",
|
|
65
|
+
"it": "Corretti i ruoli degli stati (rimosso value.number, allineati value/level), corretta la whitelist per stati scrivibili e finalizzata la struttura degli oggetti secondo la revisione",
|
|
66
|
+
"es": "Corregidos los roles de estado (eliminado value.number, ajustado value/level), corregida la whitelist para estados escribibles y finalizada la estructura de objetos según la revisión",
|
|
67
|
+
"pl": "Poprawiono role stanów (usunięto value.number, dostosowano value/level), poprawiono whitelistę dla zapisywalnych stanów i zakończono strukturę obiektów zgodnie z uwagami",
|
|
68
|
+
"uk": "Виправлено ролі станів (видалено value.number, узгоджено value/level), виправлено whitelist для записуваних станів та завершено структуру об'єктів відповідно до зауважень",
|
|
69
|
+
"zh-cn": "修复状态角色(移除 value.number,调整为 value/level),修复可写状态白名单,并根据审查意见完善对象结构"
|
|
70
|
+
},
|
|
43
71
|
"0.3.5": {
|
|
44
72
|
"en": "Enable npm trusted publishing and fix workflow warnings",
|
|
45
73
|
"de": "npm Trusted Publishing aktiviert und Workflow-Warnungen behoben",
|
|
@@ -80,7 +108,13 @@
|
|
|
80
108
|
"zh-cn": "改进了 WebSocket 处理和消息处理,更新了仓库工作流和开发依赖"
|
|
81
109
|
}
|
|
82
110
|
},
|
|
83
|
-
"keywords": [
|
|
111
|
+
"keywords": [
|
|
112
|
+
"al-ko",
|
|
113
|
+
"Robolinho",
|
|
114
|
+
"mower",
|
|
115
|
+
"garden",
|
|
116
|
+
"smart-garden"
|
|
117
|
+
],
|
|
84
118
|
"extIcon": "https://raw.githubusercontent.com/zechnerhubert/ioBroker.al-ko/master/admin/al-ko-128.png",
|
|
85
119
|
"adminUI": {
|
|
86
120
|
"config": "json"
|
|
@@ -111,8 +145,14 @@
|
|
|
111
145
|
"clientSecret": "",
|
|
112
146
|
"wsDebug": false
|
|
113
147
|
},
|
|
114
|
-
"protectedNative": [
|
|
115
|
-
|
|
148
|
+
"protectedNative": [
|
|
149
|
+
"password",
|
|
150
|
+
"clientSecret"
|
|
151
|
+
],
|
|
152
|
+
"encryptedNative": [
|
|
153
|
+
"password",
|
|
154
|
+
"clientSecret"
|
|
155
|
+
],
|
|
116
156
|
"objects": [],
|
|
117
157
|
"instanceObjects": []
|
|
118
158
|
}
|
package/main.js
CHANGED
|
@@ -46,6 +46,142 @@ class AlKoAdapter extends utils.Adapter {
|
|
|
46
46
|
this.on("stateChange", this.onStateChange.bind(this));
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
+
getType(value) {
|
|
50
|
+
if (value === null || value === undefined) {
|
|
51
|
+
return "mixed";
|
|
52
|
+
}
|
|
53
|
+
if (typeof value === "number") {
|
|
54
|
+
return "number";
|
|
55
|
+
}
|
|
56
|
+
if (typeof value === "boolean") {
|
|
57
|
+
return "boolean";
|
|
58
|
+
}
|
|
59
|
+
if (typeof value === "string") {
|
|
60
|
+
return "string";
|
|
61
|
+
}
|
|
62
|
+
return "mixed";
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
getRole(key, value, write) {
|
|
66
|
+
const k = key.toLowerCase();
|
|
67
|
+
|
|
68
|
+
// BOOLEAN
|
|
69
|
+
if (typeof value === "boolean") {
|
|
70
|
+
if (write) {
|
|
71
|
+
return "switch";
|
|
72
|
+
}
|
|
73
|
+
if (k.includes("connected")) {
|
|
74
|
+
return "indicator.reachable";
|
|
75
|
+
}
|
|
76
|
+
if (k.includes("rain")) {
|
|
77
|
+
return "indicator";
|
|
78
|
+
}
|
|
79
|
+
if (k.includes("error")) {
|
|
80
|
+
return "indicator";
|
|
81
|
+
}
|
|
82
|
+
return "indicator";
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// BATTERY
|
|
86
|
+
if (k.includes("battery")) {
|
|
87
|
+
if (k.includes("level")) {
|
|
88
|
+
return "level.battery";
|
|
89
|
+
}
|
|
90
|
+
return "value.number";
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// TEMPERATURE
|
|
94
|
+
if (k.includes("temp")) {
|
|
95
|
+
return "value.temperature";
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// VOLTAGE
|
|
99
|
+
if (k.includes("voltage")) {
|
|
100
|
+
return "value.voltage";
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// CURRENT
|
|
104
|
+
if (k.includes("current")) {
|
|
105
|
+
return "value.current";
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// TIME / DURATION
|
|
109
|
+
if (k.includes("duration")) {
|
|
110
|
+
return "value.duration";
|
|
111
|
+
}
|
|
112
|
+
if (k.includes("hour") || k.includes("minute")) {
|
|
113
|
+
return "level";
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// SIGNAL
|
|
117
|
+
if (k.includes("rssi") || k.includes("signal")) {
|
|
118
|
+
return "value.number";
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// GENERIC NUMBER
|
|
122
|
+
if (typeof value === "number") {
|
|
123
|
+
return write ? "level" : "value";
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// STRING
|
|
127
|
+
if (typeof value === "string") {
|
|
128
|
+
return "text";
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return "state";
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
getUnit(key, value, relPath = "") {
|
|
135
|
+
//KEINE Unit für boolean / indicator
|
|
136
|
+
if (typeof value === "boolean") {
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
139
|
+
const path = relPath.toLowerCase();
|
|
140
|
+
|
|
141
|
+
if (path.endsWith("batterylevel")) {
|
|
142
|
+
return "%";
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
async ensureObjectTree(id) {
|
|
149
|
+
const parts = id.split(".");
|
|
150
|
+
|
|
151
|
+
// Device sicherstellen
|
|
152
|
+
const deviceId = `${parts[0]}.${parts[1]}.${parts[2]}`;
|
|
153
|
+
|
|
154
|
+
const deviceObj = await this.getObjectAsync(deviceId);
|
|
155
|
+
if (!deviceObj) {
|
|
156
|
+
await this.setObjectAsync(deviceId, {
|
|
157
|
+
type: "device",
|
|
158
|
+
common: {
|
|
159
|
+
name: parts[2],
|
|
160
|
+
role: "device",
|
|
161
|
+
},
|
|
162
|
+
native: {},
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
let path = deviceId;
|
|
167
|
+
|
|
168
|
+
for (let i = 3; i < parts.length - 1; i++) {
|
|
169
|
+
path += `.${parts[i]}`;
|
|
170
|
+
|
|
171
|
+
const obj = await this.getObjectAsync(path);
|
|
172
|
+
if (!obj) {
|
|
173
|
+
await this.setObjectAsync(path, {
|
|
174
|
+
type: "channel",
|
|
175
|
+
common: {
|
|
176
|
+
name: parts[i],
|
|
177
|
+
role: "channel",
|
|
178
|
+
},
|
|
179
|
+
native: {},
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
49
185
|
// ---------------- ID Sanitizer ----------------
|
|
50
186
|
sanitizeId(id) {
|
|
51
187
|
return id
|
|
@@ -213,7 +349,7 @@ class AlKoAdapter extends utils.Adapter {
|
|
|
213
349
|
stateData.state.reported || stateData.state;
|
|
214
350
|
|
|
215
351
|
await this.createStatesRecursive(
|
|
216
|
-
`${this.namespace}.${deviceId}
|
|
352
|
+
`${this.namespace}.${deviceId}`,
|
|
217
353
|
this.deviceStates[deviceId],
|
|
218
354
|
"",
|
|
219
355
|
);
|
|
@@ -444,7 +580,7 @@ class AlKoAdapter extends utils.Adapter {
|
|
|
444
580
|
);
|
|
445
581
|
|
|
446
582
|
await this.createStatesRecursive(
|
|
447
|
-
`${this.namespace}.${deviceId}
|
|
583
|
+
`${this.namespace}.${deviceId}`,
|
|
448
584
|
this.deviceStates[deviceId],
|
|
449
585
|
"",
|
|
450
586
|
);
|
|
@@ -586,48 +722,48 @@ class AlKoAdapter extends utils.Adapter {
|
|
|
586
722
|
return whitelist.includes(relPath);
|
|
587
723
|
}
|
|
588
724
|
// ---------------- Role Mapping ----------------
|
|
589
|
-
mapRole(relPath, type) {
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
}
|
|
725
|
+
// mapRole(relPath, type) {
|
|
726
|
+
// if (!relPath) {
|
|
727
|
+
// return "state";
|
|
728
|
+
// }
|
|
729
|
+
//
|
|
730
|
+
// const lower = relPath.toLowerCase();
|
|
731
|
+
//
|
|
732
|
+
// if (lower.endsWith("starthour") || lower.endsWith("hour")) {
|
|
733
|
+
// return "value.hour";
|
|
734
|
+
// }
|
|
735
|
+
// if (lower.endsWith("startminute") || lower.endsWith("minute")) {
|
|
736
|
+
// return "value.minute";
|
|
737
|
+
// }
|
|
738
|
+
//
|
|
739
|
+
// if (type === "boolean") {
|
|
740
|
+
// if (
|
|
741
|
+
// lower.includes("mode") ||
|
|
742
|
+
// lower.includes("enabled") ||
|
|
743
|
+
// lower.includes("manualmowing")
|
|
744
|
+
// ) {
|
|
745
|
+
// return "switch";
|
|
746
|
+
// }
|
|
747
|
+
// return "indicator";
|
|
748
|
+
// }
|
|
749
|
+
//
|
|
750
|
+
// if (lower.includes("operationstate") || lower.includes("state")) {
|
|
751
|
+
// return "indicator.status";
|
|
752
|
+
// }
|
|
753
|
+
//
|
|
754
|
+
// if (type === "number") {
|
|
755
|
+
// if (lower.includes("battery")) {
|
|
756
|
+
// return "value.battery";
|
|
757
|
+
// }
|
|
758
|
+
// return "value";
|
|
759
|
+
// }
|
|
760
|
+
//
|
|
761
|
+
// if (type === "string") {
|
|
762
|
+
// return "text";
|
|
763
|
+
// }
|
|
764
|
+
//
|
|
765
|
+
// return "state";
|
|
766
|
+
//}
|
|
631
767
|
|
|
632
768
|
// ---------------- Safe setState wrapper ----------------
|
|
633
769
|
async setStateIfChanged(
|
|
@@ -637,23 +773,38 @@ class AlKoAdapter extends utils.Adapter {
|
|
|
637
773
|
write = false,
|
|
638
774
|
relPath = null,
|
|
639
775
|
) {
|
|
640
|
-
let type;
|
|
641
|
-
if (typeof value === "boolean") {
|
|
642
|
-
type = "boolean";
|
|
643
|
-
} else if (typeof value === "number") {
|
|
644
|
-
type = "number";
|
|
645
|
-
} else {
|
|
646
|
-
type = "string";
|
|
647
|
-
}
|
|
648
|
-
|
|
649
776
|
id = this.sanitizeId(id);
|
|
650
777
|
|
|
778
|
+
const type = this.getType(value);
|
|
779
|
+
const key = relPath?.split(".").pop() || id.split(".").pop();
|
|
780
|
+
const role = this.getRole(key, value, write);
|
|
781
|
+
const unit = this.getUnit(key, value, relPath);
|
|
782
|
+
|
|
783
|
+
await this.ensureObjectTree(id);
|
|
784
|
+
|
|
651
785
|
await this.setObjectNotExistsAsync(id, {
|
|
652
786
|
type: "state",
|
|
653
|
-
common: {
|
|
787
|
+
common: {
|
|
788
|
+
name: key,
|
|
789
|
+
type,
|
|
790
|
+
role,
|
|
791
|
+
unit,
|
|
792
|
+
read: true,
|
|
793
|
+
write,
|
|
794
|
+
},
|
|
654
795
|
native: {},
|
|
655
796
|
});
|
|
656
797
|
|
|
798
|
+
await this.extendObjectAsync(id, {
|
|
799
|
+
common: {
|
|
800
|
+
role,
|
|
801
|
+
type,
|
|
802
|
+
unit,
|
|
803
|
+
read: true,
|
|
804
|
+
write,
|
|
805
|
+
},
|
|
806
|
+
});
|
|
807
|
+
|
|
657
808
|
const prev = this.lastStateValues[id];
|
|
658
809
|
if (prev !== value) {
|
|
659
810
|
this.lastStateValues[id] = value;
|
|
@@ -673,6 +824,12 @@ class AlKoAdapter extends utils.Adapter {
|
|
|
673
824
|
if (!state || this._stopRequested) {
|
|
674
825
|
return;
|
|
675
826
|
}
|
|
827
|
+
|
|
828
|
+
// FIX: ack handling
|
|
829
|
+
if (state.ack) {
|
|
830
|
+
return;
|
|
831
|
+
}
|
|
832
|
+
|
|
676
833
|
if (this.adapterSetStates.has(id)) {
|
|
677
834
|
return;
|
|
678
835
|
}
|
|
@@ -693,7 +850,7 @@ class AlKoAdapter extends utils.Adapter {
|
|
|
693
850
|
|
|
694
851
|
const parts = id.split(".");
|
|
695
852
|
const deviceId = parts[2];
|
|
696
|
-
const relPathArr = parts.slice(
|
|
853
|
+
const relPathArr = parts.slice(3);
|
|
697
854
|
|
|
698
855
|
this.pendingPushes.add(id);
|
|
699
856
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.al-ko",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.7",
|
|
4
4
|
"description": "Adapter for communication with AL-KO smart garden devices (Robolinho, mowing windows, operationState, etc.)",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Hubert Zechner",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"url": "https://github.com/zechnerhubert/ioBroker.al-ko/issues"
|
|
26
26
|
},
|
|
27
27
|
"engines": {
|
|
28
|
-
"node": ">=
|
|
28
|
+
"node": ">= 22"
|
|
29
29
|
},
|
|
30
30
|
"main": "main.js",
|
|
31
31
|
"files": [
|
|
@@ -52,8 +52,8 @@
|
|
|
52
52
|
},
|
|
53
53
|
"dependencies": {
|
|
54
54
|
"@iobroker/adapter-core": "^3.3.2",
|
|
55
|
-
"axios": "^1.
|
|
56
|
-
"ws": "^8.
|
|
55
|
+
"axios": "^1.15.0",
|
|
56
|
+
"ws": "^8.20.0"
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
59
|
"@alcalzone/release-script": "^5.1.1",
|
|
@@ -62,13 +62,11 @@
|
|
|
62
62
|
"@alcalzone/release-script-plugin-manual-review": "^5.1.1",
|
|
63
63
|
"@iobroker/adapter-dev": "^1.5.0",
|
|
64
64
|
"@iobroker/eslint-config": "^2.2.0",
|
|
65
|
-
"@iobroker/testing": "^5.
|
|
66
|
-
"@tsconfig/
|
|
67
|
-
"@types/node": "^25.
|
|
68
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
69
|
-
"@typescript-eslint/parser": "^8.
|
|
70
|
-
"prettier": "^3.8.1",
|
|
71
|
-
"proxyquire": "^2.1.3"
|
|
65
|
+
"@iobroker/testing": "^5.1.1",
|
|
66
|
+
"@tsconfig/node22": "^22.0.0",
|
|
67
|
+
"@types/node": "^25.6.0",
|
|
68
|
+
"@typescript-eslint/eslint-plugin": "^8.58.2",
|
|
69
|
+
"@typescript-eslint/parser": "^8.59.2"
|
|
72
70
|
},
|
|
73
71
|
"readmeFilename": "README.md"
|
|
74
72
|
}
|
package/whitelist.json
CHANGED