@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/.github/ISSUE_TEMPLATE/bug_report.md +41 -0
- package/bacnet_client.js +414 -200
- package/bacnet_device.js +52 -0
- package/bacnet_gateway.html +836 -602
- package/bacnet_gateway.js +223 -128
- package/bacnet_read.html +64 -34
- package/bacnet_read.js +8 -3
- package/bacnet_server.js +193 -40
- package/bacnet_write.html +125 -33
- package/bacnet_write.js +1 -1
- package/common.js +152 -131
- package/package.json +2 -3
- package/resources/icons/icon-read.svg +19 -0
- package/resources/icons/icon-write.svg +16 -0
- package/resources/node-bacstack-ts/dist/lib/client.js +3 -3
- package/resources/style.css +11 -0
package/bacnet_gateway.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
module.exports = function (RED) {
|
|
6
|
-
const { BacnetClient } = require(
|
|
7
|
-
const { BacnetClientConfig, getIpAddress
|
|
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.
|
|
27
|
-
this.
|
|
28
|
-
this.
|
|
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 !==
|
|
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(
|
|
103
|
-
if (typeof values !==
|
|
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(
|
|
125
|
+
node.bacnetClient.on("deviceFound", (device) => {
|
|
128
126
|
if (node.toLogIam) {
|
|
129
127
|
if (device.source) {
|
|
130
|
-
node.warn(
|
|
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(
|
|
137
|
+
node.bacnetClient.on("bacnetErrorLog", (param1, param2) => {
|
|
138
138
|
logOut(param1, param2);
|
|
139
139
|
});
|
|
140
140
|
|
|
141
|
-
if (
|
|
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(
|
|
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
|
|
182
|
-
|
|
183
|
-
|
|
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(
|
|
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
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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(
|
|
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
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
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(
|
|
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
|
|
234
|
-
RED.httpAdmin.
|
|
235
|
-
|
|
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
|
-
}
|
|
238
|
-
logOut("Error getting network interfaces for client: ", error);
|
|
239
|
-
});
|
|
249
|
+
}
|
|
240
250
|
});
|
|
241
251
|
|
|
242
|
-
//route handler for
|
|
243
|
-
RED.httpAdmin.get('/bitpool-bacnet-data/
|
|
244
|
-
if (
|
|
245
|
-
|
|
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
|
|
259
|
+
logOut("Error getting server points: ", error);
|
|
253
260
|
});
|
|
261
|
+
} else {
|
|
262
|
+
res.send([]);
|
|
254
263
|
}
|
|
255
264
|
});
|
|
256
265
|
|
|
257
|
-
//route handler for
|
|
258
|
-
RED.httpAdmin.
|
|
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
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
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
|
-
|
|
273
|
-
|
|
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(
|
|
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(
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
463
|
+
presentValue: points[point][prop],
|
|
398
464
|
};
|
|
399
465
|
}
|
|
400
466
|
});
|
|
401
467
|
}
|
|
402
|
-
|
|
403
468
|
}
|
|
404
|
-
if (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
+
};
|