node-red-contrib-knx-ultimate 4.3.5 → 4.3.6

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/CHANGELOG.md CHANGED
@@ -6,6 +6,10 @@
6
6
 
7
7
  # CHANGELOG
8
8
 
9
+ **Version 4.3.6** - April 2026<br/>
10
+
11
+ - UI: when **KNX DEVICE** is set to **`dpt = raw`**, the editor now hides decoded-payload options that do not apply to raw telegrams, including **RBE**, **periodic send**, **format numeric values**, manual write button modes, and **notifyreadrequestalsorespondtobus**.<br/>
12
+
9
13
  **Version 4.3.5** - April 2026<br/>
10
14
 
11
15
  - NEW: **KNX DEVICE** now supports explicit **`dpt = raw`** mode for incoming telegrams: decoding is skipped, `msg.payload` is `null`, and raw bytes remain available in `msg.knx.rawValue`.<br/>
@@ -171,16 +171,24 @@
171
171
  $buttonToggleInitial.val(coerceBoolean(node.buttonToggleInitial) ? 'true' : 'false');
172
172
  $buttonStaticValue.val(node.buttonStaticValue || '');
173
173
 
174
+ const isRawDptSelected = () => String($("#node-input-dpt").val() || '').trim().toLowerCase() === 'raw';
175
+
174
176
  const refreshButtonOptions = () => {
175
177
  const enabled = $buttonEnabled.prop('checked');
176
- const mode = $buttonMode.val() || 'read';
178
+ const rawMode = isRawDptSelected();
179
+ let mode = $buttonMode.val() || 'read';
180
+ if (rawMode && mode !== 'read') {
181
+ mode = 'read';
182
+ $buttonMode.val('read');
183
+ }
184
+ $buttonMode.find("option[value='toggle'], option[value='value']").prop('disabled', rawMode);
177
185
  if (enabled) {
178
186
  $buttonOptions.show();
179
187
  } else {
180
188
  $buttonOptions.hide();
181
189
  }
182
- $buttonToggleRow.toggle(enabled && mode === 'toggle');
183
- $buttonValueRow.toggle(enabled && mode === 'value');
190
+ $buttonToggleRow.toggle(enabled && !rawMode && mode === 'toggle');
191
+ $buttonValueRow.toggle(enabled && !rawMode && mode === 'value');
184
192
 
185
193
  node.buttonEnabled = enabled;
186
194
  node.buttonMode = mode;
@@ -188,6 +196,52 @@
188
196
  node.buttonStaticValue = $buttonStaticValue.val();
189
197
  };
190
198
 
199
+ const refreshRawModeUI = () => {
200
+ const rawMode = isRawDptSelected();
201
+ const isUniversal = $("#node-input-setTopicType").val() === 'listenAllGA';
202
+
203
+ if (isUniversal) {
204
+ refreshButtonOptions();
205
+ return;
206
+ }
207
+
208
+ if (rawMode) {
209
+ $("#divOutputRBE").hide();
210
+ $("#node-input-outputRBE").val("false");
211
+ $("#divInputRBE").hide();
212
+ $("#node-input-inputRBE").val("false");
213
+ $("#divPeriodicSend").hide();
214
+ $("#divPeriodicSendInterval").hide();
215
+ $("#node-input-periodicSend").prop('checked', false);
216
+ $("#divnotifyreadrequestautoreact").hide();
217
+ $("#node-input-notifyreadrequestalsorespondtobus").prop('checked', false);
218
+ $("#divFormatSectionHeader").hide();
219
+ $("#divFormatMultiply").hide();
220
+ $("#divFormatDecimals").hide();
221
+ $("#divFormatNegative").hide();
222
+ } else {
223
+ $("#divOutputRBE").show();
224
+ $("#divInputRBE").show();
225
+ $("#divPeriodicSend").show();
226
+ $("#divFormatSectionHeader").show();
227
+ $("#divFormatMultiply").show();
228
+ $("#divFormatDecimals").show();
229
+ $("#divFormatNegative").show();
230
+ if ($("#node-input-periodicSend").is(':checked')) {
231
+ $("#divPeriodicSendInterval").show();
232
+ } else {
233
+ $("#divPeriodicSendInterval").hide();
234
+ }
235
+ if ($("#node-input-notifyreadrequest").is(":checked")) {
236
+ $("#divnotifyreadrequestautoreact").show();
237
+ } else {
238
+ $("#divnotifyreadrequestautoreact").hide();
239
+ }
240
+ }
241
+
242
+ refreshButtonOptions();
243
+ };
244
+
191
245
  $buttonEnabled.on('change', refreshButtonOptions);
192
246
  $buttonMode.on('change', refreshButtonOptions);
193
247
  $buttonToggleInitial.on('change', refreshButtonOptions);
@@ -773,6 +827,7 @@ return msg;`
773
827
  $("#node-input-dpt").val(node.dpt);
774
828
  // Load help sample
775
829
  knxUltimateDptsGetHelp(node.dpt, true);
830
+ refreshRawModeUI();
776
831
  })
777
832
  }
778
833
 
@@ -791,7 +846,9 @@ return msg;`
791
846
  }
792
847
 
793
848
  $("#node-input-notifyreadrequest").on('change', function () {
794
- if ($("#node-input-notifyreadrequest").is(":checked")) {
849
+ if (isRawDptSelected()) {
850
+ $("#divnotifyreadrequestautoreact").hide();
851
+ } else if ($("#node-input-notifyreadrequest").is(":checked")) {
795
852
  if ($("#node-input-setTopicType").val() === "listenAllGA") {
796
853
  } else {
797
854
  $("#divnotifyreadrequestautoreact").show();
@@ -918,14 +975,7 @@ return msg;`
918
975
  };
919
976
  $("#divDatapointSelection").show();
920
977
  $("#divNode-input-initialread").show();
921
- $("#divOutputRBE").show()
922
- $("#divInputRBE").show()
923
- $("#divPeriodicSend").show()
924
- if ($("#node-input-periodicSend").is(':checked')) {
925
- $("#divPeriodicSendInterval").show()
926
- } else {
927
- $("#divPeriodicSendInterval").hide()
928
- }
978
+ refreshRawModeUI()
929
979
  } else if ($("#node-input-setTopicType").val() === 'listenAllGA') {
930
980
  $("#node-input-topic").hide();
931
981
  $("#divDatapointSelection").hide()
@@ -947,21 +997,9 @@ return msg;`
947
997
 
948
998
  // 15/09/2020 Supergiovane, load the help sample of the current datapoint
949
999
  knxUltimateDptsGetHelp($("#node-input-dpt").val(), false); // 15/09/2020 Supergiovane, load sample help
950
- $("#divOutputRBE").show()
951
- $("#divInputRBE").show()
952
1000
  $("#divTopic").show()
953
- $("#divPeriodicSend").show()
954
- if ($("#node-input-periodicSend").is(':checked')) {
955
- $("#divPeriodicSendInterval").show()
956
- } else {
957
- $("#divPeriodicSendInterval").hide()
958
- }
959
- if ($("#node-input-notifyreadrequest").is(":checked")) {
960
- $("#divnotifyreadrequestautoreact").show();
961
- } else {
962
- $("#divnotifyreadrequestautoreact").hide();
963
- }
964
1001
  $("#divNode-input-initialread").show();
1002
+ refreshRawModeUI()
965
1003
 
966
1004
  $("#node-input-topic").prop('placeholder', $("#node-input-setTopicType").val());
967
1005
  if ($("#node-input-topic").val() === '') $("#node-input-topic").val('MyVariable');
@@ -1011,6 +1049,7 @@ return msg;`
1011
1049
  $("#node-input-dpt").on("change", function (event) {
1012
1050
  // Load help sample
1013
1051
  knxUltimateDptsGetHelp(event.target.value, false);
1052
+ refreshRawModeUI();
1014
1053
  });
1015
1054
  // ###########################
1016
1055
 
@@ -1033,12 +1072,7 @@ return msg;`
1033
1072
  $("#divPeriodicSendInterval").hide()
1034
1073
  $("#node-input-periodicSend").prop('checked', false)
1035
1074
  } else {
1036
- $("#divPeriodicSend").show()
1037
- if ($("#node-input-periodicSend").is(':checked')) {
1038
- $("#divPeriodicSendInterval").show()
1039
- } else {
1040
- $("#divPeriodicSendInterval").hide()
1041
- }
1075
+ refreshRawModeUI()
1042
1076
  }
1043
1077
  } catch (e) { }
1044
1078
 
@@ -1059,6 +1093,8 @@ return msg;`
1059
1093
  }
1060
1094
  } catch (e) { }
1061
1095
 
1096
+ refreshRawModeUI();
1097
+
1062
1098
  },
1063
1099
  oneditsave: function () {
1064
1100
  // Return to the info tab
@@ -1392,12 +1428,12 @@ return msg;`
1392
1428
  </div>
1393
1429
  </dd>
1394
1430
  </div>
1395
- <div class="form-row">
1431
+ <div class="form-row" id="divFormatSectionHeader">
1396
1432
  <dt>
1397
1433
  <i class="fa fa-sort-numeric-asc"></i> Format numeric values coming from the KNX BUS
1398
1434
  </dt>
1399
1435
  </div>
1400
- <div class="form-row">
1436
+ <div class="form-row" id="divFormatMultiply">
1401
1437
  <label style="width:180px" for="node-input-formatmultiplyvalue">
1402
1438
  <i class="fa fa-calculator"></i>
1403
1439
  <span data-i18n="knxUltimate.properties.node-input-formatmultiplyvalue"></span>
@@ -1412,7 +1448,7 @@ return msg;`
1412
1448
  <option value=1000 data-i18n="knxUltimate.selectlists.Multiply_multiply1000"></option>
1413
1449
  </select>
1414
1450
  </div>
1415
- <div class="form-row">
1451
+ <div class="form-row" id="divFormatDecimals">
1416
1452
  <label style="width:180px" for="node-input-formatdecimalsvalue">
1417
1453
  <i class="fa fa-expand"></i>
1418
1454
  <span data-i18n="knxUltimate.properties.node-input-formatdecimalsvalue"></span>
@@ -1426,7 +1462,7 @@ return msg;`
1426
1462
  <option value=4 data-i18n="knxUltimate.selectlists.Decimals_round4"></option>
1427
1463
  </select>
1428
1464
  </div>
1429
- <div class="form-row">
1465
+ <div class="form-row" id="divFormatNegative">
1430
1466
  <label style="width:180px" for="node-input-formatnegativevalue">
1431
1467
  <i class="fa fa-minus-circle"></i>
1432
1468
  <span data-i18n="knxUltimate.properties.node-input-formatnegativevalue"></span>
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "engines": {
4
4
  "node": ">=20.18.1"
5
5
  },
6
- "version": "4.3.5",
6
+ "version": "4.3.6",
7
7
  "description": "Control your KNX and KNX Secure intallation via Node-Red! A bunch of KNX nodes, with integrated Philips HUE control, ETS group address importer, and KNX routing between interfaces. Easy to use and highly configurable.",
8
8
  "files": [
9
9
  "nodes/",