@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 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
- if (outputType.json && !outputType.mqtt) {
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.mqtt) {
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
- sendAsMqtt(values, readNodeName);
142
+ sendIndividualMsgJson(values, readNodeName, useDeviceName);
130
143
  } else if (objectPropertyType.simplePayload && !objectPropertyType.fullObject && !objectPropertyType.simpleWithStatus) {
131
144
  //simplePayload
132
- sendSimpleMqtt(values, readNodeName);
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.on("writeProperty", (topic, newValue) => {
168
- let formattedTopic = topic;
169
- if (
170
- node.nodeName !== "gateway" &&
171
- node.nodeName !== "" &&
172
- node.nodeName !== "null" &&
173
- node.nodeName !== "undefined" &&
174
- typeof node.nodeName == "string"
175
- ) {
176
- formattedTopic = `${node.nodeName}/BITPOOL_EDGE_BACNET_GATEWAY/BACNET_SERVER/${topic}`;
177
- } else {
178
- formattedTopic = `BITPOOL_EDGE_BACNET_GATEWAY/BACNET_SERVER/${topic}`;
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
- node.send({ payload: newValue, topic: formattedTopic });
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
- if (outputType.json && !outputType.mqtt) {
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.mqtt) {
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
- sendAsMqtt(values, readNodeName);
492
+ sendIndividualMsgJson(values, readNodeName, useDeviceName);
464
493
  } else if (objectPropertyType.simplePayload && !objectPropertyType.fullObject && !objectPropertyType.simpleWithStatus) {
465
494
  //simplePayload
466
- sendSimpleMqtt(values, readNodeName);
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 getPointName(object, pointName) {
491
- if (object.displayName) {
492
- return object.displayName;
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
- return pointName;
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
- if (
508
- node.nodeName !== "gateway" &&
509
- node.nodeName !== "" &&
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
- if (
601
- node.nodeName !== "gateway" &&
602
- node.nodeName !== "" &&
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
- if (
649
- node.nodeName !== "gateway" &&
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
- if (
706
- node.nodeName !== "gateway" &&
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
- if (
743
- node.nodeName !== "gateway" &&
744
- node.nodeName !== "" &&
745
- node.nodeName !== "null" &&
746
- node.nodeName !== "undefined" &&
747
- typeof node.nodeName == "string"
748
- ) {
749
- if (readNodeName !== '' &&
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 = points;
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
  };