@bitpoolos/edge-bacnet 1.1.8 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/bacnet_client.js +331 -168
  2. package/bacnet_device.js +50 -16
  3. package/bacnet_gateway.html +119 -15
  4. package/bacnet_gateway.js +388 -395
  5. package/bacnet_read.html +32 -11
  6. package/bacnet_read.js +1 -1
  7. package/bacnet_server.js +16 -12
  8. package/common.js +26 -19
  9. package/examples/1-Discover-Read.json +1 -1
  10. package/examples/2-Discover-Write.json +1 -1
  11. package/examples/3-Discover-Read-Write.json +1 -1
  12. package/package.json +3 -3
  13. package/resources/{node-bacnet/LICENSE.md → node-bacstack-ts/LICENSE} +3 -4
  14. package/resources/node-bacstack-ts/README.md +75 -0
  15. package/resources/{node-bacnet → node-bacstack-ts/dist}/index.js +0 -2
  16. package/resources/node-bacstack-ts/dist/lib/apdu.js +193 -0
  17. package/resources/node-bacstack-ts/dist/lib/asn1.js +1660 -0
  18. package/resources/node-bacstack-ts/dist/lib/bvlc.js +47 -0
  19. package/resources/node-bacstack-ts/dist/lib/client.js +1454 -0
  20. package/resources/node-bacstack-ts/dist/lib/enum.js +2114 -0
  21. package/resources/node-bacstack-ts/dist/lib/npdu.js +112 -0
  22. package/resources/node-bacstack-ts/dist/lib/services/add-list-element.js +58 -0
  23. package/resources/node-bacstack-ts/dist/lib/services/alarm-acknowledge.js +93 -0
  24. package/resources/node-bacstack-ts/dist/lib/services/alarm-summary.js +42 -0
  25. package/resources/node-bacstack-ts/dist/lib/services/atomic-read-file.js +157 -0
  26. package/resources/node-bacstack-ts/dist/lib/services/atomic-write-file.js +136 -0
  27. package/resources/node-bacstack-ts/dist/lib/services/cov-notify.js +119 -0
  28. package/resources/node-bacstack-ts/dist/lib/services/create-object.js +104 -0
  29. package/resources/node-bacstack-ts/dist/lib/services/delete-object.js +21 -0
  30. package/resources/node-bacstack-ts/dist/lib/services/device-communication-control.js +46 -0
  31. package/resources/node-bacstack-ts/dist/lib/services/error.js +27 -0
  32. package/resources/node-bacstack-ts/dist/lib/services/event-information.js +100 -0
  33. package/resources/node-bacstack-ts/dist/lib/services/event-notify-data.js +219 -0
  34. package/resources/node-bacstack-ts/dist/lib/services/get-enrollment-summary.js +172 -0
  35. package/resources/node-bacstack-ts/dist/lib/services/get-event-information.js +135 -0
  36. package/resources/node-bacstack-ts/dist/lib/services/i-am-broadcast.js +59 -0
  37. package/resources/node-bacstack-ts/dist/lib/services/i-have-broadcast.js +34 -0
  38. package/resources/node-bacstack-ts/dist/lib/services/index.js +32 -0
  39. package/resources/node-bacstack-ts/dist/lib/services/life-safety-operation.js +40 -0
  40. package/resources/node-bacstack-ts/dist/lib/services/private-transfer.js +43 -0
  41. package/resources/node-bacstack-ts/dist/lib/services/read-property-multiple.js +44 -0
  42. package/resources/node-bacstack-ts/dist/lib/services/read-property.js +122 -0
  43. package/resources/node-bacstack-ts/dist/lib/services/read-range.js +201 -0
  44. package/resources/node-bacstack-ts/dist/lib/services/reinitialize-device.js +35 -0
  45. package/resources/node-bacstack-ts/dist/lib/services/subscribe-cov.js +55 -0
  46. package/resources/node-bacstack-ts/dist/lib/services/subscribe-property.js +93 -0
  47. package/resources/node-bacstack-ts/dist/lib/services/time-sync.js +31 -0
  48. package/resources/node-bacstack-ts/dist/lib/services/who-has.js +56 -0
  49. package/resources/node-bacstack-ts/dist/lib/services/who-is.js +45 -0
  50. package/resources/node-bacstack-ts/dist/lib/services/write-property-multiple.js +105 -0
  51. package/resources/node-bacstack-ts/dist/lib/services/write-property.js +90 -0
  52. package/resources/node-bacstack-ts/dist/lib/transport.js +49 -0
  53. package/resources/node-bacstack-ts/dist/lib/types.js +2 -0
  54. package/resources/node-bacstack-ts/package.json +94 -0
  55. package/resources/node-bacnet/CHANGELOG.md +0 -481
  56. package/resources/node-bacnet/README.md +0 -91
  57. package/resources/node-bacnet/docs/Client.html +0 -4422
  58. package/resources/node-bacnet/docs/bacnet-icon-quad.png +0 -0
  59. package/resources/node-bacnet/docs/bacnet-icon-quad128.png +0 -0
  60. package/resources/node-bacnet/docs/bacnet-icon-quad64.png +0 -0
  61. package/resources/node-bacnet/docs/bacnet-icon-small.xcf +0 -0
  62. package/resources/node-bacnet/docs/bacnet-icon.xcf +0 -0
  63. package/resources/node-bacnet/docs/bacnet.html +0 -7032
  64. package/resources/node-bacnet/docs/client.js.html +0 -1759
  65. package/resources/node-bacnet/docs/enum.js.html +0 -2530
  66. package/resources/node-bacnet/docs/global.html +0 -2068
  67. package/resources/node-bacnet/docs/images/mocha-logo.svg +0 -65
  68. package/resources/node-bacnet/docs/index.html +0 -283
  69. package/resources/node-bacnet/docs/scripts/collapse.js +0 -11
  70. package/resources/node-bacnet/docs/scripts/jquery-3.1.1.min.js +0 -4
  71. package/resources/node-bacnet/docs/scripts/linenumber.js +0 -26
  72. package/resources/node-bacnet/docs/scripts/prettify/Apache-License-2.0.txt +0 -202
  73. package/resources/node-bacnet/docs/scripts/prettify/lang-css.js +0 -2
  74. package/resources/node-bacnet/docs/scripts/prettify/prettify.js +0 -28
  75. package/resources/node-bacnet/docs/scripts/search.js +0 -47
  76. package/resources/node-bacnet/docs/services_i-am.js.html +0 -157
  77. package/resources/node-bacnet/docs/services_time-sync.js.html +0 -118
  78. package/resources/node-bacnet/docs/services_who-is.js.html +0 -138
  79. package/resources/node-bacnet/docs/styles/jsdoc.css +0 -683
  80. package/resources/node-bacnet/docs/styles/prettify.css +0 -82
  81. package/resources/node-bacnet/examples/discover-devices.js +0 -66
  82. package/resources/node-bacnet/examples/read-device.js +0 -510
  83. package/resources/node-bacnet/examples/subscribe-cov.js +0 -75
  84. package/resources/node-bacnet/lib/apdu.js +0 -209
  85. package/resources/node-bacnet/lib/asn1.js +0 -1733
  86. package/resources/node-bacnet/lib/bvlc.js +0 -90
  87. package/resources/node-bacnet/lib/client.js +0 -1695
  88. package/resources/node-bacnet/lib/enum.js +0 -2463
  89. package/resources/node-bacnet/lib/npdu.js +0 -123
  90. package/resources/node-bacnet/lib/services/add-list-element.js +0 -64
  91. package/resources/node-bacnet/lib/services/alarm-acknowledge.js +0 -90
  92. package/resources/node-bacnet/lib/services/alarm-summary.js +0 -42
  93. package/resources/node-bacnet/lib/services/atomic-read-file.js +0 -162
  94. package/resources/node-bacnet/lib/services/atomic-write-file.js +0 -138
  95. package/resources/node-bacnet/lib/services/cov-notify.js +0 -126
  96. package/resources/node-bacnet/lib/services/create-object.js +0 -106
  97. package/resources/node-bacnet/lib/services/delete-object.js +0 -23
  98. package/resources/node-bacnet/lib/services/device-communication-control.js +0 -48
  99. package/resources/node-bacnet/lib/services/error.js +0 -33
  100. package/resources/node-bacnet/lib/services/event-information.js +0 -99
  101. package/resources/node-bacnet/lib/services/event-notify-data.js +0 -229
  102. package/resources/node-bacnet/lib/services/get-enrollment-summary.js +0 -178
  103. package/resources/node-bacnet/lib/services/get-event-information.js +0 -144
  104. package/resources/node-bacnet/lib/services/i-am.js +0 -90
  105. package/resources/node-bacnet/lib/services/i-have.js +0 -34
  106. package/resources/node-bacnet/lib/services/index.js +0 -34
  107. package/resources/node-bacnet/lib/services/life-safety-operation.js +0 -40
  108. package/resources/node-bacnet/lib/services/private-transfer.js +0 -43
  109. package/resources/node-bacnet/lib/services/read-property-multiple.js +0 -50
  110. package/resources/node-bacnet/lib/services/read-property.js +0 -130
  111. package/resources/node-bacnet/lib/services/read-range.js +0 -201
  112. package/resources/node-bacnet/lib/services/register-foreign-device.js +0 -18
  113. package/resources/node-bacnet/lib/services/reinitialize-device.js +0 -37
  114. package/resources/node-bacnet/lib/services/subscribe-cov.js +0 -57
  115. package/resources/node-bacnet/lib/services/subscribe-property.js +0 -97
  116. package/resources/node-bacnet/lib/services/time-sync.js +0 -51
  117. package/resources/node-bacnet/lib/services/who-has.js +0 -54
  118. package/resources/node-bacnet/lib/services/who-is.js +0 -71
  119. package/resources/node-bacnet/lib/services/write-property-multiple.js +0 -117
  120. package/resources/node-bacnet/lib/services/write-property.js +0 -94
  121. package/resources/node-bacnet/lib/transport.js +0 -82
  122. package/resources/node-bacnet/package.json +0 -92
package/bacnet_gateway.js CHANGED
@@ -3,444 +3,437 @@
3
3
  */
4
4
 
5
5
  module.exports = function (RED) {
6
- const { BacnetClient } = require('./bacnet_client');
7
- const { BacnetClientConfig, getIpAddress, doNodeRedRestart } = require('./common');
8
- const { exec } = require("child_process");
9
- const { BacnetServer } = require("./bacnet_server.js");
10
-
11
- function BitpoolBacnetGatewayDevice (config) {
12
- RED.nodes.createNode(this, config);
13
-
14
- var node = this;
15
- var nodeContext = this.context().flow;
16
-
17
- //bacnet local device info
18
- this.localDeviceAddress = config.local_device_address;
19
- this.local_device_port = config.local_device_port;
20
- this.apduSize = config.apduSize;
21
- this.maxSegments = config.maxSegments;
22
- this.apduTimeout = config.apduTimeout;
23
- this.broadCastAddr = config.broadCastAddr;
24
- this.discover_polling_schedule = config.discover_polling_schedule;
25
- this.device_id_range_enabled = config.device_id_range_enabled;
26
- this.device_id_range_start = config.device_id_range_start;
27
- this.device_id_range_end = config.device_id_range_end;
28
- this.manual_instance_range_enabled = config.manual_instance_range_enabled,
29
- this.manual_instance_range_start = config.manual_instance_range_start,
30
- this.manual_instance_range_end = config.manual_instance_range_end,
31
- this.nodeName = config.name;
32
- this.toRestartNodeRed = config.toRestartNodeRed;
33
- this.deviceId = config.deviceId;
34
- this.logErrorToConsole = config.logErrorToConsole;
35
- this.bacnetServerEnabled = config.serverEnabled;
36
- this.bacnetServerRebuildSchedule = config.bacnetServerRebuildSchedule;
37
- this.bacnetServer = nodeContext.get("bacnetServer") || null;
38
-
39
- //client and config store
40
- this.bacnetConfig = nodeContext.get("bacnetConfig");
41
- this.bacnetClient = nodeContext.get("bacnetClient");
42
- // client and config names
43
- this.bacnetClientName = "bacnetClientWrite" + node.id;
44
- this.bacnetConfigName = "bacnetConfigWrite" + node.id;
45
- //determines whether or not to log a found device on whoIs response
46
- this.toLogIam = config.toLogIam;
47
-
48
- this.websocketListener = null;
49
-
50
- if(node.apduTimeout &&
51
- node.localDeviceAddress &&
52
- node.local_device_port &&
53
- node.apduSize &&
54
- node.maxSegments &&
55
- node.broadCastAddr &&
56
- node.discover_polling_schedule) {
57
-
58
- //sets up or reinitializes node and bacnet device
59
- if(configHasChanged()) {
60
-
61
- node.bacnetConfig = new BacnetClientConfig(
62
- node.apduTimeout,
63
- node.localDeviceAddress,
64
- node.local_device_port,
65
- node.apduSize,
66
- node.maxSegments,
67
- node.broadCastAddr,
68
- node.discover_polling_schedule,
69
- node.device_id_range_enabled,
70
- node.device_id_range_start,
71
- node.device_id_range_end,
72
- node.toRestartNodeRed,
73
- node.deviceId,
74
- node.manual_instance_range_enabled,
75
- node.manual_instance_range_start,
76
- node.manual_instance_range_end,
77
- node.bacnetServerEnabled
78
- );
79
-
80
- nodeContext.set("bacnetConfig", node.bacnetConfig);
81
-
82
- if(typeof node.bacnetClient !== 'undefined') {
83
- node.bacnetClient.removeAllListeners();
84
- bindEventListeners();
85
- node.bacnetClient.reinitializeClient(node.bacnetConfig);
86
- } else {
87
- node.bacnetClient = new BacnetClient(node.bacnetConfig);
88
- nodeContext.set("bacnetClient", node.bacnetClient);
89
- }
90
-
91
- if(node.bacnetServerEnabled == true && node.bacnetClient && node.bacnetServer) {
92
- node.bacnetServer.deviceId = node.deviceId;
93
- }
6
+ const { BacnetClient } = require('./bacnet_client');
7
+ const { BacnetClientConfig, getIpAddress, doNodeRedRestart } = require('./common');
8
+ const { exec } = require("child_process");
9
+ const { BacnetServer } = require("./bacnet_server.js");
10
+
11
+ function BitpoolBacnetGatewayDevice(config) {
12
+ RED.nodes.createNode(this, config);
13
+
14
+ var node = this;
15
+ var nodeContext = this.context().flow;
16
+
17
+ //bacnet local device info
18
+ this.localDeviceAddress = config.local_device_address;
19
+ this.local_device_port = config.local_device_port;
20
+ this.apduSize = config.apduSize;
21
+ this.maxSegments = config.maxSegments;
22
+ this.apduTimeout = config.apduTimeout;
23
+ this.broadCastAddr = config.broadCastAddr;
24
+ this.discover_polling_schedule = config.discover_polling_schedule;
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,
32
+ this.nodeName = config.name;
33
+ this.toRestartNodeRed = config.toRestartNodeRed;
34
+ this.deviceId = config.deviceId;
35
+ this.logErrorToConsole = config.logErrorToConsole;
36
+ this.bacnetServerEnabled = config.serverEnabled;
37
+ this.retries = config.retries;
38
+ this.bacnetServer = nodeContext.get("bacnetServer") || null;
39
+
40
+ //client and config store
41
+ this.bacnetConfig = nodeContext.get("bacnetConfig");
42
+ this.bacnetClient = nodeContext.get("bacnetClient");
43
+ // client and config names
44
+ this.bacnetClientName = "bacnetClientWrite" + node.id;
45
+ this.bacnetConfigName = "bacnetConfigWrite" + node.id;
46
+ //determines whether or not to log a found device on whoIs response
47
+ this.toLogIam = config.toLogIam;
48
+
49
+ this.websocketListener = null;
50
+
51
+ node.bacnetConfig = new BacnetClientConfig(
52
+ node.apduTimeout,
53
+ node.localDeviceAddress,
54
+ node.local_device_port,
55
+ node.apduSize,
56
+ node.maxSegments,
57
+ node.broadCastAddr,
58
+ node.discover_polling_schedule,
59
+ node.device_id_range_enabled,
60
+ node.device_id_range_start,
61
+ node.device_id_range_end,
62
+ node.toRestartNodeRed,
63
+ node.deviceId,
64
+ node.manual_instance_range_enabled,
65
+ node.manual_instance_range_start,
66
+ node.manual_instance_range_end,
67
+ node.device_read_schedule,
68
+ node.retries
69
+ );
70
+
71
+ nodeContext.set("bacnetConfig", node.bacnetConfig);
72
+
73
+ if (typeof node.bacnetClient !== 'undefined') {
74
+ node.bacnetClient.removeAllListeners();
75
+ bindEventListeners();
76
+ node.bacnetClient.reinitializeClient(node.bacnetConfig);
77
+ } else {
78
+ node.bacnetClient = new BacnetClient(node.bacnetConfig);
79
+ nodeContext.set("bacnetClient", node.bacnetClient);
80
+ }
81
+
82
+ if (node.bacnetServerEnabled == true && node.bacnetClient && node.bacnetServer) {
83
+ node.bacnetServer.deviceId = node.deviceId;
84
+ }
85
+
86
+ node.bacnetClient.bacnetServerEnabled = node.bacnetServerEnabled;
87
+
88
+ if (node.bacnetServerEnabled == true && node.bacnetClient) {
89
+ if (node.bacnetServer == null) {
90
+
91
+ node.bacnetServer = new BacnetServer(node.bacnetClient, node.deviceId, RED.version());
92
+ nodeContext.set("bacnetServer", node.bacnetServer);
93
+ }
94
+ } else if (node.bacnetServerEnabled == false) {
95
+ node.bacnetServer = null;
96
+ }
97
+
98
+ // Clears event handlers of all listeners, avoiding memory leak
99
+ node.bacnetClient.removeAllListeners();
100
+
101
+ // Value response event handler for READ commands
102
+ node.bacnetClient.on('values', (values, outputType, objectPropertyType) => {
103
+ if (typeof values !== 'undefined' && Object.keys(values).length) {
104
+ if (outputType.json && !outputType.mqtt) {
105
+ if (objectPropertyType.fullObject && objectPropertyType.simplePayload) {
106
+ sendSimpleJson(values);
107
+ sendJsonAsMqtt(values);
108
+ } else if (objectPropertyType.fullObject && !objectPropertyType.simplePayload) {
109
+ sendJsonAsMqtt(values);
110
+ } else if (!objectPropertyType.fullObject && objectPropertyType.simplePayload) {
111
+ sendSimpleJson(values);
94
112
  }
95
-
96
- node.bacnetClient.bacnetServerEnabled = node.bacnetServerEnabled;
97
-
98
- if(node.bacnetServerEnabled == true && node.bacnetClient) {
99
- if(node.bacnetServer == null) {
100
- node.bacnetServer = new BacnetServer(node.bacnetClient, node.deviceId, RED.version());
101
- nodeContext.set("bacnetServer", node.bacnetServer);
102
- }
103
- } else if(node.bacnetServerEnabled == false) {
104
- node.bacnetServer = null;
113
+ } else if (!outputType.json && outputType.mqtt) {
114
+ if (objectPropertyType.fullObject && objectPropertyType.simplePayload) {
115
+ sendAsMqtt(values);
116
+ sendSimpleMqtt(values);
117
+ } else if (objectPropertyType.fullObject && !objectPropertyType.simplePayload) {
118
+ sendAsMqtt(values);
119
+ } else if (!objectPropertyType.fullObject && objectPropertyType.simplePayload) {
120
+ sendSimpleMqtt(values);
105
121
  }
106
-
107
- // Clears event handlers of all listeners, avoiding memory leak
108
- node.bacnetClient.removeAllListeners();
109
-
110
- // Value response event handler for READ commands
111
- node.bacnetClient.on('values', (values, outputType, objectPropertyType) => {
112
- if(typeof values !== 'undefined' && Object.keys(values).length) {
113
- if (outputType.json && !outputType.mqtt) {
114
- if(objectPropertyType.fullObject && objectPropertyType.simplePayload) {
115
- sendSimpleJson(values);
116
- sendJsonAsMqtt(values);
117
- } else if(objectPropertyType.fullObject && !objectPropertyType.simplePayload) {
118
- sendJsonAsMqtt(values);
119
- } else if(!objectPropertyType.fullObject && objectPropertyType.simplePayload) {
120
- sendSimpleJson(values);
121
- }
122
- } else if(!outputType.json && outputType.mqtt) {
123
- if(objectPropertyType.fullObject && objectPropertyType.simplePayload) {
124
- sendAsMqtt(values);
125
- sendSimpleMqtt(values);
126
- } else if(objectPropertyType.fullObject && !objectPropertyType.simplePayload) {
127
- sendAsMqtt(values);
128
- } else if(!objectPropertyType.fullObject && objectPropertyType.simplePayload) {
129
- sendSimpleMqtt(values);
130
- }
131
- }
132
- }
133
- });
134
-
135
- // Who Is / Iam event handler
136
- node.bacnetClient.on('deviceFound', (device) => {
137
- if(node.toLogIam) {
138
- if(device.header.source) {
139
- node.warn(`BACnet-MS/TP device found: ${device.payload.deviceId} - ${device.header.sender.address} - Network Id: ${device.header.source.net} - Mac: ${device.header.source.adr[0]}`);
140
- } else {
141
- node.warn(`BACnet device found: ${device.payload.deviceId} - ${device.header.sender.address}`);
142
- }
143
- }
144
- });
145
-
146
- node.bacnetClient.on('bacnetErrorLog', (param1, param2) => {
147
- logOut(param1, param2);
148
- });
149
-
150
- node.status({});
151
-
152
- } else {
153
- // No client information found
154
- //node.status({fill:"red",shape:"dot",text:"Please define client"})
155
- }
156
-
157
- if(node.nodeName !== "gateway" &&
158
- node.nodeName !== "" &&
159
- node.nodeName !== "null" &&
160
- node.nodeName !== "undefined" &&
161
- typeof node.nodeName == "string") {
162
- if(node.bacnetServerEnabled == true && node.bacnetClient) {
163
- node.bacnetServer.setDeviceName(node.nodeName);
164
122
  }
165
123
  }
166
-
167
- node.on('input', function(msg) {
124
+ });
168
125
 
169
- if(msg.topic && msg.payload !== null) {
170
- if(node.bacnetServer) {
171
- node.bacnetServer.addObject(msg.topic, msg.payload);
172
- }
126
+ // Who Is / Iam event handler
127
+ node.bacnetClient.on('deviceFound', (device) => {
128
+ if (node.toLogIam) {
129
+ 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]}`);
131
+ } else {
132
+ node.warn(`BACnet device found: ${device.deviceId} - ${device.address}`);
173
133
  }
134
+ }
135
+ });
136
+
137
+ node.bacnetClient.on('bacnetErrorLog', (param1, param2) => {
138
+ logOut(param1, param2);
139
+ });
140
+
141
+ if (node.nodeName !== "gateway" &&
142
+ node.nodeName !== "" &&
143
+ node.nodeName !== "null" &&
144
+ node.nodeName !== "undefined" &&
145
+ typeof node.nodeName == "string") {
146
+ if (node.bacnetServerEnabled == true && node.bacnetClient) {
147
+ node.bacnetServer.setDeviceName(node.nodeName);
148
+ }
149
+ }
174
150
 
175
- if(msg.type == "Read") {
151
+ node.on('input', function (msg) {
176
152
 
177
- node.bacnetClient.doRead(msg.options, msg.outputType, msg.objectPropertyType, msg._msgid);
153
+ if (msg.topic && msg.payload !== null) {
154
+ if (node.bacnetServer) {
155
+ node.bacnetServer.addObject(msg.topic, msg.payload);
156
+ }
157
+ }
178
158
 
179
- } else if(msg.type == "Write") {
159
+ if (msg.type == "Read") {
180
160
 
181
- node.bacnetClient.doWrite(msg.value, msg.options).then(function(result){
182
- });
161
+ node.bacnetClient.doRead(msg.options, msg.outputType, msg.objectPropertyType, msg._msgid);
183
162
 
184
- } else if(msg.doDiscover == true) {
163
+ } else if (msg.type == "Write") {
185
164
 
186
- node.status({fill:"blue",shape:"dot",text:"Sending global Who is"})
165
+ node.bacnetClient.doWrite(msg.value, msg.options).then(function (result) {
166
+ });
187
167
 
188
- node.bacnetClient.globalWhoIs();
168
+ } else if (msg.doDiscover == true) {
189
169
 
190
- setTimeout(()=>{
191
- node.status({})
192
- }, 2000);
193
- } else if(msg.payload == "BindEvents") {
194
- node.bacnetClient.removeAllListeners();
195
- bindEventListeners();
196
- }
197
- });
170
+ node.status({ fill: "blue", shape: "dot", text: "Sending global Who is" })
198
171
 
199
- //route handler for network data
200
- RED.httpAdmin.get('/bitpool-bacnet-data/getNetworkTree', function(req, res) {
201
- if(!node.bacnetClient) {
202
- logOut("Issue with the bacnetClient: ", node.bacnetClient);
203
- //no bacnet client present
204
- //node.status({fill:"red",shape:"dot",text:"Please define client"});
205
- res.send(false);
206
- } else {
207
- node.bacnetClient.getNetworkTreeData().then(function(result) {
208
- res.send(result);
209
- }).catch(function(error) {
210
- res.send(error);
211
- logOut("Error getting network data: ", error);
212
- });
213
- }
214
- });
172
+ node.bacnetClient.globalWhoIs();
215
173
 
216
- //route handler for rebuild data model command
217
- RED.httpAdmin.get('/bitpool-bacnet-data/rebuildDataModel', function(req, res) {
218
- if(!node.bacnetClient) {
219
- logOut("Issue with the bacnetClient: ", node.bacnetClient);
220
- //no bacnet client present
221
- //node.status({fill:"red",shape:"dot",text:"Please define client"});
222
- res.send(false);
223
- } else {
224
- node.bacnetClient.rebuildDataModel().then(function(result) {
225
- res.send(result);
226
- }).catch(function(error) {
227
- res.send(error);
228
- logOut("Error getting network data: ", error);
229
- });
230
- }
231
- });
174
+ setTimeout(() => {
175
+ node.status({})
176
+ }, 2000);
177
+ } else if (msg.payload == "BindEvents") {
178
+ node.bacnetClient.removeAllListeners();
179
+ bindEventListeners();
180
+ }
232
181
 
233
- //route handler for the clear Bacnet server points function
234
- RED.httpAdmin.get('/bitpool-bacnet-data/clearBacnetServerPoints', function(req, res) {
235
- if(node.bacnetServerEnabled == true && node.bacnetClient) {
236
- node.bacnetServer.clearServerPoints();
237
- res.send(true);
238
- } else {
239
- res.send(false);
240
- }
241
- });
182
+ });
242
183
 
243
- //route handler for network data
244
- RED.httpAdmin.get('/bitpool-bacnet-data/getNetworkInterfaces', function(req, res) {
245
- getIpAddress().then(function(result) {
184
+ //route handler for network data
185
+ RED.httpAdmin.get('/bitpool-bacnet-data/getNetworkTree', function (req, res) {
186
+ if (!node.bacnetClient) {
187
+ logOut("Issue with the bacnetClient: ", node.bacnetClient);
188
+ //no bacnet client present
189
+ //node.status({fill:"red",shape:"dot",text:"Please define client"});
190
+ res.send(false);
191
+ } else {
192
+ node.bacnetClient.getNetworkTreeData().then(function (result) {
246
193
  res.send(result);
247
- }).catch(function(error) {
248
- logOut("Error getting network interfaces for client: ", error);
194
+ }).catch(function (error) {
195
+ res.send(error);
196
+ logOut("Error getting network data: ", error);
249
197
  });
250
- });
198
+ }
199
+ });
200
+
201
+ //route handler for rebuild data model command
202
+ RED.httpAdmin.get('/bitpool-bacnet-data/rebuildDataModel', function (req, res) {
203
+ if (!node.bacnetClient) {
204
+ logOut("Issue with the bacnetClient: ", node.bacnetClient);
205
+ //no bacnet client present
206
+ //node.status({fill:"red",shape:"dot",text:"Please define client"});
207
+ res.send(false);
208
+ } else {
209
+ node.bacnetClient.rebuildDataModel().then(function (result) {
210
+ res.send(result);
211
+ }).catch(function (error) {
212
+ res.send(error);
213
+ logOut("Error getting network data: ", error);
214
+ });
215
+ }
216
+ });
251
217
 
252
- node.on('close', function() {
253
- //do nothing
218
+ //route handler for the clear Bacnet server points function
219
+ RED.httpAdmin.get('/bitpool-bacnet-data/clearBacnetServerPoints', function (req, res) {
220
+ if (node.bacnetServerEnabled == true && node.bacnetClient) {
221
+ node.bacnetServer.clearServerPoints();
222
+ res.send(true);
223
+ } else {
224
+ res.send(false);
225
+ }
226
+ });
227
+
228
+ //route handler for network data
229
+ RED.httpAdmin.get('/bitpool-bacnet-data/getNetworkInterfaces', function (req, res) {
230
+ getIpAddress().then(function (result) {
231
+ res.send(result);
232
+ }).catch(function (error) {
233
+ logOut("Error getting network interfaces for client: ", error);
254
234
  });
235
+ });
255
236
 
256
- function bindEventListeners() {
257
- // Value response event handler for READ commands
258
- node.bacnetClient.on('values', (device, values, outputType, msgId, fullResult) => {
259
- if (outputType.json && !outputType.mqtt) {
260
- if(objectPropertyType.fullObject && objectPropertyType.simplePayload) {
261
- sendSimpleJson(values);
262
- sendJsonAsMqtt(values);
263
- } else if(objectPropertyType.fullObject && !objectPropertyType.simplePayload) {
264
- sendJsonAsMqtt(values);
265
- } else if(!objectPropertyType.fullObject && objectPropertyType.simplePayload) {
266
- sendSimpleJson(values);
267
- }
268
- } else if(!outputType.json && outputType.mqtt) {
269
- if(objectPropertyType.fullObject && objectPropertyType.simplePayload) {
270
- sendAsMqtt(values);
271
- sendSimpleMqtt(values);
272
- } else if(objectPropertyType.fullObject && !objectPropertyType.simplePayload) {
273
- sendAsMqtt(values);
274
- } else if(!objectPropertyType.fullObject && objectPropertyType.simplePayload) {
275
- sendSimpleMqtt(values);
276
- }
277
- }
237
+ //route handler for getting device list
238
+ RED.httpAdmin.get('/bitpool-bacnet-data/getDeviceList', function (req, res) {
239
+ if (!node.bacnetClient) {
240
+ logOut("Issue with the bacnetClient while getting device list: ", node.bacnetClient);
241
+ res.send(false);
242
+ } else {
243
+ node.bacnetClient.getDeviceList().then(function (result) {
244
+ res.send(result);
245
+ }).catch(function (error) {
246
+ res.send(error);
247
+ logOut("Error getting network data: ", error);
278
248
  });
249
+ }
250
+ });
279
251
 
280
- // Who Is / Iam event handler
281
- node.bacnetClient.on('deviceFound', (device) => {
282
- if(node.toLogIam) node.warn(`BACnet device found: ${device.deviceId} - ${device.address}`);
252
+ //route handler for updating device list
253
+ RED.httpAdmin.post('/bitpool-bacnet-data/updateDeviceList', function (req, res) {
254
+ if (!node.bacnetClient) {
255
+ logOut("Issue with the bacnetClient while getting device list: ", node.bacnetClient);
256
+ res.send(false);
257
+ } else {
258
+ node.bacnetClient.updateDeviceList(req).then(function (result) {
259
+ res.send(result);
260
+ }).catch(function (error) {
261
+ res.send(error);
262
+ logOut("Error getting network data: ", error);
283
263
  });
284
264
  }
285
-
286
- function logOut(param1, param2) {
287
- if(node.logErrorToConsole == true) {
288
- if(arguments.length == 1) {
289
- console.log("BACnet Error: ");
290
- console.log(param1);
291
- } else if(arguments.length == 2) {
292
- console.log("BACnet Error: ");
293
- console.log(param1, param2);
265
+ });
266
+
267
+ node.on('close', function () {
268
+ //do nothing
269
+ });
270
+
271
+ function bindEventListeners() {
272
+ // Value response event handler for READ commands
273
+ node.bacnetClient.on('values', (device, values, outputType, msgId, fullResult) => {
274
+ if (outputType.json && !outputType.mqtt) {
275
+ if (objectPropertyType.fullObject && objectPropertyType.simplePayload) {
276
+ sendSimpleJson(values);
277
+ sendJsonAsMqtt(values);
278
+ } else if (objectPropertyType.fullObject && !objectPropertyType.simplePayload) {
279
+ sendJsonAsMqtt(values);
280
+ } else if (!objectPropertyType.fullObject && objectPropertyType.simplePayload) {
281
+ sendSimpleJson(values);
282
+ }
283
+ } else if (!outputType.json && outputType.mqtt) {
284
+ if (objectPropertyType.fullObject && objectPropertyType.simplePayload) {
285
+ sendAsMqtt(values);
286
+ sendSimpleMqtt(values);
287
+ } else if (objectPropertyType.fullObject && !objectPropertyType.simplePayload) {
288
+ sendAsMqtt(values);
289
+ } else if (!objectPropertyType.fullObject && objectPropertyType.simplePayload) {
290
+ sendSimpleMqtt(values);
294
291
  }
295
292
  }
296
- }
293
+ });
297
294
 
298
- // Returns true if any config values have changed
299
- function configHasChanged() {
300
- if(node.bacnetConfig == null){ return true;}
301
- if(node.bacnetClient == null){ return true;}
302
- if(node.localDeviceAddress !== node.bacnetConfig.localIpAdrress){ return true;}
303
- if(node.local_device_port !== node.bacnetConfig.port){ return true;}
304
- if(node.apduSize !== node.bacnetConfig.apduSize){ return true;}
305
- if(node.maxSegments !== node.bacnetConfig.maxSegments){ return true;}
306
- if(node.broadCastAddr !== node.bacnetConfig.broadCastAddr){ return true;}
307
- if(node.apduTimeout !== node.bacnetConfig.apduTimeout){ return true;}
308
- if(node.device_id_range_enabled !== node.bacnetConfig.device_id_range_enabled){ return true;}
309
- if(node.device_id_range_start !== node.bacnetConfig.device_id_range_start){ return true;}
310
- if(node.device_id_range_end !== node.bacnetConfig.device_id_range_end){ return true;}
311
- if(node.toRestartNodeRed !== node.bacnetConfig.toRestartNodeRed){ return true;}
312
- if(node.manual_instance_range_enabled !== node.bacnetConfig.manual_instance_range_enabled){ return true;}
313
- if(node.manual_instance_range_start !== node.bacnetConfig.manual_instance_range_start){ return true;}
314
- if(node.manual_instance_range_end !== node.bacnetConfig.manual_instance_range_end){ return true;}
315
- if(node.bacnetServerEnabled !== node.bacnetConfig.bacnetServerEnabled){ return true;}
316
- if(node.deviceId !== node.bacnetConfig.deviceId){ return true;}
317
-
318
- return false;
319
- };
320
-
321
- sendSimpleMqtt = function(values) {
322
- let devices = Object.keys(values);
323
- devices.forEach(function(device) {
324
- if(device !== "_msgid") {
325
- let points = values[device];
326
- for(var point in points) {
327
- if(points[point]){
328
- let pointProps = Object.keys(points[point]);
329
- pointProps.forEach(function(prop) {
330
- let msg = {};
331
- if(prop == "presentValue") {
332
- if(node.nodeName !== "gateway" &&
333
- node.nodeName !== "" &&
334
- node.nodeName !== "null" &&
335
- node.nodeName !== "undefined" &&
336
- typeof node.nodeName == "string") {
337
- msg.topic = `${node.nodeName}/${device}/${point}`;
338
- } else {
339
- msg.topic = `BITPOOL_BACNET_GATEWAY/${device}/${point}`;
340
- }
341
- msg.payload = points[point][prop];
342
- node.send(msg);
295
+ // Who Is / Iam event handler
296
+ node.bacnetClient.on('deviceFound', (device) => {
297
+ if (node.toLogIam) node.warn(`BACnet device found: ${device.deviceId} - ${device.address}`);
298
+ });
299
+ }
300
+
301
+ function logOut(param1, param2) {
302
+ if (node.logErrorToConsole == true) {
303
+ if (arguments.length == 1) {
304
+ console.log("BACnet Error: ");
305
+ console.log(param1);
306
+ } else if (arguments.length == 2) {
307
+ console.log("BACnet Error: ");
308
+ console.log(param1, param2);
309
+ }
310
+ }
311
+ }
312
+
313
+ sendSimpleMqtt = function (values) {
314
+ let devices = Object.keys(values);
315
+ devices.forEach(function (device) {
316
+ if (device !== "_msgid") {
317
+ let points = values[device];
318
+ for (var point in points) {
319
+ if (points[point]) {
320
+ let pointProps = Object.keys(points[point]);
321
+ pointProps.forEach(function (prop) {
322
+ let msg = {};
323
+ if (prop == "presentValue") {
324
+ if (node.nodeName !== "gateway" &&
325
+ node.nodeName !== "" &&
326
+ node.nodeName !== "null" &&
327
+ node.nodeName !== "undefined" &&
328
+ typeof node.nodeName == "string") {
329
+ msg.topic = `${node.nodeName}/${device}/${point}`;
330
+ } else {
331
+ msg.topic = `BITPOOL_BACNET_GATEWAY/${device}/${point}`;
343
332
  }
344
- });
333
+ msg.payload = points[point][prop];
334
+ node.send(msg);
335
+ }
336
+ });
345
337
 
346
- }
347
338
  }
348
339
  }
349
- });
350
- };
351
-
352
- // Breaks down response JSON object into mqtt topic / payload
353
- sendAsMqtt = function(values) {
354
- let devices = Object.keys(values);
355
- devices.forEach(function(device) {
356
- if(device !== "_msgid") {
357
- let points = values[device];
358
- for(var point in points) {
359
- if(points[point]){
360
- let pointProps = Object.keys(points[point]);
361
- pointProps.forEach(function(prop) {
362
- let msg = {};
363
- if(prop !== "objectName") {
364
- if(node.nodeName !== "gateway" &&
365
- node.nodeName !== "" &&
366
- node.nodeName !== "null" &&
367
- node.nodeName !== "undefined" &&
368
- typeof node.nodeName == "string") {
369
- msg.topic = `${node.nodeName}/${device}/${point}/${prop}`;
370
- } else {
371
- msg.topic = `BITPOOL_BACNET_GATEWAY/${device}/${point}/${prop}`;
372
- }
373
- msg.payload = points[point][prop];
374
- node.send(msg);
340
+ }
341
+ });
342
+ };
343
+
344
+
345
+ // Breaks down response JSON object into mqtt topic / payload
346
+ sendAsMqtt = function (values) {
347
+ let devices = Object.keys(values);
348
+ devices.forEach(function (device) {
349
+ if (device !== "_msgid") {
350
+ let points = values[device];
351
+ for (var point in points) {
352
+ if (points[point]) {
353
+ let pointProps = Object.keys(points[point]);
354
+ pointProps.forEach(function (prop) {
355
+ let msg = {};
356
+ if (prop !== "objectName") {
357
+ if (node.nodeName !== "gateway" &&
358
+ node.nodeName !== "" &&
359
+ node.nodeName !== "null" &&
360
+ node.nodeName !== "undefined" &&
361
+ typeof node.nodeName == "string") {
362
+ msg.topic = `${node.nodeName}/${device}/${point}/${prop}`;
363
+ } else {
364
+ msg.topic = `BITPOOL_BACNET_GATEWAY/${device}/${point}/${prop}`;
375
365
  }
376
- });
377
- }
366
+ msg.payload = points[point][prop];
367
+ node.send(msg);
368
+ }
369
+ });
378
370
  }
379
371
  }
380
- });
381
- };
382
-
383
- sendSimpleJson = function(values) {
384
- let devices = Object.keys(values);
385
- devices.forEach(function(device) {
386
- let msgg = {};
387
- if(device !== "_msgid") {
388
- let value = {
389
- [device]: {}
390
- };
391
- let points = values[device];
392
-
393
- for(var point in points) {
394
- if(points[point]){
395
- let pointProps = Object.keys(points[point]);
396
- pointProps.forEach(function(prop) {
397
- if(prop == "presentValue") {
398
- value[device][point] = {
399
- "presentValue": points[point][prop]
400
- };
401
- }
402
- });
403
- }
372
+ }
373
+ });
374
+ };
404
375
 
376
+ sendSimpleJson = function (values) {
377
+ let devices = Object.keys(values);
378
+ devices.forEach(function (device) {
379
+ let msgg = {};
380
+ if (device !== "_msgid") {
381
+ let value = {
382
+ [device]: {}
383
+ };
384
+ let points = values[device];
385
+
386
+ for (var point in points) {
387
+ if (points[point]) {
388
+ let pointProps = Object.keys(points[point]);
389
+ pointProps.forEach(function (prop) {
390
+ if (prop == "presentValue") {
391
+ value[device][point] = {
392
+ "presentValue": points[point][prop]
393
+ };
394
+ }
395
+ });
405
396
  }
406
- if(node.nodeName !== "gateway" &&
407
- node.nodeName !== "" &&
408
- node.nodeName !== "null" &&
409
- node.nodeName !== "undefined" &&
397
+
398
+ }
399
+ if (node.nodeName !== "gateway" &&
400
+ node.nodeName !== "" &&
401
+ node.nodeName !== "null" &&
402
+ node.nodeName !== "undefined" &&
410
403
  typeof node.nodeName == "string") {
411
- msgg.topic = `${node.nodeName}/${device}`;
412
- } else {
413
- msgg.topic = `BITPOOL_BACNET_GATEWAY/${device}`;
414
- }
415
- msgg.payload = value[device];
416
- node.send(msgg);
404
+ msgg.topic = `${node.nodeName}/${device}`;
405
+ } else {
406
+ msgg.topic = `BITPOOL_BACNET_GATEWAY/${device}`;
417
407
  }
418
- });
419
- };
420
-
421
- sendJsonAsMqtt = function(values) {
422
- if(typeof values == "object") {
423
- let keys = Object.keys(values);
424
- keys.forEach(function(key) {
425
- let points = values[key];
426
- let msgg = {};
427
-
428
- if(node.nodeName !== "gateway" &&
429
- node.nodeName !== "" &&
430
- node.nodeName !== "null" &&
431
- node.nodeName !== "undefined" &&
432
- typeof node.nodeName == "string") {
433
- msgg.topic = `${node.nodeName}/${key}`;
434
- } else {
435
- msgg.topic = `BITPOOL_BACNET_GATEWAY/${key}`;
436
- }
437
- msgg.payload = points;
438
- node.send(msgg);
439
- });
408
+ msgg.payload = value[device];
409
+ node.send(msgg);
440
410
  }
441
- };
411
+ });
412
+ };
413
+
414
+ sendJsonAsMqtt = function (values) {
415
+ if (typeof values == "object") {
416
+ let keys = Object.keys(values);
417
+ keys.forEach(function (key) {
418
+ let points = values[key];
419
+ let msgg = {};
442
420
 
421
+ if (node.nodeName !== "gateway" &&
422
+ node.nodeName !== "" &&
423
+ node.nodeName !== "null" &&
424
+ node.nodeName !== "undefined" &&
425
+ typeof node.nodeName == "string") {
426
+ msgg.topic = `${node.nodeName}/${key}`;
427
+ } else {
428
+ msgg.topic = `BITPOOL_BACNET_GATEWAY/${key}`;
429
+ }
430
+ msgg.payload = points;
431
+ node.send(msgg);
432
+ });
433
+ }
443
434
  };
444
435
 
445
- RED.nodes.registerType('Bacnet-Gateway', BitpoolBacnetGatewayDevice);
436
+ };
437
+
438
+ RED.nodes.registerType('Bacnet-Gateway', BitpoolBacnetGatewayDevice);
446
439
  };