@bitpoolos/edge-bacnet 1.0.6 → 1.1.0

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 (181) hide show
  1. package/bacnet_client.js +650 -233
  2. package/bacnet_device.js +65 -16
  3. package/bacnet_gateway.html +242 -99
  4. package/bacnet_gateway.js +211 -27
  5. package/bacnet_object.js +1 -1
  6. package/bacnet_read.html +211 -133
  7. package/bacnet_read.js +24 -24
  8. package/bacnet_server.js +321 -0
  9. package/bacnet_write.html +24 -15
  10. package/bacnet_write.js +0 -2
  11. package/common.js +95 -9
  12. package/edge-bacnet-datastore.cfg +0 -0
  13. package/package.json +6 -4
  14. package/resources/confirmationservice.min.js +1 -0
  15. package/resources/confirmdialog.min.js +1 -0
  16. package/resources/fonts/primeicons.woff2 +0 -0
  17. package/resources/node-bacnet/CHANGELOG.md +481 -0
  18. package/resources/{bacstack → node-bacnet}/LICENSE.md +3 -1
  19. package/resources/node-bacnet/README.md +91 -0
  20. package/resources/node-bacnet/docs/Client.html +4422 -0
  21. package/resources/node-bacnet/docs/bacnet-icon-quad.png +0 -0
  22. package/resources/node-bacnet/docs/bacnet-icon-quad128.png +0 -0
  23. package/resources/node-bacnet/docs/bacnet-icon-quad64.png +0 -0
  24. package/resources/node-bacnet/docs/bacnet-icon-small.xcf +0 -0
  25. package/resources/node-bacnet/docs/bacnet-icon.xcf +0 -0
  26. package/resources/node-bacnet/docs/bacnet.html +7032 -0
  27. package/resources/node-bacnet/docs/client.js.html +1759 -0
  28. package/resources/node-bacnet/docs/enum.js.html +2530 -0
  29. package/resources/node-bacnet/docs/global.html +2068 -0
  30. package/resources/node-bacnet/docs/images/mocha-logo.svg +65 -0
  31. package/resources/node-bacnet/docs/index.html +283 -0
  32. package/resources/node-bacnet/docs/scripts/collapse.js +11 -0
  33. package/resources/node-bacnet/docs/scripts/jquery-3.1.1.min.js +4 -0
  34. package/resources/node-bacnet/docs/scripts/linenumber.js +26 -0
  35. package/resources/node-bacnet/docs/scripts/prettify/Apache-License-2.0.txt +202 -0
  36. package/resources/node-bacnet/docs/scripts/prettify/lang-css.js +2 -0
  37. package/resources/node-bacnet/docs/scripts/prettify/prettify.js +28 -0
  38. package/resources/node-bacnet/docs/scripts/search.js +47 -0
  39. package/resources/node-bacnet/docs/services_i-am.js.html +157 -0
  40. package/resources/node-bacnet/docs/services_time-sync.js.html +118 -0
  41. package/resources/node-bacnet/docs/services_who-is.js.html +138 -0
  42. package/resources/node-bacnet/docs/styles/jsdoc.css +683 -0
  43. package/resources/node-bacnet/docs/styles/prettify.css +82 -0
  44. package/resources/node-bacnet/examples/discover-devices.js +66 -0
  45. package/resources/node-bacnet/examples/read-device.js +510 -0
  46. package/resources/node-bacnet/examples/subscribe-cov.js +75 -0
  47. package/resources/{bacstack → node-bacnet}/index.js +3 -0
  48. package/resources/{bacstack → node-bacnet}/lib/apdu.js +56 -39
  49. package/resources/{bacstack → node-bacnet}/lib/asn1.js +550 -532
  50. package/resources/node-bacnet/lib/bvlc.js +90 -0
  51. package/resources/node-bacnet/lib/client.js +1695 -0
  52. package/resources/node-bacnet/lib/enum.js +2463 -0
  53. package/resources/node-bacnet/lib/npdu.js +123 -0
  54. package/resources/{bacstack → node-bacnet}/lib/services/add-list-element.js +12 -6
  55. package/resources/{bacstack → node-bacnet}/lib/services/alarm-acknowledge.js +3 -3
  56. package/resources/{bacstack → node-bacnet}/lib/services/alarm-summary.js +5 -4
  57. package/resources/{bacstack → node-bacnet}/lib/services/atomic-read-file.js +49 -26
  58. package/resources/{bacstack → node-bacnet}/lib/services/atomic-write-file.js +40 -23
  59. package/resources/{bacstack → node-bacnet}/lib/services/cov-notify.js +33 -17
  60. package/resources/{bacstack → node-bacnet}/lib/services/create-object.js +23 -13
  61. package/resources/{bacstack → node-bacnet}/lib/services/delete-object.js +7 -2
  62. package/resources/{bacstack → node-bacnet}/lib/services/device-communication-control.js +8 -3
  63. package/resources/{bacstack → node-bacnet}/lib/services/error.js +7 -0
  64. package/resources/{bacstack → node-bacnet}/lib/services/event-information.js +10 -9
  65. package/resources/{bacstack → node-bacnet}/lib/services/event-notify-data.js +38 -16
  66. package/resources/{bacstack → node-bacnet}/lib/services/get-enrollment-summary.js +24 -11
  67. package/resources/{bacstack → node-bacnet}/lib/services/get-event-information.js +28 -13
  68. package/resources/node-bacnet/lib/services/i-am.js +90 -0
  69. package/resources/{bacstack/lib/services/i-have-broadcast.js → node-bacnet/lib/services/i-have.js} +3 -2
  70. package/resources/{bacstack → node-bacnet}/lib/services/index.js +7 -4
  71. package/resources/{bacstack → node-bacnet}/lib/services/life-safety-operation.js +3 -2
  72. package/resources/{bacstack → node-bacnet}/lib/services/private-transfer.js +3 -2
  73. package/resources/{bacstack → node-bacnet}/lib/services/read-property-multiple.js +11 -6
  74. package/resources/{bacstack → node-bacnet}/lib/services/read-property.js +42 -24
  75. package/resources/{bacstack → node-bacnet}/lib/services/read-range.js +37 -27
  76. package/resources/node-bacnet/lib/services/register-foreign-device.js +18 -0
  77. package/resources/{bacstack → node-bacnet}/lib/services/reinitialize-device.js +9 -4
  78. package/resources/{bacstack → node-bacnet}/lib/services/subscribe-cov.js +9 -4
  79. package/resources/{bacstack → node-bacnet}/lib/services/subscribe-property.js +18 -8
  80. package/resources/{bacstack → node-bacnet}/lib/services/time-sync.js +28 -5
  81. package/resources/{bacstack → node-bacnet}/lib/services/who-has.js +3 -3
  82. package/resources/{bacstack → node-bacnet}/lib/services/who-is.js +42 -9
  83. package/resources/{bacstack → node-bacnet}/lib/services/write-property-multiple.js +33 -16
  84. package/resources/{bacstack → node-bacnet}/lib/services/write-property.js +23 -13
  85. package/resources/node-bacnet/lib/transport.js +82 -0
  86. package/resources/node-bacnet/package.json +92 -0
  87. package/resources/primeicons.css +90 -2
  88. package/resources/bacstack/.codeclimate.yml +0 -15
  89. package/resources/bacstack/.dockerignore +0 -5
  90. package/resources/bacstack/.editorconfig +0 -13
  91. package/resources/bacstack/.eslintrc.yml +0 -13
  92. package/resources/bacstack/.github/ISSUE_TEMPLATE.md +0 -26
  93. package/resources/bacstack/.github/PULL_REQUEST_TEMPLATE.md +0 -14
  94. package/resources/bacstack/.github/workflows/ci.yml +0 -39
  95. package/resources/bacstack/.jscsrc +0 -8
  96. package/resources/bacstack/.jshintrc +0 -50
  97. package/resources/bacstack/.travis.yml +0 -27
  98. package/resources/bacstack/CHANGELOG.md +0 -232
  99. package/resources/bacstack/CODE_OF_CONDUCT.md +0 -74
  100. package/resources/bacstack/CONTRIBUTING.md +0 -77
  101. package/resources/bacstack/Dockerfile +0 -15
  102. package/resources/bacstack/FAQ.md +0 -64
  103. package/resources/bacstack/README.md +0 -157
  104. package/resources/bacstack/docker-compose.yml +0 -9
  105. package/resources/bacstack/lib/adpu.js +0 -190
  106. package/resources/bacstack/lib/bvlc.js +0 -43
  107. package/resources/bacstack/lib/client.js +0 -1028
  108. package/resources/bacstack/lib/enum.js +0 -1314
  109. package/resources/bacstack/lib/npdu.js +0 -119
  110. package/resources/bacstack/lib/services/i-am-broadcast.js +0 -51
  111. package/resources/bacstack/lib/services.js +0 -1963
  112. package/resources/bacstack/lib/transport.js +0 -52
  113. package/resources/bacstack/package-lock.json +0 -7974
  114. package/resources/bacstack/package.json +0 -84
  115. package/resources/bacstack/test/compliance/who-is.spec.js +0 -37
  116. package/resources/bacstack/test/integration/acknowledge-alarm.spec.js +0 -14
  117. package/resources/bacstack/test/integration/add-list-element.spec.js +0 -16
  118. package/resources/bacstack/test/integration/confirmed-event-notification.spec.js +0 -30
  119. package/resources/bacstack/test/integration/confirmed-private-transfer.spec.js +0 -15
  120. package/resources/bacstack/test/integration/create-object.spec.js +0 -16
  121. package/resources/bacstack/test/integration/delete-object.spec.js +0 -14
  122. package/resources/bacstack/test/integration/device-communication-control.spec.js +0 -14
  123. package/resources/bacstack/test/integration/get-alarm-summary.spec.js +0 -14
  124. package/resources/bacstack/test/integration/get-enrollment-summary.spec.js +0 -15
  125. package/resources/bacstack/test/integration/get-event-information.spec.js +0 -14
  126. package/resources/bacstack/test/integration/read-file.spec.js +0 -14
  127. package/resources/bacstack/test/integration/read-property-multiple.spec.js +0 -110
  128. package/resources/bacstack/test/integration/read-property.spec.js +0 -14
  129. package/resources/bacstack/test/integration/read-range.spec.js +0 -14
  130. package/resources/bacstack/test/integration/reinitialize-sevice.spec.js +0 -14
  131. package/resources/bacstack/test/integration/remove-list-element.spec.js +0 -16
  132. package/resources/bacstack/test/integration/subscribe-cov.spec.js +0 -14
  133. package/resources/bacstack/test/integration/subscribe-property.spec.js +0 -14
  134. package/resources/bacstack/test/integration/time-sync-utc.spec.js +0 -10
  135. package/resources/bacstack/test/integration/time-sync.spec.js +0 -10
  136. package/resources/bacstack/test/integration/unconfirmed-event-notification.spec.js +0 -28
  137. package/resources/bacstack/test/integration/unconfirmed-private-transfer.spec.js +0 -11
  138. package/resources/bacstack/test/integration/utils.js +0 -30
  139. package/resources/bacstack/test/integration/who-is.spec.js +0 -17
  140. package/resources/bacstack/test/integration/write-file.spec.js +0 -14
  141. package/resources/bacstack/test/integration/write-property-multiple.spec.js +0 -19
  142. package/resources/bacstack/test/integration/write-property.spec.js +0 -14
  143. package/resources/bacstack/test/unit/apdu.spec.js +0 -162
  144. package/resources/bacstack/test/unit/asn1.spec.js +0 -39
  145. package/resources/bacstack/test/unit/bacnet-apdu.spec.js +0 -161
  146. package/resources/bacstack/test/unit/bacnet-asn1.spec.js +0 -32
  147. package/resources/bacstack/test/unit/bacnet-bvlc.spec.js +0 -57
  148. package/resources/bacstack/test/unit/bacnet-npdu.spec.js +0 -118
  149. package/resources/bacstack/test/unit/bacnet-services.spec.js +0 -2052
  150. package/resources/bacstack/test/unit/bvlc.spec.js +0 -58
  151. package/resources/bacstack/test/unit/npdu.spec.js +0 -119
  152. package/resources/bacstack/test/unit/service-add-list-element.spec.js +0 -24
  153. package/resources/bacstack/test/unit/service-alarm-acknowledge.spec.js +0 -71
  154. package/resources/bacstack/test/unit/service-alarm-summary.spec.js +0 -22
  155. package/resources/bacstack/test/unit/service-atomic-read-file.spec.js +0 -54
  156. package/resources/bacstack/test/unit/service-atomic-write-file.spec.js +0 -56
  157. package/resources/bacstack/test/unit/service-cov-notify.spec.js +0 -98
  158. package/resources/bacstack/test/unit/service-create-object.spec.js +0 -90
  159. package/resources/bacstack/test/unit/service-delete-object.spec.js +0 -17
  160. package/resources/bacstack/test/unit/service-device-communication-control.spec.js +0 -29
  161. package/resources/bacstack/test/unit/service-error.spec.js +0 -17
  162. package/resources/bacstack/test/unit/service-event-information.spec.js +0 -48
  163. package/resources/bacstack/test/unit/service-event-notify-data.spec.js +0 -310
  164. package/resources/bacstack/test/unit/service-get-enrollment-summary.spec.js +0 -45
  165. package/resources/bacstack/test/unit/service-get-event-information.spec.js +0 -62
  166. package/resources/bacstack/test/unit/service-i-am.spec.js +0 -19
  167. package/resources/bacstack/test/unit/service-i-have-broadcast.spec.js +0 -18
  168. package/resources/bacstack/test/unit/service-life-safety-operation.spec.js +0 -19
  169. package/resources/bacstack/test/unit/service-private-transfer.spec.js +0 -18
  170. package/resources/bacstack/test/unit/service-read-property-multiple.spec.js +0 -131
  171. package/resources/bacstack/test/unit/service-read-property.spec.js +0 -541
  172. package/resources/bacstack/test/unit/service-read-range.spec.js +0 -97
  173. package/resources/bacstack/test/unit/service-reinitialize-device.spec.js +0 -27
  174. package/resources/bacstack/test/unit/service-subscribe-cov.spec.js +0 -32
  175. package/resources/bacstack/test/unit/service-subscribe-property.spec.js +0 -50
  176. package/resources/bacstack/test/unit/service-time-sync.spec.js +0 -18
  177. package/resources/bacstack/test/unit/service-who-has.spec.js +0 -33
  178. package/resources/bacstack/test/unit/service-who-is.spec.js +0 -17
  179. package/resources/bacstack/test/unit/service-write-property-multiple.spec.js +0 -143
  180. package/resources/bacstack/test/unit/service-write-property.spec.js +0 -198
  181. 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,10 +105,30 @@
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);
110
+ });
111
+ },
112
+ rebuildDataModel() {
113
+ let app = this;
114
+ app.nodeService.rebuildDataModel().then(function (result) {
115
+ if(result == true){
116
+ app.progressBarValue = 0;
117
+ }
111
118
  });
119
+
120
+
121
+ },
122
+ addAllDevices() {
123
+ let app = this;
124
+ app.devices.forEach(function (device) {
125
+ app.addAllClicked({"node": device});
126
+ });
127
+
112
128
  },
113
129
  addAllClicked(slotProps) {
114
130
  //update UI
131
+ let app = this;
115
132
 
116
133
  let clone = JSON.parse(JSON.stringify(slotProps.node));
117
134
 
@@ -135,48 +152,71 @@
135
152
 
136
153
  //update node-red data structure to forward to gateway
137
154
  let device = this.deviceList.find(ele => ele.deviceName == slotProps.node.label);
138
- let points = this.pointList[slotProps.node.ipAddr];
155
+ let deviceAddress = app.getDeviceAddress(device.address);
156
+ let key = `${deviceAddress}-${device.deviceId}`;
157
+ let points = this.pointList[key];
139
158
 
140
- if (!this.pointsToRead[device.address]) {
141
- this.pointsToRead[device.address] = {};
159
+ if (!this.pointsToRead[key]) {
160
+ this.pointsToRead[key] = {};
142
161
  }
143
162
 
144
163
  for (let pointName in points) {
145
- let point = this.pointList[device.address][pointName];
146
- this.pointsToRead[device.address][point.objectName] = point;
164
+ let point = this.pointList[key][pointName];
165
+ this.pointsToRead[key][point.objectName] = point;
147
166
  }
148
167
 
149
168
  //force a deploy state
150
169
  node.hiddenDeployToggle = !node.prevHiddenToggleState;
151
170
  },
171
+ removeAllDevices() {
172
+ let app = this;
173
+
174
+ let clone = JSON.parse(JSON.stringify(app.readDevices));
175
+
176
+ clone.forEach(function (device) {
177
+ app.removeAllClicked({"node": device});
178
+ });
179
+
180
+ app.$forceUpdate();
181
+
182
+ },
152
183
  removeAllClicked(slotProps) {
153
- //update UI
154
- if (this.readDevices.length > 0) {
155
- let foundIndex = this.readDevices.findIndex(ele => ele.key == slotProps.node.key && ele.label == slotProps.node.label);
156
- if (foundIndex !== -1) this.readDevices.splice(foundIndex, 1);
157
- }
184
+ let app = this;
185
+ try {
186
+ //update UI
187
+ if (this.readDevices.length > 0) {
188
+ let foundIndex = this.readDevices.findIndex(ele => ele.key == slotProps.node.key && ele.label == slotProps.node.label);
189
+ if (foundIndex !== -1) this.readDevices.splice(foundIndex, 1);
190
+ }
158
191
 
159
- let deviceSlot = this.devices.find(ele => ele.label == slotProps.node.label);
160
- if(deviceSlot) {
161
- deviceSlot.showAdded = false;
162
- deviceSlot.children.forEach(function(child) {
163
- child.showAdded = false;
164
- });
165
- }
166
- slotProps.node.showAdded = false;
167
- this.$forceUpdate()
192
+ let deviceSlot = this.devices.find(ele => ele.label == slotProps.node.label);
193
+ if(deviceSlot) {
194
+ deviceSlot.showAdded = false;
195
+ deviceSlot.children.forEach(function(child) {
196
+ child.showAdded = false;
197
+ });
198
+ }
199
+ slotProps.node.showAdded = false;
200
+ this.$forceUpdate();
201
+
202
+ //update node-red data structure
203
+ let device = this.deviceList.find(ele => ele.deviceName == slotProps.node.label);
204
+ let deviceAddress = app.getDeviceAddress(device.address);
205
+ let key = `${deviceAddress}-${device.deviceId}`;
206
+ if (this.pointsToRead[key]) {
207
+ delete this.pointsToRead[key];
208
+ }
168
209
 
169
- //update node-red data structure
170
- let device = this.deviceList.find(ele => ele.deviceName == slotProps.node.label);
171
- if (this.pointsToRead[device.address]) {
172
- delete this.pointsToRead[device.address];
210
+ //force a deploy state
211
+ node.hiddenDeployToggle = !node.prevHiddenToggleState;
212
+
213
+ } catch(e){
214
+ console.log("removeAllClicked error: ", e);
173
215
  }
174
216
 
175
- //force a deploy state
176
- node.hiddenDeployToggle = !node.prevHiddenToggleState;
177
217
  },
178
218
  addPointClicked(slotProps) {
179
-
219
+ let app = this;
180
220
  //update UI
181
221
  let parentDeviceName = slotProps.node.parentDevice;
182
222
  let foundDeviceIndex = this.readDevices ? this.readDevices.findIndex(ele => ele.label == parentDeviceName) : -1;
@@ -199,31 +239,35 @@
199
239
  }
200
240
 
201
241
  //set show added to true
202
- let slot = parentDevice.children.find(ele => ele.label == slotProps.node.label);
242
+ let slot = parentDevice.children.find(ele => ele.pointName == slotProps.node.pointName);
203
243
  slot.showAdded = true;
204
244
 
205
245
  this.$forceUpdate();
206
246
 
207
247
  //update node-red data structure
208
248
  let device = this.deviceList.find(ele => ele.deviceName == parentDeviceName);
209
- if (!this.pointsToRead[device.address]) {
210
- this.pointsToRead[device.address] = {};
249
+ let deviceAddress = app.getDeviceAddress(device.address);
250
+ let key = `${deviceAddress}-${device.deviceId}`;
251
+
252
+ if (!this.pointsToRead[key]) {
253
+ this.pointsToRead[key] = {};
211
254
  }
212
255
 
213
- let point = this.pointList[parentDevice.ipAddr][slotProps.node.label];
214
- this.pointsToRead[device.address][point.objectName] = point;
256
+ let point = this.pointList[key][slotProps.node.pointName];
257
+ this.pointsToRead[key][point.objectName] = point;
215
258
 
216
259
  //force a deploy state
217
260
  node.hiddenDeployToggle = !node.prevHiddenToggleState;
218
261
  },
219
262
  removePointClicked(slotProps) {
263
+ let app = this;
220
264
  //update UI
221
265
  let parentDeviceName = slotProps.node.parentDevice;
222
266
  let foundDeviceIndex = this.readDevices ? this.readDevices.findIndex(ele => ele.label == parentDeviceName) : -1;
223
267
  let parentDevice = this.devices.find(ele => ele.label == parentDeviceName);
224
268
 
225
269
  if (foundDeviceIndex !== -1) {
226
- let foundIndex = this.readDevices[foundDeviceIndex].children.findIndex(ele => ele.key == slotProps.node.key && ele.label == slotProps.node.label);
270
+ let foundIndex = this.readDevices[foundDeviceIndex].children.findIndex(ele => ele.key == slotProps.node.key && ele.pointName == slotProps.node.pointName);
227
271
  if (foundIndex !== -1) this.readDevices[foundDeviceIndex].children.splice(foundIndex, 1);
228
272
  if (this.readDevices[foundDeviceIndex].children.length == 0) {
229
273
  this.readDevices.splice(foundDeviceIndex, 1);
@@ -231,19 +275,33 @@
231
275
  }
232
276
 
233
277
  //set show added to true
234
- let slot = parentDevice.showAdded ? slotProps.node : parentDevice.children.find(ele => ele.label == slotProps.node.label);
278
+ let slot = parentDevice.showAdded ? slotProps.node : parentDevice.children.find(ele => ele.pointName == slotProps.node.pointName);
235
279
  slot.showAdded = false;
236
280
  slotProps.node.showAdded = false;
237
281
  this.$forceUpdate();
238
282
 
239
283
  //update node-red data stucture
240
284
  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];
285
+ let deviceAddress = app.getDeviceAddress(device.address);
286
+ let key = `${deviceAddress}-${device.deviceId}`;
287
+ let point = this.pointList[key][slotProps.node.pointName];
288
+ if (this.pointsToRead[key][point.objectName]) delete this.pointsToRead[key][point.objectName];
289
+ //if last point is removed, deleted whole entry
290
+ if(Object.keys(this.pointsToRead[key]).length == 0) delete this.pointsToRead[key];
243
291
 
244
292
  //force a deploy state
245
293
  node.hiddenDeployToggle = !node.prevHiddenToggleState;
246
294
  },
295
+ getDeviceAddress(addr) {
296
+ switch(typeof addr) {
297
+ case "object":
298
+ return addr.address;
299
+ case "string":
300
+ return addr;
301
+ default:
302
+ return addr;
303
+ }
304
+ },
247
305
  isDeviceActive(slotProps) {
248
306
  let app = this;
249
307
  if (((Date.now() - slotProps.node.lastSeen) / 1000) < (app.pollFrequency + 5)) {
@@ -272,12 +330,14 @@
272
330
  components: {
273
331
  "p-tree": primevue.tree,
274
332
  "p-button": primevue.button,
275
- "p-timeline": primevue.timeline
333
+ "p-timeline": primevue.timeline,
334
+ "p-progressbar": primevue.progressbar
276
335
  }
277
336
  };
278
337
 
279
338
  let vueapp = createApp(App);
280
- vueapp.use(primevue.config.default)
339
+ vueapp.use(primevue.config.default);
340
+ vueapp.use(primevue.confirmationservice);
281
341
  node.vm = vueapp.mount("#node-input-tabs-content");
282
342
 
283
343
  //reinstate device data
@@ -290,18 +350,11 @@
290
350
  }
291
351
 
292
352
  //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;
353
+
354
+ document.getElementById("node-input-object_property_simplePayload").checked = node.object_property_simplePayload;
355
+ document.getElementById("node-input-object_property_simplePayload").onclick = handleCheckboxClick;
356
+ document.getElementById("node-input-object_property_fullObject").checked = node.object_property_fullObject;
357
+ document.getElementById("node-input-object_property_fullObject").onclick = handleCheckboxClick;
305
358
 
306
359
  document.getElementById("node-input-roundDecimal").value = node.roundDecimal;
307
360
  document.getElementById("node-input-json").checked = node.json;
@@ -310,15 +363,12 @@
310
363
  document.getElementById("node-input-mqtt").onclick = handleMsgTypeClick;
311
364
 
312
365
  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
- }
366
+
367
+ if(this.id == "node-input-object_property_simplePayload") {
368
+ document.getElementById("node-input-object_property_fullObject").checked = !document.getElementById("node-input-object_property_fullObject").checked;
319
369
  }
320
- if (checkedCount == 0) {
321
- this.checked = true;
370
+ if(this.id == "node-input-object_property_fullObject") {
371
+ document.getElementById("node-input-object_property_simplePayload").checked = !document.getElementById("node-input-object_property_simplePayload").checked;
322
372
  }
323
373
  }
324
374
 
@@ -389,13 +439,13 @@
389
439
  <style>
390
440
 
391
441
  .p-treenode-label {
392
- /* color: white; */
393
442
  color: black;
394
443
  width: 100%;
395
444
  }
396
445
  .p-tree {
397
446
  background: inherit !important;
398
447
  border: inherit !important;
448
+ padding-right: 0px !important;
399
449
  }
400
450
  .p-button {
401
451
  margin-right: .5rem;
@@ -407,16 +457,14 @@
407
457
  float: right;
408
458
  }
409
459
  .addPointButton:hover, .minusPointButton:hover {
410
- /* background: #282A36 !important; */
411
460
  background: #d5d5d5 !important;
412
461
  }
413
462
  .pointLabel {
414
463
  font-weight: 400;
415
464
  }
416
- .p-treenode-children {
417
- /* background-color: #21232e; */
465
+ /* .p-treenode-children {
418
466
  background-color: #f0f0f0;
419
- }
467
+ } */
420
468
  .deviceLabel {
421
469
  font-weight: 100;
422
470
  }
@@ -429,12 +477,10 @@
429
477
  .bacnetbutton {
430
478
  background: none;
431
479
  border: none;
432
- /* color: white; */
433
480
  color: black;
434
481
  font-weight: 400;
435
482
  }
436
483
  .bacnetbutton:hover {
437
- /* background: #21232e; */
438
484
  background: #f0f0f0;
439
485
  border-radius: 10px;
440
486
  }
@@ -454,7 +500,6 @@
454
500
  padding-bottom: 30px;
455
501
  }
456
502
  .p-tree-toggler:enabled:hover {
457
- /* background: #21232e !important; */
458
503
  background: #d5d5d5 !important;
459
504
  }
460
505
  .p-tree-toggler:focus {
@@ -502,7 +547,7 @@
502
547
  outline: none !important;
503
548
  }
504
549
  .p-tree-filter:focus, .p-tree-filter:focus-visible, .p-inputtext:enabled:hover {
505
- box-shadow: inset 0 0 0 0.15rem #44475a !important;
550
+ box-shadow: inset 0 0 0 0.15rem #dfdcdc !important;
506
551
  border-color: transparent !important;
507
552
  }
508
553
  .bacnetbutton > .pi {
@@ -514,11 +559,27 @@
514
559
  .reloadButtonIcon {
515
560
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" !important;
516
561
  }
562
+ .removeAllDevicesButton {
563
+ border: none;
564
+ background: none;
565
+ font-size: 14px !important;
566
+ float: right;
567
+ display: flex;
568
+ align-items: center;
569
+ }
570
+ .removeAllDevicesButton:hover {
571
+ background-color: #d5d5d5;
572
+ border-radius: 10px;
573
+ }
517
574
  .reloadButton {
518
575
  border: none;
519
576
  background: none;
520
- margin-right: 20px !important;
521
- margin-bottom: 10px !important;
577
+ font-size: 14px !important;
578
+ float: right;
579
+ }
580
+ .rebuildDataButton {
581
+ border: none;
582
+ background: none;
522
583
  font-size: 14px !important;
523
584
  float: right;
524
585
  }
@@ -526,9 +587,41 @@
526
587
  background-color: #d5d5d5;
527
588
  border-radius: 10px;
528
589
  }
529
- /* .p-tree-filter-icon {
530
- margin-top: 0px !important;
531
- } */
590
+ .rebuildDataButton:hover {
591
+ background-color: #d5d5d5;
592
+ border-radius: 10px;
593
+ }
594
+ .headerDiv {
595
+ display: flex;
596
+ flex-direction: row;
597
+ flex-wrap: nowrap;
598
+ justify-content: space-around;
599
+ height: 20px;
600
+ }
601
+ .msgTypeDiv {
602
+ display: flex;
603
+ align-items: flex-start;
604
+ flex-direction: column;
605
+ }
606
+ .p-progressbar .p-progressbar-value {
607
+ background: #00AEEF !important;
608
+ }
609
+ .p-treenode-label {
610
+ overflow: hidden;
611
+ white-space: nowrap;
612
+ text-overflow: ellipsis;
613
+ }
614
+ .buttonGroup {
615
+ padding-left: 7px;
616
+ }
617
+ #read-readList-tab {
618
+ display: flex;
619
+ flex-direction: column;
620
+ }
621
+ .removeAllDevicesDiv {
622
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
623
+ padding-right: 20px;
624
+ }
532
625
 
533
626
  </style>
534
627
 
@@ -554,11 +647,20 @@
554
647
 
555
648
  <div id='read-networkTree-tab-content' class="networkTreeContent" style='display:none'>
556
649
 
557
- <div>
650
+ <div class="headerDiv">
558
651
  <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>
652
+ <p-progressbar :value="progressBarValue" :show-value="true" style="width: 300px; height: 20px;"></p-progressbar>
653
+ <div class="buttonGroup" style="padding-left: 15px;">
654
+ <button @click="rebuildDataModel()" class="rebuildDataButton" title="Rebuild Data Model" >
655
+ <i class="pi pi-wrench" style="color: #ff0000;"></i>
656
+ </button>
657
+ <button @click="getData()" class="reloadButton" title="Reload Data">
658
+ <i class="pi pi-refresh" style="color: #00AEEF;"></i>
659
+ </button>
660
+ <button @click="addAllDevices()" class="reloadButton" title="Add all devices">
661
+ <i class="pi pi-plus" style="color: #00AEEF;"></i>
662
+ </button>
663
+ </div>
562
664
  </div>
563
665
 
564
666
 
@@ -625,7 +727,11 @@
625
727
  *
626
728
  -->
627
729
  <div id='read-readList-tab' style='display:none'>
628
-
730
+ <div class="removeAllDevicesDiv" >
731
+ <button @click="removeAllDevices()" class="removeAllDevicesButton" title="Remove all devices">
732
+ <i class="pi pi-minus-circle" style="color: #ff0000; padding-right: 5px;"> </i><a style="color: #ff0000;">Remove All Devices</a>
733
+ </button>
734
+ </div>
629
735
 
630
736
  <p-tree :value="readDevices">
631
737
  <template #device="slotProps">
@@ -652,71 +758,43 @@
652
758
  *
653
759
  -->
654
760
  <div id='read-properties-tab' style='display:none'>
655
- <div class="form-row" style="display: inline-flex; width: fit-content; flex-wrap: nowrap;">
761
+ <div class="form-row" style="display: flex; width: fit-content; flex-wrap: nowrap; flex-direction: column;">
656
762
 
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>
763
+ <label for="node-input-object_properties_group" style="display: flex; align-items: center; white-space: nowrap; text-decoration: underline;">Object Properties:</label>
675
764
 
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
765
 
766
+ <div id="node-input-object_properties_group" style="display: flex; align-items: flex-start; flex-direction: column; padding-left: 50px;">
684
767
  <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">
768
+ <label for="node-input-object_property_simplePayload" style="padding-left: 4px; width: auto; align-items: start;" class="objectPropertiesLabel">
769
+ <i class="icon-tag"></i> <span data-i18n="bitpool-bacnet.label.object_property_simplePayload"></span>
770
+ <input style="margin-left: 5px;" class=" objectProp" type="checkbox" id="node-input-object_property_simplePayload">
771
+ <a style="white-space: nowrap; padding-left: 20px;">Simple Payload</a>
689
772
  </label>
690
773
  </div>
691
774
 
692
775
  <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">
776
+ <label for="node-input-object_property_fullObject" style="padding-left: 4px; width: auto; align-items: start;" class="objectPropertiesLabel">
777
+ <i class="icon-tag"></i> <span data-i18n="bitpool-bacnet.label.object_property_fullObject"></span>
778
+ <input style="margin-left: 5px;" class=" objectProp" type="checkbox" id="node-input-object_property_fullObject">
779
+ <a style="white-space: nowrap; padding-left: 20px;">Full Object</a>
697
780
  </label>
698
781
  </div>
699
782
 
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>
783
+ </div>
708
784
  </div>
709
785
 
710
- <br>
711
- <br>
786
+ <hr>
712
787
 
713
- <div class="form-row" style="display: flex;">
714
- <label for="node-input-msgType">
788
+ <div class="form-row msgTypeDiv" style="display: flex;">
789
+ <label for="node-input-msgType" style="text-decoration: underline;">
715
790
  Message type:
716
791
  </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>
792
+ <div id="node-input-msgType" style="display: flex; align-items: flex-start; flex-direction: column; padding-left: 50px;">
793
+
794
+ <!-- class= checkbox-round -->
795
+ <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>
796
+ <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>
797
+
720
798
  </div>
721
799
  </div>
722
800
 
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