iobroker.openknx 1.1.6 → 1.1.8
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 +7 -10
- package/admin/i18n/de/translations.json +2 -1
- package/admin/i18n/en/translations.json +2 -1
- package/admin/i18n/es/translations.json +2 -1
- package/admin/i18n/fr/translations.json +2 -1
- package/admin/i18n/it/translations.json +2 -1
- package/admin/i18n/nl/translations.json +2 -1
- package/admin/i18n/pl/translations.json +2 -1
- package/admin/i18n/pt/translations.json +2 -1
- package/admin/i18n/ru/translations.json +2 -1
- package/admin/i18n/uk/translations.json +2 -1
- package/admin/i18n/zh-cn/translations.json +2 -1
- package/admin/index_m.html +14 -8
- package/admin/words.js +2 -1
- package/io-package.json +29 -2
- package/main.js +55 -15
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -52,6 +52,13 @@ ioBroker adapter for KNX IP communication, powered by [KNXUltimate](https://gith
|
|
|
52
52
|
Placeholder for the next version (at the beginning of the line):
|
|
53
53
|
### **WORK IN PROGRESS**
|
|
54
54
|
-->
|
|
55
|
+
### 1.1.8 (2026-04-30)
|
|
56
|
+
- add compatiblity mode für raw DPT5.*
|
|
57
|
+
- reduce default delay to 25ms
|
|
58
|
+
|
|
59
|
+
### 1.1.7 (2026-04-29)
|
|
60
|
+
- improve Umlaute handling for DPT-16
|
|
61
|
+
|
|
55
62
|
### 1.1.6 (2026-04-12)
|
|
56
63
|
|
|
57
64
|
- (TA2k) **breaking:** KNX communication switched to KNXUltimate
|
|
@@ -76,16 +83,6 @@ ioBroker adapter for KNX IP communication, powered by [KNXUltimate](https://gith
|
|
|
76
83
|
- (mcm1957) Adapter requires node.js >= 18 and js-controller >= 5 now
|
|
77
84
|
- (mcm1957) Dependencies have been updated
|
|
78
85
|
|
|
79
|
-
### 0.8.0 (2024-03-30)
|
|
80
|
-
|
|
81
|
-
- feature: put KNX interface name into log
|
|
82
|
-
- bugfix: #419 wait for connection complete before data processing in case of receiving data before
|
|
83
|
-
- bugfix: #457 Ack missing after changing IOB object value
|
|
84
|
-
|
|
85
|
-
### 0.7.3 (2024-03-05)
|
|
86
|
-
|
|
87
|
-
- feature: one of the warnings is configurable in the dialog
|
|
88
|
-
|
|
89
86
|
### initial version
|
|
90
87
|
|
|
91
88
|
- initial version from https://www.npmjs.com/package/iobroker.knx/v/0.8.3
|
|
@@ -99,5 +99,6 @@
|
|
|
99
99
|
"remove existing IOB objects that are not in ETS import file": "Vorhandene IOB-Objekte entfernen, die nicht in der ETS-Importdatei enthalten sind",
|
|
100
100
|
"set acknowledgement flag when application writes to object": "Bestätigungsflag setzen, wenn Anwendung auf Objekt schreibt",
|
|
101
101
|
"this is not a number": "dies ist keine Zahl",
|
|
102
|
-
"use common.type boolean for 1 bit enum instead of number": "common.type boolean für 1-Bit-Enum anstelle von Zahl verwenden"
|
|
102
|
+
"use common.type boolean for 1 bit enum instead of number": "common.type boolean für 1-Bit-Enum anstelle von Zahl verwenden",
|
|
103
|
+
"treat base DPTs as raw values, e.g. DPT5 = 0-255 (openknx 0.9.1 compatibility)": "Basis-DPTs als Rohwerte behandeln, z.B. DPT5 = 0-255 (openknx 0.9.1 Kompatibilität)"
|
|
103
104
|
}
|
|
@@ -99,5 +99,6 @@
|
|
|
99
99
|
"Unsupported file format": "Unsupported file format",
|
|
100
100
|
"use common.type boolean for 1 bit enum instead of number": "use common.type boolean for 1 bit enum instead of number",
|
|
101
101
|
"Value": "Value",
|
|
102
|
-
"Write": "Write"
|
|
102
|
+
"Write": "Write",
|
|
103
|
+
"treat base DPTs as raw values, e.g. DPT5 = 0-255 (openknx 0.9.1 compatibility)": "treat base DPTs as raw values, e.g. DPT5 = 0-255 (openknx 0.9.1 compatibility)"
|
|
103
104
|
}
|
|
@@ -99,5 +99,6 @@
|
|
|
99
99
|
"remove existing IOB objects that are not in ETS import file": "eliminar objetos IOB existentes que no están en el archivo de importación ETS",
|
|
100
100
|
"set acknowledgement flag when application writes to object": "establecer el indicador de reconocimiento cuando la aplicación escribe en el objeto",
|
|
101
101
|
"this is not a number": "esto no es un numero",
|
|
102
|
-
"use common.type boolean for 1 bit enum instead of number": "use common.type booleano para enumeración de 1 bit en lugar de número"
|
|
102
|
+
"use common.type boolean for 1 bit enum instead of number": "use common.type booleano para enumeración de 1 bit en lugar de número",
|
|
103
|
+
"treat base DPTs as raw values, e.g. DPT5 = 0-255 (openknx 0.9.1 compatibility)": "tratar DPTs base como valores sin procesar, ej. DPT5 = 0-255 (compatibilidad openknx 0.9.1)"
|
|
103
104
|
}
|
|
@@ -99,5 +99,6 @@
|
|
|
99
99
|
"remove existing IOB objects that are not in ETS import file": "supprimer les objets IOB existants qui ne figurent pas dans le fichier d'importation ETS",
|
|
100
100
|
"set acknowledgement flag when application writes to object": "définir l'indicateur d'accusé de réception lorsque l'application écrit dans l'objet",
|
|
101
101
|
"this is not a number": "ce n'est pas un nombre",
|
|
102
|
-
"use common.type boolean for 1 bit enum instead of number": "utilisez common.type boolean pour une énumération de 1 bit au lieu d'un nombre"
|
|
102
|
+
"use common.type boolean for 1 bit enum instead of number": "utilisez common.type boolean pour une énumération de 1 bit au lieu d'un nombre",
|
|
103
|
+
"treat base DPTs as raw values, e.g. DPT5 = 0-255 (openknx 0.9.1 compatibility)": "traiter les DPTs de base comme valeurs brutes, ex. DPT5 = 0-255 (compatibilité openknx 0.9.1)"
|
|
103
104
|
}
|
|
@@ -99,5 +99,6 @@
|
|
|
99
99
|
"remove existing IOB objects that are not in ETS import file": "rimuovere gli oggetti IOB esistenti che non si trovano nel file di importazione ETS",
|
|
100
100
|
"set acknowledgement flag when application writes to object": "imposta il flag di riconoscimento quando l'applicazione scrive nell'oggetto",
|
|
101
101
|
"this is not a number": "questo non è un numero",
|
|
102
|
-
"use common.type boolean for 1 bit enum instead of number": "utilizzare common.type booleano per l'enumerazione a 1 bit anziché il numero"
|
|
102
|
+
"use common.type boolean for 1 bit enum instead of number": "utilizzare common.type booleano per l'enumerazione a 1 bit anziché il numero",
|
|
103
|
+
"treat base DPTs as raw values, e.g. DPT5 = 0-255 (openknx 0.9.1 compatibility)": "trattare i DPT base come valori grezzi, es. DPT5 = 0-255 (compatibilità openknx 0.9.1)"
|
|
103
104
|
}
|
|
@@ -99,5 +99,6 @@
|
|
|
99
99
|
"remove existing IOB objects that are not in ETS import file": "verwijder bestaande IOB-objecten die niet in het ETS-importbestand staan",
|
|
100
100
|
"set acknowledgement flag when application writes to object": "bevestigingsvlag instellen wanneer toepassing naar object schrijft",
|
|
101
101
|
"this is not a number": "dit is geen nummer",
|
|
102
|
-
"use common.type boolean for 1 bit enum instead of number": "gebruik common.type boolean voor 1 bit enum in plaats van getal"
|
|
102
|
+
"use common.type boolean for 1 bit enum instead of number": "gebruik common.type boolean voor 1 bit enum in plaats van getal",
|
|
103
|
+
"treat base DPTs as raw values, e.g. DPT5 = 0-255 (openknx 0.9.1 compatibility)": "basis-DPTs als onbewerkte waarden behandelen, bijv. DPT5 = 0-255 (openknx 0.9.1 compatibiliteit)"
|
|
103
104
|
}
|
|
@@ -99,5 +99,6 @@
|
|
|
99
99
|
"remove existing IOB objects that are not in ETS import file": "usuń istniejące obiekty IOB, których nie ma w pliku importu ETS",
|
|
100
100
|
"set acknowledgement flag when application writes to object": "ustaw flagę potwierdzenia, gdy aplikacja zapisuje do obiektu",
|
|
101
101
|
"this is not a number": "to nie jest liczba",
|
|
102
|
-
"use common.type boolean for 1 bit enum instead of number": "użyj wartości logicznej common.type dla 1-bitowego wyliczenia zamiast liczby"
|
|
102
|
+
"use common.type boolean for 1 bit enum instead of number": "użyj wartości logicznej common.type dla 1-bitowego wyliczenia zamiast liczby",
|
|
103
|
+
"treat base DPTs as raw values, e.g. DPT5 = 0-255 (openknx 0.9.1 compatibility)": "traktuj bazowe DPT jako wartości surowe, np. DPT5 = 0-255 (kompatybilność openknx 0.9.1)"
|
|
103
104
|
}
|
|
@@ -99,5 +99,6 @@
|
|
|
99
99
|
"remove existing IOB objects that are not in ETS import file": "remova objetos IOB existentes que não estão no arquivo de importação ETS",
|
|
100
100
|
"set acknowledgement flag when application writes to object": "definir sinalizador de reconhecimento quando o aplicativo grava no objeto",
|
|
101
101
|
"this is not a number": "este não é um número",
|
|
102
|
-
"use common.type boolean for 1 bit enum instead of number": "use common.type booleano para enum de 1 bit em vez de número"
|
|
102
|
+
"use common.type boolean for 1 bit enum instead of number": "use common.type booleano para enum de 1 bit em vez de número",
|
|
103
|
+
"treat base DPTs as raw values, e.g. DPT5 = 0-255 (openknx 0.9.1 compatibility)": "tratar DPTs base como valores brutos, ex. DPT5 = 0-255 (compatibilidade openknx 0.9.1)"
|
|
103
104
|
}
|
|
@@ -99,5 +99,6 @@
|
|
|
99
99
|
"remove existing IOB objects that are not in ETS import file": "удалить существующие объекты IOB, которых нет в файле импорта ETS",
|
|
100
100
|
"set acknowledgement flag when application writes to object": "установить флаг подтверждения, когда приложение записывает в объект",
|
|
101
101
|
"this is not a number": "это не число",
|
|
102
|
-
"use common.type boolean for 1 bit enum instead of number": "используйте логическое значение common.type для 1-битного перечисления вместо числа"
|
|
102
|
+
"use common.type boolean for 1 bit enum instead of number": "используйте логическое значение common.type для 1-битного перечисления вместо числа",
|
|
103
|
+
"treat base DPTs as raw values, e.g. DPT5 = 0-255 (openknx 0.9.1 compatibility)": "обрабатывать базовые DPT как необработанные значения, напр. DPT5 = 0-255 (совместимость с openknx 0.9.1)"
|
|
103
104
|
}
|
|
@@ -99,5 +99,6 @@
|
|
|
99
99
|
"remove existing IOB objects that are not in ETS import file": "видалити існуючі об’єкти IOB, яких немає у файлі імпорту ETS",
|
|
100
100
|
"set acknowledgement flag when application writes to object": "встановити позначку підтвердження, коли програма записує об’єкт",
|
|
101
101
|
"this is not a number": "це не число",
|
|
102
|
-
"use common.type boolean for 1 bit enum instead of number": "використовуйте common.type boolean для 1-бітового enum замість числа"
|
|
102
|
+
"use common.type boolean for 1 bit enum instead of number": "використовуйте common.type boolean для 1-бітового enum замість числа",
|
|
103
|
+
"treat base DPTs as raw values, e.g. DPT5 = 0-255 (openknx 0.9.1 compatibility)": "обробляти базові DPT як необроблені значення, напр. DPT5 = 0-255 (сумісність openknx 0.9.1)"
|
|
103
104
|
}
|
|
@@ -99,5 +99,6 @@
|
|
|
99
99
|
"remove existing IOB objects that are not in ETS import file": "删除 ETS 导入文件中不存在的现有 IOB 对象",
|
|
100
100
|
"set acknowledgement flag when application writes to object": "当应用程序写入对象时设置确认标志",
|
|
101
101
|
"this is not a number": "这不是一个数字",
|
|
102
|
-
"use common.type boolean for 1 bit enum instead of number": "使用 common.type boolean 作为 1 位枚举而不是数字"
|
|
102
|
+
"use common.type boolean for 1 bit enum instead of number": "使用 common.type boolean 作为 1 位枚举而不是数字",
|
|
103
|
+
"treat base DPTs as raw values, e.g. DPT5 = 0-255 (openknx 0.9.1 compatibility)": "将基本DPT视为原始值,如DPT5 = 0-255(openknx 0.9.1兼容)"
|
|
103
104
|
}
|
package/admin/index_m.html
CHANGED
|
@@ -99,13 +99,14 @@
|
|
|
99
99
|
});
|
|
100
100
|
}, 1000);
|
|
101
101
|
if (settings.autoreadEnabled === undefined) settings.autoreadEnabled = false;
|
|
102
|
+
if (settings.rawBaseDpt === undefined) settings.rawBaseDpt = true;
|
|
102
103
|
if (settings.deviceName === undefined) settings.deviceName = "";
|
|
103
104
|
if (settings.eibadr === undefined) settings.eibadr = "0.0.0";
|
|
104
105
|
if (settings.gwip === undefined) settings.gwip = "127.0.0.1";
|
|
105
106
|
if (settings.gwipport === undefined) settings.gwipport = 3671;
|
|
106
107
|
if (settings.localInterface === undefined) settings.localInterface = "";
|
|
107
108
|
if (settings.hostProtocol === undefined) settings.hostProtocol = "TunnelUDP";
|
|
108
|
-
if (settings.
|
|
109
|
+
if (settings.sendInterval === undefined) settings.sendInterval = 25;
|
|
109
110
|
if (settings.onlyAddNewObjects === undefined) settings.onlyAddNewObjects = false;
|
|
110
111
|
if (settings.removeUnusedObjects === undefined) settings.removeUnusedObjects = false;
|
|
111
112
|
if (settings.setAckOnWrite === undefined) settings.setAckOnWrite = false;
|
|
@@ -188,14 +189,14 @@
|
|
|
188
189
|
}
|
|
189
190
|
}
|
|
190
191
|
|
|
191
|
-
if (id === "
|
|
192
|
-
var intervall = $("#
|
|
192
|
+
if (id === "sendInterval") {
|
|
193
|
+
var intervall = $("#sendInterval").val();
|
|
193
194
|
number = Number(intervall);
|
|
194
195
|
if (isNumber(intervall) && number >= 0 && number <= 1000) {
|
|
195
|
-
$("#
|
|
196
|
+
$("#sendInterval").val(number);
|
|
196
197
|
} else {
|
|
197
198
|
alert("please provide a valid minimum send delay value between 0 and 1000 [ms]");
|
|
198
|
-
$("#
|
|
199
|
+
$("#sendInterval").val(settings.sendInterval).change();
|
|
199
200
|
}
|
|
200
201
|
}
|
|
201
202
|
|
|
@@ -1159,8 +1160,8 @@
|
|
|
1159
1160
|
<label class="translate" for="hostProtocol">Protocol</label>
|
|
1160
1161
|
</div>
|
|
1161
1162
|
<div class="col s12 l3 input-field">
|
|
1162
|
-
<input class="value" id="
|
|
1163
|
-
<label for="
|
|
1163
|
+
<input class="value" id="sendInterval" type="text" />
|
|
1164
|
+
<label for="sendInterval" class="translate"
|
|
1164
1165
|
>Minimum send delay between two frames [ms]</label>
|
|
1165
1166
|
</div>
|
|
1166
1167
|
<!-- materialize grid small 12 of 12 columns https://materializecss.com/grid.html -->
|
|
@@ -1168,12 +1169,17 @@
|
|
|
1168
1169
|
<input class="value" id="autoreadEnabled" type="checkbox" />
|
|
1169
1170
|
<label class="translate" for="autoreadEnabled"
|
|
1170
1171
|
>readout values of autoread iob objects on startup</label>
|
|
1171
|
-
</div>
|
|
1172
|
+
</div>
|
|
1172
1173
|
<div class="col s12 input-field">
|
|
1173
1174
|
<input class="value" id="noWarnUnknownGa" type="checkbox" />
|
|
1174
1175
|
<label class="translate" for="noWarnUnknownGa"
|
|
1175
1176
|
>do not warn on unknown KNX group adresses</label>
|
|
1176
1177
|
</div>
|
|
1178
|
+
<div class="col s12 input-field">
|
|
1179
|
+
<input class="value" id="rawBaseDpt" type="checkbox" checked />
|
|
1180
|
+
<label class="translate" for="rawBaseDpt"
|
|
1181
|
+
>treat base DPTs as raw values, e.g. DPT5 = 0-255 (openknx 0.9.1 compatibility)</label>
|
|
1182
|
+
</div>
|
|
1177
1183
|
|
|
1178
1184
|
</div>
|
|
1179
1185
|
</div>
|
package/admin/words.js
CHANGED
|
@@ -106,7 +106,8 @@ systemDictionary = {
|
|
|
106
106
|
"physical KNX address": { "en": "physical KNX address", "de": "physikalische KNX-Adresse", "ru": "физический адрес KNX", "pt": "endereço KNX físico", "nl": "fysiek KNX-adres", "fr": "adresse physique KNX", "it": "indirizzo fisico KNX", "es": "dirección KNX física", "pl": "fizyczny adres KNX", "uk": "фізичну адресу KNX", "zh-cn": "物理 KNX 地址"},
|
|
107
107
|
"physical KNX address in format a/b/c not valid": {"en": "physical KNX address in format a/b/c not valid", "de": "Physikalische KNX-Adresse im Format a/b/c ungültig", "ru": "физический адрес KNX в формате a/b/c недействителен", "pt": "endereço KNX físico no formato a/b/c inválido", "nl": "fysiek KNX-adres in formaat a/b/c niet geldig", "fr": "adresse physique KNX au format a/b/c non valide", "it": "indirizzo fisico KNX in formato a/b/c non valido", "es": "Dirección física KNX en formato a/b/c no válida", "pl": "adres fizyczny KNX w formacie a/b/c jest nieprawidłowy", "uk": "фізична адреса KNX у форматі a/b/c недійсна", "zh-cn": "a/b/c 格式的物理 KNX 地址无效"},
|
|
108
108
|
"please provide a valid minimum send delay value between 0 and 1000 [ms]": {"en": "please provide a valid minimum send delay value between 0 and 1000 [ms]", "de": "Bitte geben Sie einen gültigen Wert für die Sendeverzögerung zwischen 0 und 1000 [ms] an", "ru": "укажите допустимое минимальное значение задержки отправки от 0 до 1000 [мс]", "pt": "forneça um valor mínimo de atraso de envio válido entre 0 e 1000 [ms]", "nl": "geef een geldige minimale verzendvertragingswaarde op tussen 0 en 1000 [ms]", "fr": "veuillez fournir une valeur de délai d'envoi minimum valide comprise entre 0 et 1 000 [ms]", "it": "fornire un valore di ritardo di invio minimo valido compreso tra 0 e 1000 [ms]", "es": "proporcione un valor de retardo de envío mínimo válido entre 0 y 1000 [ms]", "pl": "proszę podać poprawną minimalną wartość opóźnienia wysyłania pomiędzy 0 a 1000 [ms]", "uk": "надайте дійсне мінімальне значення затримки надсилання від 0 до 1000 [мс]", "zh-cn": "请提供 0 到 1000 [ms] 之间的有效最小发送延迟值"},
|
|
109
|
-
"readout values of autoread iob objects on startup": {"en": "readout values of autoread iob objects on startup", "de": "Werte von Autoread-IOB-Objekten beim Start des Adapters auslesen", "ru": "считывание значений объектов autoread iob при запуске", "pt": "valores de leitura de objetos iob de leitura automática na inicialização", "nl": "uitleeswaarden van autoread iob-objecten bij het opstarten", "fr": "lire les valeurs des objets iob à lecture automatique au démarrage", "it": "valori di lettura degli oggetti iob con lettura automatica all
|
|
109
|
+
"readout values of autoread iob objects on startup": {"en": "readout values of autoread iob objects on startup", "de": "Werte von Autoread-IOB-Objekten beim Start des Adapters auslesen", "ru": "считывание значений объектов autoread iob при запуске", "pt": "valores de leitura de objetos iob de leitura automática na inicialização", "nl": "uitleeswaarden van autoread iob-objecten bij het opstarten", "fr": "lire les valeurs des objets iob à lecture automatique au démarrage", "it": "valori di lettura degli oggetti iob con lettura automatica all’avvio", "es": "valores de lectura de objetos iob de lectura automática al inicio", "pl": "odczyt wartości obiektów iob z automatycznym odczytem przy uruchomieniu", "uk": "зчитування значень автозчитування об’єктів iob під час запуску", "zh-cn": "启动时自动读取 iob 对象的读数值"},
|
|
110
|
+
"treat base DPTs as raw values, e.g. DPT5 = 0-255 (openknx 0.9.1 compatibility)": {"en": "treat base DPTs as raw values, e.g. DPT5 = 0-255 (openknx 0.9.1 compatibility)", "de": "Basis-DPTs als Rohwerte behandeln, z.B. DPT5 = 0-255 (openknx 0.9.1 Kompatibilität)", "ru": "обрабатывать базовые DPT как необработанные значения, напр. DPT5 = 0-255 (совместимость с openknx 0.9.1)", "pt": "tratar DPTs base como valores brutos, ex. DPT5 = 0-255 (compatibilidade openknx 0.9.1)", "nl": "basis-DPTs als onbewerkte waarden behandelen, bijv. DPT5 = 0-255 (openknx 0.9.1 compatibiliteit)", "fr": "traiter les DPTs de base comme valeurs brutes, ex. DPT5 = 0-255 (compatibilité openknx 0.9.1)", "it": "trattare i DPT base come valori grezzi, es. DPT5 = 0-255 (compatibilità openknx 0.9.1)", "es": "tratar DPTs base como valores sin procesar, ej. DPT5 = 0-255 (compatibilidad openknx 0.9.1)", "pl": "traktuj bazowe DPT jako wartości surowe, np. DPT5 = 0-255 (kompatybilność openknx 0.9.1)", "uk": "обробляти базові DPT як необроблені значення, напр. DPT5 = 0-255 (сумісність openknx 0.9.1)", "zh-cn": "将基本DPT视为原始值,如DPT5 = 0-255(openknx 0.9.1兼容)"},
|
|
110
111
|
"remove existing IOB objects that are not in ETS import file": {"en": "remove existing IOB objects that are not in ETS import file", "de": "Vorhandene IOB-Objekte entfernen, die nicht in der ETS-Importdatei enthalten sind", "ru": "удалить существующие объекты IOB, которых нет в файле импорта ETS", "pt": "remova objetos IOB existentes que não estão no arquivo de importação ETS", "nl": "verwijder bestaande IOB-objecten die niet in het ETS-importbestand staan", "fr": "supprimer les objets IOB existants qui ne figurent pas dans le fichier d'importation ETS", "it": "rimuovere gli oggetti IOB esistenti che non si trovano nel file di importazione ETS", "es": "eliminar objetos IOB existentes que no están en el archivo de importación ETS", "pl": "usuń istniejące obiekty IOB, których nie ma w pliku importu ETS", "uk": "видалити існуючі об’єкти IOB, яких немає у файлі імпорту ETS", "zh-cn": "删除 ETS 导入文件中不存在的现有 IOB 对象"},
|
|
111
112
|
"set acknowledgement flag when application writes to object": {"en": "set acknowledgement flag when application writes to object", "de": "Bestätigungsflag setzen, wenn Anwendung auf Objekt schreibt", "ru": "установить флаг подтверждения, когда приложение записывает в объект", "pt": "definir sinalizador de reconhecimento quando o aplicativo grava no objeto", "nl": "bevestigingsvlag instellen wanneer toepassing naar object schrijft", "fr": "définir l'indicateur d'accusé de réception lorsque l'application écrit dans l'objet", "it": "imposta il flag di riconoscimento quando l'applicazione scrive nell'oggetto", "es": "establecer el indicador de reconocimiento cuando la aplicación escribe en el objeto", "pl": "ustaw flagę potwierdzenia, gdy aplikacja zapisuje do obiektu", "uk": "встановити позначку підтвердження, коли програма записує об’єкт", "zh-cn": "当应用程序写入对象时设置确认标志"},
|
|
112
113
|
"this is not a number": { "en": "this is not a number", "de": "dies ist keine Zahl", "ru": "это не число", "pt": "este não é um número", "nl": "dit is geen nummer", "fr": "ce n'est pas un nombre", "it": "questo non è un numero", "es": "esto no es un numero", "pl": "to nie jest liczba", "uk": "це не число", "zh-cn": "这不是一个数字"},
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "openknx",
|
|
4
|
-
"version": "1.1.
|
|
4
|
+
"version": "1.1.8",
|
|
5
5
|
"news": {
|
|
6
|
+
"1.1.8": {
|
|
7
|
+
"en": "add compatiblity mode für raw DPT5.*\nreduce default delay to 25ms",
|
|
8
|
+
"de": "Kombatiblitäts-Modus für raw DPT5.*\nDefault-Delay auf 25m reduziert",
|
|
9
|
+
"ru": "добавить режим совместимости с сырым DPT5.*\nуменьшить задержку до 25 мс",
|
|
10
|
+
"pt": "adicionar o modo de compatibilidade für cru DPT5.*\nreduzir o atraso padrão para 25ms",
|
|
11
|
+
"nl": "compatiblity mode für raw DPT5.*\nde standaardvertraging verlagen naar 25ms",
|
|
12
|
+
"fr": "ajouter le mode de compatibilité für brut DPT5.*\nréduire le délai par défaut à 25ms",
|
|
13
|
+
"it": "aggiungere la modalità compatiblity für raw DPT5.*\nridurre il ritardo predefinito a 25ms",
|
|
14
|
+
"es": "añadir compatiblity mode für raw DPT5.*\nreducir el retraso predeterminado a 25 ms",
|
|
15
|
+
"pl": "dodać tryb kompatybilności für raw DPT5. *\nzmniejszyć domyślne opóźnienie do 25ms",
|
|
16
|
+
"uk": "додати режим сумісності für raw DPT5.*\nзменшити затримку за замовчуванням до 25ms",
|
|
17
|
+
"zh-cn": "添加相容性模式 für 原始 DPT5. *\n将默认延迟减少至 25 ms"
|
|
18
|
+
},
|
|
19
|
+
"1.1.7": {
|
|
20
|
+
"en": "improve Umlaute handling for DPT-16",
|
|
21
|
+
"de": "Verbesserung der Umlaute Handhabung für DPT-16",
|
|
22
|
+
"ru": "улучшение управляемости Umlaute для DPT-16",
|
|
23
|
+
"pt": "melhorar o manuseio de Umlaute para o DPT-16",
|
|
24
|
+
"nl": "umlautebehandeling verbeteren voor DPT-16",
|
|
25
|
+
"fr": "améliorer la manipulation Umlaute pour DPT-16",
|
|
26
|
+
"it": "migliorare la gestione Umlaute per DPT-16",
|
|
27
|
+
"es": "mejorar el manejo de Umlaute para DPT-16",
|
|
28
|
+
"pl": "poprawa obsługi Umlaute dla DPT- 16",
|
|
29
|
+
"uk": "поліпшити роботу Umlaute для DPT-16",
|
|
30
|
+
"zh-cn": "改进 DPT-16 的 Umlaute 处理"
|
|
31
|
+
},
|
|
6
32
|
"1.1.6": {
|
|
7
33
|
"en": "**breaking:** KNX communication switched to KNXUltimate\n**breaking:** DPT21 property names changed (outofservice → outOfService, inalarm → inAlarm, alarmeunack → alarmUnAck), values must be boolean\n**breaking:** DPT237 property names changed to camelCase\nfeature: KNX Secure support\nfeature: Native .knxproj import (ETS4/5/6, password-protected) with flags, DPT inference, room assignment\nfeature: Extended DPT coverage (9 additional DPTs, including DPT-22, 213, 222, 235, 242, 249, 251)\nfeature: Improved connection stability\nfeature: Improved role detection (switch, level, value, text, date) based on DPT type\nfeature: Direct Link all iobroker states to a KNX state\nfeature: GA-Tools: all GA properties editable (DPT, type, role, flags) with compact layout",
|
|
8
34
|
"de": "**breaking:** KNX-Kommunikation auf KNXUltimate umgestellt\n**breaking:** DPT21 Eigenschaftsnamen geändert (outofservice → outOfService, inalarm → inAlarm, alarmeunack → alarmUnAck), Werte müssen boolean sein\n**breaking:** DPT237 Eigenschaftsnamen auf camelCase geändert\nFeature: KNX Secure Unterstützung\nFeature: Nativer .knxproj Import (ETS4/5/6, passwortgeschützt) mit Flags, DPT-Erkennung, Raumzuordnung\nFeature: Erweiterte DPT-Abdeckung (9 zusätzliche DPTs, u.a. DPT-22, 213, 222, 235, 242, 249, 251)\nFeature: Verbesserte Verbindungsstabilität\nFeature: Verbesserte Rollenerkennung (switch, level, value, text, date) basierend auf DPT-Typ\nFeature: Direct Link – beliebige ioBroker-States mit KNX-Gruppenadressen verknüpfen\nFeature: GA-Tools: alle GA-Eigenschaften editierbar (DPT, Typ, Rolle, Flags) mit kompaktem Layout",
|
|
@@ -153,6 +179,7 @@
|
|
|
153
179
|
"aliasRegexp": "stat(e|us)(\\.|$)|rm(\\.|$)|r(ü|ue)ckmeldung(\\.|$)",
|
|
154
180
|
"aliasSimilarity": 0.9,
|
|
155
181
|
"autoreadEnabled": true,
|
|
182
|
+
"rawBaseDpt": true,
|
|
156
183
|
"deviceName": "",
|
|
157
184
|
"eibadr": "0.0.0",
|
|
158
185
|
"gwip": "",
|
|
@@ -165,7 +192,7 @@
|
|
|
165
192
|
"tunnelUserPassword": "",
|
|
166
193
|
"tunnelUserId": "",
|
|
167
194
|
"localInterface": "",
|
|
168
|
-
"
|
|
195
|
+
"sendInterval": 25,
|
|
169
196
|
"noWarnUnknownGa": false,
|
|
170
197
|
"useBoolean": true,
|
|
171
198
|
"knxCompatMode": false,
|
package/main.js
CHANGED
|
@@ -50,6 +50,13 @@ class openknx extends utils.Adapter {
|
|
|
50
50
|
this.stopping = false;
|
|
51
51
|
this.linkedStateMap = {}; // foreignStateId → knxObjectId (reverse lookup for Direct Link)
|
|
52
52
|
|
|
53
|
+
// Base DPTs without subtype that get unwanted scaling in KNXUltimate
|
|
54
|
+
// Map to their raw/unscaled subtype equivalent (like knx.js 0.9.x did)
|
|
55
|
+
this.baseDptRawMap = {
|
|
56
|
+
DPT5: "DPT5.005",
|
|
57
|
+
DPT6: "DPT6.010",
|
|
58
|
+
};
|
|
59
|
+
|
|
53
60
|
// redirect log from KNXUltimate (winston-based logStream) to adapter log
|
|
54
61
|
// Collapse multiline messages (stack traces) into a single line
|
|
55
62
|
this.logHandler = entry => {
|
|
@@ -235,7 +242,7 @@ class openknx extends utils.Adapter {
|
|
|
235
242
|
try {
|
|
236
243
|
this.log.info(`knxproj file size: ${(buffer.length / 1024 / 1024).toFixed(1)} MB`);
|
|
237
244
|
// Warn if heap limit might be too low for large projects
|
|
238
|
-
const v8 = require("v8");
|
|
245
|
+
const v8 = require("node:v8");
|
|
239
246
|
const heapStats = v8.getHeapStatistics();
|
|
240
247
|
const heapLimitMB = Math.round(heapStats.heap_size_limit / 1024 / 1024);
|
|
241
248
|
const fileSizeMB = buffer.length / 1024 / 1024;
|
|
@@ -585,6 +592,21 @@ class openknx extends utils.Adapter {
|
|
|
585
592
|
return duplicates.length ? message : "";
|
|
586
593
|
}
|
|
587
594
|
|
|
595
|
+
/**
|
|
596
|
+
* Returns the effective DPT string. When rawBaseDpt is enabled and a base DPT
|
|
597
|
+
* without subtype is given (e.g. "DPT5"), maps it to an unscaled subtype
|
|
598
|
+
* to match knx.js 0.9.x behavior (no percentage scaling).
|
|
599
|
+
*/
|
|
600
|
+
effectiveDpt(dpt) {
|
|
601
|
+
if (this.config.rawBaseDpt !== false && dpt && dpt.indexOf(".") === -1) {
|
|
602
|
+
const mapped = this.baseDptRawMap[dpt.toUpperCase()];
|
|
603
|
+
if (mapped) {
|
|
604
|
+
return mapped;
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
return dpt;
|
|
608
|
+
}
|
|
609
|
+
|
|
588
610
|
// obj to string and date to number for iobroker from knx stack
|
|
589
611
|
convertType(val) {
|
|
590
612
|
let ret;
|
|
@@ -684,7 +706,7 @@ class openknx extends utils.Adapter {
|
|
|
684
706
|
`Direct Link [${mode}]: ${id} changed to ${JSON.stringify(state.val)}, writing ${JSON.stringify(writeVal)} to GA ${gaData.native.address}`,
|
|
685
707
|
);
|
|
686
708
|
try {
|
|
687
|
-
this.knxConnection.write(gaData.native.address, writeVal, gaData.native.dpt);
|
|
709
|
+
this.knxConnection.write(gaData.native.address, writeVal, this.effectiveDpt(gaData.native.dpt));
|
|
688
710
|
} catch (e) {
|
|
689
711
|
this.log.warn(`Direct Link write failed for ${gaData.native.address}: ${e.message}`);
|
|
690
712
|
}
|
|
@@ -718,7 +740,7 @@ class openknx extends utils.Adapter {
|
|
|
718
740
|
return "not connected to KNX bus";
|
|
719
741
|
}
|
|
720
742
|
|
|
721
|
-
const dpt = gaData.native.dpt;
|
|
743
|
+
const dpt = this.effectiveDpt(gaData.native.dpt);
|
|
722
744
|
const ga = gaData.native.address;
|
|
723
745
|
let knxVal = state.val;
|
|
724
746
|
let rawVal;
|
|
@@ -805,7 +827,7 @@ class openknx extends utils.Adapter {
|
|
|
805
827
|
return "read";
|
|
806
828
|
} else if (gaData.common.write) {
|
|
807
829
|
this.log.debug(
|
|
808
|
-
`Outbound GroupValue_Write to
|
|
830
|
+
`Outbound GroupValue_Write to ${ga} value: ${isRaw ? rawVal : JSON.stringify(knxVal)} from ${id} (queue: ${this.knxConnection?.commandQueue?.length || 0})`,
|
|
809
831
|
);
|
|
810
832
|
try {
|
|
811
833
|
if (isRaw) {
|
|
@@ -904,7 +926,7 @@ class openknx extends utils.Adapter {
|
|
|
904
926
|
if (foreignState?.val != null) {
|
|
905
927
|
const gaData = this.gaList.getDataById(knxId);
|
|
906
928
|
if (gaData?.native?.address && gaData?.native?.dpt) {
|
|
907
|
-
this.knxConnection.write(gaData.native.address, foreignState.val, gaData.native.dpt);
|
|
929
|
+
this.knxConnection.write(gaData.native.address, foreignState.val, this.effectiveDpt(gaData.native.dpt));
|
|
908
930
|
this.log.debug(`Direct Link sync: ${foreignId}=${foreignState.val} → ${gaData.native.address}`);
|
|
909
931
|
}
|
|
910
932
|
}
|
|
@@ -972,12 +994,11 @@ class openknx extends utils.Adapter {
|
|
|
972
994
|
ipPort: this.config.gwipport,
|
|
973
995
|
physAddr: this.config.eibadr || "0.0.0",
|
|
974
996
|
localIPAddress: this.config.localInterface,
|
|
975
|
-
KNXQueueSendIntervalMilliseconds: this.config.
|
|
997
|
+
KNXQueueSendIntervalMilliseconds: this.config.sendInterval || 25,
|
|
976
998
|
// https://github.com/Supergiovane/node-red-contrib-knx-ultimate/issues/78
|
|
977
999
|
suppress_ack_ldatareq: true,
|
|
978
|
-
//
|
|
979
|
-
|
|
980
|
-
loglevel: this.log.level === "silly" ? "trace" : "info",
|
|
1000
|
+
// Enable KNXUltimate internal logging at debug level to see L_DATA_CON timing
|
|
1001
|
+
loglevel: this.log.level === "silly" ? "trace" : this.log.level === "debug" ? "debug" : "info",
|
|
981
1002
|
};
|
|
982
1003
|
|
|
983
1004
|
// KNX Secure options
|
|
@@ -1035,7 +1056,7 @@ class openknx extends utils.Adapter {
|
|
|
1035
1056
|
const data = this.gaList.getDataById(key);
|
|
1036
1057
|
let dptConfig = null;
|
|
1037
1058
|
try {
|
|
1038
|
-
dptConfig = dptlib.resolve(data.native.dpt);
|
|
1059
|
+
dptConfig = dptlib.resolve(this.effectiveDpt(data.native.dpt));
|
|
1039
1060
|
} catch {
|
|
1040
1061
|
// Unknown DPT - will use raw mode
|
|
1041
1062
|
}
|
|
@@ -1052,10 +1073,29 @@ class openknx extends utils.Adapter {
|
|
|
1052
1073
|
this.autoreaddone = true;
|
|
1053
1074
|
this.countObjectsNotification(cnt_withDPT);
|
|
1054
1075
|
|
|
1076
|
+
// Warn about large DPTs with answer_groupValueResponse enabled
|
|
1077
|
+
const largeDptResponders = [];
|
|
1078
|
+
for (const key of this.gaList) {
|
|
1079
|
+
const data = this.gaList.getDataById(key);
|
|
1080
|
+
if (data.native.answer_groupValueResponse && data.native.dpt) {
|
|
1081
|
+
const dptUpper = data.native.dpt.toUpperCase();
|
|
1082
|
+
if (dptUpper.startsWith("DPT16") || dptUpper.startsWith("DPT14") || dptUpper.startsWith("DPT13") || dptUpper.startsWith("DPT12")) {
|
|
1083
|
+
largeDptResponders.push(`${data.native.address} (${data.native.dpt})`);
|
|
1084
|
+
}
|
|
1085
|
+
}
|
|
1086
|
+
}
|
|
1087
|
+
if (largeDptResponders.length > 0) {
|
|
1088
|
+
this.log.info(
|
|
1089
|
+
`${largeDptResponders.length} large DPT objects (DPT12-16) with answer_groupValueResponse enabled detected. ` +
|
|
1090
|
+
`These consume significant bus time (~65ms each). Consider disabling answer_groupValueResponse on these GAs ` +
|
|
1091
|
+
`if a physical device already responds or if the value is sent via GroupValue_Write on change.`,
|
|
1092
|
+
);
|
|
1093
|
+
}
|
|
1094
|
+
|
|
1055
1095
|
// Phase 2: send autoread requests (asynchronous, non-blocking)
|
|
1056
1096
|
if (autoreadGAs.length > 0) {
|
|
1057
1097
|
// use realistic per-telegram time so queue stays empty between reads
|
|
1058
|
-
const autoreadInterval = Math.max(this.config.
|
|
1098
|
+
const autoreadInterval = Math.max(this.config.sendInterval || 25, 200);
|
|
1059
1099
|
const estimatedSec = Math.ceil((autoreadGAs.length * autoreadInterval) / 1000);
|
|
1060
1100
|
const estimatedTime =
|
|
1061
1101
|
estimatedSec >= 60
|
|
@@ -1206,7 +1246,7 @@ class openknx extends utils.Adapter {
|
|
|
1206
1246
|
this.getForeignState(data.native.linkedState, (fErr, fState) => {
|
|
1207
1247
|
if (!fErr && fState && fState.val != null) {
|
|
1208
1248
|
try {
|
|
1209
|
-
this.knxConnection.respond(dest, fState.val, data.native.dpt);
|
|
1249
|
+
this.knxConnection.respond(dest, fState.val, this.effectiveDpt(data.native.dpt));
|
|
1210
1250
|
this.log.debug(`Direct Link: Read ${dest} → ${fState.val}`);
|
|
1211
1251
|
} catch (e) {
|
|
1212
1252
|
this.log.error(`Direct Link: respond ${dest}: ${e.message || e}`);
|
|
@@ -1230,9 +1270,9 @@ class openknx extends utils.Adapter {
|
|
|
1230
1270
|
this.knxConnection.respond(
|
|
1231
1271
|
dest,
|
|
1232
1272
|
stateval,
|
|
1233
|
-
this.gaList.getDataById(id).native.dpt,
|
|
1273
|
+
this.effectiveDpt(this.gaList.getDataById(id).native.dpt),
|
|
1234
1274
|
);
|
|
1235
|
-
this.log.debug(`responding with value ${state.val}`);
|
|
1275
|
+
this.log.debug(`responding to ${dest} with value ${state.val} (queue: ${this.knxConnection.commandQueue?.length || 0})`);
|
|
1236
1276
|
} catch (e) {
|
|
1237
1277
|
this.log.error(`Failed to respond to ${dest}: ${e.message || e}`);
|
|
1238
1278
|
}
|
|
@@ -1426,7 +1466,7 @@ class openknx extends utils.Adapter {
|
|
|
1426
1466
|
this.log.info(
|
|
1427
1467
|
`Connecting to knx gateway: ${this.config.gwip}:${this.config.gwipport} device name: ${
|
|
1428
1468
|
this.config.deviceName
|
|
1429
|
-
} with physical adr: ${this.config.eibadr} minimum send delay: ${this.config.
|
|
1469
|
+
} with physical adr: ${this.config.eibadr} minimum send delay: ${this.config.sendInterval} ms` +
|
|
1430
1470
|
` debug level: ${this.log.level}`,
|
|
1431
1471
|
);
|
|
1432
1472
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.openknx",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.8",
|
|
4
4
|
"description": "ioBroker knx Adapter",
|
|
5
5
|
"author": "boellner",
|
|
6
6
|
"contributors": [
|
|
@@ -35,10 +35,11 @@
|
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
37
|
"@iobroker/adapter-core": "^3.3.2",
|
|
38
|
-
"@xmldom/xmldom": "^0.9.
|
|
38
|
+
"@xmldom/xmldom": "^0.9.10",
|
|
39
39
|
"@zip.js/zip.js": "^2.8.26",
|
|
40
40
|
"ipaddr.js": "^2.3.0",
|
|
41
|
-
"knxultimate": "^5.
|
|
41
|
+
"knxultimate": "^5.5.3",
|
|
42
|
+
"sax": "^1.6.0",
|
|
42
43
|
"xpath": "^0.0.34"
|
|
43
44
|
},
|
|
44
45
|
"devDependencies": {
|