@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.
Files changed (122) hide show
  1. package/bacnet_client.js +331 -168
  2. package/bacnet_device.js +50 -16
  3. package/bacnet_gateway.html +119 -15
  4. package/bacnet_gateway.js +388 -395
  5. package/bacnet_read.html +32 -11
  6. package/bacnet_read.js +1 -1
  7. package/bacnet_server.js +16 -12
  8. package/common.js +26 -19
  9. package/examples/1-Discover-Read.json +1 -1
  10. package/examples/2-Discover-Write.json +1 -1
  11. package/examples/3-Discover-Read-Write.json +1 -1
  12. package/package.json +3 -3
  13. package/resources/{node-bacnet/LICENSE.md → node-bacstack-ts/LICENSE} +3 -4
  14. package/resources/node-bacstack-ts/README.md +75 -0
  15. package/resources/{node-bacnet → node-bacstack-ts/dist}/index.js +0 -2
  16. package/resources/node-bacstack-ts/dist/lib/apdu.js +193 -0
  17. package/resources/node-bacstack-ts/dist/lib/asn1.js +1660 -0
  18. package/resources/node-bacstack-ts/dist/lib/bvlc.js +47 -0
  19. package/resources/node-bacstack-ts/dist/lib/client.js +1454 -0
  20. package/resources/node-bacstack-ts/dist/lib/enum.js +2114 -0
  21. package/resources/node-bacstack-ts/dist/lib/npdu.js +112 -0
  22. package/resources/node-bacstack-ts/dist/lib/services/add-list-element.js +58 -0
  23. package/resources/node-bacstack-ts/dist/lib/services/alarm-acknowledge.js +93 -0
  24. package/resources/node-bacstack-ts/dist/lib/services/alarm-summary.js +42 -0
  25. package/resources/node-bacstack-ts/dist/lib/services/atomic-read-file.js +157 -0
  26. package/resources/node-bacstack-ts/dist/lib/services/atomic-write-file.js +136 -0
  27. package/resources/node-bacstack-ts/dist/lib/services/cov-notify.js +119 -0
  28. package/resources/node-bacstack-ts/dist/lib/services/create-object.js +104 -0
  29. package/resources/node-bacstack-ts/dist/lib/services/delete-object.js +21 -0
  30. package/resources/node-bacstack-ts/dist/lib/services/device-communication-control.js +46 -0
  31. package/resources/node-bacstack-ts/dist/lib/services/error.js +27 -0
  32. package/resources/node-bacstack-ts/dist/lib/services/event-information.js +100 -0
  33. package/resources/node-bacstack-ts/dist/lib/services/event-notify-data.js +219 -0
  34. package/resources/node-bacstack-ts/dist/lib/services/get-enrollment-summary.js +172 -0
  35. package/resources/node-bacstack-ts/dist/lib/services/get-event-information.js +135 -0
  36. package/resources/node-bacstack-ts/dist/lib/services/i-am-broadcast.js +59 -0
  37. package/resources/node-bacstack-ts/dist/lib/services/i-have-broadcast.js +34 -0
  38. package/resources/node-bacstack-ts/dist/lib/services/index.js +32 -0
  39. package/resources/node-bacstack-ts/dist/lib/services/life-safety-operation.js +40 -0
  40. package/resources/node-bacstack-ts/dist/lib/services/private-transfer.js +43 -0
  41. package/resources/node-bacstack-ts/dist/lib/services/read-property-multiple.js +44 -0
  42. package/resources/node-bacstack-ts/dist/lib/services/read-property.js +122 -0
  43. package/resources/node-bacstack-ts/dist/lib/services/read-range.js +201 -0
  44. package/resources/node-bacstack-ts/dist/lib/services/reinitialize-device.js +35 -0
  45. package/resources/node-bacstack-ts/dist/lib/services/subscribe-cov.js +55 -0
  46. package/resources/node-bacstack-ts/dist/lib/services/subscribe-property.js +93 -0
  47. package/resources/node-bacstack-ts/dist/lib/services/time-sync.js +31 -0
  48. package/resources/node-bacstack-ts/dist/lib/services/who-has.js +56 -0
  49. package/resources/node-bacstack-ts/dist/lib/services/who-is.js +45 -0
  50. package/resources/node-bacstack-ts/dist/lib/services/write-property-multiple.js +105 -0
  51. package/resources/node-bacstack-ts/dist/lib/services/write-property.js +90 -0
  52. package/resources/node-bacstack-ts/dist/lib/transport.js +49 -0
  53. package/resources/node-bacstack-ts/dist/lib/types.js +2 -0
  54. package/resources/node-bacstack-ts/package.json +94 -0
  55. package/resources/node-bacnet/CHANGELOG.md +0 -481
  56. package/resources/node-bacnet/README.md +0 -91
  57. package/resources/node-bacnet/docs/Client.html +0 -4422
  58. package/resources/node-bacnet/docs/bacnet-icon-quad.png +0 -0
  59. package/resources/node-bacnet/docs/bacnet-icon-quad128.png +0 -0
  60. package/resources/node-bacnet/docs/bacnet-icon-quad64.png +0 -0
  61. package/resources/node-bacnet/docs/bacnet-icon-small.xcf +0 -0
  62. package/resources/node-bacnet/docs/bacnet-icon.xcf +0 -0
  63. package/resources/node-bacnet/docs/bacnet.html +0 -7032
  64. package/resources/node-bacnet/docs/client.js.html +0 -1759
  65. package/resources/node-bacnet/docs/enum.js.html +0 -2530
  66. package/resources/node-bacnet/docs/global.html +0 -2068
  67. package/resources/node-bacnet/docs/images/mocha-logo.svg +0 -65
  68. package/resources/node-bacnet/docs/index.html +0 -283
  69. package/resources/node-bacnet/docs/scripts/collapse.js +0 -11
  70. package/resources/node-bacnet/docs/scripts/jquery-3.1.1.min.js +0 -4
  71. package/resources/node-bacnet/docs/scripts/linenumber.js +0 -26
  72. package/resources/node-bacnet/docs/scripts/prettify/Apache-License-2.0.txt +0 -202
  73. package/resources/node-bacnet/docs/scripts/prettify/lang-css.js +0 -2
  74. package/resources/node-bacnet/docs/scripts/prettify/prettify.js +0 -28
  75. package/resources/node-bacnet/docs/scripts/search.js +0 -47
  76. package/resources/node-bacnet/docs/services_i-am.js.html +0 -157
  77. package/resources/node-bacnet/docs/services_time-sync.js.html +0 -118
  78. package/resources/node-bacnet/docs/services_who-is.js.html +0 -138
  79. package/resources/node-bacnet/docs/styles/jsdoc.css +0 -683
  80. package/resources/node-bacnet/docs/styles/prettify.css +0 -82
  81. package/resources/node-bacnet/examples/discover-devices.js +0 -66
  82. package/resources/node-bacnet/examples/read-device.js +0 -510
  83. package/resources/node-bacnet/examples/subscribe-cov.js +0 -75
  84. package/resources/node-bacnet/lib/apdu.js +0 -209
  85. package/resources/node-bacnet/lib/asn1.js +0 -1733
  86. package/resources/node-bacnet/lib/bvlc.js +0 -90
  87. package/resources/node-bacnet/lib/client.js +0 -1695
  88. package/resources/node-bacnet/lib/enum.js +0 -2463
  89. package/resources/node-bacnet/lib/npdu.js +0 -123
  90. package/resources/node-bacnet/lib/services/add-list-element.js +0 -64
  91. package/resources/node-bacnet/lib/services/alarm-acknowledge.js +0 -90
  92. package/resources/node-bacnet/lib/services/alarm-summary.js +0 -42
  93. package/resources/node-bacnet/lib/services/atomic-read-file.js +0 -162
  94. package/resources/node-bacnet/lib/services/atomic-write-file.js +0 -138
  95. package/resources/node-bacnet/lib/services/cov-notify.js +0 -126
  96. package/resources/node-bacnet/lib/services/create-object.js +0 -106
  97. package/resources/node-bacnet/lib/services/delete-object.js +0 -23
  98. package/resources/node-bacnet/lib/services/device-communication-control.js +0 -48
  99. package/resources/node-bacnet/lib/services/error.js +0 -33
  100. package/resources/node-bacnet/lib/services/event-information.js +0 -99
  101. package/resources/node-bacnet/lib/services/event-notify-data.js +0 -229
  102. package/resources/node-bacnet/lib/services/get-enrollment-summary.js +0 -178
  103. package/resources/node-bacnet/lib/services/get-event-information.js +0 -144
  104. package/resources/node-bacnet/lib/services/i-am.js +0 -90
  105. package/resources/node-bacnet/lib/services/i-have.js +0 -34
  106. package/resources/node-bacnet/lib/services/index.js +0 -34
  107. package/resources/node-bacnet/lib/services/life-safety-operation.js +0 -40
  108. package/resources/node-bacnet/lib/services/private-transfer.js +0 -43
  109. package/resources/node-bacnet/lib/services/read-property-multiple.js +0 -50
  110. package/resources/node-bacnet/lib/services/read-property.js +0 -130
  111. package/resources/node-bacnet/lib/services/read-range.js +0 -201
  112. package/resources/node-bacnet/lib/services/register-foreign-device.js +0 -18
  113. package/resources/node-bacnet/lib/services/reinitialize-device.js +0 -37
  114. package/resources/node-bacnet/lib/services/subscribe-cov.js +0 -57
  115. package/resources/node-bacnet/lib/services/subscribe-property.js +0 -97
  116. package/resources/node-bacnet/lib/services/time-sync.js +0 -51
  117. package/resources/node-bacnet/lib/services/who-has.js +0 -54
  118. package/resources/node-bacnet/lib/services/who-is.js +0 -71
  119. package/resources/node-bacnet/lib/services/write-property-multiple.js +0 -117
  120. package/resources/node-bacnet/lib/services/write-property.js +0 -94
  121. package/resources/node-bacnet/lib/transport.js +0 -82
  122. 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
- app.progressBarValue = parseInt((result.renderList.length / result.deviceList.length) * 100);
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 && node.vm.$data.devices.length > 0) node.devices = node.vm.$data.devices;
424
- if (node.vm.$data.readDevices && node.vm.$data.readDevices.length > 0) node.readDevices = node.vm.$data.readDevices;
425
- if (node.vm.$data.pointsToRead && node.vm.$data.pointsToRead.length > 0) node.pointsToRead = 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 && node.vm.$data.devices.length > 0) node.devices = node.vm.$data.devices;
431
- if (node.vm.$data.readDevices && node.vm.$data.readDevices.length > 0) node.readDevices = node.vm.$data.readDevices;
432
- if (node.vm.$data.pointsToRead && node.vm.$data.pointsToRead.length > 0) node.pointsToRead = 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-bacnet/index.js').enum;
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-bacnet/index.js');
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: 1401, type: 2}],
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.bacnetClient.broadCastAddr, that.deviceId, baEnum.Segmentation.SEGMENTED_BOTH, 1401);
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.header.sender.address;
90
- let requestProps = data.payload.properties;
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
- let objectId = data.payload.objectId.type;
139
- let objectInstance = data.payload.objectId.instance;
140
- let propId = data.payload.property.id.toString();
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
- that.bacnetClient.client.readPropertyResponse(data.header.sender.address, data.invokeId, data.payload.objectId, data.payload.property, responseObj);
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.bacnetClient.broadCastAddr, that.deviceId, baEnum.Segmentation.SEGMENTED_BOTH, 27823);
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-bacnet/index.js').enum;
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
- bacnetServerEnabled
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.bacnetServerEnabled = bacnetServerEnabled;
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
- await fs.writeFile("edge-bacnet-datastore.cfg", data, (err) => {
214
- if (err) {
215
- console.log("Store_Config writeFile error: ", err);
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
- await fs.writeFile("edge-bacnet-server-datastore.cfg", data, (err) => {
241
- if (err) {
242
- console.log("Store_Config_Server writeFile error: ", err);
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":"697c8ed4b294882c","type":"Bacnet-Gateway","z":"29e22a8fbd476c06","name":"","local_device_address":"","apduTimeout":6000,"roundDecimal":2,"local_device_port":47808,"apduSize":"5","maxSegments":"0x50","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,"bacnetServerRebuildSchedule":"604800","bacnetServerRebuildSchedule_value":"7","bacnetServerRebuildSchedule_options":"Days","x":640,"y":380,"wires":[["d78c0f4d2fb9befa"]]},{"id":"d129d123e7eedbca","type":"Bitpool-Inject","z":"29e22a8fbd476c06","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":460,"y":380,"wires":[["697c8ed4b294882c"]]},{"id":"2dc599ab69789b27","type":"Bitpool-Inject","z":"29e22a8fbd476c06","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":290,"y":320,"wires":[["282edf29720defca"]]},{"id":"d78c0f4d2fb9befa","type":"debug","z":"29e22a8fbd476c06","name":"debug 1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":820,"y":380,"wires":[]},{"id":"282edf29720defca","type":"Bacnet-Discovery","z":"29e22a8fbd476c06","name":"","events":true,"json":false,"mqtt":true,"hiddenDeployToggle":false,"prevHiddenToggleState":false,"roundDecimal":2,"pointsToRead":{},"readDevices":[],"object_property_simplePayload":true,"object_property_fullObject":false,"x":470,"y":320,"wires":[["697c8ed4b294882c"]]}]
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":"29e22a8fbd476c06","name":"","local_device_address":"","apduTimeout":6000,"roundDecimal":2,"local_device_port":47808,"apduSize":"5","maxSegments":"0x50","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,"bacnetServerRebuildSchedule":"604800","bacnetServerRebuildSchedule_value":"7","bacnetServerRebuildSchedule_options":"Days","x":620,"y":320,"wires":[["0313b7ee1cfa6b42"]]},{"id":"c2e012301c4a6af4","type":"Bitpool-Inject","z":"29e22a8fbd476c06","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":440,"y":320,"wires":[["e478e80571442399"]]},{"id":"8172620e7be7b505","type":"Bitpool-Inject","z":"29e22a8fbd476c06","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":290,"y":400,"wires":[["b3293195b7c5bd9d"]]},{"id":"0313b7ee1cfa6b42","type":"debug","z":"29e22a8fbd476c06","name":"debug 1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":800,"y":320,"wires":[]},{"id":"b3293195b7c5bd9d","type":"Bacnet-Write","z":"29e22a8fbd476c06","name":"","applicationTag":"4","priority":"16","pointsToWrite":[],"writeDevices":[],"hiddenDeployToggle":false,"prevHiddenToggleState":false,"x":450,"y":400,"wires":[["e478e80571442399"]]}]
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":"29e22a8fbd476c06","name":"","local_device_address":"","apduTimeout":6000,"roundDecimal":2,"local_device_port":47808,"apduSize":"5","maxSegments":"0x50","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,"bacnetServerRebuildSchedule":"604800","bacnetServerRebuildSchedule_value":"7","bacnetServerRebuildSchedule_options":"Days","x":660,"y":360,"wires":[["13c868a66ecd17df"]]},{"id":"4df39409775f724e","type":"Bitpool-Inject","z":"29e22a8fbd476c06","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":360,"wires":[["e6ef82c5497d2d12"]]},{"id":"67e4f714757a028e","type":"Bitpool-Inject","z":"29e22a8fbd476c06","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":330,"y":440,"wires":[["b8931cb1a1c69ffb"]]},{"id":"13c868a66ecd17df","type":"debug","z":"29e22a8fbd476c06","name":"debug 1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":840,"y":360,"wires":[]},{"id":"b8931cb1a1c69ffb","type":"Bacnet-Write","z":"29e22a8fbd476c06","name":"","applicationTag":"4","priority":"16","pointsToWrite":[],"writeDevices":[],"hiddenDeployToggle":false,"prevHiddenToggleState":false,"x":490,"y":440,"wires":[["e6ef82c5497d2d12"]]},{"id":"a95e261a4cc2662b","type":"Bitpool-Inject","z":"29e22a8fbd476c06","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":330,"y":300,"wires":[["08df19608ade8576"]]},{"id":"08df19608ade8576","type":"Bacnet-Discovery","z":"29e22a8fbd476c06","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":300,"wires":[["e6ef82c5497d2d12"]]}]
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.8",
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
- The MIT License (MIT)
1
+ MIT License
2
2
 
3
- Copyright (c) 2018-2020 Community Driven
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.
@@ -1,5 +1,3 @@
1
1
  'use strict';
2
-
3
2
  module.exports = require('./lib/client');
4
- module.exports._ = require('underscore');
5
3
  module.exports.enum = require('./lib/enum');