@bitpoolos/edge-bacnet 1.2.5 → 1.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bacnet_gateway.js CHANGED
@@ -3,8 +3,8 @@
3
3
  */
4
4
 
5
5
  module.exports = function (RED) {
6
- const { BacnetClient } = require('./bacnet_client');
7
- const { BacnetClientConfig, getIpAddress, doNodeRedRestart } = require('./common');
6
+ const { BacnetClient } = require("./bacnet_client");
7
+ const { BacnetClientConfig, getIpAddress } = require("./common");
8
8
  const { exec } = require("child_process");
9
9
  const { BacnetServer } = require("./bacnet_server.js");
10
10
 
@@ -23,12 +23,9 @@ module.exports = function (RED) {
23
23
  this.broadCastAddr = config.broadCastAddr;
24
24
  this.discover_polling_schedule = config.discover_polling_schedule;
25
25
  this.device_read_schedule = config.device_read_schedule;
26
- this.device_id_range_enabled = config.device_id_range_enabled;
27
- this.device_id_range_start = config.device_id_range_start;
28
- this.device_id_range_end = config.device_id_range_end;
29
- this.manual_instance_range_enabled = config.manual_instance_range_enabled,
30
- this.manual_instance_range_start = config.manual_instance_range_start,
31
- this.manual_instance_range_end = config.manual_instance_range_end,
26
+ this.manual_instance_range_enabled = config.manual_instance_range_enabled;
27
+ this.manual_instance_range_start = config.manual_instance_range_start;
28
+ this.manual_instance_range_end = config.manual_instance_range_end;
32
29
  this.nodeName = config.name;
33
30
  this.toRestartNodeRed = config.toRestartNodeRed;
34
31
  this.deviceId = config.deviceId;
@@ -36,6 +33,8 @@ module.exports = function (RED) {
36
33
  this.bacnetServerEnabled = config.serverEnabled;
37
34
  this.retries = config.retries;
38
35
  this.bacnetServer = nodeContext.get("bacnetServer") || null;
36
+ this.deviceRangeRegisters = config.deviceRangeRegisters;
37
+ this.cacheFileEnabled = config.cacheFileEnabled;
39
38
 
40
39
  //client and config store
41
40
  this.bacnetConfig = nodeContext.get("bacnetConfig");
@@ -56,21 +55,19 @@ module.exports = function (RED) {
56
55
  node.maxSegments,
57
56
  node.broadCastAddr,
58
57
  node.discover_polling_schedule,
59
- node.device_id_range_enabled,
60
- node.device_id_range_start,
61
- node.device_id_range_end,
62
58
  node.toRestartNodeRed,
63
59
  node.deviceId,
64
60
  node.manual_instance_range_enabled,
65
61
  node.manual_instance_range_start,
66
62
  node.manual_instance_range_end,
67
63
  node.device_read_schedule,
68
- node.retries
64
+ node.retries,
65
+ node.cacheFileEnabled
69
66
  );
70
67
 
71
68
  nodeContext.set("bacnetConfig", node.bacnetConfig);
72
69
 
73
- if (typeof node.bacnetClient !== 'undefined') {
70
+ if (typeof node.bacnetClient !== "undefined") {
74
71
  node.bacnetClient.removeAllListeners();
75
72
  bindEventListeners();
76
73
  node.bacnetClient.reinitializeClient(node.bacnetConfig);
@@ -79,6 +76,8 @@ module.exports = function (RED) {
79
76
  nodeContext.set("bacnetClient", node.bacnetClient);
80
77
  }
81
78
 
79
+ node.bacnetClient.scanMatrix = node.deviceRangeRegisters.filter((ele) => ele.enabled === true);
80
+
82
81
  if (node.bacnetServerEnabled == true && node.bacnetClient && node.bacnetServer) {
83
82
  node.bacnetServer.deviceId = node.deviceId;
84
83
  }
@@ -87,7 +86,6 @@ module.exports = function (RED) {
87
86
 
88
87
  if (node.bacnetServerEnabled == true && node.bacnetClient) {
89
88
  if (node.bacnetServer == null) {
90
-
91
89
  node.bacnetServer = new BacnetServer(node.bacnetClient, node.deviceId, RED.version());
92
90
  nodeContext.set("bacnetServer", node.bacnetServer);
93
91
  }
@@ -99,57 +97,60 @@ module.exports = function (RED) {
99
97
  node.bacnetClient.removeAllListeners();
100
98
 
101
99
  // Value response event handler for READ commands
102
- node.bacnetClient.on('values', (values, outputType, objectPropertyType) => {
103
- if (typeof values !== 'undefined' && Object.keys(values).length) {
100
+ node.bacnetClient.on("values", (values, outputType, objectPropertyType, readNodeName) => {
101
+ if (typeof values !== "undefined" && Object.keys(values).length) {
104
102
  if (outputType.json && !outputType.mqtt) {
105
103
  if (objectPropertyType.fullObject && objectPropertyType.simplePayload) {
106
- sendSimpleJson(values);
107
- sendJsonAsMqtt(values);
104
+ sendSimpleJson(values, readNodeName);
105
+ sendJsonAsMqtt(values, readNodeName);
108
106
  } else if (objectPropertyType.fullObject && !objectPropertyType.simplePayload) {
109
- sendJsonAsMqtt(values);
107
+ sendJsonAsMqtt(values, readNodeName);
110
108
  } else if (!objectPropertyType.fullObject && objectPropertyType.simplePayload) {
111
- sendSimpleJson(values);
109
+ sendSimpleJson(values, readNodeName);
112
110
  }
113
111
  } else if (!outputType.json && outputType.mqtt) {
114
112
  if (objectPropertyType.fullObject && objectPropertyType.simplePayload) {
115
- sendAsMqtt(values);
116
- sendSimpleMqtt(values);
113
+ sendAsMqtt(values, readNodeName);
114
+ sendSimpleMqtt(values, readNodeName);
117
115
  } else if (objectPropertyType.fullObject && !objectPropertyType.simplePayload) {
118
- sendAsMqtt(values);
116
+ sendAsMqtt(values, readNodeName);
119
117
  } else if (!objectPropertyType.fullObject && objectPropertyType.simplePayload) {
120
- sendSimpleMqtt(values);
118
+ sendSimpleMqtt(values, readNodeName);
121
119
  }
122
120
  }
123
121
  }
124
122
  });
125
123
 
126
124
  // Who Is / Iam event handler
127
- node.bacnetClient.on('deviceFound', (device) => {
125
+ node.bacnetClient.on("deviceFound", (device) => {
128
126
  if (node.toLogIam) {
129
127
  if (device.source) {
130
- node.warn(`BACnet-MS/TP device found: ${device.deviceId} - ${device.address} - Network Id: ${device.source.net} - Mac: ${device.source.adr[0]}`);
128
+ node.warn(
129
+ `BACnet-MS/TP device found: ${device.deviceId} - ${device.address} - Network Id: ${device.source.net} - Mac: ${device.source.adr[0]}`
130
+ );
131
131
  } else {
132
132
  node.warn(`BACnet device found: ${device.deviceId} - ${device.address}`);
133
133
  }
134
134
  }
135
135
  });
136
136
 
137
- node.bacnetClient.on('bacnetErrorLog', (param1, param2) => {
137
+ node.bacnetClient.on("bacnetErrorLog", (param1, param2) => {
138
138
  logOut(param1, param2);
139
139
  });
140
140
 
141
- if (node.nodeName !== "gateway" &&
141
+ if (
142
+ node.nodeName !== "gateway" &&
142
143
  node.nodeName !== "" &&
143
144
  node.nodeName !== "null" &&
144
145
  node.nodeName !== "undefined" &&
145
- typeof node.nodeName == "string") {
146
+ typeof node.nodeName == "string"
147
+ ) {
146
148
  if (node.bacnetServerEnabled == true && node.bacnetClient) {
147
149
  node.bacnetServer.setDeviceName(node.nodeName);
148
150
  }
149
151
  }
150
152
 
151
- node.on('input', function (msg) {
152
-
153
+ node.on("input", function (msg) {
153
154
  if (msg.topic && msg.payload !== null) {
154
155
  if (node.bacnetServer) {
155
156
  node.bacnetServer.addObject(msg.topic, msg.payload);
@@ -157,71 +158,76 @@ module.exports = function (RED) {
157
158
  }
158
159
 
159
160
  if (msg.type == "Read") {
160
-
161
- node.bacnetClient.doRead(msg.options, msg.outputType, msg.objectPropertyType, msg._msgid);
162
-
161
+ node.bacnetClient.doRead(msg.options, msg.outputType, msg.objectPropertyType, msg.readNodeName);
163
162
  } else if (msg.type == "Write") {
164
-
165
- node.bacnetClient.doWrite(msg.value, msg.options).then(function (result) {
166
- });
167
-
163
+ node.bacnetClient.doWrite(msg.value, msg.options);
168
164
  } else if (msg.doDiscover == true) {
169
-
170
- node.status({ fill: "blue", shape: "dot", text: "Sending global Who is" })
171
-
165
+ node.status({ fill: "blue", shape: "dot", text: "Sending global Who is" });
172
166
  node.bacnetClient.globalWhoIs();
173
-
174
167
  setTimeout(() => {
175
- node.status({})
168
+ node.status({});
176
169
  }, 2000);
177
170
  } else if (msg.payload == "BindEvents") {
178
171
  node.bacnetClient.removeAllListeners();
179
172
  bindEventListeners();
180
173
  } else if (msg.doUpdatePriorityDevices == true && msg.priorityDevices !== null) {
181
- node.bacnetClient.updatePriorityQueue(msg.priorityDevices).then(function (result) {
182
- }).catch(function (error) {
183
- logOut("Error updating priorityQueue: ", error);
184
- });
174
+ node.bacnetClient
175
+ .updatePriorityQueue(msg.priorityDevices)
176
+ .then(function (result) {})
177
+ .catch(function (error) {
178
+ logOut("Error updating priorityQueue: ", error);
179
+ });
180
+ } else if (msg.testFunc == true) {
181
+ node.bacnetClient.testFunction();
185
182
  }
183
+ });
186
184
 
185
+ node.on("close", function () {
186
+ //do nothing
187
187
  });
188
188
 
189
189
  //route handler for network data
190
- RED.httpAdmin.get('/bitpool-bacnet-data/getNetworkTree', function (req, res) {
190
+ RED.httpAdmin.get("/bitpool-bacnet-data/getNetworkTree", function (req, res) {
191
191
  if (!node.bacnetClient) {
192
192
  logOut("Issue with the bacnetClient: ", node.bacnetClient);
193
193
  //no bacnet client present
194
194
  //node.status({fill:"red",shape:"dot",text:"Please define client"});
195
195
  res.send(false);
196
196
  } else {
197
- node.bacnetClient.getNetworkTreeData().then(function (result) {
198
- res.send(result);
199
- }).catch(function (error) {
200
- res.send(error);
201
- logOut("Error getting network data: ", error);
202
- });
197
+ node.bacnetClient
198
+ .getNetworkTreeData()
199
+ .then(function (result) {
200
+ res.send(result);
201
+ })
202
+ .catch(function (error) {
203
+ res.send(error);
204
+ logOut("Error getting network data: ", error);
205
+ });
203
206
  }
204
207
  });
205
208
 
206
209
  //route handler for rebuild data model command
207
- RED.httpAdmin.get('/bitpool-bacnet-data/rebuildDataModel', function (req, res) {
210
+ RED.httpAdmin.get("/bitpool-bacnet-data/rebuildDataModel", function (req, res) {
208
211
  if (!node.bacnetClient) {
209
212
  logOut("Issue with the bacnetClient: ", node.bacnetClient);
210
213
  //no bacnet client present
211
214
  //node.status({fill:"red",shape:"dot",text:"Please define client"});
212
215
  res.send(false);
213
216
  } 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);
219
- });
217
+ node.bacnetClient
218
+ .rebuildDataModel()
219
+ .then(function (result) {
220
+ res.send(result);
221
+ })
222
+ .catch(function (error) {
223
+ res.send(error);
224
+ logOut("Error getting network data: ", error);
225
+ });
220
226
  }
221
227
  });
222
228
 
223
229
  //route handler for the clear Bacnet server points function
224
- RED.httpAdmin.get('/bitpool-bacnet-data/clearBacnetServerPoints', function (req, res) {
230
+ RED.httpAdmin.get("/bitpool-bacnet-data/clearBacnetServerPoints", function (req, res) {
225
231
  if (node.bacnetServerEnabled == true && node.bacnetClient) {
226
232
  node.bacnetServer.clearServerPoints();
227
233
  res.send(true);
@@ -230,75 +236,106 @@ module.exports = function (RED) {
230
236
  }
231
237
  });
232
238
 
233
- //route handler for network data
234
- RED.httpAdmin.get('/bitpool-bacnet-data/getNetworkInterfaces', function (req, res) {
235
- getIpAddress().then(function (result) {
239
+ //route handler for the clear Bacnet server point function
240
+ RED.httpAdmin.post('/bitpool-bacnet-data/clearBacnetServerPoint', function (req, res) {
241
+ if (node.bacnetServerEnabled == true && node.bacnetClient) {
242
+ node.bacnetServer.clearServerPoint(req).then(function (result) {
243
+ res.send(result);
244
+ }).catch(function (error) {
245
+ res.send(error);
246
+ });
247
+ } else {
236
248
  res.send(result);
237
- }).catch(function (error) {
238
- logOut("Error getting network interfaces for client: ", error);
239
- });
249
+ }
240
250
  });
241
251
 
242
- //route handler for getting device list
243
- RED.httpAdmin.get('/bitpool-bacnet-data/getDeviceList', function (req, res) {
244
- if (!node.bacnetClient) {
245
- logOut("Issue with the bacnetClient while getting device list: ", node.bacnetClient);
246
- res.send(false);
247
- } else {
248
- node.bacnetClient.getDeviceList().then(function (result) {
252
+ //route handler for the retrieve Bacnet server points function
253
+ RED.httpAdmin.get('/bitpool-bacnet-data/getBacnetServerPoints', function (req, res) {
254
+ if (node.bacnetServerEnabled == true && node.bacnetClient) {
255
+ node.bacnetServer.getServerPoints().then(function (result) {
249
256
  res.send(result);
250
257
  }).catch(function (error) {
251
258
  res.send(error);
252
- logOut("Error getting network data: ", error);
259
+ logOut("Error getting server points: ", error);
253
260
  });
261
+ } else {
262
+ res.send([]);
254
263
  }
255
264
  });
256
265
 
257
- //route handler for updating device list
258
- RED.httpAdmin.post('/bitpool-bacnet-data/updateDeviceList', function (req, res) {
266
+ //route handler for network data
267
+ RED.httpAdmin.get("/bitpool-bacnet-data/getNetworkInterfaces", function (req, res) {
268
+ getIpAddress()
269
+ .then(function (result) {
270
+ res.send(result);
271
+ })
272
+ .catch(function (error) {
273
+ logOut("Error getting network interfaces for client: ", error);
274
+ });
275
+ });
276
+
277
+ //route handler for getting device list
278
+ RED.httpAdmin.get("/bitpool-bacnet-data/getDeviceList", function (req, res) {
259
279
  if (!node.bacnetClient) {
260
280
  logOut("Issue with the bacnetClient while getting device list: ", node.bacnetClient);
261
281
  res.send(false);
262
282
  } else {
263
- node.bacnetClient.updateDeviceList(req).then(function (result) {
264
- res.send(result);
265
- }).catch(function (error) {
266
- res.send(error);
267
- logOut("Error getting network data: ", error);
268
- });
283
+ node.bacnetClient
284
+ .getDeviceList()
285
+ .then(function (result) {
286
+ res.send(result);
287
+ })
288
+ .catch(function (error) {
289
+ res.send(error);
290
+ logOut("Error getting network data: ", error);
291
+ });
269
292
  }
270
293
  });
271
294
 
272
- node.on('close', function () {
273
- //do nothing
295
+ //route handler for updating device list
296
+ RED.httpAdmin.post("/bitpool-bacnet-data/updateDeviceList", function (req, res) {
297
+ if (!node.bacnetClient) {
298
+ logOut("Issue with the bacnetClient while getting device list: ", node.bacnetClient);
299
+ res.send(false);
300
+ } else {
301
+ node.bacnetClient
302
+ .updateDeviceList(req)
303
+ .then(function (result) {
304
+ res.send(result);
305
+ })
306
+ .catch(function (error) {
307
+ res.send(error);
308
+ logOut("Error getting network data: ", error);
309
+ });
310
+ }
274
311
  });
275
312
 
276
313
  function bindEventListeners() {
277
314
  // Value response event handler for READ commands
278
- node.bacnetClient.on('values', (device, values, outputType, msgId, fullResult) => {
315
+ node.bacnetClient.on("values", (device, values, outputType, readNodeName, fullResult) => {
279
316
  if (outputType.json && !outputType.mqtt) {
280
317
  if (objectPropertyType.fullObject && objectPropertyType.simplePayload) {
281
- sendSimpleJson(values);
282
- sendJsonAsMqtt(values);
318
+ sendSimpleJson(values, readNodeName);
319
+ sendJsonAsMqtt(values, readNodeName);
283
320
  } else if (objectPropertyType.fullObject && !objectPropertyType.simplePayload) {
284
- sendJsonAsMqtt(values);
321
+ sendJsonAsMqtt(values, readNodeName);
285
322
  } else if (!objectPropertyType.fullObject && objectPropertyType.simplePayload) {
286
- sendSimpleJson(values);
323
+ sendSimpleJson(values, readNodeName);
287
324
  }
288
325
  } else if (!outputType.json && outputType.mqtt) {
289
326
  if (objectPropertyType.fullObject && objectPropertyType.simplePayload) {
290
- sendAsMqtt(values);
291
- sendSimpleMqtt(values);
327
+ sendAsMqtt(values, readNodeName);
328
+ sendSimpleMqtt(values, readNodeName);
292
329
  } else if (objectPropertyType.fullObject && !objectPropertyType.simplePayload) {
293
- sendAsMqtt(values);
330
+ sendAsMqtt(values, readNodeName);
294
331
  } else if (!objectPropertyType.fullObject && objectPropertyType.simplePayload) {
295
- sendSimpleMqtt(values);
332
+ sendSimpleMqtt(values, readNodeName);
296
333
  }
297
334
  }
298
335
  });
299
-
336
+
300
337
  // Who Is / Iam event handler
301
- node.bacnetClient.on('deviceFound', (device) => {
338
+ node.bacnetClient.on("deviceFound", (device) => {
302
339
  if (node.toLogIam) node.warn(`BACnet device found: ${device.deviceId} - ${device.address}`);
303
340
  });
304
341
  }
@@ -315,7 +352,7 @@ module.exports = function (RED) {
315
352
  }
316
353
  }
317
354
 
318
- sendSimpleMqtt = function (values) {
355
+ sendSimpleMqtt = function (values, readNodeName) {
319
356
  let devices = Object.keys(values);
320
357
  devices.forEach(function (device) {
321
358
  if (device !== "_msgid") {
@@ -326,29 +363,43 @@ module.exports = function (RED) {
326
363
  pointProps.forEach(function (prop) {
327
364
  let msg = {};
328
365
  if (prop == "presentValue") {
329
- if (node.nodeName !== "gateway" &&
366
+ if (
367
+ node.nodeName !== "gateway" &&
330
368
  node.nodeName !== "" &&
331
369
  node.nodeName !== "null" &&
332
370
  node.nodeName !== "undefined" &&
333
- typeof node.nodeName == "string") {
334
- msg.topic = `${node.nodeName}/${device}/${point}`;
371
+ typeof node.nodeName == "string"
372
+ ) {
373
+ if(readNodeName !== ''&&
374
+ readNodeName !== null &&
375
+ readNodeName !== undefined
376
+ ) {
377
+ msg.topic = `${node.nodeName}/${readNodeName}/${device}/${point}`;
378
+ } else {
379
+ msg.topic = `${node.nodeName}/${device}/${point}`;
380
+ }
335
381
  } else {
336
- msg.topic = `BITPOOL_BACNET_GATEWAY/${device}/${point}`;
382
+ if(readNodeName !== ''&&
383
+ readNodeName !== null &&
384
+ readNodeName !== undefined
385
+ ) {
386
+ msg.topic = `BITPOOL_BACNET_GATEWAY/${readNodeName}/${device}/${point}`;
387
+ } else {
388
+ msg.topic = `BITPOOL_BACNET_GATEWAY/${device}/${point}`;
389
+ }
337
390
  }
338
391
  msg.payload = points[point][prop];
339
392
  node.send(msg);
340
393
  }
341
394
  });
342
-
343
395
  }
344
396
  }
345
397
  }
346
398
  });
347
399
  };
348
400
 
349
-
350
401
  // Breaks down response JSON object into mqtt topic / payload
351
- sendAsMqtt = function (values) {
402
+ sendAsMqtt = function (values, readNodeName) {
352
403
  let devices = Object.keys(values);
353
404
  devices.forEach(function (device) {
354
405
  if (device !== "_msgid") {
@@ -359,14 +410,30 @@ module.exports = function (RED) {
359
410
  pointProps.forEach(function (prop) {
360
411
  let msg = {};
361
412
  if (prop !== "objectName") {
362
- if (node.nodeName !== "gateway" &&
413
+ if (
414
+ node.nodeName !== "gateway" &&
363
415
  node.nodeName !== "" &&
364
416
  node.nodeName !== "null" &&
365
417
  node.nodeName !== "undefined" &&
366
- typeof node.nodeName == "string") {
367
- msg.topic = `${node.nodeName}/${device}/${point}/${prop}`;
418
+ typeof node.nodeName == "string"
419
+ ) {
420
+ if(readNodeName !== ''&&
421
+ readNodeName !== null &&
422
+ readNodeName !== undefined
423
+ ) {
424
+ msg.topic = `${node.nodeName}/${readNodeName}/${device}/${point}/${prop}`;
425
+ } else {
426
+ msg.topic = `${node.nodeName}/${device}/${point}/${prop}`;
427
+ }
368
428
  } else {
369
- msg.topic = `BITPOOL_BACNET_GATEWAY/${device}/${point}/${prop}`;
429
+ if(readNodeName !== ''&&
430
+ readNodeName !== null &&
431
+ readNodeName !== undefined
432
+ ) {
433
+ msg.topic = `BITPOOL_BACNET_GATEWAY/${readNodeName}/${device}/${point}/${prop}`;
434
+ } else {
435
+ msg.topic = `BITPOOL_BACNET_GATEWAY/${device}/${point}/${prop}`;
436
+ }
370
437
  }
371
438
  msg.payload = points[point][prop];
372
439
  node.send(msg);
@@ -378,37 +445,51 @@ module.exports = function (RED) {
378
445
  });
379
446
  };
380
447
 
381
- sendSimpleJson = function (values) {
448
+ sendSimpleJson = function (values, readNodeName) {
382
449
  let devices = Object.keys(values);
383
450
  devices.forEach(function (device) {
384
451
  let msgg = {};
385
452
  if (device !== "_msgid") {
386
453
  let value = {
387
- [device]: {}
454
+ [device]: {},
388
455
  };
389
456
  let points = values[device];
390
-
391
457
  for (var point in points) {
392
458
  if (points[point]) {
393
459
  let pointProps = Object.keys(points[point]);
394
460
  pointProps.forEach(function (prop) {
395
461
  if (prop == "presentValue") {
396
462
  value[device][point] = {
397
- "presentValue": points[point][prop]
463
+ presentValue: points[point][prop],
398
464
  };
399
465
  }
400
466
  });
401
467
  }
402
-
403
468
  }
404
- if (node.nodeName !== "gateway" &&
469
+ if (
470
+ node.nodeName !== "gateway" &&
405
471
  node.nodeName !== "" &&
406
472
  node.nodeName !== "null" &&
407
473
  node.nodeName !== "undefined" &&
408
- typeof node.nodeName == "string") {
409
- msgg.topic = `${node.nodeName}/${device}`;
474
+ typeof node.nodeName == "string"
475
+ ) {
476
+ if(readNodeName !== ''&&
477
+ readNodeName !== null &&
478
+ readNodeName !== undefined
479
+ ) {
480
+ msgg.topic = `${node.nodeName}/${readNodeName}/${device}`;
481
+ } else {
482
+ msgg.topic = `${node.nodeName}/${device}`;
483
+ }
410
484
  } else {
411
- msgg.topic = `BITPOOL_BACNET_GATEWAY/${device}`;
485
+ if(readNodeName !== ''&&
486
+ readNodeName !== null &&
487
+ readNodeName !== undefined
488
+ ) {
489
+ msgg.topic = `BITPOOL_BACNET_GATEWAY/${readNodeName}/${device}`;
490
+ } else {
491
+ msgg.topic = `BITPOOL_BACNET_GATEWAY/${device}`;
492
+ }
412
493
  }
413
494
  msgg.payload = value[device];
414
495
  node.send(msgg);
@@ -416,29 +497,43 @@ module.exports = function (RED) {
416
497
  });
417
498
  };
418
499
 
419
- sendJsonAsMqtt = function (values) {
500
+ sendJsonAsMqtt = function (values, readNodeName) {
420
501
  if (typeof values == "object") {
421
502
  let keys = Object.keys(values);
422
503
  keys.forEach(function (key) {
423
504
  let points = values[key];
424
505
  let msgg = {};
425
-
426
- if (node.nodeName !== "gateway" &&
506
+ if (
507
+ node.nodeName !== "gateway" &&
427
508
  node.nodeName !== "" &&
428
509
  node.nodeName !== "null" &&
429
510
  node.nodeName !== "undefined" &&
430
- typeof node.nodeName == "string") {
431
- msgg.topic = `${node.nodeName}/${key}`;
511
+ typeof node.nodeName == "string"
512
+ ) {
513
+ if(readNodeName !== ''&&
514
+ readNodeName !== null &&
515
+ readNodeName !== undefined
516
+ ) {
517
+ msgg.topic = `${node.nodeName}/${readNodeName}/${key}`;
518
+ } else {
519
+ msgg.topic = `${node.nodeName}/${key}`;
520
+ }
432
521
  } else {
433
- msgg.topic = `BITPOOL_BACNET_GATEWAY/${key}`;
522
+ if(readNodeName !== ''&&
523
+ readNodeName !== null &&
524
+ readNodeName !== undefined
525
+ ) {
526
+ msgg.topic = `BITPOOL_BACNET_GATEWAY/${readNodeName}/${key}`;
527
+ } else {
528
+ msgg.topic = `BITPOOL_BACNET_GATEWAY/${key}`;
529
+ }
434
530
  }
435
531
  msgg.payload = points;
436
532
  node.send(msgg);
437
533
  });
438
534
  }
439
535
  };
536
+ }
440
537
 
441
- };
442
-
443
- RED.nodes.registerType('Bacnet-Gateway', BitpoolBacnetGatewayDevice);
444
- };
538
+ RED.nodes.registerType("Bacnet-Gateway", BitpoolBacnetGatewayDevice);
539
+ };