@bitpoolos/edge-bacnet 1.0.5 → 1.0.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.
Files changed (179) hide show
  1. package/bacnet_client.js +587 -154
  2. package/bacnet_device.js +34 -11
  3. package/bacnet_gateway.html +189 -92
  4. package/bacnet_gateway.js +152 -21
  5. package/bacnet_object.js +1 -1
  6. package/bacnet_read.html +115 -113
  7. package/bacnet_read.js +24 -24
  8. package/bacnet_write.html +19 -15
  9. package/bacnet_write.js +0 -2
  10. package/common.js +63 -8
  11. package/package.json +5 -1
  12. package/resources/confirmationservice.min.js +1 -0
  13. package/resources/confirmdialog.min.js +1 -0
  14. package/resources/fonts/primeicons.woff2 +0 -0
  15. package/resources/node-bacnet/CHANGELOG.md +481 -0
  16. package/resources/{bacstack → node-bacnet}/LICENSE.md +3 -1
  17. package/resources/node-bacnet/README.md +91 -0
  18. package/resources/node-bacnet/docs/Client.html +4422 -0
  19. package/resources/node-bacnet/docs/bacnet-icon-quad.png +0 -0
  20. package/resources/node-bacnet/docs/bacnet-icon-quad128.png +0 -0
  21. package/resources/node-bacnet/docs/bacnet-icon-quad64.png +0 -0
  22. package/resources/node-bacnet/docs/bacnet-icon-small.xcf +0 -0
  23. package/resources/node-bacnet/docs/bacnet-icon.xcf +0 -0
  24. package/resources/node-bacnet/docs/bacnet.html +7032 -0
  25. package/resources/node-bacnet/docs/client.js.html +1759 -0
  26. package/resources/node-bacnet/docs/enum.js.html +2530 -0
  27. package/resources/node-bacnet/docs/global.html +2068 -0
  28. package/resources/node-bacnet/docs/images/mocha-logo.svg +65 -0
  29. package/resources/node-bacnet/docs/index.html +283 -0
  30. package/resources/node-bacnet/docs/scripts/collapse.js +11 -0
  31. package/resources/node-bacnet/docs/scripts/jquery-3.1.1.min.js +4 -0
  32. package/resources/node-bacnet/docs/scripts/linenumber.js +26 -0
  33. package/resources/node-bacnet/docs/scripts/prettify/Apache-License-2.0.txt +202 -0
  34. package/resources/node-bacnet/docs/scripts/prettify/lang-css.js +2 -0
  35. package/resources/node-bacnet/docs/scripts/prettify/prettify.js +28 -0
  36. package/resources/node-bacnet/docs/scripts/search.js +47 -0
  37. package/resources/node-bacnet/docs/services_i-am.js.html +157 -0
  38. package/resources/node-bacnet/docs/services_time-sync.js.html +118 -0
  39. package/resources/node-bacnet/docs/services_who-is.js.html +138 -0
  40. package/resources/node-bacnet/docs/styles/jsdoc.css +683 -0
  41. package/resources/node-bacnet/docs/styles/prettify.css +82 -0
  42. package/resources/node-bacnet/examples/discover-devices.js +66 -0
  43. package/resources/node-bacnet/examples/read-device.js +510 -0
  44. package/resources/node-bacnet/examples/subscribe-cov.js +75 -0
  45. package/resources/{bacstack → node-bacnet}/index.js +3 -0
  46. package/resources/{bacstack → node-bacnet}/lib/apdu.js +56 -39
  47. package/resources/{bacstack → node-bacnet}/lib/asn1.js +550 -532
  48. package/resources/node-bacnet/lib/bvlc.js +90 -0
  49. package/resources/node-bacnet/lib/client.js +1695 -0
  50. package/resources/node-bacnet/lib/enum.js +2463 -0
  51. package/resources/node-bacnet/lib/npdu.js +123 -0
  52. package/resources/{bacstack → node-bacnet}/lib/services/add-list-element.js +12 -6
  53. package/resources/{bacstack → node-bacnet}/lib/services/alarm-acknowledge.js +3 -3
  54. package/resources/{bacstack → node-bacnet}/lib/services/alarm-summary.js +5 -4
  55. package/resources/{bacstack → node-bacnet}/lib/services/atomic-read-file.js +49 -26
  56. package/resources/{bacstack → node-bacnet}/lib/services/atomic-write-file.js +40 -23
  57. package/resources/{bacstack → node-bacnet}/lib/services/cov-notify.js +33 -17
  58. package/resources/{bacstack → node-bacnet}/lib/services/create-object.js +23 -13
  59. package/resources/{bacstack → node-bacnet}/lib/services/delete-object.js +7 -2
  60. package/resources/{bacstack → node-bacnet}/lib/services/device-communication-control.js +8 -3
  61. package/resources/{bacstack → node-bacnet}/lib/services/error.js +7 -0
  62. package/resources/{bacstack → node-bacnet}/lib/services/event-information.js +10 -9
  63. package/resources/{bacstack → node-bacnet}/lib/services/event-notify-data.js +38 -16
  64. package/resources/{bacstack → node-bacnet}/lib/services/get-enrollment-summary.js +24 -11
  65. package/resources/{bacstack → node-bacnet}/lib/services/get-event-information.js +28 -13
  66. package/resources/node-bacnet/lib/services/i-am.js +90 -0
  67. package/resources/{bacstack/lib/services/i-have-broadcast.js → node-bacnet/lib/services/i-have.js} +3 -2
  68. package/resources/{bacstack → node-bacnet}/lib/services/index.js +7 -4
  69. package/resources/{bacstack → node-bacnet}/lib/services/life-safety-operation.js +3 -2
  70. package/resources/{bacstack → node-bacnet}/lib/services/private-transfer.js +3 -2
  71. package/resources/{bacstack → node-bacnet}/lib/services/read-property-multiple.js +11 -6
  72. package/resources/{bacstack → node-bacnet}/lib/services/read-property.js +42 -24
  73. package/resources/{bacstack → node-bacnet}/lib/services/read-range.js +37 -27
  74. package/resources/node-bacnet/lib/services/register-foreign-device.js +18 -0
  75. package/resources/{bacstack → node-bacnet}/lib/services/reinitialize-device.js +9 -4
  76. package/resources/{bacstack → node-bacnet}/lib/services/subscribe-cov.js +9 -4
  77. package/resources/{bacstack → node-bacnet}/lib/services/subscribe-property.js +18 -8
  78. package/resources/{bacstack → node-bacnet}/lib/services/time-sync.js +28 -5
  79. package/resources/{bacstack → node-bacnet}/lib/services/who-has.js +3 -3
  80. package/resources/{bacstack → node-bacnet}/lib/services/who-is.js +42 -9
  81. package/resources/{bacstack → node-bacnet}/lib/services/write-property-multiple.js +33 -16
  82. package/resources/{bacstack → node-bacnet}/lib/services/write-property.js +23 -13
  83. package/resources/node-bacnet/lib/transport.js +82 -0
  84. package/resources/node-bacnet/package.json +92 -0
  85. package/resources/primeicons.css +90 -2
  86. package/resources/bacstack/.codeclimate.yml +0 -15
  87. package/resources/bacstack/.dockerignore +0 -5
  88. package/resources/bacstack/.editorconfig +0 -13
  89. package/resources/bacstack/.eslintrc.yml +0 -13
  90. package/resources/bacstack/.github/ISSUE_TEMPLATE.md +0 -26
  91. package/resources/bacstack/.github/PULL_REQUEST_TEMPLATE.md +0 -14
  92. package/resources/bacstack/.github/workflows/ci.yml +0 -39
  93. package/resources/bacstack/.jscsrc +0 -8
  94. package/resources/bacstack/.jshintrc +0 -50
  95. package/resources/bacstack/.travis.yml +0 -27
  96. package/resources/bacstack/CHANGELOG.md +0 -232
  97. package/resources/bacstack/CODE_OF_CONDUCT.md +0 -74
  98. package/resources/bacstack/CONTRIBUTING.md +0 -77
  99. package/resources/bacstack/Dockerfile +0 -15
  100. package/resources/bacstack/FAQ.md +0 -64
  101. package/resources/bacstack/README.md +0 -157
  102. package/resources/bacstack/docker-compose.yml +0 -9
  103. package/resources/bacstack/lib/adpu.js +0 -190
  104. package/resources/bacstack/lib/bvlc.js +0 -43
  105. package/resources/bacstack/lib/client.js +0 -1028
  106. package/resources/bacstack/lib/enum.js +0 -1314
  107. package/resources/bacstack/lib/npdu.js +0 -119
  108. package/resources/bacstack/lib/services/i-am-broadcast.js +0 -51
  109. package/resources/bacstack/lib/services.js +0 -1963
  110. package/resources/bacstack/lib/transport.js +0 -52
  111. package/resources/bacstack/package-lock.json +0 -7974
  112. package/resources/bacstack/package.json +0 -84
  113. package/resources/bacstack/test/compliance/who-is.spec.js +0 -37
  114. package/resources/bacstack/test/integration/acknowledge-alarm.spec.js +0 -14
  115. package/resources/bacstack/test/integration/add-list-element.spec.js +0 -16
  116. package/resources/bacstack/test/integration/confirmed-event-notification.spec.js +0 -30
  117. package/resources/bacstack/test/integration/confirmed-private-transfer.spec.js +0 -15
  118. package/resources/bacstack/test/integration/create-object.spec.js +0 -16
  119. package/resources/bacstack/test/integration/delete-object.spec.js +0 -14
  120. package/resources/bacstack/test/integration/device-communication-control.spec.js +0 -14
  121. package/resources/bacstack/test/integration/get-alarm-summary.spec.js +0 -14
  122. package/resources/bacstack/test/integration/get-enrollment-summary.spec.js +0 -15
  123. package/resources/bacstack/test/integration/get-event-information.spec.js +0 -14
  124. package/resources/bacstack/test/integration/read-file.spec.js +0 -14
  125. package/resources/bacstack/test/integration/read-property-multiple.spec.js +0 -110
  126. package/resources/bacstack/test/integration/read-property.spec.js +0 -14
  127. package/resources/bacstack/test/integration/read-range.spec.js +0 -14
  128. package/resources/bacstack/test/integration/reinitialize-sevice.spec.js +0 -14
  129. package/resources/bacstack/test/integration/remove-list-element.spec.js +0 -16
  130. package/resources/bacstack/test/integration/subscribe-cov.spec.js +0 -14
  131. package/resources/bacstack/test/integration/subscribe-property.spec.js +0 -14
  132. package/resources/bacstack/test/integration/time-sync-utc.spec.js +0 -10
  133. package/resources/bacstack/test/integration/time-sync.spec.js +0 -10
  134. package/resources/bacstack/test/integration/unconfirmed-event-notification.spec.js +0 -28
  135. package/resources/bacstack/test/integration/unconfirmed-private-transfer.spec.js +0 -11
  136. package/resources/bacstack/test/integration/utils.js +0 -30
  137. package/resources/bacstack/test/integration/who-is.spec.js +0 -17
  138. package/resources/bacstack/test/integration/write-file.spec.js +0 -14
  139. package/resources/bacstack/test/integration/write-property-multiple.spec.js +0 -19
  140. package/resources/bacstack/test/integration/write-property.spec.js +0 -14
  141. package/resources/bacstack/test/unit/apdu.spec.js +0 -162
  142. package/resources/bacstack/test/unit/asn1.spec.js +0 -39
  143. package/resources/bacstack/test/unit/bacnet-apdu.spec.js +0 -161
  144. package/resources/bacstack/test/unit/bacnet-asn1.spec.js +0 -32
  145. package/resources/bacstack/test/unit/bacnet-bvlc.spec.js +0 -57
  146. package/resources/bacstack/test/unit/bacnet-npdu.spec.js +0 -118
  147. package/resources/bacstack/test/unit/bacnet-services.spec.js +0 -2052
  148. package/resources/bacstack/test/unit/bvlc.spec.js +0 -58
  149. package/resources/bacstack/test/unit/npdu.spec.js +0 -119
  150. package/resources/bacstack/test/unit/service-add-list-element.spec.js +0 -24
  151. package/resources/bacstack/test/unit/service-alarm-acknowledge.spec.js +0 -71
  152. package/resources/bacstack/test/unit/service-alarm-summary.spec.js +0 -22
  153. package/resources/bacstack/test/unit/service-atomic-read-file.spec.js +0 -54
  154. package/resources/bacstack/test/unit/service-atomic-write-file.spec.js +0 -56
  155. package/resources/bacstack/test/unit/service-cov-notify.spec.js +0 -98
  156. package/resources/bacstack/test/unit/service-create-object.spec.js +0 -90
  157. package/resources/bacstack/test/unit/service-delete-object.spec.js +0 -17
  158. package/resources/bacstack/test/unit/service-device-communication-control.spec.js +0 -29
  159. package/resources/bacstack/test/unit/service-error.spec.js +0 -17
  160. package/resources/bacstack/test/unit/service-event-information.spec.js +0 -48
  161. package/resources/bacstack/test/unit/service-event-notify-data.spec.js +0 -310
  162. package/resources/bacstack/test/unit/service-get-enrollment-summary.spec.js +0 -45
  163. package/resources/bacstack/test/unit/service-get-event-information.spec.js +0 -62
  164. package/resources/bacstack/test/unit/service-i-am.spec.js +0 -19
  165. package/resources/bacstack/test/unit/service-i-have-broadcast.spec.js +0 -18
  166. package/resources/bacstack/test/unit/service-life-safety-operation.spec.js +0 -19
  167. package/resources/bacstack/test/unit/service-private-transfer.spec.js +0 -18
  168. package/resources/bacstack/test/unit/service-read-property-multiple.spec.js +0 -131
  169. package/resources/bacstack/test/unit/service-read-property.spec.js +0 -541
  170. package/resources/bacstack/test/unit/service-read-range.spec.js +0 -97
  171. package/resources/bacstack/test/unit/service-reinitialize-device.spec.js +0 -27
  172. package/resources/bacstack/test/unit/service-subscribe-cov.spec.js +0 -32
  173. package/resources/bacstack/test/unit/service-subscribe-property.spec.js +0 -50
  174. package/resources/bacstack/test/unit/service-time-sync.spec.js +0 -18
  175. package/resources/bacstack/test/unit/service-who-has.spec.js +0 -33
  176. package/resources/bacstack/test/unit/service-who-is.spec.js +0 -17
  177. package/resources/bacstack/test/unit/service-write-property-multiple.spec.js +0 -143
  178. package/resources/bacstack/test/unit/service-write-property.spec.js +0 -198
  179. package/resources/bacstack/test/unit/utils.js +0 -6
package/bacnet_read.html CHANGED
@@ -20,18 +20,15 @@
20
20
  pointsToRead: {value: {}},
21
21
  readDevices: {value: []},
22
22
  devicesToRead: [],
23
- object_property_presentVal: {value: true},
24
- object_property_objDescription: {value: false},
25
- object_property_statusFlag: {value: false},
26
- object_property_reliability: {value: false},
27
- object_property_outOfService: {value: false},
28
- object_property_units: {value: false},
23
+ object_property_simplePayload: {value: false},
24
+ object_property_fullObject: {value: true}
25
+
29
26
  },
30
27
  inputs: 1,
31
28
  outputs: 1,
32
29
  icon: "bitpool.svg",
33
30
  label: function () {
34
- return "read";
31
+ return this.name || "read";
35
32
  },
36
33
  paletteLabel: function () {
37
34
  return "read";
@@ -55,6 +52,7 @@
55
52
  nodeService: ref(new NodeService()),
56
53
  pollFrequency: ref(),
57
54
  deviceCount: ref(),
55
+ progressBarValue: ref(),
58
56
  }
59
57
  },
60
58
  setup() {
@@ -63,7 +61,6 @@
63
61
  const selectedKeys = ref(null);
64
62
  const nodes = ref();
65
63
  const expandedKeys = ref({});
66
-
67
64
  const expandAll = () => {
68
65
  for (let node of devices.value) {
69
66
  expandNode(node);
@@ -108,7 +105,19 @@
108
105
  app.pointList = result.pointList;
109
106
  app.pollFrequency = parseInt(result.pollFrequency);
110
107
  app.deviceCount = result.deviceList.length;
108
+ //progress bar percentage
109
+ app.progressBarValue = parseInt((result.renderList.length / result.deviceList.length) * 100);
111
110
  });
111
+ },
112
+ rebuildDataModel() {
113
+ let app = this;
114
+ app.nodeService.rebuildDataModel().then(function (result) {
115
+ if(result == true){
116
+ app.progressBarValue = 0;
117
+ }
118
+ });
119
+
120
+
112
121
  },
113
122
  addAllClicked(slotProps) {
114
123
  //update UI
@@ -135,15 +144,15 @@
135
144
 
136
145
  //update node-red data structure to forward to gateway
137
146
  let device = this.deviceList.find(ele => ele.deviceName == slotProps.node.label);
138
- let points = this.pointList[slotProps.node.ipAddr];
147
+ let points = this.pointList[slotProps.node.deviceId];
139
148
 
140
- if (!this.pointsToRead[device.address]) {
141
- this.pointsToRead[device.address] = {};
149
+ if (!this.pointsToRead[device.deviceId]) {
150
+ this.pointsToRead[device.deviceId] = {};
142
151
  }
143
152
 
144
153
  for (let pointName in points) {
145
- let point = this.pointList[device.address][pointName];
146
- this.pointsToRead[device.address][point.objectName] = point;
154
+ let point = this.pointList[device.deviceId][pointName];
155
+ this.pointsToRead[device.deviceId][point.objectName] = point;
147
156
  }
148
157
 
149
158
  //force a deploy state
@@ -164,12 +173,12 @@
164
173
  });
165
174
  }
166
175
  slotProps.node.showAdded = false;
167
- this.$forceUpdate()
176
+ this.$forceUpdate();
168
177
 
169
178
  //update node-red data structure
170
179
  let device = this.deviceList.find(ele => ele.deviceName == slotProps.node.label);
171
- if (this.pointsToRead[device.address]) {
172
- delete this.pointsToRead[device.address];
180
+ if (this.pointsToRead[device.deviceId]) {
181
+ delete this.pointsToRead[device.deviceId];
173
182
  }
174
183
 
175
184
  //force a deploy state
@@ -199,19 +208,19 @@
199
208
  }
200
209
 
201
210
  //set show added to true
202
- let slot = parentDevice.children.find(ele => ele.label == slotProps.node.label);
211
+ let slot = parentDevice.children.find(ele => ele.pointName == slotProps.node.pointName);
203
212
  slot.showAdded = true;
204
213
 
205
214
  this.$forceUpdate();
206
215
 
207
216
  //update node-red data structure
208
217
  let device = this.deviceList.find(ele => ele.deviceName == parentDeviceName);
209
- if (!this.pointsToRead[device.address]) {
210
- this.pointsToRead[device.address] = {};
218
+ if (!this.pointsToRead[device.deviceId]) {
219
+ this.pointsToRead[device.deviceId] = {};
211
220
  }
212
221
 
213
- let point = this.pointList[parentDevice.ipAddr][slotProps.node.label];
214
- this.pointsToRead[device.address][point.objectName] = point;
222
+ let point = this.pointList[parentDevice.deviceId][slotProps.node.pointName];
223
+ this.pointsToRead[device.deviceId][point.objectName] = point;
215
224
 
216
225
  //force a deploy state
217
226
  node.hiddenDeployToggle = !node.prevHiddenToggleState;
@@ -223,7 +232,7 @@
223
232
  let parentDevice = this.devices.find(ele => ele.label == parentDeviceName);
224
233
 
225
234
  if (foundDeviceIndex !== -1) {
226
- let foundIndex = this.readDevices[foundDeviceIndex].children.findIndex(ele => ele.key == slotProps.node.key && ele.label == slotProps.node.label);
235
+ let foundIndex = this.readDevices[foundDeviceIndex].children.findIndex(ele => ele.key == slotProps.node.key && ele.pointName == slotProps.node.pointName);
227
236
  if (foundIndex !== -1) this.readDevices[foundDeviceIndex].children.splice(foundIndex, 1);
228
237
  if (this.readDevices[foundDeviceIndex].children.length == 0) {
229
238
  this.readDevices.splice(foundDeviceIndex, 1);
@@ -231,15 +240,15 @@
231
240
  }
232
241
 
233
242
  //set show added to true
234
- let slot = parentDevice.showAdded ? slotProps.node : parentDevice.children.find(ele => ele.label == slotProps.node.label);
243
+ let slot = parentDevice.showAdded ? slotProps.node : parentDevice.children.find(ele => ele.pointName == slotProps.node.pointName);
235
244
  slot.showAdded = false;
236
245
  slotProps.node.showAdded = false;
237
246
  this.$forceUpdate();
238
247
 
239
248
  //update node-red data stucture
240
249
  let device = this.deviceList.find(ele => ele.deviceName == parentDeviceName);
241
- let point = this.pointList[parentDevice.ipAddr][slotProps.node.label];
242
- if (this.pointsToRead[device.address][point.objectName]) delete this.pointsToRead[device.address][point.objectName];
250
+ let point = this.pointList[parentDevice.deviceId][slotProps.node.pointName];
251
+ if (this.pointsToRead[device.deviceId][point.objectName]) delete this.pointsToRead[device.deviceId][point.objectName];
243
252
 
244
253
  //force a deploy state
245
254
  node.hiddenDeployToggle = !node.prevHiddenToggleState;
@@ -272,12 +281,14 @@
272
281
  components: {
273
282
  "p-tree": primevue.tree,
274
283
  "p-button": primevue.button,
275
- "p-timeline": primevue.timeline
284
+ "p-timeline": primevue.timeline,
285
+ "p-progressbar": primevue.progressbar
276
286
  }
277
287
  };
278
288
 
279
289
  let vueapp = createApp(App);
280
- vueapp.use(primevue.config.default)
290
+ vueapp.use(primevue.config.default);
291
+ vueapp.use(primevue.confirmationservice);
281
292
  node.vm = vueapp.mount("#node-input-tabs-content");
282
293
 
283
294
  //reinstate device data
@@ -290,18 +301,11 @@
290
301
  }
291
302
 
292
303
  //set checkboxes to config values stored in backend
293
- document.getElementById("node-input-object_property_presentVal").checked = node.object_property_presentVal;
294
- document.getElementById("node-input-object_property_presentVal").onclick = handleCheckboxClick;
295
- document.getElementById("node-input-object_property_objDescription").checked = node.object_property_objDescription;
296
- document.getElementById("node-input-object_property_objDescription").onclick = handleCheckboxClick;
297
- document.getElementById("node-input-object_property_statusFlag").checked = node.object_property_statusFlag;
298
- document.getElementById("node-input-object_property_statusFlag").onclick = handleCheckboxClick;
299
- document.getElementById("node-input-object_property_reliability").checked = node.object_property_reliability;
300
- document.getElementById("node-input-object_property_reliability").onclick = handleCheckboxClick;
301
- document.getElementById("node-input-object_property_outOfService").checked = node.object_property_outOfService;
302
- document.getElementById("node-input-object_property_outOfService").onclick = handleCheckboxClick;
303
- document.getElementById("node-input-object_property_units").checked = node.object_property_units;
304
- document.getElementById("node-input-object_property_units").onclick = handleCheckboxClick;
304
+
305
+ document.getElementById("node-input-object_property_simplePayload").checked = node.object_property_simplePayload;
306
+ document.getElementById("node-input-object_property_simplePayload").onclick = handleCheckboxClick;
307
+ document.getElementById("node-input-object_property_fullObject").checked = node.object_property_fullObject;
308
+ document.getElementById("node-input-object_property_fullObject").onclick = handleCheckboxClick;
305
309
 
306
310
  document.getElementById("node-input-roundDecimal").value = node.roundDecimal;
307
311
  document.getElementById("node-input-json").checked = node.json;
@@ -310,15 +314,12 @@
310
314
  document.getElementById("node-input-mqtt").onclick = handleMsgTypeClick;
311
315
 
312
316
  function handleCheckboxClick() {
313
- let checkboxes = document.getElementsByClassName("objectProp");
314
- let checkedCount = 0;
315
- for (let box of checkboxes) {
316
- if (box.checked == true) {
317
- checkedCount++;
318
- }
317
+
318
+ if(this.id == "node-input-object_property_simplePayload") {
319
+ document.getElementById("node-input-object_property_fullObject").checked = !document.getElementById("node-input-object_property_fullObject").checked;
319
320
  }
320
- if (checkedCount == 0) {
321
- this.checked = true;
321
+ if(this.id == "node-input-object_property_fullObject") {
322
+ document.getElementById("node-input-object_property_simplePayload").checked = !document.getElementById("node-input-object_property_simplePayload").checked;
322
323
  }
323
324
  }
324
325
 
@@ -389,13 +390,13 @@
389
390
  <style>
390
391
 
391
392
  .p-treenode-label {
392
- /* color: white; */
393
393
  color: black;
394
394
  width: 100%;
395
395
  }
396
396
  .p-tree {
397
397
  background: inherit !important;
398
398
  border: inherit !important;
399
+ padding-right: 0px !important;
399
400
  }
400
401
  .p-button {
401
402
  margin-right: .5rem;
@@ -407,16 +408,14 @@
407
408
  float: right;
408
409
  }
409
410
  .addPointButton:hover, .minusPointButton:hover {
410
- /* background: #282A36 !important; */
411
411
  background: #d5d5d5 !important;
412
412
  }
413
413
  .pointLabel {
414
414
  font-weight: 400;
415
415
  }
416
- .p-treenode-children {
417
- /* background-color: #21232e; */
416
+ /* .p-treenode-children {
418
417
  background-color: #f0f0f0;
419
- }
418
+ } */
420
419
  .deviceLabel {
421
420
  font-weight: 100;
422
421
  }
@@ -429,12 +428,10 @@
429
428
  .bacnetbutton {
430
429
  background: none;
431
430
  border: none;
432
- /* color: white; */
433
431
  color: black;
434
432
  font-weight: 400;
435
433
  }
436
434
  .bacnetbutton:hover {
437
- /* background: #21232e; */
438
435
  background: #f0f0f0;
439
436
  border-radius: 10px;
440
437
  }
@@ -454,7 +451,6 @@
454
451
  padding-bottom: 30px;
455
452
  }
456
453
  .p-tree-toggler:enabled:hover {
457
- /* background: #21232e !important; */
458
454
  background: #d5d5d5 !important;
459
455
  }
460
456
  .p-tree-toggler:focus {
@@ -517,8 +513,12 @@
517
513
  .reloadButton {
518
514
  border: none;
519
515
  background: none;
520
- margin-right: 20px !important;
521
- margin-bottom: 10px !important;
516
+ font-size: 14px !important;
517
+ float: right;
518
+ }
519
+ .rebuildDataButton {
520
+ border: none;
521
+ background: none;
522
522
  font-size: 14px !important;
523
523
  float: right;
524
524
  }
@@ -526,9 +526,33 @@
526
526
  background-color: #d5d5d5;
527
527
  border-radius: 10px;
528
528
  }
529
- /* .p-tree-filter-icon {
530
- margin-top: 0px !important;
531
- } */
529
+ .rebuildDataButton:hover {
530
+ background-color: #d5d5d5;
531
+ border-radius: 10px;
532
+ }
533
+ .headerDiv {
534
+ display: flex;
535
+ flex-direction: row;
536
+ flex-wrap: nowrap;
537
+ justify-content: space-around;
538
+ height: 20px;
539
+ }
540
+ .msgTypeDiv {
541
+ display: flex;
542
+ align-items: flex-start;
543
+ flex-direction: column;
544
+ }
545
+ .p-progressbar .p-progressbar-value {
546
+ background: #00AEEF !important;
547
+ }
548
+ .p-treenode-label {
549
+ overflow: hidden;
550
+ white-space: nowrap;
551
+ text-overflow: ellipsis;
552
+ }
553
+ .buttonGroup {
554
+ padding-left: 7px;
555
+ }
532
556
 
533
557
  </style>
534
558
 
@@ -554,11 +578,17 @@
554
578
 
555
579
  <div id='read-networkTree-tab-content' class="networkTreeContent" style='display:none'>
556
580
 
557
- <div>
581
+ <div class="headerDiv">
558
582
  <a class="countStatus" style="margin-left: 15px;">Count: {{deviceCount}} device(s)</a>
559
- <button @click="getData()" class="reloadButton">
560
- <i class="pi pi-refresh" style="color: #00AEEF;"><a class="allFunctionsText">Reload data</a></i>
561
- </button>
583
+ <p-progressbar :value="progressBarValue" :show-value="true" style="width: 300px; height: 20px;"></p-progressbar>
584
+ <div class="buttonGroup" style="padding-left: 15px;">
585
+ <button @click="rebuildDataModel()" class="rebuildDataButton" title="Rebuild Data Model" >
586
+ <i class="pi pi-wrench" style="color: #ff0000;"></i>
587
+ </button>
588
+ <button @click="getData()" class="reloadButton" title="Reload Data">
589
+ <i class="pi pi-refresh" style="color: #00AEEF;"></i>
590
+ </button>
591
+ </div>
562
592
  </div>
563
593
 
564
594
 
@@ -652,71 +682,43 @@
652
682
  *
653
683
  -->
654
684
  <div id='read-properties-tab' style='display:none'>
655
- <div class="form-row" style="display: inline-flex; width: fit-content; flex-wrap: nowrap;">
685
+ <div class="form-row" style="display: flex; width: fit-content; flex-wrap: nowrap; flex-direction: column;">
656
686
 
657
- <label for="node-input-object_properties_group" style="display: flex; align-items: center; white-space: nowrap;">Object Properties:</label>
658
- <div id="node-input-object_properties_group" style="display: flex; align-items: flex-end; flex-direction: column; padding-left: 30px;">
659
-
660
- <div class="objectPropertiesLabel">
661
- <label for="node-input-object_property_presentVal" style="padding-left: 4px; width: auto;" class="objectPropertiesLabel">
662
- <i class="icon-tag"></i> <span data-i18n="bitpool-bacnet.label.object_property_presentVal"></span>
663
- <a style="white-space: nowrap;">Present Value</a>
664
- <input style="margin-left: 5px;" class="checkbox-round objectProp" type="checkbox" id="node-input-object_property_presentVal">
665
- </label>
666
- </div>
667
-
668
- <div class="objectPropertiesLabel">
669
- <label for="node-input-object_property_objDescription" style="padding-left: 21px; width: auto;" class="objectPropertiesLabel">
670
- <i class="icon-tag"></i> <span data-i18n="bitpool-bacnet.label.object_property_objDescription"></span>
671
- <a>Description</a>
672
- <input style="margin-left: 5px;" class="checkbox-round objectProp" type="checkbox" id="node-input-object_property_objDescription">
673
- </label>
674
- </div>
687
+ <label for="node-input-object_properties_group" style="display: flex; align-items: center; white-space: nowrap; text-decoration: underline;">Object Properties:</label>
675
688
 
676
- <div class="objectPropertiesLabel">
677
- <label for="node-input-object_property_statusFlag" style="padding-left: 13px; width: auto;" class="objectPropertiesLabel">
678
- <i class="icon-tag"></i> <span data-i18n="bitpool-bacnet.label.object_property_statusFlag"></span>
679
- <a style="white-space: nowrap;">Status Flags</a>
680
- <input style="margin-left: 5px;" class="checkbox-round objectProp" type="checkbox" id="node-input-object_property_statusFlag">
681
- </label>
682
- </div>
683
689
 
690
+ <div id="node-input-object_properties_group" style="display: flex; align-items: flex-start; flex-direction: column; padding-left: 50px;">
684
691
  <div class="objectPropertiesLabel">
685
- <label for="node-input-object_property_reliability" style="padding-left: 32px; width: auto;" class="objectPropertiesLabel">
686
- <i class="icon-tag"></i> <span data-i18n="bitpool-bacnet.label.object_property_reliability"></span>
687
- <a>Reliability</a>
688
- <input style="margin-left: 5px;" class="checkbox-round objectProp" type="checkbox" id="node-input-object_property_reliability">
692
+ <label for="node-input-object_property_simplePayload" style="padding-left: 4px; width: auto; align-items: start;" class="objectPropertiesLabel">
693
+ <i class="icon-tag"></i> <span data-i18n="bitpool-bacnet.label.object_property_simplePayload"></span>
694
+ <input style="margin-left: 5px;" class=" objectProp" type="checkbox" id="node-input-object_property_simplePayload">
695
+ <a style="white-space: nowrap; padding-left: 20px;">Simple Payload</a>
689
696
  </label>
690
697
  </div>
691
698
 
692
699
  <div class="objectPropertiesLabel">
693
- <label for="node-input-object_property_outOfService" style="padding-left: 3px; width: auto;" class="objectPropertiesLabel">
694
- <i class="icon-tag"></i> <span data-i18n="bitpool-bacnet.label.object_property_outOfService"></span>
695
- <a style="white-space: nowrap;">Out of Service</a>
696
- <input style="margin-left: 5px;" class="checkbox-round objectProp" type="checkbox" id="node-input-object_property_outOfService">
700
+ <label for="node-input-object_property_fullObject" style="padding-left: 4px; width: auto; align-items: start;" class="objectPropertiesLabel">
701
+ <i class="icon-tag"></i> <span data-i18n="bitpool-bacnet.label.object_property_fullObject"></span>
702
+ <input style="margin-left: 5px;" class=" objectProp" type="checkbox" id="node-input-object_property_fullObject">
703
+ <a style="white-space: nowrap; padding-left: 20px;">Full Object</a>
697
704
  </label>
698
705
  </div>
699
706
 
700
- <div class="objectPropertiesLabel">
701
- <label for="node-input-object_property_units" style="padding-left: 60px; width: auto;" class="objectPropertiesLabel">
702
- <i class="icon-tag"></i> <span data-i18n="bitpool-bacnet.label.object_property_units"></span>
703
- <a style="white-space: nowrap;">Units</a>
704
- <input style="margin-left: 5px;" class="checkbox-round objectProp" type="checkbox" id="node-input-object_property_units">
705
- </label>
706
- </div>
707
- </div>
707
+ </div>
708
708
  </div>
709
709
 
710
- <br>
711
- <br>
710
+ <hr>
712
711
 
713
- <div class="form-row" style="display: flex;">
714
- <label for="node-input-msgType">
712
+ <div class="form-row msgTypeDiv" style="display: flex;">
713
+ <label for="node-input-msgType" style="text-decoration: underline;">
715
714
  Message type:
716
715
  </label>
717
- <div id="node-input-msgType" style="display: flex; align-items: flex-end; flex-direction: column;">
718
- <div style="display: flex; flex-direction: row; align-items: flex-start;"><a style="padding-left: 20px;">Block per device</a> <input class="checkbox-round" type="checkbox" id="node-input-json" class="" style="width: 13px; margin-left: 5px;"/> </div>
719
- <div style="display: flex; flex-direction: row; align-items: flex-start;"><a style="padding-left: 20px;">Individual msgs</a> <input class="checkbox-round" type="checkbox" id="node-input-mqtt" class="" style="width: 13px; margin-left: 5px;"/> </div>
716
+ <div id="node-input-msgType" style="display: flex; align-items: flex-start; flex-direction: column; padding-left: 50px;">
717
+
718
+ <!-- class= checkbox-round -->
719
+ <div style="display: flex; flex-direction: row; align-items: flex-start;"><input class="checkbox-round" type="checkbox" id="node-input-json" style="width: 13px; margin-left: 5px;"/><label for="node-input-json" style="padding-left: 20px; width: fit-content;">Block per device</label> </div>
720
+ <div style="display: flex; flex-direction: row; align-items: flex-start;"><input class="checkbox-round" type="checkbox" id="node-input-mqtt" style="width: 13px; margin-left: 5px;"/><label for="node-input-mqtt" style="padding-left: 20px; width: fit-content;">Individual msgs</label> </div>
721
+
720
722
  </div>
721
723
  </div>
722
724
 
package/bacnet_read.js CHANGED
@@ -2,10 +2,11 @@
2
2
  MIT License Copyright 2021, 2022 - Bitpool Pty Ltd
3
3
  */
4
4
 
5
- const baEnum = require('./resources/bacstack/lib/enum');
5
+
6
6
 
7
7
  module.exports = function (RED) {
8
8
  const { ReadCommandConfig } = require('./common');
9
+ const baEnum = require('./resources/node-bacnet/index.js').enum;
9
10
 
10
11
  function BitpoolBacnetReadDevice (config) {
11
12
  RED.nodes.createNode(this, config);
@@ -18,37 +19,32 @@ module.exports = function (RED) {
18
19
  this.readDevices = config.readDevices;
19
20
  this.id = config.id;
20
21
 
21
- this.object_property_presentVal = config.object_property_presentVal;
22
- this.object_property_objDescription = config.object_property_objDescription;
23
- this.object_property_statusFlag = config.object_property_statusFlag;
24
- this.object_property_reliability = config.object_property_reliability;
25
- this.object_property_outOfService = config.object_property_outOfService;
26
- this.object_property_units = config.object_property_units;
22
+ this.object_property_simplePayload = config.object_property_simplePayload;
23
+ this.object_property_fullObject = config.object_property_fullObject;
24
+
25
+
26
+
27
27
  this.object_props = getObjectProps(this);
28
28
 
29
29
  function getObjectProps(node) {
30
30
  var propArr = [];
31
- if(node.object_property_presentVal == true){
32
- propArr.push({ id: baEnum.PropertyIds.PROP_PRESENT_VALUE });
33
- }
34
- if(node.object_property_objDescription == true){
35
- propArr.push({ id: baEnum.PropertyIds.PROP_DESCRIPTION });
36
- }
37
- if(node.object_property_statusFlag == true){
38
- propArr.push({ id: baEnum.PropertyIds.PROP_STATUS_FLAGS });
39
- }
40
- if(node.object_property_reliability == true){
41
- propArr.push({ id: baEnum.PropertyIds.PROP_RELIABILITY });
42
- }
43
- if(node.object_property_outOfService == true){
44
- propArr.push({ id: baEnum.PropertyIds.PROP_OUT_OF_SERVICE });
31
+ if(node.object_property_simplePayload == true){
32
+ propArr.push({ id: baEnum.PropertyIdentifier.PRESENT_VALUE });
45
33
  }
46
- if(node.object_property_units == true) {
47
- propArr.push({ id: baEnum.PropertyIds.PROP_UNITS });
34
+ if(node.object_property_fullObject == true){
35
+ propArr.push(
36
+ { id: baEnum.PropertyIdentifier.PRESENT_VALUE },
37
+ { id: baEnum.PropertyIdentifier.DESCRIPTION },
38
+ { id: baEnum.PropertyIdentifier.STATUS_FLAGS },
39
+ { id: baEnum.PropertyIdentifier.RELIABILITY },
40
+ { id: baEnum.PropertyIdentifier.OUT_OF_SERVICE },
41
+ { id: baEnum.PropertyIdentifier.UNITS }
42
+
43
+ );
48
44
  }
49
45
 
50
46
  //add object name for every request as its used in formatting
51
- propArr.push({ id: baEnum.PropertyIds.PROP_OBJECT_NAME});
47
+ propArr.push({ id: baEnum.PropertyIdentifier.OBJECT_NAME});
52
48
 
53
49
  return propArr;
54
50
  };
@@ -63,6 +59,10 @@ module.exports = function (RED) {
63
59
  type: "Read",
64
60
  id: node.id,
65
61
  options: readConfig,
62
+ objectPropertyType: {
63
+ simplePayload: node.object_property_simplePayload,
64
+ fullObject: node.object_property_fullObject
65
+ },
66
66
  outputType: {
67
67
  json: node.json,
68
68
  mqtt: node.mqtt
package/bacnet_write.html CHANGED
@@ -109,15 +109,15 @@
109
109
 
110
110
  //update node-red data structure to forward to gateway
111
111
  let device = this.deviceList.find(ele => ele.deviceName == slotProps.node.label);
112
- let points = this.pointList[slotProps.node.ipAddr];
112
+ let points = this.pointList[slotProps.node.deviceId];
113
113
 
114
- if (!this.pointsToWrite[device.address] || typeof this.pointsToWrite[device.address] == 'undefined') {
115
- this.pointsToWrite[device.address] = {};
114
+ if (!this.pointsToWrite[device.deviceId] || typeof this.pointsToWrite[device.deviceId] == 'undefined') {
115
+ this.pointsToWrite[device.deviceId] = {};
116
116
  }
117
117
 
118
118
  for (let pointName in points) {
119
- let point = this.pointList[device.address][pointName];
120
- this.pointsToWrite[device.address][point.objectName] = point;
119
+ let point = this.pointList[device.deviceId][pointName];
120
+ this.pointsToWrite[device.deviceId][point.objectName] = point;
121
121
  }
122
122
 
123
123
  //force a deploy state
@@ -133,8 +133,8 @@
133
133
 
134
134
  //update node-red data structure
135
135
  let device = this.deviceList.find(ele => ele.deviceName == slotProps.node.label);
136
- if (this.pointsToWrite[device.address]) {
137
- delete this.pointsToWrite[device.address];
136
+ if (this.pointsToWrite[device.deviceId]) {
137
+ delete this.pointsToWrite[device.deviceId];
138
138
  }
139
139
 
140
140
  //force a deploy state
@@ -170,15 +170,15 @@
170
170
 
171
171
  //update node-red data structure
172
172
  let device = this.deviceList.find(ele => ele.deviceName == parentDeviceName);
173
- let point = this.pointList[device.address][slotProps.node.label];
174
- point.deviceAddress = device.address;
173
+ let point = this.pointList[device.deviceId][slotProps.node.pointName];
174
+ point.deviceId = device.deviceId;
175
175
 
176
176
  if (!this.pointsToWrite || this.pointsToWrite.length == 'undefined') {
177
177
  this.pointsToWrite = [];
178
178
  }
179
179
 
180
180
  let found = this.pointsToWrite.find(ele =>
181
- ele.deviceAddress == point.deviceAddress &&
181
+ ele.deviceId == point.deviceId &&
182
182
  ele.objectName == point.objectName &&
183
183
  ele.meta.arrayIndex == point.meta.arrayIndex &&
184
184
  ele.meta.objectId.instance == point.meta.objectId.instance &&
@@ -209,10 +209,10 @@
209
209
  //update node-red data stucture
210
210
  let device = this.deviceList.find(ele => ele.deviceName == parentDeviceName);
211
211
  let point = this.pointList[parentDeviceName][slotProps.node.label];
212
- point.deviceAddress = device.address;
212
+ point.deviceId = device.deviceId;
213
213
 
214
214
  let foundIndex = this.pointsToWrite.findIndex(ele =>
215
- ele.deviceAddress == point.deviceAddress &&
215
+ ele.deviceId == point.deviceId &&
216
216
  ele.objectName == point.objectName &&
217
217
  ele.meta.arrayIndex == point.meta.arrayIndex &&
218
218
  ele.meta.objectId.instance == point.meta.objectId.instance &&
@@ -343,10 +343,9 @@
343
343
  .pointLabel {
344
344
  font-weight: 400;
345
345
  }
346
- .p-treenode-children {
347
- /* background-color: #21232e; */
346
+ /* .p-treenode-children {
348
347
  background-color: #f0f0f0;
349
- }
348
+ } */
350
349
  .deviceLabel {
351
350
  font-weight: 100;
352
351
  }
@@ -436,6 +435,11 @@
436
435
  background-color: #d5d5d5;
437
436
  border-radius: 10px;
438
437
  }
438
+ .p-treenode-label {
439
+ overflow: hidden;
440
+ white-space: nowrap;
441
+ text-overflow: ellipsis;
442
+ }
439
443
 
440
444
  </style>
441
445
 
package/bacnet_write.js CHANGED
@@ -5,9 +5,7 @@
5
5
  module.exports = function (RED) {
6
6
  function BitpoolBacnetWriteDevice (config) {
7
7
  RED.nodes.createNode(this, config);
8
-
9
8
  var node = this;
10
-
11
9
  node.priority = config.priority;
12
10
  node.appTag = config.applicationTag;
13
11
  node.pointsToWrite = config.pointsToWrite;