@bitpoolos/edge-bacnet 1.1.7 → 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 (123) hide show
  1. package/README.md +2 -2
  2. package/bacnet_client.js +331 -168
  3. package/bacnet_device.js +50 -16
  4. package/bacnet_gateway.html +119 -15
  5. package/bacnet_gateway.js +388 -395
  6. package/bacnet_read.html +32 -11
  7. package/bacnet_read.js +1 -1
  8. package/bacnet_server.js +86 -24
  9. package/common.js +26 -19
  10. package/examples/1-Discover-Read.json +1 -1
  11. package/examples/2-Discover-Write.json +1 -1
  12. package/examples/3-Discover-Read-Write.json +1 -1
  13. package/package.json +3 -3
  14. package/resources/{node-bacnet/LICENSE.md → node-bacstack-ts/LICENSE} +3 -4
  15. package/resources/node-bacstack-ts/README.md +75 -0
  16. package/resources/{node-bacnet → node-bacstack-ts/dist}/index.js +0 -2
  17. package/resources/node-bacstack-ts/dist/lib/apdu.js +193 -0
  18. package/resources/node-bacstack-ts/dist/lib/asn1.js +1660 -0
  19. package/resources/node-bacstack-ts/dist/lib/bvlc.js +47 -0
  20. package/resources/node-bacstack-ts/dist/lib/client.js +1454 -0
  21. package/resources/node-bacstack-ts/dist/lib/enum.js +2114 -0
  22. package/resources/node-bacstack-ts/dist/lib/npdu.js +112 -0
  23. package/resources/node-bacstack-ts/dist/lib/services/add-list-element.js +58 -0
  24. package/resources/node-bacstack-ts/dist/lib/services/alarm-acknowledge.js +93 -0
  25. package/resources/node-bacstack-ts/dist/lib/services/alarm-summary.js +42 -0
  26. package/resources/node-bacstack-ts/dist/lib/services/atomic-read-file.js +157 -0
  27. package/resources/node-bacstack-ts/dist/lib/services/atomic-write-file.js +136 -0
  28. package/resources/node-bacstack-ts/dist/lib/services/cov-notify.js +119 -0
  29. package/resources/node-bacstack-ts/dist/lib/services/create-object.js +104 -0
  30. package/resources/node-bacstack-ts/dist/lib/services/delete-object.js +21 -0
  31. package/resources/node-bacstack-ts/dist/lib/services/device-communication-control.js +46 -0
  32. package/resources/node-bacstack-ts/dist/lib/services/error.js +27 -0
  33. package/resources/node-bacstack-ts/dist/lib/services/event-information.js +100 -0
  34. package/resources/node-bacstack-ts/dist/lib/services/event-notify-data.js +219 -0
  35. package/resources/node-bacstack-ts/dist/lib/services/get-enrollment-summary.js +172 -0
  36. package/resources/node-bacstack-ts/dist/lib/services/get-event-information.js +135 -0
  37. package/resources/node-bacstack-ts/dist/lib/services/i-am-broadcast.js +59 -0
  38. package/resources/node-bacstack-ts/dist/lib/services/i-have-broadcast.js +34 -0
  39. package/resources/node-bacstack-ts/dist/lib/services/index.js +32 -0
  40. package/resources/node-bacstack-ts/dist/lib/services/life-safety-operation.js +40 -0
  41. package/resources/node-bacstack-ts/dist/lib/services/private-transfer.js +43 -0
  42. package/resources/node-bacstack-ts/dist/lib/services/read-property-multiple.js +44 -0
  43. package/resources/node-bacstack-ts/dist/lib/services/read-property.js +122 -0
  44. package/resources/node-bacstack-ts/dist/lib/services/read-range.js +201 -0
  45. package/resources/node-bacstack-ts/dist/lib/services/reinitialize-device.js +35 -0
  46. package/resources/node-bacstack-ts/dist/lib/services/subscribe-cov.js +55 -0
  47. package/resources/node-bacstack-ts/dist/lib/services/subscribe-property.js +93 -0
  48. package/resources/node-bacstack-ts/dist/lib/services/time-sync.js +31 -0
  49. package/resources/node-bacstack-ts/dist/lib/services/who-has.js +56 -0
  50. package/resources/node-bacstack-ts/dist/lib/services/who-is.js +45 -0
  51. package/resources/node-bacstack-ts/dist/lib/services/write-property-multiple.js +105 -0
  52. package/resources/node-bacstack-ts/dist/lib/services/write-property.js +90 -0
  53. package/resources/node-bacstack-ts/dist/lib/transport.js +49 -0
  54. package/resources/node-bacstack-ts/dist/lib/types.js +2 -0
  55. package/resources/node-bacstack-ts/package.json +94 -0
  56. package/resources/node-bacnet/CHANGELOG.md +0 -481
  57. package/resources/node-bacnet/README.md +0 -91
  58. package/resources/node-bacnet/docs/Client.html +0 -4422
  59. package/resources/node-bacnet/docs/bacnet-icon-quad.png +0 -0
  60. package/resources/node-bacnet/docs/bacnet-icon-quad128.png +0 -0
  61. package/resources/node-bacnet/docs/bacnet-icon-quad64.png +0 -0
  62. package/resources/node-bacnet/docs/bacnet-icon-small.xcf +0 -0
  63. package/resources/node-bacnet/docs/bacnet-icon.xcf +0 -0
  64. package/resources/node-bacnet/docs/bacnet.html +0 -7032
  65. package/resources/node-bacnet/docs/client.js.html +0 -1759
  66. package/resources/node-bacnet/docs/enum.js.html +0 -2530
  67. package/resources/node-bacnet/docs/global.html +0 -2068
  68. package/resources/node-bacnet/docs/images/mocha-logo.svg +0 -65
  69. package/resources/node-bacnet/docs/index.html +0 -283
  70. package/resources/node-bacnet/docs/scripts/collapse.js +0 -11
  71. package/resources/node-bacnet/docs/scripts/jquery-3.1.1.min.js +0 -4
  72. package/resources/node-bacnet/docs/scripts/linenumber.js +0 -26
  73. package/resources/node-bacnet/docs/scripts/prettify/Apache-License-2.0.txt +0 -202
  74. package/resources/node-bacnet/docs/scripts/prettify/lang-css.js +0 -2
  75. package/resources/node-bacnet/docs/scripts/prettify/prettify.js +0 -28
  76. package/resources/node-bacnet/docs/scripts/search.js +0 -47
  77. package/resources/node-bacnet/docs/services_i-am.js.html +0 -157
  78. package/resources/node-bacnet/docs/services_time-sync.js.html +0 -118
  79. package/resources/node-bacnet/docs/services_who-is.js.html +0 -138
  80. package/resources/node-bacnet/docs/styles/jsdoc.css +0 -683
  81. package/resources/node-bacnet/docs/styles/prettify.css +0 -82
  82. package/resources/node-bacnet/examples/discover-devices.js +0 -66
  83. package/resources/node-bacnet/examples/read-device.js +0 -510
  84. package/resources/node-bacnet/examples/subscribe-cov.js +0 -75
  85. package/resources/node-bacnet/lib/apdu.js +0 -209
  86. package/resources/node-bacnet/lib/asn1.js +0 -1733
  87. package/resources/node-bacnet/lib/bvlc.js +0 -90
  88. package/resources/node-bacnet/lib/client.js +0 -1695
  89. package/resources/node-bacnet/lib/enum.js +0 -2463
  90. package/resources/node-bacnet/lib/npdu.js +0 -123
  91. package/resources/node-bacnet/lib/services/add-list-element.js +0 -64
  92. package/resources/node-bacnet/lib/services/alarm-acknowledge.js +0 -90
  93. package/resources/node-bacnet/lib/services/alarm-summary.js +0 -42
  94. package/resources/node-bacnet/lib/services/atomic-read-file.js +0 -162
  95. package/resources/node-bacnet/lib/services/atomic-write-file.js +0 -138
  96. package/resources/node-bacnet/lib/services/cov-notify.js +0 -126
  97. package/resources/node-bacnet/lib/services/create-object.js +0 -106
  98. package/resources/node-bacnet/lib/services/delete-object.js +0 -23
  99. package/resources/node-bacnet/lib/services/device-communication-control.js +0 -48
  100. package/resources/node-bacnet/lib/services/error.js +0 -33
  101. package/resources/node-bacnet/lib/services/event-information.js +0 -99
  102. package/resources/node-bacnet/lib/services/event-notify-data.js +0 -229
  103. package/resources/node-bacnet/lib/services/get-enrollment-summary.js +0 -178
  104. package/resources/node-bacnet/lib/services/get-event-information.js +0 -144
  105. package/resources/node-bacnet/lib/services/i-am.js +0 -90
  106. package/resources/node-bacnet/lib/services/i-have.js +0 -34
  107. package/resources/node-bacnet/lib/services/index.js +0 -34
  108. package/resources/node-bacnet/lib/services/life-safety-operation.js +0 -40
  109. package/resources/node-bacnet/lib/services/private-transfer.js +0 -43
  110. package/resources/node-bacnet/lib/services/read-property-multiple.js +0 -50
  111. package/resources/node-bacnet/lib/services/read-property.js +0 -130
  112. package/resources/node-bacnet/lib/services/read-range.js +0 -201
  113. package/resources/node-bacnet/lib/services/register-foreign-device.js +0 -18
  114. package/resources/node-bacnet/lib/services/reinitialize-device.js +0 -37
  115. package/resources/node-bacnet/lib/services/subscribe-cov.js +0 -57
  116. package/resources/node-bacnet/lib/services/subscribe-property.js +0 -97
  117. package/resources/node-bacnet/lib/services/time-sync.js +0 -51
  118. package/resources/node-bacnet/lib/services/who-has.js +0 -54
  119. package/resources/node-bacnet/lib/services/who-is.js +0 -71
  120. package/resources/node-bacnet/lib/services/write-property-multiple.js +0 -117
  121. package/resources/node-bacnet/lib/services/write-property.js +0 -94
  122. package/resources/node-bacnet/lib/transport.js +0 -82
  123. 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,5 @@
1
- const bacnet = require('./resources/node-bacnet/index.js');
1
+ const bacnet = require('./resources/node-bacstack-ts/dist/index.js');
2
+ const pjson = require('./package.json');
2
3
  const baEnum = bacnet.enum;
3
4
  const {Store_Config_Server, Read_Config_Sync_Server } = require('./common');
4
5
 
@@ -10,22 +11,57 @@ class BacnetServer {
10
11
  that.objectIdNumber = 1;
11
12
  that.nodeRedVersion = nodeRedVersion;
12
13
  that.deviceId = deviceId;
14
+ that.vendorId = 1401;
13
15
  that.objectList = [
14
16
  {value: {type: baEnum.ObjectType.DEVICE, instance: that.deviceId}, type: 12}
15
17
  ];
16
18
  that.objectStore = {
17
19
  [baEnum.ObjectType.DEVICE]: {
18
- [baEnum.PropertyIdentifier.OBJECT_IDENTIFIER]: [{value: {type: baEnum.ObjectType.DEVICE, instance: that.deviceId}, type: 12}], // OBJECT_IDENTIFIER
19
- [baEnum.PropertyIdentifier.OBJECT_LIST]: that.objectList, // OBJECT_IDENTIFIER
20
- [baEnum.PropertyIdentifier.OBJECT_NAME]: [{value: 'Bitpool Edge BACnet Gateway', type: 7}], // OBJECT_NAME
21
- [baEnum.PropertyIdentifier.OBJECT_TYPE]: [{value: 8, type: 9}], // OBJECT_TYPE
22
- [baEnum.PropertyIdentifier.DESCRIPTION]: [{value: 'Bitpool Edge BACnet gateway', type: 7}], // DESCRIPTION
23
- [baEnum.PropertyIdentifier.SYSTEM_STATUS]: [{value: 0, type: 9}], // SYSTEM_STATUS
24
- [baEnum.PropertyIdentifier.VENDOR_NAME]: [{value: "Bitpool", type: 7}], //VENDOR_NAME
25
- [baEnum.PropertyIdentifier.VENDOR_IDENTIFIER]: [{value: 1401, type: 7}], //VENDOR_IDENTIFIER
26
- [baEnum.PropertyIdentifier.MODEL_NAME]: [{value: "bitpool-edge", type: 7}], //MODEL_NAME
27
- [baEnum.PropertyIdentifier.FIRMWARE_REVISION]: [{value: "Node-Red " + that.nodeRedVersion, type: 7}], //FIRMWARE_REVISION
28
- },
20
+ [baEnum.PropertyIdentifier.OBJECT_IDENTIFIER]: [{value: {type: baEnum.ObjectType.DEVICE, instance: that.deviceId}, type: 12}],
21
+ [baEnum.PropertyIdentifier.OBJECT_LIST]: that.objectList,
22
+ [baEnum.PropertyIdentifier.OBJECT_NAME]: [{value: 'Bitpool Edge BACnet Gateway', type: 7}],
23
+ [baEnum.PropertyIdentifier.OBJECT_TYPE]: [{value: 8, type: 9}],
24
+ [baEnum.PropertyIdentifier.DESCRIPTION]: [{value: 'Bitpool Edge BACnet gateway', type: 7}],
25
+ [baEnum.PropertyIdentifier.SYSTEM_STATUS]: [{value: 0, type: 9}],
26
+ [baEnum.PropertyIdentifier.VENDOR_NAME]: [{value: "Bitpool", type: 7}],
27
+ [baEnum.PropertyIdentifier.VENDOR_IDENTIFIER]: [{value: that.vendorId, type: 2}],
28
+ [baEnum.PropertyIdentifier.MODEL_NAME]: [{value: "bitpool-edge", type: 7}],
29
+ [baEnum.PropertyIdentifier.FIRMWARE_REVISION]: [{value: "Node-Red " + that.nodeRedVersion, type: 7}],
30
+ [baEnum.PropertyIdentifier.PROTOCOL_REVISION]: [{value: 19, type: 2}],
31
+ [baEnum.PropertyIdentifier.PROTOCOL_VERSION]: [{value: 0, type: 2}],
32
+ [baEnum.PropertyIdentifier.APPLICATION_SOFTWARE_VERSION]: [{value: pjson.version, type: 7}],
33
+ [baEnum.PropertyIdentifier.PROTOCOL_SERVICES_SUPPORTED]: [{value: { value: [ 0, 80, 0, 4, 4 ], bitsUsed: 40 }, type: 8}],
34
+ [baEnum.PropertyIdentifier.PROTOCOL_OBJECT_TYPES_SUPPORTED]: [{value: { value: [ 0, 80, 0, 4, 4 ], bitsUsed: 40 }, type: 8}],
35
+ [baEnum.PropertyIdentifier.MAX_APDU_LENGTH_ACCEPTED]: [{value: 1476, type: 2}],
36
+ [baEnum.PropertyIdentifier.SEGMENTATION_SUPPORTED]: [{value: 0, type: 9}],
37
+ [baEnum.PropertyIdentifier.APDU_TIMEOUT]: [{value: that.bacnetClient.config.apduTimeout, type: 2}],
38
+ [baEnum.PropertyIdentifier.NUMBER_OF_APDU_RETRIES]: [{value: 3, type: 2}],
39
+ [baEnum.PropertyIdentifier.DEVICE_ADDRESS_BINDING]: [{value: 0, type: 12}],
40
+ [baEnum.PropertyIdentifier.DATABASE_REVISION]: [{value: 19, type: 2}],
41
+ [baEnum.PropertyIdentifier.PROPERTY_LIST]: [
42
+ {value: baEnum.PropertyIdentifier.OBJECT_IDENTIFIER, type: 9 },
43
+ {value: baEnum.PropertyIdentifier.OBJECT_LIST, type: 9 },
44
+ {value: baEnum.PropertyIdentifier.OBJECT_NAME, type: 9 },
45
+ {value: baEnum.PropertyIdentifier.OBJECT_TYPE, type: 9 },
46
+ {value: baEnum.PropertyIdentifier.DESCRIPTION, type: 9 },
47
+ {value: baEnum.PropertyIdentifier.SYSTEM_STATUS, type: 9 },
48
+ {value: baEnum.PropertyIdentifier.VENDOR_NAME, type: 9 },
49
+ {value: baEnum.PropertyIdentifier.VENDOR_IDENTIFIER, type: 9 },
50
+ {value: baEnum.PropertyIdentifier.MODEL_NAME, type: 9 },
51
+ {value: baEnum.PropertyIdentifier.FIRMWARE_REVISION, type: 9 },
52
+ {value: baEnum.PropertyIdentifier.PROTOCOL_REVISION, type: 9 },
53
+ {value: baEnum.PropertyIdentifier.PROTOCOL_VERSION, type: 9 },
54
+ {value: baEnum.PropertyIdentifier.APPLICATION_SOFTWARE_VERSION, type: 9 },
55
+ {value: baEnum.PropertyIdentifier.PROTOCOL_SERVICES_SUPPORTED, type: 9 },
56
+ {value: baEnum.PropertyIdentifier.PROTOCOL_OBJECT_TYPES_SUPPORTED, type: 9 },
57
+ {value: baEnum.PropertyIdentifier.MAX_APDU_LENGTH_ACCEPTED, type: 9 },
58
+ {value: baEnum.PropertyIdentifier.SEGMENTATION_SUPPORTED, type: 9 },
59
+ {value: baEnum.PropertyIdentifier.APDU_TIMEOUT, type: 9 },
60
+ {value: baEnum.PropertyIdentifier.NUMBER_OF_APDU_RETRIES, type: 9 },
61
+ {value: baEnum.PropertyIdentifier.DEVICE_ADDRESS_BINDING, type: 9 },
62
+ {value: baEnum.PropertyIdentifier.DATABASE_REVISION, type: 9 },
63
+ ],
64
+ },
29
65
  [baEnum.ObjectType.ANALOG_VALUE]: [],
30
66
  [baEnum.ObjectType.CHARACTERSTRING_VALUE]: []
31
67
  };
@@ -45,20 +81,20 @@ class BacnetServer {
45
81
  }
46
82
 
47
83
  that.bacnetClient.client.on('whoIs', (device) => {
48
- that.bacnetClient.client.iAmResponse(that.bacnetClient.broadCastAddr, that.deviceId, baEnum.Segmentation.SEGMENTED_BOTH, 27823);
84
+ that.bacnetClient.client.iAmResponse(that.deviceId, baEnum.Segmentation.SEGMENTED_BOTH, that.vendorId);
85
+ that.lastWhoIsRecived = Date.now();
49
86
  });
50
87
 
51
88
  that.bacnetClient.client.on('readPropertyMultiple', (data) => {
52
89
 
53
- let senderAddress = data.header.sender.address;
54
- let requestProps = data.payload.properties;
90
+ let senderAddress = data.address;
91
+ let requestProps = data.request.properties;
55
92
  let responseObject = [];
56
93
 
57
94
  try {
58
95
  if(requestProps) {
59
96
 
60
97
  for(let i = 0; i < requestProps.length; i++) {
61
-
62
98
  let prop = requestProps[i].properties[0].id;
63
99
  let type = requestProps[i].objectId.type;
64
100
  let instance = requestProps[i].objectId.instance;
@@ -70,7 +106,6 @@ class BacnetServer {
70
106
 
71
107
  if(i == requestProps.length - 1) {
72
108
  if(responseObject.length > 0) {
73
-
74
109
  that.bacnetClient.client.readPropertyMultipleResponse(senderAddress, data.invokeId, responseObject);
75
110
  } else {
76
111
  that.bacnetClient.client.errorResponse(
@@ -96,17 +131,25 @@ class BacnetServer {
96
131
  baEnum.ErrorCode.UNKNOWN_PROPERTY
97
132
  );
98
133
  }
134
+
99
135
  });
100
136
 
101
137
  that.bacnetClient.client.on('readProperty', (data) => {
138
+
102
139
  try {
103
- let objectId = data.payload.objectId.type;
104
- let objectInstance = data.payload.objectId.instance;
105
- 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
+
106
145
  let responseObj = that.getObject(objectId, propId, objectInstance);
107
146
 
147
+ if(propId == baEnum.PropertyIdentifier.OBJECT_LIST && ((Date.now() - that.lastWhoIsRecived) / 1000) < 0.7) {
148
+ responseObj = [{value:that.objectList.length, type: 2}];
149
+ }
108
150
  if(responseObj !== null && responseObj !== undefined && typeof responseObj !== "undefined") {
109
- that.bacnetClient.client.readPropertyResponse(data.header.sender.address, data.invokeId, objectId, data.payload.property, responseObj);
151
+
152
+ that.bacnetClient.client.readPropertyResponse(data.address, data.invokeId, objectId, data.request.property, responseObj);
110
153
  } else {
111
154
  that.bacnetClient.client.errorResponse(
112
155
  data.address,
@@ -123,7 +166,7 @@ class BacnetServer {
123
166
  });
124
167
 
125
168
  //do initial iAm broadcast when BACnet server starts
126
- 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);
127
170
  }
128
171
 
129
172
  setDeviceName(nodeName) {
@@ -152,7 +195,27 @@ class BacnetServer {
152
195
  [baEnum.PropertyIdentifier.STATUS_FLAGS]: [{value: 0, type: 8}],
153
196
  [baEnum.PropertyIdentifier.EVENT_STATE]: [{value: 0, type: 9}],
154
197
  [baEnum.PropertyIdentifier.OUT_OF_SERVICE]: [{value: 0, type: 9}],
155
- [baEnum.PropertyIdentifier.UNITS]: [{value: 95, type: 9}]
198
+ [baEnum.PropertyIdentifier.UNITS]: [{value: 95, type: 9}],
199
+ [baEnum.PropertyIdentifier.PRIORITY_ARRAY]: [{value: 0, type: 9}],
200
+ [baEnum.PropertyIdentifier.MAX_PRES_VALUE]: [{value: value, type: 4}],
201
+ [baEnum.PropertyIdentifier.MIN_PRES_VALUE]: [{value: value, type: 4}],
202
+ [baEnum.PropertyIdentifier.RESOLUTION]: [{value: 0, type: 4}],
203
+ [baEnum.PropertyIdentifier.PROPERTY_LIST]:
204
+ [
205
+ {value: baEnum.PropertyIdentifier.OBJECT_NAME, type: 9 },
206
+ {value: baEnum.PropertyIdentifier.OBJECT_TYPE, type: 9 },
207
+ {value: baEnum.PropertyIdentifier.DESCRIPTION, type: 9 },
208
+ {value: baEnum.PropertyIdentifier.OBJECT_IDENTIFIER, type: 9 },
209
+ {value: baEnum.PropertyIdentifier.PRESENT_VALUE, type: 9 },
210
+ {value: baEnum.PropertyIdentifier.STATUS_FLAGS, type: 9 },
211
+ {value: baEnum.PropertyIdentifier.EVENT_STATE, type: 9 },
212
+ {value: baEnum.PropertyIdentifier.OUT_OF_SERVICE, type: 9 },
213
+ {value: baEnum.PropertyIdentifier.UNITS, type: 9 },
214
+ {value: baEnum.PropertyIdentifier.PRIORITY_ARRAY, type: 9 },
215
+ {value: baEnum.PropertyIdentifier.MAX_PRES_VALUE, type: 9 },
216
+ {value: baEnum.PropertyIdentifier.MIN_PRES_VALUE, type: 9 },
217
+ {value: baEnum.PropertyIdentifier.RESOLUTION, type: 9 },
218
+ ],
156
219
  });
157
220
 
158
221
  that.objectList.push({value: {type: baEnum.ObjectType.ANALOG_VALUE, instance: objectId}, type: 12})
@@ -317,7 +380,6 @@ class BacnetServer {
317
380
  return objectId;
318
381
  }
319
382
 
320
-
321
383
  }
322
384
 
323
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.7",
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');