@ncd-io/node-red-enterprise-sensors 0.1.14 → 0.1.16

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/lib/DigiParser.js CHANGED
@@ -172,7 +172,8 @@ class outgoingFrame{
172
172
  var config = this.transmissionOptions(opts);
173
173
  var frame = [17, this.master.getId()];
174
174
  frame.push(...mac);
175
- frame.push([255, 254, source, destination, cluster[0], cluster[1], profile[0], profile[1], (config >> 8), (config & 255)]);
175
+ var stuff = [255, 254, source, destination, cluster[0], cluster[1], profile[0], profile[1], (config >> 8), (config & 255)];
176
+ frame.push(...stuff);
176
177
  if(data.constructor != Array) data = [data];
177
178
  frame.push(...data);
178
179
  return this.master._send(frame);
@@ -10,6 +10,12 @@ module.exports = class WirelessSensor{
10
10
  this.sensor_pool = {};
11
11
  this.sensor_types = sensor_types(this);
12
12
  this.queue = new Queue(1);
13
+
14
+ //route info and link quality objects
15
+ this.mesh_map = {};
16
+ this.link_quality = {};
17
+ this.query_pool = {};
18
+
13
19
  this.payloadType = {
14
20
  '122': 'power_up',
15
21
  '124': 'config_ack',
@@ -27,10 +33,21 @@ module.exports = class WirelessSensor{
27
33
  console.log(e);
28
34
  }
29
35
  }
36
+ function routeReceiver(frame){
37
+ that.parse_route_information_packet(frame);
38
+ }
39
+ function linkQualtiyReceiver(frame){
40
+ that.parse_link_quality_packet(frame);
41
+ }
42
+
30
43
  this.digi.on('receive_packet', receiver);
44
+ this.digi.on('explicit_rx_indicator', linkQualtiyReceiver);
45
+ this.digi.on('route_information_packet', routeReceiver);
31
46
  this.on('close', () => {
32
47
  //console.log('removing listener');
33
48
  this.digi._emitter.removeListener('receive_packet', receiver);
49
+ this.digi._emitter.removeListener('explicit_rx_indicator',linkQualtiyReceiver);
50
+ this.digi._emitter.removeListener('route_information_packet',routeReceiver);
34
51
  });
35
52
  }
36
53
  send_control(type, mac, msg){
@@ -47,6 +64,64 @@ module.exports = class WirelessSensor{
47
64
  this._emitter.emit('close');
48
65
  this.digi.close();
49
66
  }
67
+
68
+ parse_route_information_packet(frame){
69
+ var destination = frame.destination_mac;
70
+ var route_array = this.mesh_map[destination];
71
+ var index = this.query_pool[destination];
72
+ //This is the route packet from the modem
73
+ if(frame.source_mac == frame.responder_mac){
74
+ //Add Gateway MAC as first element of array.
75
+ route_array[0] = frame.source_mac;
76
+ //Add Receiver MAC as second item in array
77
+ route_array[1] = frame.receiver_mac;
78
+ if(frame.receiver_mac == frame.destination_mac){
79
+ //if receiver is the sensor then connection is direct from gateway to receiver so emit route info
80
+ var msg_obj = {};
81
+ msg_obj.route = route_array;
82
+ msg_obj.timestamp = Date.now();
83
+ this._emitter.emit("route_info",msg_obj);
84
+ }
85
+ }else{
86
+ //This is the final route packet
87
+ if(frame.receiver_mac == destination){
88
+ route_array.push(frame.receiver_mac);
89
+ var msg_obj = {};
90
+ msg_obj.route = route_array;
91
+ msg_obj.timestamp = Date.now();
92
+ this._emitter.emit("route_info",msg_obj);
93
+ delete this.query_pool[frame.destination_mac];
94
+ }else{
95
+ // This is an intermediate packet
96
+ if(frame.responder_mac == route_array[this.query_pool[destination]]){
97
+ route_array.push(frame.receiver_mac);
98
+ }
99
+ }
100
+
101
+ }
102
+ //increment mesh hops index
103
+ this.query_pool[destination]++;
104
+ }
105
+
106
+ parse_link_quality_packet(frame){
107
+ console.log("parse_link_quality_packet: "+frame);
108
+ var msg_obj = {};
109
+ msg_obj.source_address = frame.source_mac;
110
+ msg_obj.destination = toMac(frame.data.slice(0,8));
111
+ msg_obj.payload_size = msbLsb(frame.data[8],frame.data[9]);
112
+ msg_obj.iterations = msbLsb(frame.data[10], frame.data[11]);
113
+ msg_obj.successful_iterations = msbLsb(frame.data[12],frame.data[13]);
114
+ msg_obj.retries = msbLsb(frame.data[14],frame.data[15]);
115
+ msg_obj.result = frame.data[16] == 0 ? "success":"failed"
116
+ msg_obj.max_allowed_retries = frame.data[17];
117
+ msg_obj.max_rssi = 0 - frame.data[18];
118
+ msg_obj.min_rssi = 0 - frame.data[19];
119
+ msg_obj.avg_rssi = 0 - frame.data[20];
120
+ msg_obj.timestamp = Date.now();
121
+
122
+ this._emitter.emit("link_info",msg_obj);
123
+ }
124
+
50
125
  parse(frame){
51
126
  var type = this.payloadType[frame.data[0]];
52
127
  if(typeof this[type] == 'function'){
@@ -62,7 +137,7 @@ module.exports = class WirelessSensor{
62
137
  var new_mode = is_new;
63
138
  var mode = (type == 'power_up') ? data.mode : ((type == 'sensor_data') ? 'RUN' : ((type == 'config_ack') ? 'ACK' : 'PGM'));
64
139
  // #OTF
65
- var otf_devices = [23,26,45,48,78,79,80,81,82,84,88,89,91,101,102,519,520,521,531,537];
140
+ var otf_devices = [23,26,39,45,48,52,78,79,80,81,82,84,88,89,91,101,102,107,519,520,521,531,537];
66
141
  var device_type = msbLsb(frame.data[6], frame.data[7]);
67
142
  // var device_type = frame.data[7];
68
143
 
@@ -214,7 +289,7 @@ module.exports = class WirelessSensor{
214
289
  };
215
290
 
216
291
  // #OTF
217
- var otf_devices = [23,26,45,48,78,79,80,81,82,84,88,89,91,101,102,519,520,521,531,537];
292
+ var otf_devices = [23,26,39,45,48,52,78,79,80,81,82,84,88,89,91,101,102,107,519,520,521,531,537];
218
293
  if(otf_devices.includes(parsed.sensor_type)){
219
294
  // If the message says FLY and there is not FLY timer in progress.
220
295
  if(payload[8] == 70 && payload[9] == 76 && payload[10] == 89) {
@@ -1515,6 +1590,123 @@ module.exports = class WirelessSensor{
1515
1590
  });
1516
1591
  });
1517
1592
  }
1593
+ route_discover(sensor_mac, opts){
1594
+ var data = [85];
1595
+ var that = this;
1596
+ return new Promise((fulfill, reject) => {
1597
+ that.queue.add(() => {
1598
+ return new Promise((f, r) => {
1599
+ var failed = false;
1600
+ var retries = 0;
1601
+ var tO;
1602
+ function fail(packet){
1603
+ failed = true;
1604
+ clearTimeout(tO);
1605
+ that._emitter.removeListener('receive_packet-'+sensor_mac, pass);
1606
+ that._emitter.removeListener('transmit_status-'+sensor_mac, pass);
1607
+ reject({
1608
+ err: packet,
1609
+ sent: [sensor_mac, data]
1610
+ });
1611
+ r();
1612
+ }
1613
+ function pass(packet){
1614
+ if(failed) return;
1615
+ clearTimeout(tO);
1616
+ fulfill(packet);
1617
+ f();
1618
+ };
1619
+
1620
+ function send(){
1621
+ that.send.transmit_request(mac2bytes(sensor_mac), data, opts).then(function(frame){
1622
+ if(frame.delivery_status == 'Success'){
1623
+ pass(frame);
1624
+ }else{
1625
+ tO = setTimeout(() => {
1626
+ if(retries < 1){
1627
+ retries++;
1628
+ send();
1629
+ }else{
1630
+ fail('Control response timeout');
1631
+ }
1632
+ }, 1000);
1633
+ }
1634
+ }).catch(fail);
1635
+ }
1636
+ that.query_pool[sensor_mac] = 0;
1637
+ if(that.mesh_map.hasOwnProperty(sensor_mac)){
1638
+ delete that.mesh_map[sensor_mac];
1639
+ }
1640
+ that.mesh_map[sensor_mac] = [];
1641
+ if(that.link_quality.hasOwnProperty(sensor_mac)){
1642
+ delete that.link_quality[sensor_mac];
1643
+ }
1644
+ that.link_quality = {};
1645
+ send();
1646
+ });
1647
+ });
1648
+ });
1649
+ }
1650
+ link_test(source_mac,destination_mac,opts){
1651
+ var that = this;
1652
+ return new Promise((fulfill, reject) => {
1653
+ that.queue.add(() => {
1654
+ return new Promise((f, r) => {
1655
+ var failed = false;
1656
+ var retries = 0;
1657
+ var tO;
1658
+ function fail(packet){
1659
+ failed = true;
1660
+ clearTimeout(tO);
1661
+ that._emitter.removeListener('receive_packet-'+source_mac, pass);
1662
+ that._emitter.removeListener('transmit_status-'+source_mac, pass);
1663
+ reject({
1664
+ err: packet,
1665
+ sent: [source_mac]
1666
+ });
1667
+ r();
1668
+ }
1669
+ function pass(packet){
1670
+ if(failed) return;
1671
+ clearTimeout(tO);
1672
+ fulfill(packet);
1673
+ f();
1674
+ };
1675
+
1676
+ function send(){
1677
+ var cluster = [0,20];
1678
+ var profile = [193, 5];
1679
+ var data = [];
1680
+ data.push(...mac2bytes(destination_mac));
1681
+ var payload_size = [0,200];
1682
+ var iterations = [0,200];
1683
+ data.push(...payload_size);
1684
+ data.push(...iterations);
1685
+
1686
+ var hexArray = [];
1687
+ data.forEach((b) => hexArray.push(toHex(b)));
1688
+
1689
+ var opts = {"method":3};
1690
+ that.send.explicit_addressing_command(mac2bytes(source_mac), 230, 230, cluster, profile, data, opts).then(function(frame){
1691
+ if(frame.delivery_status == 'Success'){
1692
+ pass(frame);
1693
+ }else{
1694
+ tO = setTimeout(() => {
1695
+ if(retries < 1){
1696
+ retries++;
1697
+ send();
1698
+ }else{
1699
+ fail('Control response timeout');
1700
+ }
1701
+ }, 1000);
1702
+ }
1703
+ }).catch(fail);
1704
+ }
1705
+ send();
1706
+ });
1707
+ });
1708
+ });
1709
+ }
1518
1710
  on(e,cb){this._emitter.on(e,cb);}
1519
1711
  };
1520
1712
 
@@ -2038,18 +2230,37 @@ function sensor_types(parent){
2038
2230
  'name': '24-Bit 6-Channel Current Monitor',
2039
2231
  parse: (d) => {
2040
2232
  return {
2041
- channel_1: d.slice(0, 3).reduce(msbLsb),
2042
- channel_2: d.slice(4, 7).reduce(msbLsb),
2043
- channel_3: d.slice(8, 11).reduce(msbLsb),
2044
- channel_1: d.slice(12, 15).reduce(msbLsb),
2045
- channel_2: d.slice(16, 19).reduce(msbLsb),
2046
- channel_3: d.slice(20, 23).reduce(msbLsb)
2233
+ ct1_rms: d.slice(0, 4).reduce(msbLsb),
2234
+ ct1_peak_1: d.slice(4, 6).reduce(msbLsb),
2235
+ ct1_peak_2: d.slice(6, 8).reduce(msbLsb),
2236
+ ct1_peak_3: d.slice(8, 10).reduce(msbLsb),
2237
+ ct2_rms: d.slice(10, 14).reduce(msbLsb),
2238
+ ct2_peak_1: d.slice(14, 16).reduce(msbLsb),
2239
+ ct2_peak_2: d.slice(16, 18).reduce(msbLsb),
2240
+ ct2_peak_3: d.slice(18, 20).reduce(msbLsb),
2241
+ ct3_rms: d.slice(20, 24).reduce(msbLsb),
2242
+ ct3_peak_1: d.slice(24, 26).reduce(msbLsb),
2243
+ ct3_peak_2: d.slice(26, 28).reduce(msbLsb),
2244
+ ct3_peak_3: d.slice(28, 30).reduce(msbLsb),
2245
+ ct4_rms: d.slice(30, 34).reduce(msbLsb),
2246
+ ct4_peak_1: d.slice(34, 36).reduce(msbLsb),
2247
+ ct4_peak_2: d.slice(36, 38).reduce(msbLsb),
2248
+ ct4_peak_3: d.slice(38, 40).reduce(msbLsb),
2249
+ ct5_rms: d.slice(40, 44).reduce(msbLsb),
2250
+ ct5_peak_1: d.slice(44, 46).reduce(msbLsb),
2251
+ ct5_peak_2: d.slice(46, 48).reduce(msbLsb),
2252
+ ct5_peak_3: d.slice(48, 50).reduce(msbLsb),
2253
+ ct6_rms: d.slice(50, 54).reduce(msbLsb),
2254
+ ct6_peak_1: d.slice(54, 56).reduce(msbLsb),
2255
+ ct6_peak_2: d.slice(56, 58).reduce(msbLsb),
2256
+ ct6_peak_3: d.slice(58, 60).reduce(msbLsb)
2047
2257
  };
2048
2258
  }
2049
2259
  },
2050
2260
  '52': {
2051
2261
  name: '16-Bit 2-Channel 4-20mA',
2052
2262
  parse: (d) => {
2263
+ // This parser may be outdated if a customer has an issue check with Engineering
2053
2264
  var adc1 = signInt(d.slice(0, 2).reduce(msbLsb));
2054
2265
  var adc2 = signInt(d.slice(2, 4).reduce(msbLsb));
2055
2266
  return {
@@ -2589,13 +2800,13 @@ function sensor_types(parent){
2589
2800
  fft_concat[label] = {};
2590
2801
 
2591
2802
  if('x_offset' in en_axis_data){
2592
- fft_concat[label].x = parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(5));
2803
+ fft_concat[label].x = parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(2));
2593
2804
  }
2594
2805
  if('y_offset' in en_axis_data){
2595
- fft_concat[label].y = parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(5));
2806
+ fft_concat[label].y = parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(2));
2596
2807
  }
2597
2808
  if('z_offset' in en_axis_data){
2598
- fft_concat[label].z = parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(5));
2809
+ fft_concat[label].z = parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(2));
2599
2810
  }
2600
2811
  }
2601
2812
  var fft_concat_obj = {
@@ -3203,13 +3414,13 @@ function sensor_types(parent){
3203
3414
  fft_concat[label] = {};
3204
3415
 
3205
3416
  if('x_offset' in en_axis_data){
3206
- fft_concat[label].x = parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(5));
3417
+ fft_concat[label].x = parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(2));
3207
3418
  }
3208
3419
  if('y_offset' in en_axis_data){
3209
- fft_concat[label].y = parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(5));
3420
+ fft_concat[label].y = parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(2));
3210
3421
  }
3211
3422
  if('z_offset' in en_axis_data){
3212
- fft_concat[label].z = parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(5));
3423
+ fft_concat[label].z = parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(2));
3213
3424
  }
3214
3425
  }
3215
3426
 
@@ -4003,13 +4214,13 @@ function sensor_types(parent){
4003
4214
  fft_concat[label] = {};
4004
4215
 
4005
4216
  if('x_offset' in en_axis_data){
4006
- fft_concat[label].x = parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(5));
4217
+ fft_concat[label].x = parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(2));
4007
4218
  }
4008
4219
  if('y_offset' in en_axis_data){
4009
- fft_concat[label].y = parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(5));
4220
+ fft_concat[label].y = parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(2));
4010
4221
  }
4011
4222
  if('z_offset' in en_axis_data){
4012
- fft_concat[label].z = parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(5));
4223
+ fft_concat[label].z = parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(2));
4013
4224
  }
4014
4225
  }
4015
4226
  var fft_concat_obj = {
@@ -4619,13 +4830,13 @@ function sensor_types(parent){
4619
4830
  fft_concat[label] = {};
4620
4831
 
4621
4832
  if('x_offset' in en_axis_data){
4622
- fft_concat[label].x = parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(5));
4833
+ fft_concat[label].x = parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(2));
4623
4834
  }
4624
4835
  if('y_offset' in en_axis_data){
4625
- fft_concat[label].y = parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(5));
4836
+ fft_concat[label].y = parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(2));
4626
4837
  }
4627
4838
  if('z_offset' in en_axis_data){
4628
- fft_concat[label].z = parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(5));
4839
+ fft_concat[label].z = parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(2));
4629
4840
  }
4630
4841
  }
4631
4842
  var fft_concat_obj = {
@@ -5046,6 +5257,29 @@ function sensor_types(parent){
5046
5257
  };
5047
5258
  }
5048
5259
  },
5260
+ '107': {
5261
+ name: '16-Bit 4-Channel 4-20mA',
5262
+ parse: (d) => {
5263
+ var adc1 = signInt(d.slice(0, 2).reduce(msbLsb));
5264
+ var adc2 = signInt(d.slice(2, 4).reduce(msbLsb));
5265
+ var adc3 = signInt(d.slice(4, 6).reduce(msbLsb));
5266
+ var adc4 = signInt(d.slice(6, 8).reduce(msbLsb));
5267
+ var ma1 = (signInt(d.slice(8, 10).reduce(msbLsb)))/100.0;
5268
+ var ma2 = (signInt(d.slice(10, 12).reduce(msbLsb)))/100.0;
5269
+ var ma3 = (signInt(d.slice(12, 14).reduce(msbLsb)))/100.0;
5270
+ var ma4 = (signInt(d.slice(14, 16).reduce(msbLsb)))/100.0;
5271
+ return {
5272
+ adc1: adc1,
5273
+ adc2: adc2,
5274
+ adc3: adc3,
5275
+ adc4: adc4,
5276
+ ma1: ma1,
5277
+ ma2: ma2,
5278
+ ma3: ma3,
5279
+ ma4: ma4
5280
+ };
5281
+ }
5282
+ },
5049
5283
  '200': {
5050
5284
  name: '4-20mA Pass Through',
5051
5285
  parse: (d) => {
@@ -5551,13 +5785,13 @@ function sensor_types(parent){
5551
5785
  fft_concat[label] = {};
5552
5786
 
5553
5787
  if('x_offset' in en_axis_data){
5554
- fft_concat[label].x = parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(5));
5788
+ fft_concat[label].x = parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(2));
5555
5789
  }
5556
5790
  if('y_offset' in en_axis_data){
5557
- fft_concat[label].y = parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(5));
5791
+ fft_concat[label].y = parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(2));
5558
5792
  }
5559
5793
  if('z_offset' in en_axis_data){
5560
- fft_concat[label].z = parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(5));
5794
+ fft_concat[label].z = parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(2));
5561
5795
  }
5562
5796
  }
5563
5797
  var fft_concat_obj = {
@@ -5974,32 +6208,42 @@ function sensor_types(parent){
5974
6208
  parse: (payload, parsed) => {
5975
6209
  return {
5976
6210
  moisture_1: payload.slice(0, 2).reduce(msbLsb)/100,
5977
- temp_1: payload.slice(2, 4).reduce(msbLsb)/100,
6211
+ temp_1: signInt(payload.slice(2, 4).reduce(msbLsb))/100,
5978
6212
  moisture_2: payload.slice(4, 6).reduce(msbLsb)/100,
5979
- temp_2: payload.slice(6, 8).reduce(msbLsb)/100,
6213
+ temp_2: signInt(payload.slice(6, 8).reduce(msbLsb))/100,
5980
6214
  moisture_3: payload.slice(8, 10).reduce(msbLsb)/100,
5981
- temp_3: payload.slice(10, 12).reduce(msbLsb)/100,
6215
+ temp_3: signInt(payload.slice(10, 12).reduce(msbLsb))/100,
5982
6216
  moisture_4: payload.slice(12, 14).reduce(msbLsb)/100,
5983
- temp_4: payload.slice(14, 16).reduce(msbLsb)/100,
6217
+ temp_4: signInt(payload.slice(14, 16).reduce(msbLsb))/100,
5984
6218
  moisture_5: payload.slice(16, 18).reduce(msbLsb)/100,
5985
- temp_5: payload.slice(18, 20).reduce(msbLsb)/100,
6219
+ temp_5: signInt(payload.slice(18, 20).reduce(msbLsb))/100,
5986
6220
  moisture_6: payload.slice(20, 22).reduce(msbLsb)/100,
5987
- temp_6: payload.slice(22, 24).reduce(msbLsb)/100
6221
+ temp_6: signInt(payload.slice(22, 24).reduce(msbLsb))/100
5988
6222
  }
5989
6223
  }
5990
6224
  },
5991
6225
  '531': {
5992
6226
  name: 'Custom Noise Sensor',
5993
- parse: (d) => {
5994
- return {
5995
- rms_dba: d[0],
5996
- c1_dba: d[1],
5997
- c1_freq: d.slice(2, 4).reduce(msbLsb),
5998
- c2_dba: d[4],
5999
- c2_freq: d.slice(5, 7).reduce(msbLsb),
6000
- c3_dba: d[7],
6001
- c3_freq: d.slice(8, 10).reduce(msbLsb),
6002
- };
6227
+ parse: (d, p) => {
6228
+ let firmware = p[1];
6229
+ if(firmware > 1){
6230
+ return {
6231
+ rms_dba: d[0],
6232
+ c1_dba: d[1],
6233
+ c1_freq: d.slice(2, 4).reduce(msbLsb),
6234
+ c2_dba: d[4],
6235
+ c2_freq: d.slice(5, 7).reduce(msbLsb),
6236
+ c3_dba: d[7],
6237
+ c3_freq: d.slice(8, 10).reduce(msbLsb),
6238
+ };
6239
+ }else{
6240
+ return {
6241
+ noise_db: d[0],
6242
+ peak_freq_1: d.slice(1, 3).reduce(msbLsb),
6243
+ peak_freq_2: d.slice(3, 5).reduce(msbLsb),
6244
+ peak_freq_3: d.slice(5, 7).reduce(msbLsb)
6245
+ };
6246
+ }
6003
6247
  }
6004
6248
  },
6005
6249
  '537': {
@@ -6250,13 +6494,13 @@ function sensor_types(parent){
6250
6494
  fft_concat[label] = {};
6251
6495
 
6252
6496
  if('x_offset' in en_axis_data){
6253
- fft_concat[label].x = parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(5));
6497
+ fft_concat[label].x = parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(2));
6254
6498
  }
6255
6499
  if('y_offset' in en_axis_data){
6256
- fft_concat[label].y = parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(5));
6500
+ fft_concat[label].y = parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(2));
6257
6501
  }
6258
6502
  if('z_offset' in en_axis_data){
6259
- fft_concat[label].z = parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(5));
6503
+ fft_concat[label].z = parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(2));
6260
6504
  }
6261
6505
  }
6262
6506
  var fft_concat_obj = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ncd-io/node-red-enterprise-sensors",
3
- "version": "0.1.14",
3
+ "version": "0.1.16",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {
package/wireless.html CHANGED
@@ -430,6 +430,7 @@
430
430
  "96": "96 - 16-Bit 1-Channel 0-48VDC Receiver",
431
431
  "101": "101 - Pro Vibration",
432
432
  "102": "102 - Strain Gauge",
433
+ "107": "107 - 4 Channel 4-20mA Receiver",
433
434
  "200": "200 - 4-20mA Pass Through",
434
435
  "202": "202 - Weather Station",
435
436
  "502": "502 - C_50-27",
@@ -680,6 +681,7 @@
680
681
  <option value="96">96 - 16-Bit 1-Channel 0-48VDC Receiver</option>
681
682
  <option value="101">101 - Pro Vibration</option>
682
683
  <option value="102">102 - Strain Gauge</option>
684
+ <option value="107">107 - 4 Channel 4-20mA Receiver</option>
683
685
  <option value="200">200 - 4-20mA Pass Through</option>
684
686
  <option value="202">202 - Weather Station</option>
685
687
  <option value="502">502 - C_50-27</option>
@@ -707,7 +709,7 @@
707
709
  <label for="node-input-auto_config"><i class="icon-tag"></i> Auto Config</label>
708
710
  <input class="section-control" type="checkbox" id="node-input-auto_config" value="1">
709
711
  </div>
710
- <div class="form-row ncd-dependent" data-sensor-23 data-sensor-26 data-sensor-45 data-sensor-48 data-sensor-78 data-sensor-79 data-sensor-80 data-sensor-81 data-sensor-82 data-sensor-84 data-sensor-88 data-sensor-89 data-sensor-91 data-sensor-101 data-sensor-102 data-sensor-519 data-sensor-520 data-sensor-521 data-sensor-531 data-sensor-537>
712
+ <div class="form-row ncd-dependent" data-sensor-23 data-sensor-26 data-sensor-39 data-sensor-45 data-sensor-48 data-sensor-52 data-sensor-78 data-sensor-79 data-sensor-80 data-sensor-81 data-sensor-82 data-sensor-84 data-sensor-88 data-sensor-89 data-sensor-91 data-sensor-101 data-sensor-102 data-sensor-107 data-sensor-519 data-sensor-520 data-sensor-521 data-sensor-531 data-sensor-537>
711
713
  <hr>
712
714
  <label for="node-input-on_the_fly_enable"><i class="icon-tag"></i> OTF Config*</label>
713
715
  <input type="checkbox" id="node-input-on_the_fly_enable" value="1">
@@ -1517,7 +1519,7 @@
1517
1519
  </div>
1518
1520
  </div>
1519
1521
 
1520
- <div class="ncd-dependent" data-sensor-14 data-sensor-45 data-sensor-48 data-sensor-52 data-sensor-88 data-sensor-89>
1522
+ <div class="ncd-dependent" data-sensor-14 data-sensor-45 data-sensor-48 data-sensor-52 data-sensor-88 data-sensor-89 data-sensor-107>
1521
1523
  <div class="form-row ncd-active-check">
1522
1524
  <strong>Sensor Boot Time</strong>
1523
1525
  <p class="caption">
@@ -1552,7 +1554,7 @@
1552
1554
  </div>
1553
1555
  </div>
1554
1556
 
1555
- <div class="ncd-dependent" data-sensor-3 data-sensor-14 data-sensor-45 data-sensor-48 data-sensor-52 data-sensor-88 data-sensor-89 data-sensor-200>
1557
+ <div class="ncd-dependent" data-sensor-3 data-sensor-14 data-sensor-45 data-sensor-48 data-sensor-52 data-sensor-88 data-sensor-89 data-sensor-107 data-sensor-200>
1556
1558
  <div class="form-row ncd-active-check">
1557
1559
  <strong>Low Calibration Point</strong>
1558
1560
  <div>
package/wireless.js CHANGED
@@ -151,7 +151,41 @@ module.exports = function(RED) {
151
151
  };
152
152
 
153
153
  node.on('input', function(msg){
154
- node.gateway.control_send(msg.payload.address, msg.payload.data, msg.payload.options).then().catch(console.log);
154
+ switch(msg.topic){
155
+ case "route_trace":
156
+ var opts = {trace:1};
157
+ node.gateway.route_discover(msg.payload.address,opts).then().catch(console.log);
158
+ break;
159
+ case "link_test":
160
+ node.gateway.link_test(msg.payload.source_address,msg.payload.destination_address,msg.payload.options);
161
+ break;
162
+ case "fft_request":
163
+ break;
164
+ case "fidelity_test":
165
+ break;
166
+ default:
167
+ const byteArrayToHexString = byteArray => Array.from(msg.payload.address, byte => ('0' + (byte & 0xFF).toString(16)).slice(-2)).join('');
168
+ node.gateway.control_send(msg.payload.address, msg.payload.data, msg.payload.options).then().catch(console.log);
169
+ }
170
+
171
+
172
+ // console.log("input triggered, topic:"+msg.topic);
173
+ // if(msg.topic == "transmit"){
174
+ // const byteArrayToHexString = byteArray => Array.from(msg.payload.address, byte => ('0' + (byte & 0xFF).toString(16)).slice(-2)).join('');
175
+ // node.gateway.control_send(msg.payload.address, msg.payload.data, msg.payload.options).then().catch(console.log);
176
+ // }
177
+ // if(msg.topic == "route_trace"){
178
+ // var opts = {trace:1};
179
+ // node.gateway.route_discover(msg.payload.address,opts).then().catch(console.log);
180
+ // }
181
+ // if(msg.topic == "link_test"){
182
+ // node.gateway.link_test(msg.payload.source_address,msg.payload.destination_address,msg.payload.options);
183
+ // }
184
+ // if(msg.topic == "fft_request"){
185
+
186
+ // }
187
+ // if(msg.topic == "fidelity_test"){
188
+ // }
155
189
  });
156
190
 
157
191
  node.gateway.on('sensor_data', (d) => {
@@ -167,6 +201,14 @@ module.exports = function(RED) {
167
201
  msg1 = {topic:'somethingTopic',payload:"something"};
168
202
  node.send([null,{topic: 'unknown_data', payload:d, time: Date.now()}]);
169
203
  });
204
+ node.gateway.on("route_info",(d)=>{
205
+ msg1 = {topic:"route_info",payload:d};
206
+ node.send(msg1);
207
+ });
208
+ node.gateway.on("link_info",(d)=>{
209
+ msg1 = {topic:"link_info",payload:d};
210
+ node.send(msg1);
211
+ });
170
212
 
171
213
  node.set_status();
172
214
  node._gateway_node.on('mode_change', (mode) => {
@@ -815,6 +857,20 @@ module.exports = function(RED) {
815
857
  // }
816
858
  // promises.set_rtc_101 = node.config_gateway.config_set_rtc_101(mac);
817
859
  break;
860
+ case 107:
861
+ if(config.sensor_boot_time_420ma_active){
862
+ promises.sensor_boot_time_420ma = node.config_gateway.config_set_sensor_boot_time_420ma(mac, parseInt(config.sensor_boot_time_420ma));
863
+ }
864
+ if(config.low_calibration_420ma_active){
865
+ promises.low_calibration_420ma = node.config_gateway.config_set_low_calibration_420ma(mac, parseInt(config.low_calibration_420ma));
866
+ }
867
+ if(config.mid_calibration_420ma_active){
868
+ promises.mid_calibration_420ma = node.config_gateway.config_set_mid_calibration_420ma(mac, parseInt(config.mid_calibration_420ma));
869
+ }
870
+ if(config.high_calibration_420ma_active){
871
+ promises.high_calibration_420ma = node.config_gateway.config_set_high_calibration_420ma(mac, parseInt(config.high_calibration_420ma));
872
+ }
873
+ break;
818
874
  case 200:
819
875
  if(config.low_calibration_420ma_active){
820
876
  promises.low_calibration_420ma = node.config_gateway.config_set_low_calibration_420ma(mac, parseInt(config.low_calibration_420ma));