@bitpoolos/edge-bacnet 1.0.6 → 1.1.0

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 (181) hide show
  1. package/bacnet_client.js +650 -233
  2. package/bacnet_device.js +65 -16
  3. package/bacnet_gateway.html +242 -99
  4. package/bacnet_gateway.js +211 -27
  5. package/bacnet_object.js +1 -1
  6. package/bacnet_read.html +211 -133
  7. package/bacnet_read.js +24 -24
  8. package/bacnet_server.js +321 -0
  9. package/bacnet_write.html +24 -15
  10. package/bacnet_write.js +0 -2
  11. package/common.js +95 -9
  12. package/edge-bacnet-datastore.cfg +0 -0
  13. package/package.json +6 -4
  14. package/resources/confirmationservice.min.js +1 -0
  15. package/resources/confirmdialog.min.js +1 -0
  16. package/resources/fonts/primeicons.woff2 +0 -0
  17. package/resources/node-bacnet/CHANGELOG.md +481 -0
  18. package/resources/{bacstack → node-bacnet}/LICENSE.md +3 -1
  19. package/resources/node-bacnet/README.md +91 -0
  20. package/resources/node-bacnet/docs/Client.html +4422 -0
  21. package/resources/node-bacnet/docs/bacnet-icon-quad.png +0 -0
  22. package/resources/node-bacnet/docs/bacnet-icon-quad128.png +0 -0
  23. package/resources/node-bacnet/docs/bacnet-icon-quad64.png +0 -0
  24. package/resources/node-bacnet/docs/bacnet-icon-small.xcf +0 -0
  25. package/resources/node-bacnet/docs/bacnet-icon.xcf +0 -0
  26. package/resources/node-bacnet/docs/bacnet.html +7032 -0
  27. package/resources/node-bacnet/docs/client.js.html +1759 -0
  28. package/resources/node-bacnet/docs/enum.js.html +2530 -0
  29. package/resources/node-bacnet/docs/global.html +2068 -0
  30. package/resources/node-bacnet/docs/images/mocha-logo.svg +65 -0
  31. package/resources/node-bacnet/docs/index.html +283 -0
  32. package/resources/node-bacnet/docs/scripts/collapse.js +11 -0
  33. package/resources/node-bacnet/docs/scripts/jquery-3.1.1.min.js +4 -0
  34. package/resources/node-bacnet/docs/scripts/linenumber.js +26 -0
  35. package/resources/node-bacnet/docs/scripts/prettify/Apache-License-2.0.txt +202 -0
  36. package/resources/node-bacnet/docs/scripts/prettify/lang-css.js +2 -0
  37. package/resources/node-bacnet/docs/scripts/prettify/prettify.js +28 -0
  38. package/resources/node-bacnet/docs/scripts/search.js +47 -0
  39. package/resources/node-bacnet/docs/services_i-am.js.html +157 -0
  40. package/resources/node-bacnet/docs/services_time-sync.js.html +118 -0
  41. package/resources/node-bacnet/docs/services_who-is.js.html +138 -0
  42. package/resources/node-bacnet/docs/styles/jsdoc.css +683 -0
  43. package/resources/node-bacnet/docs/styles/prettify.css +82 -0
  44. package/resources/node-bacnet/examples/discover-devices.js +66 -0
  45. package/resources/node-bacnet/examples/read-device.js +510 -0
  46. package/resources/node-bacnet/examples/subscribe-cov.js +75 -0
  47. package/resources/{bacstack → node-bacnet}/index.js +3 -0
  48. package/resources/{bacstack → node-bacnet}/lib/apdu.js +56 -39
  49. package/resources/{bacstack → node-bacnet}/lib/asn1.js +550 -532
  50. package/resources/node-bacnet/lib/bvlc.js +90 -0
  51. package/resources/node-bacnet/lib/client.js +1695 -0
  52. package/resources/node-bacnet/lib/enum.js +2463 -0
  53. package/resources/node-bacnet/lib/npdu.js +123 -0
  54. package/resources/{bacstack → node-bacnet}/lib/services/add-list-element.js +12 -6
  55. package/resources/{bacstack → node-bacnet}/lib/services/alarm-acknowledge.js +3 -3
  56. package/resources/{bacstack → node-bacnet}/lib/services/alarm-summary.js +5 -4
  57. package/resources/{bacstack → node-bacnet}/lib/services/atomic-read-file.js +49 -26
  58. package/resources/{bacstack → node-bacnet}/lib/services/atomic-write-file.js +40 -23
  59. package/resources/{bacstack → node-bacnet}/lib/services/cov-notify.js +33 -17
  60. package/resources/{bacstack → node-bacnet}/lib/services/create-object.js +23 -13
  61. package/resources/{bacstack → node-bacnet}/lib/services/delete-object.js +7 -2
  62. package/resources/{bacstack → node-bacnet}/lib/services/device-communication-control.js +8 -3
  63. package/resources/{bacstack → node-bacnet}/lib/services/error.js +7 -0
  64. package/resources/{bacstack → node-bacnet}/lib/services/event-information.js +10 -9
  65. package/resources/{bacstack → node-bacnet}/lib/services/event-notify-data.js +38 -16
  66. package/resources/{bacstack → node-bacnet}/lib/services/get-enrollment-summary.js +24 -11
  67. package/resources/{bacstack → node-bacnet}/lib/services/get-event-information.js +28 -13
  68. package/resources/node-bacnet/lib/services/i-am.js +90 -0
  69. package/resources/{bacstack/lib/services/i-have-broadcast.js → node-bacnet/lib/services/i-have.js} +3 -2
  70. package/resources/{bacstack → node-bacnet}/lib/services/index.js +7 -4
  71. package/resources/{bacstack → node-bacnet}/lib/services/life-safety-operation.js +3 -2
  72. package/resources/{bacstack → node-bacnet}/lib/services/private-transfer.js +3 -2
  73. package/resources/{bacstack → node-bacnet}/lib/services/read-property-multiple.js +11 -6
  74. package/resources/{bacstack → node-bacnet}/lib/services/read-property.js +42 -24
  75. package/resources/{bacstack → node-bacnet}/lib/services/read-range.js +37 -27
  76. package/resources/node-bacnet/lib/services/register-foreign-device.js +18 -0
  77. package/resources/{bacstack → node-bacnet}/lib/services/reinitialize-device.js +9 -4
  78. package/resources/{bacstack → node-bacnet}/lib/services/subscribe-cov.js +9 -4
  79. package/resources/{bacstack → node-bacnet}/lib/services/subscribe-property.js +18 -8
  80. package/resources/{bacstack → node-bacnet}/lib/services/time-sync.js +28 -5
  81. package/resources/{bacstack → node-bacnet}/lib/services/who-has.js +3 -3
  82. package/resources/{bacstack → node-bacnet}/lib/services/who-is.js +42 -9
  83. package/resources/{bacstack → node-bacnet}/lib/services/write-property-multiple.js +33 -16
  84. package/resources/{bacstack → node-bacnet}/lib/services/write-property.js +23 -13
  85. package/resources/node-bacnet/lib/transport.js +82 -0
  86. package/resources/node-bacnet/package.json +92 -0
  87. package/resources/primeicons.css +90 -2
  88. package/resources/bacstack/.codeclimate.yml +0 -15
  89. package/resources/bacstack/.dockerignore +0 -5
  90. package/resources/bacstack/.editorconfig +0 -13
  91. package/resources/bacstack/.eslintrc.yml +0 -13
  92. package/resources/bacstack/.github/ISSUE_TEMPLATE.md +0 -26
  93. package/resources/bacstack/.github/PULL_REQUEST_TEMPLATE.md +0 -14
  94. package/resources/bacstack/.github/workflows/ci.yml +0 -39
  95. package/resources/bacstack/.jscsrc +0 -8
  96. package/resources/bacstack/.jshintrc +0 -50
  97. package/resources/bacstack/.travis.yml +0 -27
  98. package/resources/bacstack/CHANGELOG.md +0 -232
  99. package/resources/bacstack/CODE_OF_CONDUCT.md +0 -74
  100. package/resources/bacstack/CONTRIBUTING.md +0 -77
  101. package/resources/bacstack/Dockerfile +0 -15
  102. package/resources/bacstack/FAQ.md +0 -64
  103. package/resources/bacstack/README.md +0 -157
  104. package/resources/bacstack/docker-compose.yml +0 -9
  105. package/resources/bacstack/lib/adpu.js +0 -190
  106. package/resources/bacstack/lib/bvlc.js +0 -43
  107. package/resources/bacstack/lib/client.js +0 -1028
  108. package/resources/bacstack/lib/enum.js +0 -1314
  109. package/resources/bacstack/lib/npdu.js +0 -119
  110. package/resources/bacstack/lib/services/i-am-broadcast.js +0 -51
  111. package/resources/bacstack/lib/services.js +0 -1963
  112. package/resources/bacstack/lib/transport.js +0 -52
  113. package/resources/bacstack/package-lock.json +0 -7974
  114. package/resources/bacstack/package.json +0 -84
  115. package/resources/bacstack/test/compliance/who-is.spec.js +0 -37
  116. package/resources/bacstack/test/integration/acknowledge-alarm.spec.js +0 -14
  117. package/resources/bacstack/test/integration/add-list-element.spec.js +0 -16
  118. package/resources/bacstack/test/integration/confirmed-event-notification.spec.js +0 -30
  119. package/resources/bacstack/test/integration/confirmed-private-transfer.spec.js +0 -15
  120. package/resources/bacstack/test/integration/create-object.spec.js +0 -16
  121. package/resources/bacstack/test/integration/delete-object.spec.js +0 -14
  122. package/resources/bacstack/test/integration/device-communication-control.spec.js +0 -14
  123. package/resources/bacstack/test/integration/get-alarm-summary.spec.js +0 -14
  124. package/resources/bacstack/test/integration/get-enrollment-summary.spec.js +0 -15
  125. package/resources/bacstack/test/integration/get-event-information.spec.js +0 -14
  126. package/resources/bacstack/test/integration/read-file.spec.js +0 -14
  127. package/resources/bacstack/test/integration/read-property-multiple.spec.js +0 -110
  128. package/resources/bacstack/test/integration/read-property.spec.js +0 -14
  129. package/resources/bacstack/test/integration/read-range.spec.js +0 -14
  130. package/resources/bacstack/test/integration/reinitialize-sevice.spec.js +0 -14
  131. package/resources/bacstack/test/integration/remove-list-element.spec.js +0 -16
  132. package/resources/bacstack/test/integration/subscribe-cov.spec.js +0 -14
  133. package/resources/bacstack/test/integration/subscribe-property.spec.js +0 -14
  134. package/resources/bacstack/test/integration/time-sync-utc.spec.js +0 -10
  135. package/resources/bacstack/test/integration/time-sync.spec.js +0 -10
  136. package/resources/bacstack/test/integration/unconfirmed-event-notification.spec.js +0 -28
  137. package/resources/bacstack/test/integration/unconfirmed-private-transfer.spec.js +0 -11
  138. package/resources/bacstack/test/integration/utils.js +0 -30
  139. package/resources/bacstack/test/integration/who-is.spec.js +0 -17
  140. package/resources/bacstack/test/integration/write-file.spec.js +0 -14
  141. package/resources/bacstack/test/integration/write-property-multiple.spec.js +0 -19
  142. package/resources/bacstack/test/integration/write-property.spec.js +0 -14
  143. package/resources/bacstack/test/unit/apdu.spec.js +0 -162
  144. package/resources/bacstack/test/unit/asn1.spec.js +0 -39
  145. package/resources/bacstack/test/unit/bacnet-apdu.spec.js +0 -161
  146. package/resources/bacstack/test/unit/bacnet-asn1.spec.js +0 -32
  147. package/resources/bacstack/test/unit/bacnet-bvlc.spec.js +0 -57
  148. package/resources/bacstack/test/unit/bacnet-npdu.spec.js +0 -118
  149. package/resources/bacstack/test/unit/bacnet-services.spec.js +0 -2052
  150. package/resources/bacstack/test/unit/bvlc.spec.js +0 -58
  151. package/resources/bacstack/test/unit/npdu.spec.js +0 -119
  152. package/resources/bacstack/test/unit/service-add-list-element.spec.js +0 -24
  153. package/resources/bacstack/test/unit/service-alarm-acknowledge.spec.js +0 -71
  154. package/resources/bacstack/test/unit/service-alarm-summary.spec.js +0 -22
  155. package/resources/bacstack/test/unit/service-atomic-read-file.spec.js +0 -54
  156. package/resources/bacstack/test/unit/service-atomic-write-file.spec.js +0 -56
  157. package/resources/bacstack/test/unit/service-cov-notify.spec.js +0 -98
  158. package/resources/bacstack/test/unit/service-create-object.spec.js +0 -90
  159. package/resources/bacstack/test/unit/service-delete-object.spec.js +0 -17
  160. package/resources/bacstack/test/unit/service-device-communication-control.spec.js +0 -29
  161. package/resources/bacstack/test/unit/service-error.spec.js +0 -17
  162. package/resources/bacstack/test/unit/service-event-information.spec.js +0 -48
  163. package/resources/bacstack/test/unit/service-event-notify-data.spec.js +0 -310
  164. package/resources/bacstack/test/unit/service-get-enrollment-summary.spec.js +0 -45
  165. package/resources/bacstack/test/unit/service-get-event-information.spec.js +0 -62
  166. package/resources/bacstack/test/unit/service-i-am.spec.js +0 -19
  167. package/resources/bacstack/test/unit/service-i-have-broadcast.spec.js +0 -18
  168. package/resources/bacstack/test/unit/service-life-safety-operation.spec.js +0 -19
  169. package/resources/bacstack/test/unit/service-private-transfer.spec.js +0 -18
  170. package/resources/bacstack/test/unit/service-read-property-multiple.spec.js +0 -131
  171. package/resources/bacstack/test/unit/service-read-property.spec.js +0 -541
  172. package/resources/bacstack/test/unit/service-read-range.spec.js +0 -97
  173. package/resources/bacstack/test/unit/service-reinitialize-device.spec.js +0 -27
  174. package/resources/bacstack/test/unit/service-subscribe-cov.spec.js +0 -32
  175. package/resources/bacstack/test/unit/service-subscribe-property.spec.js +0 -50
  176. package/resources/bacstack/test/unit/service-time-sync.spec.js +0 -18
  177. package/resources/bacstack/test/unit/service-who-has.spec.js +0 -33
  178. package/resources/bacstack/test/unit/service-who-is.spec.js +0 -17
  179. package/resources/bacstack/test/unit/service-write-property-multiple.spec.js +0 -143
  180. package/resources/bacstack/test/unit/service-write-property.spec.js +0 -198
  181. package/resources/bacstack/test/unit/utils.js +0 -6
package/bacnet_gateway.js CHANGED
@@ -4,7 +4,9 @@
4
4
 
5
5
  module.exports = function (RED) {
6
6
  const { BacnetClient } = require('./bacnet_client');
7
- const { BacnetClientConfig, getIpAddress } = require('./common');
7
+ const { BacnetClientConfig, getIpAddress, doNodeRedRestart } = require('./common');
8
+ const { exec } = require("child_process");
9
+ const { BacnetServer } = require("./bacnet_server.js");
8
10
 
9
11
  function BitpoolBacnetGatewayDevice (config) {
10
12
  RED.nodes.createNode(this, config);
@@ -23,6 +25,16 @@ module.exports = function (RED) {
23
25
  this.device_id_range_enabled = config.device_id_range_enabled;
24
26
  this.device_id_range_start = config.device_id_range_start;
25
27
  this.device_id_range_end = config.device_id_range_end;
28
+ this.manual_instance_range_enabled = config.manual_instance_range_enabled,
29
+ this.manual_instance_range_start = config.manual_instance_range_start,
30
+ this.manual_instance_range_end = config.manual_instance_range_end,
31
+ this.nodeName = config.name;
32
+ this.toRestartNodeRed = config.toRestartNodeRed;
33
+ this.deviceId = config.deviceId;
34
+ this.logErrorToConsole = config.logErrorToConsole;
35
+ this.bacnetServerEnabled = config.serverEnabled;
36
+ this.bacnetServerRebuildSchedule = config.bacnetServerRebuildSchedule;
37
+ this.bacnetServer = nodeContext.get("bacnetServer") || null;
26
38
 
27
39
  //client and config store
28
40
  this.bacnetConfig = nodeContext.get("bacnetConfig");
@@ -56,56 +68,103 @@ module.exports = function (RED) {
56
68
  node.discover_polling_schedule,
57
69
  node.device_id_range_enabled,
58
70
  node.device_id_range_start,
59
- node.device_id_range_end
71
+ node.device_id_range_end,
72
+ node.toRestartNodeRed,
73
+ node.deviceId,
74
+ node.manual_instance_range_enabled,
75
+ node.manual_instance_range_start,
76
+ node.manual_instance_range_end,
77
+ node.bacnetServerEnabled
60
78
  );
79
+
61
80
  nodeContext.set("bacnetConfig", node.bacnetConfig);
62
81
 
63
82
  if(typeof node.bacnetClient !== 'undefined') {
64
- node.bacnetClient.reinitializeClient(node.bacnetConfig);
65
83
  node.bacnetClient.removeAllListeners();
66
84
  bindEventListeners();
85
+ node.bacnetClient.reinitializeClient(node.bacnetConfig);
67
86
  } else {
68
87
  node.bacnetClient = new BacnetClient(node.bacnetConfig);
69
88
  nodeContext.set("bacnetClient", node.bacnetClient);
70
89
  }
90
+
91
+ if(node.bacnetServerEnabled == true && node.bacnetClient && node.bacnetServer) {
92
+ node.bacnetServer.deviceId = node.deviceId;
93
+ }
94
+ }
95
+
96
+ node.bacnetClient.bacnetServerEnabled = node.bacnetServerEnabled;
97
+
98
+ if(node.bacnetServerEnabled == true && node.bacnetClient) {
99
+ if(node.bacnetServer == null) {
100
+ node.bacnetServer = new BacnetServer(node.bacnetClient, node.deviceId, node.bacnetServerRebuildSchedule, RED.version());
101
+ nodeContext.set("bacnetServer", node.bacnetServer);
102
+ }
103
+ } else if(node.bacnetServerEnabled == false) {
104
+ node.bacnetServer = null;
71
105
  }
72
106
 
73
107
  // Clears event handlers of all listeners, avoiding memory leak
74
108
  node.bacnetClient.removeAllListeners();
75
109
 
76
- //bindEventListeners();
77
-
78
110
  // Value response event handler for READ commands
79
- node.bacnetClient.on('values', (device, values, outputType, msgId, fullResult) => {
111
+ node.bacnetClient.on('values', (values, outputType, objectPropertyType) => {
80
112
  if(typeof values !== 'undefined' && Object.keys(values).length) {
81
113
  if (outputType.json && !outputType.mqtt) {
82
- node.send(values);
114
+ if(objectPropertyType.fullObject && objectPropertyType.simplePayload) {
115
+ sendSimpleJson(values);
116
+ sendJsonAsMqtt(values);
117
+ } else if(objectPropertyType.fullObject && !objectPropertyType.simplePayload) {
118
+ sendJsonAsMqtt(values);
119
+ } else if(!objectPropertyType.fullObject && objectPropertyType.simplePayload) {
120
+ sendSimpleJson(values);
121
+ }
83
122
  } else if(!outputType.json && outputType.mqtt) {
84
- sendAsMqtt(values);
85
- } else if(outputType.json && outputType.mqtt) {
86
- node.send(values);
87
- sendAsMqtt(values);
123
+ if(objectPropertyType.fullObject && objectPropertyType.simplePayload) {
124
+ sendAsMqtt(values);
125
+ sendSimpleMqtt(values);
126
+ } else if(objectPropertyType.fullObject && !objectPropertyType.simplePayload) {
127
+ sendAsMqtt(values);
128
+ } else if(!objectPropertyType.fullObject && objectPropertyType.simplePayload) {
129
+ sendSimpleMqtt(values);
130
+ }
88
131
  }
89
132
  }
90
133
  });
91
134
 
92
135
  // Who Is / Iam event handler
93
136
  node.bacnetClient.on('deviceFound', (device) => {
94
- if(node.toLogIam) node.warn(`Device found: ${device.address}`);
137
+ if(node.toLogIam) {
138
+ if(device.header.source) {
139
+ node.warn(`BACnet-MS/TP device found: ${device.payload.deviceId} - ${device.header.sender.address} - Network Id: ${device.header.source.net} - Mac: ${device.header.source.adr[0]}`);
140
+ } else {
141
+ node.warn(`BACnet device found: ${device.payload.deviceId} - ${device.header.sender.address}`);
142
+ }
143
+ }
144
+ });
145
+
146
+ node.bacnetClient.on('bacnetErrorLog', (param1, param2) => {
147
+ logOut(param1, param2);
95
148
  });
96
149
 
97
150
  node.status({});
98
151
 
99
152
  } else {
100
- console.log("Issue with client info: ", node);
101
153
  // No client information found
102
154
  node.status({fill:"red",shape:"dot",text:"Please define client"})
103
155
  }
104
156
 
105
157
  node.on('input', function(msg) {
158
+
159
+ if(msg.topic && msg.payload) {
160
+ if(node.bacnetServer) {
161
+ node.bacnetServer.addObject(msg.topic, msg.payload);
162
+ }
163
+ }
164
+
106
165
  if(msg.type == "Read") {
107
166
 
108
- node.bacnetClient.doRead(msg.options, msg.outputType, msg._msgid);
167
+ node.bacnetClient.doRead(msg.options, msg.outputType, msg.objectPropertyType, msg._msgid);
109
168
 
110
169
  } else if(msg.type == "Write") {
111
170
 
@@ -114,7 +173,7 @@ module.exports = function (RED) {
114
173
 
115
174
  } else if(msg.doDiscover == true) {
116
175
 
117
- node.status({fill:"blue",shape:"dot",text:"Forcing a global Who is"})
176
+ node.status({fill:"blue",shape:"dot",text:"Sending global Who is"})
118
177
 
119
178
  node.bacnetClient.globalWhoIs();
120
179
 
@@ -130,7 +189,7 @@ module.exports = function (RED) {
130
189
  //route handler for network data
131
190
  RED.httpAdmin.get('/bitpool-bacnet-data/getNetworkTree', function(req, res) {
132
191
  if(!node.bacnetClient) {
133
- console.log("Issue with the bacnetClient: ", node.bacnetClient);
192
+ logOut("Issue with the bacnetClient: ", node.bacnetClient);
134
193
  //no bacnet client present
135
194
  node.status({fill:"red",shape:"dot",text:"Please define client"});
136
195
  res.send(false);
@@ -139,7 +198,24 @@ module.exports = function (RED) {
139
198
  res.send(result);
140
199
  }).catch(function(error) {
141
200
  res.send(error);
142
- console.log("Error getting network data: ", error);
201
+ logOut("Error getting network data: ", error);
202
+ });
203
+ }
204
+ });
205
+
206
+ //route handler for rebuild data model command
207
+ RED.httpAdmin.get('/bitpool-bacnet-data/rebuildDataModel', function(req, res) {
208
+ if(!node.bacnetClient) {
209
+ logOut("Issue with the bacnetClient: ", node.bacnetClient);
210
+ //no bacnet client present
211
+ node.status({fill:"red",shape:"dot",text:"Please define client"});
212
+ res.send(false);
213
+ } else {
214
+ node.bacnetClient.rebuildDataModel().then(function(result) {
215
+ res.send(result);
216
+ }).catch(function(error) {
217
+ res.send(error);
218
+ logOut("Error getting network data: ", error);
143
219
  });
144
220
  }
145
221
  });
@@ -149,7 +225,7 @@ module.exports = function (RED) {
149
225
  getIpAddress().then(function(result) {
150
226
  res.send(result);
151
227
  }).catch(function(error) {
152
- console.log("Error getting network interfaces for client: ", error);
228
+ logOut("Error getting network interfaces for client: ", error);
153
229
  });
154
230
  });
155
231
 
@@ -160,24 +236,45 @@ module.exports = function (RED) {
160
236
  function bindEventListeners() {
161
237
  // Value response event handler for READ commands
162
238
  node.bacnetClient.on('values', (device, values, outputType, msgId, fullResult) => {
163
- if(typeof values !== 'undefined' && Object.keys(values).length) {
164
- if (outputType.json && !outputType.mqtt) {
165
- node.send(values);
166
- } else if(!outputType.json && outputType.mqtt) {
239
+ if (outputType.json && !outputType.mqtt) {
240
+ if(objectPropertyType.fullObject && objectPropertyType.simplePayload) {
241
+ sendSimpleJson(values);
242
+ sendJsonAsMqtt(values);
243
+ } else if(objectPropertyType.fullObject && !objectPropertyType.simplePayload) {
244
+ sendJsonAsMqtt(values);
245
+ } else if(!objectPropertyType.fullObject && objectPropertyType.simplePayload) {
246
+ sendSimpleJson(values);
247
+ }
248
+ } else if(!outputType.json && outputType.mqtt) {
249
+ if(objectPropertyType.fullObject && objectPropertyType.simplePayload) {
167
250
  sendAsMqtt(values);
168
- } else if(outputType.json && outputType.mqtt) {
169
- node.send(values);
251
+ sendSimpleMqtt(values);
252
+ } else if(objectPropertyType.fullObject && !objectPropertyType.simplePayload) {
170
253
  sendAsMqtt(values);
254
+ } else if(!objectPropertyType.fullObject && objectPropertyType.simplePayload) {
255
+ sendSimpleMqtt(values);
171
256
  }
172
257
  }
173
258
  });
174
259
 
175
260
  // Who Is / Iam event handler
176
261
  node.bacnetClient.on('deviceFound', (device) => {
177
- if(node.toLogIam) node.warn(`Device found: ${device.address}`);
262
+ if(node.toLogIam) node.warn(`BACnet device found: ${device.deviceId} - ${device.address}`);
178
263
  });
179
264
  }
180
265
 
266
+ function logOut(param1, param2) {
267
+ if(node.logErrorToConsole == true) {
268
+ if(arguments.length == 1) {
269
+ console.log("BACnet Error: ");
270
+ console.log(param1);
271
+ } else if(arguments.length == 2) {
272
+ console.log("BACnet Error: ");
273
+ console.log(param1, param2);
274
+ }
275
+ }
276
+ }
277
+
181
278
  // Returns true if any config values have changed
182
279
  function configHasChanged() {
183
280
  if(node.bacnetConfig == null){ return true;}
@@ -191,10 +288,44 @@ module.exports = function (RED) {
191
288
  if(node.device_id_range_enabled !== node.bacnetConfig.device_id_range_enabled){ return true;}
192
289
  if(node.device_id_range_start !== node.bacnetConfig.device_id_range_start){ return true;}
193
290
  if(node.device_id_range_end !== node.bacnetConfig.device_id_range_end){ return true;}
194
-
291
+ if(node.toRestartNodeRed !== node.bacnetConfig.toRestartNodeRed){ return true;}
292
+ if(node.manual_instance_range_enabled !== node.bacnetConfig.manual_instance_range_enabled){ return true;}
293
+ if(node.manual_instance_range_start !== node.bacnetConfig.manual_instance_range_start){ return true;}
294
+ if(node.manual_instance_range_end !== node.bacnetConfig.manual_instance_range_end){ return true;}
295
+ if(node.bacnetServerEnabled !== node.bacnetConfig.bacnetServerEnabled){ return true;}
296
+ if(node.deviceId !== node.bacnetConfig.deviceId){ return true;}
297
+
195
298
  return false;
196
299
  };
197
300
 
301
+ sendSimpleMqtt = function(values) {
302
+ let devices = Object.keys(values);
303
+ devices.forEach(function(device) {
304
+ if(device !== "_msgid") {
305
+ let points = values[device];
306
+ for(var point in points) {
307
+ let pointProps = Object.keys(points[point]);
308
+ pointProps.forEach(function(prop) {
309
+ let msg = {};
310
+ if(prop == "presentValue") {
311
+ if(node.nodeName !== "gateway" &&
312
+ node.nodeName !== "" &&
313
+ node.nodeName !== "null" &&
314
+ node.nodeName !== "undefined" &&
315
+ typeof node.nodeName == "string") {
316
+ msg.topic = `${node.nodeName}/${device}/${point}`;
317
+ } else {
318
+ msg.topic = `BITPOOL_BACNET_GATEWAY/${device}/${point}`;
319
+ }
320
+ msg.payload = points[point][prop];
321
+ node.send(msg);
322
+ }
323
+ });
324
+ }
325
+ }
326
+ });
327
+ };
328
+
198
329
  // Breaks down response JSON object into mqtt topic / payload
199
330
  sendAsMqtt = function(values) {
200
331
  let devices = Object.keys(values);
@@ -206,7 +337,15 @@ module.exports = function (RED) {
206
337
  pointProps.forEach(function(prop) {
207
338
  let msg = {};
208
339
  if(prop !== "objectName") {
209
- msg.topic = `BITPOOL_EDGE_BACNET/${device}/${point}/${prop}`;
340
+ if(node.nodeName !== "gateway" &&
341
+ node.nodeName !== "" &&
342
+ node.nodeName !== "null" &&
343
+ node.nodeName !== "undefined" &&
344
+ typeof node.nodeName == "string") {
345
+ msg.topic = `${node.nodeName}/${device}/${point}/${prop}`;
346
+ } else {
347
+ msg.topic = `BITPOOL_BACNET_GATEWAY/${device}/${point}/${prop}`;
348
+ }
210
349
  msg.payload = points[point][prop];
211
350
  node.send(msg);
212
351
  }
@@ -216,6 +355,51 @@ module.exports = function (RED) {
216
355
  });
217
356
  };
218
357
 
358
+ sendSimpleJson = function(values) {
359
+ let devices = Object.keys(values);
360
+ devices.forEach(function(device) {
361
+ if(device !== "_msgid") {
362
+ let value = {
363
+ [device]: {}
364
+ };
365
+ let points = values[device];
366
+ for(var point in points) {
367
+ let pointProps = Object.keys(points[point]);
368
+ pointProps.forEach(function(prop) {
369
+ if(prop == "presentValue") {
370
+ value[device][point] = {
371
+ "presentValue": points[point][prop]
372
+ };
373
+ }
374
+ });
375
+ }
376
+ node.send(value);
377
+ }
378
+ });
379
+ };
380
+
381
+ sendJsonAsMqtt = function(values) {
382
+ if(typeof values == "object") {
383
+ let keys = Object.keys(values);
384
+ keys.forEach(function(key) {
385
+ let points = values[key];
386
+ let msgg = {};
387
+
388
+ if(node.nodeName !== "gateway" &&
389
+ node.nodeName !== "" &&
390
+ node.nodeName !== "null" &&
391
+ node.nodeName !== "undefined" &&
392
+ typeof node.nodeName == "string") {
393
+ msgg.topic = `${node.nodeName}/${key}`;
394
+ } else {
395
+ msgg.topic = `BITPOOL_BACNET_GATEWAY/${key}`;
396
+ }
397
+ msgg.payload = points;
398
+ node.send(msgg);
399
+ });
400
+ }
401
+ };
402
+
219
403
  };
220
404
 
221
405
  RED.nodes.registerType('Bacnet-Gateway', BitpoolBacnetGatewayDevice);
package/bacnet_object.js CHANGED
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  module.exports = function (RED) {
6
- const baEnum = require('./resources/bacstack/lib/enum');
6
+ const baEnum = require('./resources/node-bacnet/index.js').enum;
7
7
  function BitpoolBacnetObject (config) {
8
8
  RED.nodes.createNode(this, config)
9
9