@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.
- package/bacnet_client.js +587 -154
- package/bacnet_device.js +34 -11
- package/bacnet_gateway.html +189 -92
- package/bacnet_gateway.js +152 -21
- package/bacnet_object.js +1 -1
- package/bacnet_read.html +115 -113
- package/bacnet_read.js +24 -24
- package/bacnet_write.html +19 -15
- package/bacnet_write.js +0 -2
- package/common.js +63 -8
- package/package.json +5 -1
- package/resources/confirmationservice.min.js +1 -0
- package/resources/confirmdialog.min.js +1 -0
- package/resources/fonts/primeicons.woff2 +0 -0
- package/resources/node-bacnet/CHANGELOG.md +481 -0
- package/resources/{bacstack → node-bacnet}/LICENSE.md +3 -1
- package/resources/node-bacnet/README.md +91 -0
- package/resources/node-bacnet/docs/Client.html +4422 -0
- package/resources/node-bacnet/docs/bacnet-icon-quad.png +0 -0
- package/resources/node-bacnet/docs/bacnet-icon-quad128.png +0 -0
- package/resources/node-bacnet/docs/bacnet-icon-quad64.png +0 -0
- package/resources/node-bacnet/docs/bacnet-icon-small.xcf +0 -0
- package/resources/node-bacnet/docs/bacnet-icon.xcf +0 -0
- package/resources/node-bacnet/docs/bacnet.html +7032 -0
- package/resources/node-bacnet/docs/client.js.html +1759 -0
- package/resources/node-bacnet/docs/enum.js.html +2530 -0
- package/resources/node-bacnet/docs/global.html +2068 -0
- package/resources/node-bacnet/docs/images/mocha-logo.svg +65 -0
- package/resources/node-bacnet/docs/index.html +283 -0
- package/resources/node-bacnet/docs/scripts/collapse.js +11 -0
- package/resources/node-bacnet/docs/scripts/jquery-3.1.1.min.js +4 -0
- package/resources/node-bacnet/docs/scripts/linenumber.js +26 -0
- package/resources/node-bacnet/docs/scripts/prettify/Apache-License-2.0.txt +202 -0
- package/resources/node-bacnet/docs/scripts/prettify/lang-css.js +2 -0
- package/resources/node-bacnet/docs/scripts/prettify/prettify.js +28 -0
- package/resources/node-bacnet/docs/scripts/search.js +47 -0
- package/resources/node-bacnet/docs/services_i-am.js.html +157 -0
- package/resources/node-bacnet/docs/services_time-sync.js.html +118 -0
- package/resources/node-bacnet/docs/services_who-is.js.html +138 -0
- package/resources/node-bacnet/docs/styles/jsdoc.css +683 -0
- package/resources/node-bacnet/docs/styles/prettify.css +82 -0
- package/resources/node-bacnet/examples/discover-devices.js +66 -0
- package/resources/node-bacnet/examples/read-device.js +510 -0
- package/resources/node-bacnet/examples/subscribe-cov.js +75 -0
- package/resources/{bacstack → node-bacnet}/index.js +3 -0
- package/resources/{bacstack → node-bacnet}/lib/apdu.js +56 -39
- package/resources/{bacstack → node-bacnet}/lib/asn1.js +550 -532
- package/resources/node-bacnet/lib/bvlc.js +90 -0
- package/resources/node-bacnet/lib/client.js +1695 -0
- package/resources/node-bacnet/lib/enum.js +2463 -0
- package/resources/node-bacnet/lib/npdu.js +123 -0
- package/resources/{bacstack → node-bacnet}/lib/services/add-list-element.js +12 -6
- package/resources/{bacstack → node-bacnet}/lib/services/alarm-acknowledge.js +3 -3
- package/resources/{bacstack → node-bacnet}/lib/services/alarm-summary.js +5 -4
- package/resources/{bacstack → node-bacnet}/lib/services/atomic-read-file.js +49 -26
- package/resources/{bacstack → node-bacnet}/lib/services/atomic-write-file.js +40 -23
- package/resources/{bacstack → node-bacnet}/lib/services/cov-notify.js +33 -17
- package/resources/{bacstack → node-bacnet}/lib/services/create-object.js +23 -13
- package/resources/{bacstack → node-bacnet}/lib/services/delete-object.js +7 -2
- package/resources/{bacstack → node-bacnet}/lib/services/device-communication-control.js +8 -3
- package/resources/{bacstack → node-bacnet}/lib/services/error.js +7 -0
- package/resources/{bacstack → node-bacnet}/lib/services/event-information.js +10 -9
- package/resources/{bacstack → node-bacnet}/lib/services/event-notify-data.js +38 -16
- package/resources/{bacstack → node-bacnet}/lib/services/get-enrollment-summary.js +24 -11
- package/resources/{bacstack → node-bacnet}/lib/services/get-event-information.js +28 -13
- package/resources/node-bacnet/lib/services/i-am.js +90 -0
- package/resources/{bacstack/lib/services/i-have-broadcast.js → node-bacnet/lib/services/i-have.js} +3 -2
- package/resources/{bacstack → node-bacnet}/lib/services/index.js +7 -4
- package/resources/{bacstack → node-bacnet}/lib/services/life-safety-operation.js +3 -2
- package/resources/{bacstack → node-bacnet}/lib/services/private-transfer.js +3 -2
- package/resources/{bacstack → node-bacnet}/lib/services/read-property-multiple.js +11 -6
- package/resources/{bacstack → node-bacnet}/lib/services/read-property.js +42 -24
- package/resources/{bacstack → node-bacnet}/lib/services/read-range.js +37 -27
- package/resources/node-bacnet/lib/services/register-foreign-device.js +18 -0
- package/resources/{bacstack → node-bacnet}/lib/services/reinitialize-device.js +9 -4
- package/resources/{bacstack → node-bacnet}/lib/services/subscribe-cov.js +9 -4
- package/resources/{bacstack → node-bacnet}/lib/services/subscribe-property.js +18 -8
- package/resources/{bacstack → node-bacnet}/lib/services/time-sync.js +28 -5
- package/resources/{bacstack → node-bacnet}/lib/services/who-has.js +3 -3
- package/resources/{bacstack → node-bacnet}/lib/services/who-is.js +42 -9
- package/resources/{bacstack → node-bacnet}/lib/services/write-property-multiple.js +33 -16
- package/resources/{bacstack → node-bacnet}/lib/services/write-property.js +23 -13
- package/resources/node-bacnet/lib/transport.js +82 -0
- package/resources/node-bacnet/package.json +92 -0
- package/resources/primeicons.css +90 -2
- package/resources/bacstack/.codeclimate.yml +0 -15
- package/resources/bacstack/.dockerignore +0 -5
- package/resources/bacstack/.editorconfig +0 -13
- package/resources/bacstack/.eslintrc.yml +0 -13
- package/resources/bacstack/.github/ISSUE_TEMPLATE.md +0 -26
- package/resources/bacstack/.github/PULL_REQUEST_TEMPLATE.md +0 -14
- package/resources/bacstack/.github/workflows/ci.yml +0 -39
- package/resources/bacstack/.jscsrc +0 -8
- package/resources/bacstack/.jshintrc +0 -50
- package/resources/bacstack/.travis.yml +0 -27
- package/resources/bacstack/CHANGELOG.md +0 -232
- package/resources/bacstack/CODE_OF_CONDUCT.md +0 -74
- package/resources/bacstack/CONTRIBUTING.md +0 -77
- package/resources/bacstack/Dockerfile +0 -15
- package/resources/bacstack/FAQ.md +0 -64
- package/resources/bacstack/README.md +0 -157
- package/resources/bacstack/docker-compose.yml +0 -9
- package/resources/bacstack/lib/adpu.js +0 -190
- package/resources/bacstack/lib/bvlc.js +0 -43
- package/resources/bacstack/lib/client.js +0 -1028
- package/resources/bacstack/lib/enum.js +0 -1314
- package/resources/bacstack/lib/npdu.js +0 -119
- package/resources/bacstack/lib/services/i-am-broadcast.js +0 -51
- package/resources/bacstack/lib/services.js +0 -1963
- package/resources/bacstack/lib/transport.js +0 -52
- package/resources/bacstack/package-lock.json +0 -7974
- package/resources/bacstack/package.json +0 -84
- package/resources/bacstack/test/compliance/who-is.spec.js +0 -37
- package/resources/bacstack/test/integration/acknowledge-alarm.spec.js +0 -14
- package/resources/bacstack/test/integration/add-list-element.spec.js +0 -16
- package/resources/bacstack/test/integration/confirmed-event-notification.spec.js +0 -30
- package/resources/bacstack/test/integration/confirmed-private-transfer.spec.js +0 -15
- package/resources/bacstack/test/integration/create-object.spec.js +0 -16
- package/resources/bacstack/test/integration/delete-object.spec.js +0 -14
- package/resources/bacstack/test/integration/device-communication-control.spec.js +0 -14
- package/resources/bacstack/test/integration/get-alarm-summary.spec.js +0 -14
- package/resources/bacstack/test/integration/get-enrollment-summary.spec.js +0 -15
- package/resources/bacstack/test/integration/get-event-information.spec.js +0 -14
- package/resources/bacstack/test/integration/read-file.spec.js +0 -14
- package/resources/bacstack/test/integration/read-property-multiple.spec.js +0 -110
- package/resources/bacstack/test/integration/read-property.spec.js +0 -14
- package/resources/bacstack/test/integration/read-range.spec.js +0 -14
- package/resources/bacstack/test/integration/reinitialize-sevice.spec.js +0 -14
- package/resources/bacstack/test/integration/remove-list-element.spec.js +0 -16
- package/resources/bacstack/test/integration/subscribe-cov.spec.js +0 -14
- package/resources/bacstack/test/integration/subscribe-property.spec.js +0 -14
- package/resources/bacstack/test/integration/time-sync-utc.spec.js +0 -10
- package/resources/bacstack/test/integration/time-sync.spec.js +0 -10
- package/resources/bacstack/test/integration/unconfirmed-event-notification.spec.js +0 -28
- package/resources/bacstack/test/integration/unconfirmed-private-transfer.spec.js +0 -11
- package/resources/bacstack/test/integration/utils.js +0 -30
- package/resources/bacstack/test/integration/who-is.spec.js +0 -17
- package/resources/bacstack/test/integration/write-file.spec.js +0 -14
- package/resources/bacstack/test/integration/write-property-multiple.spec.js +0 -19
- package/resources/bacstack/test/integration/write-property.spec.js +0 -14
- package/resources/bacstack/test/unit/apdu.spec.js +0 -162
- package/resources/bacstack/test/unit/asn1.spec.js +0 -39
- package/resources/bacstack/test/unit/bacnet-apdu.spec.js +0 -161
- package/resources/bacstack/test/unit/bacnet-asn1.spec.js +0 -32
- package/resources/bacstack/test/unit/bacnet-bvlc.spec.js +0 -57
- package/resources/bacstack/test/unit/bacnet-npdu.spec.js +0 -118
- package/resources/bacstack/test/unit/bacnet-services.spec.js +0 -2052
- package/resources/bacstack/test/unit/bvlc.spec.js +0 -58
- package/resources/bacstack/test/unit/npdu.spec.js +0 -119
- package/resources/bacstack/test/unit/service-add-list-element.spec.js +0 -24
- package/resources/bacstack/test/unit/service-alarm-acknowledge.spec.js +0 -71
- package/resources/bacstack/test/unit/service-alarm-summary.spec.js +0 -22
- package/resources/bacstack/test/unit/service-atomic-read-file.spec.js +0 -54
- package/resources/bacstack/test/unit/service-atomic-write-file.spec.js +0 -56
- package/resources/bacstack/test/unit/service-cov-notify.spec.js +0 -98
- package/resources/bacstack/test/unit/service-create-object.spec.js +0 -90
- package/resources/bacstack/test/unit/service-delete-object.spec.js +0 -17
- package/resources/bacstack/test/unit/service-device-communication-control.spec.js +0 -29
- package/resources/bacstack/test/unit/service-error.spec.js +0 -17
- package/resources/bacstack/test/unit/service-event-information.spec.js +0 -48
- package/resources/bacstack/test/unit/service-event-notify-data.spec.js +0 -310
- package/resources/bacstack/test/unit/service-get-enrollment-summary.spec.js +0 -45
- package/resources/bacstack/test/unit/service-get-event-information.spec.js +0 -62
- package/resources/bacstack/test/unit/service-i-am.spec.js +0 -19
- package/resources/bacstack/test/unit/service-i-have-broadcast.spec.js +0 -18
- package/resources/bacstack/test/unit/service-life-safety-operation.spec.js +0 -19
- package/resources/bacstack/test/unit/service-private-transfer.spec.js +0 -18
- package/resources/bacstack/test/unit/service-read-property-multiple.spec.js +0 -131
- package/resources/bacstack/test/unit/service-read-property.spec.js +0 -541
- package/resources/bacstack/test/unit/service-read-range.spec.js +0 -97
- package/resources/bacstack/test/unit/service-reinitialize-device.spec.js +0 -27
- package/resources/bacstack/test/unit/service-subscribe-cov.spec.js +0 -32
- package/resources/bacstack/test/unit/service-subscribe-property.spec.js +0 -50
- package/resources/bacstack/test/unit/service-time-sync.spec.js +0 -18
- package/resources/bacstack/test/unit/service-who-has.spec.js +0 -33
- package/resources/bacstack/test/unit/service-who-is.spec.js +0 -17
- package/resources/bacstack/test/unit/service-write-property-multiple.spec.js +0 -143
- package/resources/bacstack/test/unit/service-write-property.spec.js +0 -198
- 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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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.
|
|
147
|
+
let points = this.pointList[slotProps.node.deviceId];
|
|
139
148
|
|
|
140
|
-
if (!this.pointsToRead[device.
|
|
141
|
-
this.pointsToRead[device.
|
|
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.
|
|
146
|
-
this.pointsToRead[device.
|
|
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.
|
|
172
|
-
delete this.pointsToRead[device.
|
|
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.
|
|
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.
|
|
210
|
-
this.pointsToRead[device.
|
|
218
|
+
if (!this.pointsToRead[device.deviceId]) {
|
|
219
|
+
this.pointsToRead[device.deviceId] = {};
|
|
211
220
|
}
|
|
212
221
|
|
|
213
|
-
let point = this.pointList[parentDevice.
|
|
214
|
-
this.pointsToRead[device.
|
|
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.
|
|
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.
|
|
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.
|
|
242
|
-
if (this.pointsToRead[device.
|
|
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
|
-
|
|
294
|
-
document.getElementById("node-input-
|
|
295
|
-
document.getElementById("node-input-
|
|
296
|
-
document.getElementById("node-input-
|
|
297
|
-
document.getElementById("node-input-
|
|
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
|
-
|
|
314
|
-
|
|
315
|
-
|
|
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
|
|
321
|
-
|
|
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
|
-
|
|
521
|
-
|
|
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
|
-
|
|
530
|
-
|
|
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
|
-
<
|
|
560
|
-
|
|
561
|
-
|
|
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:
|
|
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-
|
|
686
|
-
<i class="icon-tag"></i> <span data-i18n="bitpool-bacnet.label.
|
|
687
|
-
<
|
|
688
|
-
<
|
|
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-
|
|
694
|
-
<i class="icon-tag"></i> <span data-i18n="bitpool-bacnet.label.
|
|
695
|
-
<
|
|
696
|
-
<
|
|
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
|
-
|
|
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
|
-
<
|
|
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-
|
|
718
|
-
|
|
719
|
-
|
|
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
|
-
|
|
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.
|
|
22
|
-
this.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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.
|
|
32
|
-
propArr.push({ id: baEnum.
|
|
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.
|
|
47
|
-
propArr.push(
|
|
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.
|
|
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.
|
|
112
|
+
let points = this.pointList[slotProps.node.deviceId];
|
|
113
113
|
|
|
114
|
-
if (!this.pointsToWrite[device.
|
|
115
|
-
this.pointsToWrite[device.
|
|
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.
|
|
120
|
-
this.pointsToWrite[device.
|
|
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.
|
|
137
|
-
delete this.pointsToWrite[device.
|
|
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.
|
|
174
|
-
point.
|
|
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.
|
|
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.
|
|
212
|
+
point.deviceId = device.deviceId;
|
|
213
213
|
|
|
214
214
|
let foundIndex = this.pointsToWrite.findIndex(ele =>
|
|
215
|
-
ele.
|
|
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;
|