@bitpoolos/edge-bacnet 1.4.1 → 1.4.3
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/CHANGELOG.md +43 -0
- package/README.md +2 -0
- package/bacnet_gateway.js +222 -194
- package/bacnet_read.html +122 -63
- package/bacnet_read.js +49 -6
- package/bacnet_server.js +77 -106
- package/bitpool_inject.html +173 -1
- package/bitpool_inject.js +47 -24
- package/package.json +1 -1
- package/resources/style.css +12 -1
- package/treeBuilder.js +53 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,4 +1,47 @@
|
|
|
1
1
|
# Changelog
|
|
2
|
+
|
|
3
|
+
## [1.4.3] - 01-08-2024
|
|
4
|
+
### Summary
|
|
5
|
+
|
|
6
|
+
Minor updates.
|
|
7
|
+
|
|
8
|
+
Added refresh button to readList tab on read node, to handle scenarios where read node jsons may be programatically created.
|
|
9
|
+
|
|
10
|
+
Added "Use device name in topic" topic property in inject and read nodes. This option toggles whether or not the device name is included in the msg.topic.
|
|
11
|
+
|
|
12
|
+
Merge github PR 19. Added ability to configure the creation of a BacnetServer object:
|
|
13
|
+
```javascript
|
|
14
|
+
payload = {
|
|
15
|
+
value: 12,
|
|
16
|
+
resolution: 0,
|
|
17
|
+
priorityArray: 0,
|
|
18
|
+
units: 0,
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Inject nodes may need to be deleted and replaced. Try deploying node-red 2 times to instantiate the new deviceName property.
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
## [1.4.2] - 23-07-2024
|
|
26
|
+
### Summary
|
|
27
|
+
|
|
28
|
+
Improved UI tree generation, fixing some unique scenarios where devices were not being correctly added.
|
|
29
|
+
|
|
30
|
+
Added new payload type: Individual JSON. This publishes JSON payloads to a point level, rather than to a device or property level.
|
|
31
|
+
|
|
32
|
+
Added payload and output types to be configured via Inject node. Any checked options in the inject node will take priority over read node options. Note - to use read node output types only, please deselect all inject node output options.
|
|
33
|
+
|
|
34
|
+
Added dumb BACnet parent devices to UI tree, for unique situations where MSTP devices are on a network without a parent IP device.
|
|
35
|
+
|
|
36
|
+
Bug fixes:
|
|
37
|
+
- Importing read list was incorrectly generating UI
|
|
38
|
+
- Block per device JSON payloads were not using DisplayName and JSON key
|
|
39
|
+
- Added node-red context variable to monitor if writeProperty event has been subscribed to, avoiding a new subscription for every node-red deploy.
|
|
40
|
+
- Fixed issue requiring Bacnet server to be constantly enabled in order for the node to function.
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
No nodes need to be deleted and replaced for this update.
|
|
44
|
+
|
|
2
45
|
## [1.4.1] - 09-07-2024
|
|
3
46
|
|
|
4
47
|
### Summary
|
package/README.md
CHANGED
|
@@ -39,6 +39,8 @@ $ npm install @bitpoolos/edge-bacnet
|
|
|
39
39
|
The module can be updated via the Node-RED pallette manager, or via the npm cli.
|
|
40
40
|
|
|
41
41
|
```javascript
|
|
42
|
+
Note: the following is our reccommendation based on error encountered in our experience. The below steps are mostly critical for updates that modify or add new properties to the UI of a node. Refer to comments in changelog.
|
|
43
|
+
|
|
42
44
|
Upon updating to the latest version, we highly recommend:
|
|
43
45
|
- Check out the changelog for latest feature notes and updates
|
|
44
46
|
- Remove all @bitpoolos/edge-bacnet nodes from all flows
|
package/bacnet_gateway.js
CHANGED
|
@@ -45,8 +45,6 @@ module.exports = function (RED) {
|
|
|
45
45
|
//determines whether or not to log a found device on whoIs response
|
|
46
46
|
this.toLogIam = config.toLogIam;
|
|
47
47
|
|
|
48
|
-
this.websocketListener = null;
|
|
49
|
-
|
|
50
48
|
node.bacnetConfig = new BacnetClientConfig(
|
|
51
49
|
node.apduTimeout,
|
|
52
50
|
node.localDeviceAddress,
|
|
@@ -75,6 +73,8 @@ module.exports = function (RED) {
|
|
|
75
73
|
} else {
|
|
76
74
|
node.bacnetClient = new BacnetClient(node.bacnetConfig);
|
|
77
75
|
nodeContext.set("bacnetClient", node.bacnetClient);
|
|
76
|
+
|
|
77
|
+
nodeContext.set("serverWritePropEvent", false);
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
node.bacnetClient.scanMatrix = node.deviceRangeRegisters.filter((ele) => ele.enabled === true);
|
|
@@ -107,29 +107,42 @@ module.exports = function (RED) {
|
|
|
107
107
|
node.status({});
|
|
108
108
|
}, 3000);
|
|
109
109
|
}
|
|
110
|
-
|
|
110
|
+
let useDeviceName = outputType.useDeviceName;
|
|
111
|
+
if (outputType.json && !outputType.mqtt && !outputType.pointJson) {
|
|
111
112
|
//json
|
|
112
113
|
if (objectPropertyType.simpleWithStatus && !objectPropertyType.fullObject && !objectPropertyType.simplePayload) {
|
|
113
114
|
//simpleWithStatus
|
|
114
|
-
sendSimpleWithStatus(values, readNodeName, true);
|
|
115
|
+
sendSimpleWithStatus(values, readNodeName, true, useDeviceName);
|
|
115
116
|
} else if (objectPropertyType.fullObject && !objectPropertyType.simplePayload && !objectPropertyType.simpleWithStatus) {
|
|
116
117
|
//fullObject
|
|
117
|
-
sendJsonAsMqtt(values, readNodeName);
|
|
118
|
+
sendJsonAsMqtt(values, readNodeName, useDeviceName);
|
|
118
119
|
} else if (objectPropertyType.simplePayload && !objectPropertyType.fullObject && !objectPropertyType.simpleWithStatus) {
|
|
119
120
|
//simplePayload
|
|
120
|
-
sendSimpleJson(values, readNodeName);
|
|
121
|
+
sendSimpleJson(values, readNodeName, useDeviceName);
|
|
121
122
|
}
|
|
122
|
-
} else if (!outputType.json && outputType.
|
|
123
|
+
} else if (outputType.mqtt && !outputType.json && !outputType.pointJson) {
|
|
123
124
|
//mqtt
|
|
124
125
|
if (objectPropertyType.simpleWithStatus && !objectPropertyType.fullObject && !objectPropertyType.simplePayload) {
|
|
125
126
|
//simpleWithStatus
|
|
126
|
-
sendSimpleWithStatus(values, readNodeName, false);
|
|
127
|
+
sendSimpleWithStatus(values, readNodeName, false, useDeviceName);
|
|
128
|
+
} else if (objectPropertyType.fullObject && !objectPropertyType.simplePayload && !objectPropertyType.simpleWithStatus) {
|
|
129
|
+
//fullObject
|
|
130
|
+
sendAsMqtt(values, readNodeName, useDeviceName);
|
|
131
|
+
} else if (objectPropertyType.simplePayload && !objectPropertyType.fullObject && !objectPropertyType.simpleWithStatus) {
|
|
132
|
+
//simplePayload
|
|
133
|
+
sendSimpleMqtt(values, readNodeName, useDeviceName);
|
|
134
|
+
}
|
|
135
|
+
} else if (outputType.pointJson && !outputType.json && !outputType.mqtt) {
|
|
136
|
+
//pointJson
|
|
137
|
+
if (objectPropertyType.simpleWithStatus && !objectPropertyType.fullObject && !objectPropertyType.simplePayload) {
|
|
138
|
+
//simpleWithStatus
|
|
139
|
+
sendSimpleWithStatus(values, readNodeName, false, useDeviceName);
|
|
127
140
|
} else if (objectPropertyType.fullObject && !objectPropertyType.simplePayload && !objectPropertyType.simpleWithStatus) {
|
|
128
141
|
//fullObject
|
|
129
|
-
|
|
142
|
+
sendIndividualMsgJson(values, readNodeName, useDeviceName);
|
|
130
143
|
} else if (objectPropertyType.simplePayload && !objectPropertyType.fullObject && !objectPropertyType.simpleWithStatus) {
|
|
131
144
|
//simplePayload
|
|
132
|
-
|
|
145
|
+
sendSimpleJsonPerPoint(values, readNodeName, useDeviceName);
|
|
133
146
|
}
|
|
134
147
|
}
|
|
135
148
|
}
|
|
@@ -164,22 +177,25 @@ module.exports = function (RED) {
|
|
|
164
177
|
}
|
|
165
178
|
}
|
|
166
179
|
|
|
167
|
-
node.bacnetServer.
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
+
if (node.bacnetServerEnabled == true && node.bacnetClient && node.bacnetServer && nodeContext.get("serverWritePropEvent") == false) {
|
|
181
|
+
node.bacnetServer.on("writeProperty", (topic, newValue) => {
|
|
182
|
+
let formattedTopic = topic;
|
|
183
|
+
if (
|
|
184
|
+
node.nodeName !== "gateway" &&
|
|
185
|
+
node.nodeName !== "" &&
|
|
186
|
+
node.nodeName !== "null" &&
|
|
187
|
+
node.nodeName !== "undefined" &&
|
|
188
|
+
typeof node.nodeName == "string"
|
|
189
|
+
) {
|
|
190
|
+
formattedTopic = `${node.nodeName}/BITPOOL_EDGE_BACNET_GATEWAY/BACNET_SERVER/${topic}`;
|
|
191
|
+
} else {
|
|
192
|
+
formattedTopic = `BITPOOL_EDGE_BACNET_GATEWAY/BACNET_SERVER/${topic}`;
|
|
193
|
+
}
|
|
180
194
|
|
|
181
|
-
|
|
182
|
-
|
|
195
|
+
node.send({ payload: newValue, topic: formattedTopic });
|
|
196
|
+
});
|
|
197
|
+
nodeContext.set("serverWritePropEvent", true);
|
|
198
|
+
}
|
|
183
199
|
|
|
184
200
|
node.on("input", function (msg) {
|
|
185
201
|
if (msg.topic && msg.payload !== null) {
|
|
@@ -441,29 +457,42 @@ module.exports = function (RED) {
|
|
|
441
457
|
node.status({});
|
|
442
458
|
}, 3000);
|
|
443
459
|
}
|
|
444
|
-
|
|
460
|
+
let useDeviceName = outputType.useDeviceName;
|
|
461
|
+
if (outputType.json && !outputType.mqtt && !outputType.pointJson) {
|
|
445
462
|
//json
|
|
446
463
|
if (objectPropertyType.simpleWithStatus && !objectPropertyType.fullObject && !objectPropertyType.simplePayload) {
|
|
447
464
|
//simpleWithStatus
|
|
448
|
-
sendSimpleWithStatus(values, readNodeName, true);
|
|
465
|
+
sendSimpleWithStatus(values, readNodeName, true, useDeviceName);
|
|
449
466
|
} else if (objectPropertyType.fullObject && !objectPropertyType.simplePayload && !objectPropertyType.simpleWithStatus) {
|
|
450
467
|
//fullObject
|
|
451
|
-
sendJsonAsMqtt(values, readNodeName);
|
|
468
|
+
sendJsonAsMqtt(values, readNodeName, useDeviceName);
|
|
452
469
|
} else if (objectPropertyType.simplePayload && !objectPropertyType.fullObject && !objectPropertyType.simpleWithStatus) {
|
|
453
470
|
//simplePayload
|
|
454
|
-
sendSimpleJson(values, readNodeName);
|
|
471
|
+
sendSimpleJson(values, readNodeName, useDeviceName);
|
|
455
472
|
}
|
|
456
|
-
} else if (!outputType.json && outputType.
|
|
473
|
+
} else if (outputType.mqtt && !outputType.json && !outputType.pointJson) {
|
|
457
474
|
//mqtt
|
|
458
475
|
if (objectPropertyType.simpleWithStatus && !objectPropertyType.fullObject && !objectPropertyType.simplePayload) {
|
|
459
476
|
//simpleWithStatus
|
|
460
|
-
sendSimpleWithStatus(values, readNodeName, false);
|
|
477
|
+
sendSimpleWithStatus(values, readNodeName, false, useDeviceName);
|
|
478
|
+
} else if (objectPropertyType.fullObject && !objectPropertyType.simplePayload && !objectPropertyType.simpleWithStatus) {
|
|
479
|
+
//fullObject
|
|
480
|
+
sendAsMqtt(values, readNodeName, useDeviceName);
|
|
481
|
+
} else if (objectPropertyType.simplePayload && !objectPropertyType.fullObject && !objectPropertyType.simpleWithStatus) {
|
|
482
|
+
//simplePayload
|
|
483
|
+
sendSimpleMqtt(values, readNodeName, useDeviceName);
|
|
484
|
+
}
|
|
485
|
+
} else if (outputType.pointJson && !outputType.json && !outputType.mqtt) {
|
|
486
|
+
//pointJson
|
|
487
|
+
if (objectPropertyType.simpleWithStatus && !objectPropertyType.fullObject && !objectPropertyType.simplePayload) {
|
|
488
|
+
//simpleWithStatus
|
|
489
|
+
sendSimpleWithStatus(values, readNodeName, false, useDeviceName);
|
|
461
490
|
} else if (objectPropertyType.fullObject && !objectPropertyType.simplePayload && !objectPropertyType.simpleWithStatus) {
|
|
462
491
|
//fullObject
|
|
463
|
-
|
|
492
|
+
sendIndividualMsgJson(values, readNodeName, useDeviceName);
|
|
464
493
|
} else if (objectPropertyType.simplePayload && !objectPropertyType.fullObject && !objectPropertyType.simpleWithStatus) {
|
|
465
494
|
//simplePayload
|
|
466
|
-
|
|
495
|
+
sendSimpleJsonPerPoint(values, readNodeName, useDeviceName);
|
|
467
496
|
}
|
|
468
497
|
}
|
|
469
498
|
}
|
|
@@ -487,14 +516,94 @@ module.exports = function (RED) {
|
|
|
487
516
|
}
|
|
488
517
|
}
|
|
489
518
|
|
|
490
|
-
function
|
|
491
|
-
|
|
492
|
-
|
|
519
|
+
function getTopicString(type, useDeviceName, readNodeName, device, pointName, prop) {
|
|
520
|
+
let topic = "";
|
|
521
|
+
if (
|
|
522
|
+
node.nodeName !== "gateway" &&
|
|
523
|
+
node.nodeName !== "" &&
|
|
524
|
+
node.nodeName !== "null" &&
|
|
525
|
+
node.nodeName !== "undefined" &&
|
|
526
|
+
typeof node.nodeName == "string"
|
|
527
|
+
) {
|
|
528
|
+
if (readNodeName !== '' &&
|
|
529
|
+
readNodeName !== null &&
|
|
530
|
+
readNodeName !== undefined
|
|
531
|
+
) {
|
|
532
|
+
if (useDeviceName) {
|
|
533
|
+
topic = `${node.nodeName}/${readNodeName}/${device}`;
|
|
534
|
+
} else {
|
|
535
|
+
topic = `${node.nodeName}/${readNodeName}`;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
} else {
|
|
539
|
+
if (useDeviceName) {
|
|
540
|
+
topic = `${node.nodeName}/${device}`;
|
|
541
|
+
} else {
|
|
542
|
+
topic = `${node.nodeName}`;
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
} else {
|
|
546
|
+
if (readNodeName !== '' &&
|
|
547
|
+
readNodeName !== null &&
|
|
548
|
+
readNodeName !== undefined
|
|
549
|
+
) {
|
|
550
|
+
if (useDeviceName) {
|
|
551
|
+
topic = `BITPOOL_BACNET_GATEWAY/${readNodeName}/${device}`;
|
|
552
|
+
} else {
|
|
553
|
+
topic = `BITPOOL_BACNET_GATEWAY/${readNodeName}`;
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
} else {
|
|
557
|
+
if (useDeviceName) {
|
|
558
|
+
topic = `BITPOOL_BACNET_GATEWAY/${device}`;
|
|
559
|
+
} else {
|
|
560
|
+
topic = `BITPOOL_BACNET_GATEWAY`;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
493
563
|
}
|
|
494
|
-
|
|
564
|
+
|
|
565
|
+
switch (type) {
|
|
566
|
+
case "sendSimpleWithStatus":
|
|
567
|
+
topic += `/${pointName}`;
|
|
568
|
+
break;
|
|
569
|
+
|
|
570
|
+
case "sendSimpleWithStatusJson":
|
|
571
|
+
//do nothing
|
|
572
|
+
break;
|
|
573
|
+
|
|
574
|
+
case "sendSimpleMqtt":
|
|
575
|
+
topic += `/${pointName}`;
|
|
576
|
+
break;
|
|
577
|
+
|
|
578
|
+
case "sendAsMqtt":
|
|
579
|
+
topic += `/${pointName}/${prop}`;
|
|
580
|
+
break;
|
|
581
|
+
|
|
582
|
+
case "sendSimpleJson":
|
|
583
|
+
//do nothing
|
|
584
|
+
break;
|
|
585
|
+
|
|
586
|
+
case "sendJsonAsMqtt":
|
|
587
|
+
//do nothing
|
|
588
|
+
break;
|
|
589
|
+
|
|
590
|
+
case "sendIndividualMsgJson":
|
|
591
|
+
topic += `/${pointName}`;
|
|
592
|
+
break;
|
|
593
|
+
|
|
594
|
+
case "sendSimpleJsonPerPoint":
|
|
595
|
+
topic += `/${pointName}`;
|
|
596
|
+
break;
|
|
597
|
+
|
|
598
|
+
default:
|
|
599
|
+
break;
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
return topic;
|
|
603
|
+
|
|
495
604
|
}
|
|
496
605
|
|
|
497
|
-
sendSimpleWithStatus = function (values, readNodeName, isJson) {
|
|
606
|
+
sendSimpleWithStatus = function (values, readNodeName, isJson, useDeviceName) {
|
|
498
607
|
let devices = Object.keys(values);
|
|
499
608
|
devices.forEach(function (device) {
|
|
500
609
|
if (device !== "_msgid") {
|
|
@@ -504,31 +613,9 @@ module.exports = function (RED) {
|
|
|
504
613
|
for (let point in points) {
|
|
505
614
|
if (points[point] && "presentValue" in points[point]) {
|
|
506
615
|
let pointName = getPointName(points[point], point);
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
node.nodeName !== "null" &&
|
|
511
|
-
node.nodeName !== "undefined" &&
|
|
512
|
-
typeof node.nodeName == "string"
|
|
513
|
-
) {
|
|
514
|
-
if (readNodeName !== '' &&
|
|
515
|
-
readNodeName !== null &&
|
|
516
|
-
readNodeName !== undefined
|
|
517
|
-
) {
|
|
518
|
-
msgg.topic = `${node.nodeName}/${readNodeName}/${device}/${pointName}`;
|
|
519
|
-
} else {
|
|
520
|
-
msgg.topic = `${node.nodeName}/${device}/${pointName}`;
|
|
521
|
-
}
|
|
522
|
-
} else {
|
|
523
|
-
if (readNodeName !== '' &&
|
|
524
|
-
readNodeName !== null &&
|
|
525
|
-
readNodeName !== undefined
|
|
526
|
-
) {
|
|
527
|
-
msgg.topic = `BITPOOL_BACNET_GATEWAY/${readNodeName}/${device}/${pointName}`;
|
|
528
|
-
} else {
|
|
529
|
-
msgg.topic = `BITPOOL_BACNET_GATEWAY/${device}/${pointName}`;
|
|
530
|
-
}
|
|
531
|
-
}
|
|
616
|
+
let topic = getTopicString("sendSimpleWithStatus", useDeviceName, readNodeName, device, pointName);
|
|
617
|
+
|
|
618
|
+
msgg.topic = topic;
|
|
532
619
|
let payload = {
|
|
533
620
|
presentValue: points[point]["presentValue"],
|
|
534
621
|
timestamp: points[point]["timestamp"],
|
|
@@ -549,32 +636,7 @@ module.exports = function (RED) {
|
|
|
549
636
|
|
|
550
637
|
if (isJson) {
|
|
551
638
|
//json payload
|
|
552
|
-
let topic = "";
|
|
553
|
-
if (
|
|
554
|
-
node.nodeName !== "gateway" &&
|
|
555
|
-
node.nodeName !== "" &&
|
|
556
|
-
node.nodeName !== "null" &&
|
|
557
|
-
node.nodeName !== "undefined" &&
|
|
558
|
-
typeof node.nodeName == "string"
|
|
559
|
-
) {
|
|
560
|
-
if (readNodeName !== '' &&
|
|
561
|
-
readNodeName !== null &&
|
|
562
|
-
readNodeName !== undefined
|
|
563
|
-
) {
|
|
564
|
-
topic = `${node.nodeName}/${readNodeName}/${device}`;
|
|
565
|
-
} else {
|
|
566
|
-
topic = `${node.nodeName}/${device}`;
|
|
567
|
-
}
|
|
568
|
-
} else {
|
|
569
|
-
if (readNodeName !== '' &&
|
|
570
|
-
readNodeName !== null &&
|
|
571
|
-
readNodeName !== undefined
|
|
572
|
-
) {
|
|
573
|
-
topic = `BITPOOL_BACNET_GATEWAY/${readNodeName}/${device}`;
|
|
574
|
-
} else {
|
|
575
|
-
topic = `BITPOOL_BACNET_GATEWAY/${device}`;
|
|
576
|
-
}
|
|
577
|
-
}
|
|
639
|
+
let topic = getTopicString("sendSimpleWithStatusJson", useDeviceName, readNodeName, device);
|
|
578
640
|
|
|
579
641
|
msgg.topic = topic;
|
|
580
642
|
msgg.payload = structuredObject;
|
|
@@ -585,7 +647,7 @@ module.exports = function (RED) {
|
|
|
585
647
|
});
|
|
586
648
|
}
|
|
587
649
|
|
|
588
|
-
sendSimpleMqtt = function (values, readNodeName) {
|
|
650
|
+
sendSimpleMqtt = function (values, readNodeName, useDeviceName) {
|
|
589
651
|
let devices = Object.keys(values);
|
|
590
652
|
devices.forEach(function (device) {
|
|
591
653
|
if (device !== "_msgid") {
|
|
@@ -597,31 +659,9 @@ module.exports = function (RED) {
|
|
|
597
659
|
pointProps.forEach(function (prop) {
|
|
598
660
|
let msg = {};
|
|
599
661
|
if (prop == "presentValue") {
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
node.nodeName !== "null" &&
|
|
604
|
-
node.nodeName !== "undefined" &&
|
|
605
|
-
typeof node.nodeName == "string"
|
|
606
|
-
) {
|
|
607
|
-
if (readNodeName !== '' &&
|
|
608
|
-
readNodeName !== null &&
|
|
609
|
-
readNodeName !== undefined
|
|
610
|
-
) {
|
|
611
|
-
msg.topic = `${node.nodeName}/${readNodeName}/${device}/${pointName}`;
|
|
612
|
-
} else {
|
|
613
|
-
msg.topic = `${node.nodeName}/${device}/${pointName}`;
|
|
614
|
-
}
|
|
615
|
-
} else {
|
|
616
|
-
if (readNodeName !== '' &&
|
|
617
|
-
readNodeName !== null &&
|
|
618
|
-
readNodeName !== undefined
|
|
619
|
-
) {
|
|
620
|
-
msg.topic = `BITPOOL_BACNET_GATEWAY/${readNodeName}/${device}/${pointName}`;
|
|
621
|
-
} else {
|
|
622
|
-
msg.topic = `BITPOOL_BACNET_GATEWAY/${device}/${pointName}`;
|
|
623
|
-
}
|
|
624
|
-
}
|
|
662
|
+
let topic = getTopicString("sendSimpleMqtt", useDeviceName, readNodeName, device, pointName);
|
|
663
|
+
|
|
664
|
+
msg.topic = topic;
|
|
625
665
|
msg.payload = points[point][prop];
|
|
626
666
|
node.send(msg);
|
|
627
667
|
}
|
|
@@ -633,7 +673,7 @@ module.exports = function (RED) {
|
|
|
633
673
|
};
|
|
634
674
|
|
|
635
675
|
// Breaks down response JSON object into mqtt topic / payload
|
|
636
|
-
sendAsMqtt = function (values, readNodeName) {
|
|
676
|
+
sendAsMqtt = function (values, readNodeName, useDeviceName) {
|
|
637
677
|
let devices = Object.keys(values);
|
|
638
678
|
devices.forEach(function (device) {
|
|
639
679
|
if (device !== "_msgid") {
|
|
@@ -645,31 +685,8 @@ module.exports = function (RED) {
|
|
|
645
685
|
pointProps.forEach(function (prop) {
|
|
646
686
|
let msg = {};
|
|
647
687
|
if (prop !== "objectName") {
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
node.nodeName !== "" &&
|
|
651
|
-
node.nodeName !== "null" &&
|
|
652
|
-
node.nodeName !== "undefined" &&
|
|
653
|
-
typeof node.nodeName == "string"
|
|
654
|
-
) {
|
|
655
|
-
if (readNodeName !== '' &&
|
|
656
|
-
readNodeName !== null &&
|
|
657
|
-
readNodeName !== undefined
|
|
658
|
-
) {
|
|
659
|
-
msg.topic = `${node.nodeName}/${readNodeName}/${device}/${pointName}/${prop}`;
|
|
660
|
-
} else {
|
|
661
|
-
msg.topic = `${node.nodeName}/${device}/${pointName}/${prop}`;
|
|
662
|
-
}
|
|
663
|
-
} else {
|
|
664
|
-
if (readNodeName !== '' &&
|
|
665
|
-
readNodeName !== null &&
|
|
666
|
-
readNodeName !== undefined
|
|
667
|
-
) {
|
|
668
|
-
msg.topic = `BITPOOL_BACNET_GATEWAY/${readNodeName}/${device}/${pointName}/${prop}`;
|
|
669
|
-
} else {
|
|
670
|
-
msg.topic = `BITPOOL_BACNET_GATEWAY/${device}/${pointName}/${prop}`;
|
|
671
|
-
}
|
|
672
|
-
}
|
|
688
|
+
let topic = getTopicString("sendAsMqtt", useDeviceName, readNodeName, device, pointName, prop);
|
|
689
|
+
msg.topic = topic;
|
|
673
690
|
msg.payload = points[point][prop];
|
|
674
691
|
node.send(msg);
|
|
675
692
|
}
|
|
@@ -680,7 +697,7 @@ module.exports = function (RED) {
|
|
|
680
697
|
});
|
|
681
698
|
};
|
|
682
699
|
|
|
683
|
-
sendSimpleJson = function (values, readNodeName) {
|
|
700
|
+
sendSimpleJson = function (values, readNodeName, useDeviceName) {
|
|
684
701
|
let devices = Object.keys(values);
|
|
685
702
|
devices.forEach(function (device) {
|
|
686
703
|
let msgg = {};
|
|
@@ -702,74 +719,85 @@ module.exports = function (RED) {
|
|
|
702
719
|
});
|
|
703
720
|
}
|
|
704
721
|
}
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
node.nodeName !== "" &&
|
|
708
|
-
node.nodeName !== "null" &&
|
|
709
|
-
node.nodeName !== "undefined" &&
|
|
710
|
-
typeof node.nodeName == "string"
|
|
711
|
-
) {
|
|
712
|
-
if (readNodeName !== '' &&
|
|
713
|
-
readNodeName !== null &&
|
|
714
|
-
readNodeName !== undefined
|
|
715
|
-
) {
|
|
716
|
-
msgg.topic = `${node.nodeName}/${readNodeName}/${device}`;
|
|
717
|
-
} else {
|
|
718
|
-
msgg.topic = `${node.nodeName}/${device}`;
|
|
719
|
-
}
|
|
720
|
-
} else {
|
|
721
|
-
if (readNodeName !== '' &&
|
|
722
|
-
readNodeName !== null &&
|
|
723
|
-
readNodeName !== undefined
|
|
724
|
-
) {
|
|
725
|
-
msgg.topic = `BITPOOL_BACNET_GATEWAY/${readNodeName}/${device}`;
|
|
726
|
-
} else {
|
|
727
|
-
msgg.topic = `BITPOOL_BACNET_GATEWAY/${device}`;
|
|
728
|
-
}
|
|
729
|
-
}
|
|
722
|
+
let topic = getTopicString("sendSimpleJson", useDeviceName, readNodeName, device);
|
|
723
|
+
msgg.topic = topic;
|
|
730
724
|
msgg.payload = value[device];
|
|
731
725
|
node.send(msgg);
|
|
732
726
|
}
|
|
733
727
|
});
|
|
734
728
|
};
|
|
735
729
|
|
|
736
|
-
sendJsonAsMqtt = function (values, readNodeName) {
|
|
730
|
+
sendJsonAsMqtt = function (values, readNodeName, useDeviceName) {
|
|
737
731
|
if (typeof values == "object") {
|
|
738
732
|
let keys = Object.keys(values);
|
|
739
733
|
keys.forEach(function (key) {
|
|
740
734
|
let points = values[key];
|
|
741
735
|
let msgg = {};
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
readNodeName !== null &&
|
|
751
|
-
readNodeName !== undefined
|
|
752
|
-
) {
|
|
753
|
-
msgg.topic = `${node.nodeName}/${readNodeName}/${key}`;
|
|
754
|
-
} else {
|
|
755
|
-
msgg.topic = `${node.nodeName}/${key}`;
|
|
756
|
-
}
|
|
757
|
-
} else {
|
|
758
|
-
if (readNodeName !== '' &&
|
|
759
|
-
readNodeName !== null &&
|
|
760
|
-
readNodeName !== undefined
|
|
761
|
-
) {
|
|
762
|
-
msgg.topic = `BITPOOL_BACNET_GATEWAY/${readNodeName}/${key}`;
|
|
763
|
-
} else {
|
|
764
|
-
msgg.topic = `BITPOOL_BACNET_GATEWAY/${key}`;
|
|
765
|
-
}
|
|
736
|
+
let structuredObject = {};
|
|
737
|
+
|
|
738
|
+
let topic = getTopicString("sendJsonAsMqtt", useDeviceName, readNodeName, key);
|
|
739
|
+
msgg.topic = topic;
|
|
740
|
+
|
|
741
|
+
for (let point in points) {
|
|
742
|
+
let pointName = getPointName(points[point], point);
|
|
743
|
+
structuredObject[pointName] = points[point];
|
|
766
744
|
}
|
|
767
|
-
msgg.payload =
|
|
745
|
+
msgg.payload = structuredObject;
|
|
768
746
|
node.send(msgg);
|
|
769
747
|
});
|
|
770
748
|
}
|
|
771
749
|
};
|
|
772
|
-
}
|
|
773
750
|
|
|
751
|
+
sendIndividualMsgJson = function (values, readNodeName, useDeviceName) {
|
|
752
|
+
if (typeof values == "object") {
|
|
753
|
+
let keys = Object.keys(values);
|
|
754
|
+
keys.forEach(function (key) {
|
|
755
|
+
let points = values[key];
|
|
756
|
+
let msgg = {};
|
|
757
|
+
for (let point in points) {
|
|
758
|
+
let pointName = getPointName(points[point], point);
|
|
759
|
+
let topic = getTopicString("sendIndividualMsgJson", useDeviceName, readNodeName, key, pointName);
|
|
760
|
+
msgg.topic = topic;
|
|
761
|
+
|
|
762
|
+
msgg.payload = points[point];
|
|
763
|
+
node.send(msgg);
|
|
764
|
+
msgg = {};
|
|
765
|
+
}
|
|
766
|
+
});
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
sendSimpleJsonPerPoint = function (values, readNodeName, useDeviceName) {
|
|
771
|
+
let devices = Object.keys(values);
|
|
772
|
+
devices.forEach(function (device) {
|
|
773
|
+
if (device !== "_msgid") {
|
|
774
|
+
let points = values[device];
|
|
775
|
+
let msgg = {};
|
|
776
|
+
for (let point in points) {
|
|
777
|
+
if (points[point] && "presentValue" in points[point]) {
|
|
778
|
+
let pointName = getPointName(points[point], point);
|
|
779
|
+
let topic = getTopicString("sendSimpleJsonPerPoint", useDeviceName, readNodeName, device, pointName);
|
|
780
|
+
|
|
781
|
+
msgg.topic = topic;
|
|
782
|
+
let payload = {
|
|
783
|
+
presentValue: points[point]["presentValue"]
|
|
784
|
+
};
|
|
785
|
+
msgg.payload = payload;
|
|
786
|
+
node.send(msgg);
|
|
787
|
+
msgg = {};
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
});
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
function getPointName(object, pointName) {
|
|
795
|
+
if (object.displayName) {
|
|
796
|
+
return object.displayName;
|
|
797
|
+
}
|
|
798
|
+
return pointName;
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
}
|
|
774
802
|
RED.nodes.registerType("Bacnet-Gateway", BitpoolBacnetGatewayDevice);
|
|
775
803
|
};
|