@bitpoolos/edge-bacnet 1.2.6 → 1.2.8
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 +1852 -1373
- package/bacnet_device.js +52 -0
- package/bacnet_gateway.html +38 -3
- package/bacnet_gateway.js +95 -37
- package/bacnet_read.html +53 -33
- package/bacnet_read.js +8 -2
- package/bacnet_write.html +733 -668
- package/bacnet_write.js +1 -1
- package/common.js +17 -7
- package/package.json +1 -1
- package/resources/icons/icon-read.svg +19 -0
- package/resources/icons/icon-write.svg +16 -0
- package/resources/node-bacstack-ts/dist/lib/client.js +3 -3
- package/resources/style.css +11 -0
package/bacnet_write.js
CHANGED
|
@@ -15,7 +15,7 @@ module.exports = function (RED) {
|
|
|
15
15
|
|
|
16
16
|
node.on('input', function(msg) {
|
|
17
17
|
|
|
18
|
-
let value = msg.payload == "null" ? null :
|
|
18
|
+
let value = msg.payload == "null" ? null : msg.payload;
|
|
19
19
|
let priority = node.priority == "null" ? null : parseInt(node.priority);
|
|
20
20
|
|
|
21
21
|
let output = {
|
package/common.js
CHANGED
|
@@ -91,7 +91,9 @@ class BacnetClientConfig {
|
|
|
91
91
|
manual_instance_range_start,
|
|
92
92
|
manual_instance_range_end,
|
|
93
93
|
device_read_schedule,
|
|
94
|
-
retries
|
|
94
|
+
retries,
|
|
95
|
+
cacheFileEnabled,
|
|
96
|
+
sanitise_device_schedule
|
|
95
97
|
) {
|
|
96
98
|
this.apduTimeout = apduTimeout;
|
|
97
99
|
this.localIpAdrress = localIpAdrress;
|
|
@@ -107,6 +109,8 @@ class BacnetClientConfig {
|
|
|
107
109
|
this.manual_instance_range_end = manual_instance_range_end;
|
|
108
110
|
this.device_read_schedule = device_read_schedule;
|
|
109
111
|
this.retries = retries;
|
|
112
|
+
this.cacheFileEnabled = cacheFileEnabled;
|
|
113
|
+
this.sanitise_device_schedule = sanitise_device_schedule;
|
|
110
114
|
}
|
|
111
115
|
}
|
|
112
116
|
|
|
@@ -222,7 +226,7 @@ const doNodeRedRestart = function () {
|
|
|
222
226
|
// ================================================================================
|
|
223
227
|
async function Store_Config(data) {
|
|
224
228
|
try {
|
|
225
|
-
await fs.writeFile("edge-bacnet-datastore.cfg", data, (err) => {
|
|
229
|
+
await fs.writeFile("edge-bacnet-datastore.cfg", data, { encoding: "utf8", flag: "w" }, (err) => {
|
|
226
230
|
if (err) {
|
|
227
231
|
console.log("Store_Config writeFile error: ", err);
|
|
228
232
|
}
|
|
@@ -240,7 +244,7 @@ function Read_Config_Sync() {
|
|
|
240
244
|
try {
|
|
241
245
|
data = fs.readFileSync("edge-bacnet-datastore.cfg", { encoding: "utf8", flag: "r" });
|
|
242
246
|
} catch (err) {
|
|
243
|
-
|
|
247
|
+
console.log("Read_Config_Sync error:", err);
|
|
244
248
|
data = "{}";
|
|
245
249
|
Store_Config(data);
|
|
246
250
|
}
|
|
@@ -268,14 +272,19 @@ function Read_Config_Sync_Server() {
|
|
|
268
272
|
try {
|
|
269
273
|
data = fs.readFileSync("edge-bacnet-server-datastore.cfg", { encoding: "utf8", flag: "r" });
|
|
270
274
|
} catch (err) {
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
+
if (err.errno == -4058) {
|
|
276
|
+
console.log("Edge-BACnet Server: No save file found, creating new file");
|
|
277
|
+
data = "{}";
|
|
278
|
+
Store_Config_Server(data);
|
|
279
|
+
}
|
|
275
280
|
}
|
|
276
281
|
return data;
|
|
277
282
|
}
|
|
278
283
|
|
|
284
|
+
function isNumber(value) {
|
|
285
|
+
return value != null && typeof value === "number" && !isNaN(value);
|
|
286
|
+
}
|
|
287
|
+
|
|
279
288
|
module.exports = {
|
|
280
289
|
BacnetConfig,
|
|
281
290
|
BacnetClientConfig,
|
|
@@ -290,4 +299,5 @@ module.exports = {
|
|
|
290
299
|
Read_Config_Sync,
|
|
291
300
|
Store_Config_Server,
|
|
292
301
|
Read_Config_Sync_Server,
|
|
302
|
+
isNumber,
|
|
293
303
|
};
|
package/package.json
CHANGED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30">
|
|
3
|
+
<defs>
|
|
4
|
+
<style>
|
|
5
|
+
.cls-1 {
|
|
6
|
+
fill: none;
|
|
7
|
+
stroke: #6c757d;
|
|
8
|
+
stroke-linecap: round;
|
|
9
|
+
stroke-linejoin: round;
|
|
10
|
+
stroke-width: 2px;
|
|
11
|
+
}
|
|
12
|
+
</style>
|
|
13
|
+
</defs>
|
|
14
|
+
<circle class="cls-1" cx="15" cy="15" r="14"/>
|
|
15
|
+
<g>
|
|
16
|
+
<path class="cls-1" d="M11.21,22s0-14,0-14h5.13c1.91,0,3.46,1.55,3.46,3.46v.54c0,1.91-1.55,3.46-3.46,3.46h-5.13"/>
|
|
17
|
+
<line class="cls-1" x1="15.51" y1="15.45" x2="20.03" y2="21.94"/>
|
|
18
|
+
</g>
|
|
19
|
+
</svg>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30">
|
|
3
|
+
<defs>
|
|
4
|
+
<style>
|
|
5
|
+
.cls-1 {
|
|
6
|
+
fill: none;
|
|
7
|
+
stroke: #6c757d;
|
|
8
|
+
stroke-linecap: round;
|
|
9
|
+
stroke-linejoin: round;
|
|
10
|
+
stroke-width: 2px;
|
|
11
|
+
}
|
|
12
|
+
</style>
|
|
13
|
+
</defs>
|
|
14
|
+
<circle class="cls-1" cx="15" cy="15" r="14"/>
|
|
15
|
+
<polyline class="cls-1" points="22.21 9.75 18.61 21.35 15 9.75 11.39 21.35 7.79 9.75"/>
|
|
16
|
+
</svg>
|
|
@@ -616,7 +616,7 @@ class Client extends events_1.EventEmitter {
|
|
|
616
616
|
const type = baEnum.PduTypes.CONFIRMED_REQUEST | (settings.maxSegments !== baEnum.MaxSegmentsAccepted.SEGMENTS_0 ? baEnum.PduConReqBits.SEGMENTED_RESPONSE_ACCEPTED : 0);
|
|
617
617
|
baApdu.encodeConfirmedServiceRequest(buffer, type, baEnum.ConfirmedServiceChoice.READ_PROPERTY, settings.maxSegments, settings.maxApdu, settings.invokeId, 0, 0);
|
|
618
618
|
baServices.readProperty.encode(buffer, objectId.type, objectId.instance, propertyId, settings.arrayIndex);
|
|
619
|
-
|
|
619
|
+
baBvlc.encode(buffer.buffer, baEnum.BvlcResultPurpose.ORIGINAL_UNICAST_NPDU, buffer.offset);
|
|
620
620
|
this.sendBvlc(address, buffer);
|
|
621
621
|
this._addCallback(settings.invokeId, (err, data) => {
|
|
622
622
|
try{
|
|
@@ -672,7 +672,7 @@ class Client extends events_1.EventEmitter {
|
|
|
672
672
|
baNpdu.encode(buffer, baEnum.NpduControlPriority.NORMAL_MESSAGE | baEnum.NpduControlBits.EXPECTING_REPLY, address, null, DEFAULT_HOP_COUNT, baEnum.NetworkLayerMessageType.WHO_IS_ROUTER_TO_NETWORK, 0);
|
|
673
673
|
baApdu.encodeConfirmedServiceRequest(buffer, baEnum.PduTypes.CONFIRMED_REQUEST, baEnum.ConfirmedServiceChoice.WRITE_PROPERTY, settings.maxSegments, settings.maxApdu, settings.invokeId, 0, 0);
|
|
674
674
|
baServices.writeProperty.encode(buffer, objectId.type, objectId.instance, propertyId, settings.arrayIndex, settings.priority, values);
|
|
675
|
-
|
|
675
|
+
baBvlc.encode(buffer.buffer, baEnum.BvlcResultPurpose.ORIGINAL_UNICAST_NPDU, buffer.offset);
|
|
676
676
|
this.sendBvlc(address, buffer);
|
|
677
677
|
this._addCallback(settings.invokeId, (err) => next(err));
|
|
678
678
|
}
|
|
@@ -714,7 +714,7 @@ class Client extends events_1.EventEmitter {
|
|
|
714
714
|
const type = baEnum.PduTypes.CONFIRMED_REQUEST | (settings.maxSegments !== baEnum.MaxSegmentsAccepted.SEGMENTS_0 ? baEnum.PduConReqBits.SEGMENTED_RESPONSE_ACCEPTED : 0);
|
|
715
715
|
baApdu.encodeConfirmedServiceRequest(buffer, type, baEnum.ConfirmedServiceChoice.READ_PROPERTY_MULTIPLE, settings.maxSegments, settings.maxApdu, settings.invokeId, 0, 0);
|
|
716
716
|
baServices.readPropertyMultiple.encode(buffer, propertiesArray);
|
|
717
|
-
|
|
717
|
+
baBvlc.encode(buffer.buffer, baEnum.BvlcResultPurpose.ORIGINAL_UNICAST_NPDU, buffer.offset);
|
|
718
718
|
this.sendBvlc(address, buffer);
|
|
719
719
|
//this.sendBvlc(address, buffer);
|
|
720
720
|
this._addCallback(settings.invokeId, (err, data) => {
|