iobroker.openknx 1.1.7 → 1.1.9
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 -11
- package/admin/index_m.html +9 -9
- package/admin/words.js +1 -1
- package/io-package.json +28 -15
- package/main.js +23 -3
- package/package.json +3 -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.9 (2026-05-04)
|
|
56
|
+
- fix handling of unkown DPT
|
|
57
|
+
|
|
58
|
+
### 1.1.8 (2026-04-30)
|
|
59
|
+
- add compatiblity mode für raw DPT5.*
|
|
60
|
+
- reduce default delay to 25ms
|
|
61
|
+
|
|
55
62
|
### 1.1.7 (2026-04-29)
|
|
56
63
|
- improve Umlaute handling for DPT-16
|
|
57
64
|
|
|
@@ -74,17 +81,6 @@ ioBroker adapter for KNX IP communication, powered by [KNXUltimate](https://gith
|
|
|
74
81
|
- (copilot) Adapter requires js-controller >= 6.0.11 now
|
|
75
82
|
- (@klein0r) Adapter requires node.js >= 20 and js-controller >= 6 now
|
|
76
83
|
|
|
77
|
-
### 0.9.0 (2024-04-21)
|
|
78
|
-
|
|
79
|
-
- (mcm1957) Adapter requires node.js >= 18 and js-controller >= 5 now
|
|
80
|
-
- (mcm1957) Dependencies have been updated
|
|
81
|
-
|
|
82
|
-
### 0.8.0 (2024-03-30)
|
|
83
|
-
|
|
84
|
-
- feature: put KNX interface name into log
|
|
85
|
-
- bugfix: #419 wait for connection complete before data processing in case of receiving data before
|
|
86
|
-
- bugfix: #457 Ack missing after changing IOB object value
|
|
87
|
-
|
|
88
84
|
### initial version
|
|
89
85
|
|
|
90
86
|
- initial version from https://www.npmjs.com/package/iobroker.knx/v/0.8.3
|
package/admin/index_m.html
CHANGED
|
@@ -105,7 +105,7 @@
|
|
|
105
105
|
if (settings.gwipport === undefined) settings.gwipport = 3671;
|
|
106
106
|
if (settings.localInterface === undefined) settings.localInterface = "";
|
|
107
107
|
if (settings.hostProtocol === undefined) settings.hostProtocol = "TunnelUDP";
|
|
108
|
-
if (settings.
|
|
108
|
+
if (settings.sendInterval === undefined) settings.sendInterval = 25;
|
|
109
109
|
if (settings.onlyAddNewObjects === undefined) settings.onlyAddNewObjects = false;
|
|
110
110
|
if (settings.removeUnusedObjects === undefined) settings.removeUnusedObjects = false;
|
|
111
111
|
if (settings.setAckOnWrite === undefined) settings.setAckOnWrite = false;
|
|
@@ -188,14 +188,14 @@
|
|
|
188
188
|
}
|
|
189
189
|
}
|
|
190
190
|
|
|
191
|
-
if (id === "
|
|
192
|
-
var intervall = $("#
|
|
191
|
+
if (id === "sendInterval") {
|
|
192
|
+
var intervall = $("#sendInterval").val();
|
|
193
193
|
number = Number(intervall);
|
|
194
194
|
if (isNumber(intervall) && number >= 0 && number <= 1000) {
|
|
195
|
-
$("#
|
|
195
|
+
$("#sendInterval").val(number);
|
|
196
196
|
} else {
|
|
197
197
|
alert("please provide a valid minimum send delay value between 0 and 1000 [ms]");
|
|
198
|
-
$("#
|
|
198
|
+
$("#sendInterval").val(settings.sendInterval).change();
|
|
199
199
|
}
|
|
200
200
|
}
|
|
201
201
|
|
|
@@ -1159,8 +1159,8 @@
|
|
|
1159
1159
|
<label class="translate" for="hostProtocol">Protocol</label>
|
|
1160
1160
|
</div>
|
|
1161
1161
|
<div class="col s12 l3 input-field">
|
|
1162
|
-
<input class="value" id="
|
|
1163
|
-
<label for="
|
|
1162
|
+
<input class="value" id="sendInterval" type="text" />
|
|
1163
|
+
<label for="sendInterval" class="translate"
|
|
1164
1164
|
>Minimum send delay between two frames [ms]</label>
|
|
1165
1165
|
</div>
|
|
1166
1166
|
<!-- materialize grid small 12 of 12 columns https://materializecss.com/grid.html -->
|
|
@@ -1168,13 +1168,13 @@
|
|
|
1168
1168
|
<input class="value" id="autoreadEnabled" type="checkbox" />
|
|
1169
1169
|
<label class="translate" for="autoreadEnabled"
|
|
1170
1170
|
>readout values of autoread iob objects on startup</label>
|
|
1171
|
-
</div>
|
|
1171
|
+
</div>
|
|
1172
1172
|
<div class="col s12 input-field">
|
|
1173
1173
|
<input class="value" id="noWarnUnknownGa" type="checkbox" />
|
|
1174
1174
|
<label class="translate" for="noWarnUnknownGa"
|
|
1175
1175
|
>do not warn on unknown KNX group adresses</label>
|
|
1176
1176
|
</div>
|
|
1177
|
-
|
|
1177
|
+
|
|
1178
1178
|
</div>
|
|
1179
1179
|
</div>
|
|
1180
1180
|
</div>
|
package/admin/words.js
CHANGED
|
@@ -106,7 +106,7 @@ 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
110
|
"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
111
|
"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
112
|
"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.9",
|
|
5
5
|
"news": {
|
|
6
|
+
"1.1.9": {
|
|
7
|
+
"en": "fix handling of unkown DPT",
|
|
8
|
+
"de": "Die Behandlung von unbekannten DPTs gefixt",
|
|
9
|
+
"ru": "обработка Unkown DPT",
|
|
10
|
+
"pt": "corrigir o manuseamento de DPT deskown",
|
|
11
|
+
"nl": "fix handling van unkown DPT",
|
|
12
|
+
"fr": "fixer la manipulation du DPT décoloré",
|
|
13
|
+
"it": "gestione corretta di DPT non proprio",
|
|
14
|
+
"es": "arreglar el manejo de DPT unkown",
|
|
15
|
+
"pl": "fix handling of unkown DPT",
|
|
16
|
+
"uk": "фіксувати обробку unkown DPT",
|
|
17
|
+
"zh-cn": "固定处理未隐藏的 DPT"
|
|
18
|
+
},
|
|
19
|
+
"1.1.8": {
|
|
20
|
+
"en": "add compatiblity mode für raw DPT5.*\nreduce default delay to 25ms",
|
|
21
|
+
"de": "Kombatiblitäts-Modus für raw DPT5.*\nDefault-Delay auf 25m reduziert",
|
|
22
|
+
"ru": "добавить режим совместимости с сырым DPT5.*\nуменьшить задержку до 25 мс",
|
|
23
|
+
"pt": "adicionar o modo de compatibilidade für cru DPT5.*\nreduzir o atraso padrão para 25ms",
|
|
24
|
+
"nl": "compatiblity mode für raw DPT5.*\nde standaardvertraging verlagen naar 25ms",
|
|
25
|
+
"fr": "ajouter le mode de compatibilité für brut DPT5.*\nréduire le délai par défaut à 25ms",
|
|
26
|
+
"it": "aggiungere la modalità compatiblity für raw DPT5.*\nridurre il ritardo predefinito a 25ms",
|
|
27
|
+
"es": "añadir compatiblity mode für raw DPT5.*\nreducir el retraso predeterminado a 25 ms",
|
|
28
|
+
"pl": "dodać tryb kompatybilności für raw DPT5. *\nzmniejszyć domyślne opóźnienie do 25ms",
|
|
29
|
+
"uk": "додати режим сумісності für raw DPT5.*\nзменшити затримку за замовчуванням до 25ms",
|
|
30
|
+
"zh-cn": "添加相容性模式 für 原始 DPT5. *\n将默认延迟减少至 25 ms"
|
|
31
|
+
},
|
|
6
32
|
"1.1.7": {
|
|
7
33
|
"en": "improve Umlaute handling for DPT-16",
|
|
8
34
|
"de": "Verbesserung der Umlaute Handhabung für DPT-16",
|
|
@@ -67,19 +93,6 @@
|
|
|
67
93
|
"pl": "funkcja: umieścić nazwę interfejsu KNX w logu\nbugfix: # 419 czekać na połączenie zakończone przed przetwarzaniem danych w przypadku otrzymania danych przed\nbugfix: # 457 Brak Ack po zmianie wartości obiektu IOB",
|
|
68
94
|
"uk": "функція: покласти ім'я інтерфейсу KNX в журнал\nвиправлення помилок: #419 почекайте підключення до обробки даних у разі отримання даних до\nenglish, Українська, Français... Відсутня після зміни значення об'єкта IOB",
|
|
69
95
|
"zh-cn": "特性: 将 KNX 接口名称放入日志\nbugfix: # 419 在数据处理之前等待连接完成, 以防在接收数据之前\n错误修正 : # 457 更改 IOB 对象值后丢失"
|
|
70
|
-
},
|
|
71
|
-
"0.7.3": {
|
|
72
|
-
"en": "feature: one of the warnings is configurable in the dialog",
|
|
73
|
-
"de": "feature: eine der warnungen ist im dialog konfigurierbar",
|
|
74
|
-
"ru": "функция: одно из предупреждений настраивается в диалоге",
|
|
75
|
-
"pt": "recurso: um dos avisos é configurável na caixa de diálogo",
|
|
76
|
-
"nl": "functie: een van de waarschuwingen is in het dialoogvenster instelbaar",
|
|
77
|
-
"fr": "fonctionnalité : un des avertissements est configurable dans la boîte de dialogue",
|
|
78
|
-
"it": "caratteristica: uno degli avvisi è configurabile nella finestra di dialogo",
|
|
79
|
-
"es": "función: una de las advertencias es configurable en el diálogo",
|
|
80
|
-
"pl": "funkcja: jeden z ostrzeżeń jest konfigurowalny w oknie dialogowym",
|
|
81
|
-
"uk": "функція: один з попереджень налаштований у діалоговому вікні",
|
|
82
|
-
"zh-cn": "特性: 在对话框中可配置警告之一"
|
|
83
96
|
}
|
|
84
97
|
},
|
|
85
98
|
"titleLang": {
|
|
@@ -178,7 +191,7 @@
|
|
|
178
191
|
"tunnelUserPassword": "",
|
|
179
192
|
"tunnelUserId": "",
|
|
180
193
|
"localInterface": "",
|
|
181
|
-
"
|
|
194
|
+
"sendInterval": 25,
|
|
182
195
|
"noWarnUnknownGa": false,
|
|
183
196
|
"useBoolean": true,
|
|
184
197
|
"knxCompatMode": false,
|
package/main.js
CHANGED
|
@@ -585,6 +585,7 @@ class openknx extends utils.Adapter {
|
|
|
585
585
|
return duplicates.length ? message : "";
|
|
586
586
|
}
|
|
587
587
|
|
|
588
|
+
|
|
588
589
|
// obj to string and date to number for iobroker from knx stack
|
|
589
590
|
convertType(val) {
|
|
590
591
|
let ret;
|
|
@@ -972,7 +973,7 @@ class openknx extends utils.Adapter {
|
|
|
972
973
|
ipPort: this.config.gwipport,
|
|
973
974
|
physAddr: this.config.eibadr || "0.0.0",
|
|
974
975
|
localIPAddress: this.config.localInterface,
|
|
975
|
-
KNXQueueSendIntervalMilliseconds: this.config.
|
|
976
|
+
KNXQueueSendIntervalMilliseconds: this.config.sendInterval || 25,
|
|
976
977
|
// https://github.com/Supergiovane/node-red-contrib-knx-ultimate/issues/78
|
|
977
978
|
suppress_ack_ldatareq: true,
|
|
978
979
|
// Enable KNXUltimate internal logging at debug level to see L_DATA_CON timing
|
|
@@ -1051,10 +1052,29 @@ class openknx extends utils.Adapter {
|
|
|
1051
1052
|
this.autoreaddone = true;
|
|
1052
1053
|
this.countObjectsNotification(cnt_withDPT);
|
|
1053
1054
|
|
|
1055
|
+
// Warn about large DPTs with answer_groupValueResponse enabled
|
|
1056
|
+
const largeDptResponders = [];
|
|
1057
|
+
for (const key of this.gaList) {
|
|
1058
|
+
const data = this.gaList.getDataById(key);
|
|
1059
|
+
if (data.native.answer_groupValueResponse && data.native.dpt) {
|
|
1060
|
+
const dptUpper = data.native.dpt.toUpperCase();
|
|
1061
|
+
if (dptUpper.startsWith("DPT16") || dptUpper.startsWith("DPT14") || dptUpper.startsWith("DPT13") || dptUpper.startsWith("DPT12")) {
|
|
1062
|
+
largeDptResponders.push(`${data.native.address} (${data.native.dpt})`);
|
|
1063
|
+
}
|
|
1064
|
+
}
|
|
1065
|
+
}
|
|
1066
|
+
if (largeDptResponders.length > 0) {
|
|
1067
|
+
this.log.info(
|
|
1068
|
+
`${largeDptResponders.length} large DPT objects (DPT12-16) with answer_groupValueResponse enabled detected. ` +
|
|
1069
|
+
`These consume significant bus time (~65ms each). Consider disabling answer_groupValueResponse on these GAs ` +
|
|
1070
|
+
`if a physical device already responds or if the value is sent via GroupValue_Write on change.`,
|
|
1071
|
+
);
|
|
1072
|
+
}
|
|
1073
|
+
|
|
1054
1074
|
// Phase 2: send autoread requests (asynchronous, non-blocking)
|
|
1055
1075
|
if (autoreadGAs.length > 0) {
|
|
1056
1076
|
// use realistic per-telegram time so queue stays empty between reads
|
|
1057
|
-
const autoreadInterval = Math.max(this.config.
|
|
1077
|
+
const autoreadInterval = Math.max(this.config.sendInterval || 25, 200);
|
|
1058
1078
|
const estimatedSec = Math.ceil((autoreadGAs.length * autoreadInterval) / 1000);
|
|
1059
1079
|
const estimatedTime =
|
|
1060
1080
|
estimatedSec >= 60
|
|
@@ -1425,7 +1445,7 @@ class openknx extends utils.Adapter {
|
|
|
1425
1445
|
this.log.info(
|
|
1426
1446
|
`Connecting to knx gateway: ${this.config.gwip}:${this.config.gwipport} device name: ${
|
|
1427
1447
|
this.config.deviceName
|
|
1428
|
-
} with physical adr: ${this.config.eibadr} minimum send delay: ${this.config.
|
|
1448
|
+
} with physical adr: ${this.config.eibadr} minimum send delay: ${this.config.sendInterval} ms` +
|
|
1429
1449
|
` debug level: ${this.log.level}`,
|
|
1430
1450
|
);
|
|
1431
1451
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.openknx",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.9",
|
|
4
4
|
"description": "ioBroker knx Adapter",
|
|
5
5
|
"author": "boellner",
|
|
6
6
|
"contributors": [
|
|
@@ -37,8 +37,8 @@
|
|
|
37
37
|
"@iobroker/adapter-core": "^3.3.2",
|
|
38
38
|
"@xmldom/xmldom": "^0.9.10",
|
|
39
39
|
"@zip.js/zip.js": "^2.8.26",
|
|
40
|
-
"ipaddr.js": "^2.
|
|
41
|
-
"knxultimate": "^5.5.
|
|
40
|
+
"ipaddr.js": "^2.4.0",
|
|
41
|
+
"knxultimate": "^5.5.4",
|
|
42
42
|
"sax": "^1.6.0",
|
|
43
43
|
"xpath": "^0.0.34"
|
|
44
44
|
},
|