iobroker.openknx 1.1.7 → 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 CHANGED
@@ -52,6 +52,10 @@ 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
+
55
59
  ### 1.1.7 (2026-04-29)
56
60
  - improve Umlaute handling for DPT-16
57
61
 
@@ -79,12 +83,6 @@ ioBroker adapter for KNX IP communication, powered by [KNXUltimate](https://gith
79
83
  - (mcm1957) Adapter requires node.js >= 18 and js-controller >= 5 now
80
84
  - (mcm1957) Dependencies have been updated
81
85
 
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
86
  ### initial version
89
87
 
90
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
  }
@@ -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.minimumDelay === undefined) settings.minimumDelay = 80;
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 === "minimumDelay") {
192
- var intervall = $("#minimumDelay").val();
192
+ if (id === "sendInterval") {
193
+ var intervall = $("#sendInterval").val();
193
194
  number = Number(intervall);
194
195
  if (isNumber(intervall) && number >= 0 && number <= 1000) {
195
- $("#minimumDelay").val(number);
196
+ $("#sendInterval").val(number);
196
197
  } else {
197
198
  alert("please provide a valid minimum send delay value between 0 and 1000 [ms]");
198
- $("#minimumDelay").val(settings.minimumDelay).change();
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="minimumDelay" type="text" />
1163
- <label for="minimumDelay" class="translate"
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'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 对象的读数值"},
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 allavvio", "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,21 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "openknx",
4
- "version": "1.1.7",
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
+ },
6
19
  "1.1.7": {
7
20
  "en": "improve Umlaute handling for DPT-16",
8
21
  "de": "Verbesserung der Umlaute Handhabung für DPT-16",
@@ -166,6 +179,7 @@
166
179
  "aliasRegexp": "stat(e|us)(\\.|$)|rm(\\.|$)|r(ü|ue)ckmeldung(\\.|$)",
167
180
  "aliasSimilarity": 0.9,
168
181
  "autoreadEnabled": true,
182
+ "rawBaseDpt": true,
169
183
  "deviceName": "",
170
184
  "eibadr": "0.0.0",
171
185
  "gwip": "",
@@ -178,7 +192,7 @@
178
192
  "tunnelUserPassword": "",
179
193
  "tunnelUserId": "",
180
194
  "localInterface": "",
181
- "minimumDelay": 80,
195
+ "sendInterval": 25,
182
196
  "noWarnUnknownGa": false,
183
197
  "useBoolean": true,
184
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 => {
@@ -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;
@@ -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,7 +994,7 @@ 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.minimumDelay || 25,
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
1000
  // Enable KNXUltimate internal logging at debug level to see L_DATA_CON timing
@@ -1034,7 +1056,7 @@ class openknx extends utils.Adapter {
1034
1056
  const data = this.gaList.getDataById(key);
1035
1057
  let dptConfig = null;
1036
1058
  try {
1037
- dptConfig = dptlib.resolve(data.native.dpt);
1059
+ dptConfig = dptlib.resolve(this.effectiveDpt(data.native.dpt));
1038
1060
  } catch {
1039
1061
  // Unknown DPT - will use raw mode
1040
1062
  }
@@ -1051,10 +1073,29 @@ class openknx extends utils.Adapter {
1051
1073
  this.autoreaddone = true;
1052
1074
  this.countObjectsNotification(cnt_withDPT);
1053
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
+
1054
1095
  // Phase 2: send autoread requests (asynchronous, non-blocking)
1055
1096
  if (autoreadGAs.length > 0) {
1056
1097
  // use realistic per-telegram time so queue stays empty between reads
1057
- const autoreadInterval = Math.max(this.config.minimumDelay || 25, 200);
1098
+ const autoreadInterval = Math.max(this.config.sendInterval || 25, 200);
1058
1099
  const estimatedSec = Math.ceil((autoreadGAs.length * autoreadInterval) / 1000);
1059
1100
  const estimatedTime =
1060
1101
  estimatedSec >= 60
@@ -1205,7 +1246,7 @@ class openknx extends utils.Adapter {
1205
1246
  this.getForeignState(data.native.linkedState, (fErr, fState) => {
1206
1247
  if (!fErr && fState && fState.val != null) {
1207
1248
  try {
1208
- this.knxConnection.respond(dest, fState.val, data.native.dpt);
1249
+ this.knxConnection.respond(dest, fState.val, this.effectiveDpt(data.native.dpt));
1209
1250
  this.log.debug(`Direct Link: Read ${dest} → ${fState.val}`);
1210
1251
  } catch (e) {
1211
1252
  this.log.error(`Direct Link: respond ${dest}: ${e.message || e}`);
@@ -1229,7 +1270,7 @@ class openknx extends utils.Adapter {
1229
1270
  this.knxConnection.respond(
1230
1271
  dest,
1231
1272
  stateval,
1232
- this.gaList.getDataById(id).native.dpt,
1273
+ this.effectiveDpt(this.gaList.getDataById(id).native.dpt),
1233
1274
  );
1234
1275
  this.log.debug(`responding to ${dest} with value ${state.val} (queue: ${this.knxConnection.commandQueue?.length || 0})`);
1235
1276
  } catch (e) {
@@ -1425,7 +1466,7 @@ class openknx extends utils.Adapter {
1425
1466
  this.log.info(
1426
1467
  `Connecting to knx gateway: ${this.config.gwip}:${this.config.gwipport} device name: ${
1427
1468
  this.config.deviceName
1428
- } with physical adr: ${this.config.eibadr} minimum send delay: ${this.config.minimumDelay} ms` +
1469
+ } with physical adr: ${this.config.eibadr} minimum send delay: ${this.config.sendInterval} ms` +
1429
1470
  ` debug level: ${this.log.level}`,
1430
1471
  );
1431
1472
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.openknx",
3
- "version": "1.1.7",
3
+ "version": "1.1.8",
4
4
  "description": "ioBroker knx Adapter",
5
5
  "author": "boellner",
6
6
  "contributors": [