@bitpoolos/edge-bacnet 1.1.8 → 1.2.1
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 +331 -168
- package/bacnet_device.js +50 -16
- package/bacnet_gateway.html +119 -15
- package/bacnet_gateway.js +388 -395
- package/bacnet_read.html +32 -11
- package/bacnet_read.js +1 -1
- package/bacnet_server.js +16 -12
- package/common.js +26 -19
- package/examples/1-Discover-Read.json +1 -1
- package/examples/2-Discover-Write.json +1 -1
- package/examples/3-Discover-Read-Write.json +1 -1
- package/package.json +3 -3
- package/resources/{node-bacnet/LICENSE.md → node-bacstack-ts/LICENSE} +3 -4
- package/resources/node-bacstack-ts/README.md +75 -0
- package/resources/{node-bacnet → node-bacstack-ts/dist}/index.js +0 -2
- package/resources/node-bacstack-ts/dist/lib/apdu.js +193 -0
- package/resources/node-bacstack-ts/dist/lib/asn1.js +1660 -0
- package/resources/node-bacstack-ts/dist/lib/bvlc.js +47 -0
- package/resources/node-bacstack-ts/dist/lib/client.js +1454 -0
- package/resources/node-bacstack-ts/dist/lib/enum.js +2114 -0
- package/resources/node-bacstack-ts/dist/lib/npdu.js +112 -0
- package/resources/node-bacstack-ts/dist/lib/services/add-list-element.js +58 -0
- package/resources/node-bacstack-ts/dist/lib/services/alarm-acknowledge.js +93 -0
- package/resources/node-bacstack-ts/dist/lib/services/alarm-summary.js +42 -0
- package/resources/node-bacstack-ts/dist/lib/services/atomic-read-file.js +157 -0
- package/resources/node-bacstack-ts/dist/lib/services/atomic-write-file.js +136 -0
- package/resources/node-bacstack-ts/dist/lib/services/cov-notify.js +119 -0
- package/resources/node-bacstack-ts/dist/lib/services/create-object.js +104 -0
- package/resources/node-bacstack-ts/dist/lib/services/delete-object.js +21 -0
- package/resources/node-bacstack-ts/dist/lib/services/device-communication-control.js +46 -0
- package/resources/node-bacstack-ts/dist/lib/services/error.js +27 -0
- package/resources/node-bacstack-ts/dist/lib/services/event-information.js +100 -0
- package/resources/node-bacstack-ts/dist/lib/services/event-notify-data.js +219 -0
- package/resources/node-bacstack-ts/dist/lib/services/get-enrollment-summary.js +172 -0
- package/resources/node-bacstack-ts/dist/lib/services/get-event-information.js +135 -0
- package/resources/node-bacstack-ts/dist/lib/services/i-am-broadcast.js +59 -0
- package/resources/node-bacstack-ts/dist/lib/services/i-have-broadcast.js +34 -0
- package/resources/node-bacstack-ts/dist/lib/services/index.js +32 -0
- package/resources/node-bacstack-ts/dist/lib/services/life-safety-operation.js +40 -0
- package/resources/node-bacstack-ts/dist/lib/services/private-transfer.js +43 -0
- package/resources/node-bacstack-ts/dist/lib/services/read-property-multiple.js +44 -0
- package/resources/node-bacstack-ts/dist/lib/services/read-property.js +122 -0
- package/resources/node-bacstack-ts/dist/lib/services/read-range.js +201 -0
- package/resources/node-bacstack-ts/dist/lib/services/reinitialize-device.js +35 -0
- package/resources/node-bacstack-ts/dist/lib/services/subscribe-cov.js +55 -0
- package/resources/node-bacstack-ts/dist/lib/services/subscribe-property.js +93 -0
- package/resources/node-bacstack-ts/dist/lib/services/time-sync.js +31 -0
- package/resources/node-bacstack-ts/dist/lib/services/who-has.js +56 -0
- package/resources/node-bacstack-ts/dist/lib/services/who-is.js +45 -0
- package/resources/node-bacstack-ts/dist/lib/services/write-property-multiple.js +105 -0
- package/resources/node-bacstack-ts/dist/lib/services/write-property.js +90 -0
- package/resources/node-bacstack-ts/dist/lib/transport.js +49 -0
- package/resources/node-bacstack-ts/dist/lib/types.js +2 -0
- package/resources/node-bacstack-ts/package.json +94 -0
- package/resources/node-bacnet/CHANGELOG.md +0 -481
- package/resources/node-bacnet/README.md +0 -91
- package/resources/node-bacnet/docs/Client.html +0 -4422
- 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 +0 -7032
- package/resources/node-bacnet/docs/client.js.html +0 -1759
- package/resources/node-bacnet/docs/enum.js.html +0 -2530
- package/resources/node-bacnet/docs/global.html +0 -2068
- package/resources/node-bacnet/docs/images/mocha-logo.svg +0 -65
- package/resources/node-bacnet/docs/index.html +0 -283
- package/resources/node-bacnet/docs/scripts/collapse.js +0 -11
- package/resources/node-bacnet/docs/scripts/jquery-3.1.1.min.js +0 -4
- package/resources/node-bacnet/docs/scripts/linenumber.js +0 -26
- package/resources/node-bacnet/docs/scripts/prettify/Apache-License-2.0.txt +0 -202
- package/resources/node-bacnet/docs/scripts/prettify/lang-css.js +0 -2
- package/resources/node-bacnet/docs/scripts/prettify/prettify.js +0 -28
- package/resources/node-bacnet/docs/scripts/search.js +0 -47
- package/resources/node-bacnet/docs/services_i-am.js.html +0 -157
- package/resources/node-bacnet/docs/services_time-sync.js.html +0 -118
- package/resources/node-bacnet/docs/services_who-is.js.html +0 -138
- package/resources/node-bacnet/docs/styles/jsdoc.css +0 -683
- package/resources/node-bacnet/docs/styles/prettify.css +0 -82
- package/resources/node-bacnet/examples/discover-devices.js +0 -66
- package/resources/node-bacnet/examples/read-device.js +0 -510
- package/resources/node-bacnet/examples/subscribe-cov.js +0 -75
- package/resources/node-bacnet/lib/apdu.js +0 -209
- package/resources/node-bacnet/lib/asn1.js +0 -1733
- package/resources/node-bacnet/lib/bvlc.js +0 -90
- package/resources/node-bacnet/lib/client.js +0 -1695
- package/resources/node-bacnet/lib/enum.js +0 -2463
- package/resources/node-bacnet/lib/npdu.js +0 -123
- package/resources/node-bacnet/lib/services/add-list-element.js +0 -64
- package/resources/node-bacnet/lib/services/alarm-acknowledge.js +0 -90
- package/resources/node-bacnet/lib/services/alarm-summary.js +0 -42
- package/resources/node-bacnet/lib/services/atomic-read-file.js +0 -162
- package/resources/node-bacnet/lib/services/atomic-write-file.js +0 -138
- package/resources/node-bacnet/lib/services/cov-notify.js +0 -126
- package/resources/node-bacnet/lib/services/create-object.js +0 -106
- package/resources/node-bacnet/lib/services/delete-object.js +0 -23
- package/resources/node-bacnet/lib/services/device-communication-control.js +0 -48
- package/resources/node-bacnet/lib/services/error.js +0 -33
- package/resources/node-bacnet/lib/services/event-information.js +0 -99
- package/resources/node-bacnet/lib/services/event-notify-data.js +0 -229
- package/resources/node-bacnet/lib/services/get-enrollment-summary.js +0 -178
- package/resources/node-bacnet/lib/services/get-event-information.js +0 -144
- package/resources/node-bacnet/lib/services/i-am.js +0 -90
- package/resources/node-bacnet/lib/services/i-have.js +0 -34
- package/resources/node-bacnet/lib/services/index.js +0 -34
- package/resources/node-bacnet/lib/services/life-safety-operation.js +0 -40
- package/resources/node-bacnet/lib/services/private-transfer.js +0 -43
- package/resources/node-bacnet/lib/services/read-property-multiple.js +0 -50
- package/resources/node-bacnet/lib/services/read-property.js +0 -130
- package/resources/node-bacnet/lib/services/read-range.js +0 -201
- package/resources/node-bacnet/lib/services/register-foreign-device.js +0 -18
- package/resources/node-bacnet/lib/services/reinitialize-device.js +0 -37
- package/resources/node-bacnet/lib/services/subscribe-cov.js +0 -57
- package/resources/node-bacnet/lib/services/subscribe-property.js +0 -97
- package/resources/node-bacnet/lib/services/time-sync.js +0 -51
- package/resources/node-bacnet/lib/services/who-has.js +0 -54
- package/resources/node-bacnet/lib/services/who-is.js +0 -71
- package/resources/node-bacnet/lib/services/write-property-multiple.js +0 -117
- package/resources/node-bacnet/lib/services/write-property.js +0 -94
- package/resources/node-bacnet/lib/transport.js +0 -82
- package/resources/node-bacnet/package.json +0 -92
package/bacnet_read.html
CHANGED
|
@@ -106,8 +106,17 @@
|
|
|
106
106
|
app.pollFrequency = parseInt(result.pollFrequency);
|
|
107
107
|
app.deviceCount = result.deviceList.length;
|
|
108
108
|
//progress bar percentage
|
|
109
|
-
|
|
109
|
+
let progressVal = parseInt((result.renderList.length / result.deviceList.length) * 100);
|
|
110
|
+
if(typeof progressVal == "number" && !isNaN(progressVal)) {
|
|
111
|
+
app.progressBarValue = progressVal;
|
|
112
|
+
} else {
|
|
113
|
+
app.progressBarValue = 0;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
app.$forceUpdate();
|
|
110
117
|
});
|
|
118
|
+
|
|
119
|
+
app.$forceUpdate();
|
|
111
120
|
},
|
|
112
121
|
rebuildDataModel() {
|
|
113
122
|
let app = this;
|
|
@@ -116,15 +125,14 @@
|
|
|
116
125
|
app.progressBarValue = 0;
|
|
117
126
|
}
|
|
118
127
|
});
|
|
119
|
-
|
|
120
|
-
|
|
128
|
+
app.$forceUpdate();
|
|
121
129
|
},
|
|
122
130
|
addAllDevices() {
|
|
123
131
|
let app = this;
|
|
124
132
|
app.devices.forEach(function (device) {
|
|
125
133
|
app.addAllClicked({"node": device});
|
|
126
134
|
});
|
|
127
|
-
|
|
135
|
+
app.$forceUpdate();
|
|
128
136
|
},
|
|
129
137
|
addAllClicked(slotProps) {
|
|
130
138
|
//update UI
|
|
@@ -169,7 +177,7 @@
|
|
|
169
177
|
node.hiddenDeployToggle = !node.prevHiddenToggleState;
|
|
170
178
|
},
|
|
171
179
|
removeAllDevices() {
|
|
172
|
-
let app = this;
|
|
180
|
+
let app = this;
|
|
173
181
|
|
|
174
182
|
let clone = JSON.parse(JSON.stringify(app.readDevices));
|
|
175
183
|
|
|
@@ -214,6 +222,7 @@
|
|
|
214
222
|
console.log("removeAllClicked error: ", e);
|
|
215
223
|
}
|
|
216
224
|
|
|
225
|
+
app.$forceUpdate();
|
|
217
226
|
},
|
|
218
227
|
addPointClicked(slotProps) {
|
|
219
228
|
let app = this;
|
|
@@ -258,6 +267,8 @@
|
|
|
258
267
|
|
|
259
268
|
//force a deploy state
|
|
260
269
|
node.hiddenDeployToggle = !node.prevHiddenToggleState;
|
|
270
|
+
|
|
271
|
+
app.$forceUpdate();
|
|
261
272
|
},
|
|
262
273
|
removePointClicked(slotProps) {
|
|
263
274
|
let app = this;
|
|
@@ -291,6 +302,8 @@
|
|
|
291
302
|
|
|
292
303
|
//force a deploy state
|
|
293
304
|
node.hiddenDeployToggle = !node.prevHiddenToggleState;
|
|
305
|
+
|
|
306
|
+
app.$forceUpdate();
|
|
294
307
|
},
|
|
295
308
|
getDeviceAddress(addr) {
|
|
296
309
|
switch(typeof addr) {
|
|
@@ -420,16 +433,24 @@
|
|
|
420
433
|
},
|
|
421
434
|
oneditsave: function () {
|
|
422
435
|
let node = this;
|
|
423
|
-
if (node.vm.$data.devices
|
|
424
|
-
if (node.vm.$data.readDevices
|
|
425
|
-
if (node.vm.$data.pointsToRead
|
|
436
|
+
if (node.vm.$data.devices) node.devices = node.vm.$data.devices;
|
|
437
|
+
if (node.vm.$data.readDevices) node.readDevices = node.vm.$data.readDevices;
|
|
438
|
+
if (node.vm.$data.pointsToRead) node.pointsToRead = node.vm.$data.pointsToRead;
|
|
439
|
+
|
|
440
|
+
// if (node.vm.$data.devices && node.vm.$data.devices.length > 0) node.devices = node.vm.$data.devices;
|
|
441
|
+
// if (node.vm.$data.readDevices && node.vm.$data.readDevices.length > 0) node.readDevices = node.vm.$data.readDevices;
|
|
442
|
+
// if (node.vm.$data.pointsToRead && node.vm.$data.pointsToRead.length > 0) node.pointsToRead = node.vm.$data.pointsToRead;
|
|
426
443
|
|
|
427
444
|
},
|
|
428
445
|
oneditcancel: function () {
|
|
429
446
|
let node = this;
|
|
430
|
-
if (node.vm.$data.devices
|
|
431
|
-
if (node.vm.$data.readDevices
|
|
432
|
-
if (node.vm.$data.pointsToRead
|
|
447
|
+
if (node.vm.$data.devices) node.devices = node.vm.$data.devices;
|
|
448
|
+
if (node.vm.$data.readDevices) node.readDevices = node.vm.$data.readDevices;
|
|
449
|
+
if (node.vm.$data.pointsToRead) node.pointsToRead = node.vm.$data.pointsToRead;
|
|
450
|
+
|
|
451
|
+
// if (node.vm.$data.devices && node.vm.$data.devices.length > 0) node.devices = node.vm.$data.devices;
|
|
452
|
+
// if (node.vm.$data.readDevices && node.vm.$data.readDevices.length > 0) node.readDevices = node.vm.$data.readDevices;
|
|
453
|
+
// if (node.vm.$data.pointsToRead && node.vm.$data.pointsToRead.length > 0) node.pointsToRead = node.vm.$data.pointsToRead;
|
|
433
454
|
}
|
|
434
455
|
});
|
|
435
456
|
|
package/bacnet_read.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
module.exports = function (RED) {
|
|
8
8
|
const { ReadCommandConfig } = require('./common');
|
|
9
|
-
const baEnum = require('./resources/node-
|
|
9
|
+
const baEnum = require('./resources/node-bacstack-ts/dist/index.js').enum;
|
|
10
10
|
|
|
11
11
|
function BitpoolBacnetReadDevice (config) {
|
|
12
12
|
RED.nodes.createNode(this, config);
|
package/bacnet_server.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const bacnet = require('./resources/node-
|
|
1
|
+
const bacnet = require('./resources/node-bacstack-ts/dist/index.js');
|
|
2
2
|
const pjson = require('./package.json');
|
|
3
3
|
const baEnum = bacnet.enum;
|
|
4
4
|
const {Store_Config_Server, Read_Config_Sync_Server } = require('./common');
|
|
@@ -11,6 +11,7 @@ class BacnetServer {
|
|
|
11
11
|
that.objectIdNumber = 1;
|
|
12
12
|
that.nodeRedVersion = nodeRedVersion;
|
|
13
13
|
that.deviceId = deviceId;
|
|
14
|
+
that.vendorId = 1401;
|
|
14
15
|
that.objectList = [
|
|
15
16
|
{value: {type: baEnum.ObjectType.DEVICE, instance: that.deviceId}, type: 12}
|
|
16
17
|
];
|
|
@@ -23,7 +24,7 @@ class BacnetServer {
|
|
|
23
24
|
[baEnum.PropertyIdentifier.DESCRIPTION]: [{value: 'Bitpool Edge BACnet gateway', type: 7}],
|
|
24
25
|
[baEnum.PropertyIdentifier.SYSTEM_STATUS]: [{value: 0, type: 9}],
|
|
25
26
|
[baEnum.PropertyIdentifier.VENDOR_NAME]: [{value: "Bitpool", type: 7}],
|
|
26
|
-
[baEnum.PropertyIdentifier.VENDOR_IDENTIFIER]: [{value:
|
|
27
|
+
[baEnum.PropertyIdentifier.VENDOR_IDENTIFIER]: [{value: that.vendorId, type: 2}],
|
|
27
28
|
[baEnum.PropertyIdentifier.MODEL_NAME]: [{value: "bitpool-edge", type: 7}],
|
|
28
29
|
[baEnum.PropertyIdentifier.FIRMWARE_REVISION]: [{value: "Node-Red " + that.nodeRedVersion, type: 7}],
|
|
29
30
|
[baEnum.PropertyIdentifier.PROTOCOL_REVISION]: [{value: 19, type: 2}],
|
|
@@ -80,21 +81,20 @@ class BacnetServer {
|
|
|
80
81
|
}
|
|
81
82
|
|
|
82
83
|
that.bacnetClient.client.on('whoIs', (device) => {
|
|
83
|
-
that.bacnetClient.client.iAmResponse(that.
|
|
84
|
+
that.bacnetClient.client.iAmResponse(that.deviceId, baEnum.Segmentation.SEGMENTED_BOTH, that.vendorId);
|
|
84
85
|
that.lastWhoIsRecived = Date.now();
|
|
85
86
|
});
|
|
86
87
|
|
|
87
88
|
that.bacnetClient.client.on('readPropertyMultiple', (data) => {
|
|
88
89
|
|
|
89
|
-
let senderAddress = data.
|
|
90
|
-
let requestProps = data.
|
|
90
|
+
let senderAddress = data.address;
|
|
91
|
+
let requestProps = data.request.properties;
|
|
91
92
|
let responseObject = [];
|
|
92
93
|
|
|
93
94
|
try {
|
|
94
95
|
if(requestProps) {
|
|
95
96
|
|
|
96
97
|
for(let i = 0; i < requestProps.length; i++) {
|
|
97
|
-
|
|
98
98
|
let prop = requestProps[i].properties[0].id;
|
|
99
99
|
let type = requestProps[i].objectId.type;
|
|
100
100
|
let instance = requestProps[i].objectId.instance;
|
|
@@ -131,20 +131,25 @@ class BacnetServer {
|
|
|
131
131
|
baEnum.ErrorCode.UNKNOWN_PROPERTY
|
|
132
132
|
);
|
|
133
133
|
}
|
|
134
|
+
|
|
134
135
|
});
|
|
135
136
|
|
|
136
137
|
that.bacnetClient.client.on('readProperty', (data) => {
|
|
138
|
+
|
|
137
139
|
try {
|
|
138
|
-
|
|
139
|
-
let
|
|
140
|
-
let
|
|
140
|
+
|
|
141
|
+
let objectId = data.request.objectId.type;
|
|
142
|
+
let objectInstance = data.request.objectId.instance;
|
|
143
|
+
let propId = data.request.property.id.toString();
|
|
144
|
+
|
|
141
145
|
let responseObj = that.getObject(objectId, propId, objectInstance);
|
|
142
146
|
|
|
143
147
|
if(propId == baEnum.PropertyIdentifier.OBJECT_LIST && ((Date.now() - that.lastWhoIsRecived) / 1000) < 0.7) {
|
|
144
148
|
responseObj = [{value:that.objectList.length, type: 2}];
|
|
145
149
|
}
|
|
146
150
|
if(responseObj !== null && responseObj !== undefined && typeof responseObj !== "undefined") {
|
|
147
|
-
|
|
151
|
+
|
|
152
|
+
that.bacnetClient.client.readPropertyResponse(data.address, data.invokeId, objectId, data.request.property, responseObj);
|
|
148
153
|
} else {
|
|
149
154
|
that.bacnetClient.client.errorResponse(
|
|
150
155
|
data.address,
|
|
@@ -161,7 +166,7 @@ class BacnetServer {
|
|
|
161
166
|
});
|
|
162
167
|
|
|
163
168
|
//do initial iAm broadcast when BACnet server starts
|
|
164
|
-
that.bacnetClient.client.iAmResponse(that.
|
|
169
|
+
that.bacnetClient.client.iAmResponse(that.deviceId, baEnum.Segmentation.SEGMENTED_BOTH, that.vendorId);
|
|
165
170
|
}
|
|
166
171
|
|
|
167
172
|
setDeviceName(nodeName) {
|
|
@@ -375,7 +380,6 @@ class BacnetServer {
|
|
|
375
380
|
return objectId;
|
|
376
381
|
}
|
|
377
382
|
|
|
378
|
-
|
|
379
383
|
}
|
|
380
384
|
|
|
381
385
|
module.exports = { BacnetServer };
|
package/common.js
CHANGED
|
@@ -6,7 +6,7 @@ const { createLogger, format, transports } = require('winston');
|
|
|
6
6
|
const { randomUUID } = require('crypto');
|
|
7
7
|
const os = require('os');
|
|
8
8
|
const { exec } = require("child_process");
|
|
9
|
-
const baEnum = require('./resources/node-
|
|
9
|
+
const baEnum = require('./resources/node-bacstack-ts/dist/index.js').enum;
|
|
10
10
|
const fs = require('fs');
|
|
11
11
|
|
|
12
12
|
const logger = createLogger({
|
|
@@ -80,7 +80,8 @@ class BacnetClientConfig {
|
|
|
80
80
|
manual_instance_range_enabled,
|
|
81
81
|
manual_instance_range_start,
|
|
82
82
|
manual_instance_range_end,
|
|
83
|
-
|
|
83
|
+
device_read_schedule,
|
|
84
|
+
retries
|
|
84
85
|
) {
|
|
85
86
|
this.apduTimeout = apduTimeout;
|
|
86
87
|
this.localIpAdrress = localIpAdrress;
|
|
@@ -97,7 +98,8 @@ class BacnetClientConfig {
|
|
|
97
98
|
this.manual_instance_range_enabled = manual_instance_range_enabled;
|
|
98
99
|
this.manual_instance_range_start = manual_instance_range_start;
|
|
99
100
|
this.manual_instance_range_end = manual_instance_range_end;
|
|
100
|
-
this.
|
|
101
|
+
this.device_read_schedule = device_read_schedule;
|
|
102
|
+
this.retries = retries;
|
|
101
103
|
}
|
|
102
104
|
};
|
|
103
105
|
|
|
@@ -210,11 +212,15 @@ const doNodeRedRestart = function() {
|
|
|
210
212
|
//
|
|
211
213
|
// ================================================================================
|
|
212
214
|
async function Store_Config(data) {
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
215
|
+
try {
|
|
216
|
+
await fs.writeFile("edge-bacnet-datastore.cfg", data, (err) => {
|
|
217
|
+
if (err) {
|
|
218
|
+
console.log("Store_Config writeFile error: ", err);
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
} catch(e){
|
|
222
|
+
//do nothing
|
|
223
|
+
}
|
|
218
224
|
};
|
|
219
225
|
|
|
220
226
|
// READ CONFIG SYNC FUNCTION ======================================================
|
|
@@ -223,9 +229,9 @@ async function Store_Config(data) {
|
|
|
223
229
|
function Read_Config_Sync() {
|
|
224
230
|
var data = "{}";
|
|
225
231
|
try {
|
|
226
|
-
data = fs.readFileSync("edge-bacnet-datastore.cfg", {encoding:'utf8', flag:'r'});
|
|
232
|
+
data = fs.readFileSync("edge-bacnet-datastore.cfg", { encoding: 'utf8', flag: 'r' });
|
|
227
233
|
}
|
|
228
|
-
catch(err) {
|
|
234
|
+
catch (err) {
|
|
229
235
|
console.log("Read_Config_Sync error:", err);
|
|
230
236
|
data = '{}';
|
|
231
237
|
Store_Config(data);
|
|
@@ -237,11 +243,15 @@ function Read_Config_Sync() {
|
|
|
237
243
|
//
|
|
238
244
|
// ================================================================================
|
|
239
245
|
async function Store_Config_Server(data) {
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
246
|
+
try {
|
|
247
|
+
await fs.writeFile("edge-bacnet-server-datastore.cfg", data, (err) => {
|
|
248
|
+
if (err) {
|
|
249
|
+
console.log("Store_Config_Server writeFile error: ", err);
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
catch (err) {
|
|
254
|
+
}
|
|
245
255
|
};
|
|
246
256
|
|
|
247
257
|
// READ CONFIG SYNC FUNCTION - BACNET SERVER ======================================
|
|
@@ -262,13 +272,10 @@ function Read_Config_Sync_Server() {
|
|
|
262
272
|
};
|
|
263
273
|
|
|
264
274
|
module.exports = {
|
|
265
|
-
DeviceObjectId,
|
|
266
|
-
DeviceObject,
|
|
267
275
|
BacnetConfig,
|
|
268
276
|
BacnetClientConfig,
|
|
269
277
|
ReadCommandConfig,
|
|
270
|
-
WriteCommandConfig,
|
|
271
|
-
logger,
|
|
278
|
+
WriteCommandConfig,
|
|
272
279
|
getUnit,
|
|
273
280
|
generateId,
|
|
274
281
|
getIpAddress,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
[{"id":"
|
|
1
|
+
[{"id":"a19aaf3c40f060de","type":"Bacnet-Gateway","z":"1bc98a48ab9b3af5","name":"","local_device_address":"","apduTimeout":6000,"roundDecimal":2,"local_device_port":47808,"apduSize":"5","maxSegments":"0x50","retries":"5","broadCastAddr":"255.255.255.255","toLogIam":true,"discover_polling_schedule":"120","discover_polling_schedule_value":"2","discover_polling_schedule_options":"Minutes","device_id_range_enabled":false,"device_id_range_start":"","device_id_range_end":"","deviceId":"817001","manual_instance_range_enabled":false,"manual_instance_range_start":"","manual_instance_range_end":"","logErrorToConsole":false,"serverEnabled":false,"device_read_schedule":"60","device_read_schedule_value":"1","device_read_schedule_options":"Minutes","x":660,"y":420,"wires":[["9d8b6ea1f9d11977"]]},{"id":"3e5f5a6efe7bf8cd","type":"Bitpool-Inject","z":"1bc98a48ab9b3af5","name":"Discover","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","doPoll":false,"doDiscover":true,"x":480,"y":420,"wires":[["a19aaf3c40f060de"]]},{"id":"1774359e5a636b58","type":"Bitpool-Inject","z":"1bc98a48ab9b3af5","name":"Poll","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","doPoll":true,"doDiscover":false,"x":310,"y":360,"wires":[["bfec7e0b535bef97"]]},{"id":"9d8b6ea1f9d11977","type":"debug","z":"1bc98a48ab9b3af5","name":"debug 1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":840,"y":420,"wires":[]},{"id":"bfec7e0b535bef97","type":"Bacnet-Discovery","z":"1bc98a48ab9b3af5","name":"","events":true,"json":false,"mqtt":true,"hiddenDeployToggle":false,"prevHiddenToggleState":false,"roundDecimal":2,"pointsToRead":{},"readDevices":[],"object_property_simplePayload":true,"object_property_fullObject":false,"x":490,"y":360,"wires":[["a19aaf3c40f060de"]]}]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
[{"id":"e478e80571442399","type":"Bacnet-Gateway","z":"
|
|
1
|
+
[{"id":"e478e80571442399","type":"Bacnet-Gateway","z":"1bc98a48ab9b3af5","name":"","local_device_address":"","apduTimeout":6000,"roundDecimal":2,"local_device_port":47808,"apduSize":"5","maxSegments":"0x50","retries":"5","broadCastAddr":"255.255.255.255","toLogIam":true,"discover_polling_schedule":"60","discover_polling_schedule_value":"1","discover_polling_schedule_options":"Minutes","device_id_range_enabled":false,"device_id_range_start":"","device_id_range_end":"","deviceId":"817001","manual_instance_range_enabled":false,"manual_instance_range_start":"","manual_instance_range_end":"","logErrorToConsole":false,"serverEnabled":false,"device_read_schedule":"60","device_read_schedule_value":"1","device_read_schedule_options":"Minutes","x":700,"y":320,"wires":[["0313b7ee1cfa6b42"]]},{"id":"c2e012301c4a6af4","type":"Bitpool-Inject","z":"1bc98a48ab9b3af5","name":"Discover","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","doPoll":false,"doDiscover":true,"x":520,"y":320,"wires":[["e478e80571442399"]]},{"id":"8172620e7be7b505","type":"Bitpool-Inject","z":"1bc98a48ab9b3af5","name":"Poll","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"1","payloadType":"num","doPoll":true,"doDiscover":false,"x":370,"y":400,"wires":[["b3293195b7c5bd9d"]]},{"id":"0313b7ee1cfa6b42","type":"debug","z":"1bc98a48ab9b3af5","name":"debug 1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":880,"y":320,"wires":[]},{"id":"b3293195b7c5bd9d","type":"Bacnet-Write","z":"1bc98a48ab9b3af5","name":"","applicationTag":"4","priority":"16","pointsToWrite":[],"writeDevices":[],"hiddenDeployToggle":false,"prevHiddenToggleState":false,"x":530,"y":400,"wires":[["e478e80571442399"]]}]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
[{"id":"e6ef82c5497d2d12","type":"Bacnet-Gateway","z":"
|
|
1
|
+
[{"id":"e6ef82c5497d2d12","type":"Bacnet-Gateway","z":"1bc98a48ab9b3af5","name":"","local_device_address":"","apduTimeout":6000,"roundDecimal":2,"local_device_port":47808,"apduSize":"5","maxSegments":"0x50","retries":"5","broadCastAddr":"255.255.255.255","toLogIam":true,"discover_polling_schedule":"60","discover_polling_schedule_value":"1","discover_polling_schedule_options":"Minutes","device_id_range_enabled":false,"device_id_range_start":"","device_id_range_end":"","deviceId":"817001","manual_instance_range_enabled":false,"manual_instance_range_start":"","manual_instance_range_end":"","logErrorToConsole":false,"serverEnabled":false,"device_read_schedule":"60","device_read_schedule_value":"1","device_read_schedule_options":"Minutes","x":740,"y":340,"wires":[["13c868a66ecd17df"]]},{"id":"4df39409775f724e","type":"Bitpool-Inject","z":"1bc98a48ab9b3af5","name":"Discover","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","doPoll":false,"doDiscover":true,"x":560,"y":340,"wires":[["e6ef82c5497d2d12"]]},{"id":"67e4f714757a028e","type":"Bitpool-Inject","z":"1bc98a48ab9b3af5","name":"Poll","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"1","payloadType":"num","doPoll":true,"doDiscover":false,"x":410,"y":420,"wires":[["b8931cb1a1c69ffb"]]},{"id":"13c868a66ecd17df","type":"debug","z":"1bc98a48ab9b3af5","name":"debug 1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":920,"y":340,"wires":[]},{"id":"b8931cb1a1c69ffb","type":"Bacnet-Write","z":"1bc98a48ab9b3af5","name":"","applicationTag":"4","priority":"16","pointsToWrite":[],"writeDevices":[],"hiddenDeployToggle":false,"prevHiddenToggleState":false,"x":570,"y":420,"wires":[["e6ef82c5497d2d12"]]},{"id":"a95e261a4cc2662b","type":"Bitpool-Inject","z":"1bc98a48ab9b3af5","name":"Poll","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","doPoll":true,"doDiscover":false,"x":410,"y":280,"wires":[["08df19608ade8576"]]},{"id":"08df19608ade8576","type":"Bacnet-Discovery","z":"1bc98a48ab9b3af5","name":"","events":true,"json":false,"mqtt":true,"hiddenDeployToggle":false,"prevHiddenToggleState":false,"roundDecimal":2,"pointsToRead":{},"readDevices":[],"object_property_simplePayload":true,"object_property_fullObject":false,"x":570,"y":280,"wires":[["e6ef82c5497d2d12"]]}]
|
package/package.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bitpoolos/edge-bacnet",
|
|
3
|
-
"version": "1.1
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"description": "A bacnet gateway for node-red",
|
|
5
5
|
"dependencies": {
|
|
6
|
+
"@plus4nodered/ts-node-bacnet": "^1.0.0-beta.2",
|
|
6
7
|
"async-mutex": "^0.4.0",
|
|
7
8
|
"cronosjs": "^1.7.1",
|
|
8
9
|
"debug": "^4.1.1",
|
|
9
10
|
"iconv-lite": "^0.5.1",
|
|
10
|
-
"underscore": "^1.10.2",
|
|
11
|
-
"node-bacnet": "^0.2.4",
|
|
12
11
|
"toad-scheduler": "^1.6.0",
|
|
12
|
+
"underscore": "^1.10.2",
|
|
13
13
|
"winston": "^3.2.1"
|
|
14
14
|
},
|
|
15
15
|
"node-red": {
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c)
|
|
4
|
-
|
|
5
|
-
Copyright (c) 2017-2019 Fabio Huser (fh1ch)
|
|
3
|
+
Copyright (c) 2022-present PLUS for Node-RED <team@plus4nodered.com>
|
|
4
|
+
origin Copyright (c) 2017-2021 Fabio Huser <fabio@fh1.ch>
|
|
6
5
|
|
|
7
6
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
7
|
of this software and associated documentation files (the "Software"), to deal
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# TS Node BACstack
|
|
2
|
+
|
|
3
|
+
A BACnet® protocol stack written in pure TypeScript from contributors and maintained by [PLUS for Node-RED](http://plus4nodered.com/).
|
|
4
|
+
BACnet® is a protocol to interact with building automation devices defined by ASHRAE.
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
Run the following command in your Node-RED user directory - typically `~/.node-red`
|
|
10
|
+
|
|
11
|
+
npm install ts-node-bacnet
|
|
12
|
+
|
|
13
|
+
try these options on npm install to build from source if you have problems to install
|
|
14
|
+
|
|
15
|
+
--unsafe-perm --build-from-source
|
|
16
|
+
|
|
17
|
+
### Features
|
|
18
|
+
|
|
19
|
+
The BACnet standard defines a wide variety of services as part of it's
|
|
20
|
+
specification. While Node BACstack tries to be as complete as possible,
|
|
21
|
+
following services are already supported at this point in time:
|
|
22
|
+
|
|
23
|
+
| Service | Execute | Handle |
|
|
24
|
+
|--------------------------------|:---------------------------------------------------------------------------------:|:-----------------------------------------------------------------------------:|
|
|
25
|
+
| Who Is | [yes](http://books.plus4nodered.com/ts-node-bacnet/whoIs) | [yes](http://books.plus4nodered.com/ts-node-bacnet/event:whoIs) |
|
|
26
|
+
| I Am | yes¹ | [yes](http://books.plus4nodered.com/ts-node-bacnet/event:iAm) |
|
|
27
|
+
| Who Has | yes¹ | yes¹ |
|
|
28
|
+
| I Have | yes¹ | yes¹ |
|
|
29
|
+
| Time Sync | [yes](http://books.plus4nodered.com/ts-node-bacnet/timeSync) | [yes](http://books.plus4nodered.com/ts-node-bacnet/event:timeSync) |
|
|
30
|
+
| UTC Time Sync | [yes](http://books.plus4nodered.com/ts-node-bacnet/timeSyncUTC) | [yes](http://books.plus4nodered.com/ts-node-bacnet/event:timeSyncUTC) |
|
|
31
|
+
| Read Property | [yes](http://books.plus4nodered.com/ts-node-bacnet/readProperty) | yes¹ |
|
|
32
|
+
| Read Property Multiple | [yes](http://books.plus4nodered.com/ts-node-bacnet/readPropertyMultiple) | yes¹ |
|
|
33
|
+
| Read Range | [yes](http://books.plus4nodered.com/ts-node-bacnet/readRange) | yes¹ |
|
|
34
|
+
| Write Property | [yes](http://books.plus4nodered.com/ts-node-bacnet/writeProperty) | yes¹ |
|
|
35
|
+
| Write Property Multiple | [yes](http://books.plus4nodered.com/ts-node-bacnet/writePropertyMultiple) | yes¹ |
|
|
36
|
+
| Add List Element | yes¹ | yes¹ |
|
|
37
|
+
| Remove List Element | yes¹ | yes¹ |
|
|
38
|
+
| Create Object | yes¹ | yes¹ |
|
|
39
|
+
| Delete Object | [yes](http://books.plus4nodered.com/ts-node-bacnet/deleteObject) | yes¹ |
|
|
40
|
+
| Subscribe COV | [yes](http://books.plus4nodered.com/ts-node-bacnet/subscribeCOV) | yes¹ |
|
|
41
|
+
| Subscribe Property | [yes](http://books.plus4nodered.com/ts-node-bacnet/subscribeProperty) | yes¹ |
|
|
42
|
+
| Atomic Read File | [yes](http://books.plus4nodered.com/ts-node-bacnet/readFile) | yes¹ |
|
|
43
|
+
| Atomic Write File | [yes](http://books.plus4nodered.com/ts-node-bacnet/writeFile) | yes¹ |
|
|
44
|
+
| Reinitialize Device | [yes](http://books.plus4nodered.com/ts-node-bacnet/reinitializeDevice) | yes¹ |
|
|
45
|
+
| Device Communication Control | [yes](http://books.plus4nodered.com/ts-node-bacnet/deviceCommunicationControl) | yes¹ |
|
|
46
|
+
| Get Alarm Summary² | [yes](http://books.plus4nodered.com/ts-node-bacnet/getAlarmSummary) | yes¹ |
|
|
47
|
+
| Get Event Information | [yes](http://books.plus4nodered.com/ts-node-bacnet/getEventInformation) | yes¹ |
|
|
48
|
+
| Get Enrollment Summary² | [yes](http://books.plus4nodered.com/ts-node-bacnet/getEnrollmentSummary) | yes¹ |
|
|
49
|
+
| Acknowledge Alarm | yes¹ | yes¹ |
|
|
50
|
+
| Confirmed Event Notification | yes¹ | yes¹ |
|
|
51
|
+
| Unconfirmed Event Notification | yes¹ | yes¹ |
|
|
52
|
+
| Unconfirmed Private Transfer | [yes](http://books.plus4nodered.com/ts-node-bacnet/unconfirmedPrivateTransfer) | yes¹ |
|
|
53
|
+
| Confirmed Private Transfer | [yes](http://books.plus4nodered.com/ts-node-bacnet/confirmedPrivateTransfer) | yes¹ |
|
|
54
|
+
|
|
55
|
+
¹ Support implemented as Beta (untested, undocumented, breaking interface)
|
|
56
|
+
² Deprecated BACnet® function, available for backwards compatibility
|
|
57
|
+
|
|
58
|
+
## Contribution
|
|
59
|
+
|
|
60
|
+
Special thanks to Fabio Huser for the [fundamental work](https://github.com/fh1ch/node-bacstack).
|
|
61
|
+
**Yes, sure!** Please help us to make it even better and become a community member of [PLUS for Node-RED](http://plus4nodered.com/)!
|
|
62
|
+
|
|
63
|
+
#### Happy coding!
|
|
64
|
+
|
|
65
|
+
## License
|
|
66
|
+
|
|
67
|
+
MIT
|
|
68
|
+
Copyright (c) 2022-present [PLUS for Node-RED](http://plus4nodered.com/)
|
|
69
|
+
origin Copyright (c) 2017-2021 Fabio Huser <fabio@fh1.ch>
|
|
70
|
+
|
|
71
|
+
## Note
|
|
72
|
+
|
|
73
|
+
This is not an official product of the BACnet Advocacy Group.
|
|
74
|
+
BACnet® is a registered trademark of American Society of Heating, Refrigerating and Air-Conditioning Engineers (ASHRAE).
|
|
75
|
+
We're buying the specifications of ASHARE to programm for this library.
|