iobroker.openknx 1.1.4 → 1.1.5

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
@@ -23,15 +23,18 @@
23
23
  ioBroker adapter for KNX IP communication, powered by [KNXUltimate](https://github.com/Supergiovane/knxultimate).
24
24
 
25
25
  - Native .knxproj import (ETS4/5/6, password-protected projects supported) -- import dialog accepts both .knxproj and .xml files
26
+ - No adapter update needed to import new ETS versions
26
27
  - ETS group address XML import as fallback
27
28
  - Read/Write/Transmit/Update flags from ETS ComObjects (no more guessing)
28
29
  - DPT inference from ComObjects when GA-level DPT is missing
29
30
  - Room assignment (enum.rooms) from ETS building structure
31
+ - Extended DPT coverage (DPT-22, 213, 222, 235, 242, 249, 251, BigInt DPT29)
30
32
  - KNX Secure (IP Secure tunneling via .knxkeys keyfile or password)
31
33
  - Tunneling (UDP/TCP) and Routing (Multicast) protocols
34
+ - GA-Tools: edit all GA properties (DPT, type, role, read/write flags) with filter and tree view
35
+ - Direct Link: connect any ioBroker state to a KNX group address (1:1, trigger, toggle modes)
32
36
  - Alias generation to merge action and status GAs into a single ioBroker object
33
- - Direct Link all iobroker states to a KNX state
34
-
37
+ - Status/Act GA linking without alias mode for migration
35
38
  - Automatic gateway discovery
36
39
  - Automatic reconnect with exponential backoff
37
40
  - Autoread of configured datapoints on startup
@@ -49,7 +52,7 @@ ioBroker adapter for KNX IP communication, powered by [KNXUltimate](https://gith
49
52
  Placeholder for the next version (at the beginning of the line):
50
53
  ### **WORK IN PROGRESS**
51
54
  -->
52
- ### 1.1.4 (2026-03-28)
55
+ ### 1.1.5 (2026-03-31)
53
56
 
54
57
  - (TA2k) **breaking:** KNX communication switched to KNXUltimate
55
58
  - (TA2k) **breaking:** DPT21 property names changed (outofservice → outOfService, inalarm → inAlarm, alarmeunack → alarmUnAck), values must be boolean
package/io-package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "openknx",
4
- "version": "1.1.4",
4
+ "version": "1.1.5",
5
5
  "news": {
6
- "1.1.4": {
6
+ "1.1.5": {
7
7
  "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
8
  "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",
9
9
  "ru": "**breaking:** KNX-коммуникация переключена на KNXUltimate\n**breaking:** Имена свойств DPT21 изменены (outofservice → outOfService, inalarm → inAlarm, alarmeunack → alarmUnAck), значения должны быть boolean\n**breaking:** Имена свойств DPT237 изменены на camelCase\nFeature: Поддержка KNX Secure\nFeature: Нативный импорт .knxproj (ETS4/5/6, с паролем) с флагами, определением DPT, назначением комнат\nFeature: Расширенное покрытие DPT (9 дополнительных DPT, включая DPT-22, 213, 222, 235, 242, 249, 251)\nFeature: Улучшенная стабильность соединения\nFeature: Улучшенное определение ролей (switch, level, value, text, date) на основе типа DPT\nFeature: Direct Link – привязка любых состояний ioBroker к групповым адресам KNX\nFeature: GA-Tools: все свойства GA редактируемы (DPT, тип, роль, флаги) с компактным макетом",
@@ -10,7 +10,7 @@
10
10
 
11
11
  "use strict";
12
12
 
13
- const crypto = require("crypto");
13
+ const crypto = require("node:crypto");
14
14
  const { BlobReader, ZipReader, Uint8ArrayWriter, configure } = require("@zip.js/zip.js");
15
15
 
16
16
  // Disable web workers — we run in Node.js
package/lib/tools.js CHANGED
@@ -1,5 +1,5 @@
1
1
  const { dptlib: DPTLib } = require("knxultimate");
2
- const util = require("util");
2
+ const util = require("node:util");
3
3
  const FORBIDDEN_CHARS = /[^._\-/ :!#$%&()+=@^{}|~\p{Ll}\p{Lu}\p{Nd}]+/gu;
4
4
 
5
5
  /*
package/main.js CHANGED
@@ -858,6 +858,29 @@ class openknx extends utils.Adapter {
858
858
  }
859
859
  }
860
860
 
861
+ // Reconnect delays in seconds: 10, 30, 60, 120, 120, 120, 120
862
+ static reconnectDelays = [10, 30, 60, 120, 120, 120, 120];
863
+
864
+ scheduleReconnect() {
865
+ if (this.stopping || this.reconnectCount >= openknx.reconnectDelays.length) {
866
+ if (!this.stopping) {
867
+ this.log.error(`Giving up after ${openknx.reconnectDelays.length} reconnect attempts`);
868
+ }
869
+ return;
870
+ }
871
+ const delay = openknx.reconnectDelays[this.reconnectCount];
872
+ this.reconnectCount++;
873
+ this.log.info(`Reconnect attempt ${this.reconnectCount}/${openknx.reconnectDelays.length} in ${delay}s...`);
874
+ this.reconnectTimer = setTimeout(() => {
875
+ try {
876
+ this.startKnxStack();
877
+ } catch (e) {
878
+ this.log.error(`Reconnect failed: ${e.message || e}`);
879
+ this.scheduleReconnect();
880
+ }
881
+ }, delay * 1000);
882
+ }
883
+
861
884
  startKnxStack() {
862
885
  // Clean up previous connection (reconnect case)
863
886
  if (this.knxConnection) {
@@ -1014,8 +1037,6 @@ class openknx extends utils.Adapter {
1014
1037
  });
1015
1038
 
1016
1039
  // Event: disconnected
1017
- // Reconnect delays in seconds: 10, 30, 60, 120, 120, 120, 120
1018
- const reconnectDelays = [10, 30, 60, 120, 120, 120, 120];
1019
1040
  this.knxConnection.on(KNXClientEvents.disconnected, reason => {
1020
1041
  if (this.connected) {
1021
1042
  this.log.error(`Connection lost: ${reason}`);
@@ -1023,21 +1044,7 @@ class openknx extends utils.Adapter {
1023
1044
  this.connected = false;
1024
1045
  this.setState("info.connection", this.connected, true);
1025
1046
  this.setState("info.busload", 0, true);
1026
-
1027
- if (!this.stopping && this.reconnectCount < reconnectDelays.length) {
1028
- const delay = reconnectDelays[this.reconnectCount];
1029
- this.reconnectCount++;
1030
- this.log.info(`Reconnect attempt ${this.reconnectCount}/${reconnectDelays.length} in ${delay}s...`);
1031
- this.reconnectTimer = setTimeout(() => {
1032
- try {
1033
- this.startKnxStack();
1034
- } catch (e) {
1035
- this.log.error(`Reconnect failed: ${e.message || e}`);
1036
- }
1037
- }, delay * 1000);
1038
- } else if (this.reconnectCount >= reconnectDelays.length) {
1039
- this.log.error(`Giving up after ${reconnectDelays.length} reconnect attempts`);
1040
- }
1047
+ this.scheduleReconnect();
1041
1048
  });
1042
1049
 
1043
1050
  // Event: error
@@ -1233,7 +1240,15 @@ class openknx extends utils.Adapter {
1233
1240
  });
1234
1241
 
1235
1242
  // Start connection
1236
- this.knxConnection.Connect();
1243
+ try {
1244
+ this.knxConnection.Connect();
1245
+ } catch (e) {
1246
+ if (e.message === "No client socket defined") {
1247
+ this.log.error(`Connect failed: KNX client socket was not created. Check that the configured network interface (${this.config.localInterface || "auto"}) is available and the protocol (${this.config.hostProtocol || "TunnelUDP"}) is correct.`);
1248
+ } else {
1249
+ this.log.error(`Connect failed: ${e.message}`);
1250
+ }
1251
+ }
1237
1252
  }
1238
1253
 
1239
1254
  countObjectsNotification(cnt_withDPT) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.openknx",
3
- "version": "1.1.4",
3
+ "version": "1.1.5",
4
4
  "description": "ioBroker knx Adapter",
5
5
  "author": "boellner",
6
6
  "contributors": [