@ncd-io/node-red-enterprise-sensors 0.1.23 → 1.0.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.
@@ -136,8 +136,13 @@ module.exports = class WirelessSensor{
136
136
  var is_new = typeof this.sensor_pool[frame.mac] == 'undefined';
137
137
  var new_mode = is_new;
138
138
  var mode = (type == 'power_up') ? data.mode : ((type == 'sensor_data') ? 'RUN' : ((type == 'config_ack') ? 'ACK' : 'PGM'));
139
+ if(mode == 'ACK'){
140
+ if(data.data.length == 37){
141
+ this._emitter.emit('manifest_received', data);
142
+ }
143
+ }
139
144
  // #OTF
140
- var otf_devices = [23,26,39,45,48,52,76,78,79,80,81,82,84,88,89,90,91,101,102,107,108,180,181,519,520,521,531,535,537];
145
+ var otf_devices = [23,26,39,45,48,52,76,78,79,80,81,82,84,88,89,90,91,101,102,105,107,108,110,111,112,114,180,181,519,520,521,531,535,537,540];
141
146
  var device_type = msbLsb(frame.data[6], frame.data[7]);
142
147
  // var device_type = frame.data[7];
143
148
 
@@ -492,18 +497,6 @@ module.exports = class WirelessSensor{
492
497
  if('z_offset' in en_axis_data){
493
498
  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));
494
499
  }
495
-
496
-
497
- // fft.push(fft_data);
498
- // if(label< 40){
499
- // fft_concat[label] = {
500
- // // label: label,
501
- // x: parseFloat((signInt(((raw_data[i]<<8)+(raw_data[i+1]&255)), 16)*.00006).toFixed(5)),
502
- // y: parseFloat((signInt(((raw_data[i+2]<<8)+(raw_data[i+3]&255)), 16)*.00006).toFixed(5)),
503
- // z: parseFloat((signInt(((raw_data[i+4]<<8)+(raw_data[i+5]&255)), 16)*.00006).toFixed(5)),
504
- // };
505
- // }
506
-
507
500
  }
508
501
  var fft_concat_obj = {
509
502
  time_id: globalDevices[deviceAddr].hour +':'+ globalDevices[deviceAddr].minute,
@@ -733,6 +726,41 @@ module.exports = class WirelessSensor{
733
726
  }
734
727
  return parsed;
735
728
  }
729
+ firmware_set_to_ota_mode(sensor_mac){
730
+ console.log('firmware_set_to_ota_mode');
731
+ var packet = [245, 56, 0, 0, 0];
732
+ return this.config_send(sensor_mac, packet);
733
+ }
734
+ // TODO no code basis
735
+ firmware_exit_ota_mode(sensor_mac){
736
+ console.log('firmware_exit_ota_mode');
737
+ var packet = [245, 57, 0, 0, 0];
738
+ return this.config_send(sensor_mac, packet);
739
+ }
740
+ firmware_request_manifest(sensor_mac){
741
+ console.log('firmware_request_manifest');
742
+ var packet = [245, 60, 0, 0, 0];
743
+ return this.config_send(sensor_mac, packet);
744
+ }
745
+ firmware_send_manifest(sensor_mac, manifest){
746
+ console.log('firmware_send_manifest');
747
+ // sensor_mac = "00:00:00:00:00:00:ff:ff";
748
+ let packet = [245, 58, 0, 0, 0].concat(Array.prototype.slice.call(manifest));
749
+ return this.config_send(sensor_mac, packet);
750
+ }
751
+ firmware_send_chunk(sensor_mac, offset, chunk){
752
+ console.log('firmware_send_chunk');
753
+ // sensor_mac = "00:00:00:00:00:00:ff:ff";
754
+ let packet = [245, 59, 0, 0, 0].concat(offset, Array.prototype.slice.call(chunk));
755
+ // console.log(packet);
756
+ return this.config_send(sensor_mac, packet);
757
+ }
758
+ firmware_request_last_segment(sensor_mac){
759
+ console.log('firmware_request_last_segment');
760
+ let packet = [245, 61, 0, 0, 0];
761
+ // console.log(packet);
762
+ return this.config_send(sensor_mac, packet);
763
+ }
736
764
  config_reboot_sensor(sensor_mac){
737
765
  console.log('config_reboot_sensor: '+sensor_mac)
738
766
  var packet = [247, 64, 0, 0, 0];
@@ -916,7 +944,6 @@ module.exports = class WirelessSensor{
916
944
  console.log('config_set_sensor_forced_calibration_535');
917
945
  // convert before processing
918
946
  var packet = [244, 32, 0, 0, 0];
919
- console.log(packet);
920
947
  return this.config_send(sensor_mac, packet);
921
948
  }
922
949
  config_set_sensor_temperature_offset_44(sensor_mac, value){
@@ -1136,7 +1163,7 @@ module.exports = class WirelessSensor{
1136
1163
  return this.config_send(sensor_mac, packet);
1137
1164
  }
1138
1165
  config_set_roll_threshold_47(sensor_mac, threshold){
1139
- console.log('config_set_pitch_threshold_47');
1166
+ console.log('config_set_roll_threshold_47');
1140
1167
  var packet = [244, 1, 0, 0, 47, 0, threshold];
1141
1168
  console.log(packet);
1142
1169
  return this.config_send(sensor_mac, packet);
@@ -1147,7 +1174,6 @@ module.exports = class WirelessSensor{
1147
1174
  console.log(packet);
1148
1175
  return this.config_send(sensor_mac, packet);
1149
1176
  }
1150
-
1151
1177
  config_set_accelerometer_threshold_108(sensor_mac, value){
1152
1178
  console.log('config_set_accelerometer_threshold_108');
1153
1179
  var packet = [244, 32, 0, 0, 0, 1, value];
@@ -1306,6 +1332,40 @@ module.exports = class WirelessSensor{
1306
1332
  console.log(packet);
1307
1333
  return this.config_send(sensor_mac, packet);
1308
1334
  }
1335
+ config_set_auto_raw_interval_110(sensor_mac, value){
1336
+ console.log('config_set_raw_interval_110');
1337
+ var packet = [244, 79, 0, 0, 80, 76, value];
1338
+ console.log(packet);
1339
+ return this.config_send(sensor_mac, packet);
1340
+ }
1341
+ config_set_auto_raw_destination_110(sensor_mac, value){
1342
+ console.log('config_set_auto_raw_destination_110');
1343
+ var packet = [244, 79, 0, 0, 80, 72];
1344
+ let value_dest = int2Bytes((value), 4);
1345
+ packet.push(...value_dest);
1346
+ console.log(packet);
1347
+ return this.config_send(sensor_mac, packet);
1348
+ }
1349
+ config_set_clear_probe_uptimers_110(sensor_mac, value){
1350
+ console.log('config_set_clear_probe_uptimers_110');
1351
+ var packet = [244, 79, 0, 0, 80, value];
1352
+ console.log(packet);
1353
+ return this.config_send(sensor_mac, packet);
1354
+ }
1355
+ config_set_smart_interval_110(sensor_mac, value){
1356
+ console.log('config_set_smart_interval_110');
1357
+ var packet = [244, 79, 0, 0, 101, 76, value];
1358
+ console.log(packet);
1359
+ return this.config_send(sensor_mac, packet);
1360
+ }
1361
+ config_set_smart_threshold_110(sensor_mac, value){
1362
+ console.log('config_set_smart_threshold_110');
1363
+ var packet = [244, 79, 0, 0, 101];
1364
+ let value_th = int2Bytes((value), 2);
1365
+ packet.push(...value_th);
1366
+ console.log(packet);
1367
+ return this.config_send(sensor_mac, packet);
1368
+ }
1309
1369
  config_get_delay(sensor_mac){
1310
1370
  return new Promise((fulfill, reject) => {
1311
1371
  this.config_send(sensor_mac, [247, 21, 0, 0, 0]).then((res) => {
@@ -1498,6 +1558,11 @@ module.exports = class WirelessSensor{
1498
1558
  };
1499
1559
  return this.config_send(sensor_mac, [(data ? 247 : 248), params[param], ...data]);
1500
1560
  }
1561
+ clear_queue(){
1562
+ this.queue.queue = new Array;
1563
+ delete this.queue;
1564
+ this.queue = new Queue(1);
1565
+ }
1501
1566
  config_send(sensor_mac, data, opts){
1502
1567
  var that = this;
1503
1568
  return new Promise((fulfill, reject) => {
@@ -2475,7 +2540,7 @@ function sensor_types(parent){
2475
2540
  name: 'ORP and Temperature Sensor',
2476
2541
  parse: (d) => {
2477
2542
  return {
2478
- ORP: signInt(d.slice(0, 2).reduce(msbLsb), 16) / 100,
2543
+ ORP: signInt(d.slice(0, 2).reduce(msbLsb), 16),
2479
2544
  Temp: signInt(d.slice(2, 4).reduce(msbLsb),16) / 100
2480
2545
  };
2481
2546
  }
@@ -2484,7 +2549,7 @@ function sensor_types(parent){
2484
2549
  name: 'ORP, pH and Temperature Sensor',
2485
2550
  parse: (d) => {
2486
2551
  return {
2487
- ORP: signInt(d.slice(0, 2).reduce(msbLsb), 16) / 100,
2552
+ ORP: signInt(d.slice(0, 2).reduce(msbLsb), 16),
2488
2553
  Temp: signInt(d.slice(2, 4).reduce(msbLsb),16) / 100,
2489
2554
  pH: signInt(d.slice(4, 6).reduce(msbLsb), 16) / 100,
2490
2555
  Temp: signInt(d.slice(6, 8).reduce(msbLsb),16) / 100
@@ -5395,6 +5460,16 @@ function sensor_types(parent){
5395
5460
  };
5396
5461
  }
5397
5462
  },
5463
+ '105': {
5464
+ name: '1 Auto Luber With Ultrasound Vibration Sensor',
5465
+ parse: (d) => {
5466
+ return {
5467
+ raw_adc: d.slice(0, 2).reduce(msbLsb),
5468
+ ma: d.slice(2, 4).reduce(msbLsb) / 100,
5469
+ db: d.slice(4, 6).reduce(msbLsb) / 100
5470
+ };
5471
+ }
5472
+ },
5398
5473
  '107': {
5399
5474
  name: '16-Bit 4-Channel 4-20mA',
5400
5475
  parse: (d) => {
@@ -5441,146 +5516,2798 @@ function sensor_types(parent){
5441
5516
  };
5442
5517
  }
5443
5518
  },
5444
- '180': {
5445
- name: 'C1D2 One Channel Vibration Plus',
5446
- parse: (payload, parsed, mac) => {
5447
- return parent.sensor_types[80].parse(payload, parsed, mac);
5448
- }
5449
- },
5450
- '181': {
5451
- name: 'C1D2 Two Channel Vibration Plus',
5519
+ '110': {
5520
+ name: 'One Channel Vibration Plus v4',
5452
5521
  parse: (payload, parsed, mac) => {
5453
- return parent.sensor_types[81].parse(payload, parsed, mac);
5454
- }
5455
- },
5456
- '200': {
5457
- name: '4-20mA Pass Through',
5458
- parse: (d) => {
5459
- var adc1 = signInt(d.slice(0, 2).reduce(msbLsb));
5460
- var adc2 = signInt(d.slice(2, 4).reduce(msbLsb));
5461
- var dac1 = signInt(d.slice(4, 6).reduce(msbLsb));
5462
- return {
5463
- adc1: adc1,
5464
- adc2: adc2,
5465
- dac1: dac1,
5466
- mA1: adc1/100.00,
5467
- raw_adc: adc2,
5468
- raw_dac: dac1,
5469
- byteOne: d[0],
5470
- byteTwo: d[1],
5471
- byteThree: d[2],
5472
- byteFour: d[3],
5473
- byteFive: d[4],
5474
- byteSix: d[5]
5475
- };
5476
- }
5477
- },
5478
-
5479
- '202': {
5480
- name: 'Wireless Weather Station',
5481
- parse: (d) => {
5482
- return {
5483
- Temp: signInt(d.slice(0, 4).reduce(msbLsb), 32) / 100,
5484
- Humid: signInt(d.slice(4, 8).reduce(msbLsb), 32) / 100,
5485
- Pressure: signInt(d.slice(8, 12).reduce(msbLsb), 32) / 100,
5486
- WindSpd: signInt(d.slice(12, 16).reduce(msbLsb),32) / 100,
5487
- WindDir: signInt(d.slice(16, 20).reduce(msbLsb),32) / 100
5488
-
5489
- };
5490
- }
5491
- },
5492
- '502': {
5493
- name: 'Custom Environmental Sensor',
5494
- parse: (d, full) => {
5495
- reserve = full[7];
5496
- if (reserve == 0xAA){
5497
- var obj = {};
5498
- for(i = 0; i < 18; i++){
5499
- var label = 'sound'+i;
5500
- obj[label] = d[i];
5501
- }
5502
- return obj;
5503
- }else{
5504
- return {
5505
-
5506
- temperature: signInt(d.slice(0, 2).reduce(msbLsb), 16) / 100,
5507
- pressure: d.slice(2, 6).reduce(msbLsb) / 100,
5508
- humidity: d.slice(6, 10).reduce(msbLsb) / 1000,
5509
- gas_resistance: d.slice(10, 14).reduce(msbLsb),
5510
- iaq: d.slice(14, 16).reduce(msbLsb),
5511
- light: d.slice(16, 18).reduce(msbLsb),
5512
- sound: d[18]
5513
- };
5522
+ if(payload[7] >> 1 != 0){
5523
+ console.log('Error found');
5524
+ parsed.data = {error: 'Error found, Sensor Probe may be unattached'};
5525
+ return parsed;
5514
5526
  }
5515
- }
5516
- },
5517
5527
 
5518
- '505': {
5519
- 'name': 'Custom SAP 1-Channel Current Monitor',
5520
- parse: (d) => {
5521
- return {
5522
- channel_1_rms: d.slice(0, 3).reduce(msbLsb),
5523
- channel_1_max: d.slice(4, 7).reduce(msbLsb),
5524
- channel_1_min: d.slice(8, 11).reduce(msbLsb)
5525
- };
5526
- }
5527
- },
5528
+ if(payload[8] === 1){
5529
+ var deviceAddr = mac;
5530
+ var firmware = payload[1];
5531
+ var hour = payload[11];
5532
+ var minute = payload[12];
5533
+ var expected_packets = payload[15];
5534
+ var current_packet = payload[16];
5535
+ var sdata_start = 17;
5528
5536
 
5529
- '506': {
5530
- 'name': 'Custom SAP 3-Channel Current Monitor',
5531
- parse: (d) => {
5532
- return {
5533
- channel_1_rms: d.slice(0, 3).reduce(msbLsb),
5534
- channel_1_max: d.slice(4, 7).reduce(msbLsb),
5535
- channel_1_min: d.slice(8, 11).reduce(msbLsb),
5536
- channel_2_rms: d.slice(12, 15).reduce(msbLsb),
5537
- channel_2_max: d.slice(16, 19).reduce(msbLsb),
5538
- channel_2_min: d.slice(20, 23).reduce(msbLsb),
5539
- channel_3_rms: d.slice(24, 27).reduce(msbLsb),
5540
- channel_3_max: d.slice(28, 31).reduce(msbLsb),
5541
- channel_3_min: d.slice(32, 35).reduce(msbLsb)
5542
- };
5543
- }
5544
- },
5537
+ if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
5538
+ if(expected_packets != 1){
5539
+ // if a packet is already stored with the same packet ID, or if packet ID is 1, or if current packet ID is not one more than last packet ID
5540
+ if(current_packet in globalDevices[deviceAddr].data || current_packet == 1 || !(((current_packet&127)-1) in globalDevices[deviceAddr].data)) {
5541
+ console.log('-----');
5542
+ console.log('bad packet breakdown deleting stream');
5543
+ console.log(current_packet);
5544
+ console.log(expected_packets);
5545
+ console.log(current_packet in globalDevices[deviceAddr].data);
5546
+ console.log(current_packet == 1);
5547
+ console.log(!((current_packet-1) in globalDevices[deviceAddr].data));
5548
+ if(this.hasOwnProperty('failure_no')){
5549
+ this.failure_no = this.failure_no + 1;
5550
+ }
5551
+ else{
5552
+ this.failure_no = 1;
5553
+ }
5554
+ if(this.hasOwnProperty('failure_no')){
5555
+ console.log('####falure no');
5556
+ console.log(this.failure_no);
5557
+ }
5558
+ // console.log(globalDevices[deviceAddr].data);
5559
+ delete globalDevices[deviceAddr];
5560
+ if(current_packet != 1){
5561
+ return;
5562
+ } else{
5545
5563
 
5546
- '507': {
5547
- 'name': 'Custom SAP 7-Channel Current Monitor',
5548
- parse: (d) => {
5549
- return {
5550
- channel_1_rms: d.slice(0, 3).reduce(msbLsb),
5551
- channel_1_max: d.slice(4, 7).reduce(msbLsb),
5552
- channel_1_min: d.slice(8, 11).reduce(msbLsb),
5553
- channel_2_rms: d.slice(12, 15).reduce(msbLsb),
5554
- channel_2_max: d.slice(16, 19).reduce(msbLsb),
5555
- channel_2_min: d.slice(20, 23).reduce(msbLsb),
5556
- channel_3_rms: d.slice(24, 27).reduce(msbLsb),
5557
- channel_3_max: d.slice(28, 31).reduce(msbLsb),
5558
- channel_3_min: d.slice(32, 35).reduce(msbLsb),
5559
- channel_4_rms: d.slice(36, 39).reduce(msbLsb),
5560
- channel_4_max: d.slice(40, 43).reduce(msbLsb),
5561
- channel_4_min: d.slice(44, 47).reduce(msbLsb),
5562
- channel_5_rms: d.slice(48, 51).reduce(msbLsb),
5563
- channel_5_max: d.slice(52, 55).reduce(msbLsb),
5564
- channel_5_min: d.slice(56, 59).reduce(msbLsb),
5565
- channel_6_rms: d.slice(60, 63).reduce(msbLsb),
5566
- channel_6_max: d.slice(64, 67).reduce(msbLsb),
5567
- channel_6_min: d.slice(68, 71).reduce(msbLsb),
5568
- channel_7_rms: d.slice(72, 75).reduce(msbLsb),
5569
- channel_7_max: d.slice(76, 79).reduce(msbLsb),
5570
- channel_7_min: d.slice(80, 83).reduce(msbLsb)
5564
+ var mode = payload[8];
5565
+ var odr = payload[9];
5566
+ var en_axis = payload[10] & 7;
5567
+ var fsr = payload[10] >> 5;
5568
+ var device_temp = msbLsb(payload[13], payload[14])/100;
5571
5569
 
5572
5570
 
5571
+ switch(odr){
5572
+ case 6:
5573
+ odr = 50;
5574
+ break;
5575
+ case 7:
5576
+ odr = 100;
5577
+ break;
5578
+ case 8:
5579
+ odr = 200;
5580
+ break;
5581
+ case 9:
5582
+ odr = 400;
5583
+ break;
5584
+ case 10:
5585
+ odr = 800;
5586
+ break;
5587
+ case 11:
5588
+ odr = 1600;
5589
+ break;
5590
+ case 12:
5591
+ odr = 3200;
5592
+ break;
5593
+ case 13:
5594
+ odr = 6400;
5595
+ break;
5596
+ case 14:
5597
+ odr = 12800;
5598
+ break;
5599
+ case 15:
5600
+ odr = 25600;
5601
+ break;
5602
+ default:
5603
+ odr = 0;
5604
+ }
5573
5605
 
5574
- };
5575
- }
5576
- },
5577
- '510': {
5578
- name: 'GreenLight',
5579
- parse: (d) => {
5580
- var adc = d.slice(0, 2).reduce(msbLsb);
5581
- return {
5582
- mA: adc /100.00
5583
- };
5606
+ globalDevices[deviceAddr] = {
5607
+ // stream_size: expected_packets,
5608
+ data: {},
5609
+ odr: odr,
5610
+ mo: mode,
5611
+ en_axis: en_axis,
5612
+ fsr: fsr,
5613
+ hour: hour,
5614
+ minute: minute,
5615
+ device_temp: device_temp,
5616
+ }
5617
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
5618
+ return;
5619
+ }
5620
+ }
5621
+ else{
5622
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
5623
+ }
5624
+ }
5625
+ else{
5626
+ var mode = payload[8];
5627
+ var odr = payload[9];
5628
+ var en_axis = payload[10] & 7;
5629
+ var fsr = payload[10] >> 5;
5630
+ var device_temp = msbLsb(payload[13], payload[14])/100;
5631
+
5632
+
5633
+ switch(odr){
5634
+ case 6:
5635
+ odr = 50;
5636
+ break;
5637
+ case 7:
5638
+ odr = 100;
5639
+ break;
5640
+ case 8:
5641
+ odr = 200;
5642
+ break;
5643
+ case 9:
5644
+ odr = 400;
5645
+ break;
5646
+ case 10:
5647
+ odr = 800;
5648
+ break;
5649
+ case 11:
5650
+ odr = 1600;
5651
+ break;
5652
+ case 12:
5653
+ odr = 3200;
5654
+ break;
5655
+ case 13:
5656
+ odr = 6400;
5657
+ break;
5658
+ case 14:
5659
+ odr = 12800;
5660
+ break;
5661
+ case 15:
5662
+ odr = 25600;
5663
+ break;
5664
+ default:
5665
+ odr = 0;
5666
+ }
5667
+
5668
+ globalDevices[deviceAddr] = {
5669
+ // stream_size: expected_packets,
5670
+ data: {},
5671
+ odr: odr,
5672
+ mo: mode,
5673
+ en_axis: en_axis,
5674
+ fsr: fsr,
5675
+ hour: hour,
5676
+ minute: minute,
5677
+ device_temp: device_temp,
5678
+ }
5679
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
5680
+ }
5681
+
5682
+ if(Object.keys(globalDevices[deviceAddr].data).length == expected_packets){
5683
+ var raw_data = new Array();
5684
+ for(const packet in globalDevices[deviceAddr].data){
5685
+ raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
5686
+ }
5687
+ var label = 0;
5688
+
5689
+ var fft = new Array();
5690
+ var fft_concat = {};
5691
+
5692
+ var en_axis_data = {};
5693
+ switch (globalDevices[deviceAddr].en_axis){
5694
+ case 1:
5695
+ en_axis_data.x_offset = 0;
5696
+ en_axis_data.increment = 2;
5697
+ break;
5698
+ case 2:
5699
+ en_axis_data.y_offset = 0;
5700
+ en_axis_data.increment = 2;
5701
+ break;
5702
+ case 3:
5703
+ en_axis_data.x_offset = 0;
5704
+ en_axis_data.y_offset = 2;
5705
+ en_axis_data.increment = 4;
5706
+ break;
5707
+ case 4:
5708
+ en_axis_data.z_offset = 0;
5709
+ en_axis_data.increment = 2;
5710
+ break;
5711
+ case 5:
5712
+ en_axis_data.x_offset = 0;
5713
+ en_axis_data.z_offset = 2;
5714
+ en_axis_data.increment = 4;
5715
+ break;
5716
+ case 6:
5717
+ en_axis_data.y_offset = 0;
5718
+ en_axis_data.z_offset = 2;
5719
+ en_axis_data.increment = 4;
5720
+ break;
5721
+ case 7:
5722
+ en_axis_data.x_offset = 0;
5723
+ en_axis_data.y_offset = 2;
5724
+ en_axis_data.z_offset = 4;
5725
+ en_axis_data.increment = 6;
5726
+ break;
5727
+ default:
5728
+ en_axis_data.increment = 0;
5729
+ }
5730
+
5731
+ var fsr_mult = .00006;
5732
+ var fsr_text = "";
5733
+ switch(globalDevices[deviceAddr].fsr){
5734
+ case 0:
5735
+ fsr_mult = 0.00006;
5736
+ break;
5737
+ case 1:
5738
+ fsr_mult = 0.00012;
5739
+ break;
5740
+ case 2:
5741
+ fsr_mult = 0.00024;
5742
+ break;
5743
+ case 3:
5744
+ fsr_mult = 0.00049;
5745
+ break;
5746
+ }
5747
+ switch(globalDevices[deviceAddr].fsr){
5748
+ case 0:
5749
+ fsr_text = "2g";
5750
+ break;
5751
+ case 1:
5752
+ fsr_text = "4g";
5753
+ break;
5754
+ case 2:
5755
+ fsr_text = "8g";
5756
+ break;
5757
+ case 3:
5758
+ fsr_text = "16g";
5759
+ break;
5760
+ }
5761
+
5762
+ for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
5763
+ label++;
5764
+
5765
+ fft_concat[label] = {};
5766
+
5767
+ if('x_offset' in en_axis_data){
5768
+ 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));
5769
+ }
5770
+ if('y_offset' in en_axis_data){
5771
+ 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));
5772
+ }
5773
+ if('z_offset' in en_axis_data){
5774
+ 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));
5775
+ }
5776
+ }
5777
+ var fft_concat_obj = {
5778
+ time_id: globalDevices[deviceAddr].hour +':'+ globalDevices[deviceAddr].minute,
5779
+ mac_address: deviceAddr,
5780
+ en_axis: globalDevices[deviceAddr].en_axis,
5781
+ fsr: fsr_text,
5782
+ odr: globalDevices[deviceAddr].odr,
5783
+ device_temp: globalDevices[deviceAddr].device_temp,
5784
+ data: fft_concat
5785
+ };
5786
+ sensor_data = fft_concat_obj;
5787
+ delete globalDevices[deviceAddr];
5788
+ if(this.hasOwnProperty('failure_no')){
5789
+ console.log('####falure no');
5790
+ console.log(this.failure_no);
5791
+ }
5792
+
5793
+ return sensor_data;
5794
+ }
5795
+ else{
5796
+ return;
5797
+ }
5798
+ }else{
5799
+
5800
+ var mode = payload[8];
5801
+ var odr = payload[9];
5802
+ var en_axis = payload[10] & 7;
5803
+ var fsr = payload[10] >> 5;
5804
+ var device_temp = msbLsb(payload[13], payload[14])/100;
5805
+
5806
+
5807
+ switch(odr){
5808
+ case 6:
5809
+ odr = 50;
5810
+ break;
5811
+ case 7:
5812
+ odr = 100;
5813
+ break;
5814
+ case 8:
5815
+ odr = 200;
5816
+ break;
5817
+ case 9:
5818
+ odr = 400;
5819
+ break;
5820
+ case 10:
5821
+ odr = 800;
5822
+ break;
5823
+ case 11:
5824
+ odr = 1600;
5825
+ break;
5826
+ case 12:
5827
+ odr = 3200;
5828
+ break;
5829
+ case 13:
5830
+ odr = 6400;
5831
+ break;
5832
+ case 14:
5833
+ odr = 12800;
5834
+ break;
5835
+ case 15:
5836
+ odr = 25600;
5837
+ break;
5838
+ default:
5839
+ odr = 0;
5840
+ }
5841
+
5842
+ globalDevices[deviceAddr] = {
5843
+ // stream_size: expected_packets,
5844
+ data: {},
5845
+ odr: odr,
5846
+ mo: mode,
5847
+ en_axis: en_axis,
5848
+ fsr: fsr,
5849
+ hour: hour,
5850
+ minute: minute,
5851
+ device_temp: device_temp,
5852
+ }
5853
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
5854
+ return;
5855
+ }
5856
+ }
5857
+ else if(payload[8] === 0 || payload[8] === 2){
5858
+ // mode byte most significant bit will indicate fft data.
5859
+ // console.log(d);
5860
+ var odr;
5861
+ switch(payload[9]){
5862
+ case 6:
5863
+ odr = "50Hz"
5864
+ break;
5865
+ case 7:
5866
+ odr = "100Hz";
5867
+ break;
5868
+ case 8:
5869
+ odr = "200Hz";
5870
+ break;
5871
+ case 9:
5872
+ odr = "400Hz";
5873
+ break;
5874
+ case 10:
5875
+ odr = "800Hz";
5876
+ break;
5877
+ case 11:
5878
+ odr = "1600Hz";
5879
+ break;
5880
+ case 12:
5881
+ odr = "3200Hz";
5882
+ break;
5883
+ case 13:
5884
+ odr = "6400Hz";
5885
+ break;
5886
+ case 14:
5887
+ odr = "12800Hz";
5888
+ break;
5889
+ case 15:
5890
+ odr = "25600Hz";
5891
+ break;
5892
+ }
5893
+ return {
5894
+ mode: payload[8],
5895
+
5896
+ odr: odr,
5897
+ temperature: signInt(payload.slice(10, 12).reduce(msbLsb), 16) / 100,
5898
+
5899
+ x_rms_ACC_G: payload.slice(12, 14).reduce(msbLsb)/1000,
5900
+ x_max_ACC_G: payload.slice(14, 16).reduce(msbLsb)/1000,
5901
+ x_velocity_mm_sec: payload.slice(16, 18).reduce(msbLsb) / 100,
5902
+ x_displacement_mm: payload.slice(18, 20).reduce(msbLsb) / 100,
5903
+ x_peak_one_Hz: payload.slice(20, 22).reduce(msbLsb),
5904
+ x_peak_two_Hz: payload.slice(22, 24).reduce(msbLsb),
5905
+ x_peak_three_Hz: payload.slice(24, 26).reduce(msbLsb),
5906
+
5907
+ y_rms_ACC_G: payload.slice(26, 28).reduce(msbLsb)/1000,
5908
+ y_max_ACC_G: payload.slice(28, 30).reduce(msbLsb)/1000,
5909
+ y_velocity_mm_sec: payload.slice(30, 32).reduce(msbLsb) / 100,
5910
+ y_displacement_mm: payload.slice(32, 34).reduce(msbLsb) / 100,
5911
+ y_peak_one_Hz: payload.slice(34, 36).reduce(msbLsb),
5912
+ y_peak_two_Hz: payload.slice(36, 38).reduce(msbLsb),
5913
+ y_peak_three_Hz: payload.slice(38, 40).reduce(msbLsb),
5914
+
5915
+ z_rms_ACC_G: payload.slice(40, 42).reduce(msbLsb)/1000,
5916
+ z_max_ACC_G: payload.slice(42, 44).reduce(msbLsb)/1000,
5917
+ z_velocity_mm_sec: payload.slice(44, 46).reduce(msbLsb) / 100,
5918
+ z_displacement_mm: payload.slice(46, 48).reduce(msbLsb) / 100,
5919
+ z_peak_one_Hz: payload.slice(48, 50).reduce(msbLsb),
5920
+ z_peak_two_Hz: payload.slice(50, 52).reduce(msbLsb),
5921
+ z_peak_three_Hz: payload.slice(52, 54).reduce(msbLsb),
5922
+ };
5923
+ }
5924
+ // else{
5925
+ // parsed.data = {'error': 'Vibration mode error'}
5926
+ // return parsed;
5927
+ // }
5928
+ },
5929
+ 'parse_fly': (frame) => {
5930
+ let frame_data = {};
5931
+ switch(frame[16]){
5932
+ case 0:
5933
+ frame_data.mode = "Processed";
5934
+ break;
5935
+ case 1:
5936
+ frame_data.mode = "Raw";
5937
+ break;
5938
+ case 2:
5939
+ frame_data.mode = "Processed + Raw on demand";
5940
+ break;
5941
+ }
5942
+ switch(frame[17]){
5943
+ case 6:
5944
+ frame_data.odr_1 = 50;
5945
+ break;
5946
+ case 7:
5947
+ frame_data.odr_1 = 100;
5948
+ break;
5949
+ case 8:
5950
+ frame_data.odr_1 = 200;
5951
+ break;
5952
+ case 9:
5953
+ frame_data.odr_1 = 400;
5954
+ break;
5955
+ case 10:
5956
+ frame_data.odr_1 = 800;
5957
+ break;
5958
+ case 11:
5959
+ frame_data.odr_1 = 1600;
5960
+ break;
5961
+ case 12:
5962
+ frame_data.odr_1 = 3200;
5963
+ break;
5964
+ case 13:
5965
+ frame_data.odr_1 = 6400;
5966
+ break;
5967
+ case 14:
5968
+ frame_data.odr_1 = 12800;
5969
+ break;
5970
+ case 15:
5971
+ frame_data.odr_1 = 25600;
5972
+ break;
5973
+ }
5974
+ frame_data.sampling_duration_1 = frame[19]*50 + "ms";
5975
+ switch(frame[21]){
5976
+ case 0:
5977
+ frame_data.filter_status = "Disabled";
5978
+ break;
5979
+ case 1:
5980
+ frame_data.filter_status = "Enabled";
5981
+ break;
5982
+ }
5983
+ switch(frame[22]){
5984
+ case 0:
5985
+ frame_data.lpf_coeff_1 = 4;
5986
+ break;
5987
+ case 1:
5988
+ frame_data.lpf_coeff_1 = 8;
5989
+ break;
5990
+ case 2:
5991
+ frame_data.lpf_coeff_1 = 16;
5992
+ break;
5993
+ case 2:
5994
+ frame_data.lpf_coeff_1 = 32;
5995
+ break;
5996
+ case 4:
5997
+ frame_data.lpf_coeff_1 = 64;
5998
+ break;
5999
+ case 5:
6000
+ frame_data.lpf_coeff_1 = 128;
6001
+ break;
6002
+ case 6:
6003
+ frame_data.lpf_coeff_1 = 256;
6004
+ break;
6005
+ case 7:
6006
+ frame_data.lpf_coeff_1 = 512;
6007
+ break;
6008
+ case 8:
6009
+ frame_data.lpf_coeff_1 = 1024;
6010
+ break;
6011
+ case 9:
6012
+ frame_data.lpf_coeff_1 = 2048;
6013
+ break;
6014
+ }
6015
+ frame_data.lpf_freq_1 = frame_data.odr_1 / frame_data.lpf_coeff_1;
6016
+ switch(frame[24]){
6017
+ case 0:
6018
+ frame_data.hpf_coeff_1 = 4;
6019
+ break;
6020
+ case 1:
6021
+ frame_data.hpf_coeff_1 = 8;
6022
+ break;
6023
+ case 2:
6024
+ frame_data.hpf_coeff_1 = 16;
6025
+ break;
6026
+ case 2:
6027
+ frame_data.hpf_coeff_1 = 32;
6028
+ break;
6029
+ case 4:
6030
+ frame_data.hpf_coeff_1 = 64;
6031
+ break;
6032
+ case 5:
6033
+ frame_data.hpf_coeff_1 = 128;
6034
+ break;
6035
+ case 6:
6036
+ frame_data.hpf_coeff_1 = 256;
6037
+ break;
6038
+ case 7:
6039
+ frame_data.hpf_coeff_1 = 512;
6040
+ break;
6041
+ case 8:
6042
+ frame_data.hpf_coeff_1 = 1024;
6043
+ break;
6044
+ case 9:
6045
+ frame_data.hpf_coeff_1 = 2048;
6046
+ break;
6047
+ }
6048
+ frame_data.hpf_freq_1 = frame_data.odr_1 / frame_data.hpf_coeff_1;
6049
+ switch(frame[26]){
6050
+ case 0:
6051
+ frame_data.sampling_interval = "5 Minutes";
6052
+ break;
6053
+ case 1:
6054
+ frame_data.sampling_interval = "10 Minutes";
6055
+ break;
6056
+ case 2:
6057
+ frame_data.sampling_interval = "15 Minutes";
6058
+ break;
6059
+ case 2:
6060
+ frame_data.sampling_interval = "20 Minutes";
6061
+ break;
6062
+ case 4:
6063
+ frame_data.sampling_interval = "30 Minutes";
6064
+ break;
6065
+ case 5:
6066
+ frame_data.sampling_interval = "60 Minutes";
6067
+ break;
6068
+ case 6:
6069
+ frame_data.sampling_interval = "120 Minutes";
6070
+ break;
6071
+ case 7:
6072
+ frame_data.sampling_interval = "180 Minutes";
6073
+ break;
6074
+ case 8:
6075
+ frame_data.sampling_interval = "1 Minute";
6076
+ break;
6077
+ }
6078
+ frame_data.on_request_timeout = frame[27] + " Seconds";
6079
+ frame_data.deadband = frame[28] + "mg";
6080
+
6081
+ switch(frame[29]){
6082
+ case 0:
6083
+ frame_data.payload_length = "50 Bytes";
6084
+ break;
6085
+ case 1:
6086
+ frame_data.payload_length = "100 Bytes";
6087
+ break;
6088
+ case 2:
6089
+ frame_data.payload_length = "150 Bytes";
6090
+ break;
6091
+ case 3:
6092
+ frame_data.payload_length = "180 Bytes";
6093
+ break;
6094
+ }
6095
+
6096
+ return {
6097
+ 'firmware': frame[2],
6098
+ 'destination_address': toMac(frame.slice(12, 16)),
6099
+ 'mode': frame_data.mode,
6100
+ 'odr_1': frame_data.odr_1+'Hz',
6101
+ 'sampling_duration_1': frame_data.sampling_duration_1,
6102
+ 'sampling_duration_2': frame_data.sampling_duration_2,
6103
+ 'filter_status': frame_data.filter_status,
6104
+ 'lpf_coeff_1': frame_data.lpf_coeff_1,
6105
+ 'lpf_freq_1': frame_data.lpf_freq_1+'Hz',
6106
+ 'hpf_coeff_1': frame_data.hpf_coeff_1,
6107
+ 'hpf_freq_1': frame_data.hpf_freq_1+'Hz',
6108
+ 'sampling_interval': frame_data.sampling_interval,
6109
+ 'on_request_timeout': frame_data.on_request_timeout,
6110
+ 'deadband': frame_data.deadband,
6111
+ 'payload_length': frame_data.payload_length,
6112
+ 'machine_values': {
6113
+ 'firmware': frame[2],
6114
+ 'destination_address': toMac(frame.slice(12, 16), false),
6115
+ 'mode': frame[16],
6116
+ 'odr_1': frame[17],
6117
+ 'sampling_duration_1': frame[19],
6118
+ 'sampling_duration_2': frame[20],
6119
+ 'filter_status': frame[21],
6120
+ 'lpf_coeff_1': frame[22],
6121
+ 'hpf_coeff_1': frame[24],
6122
+ 'sampling_interval': frame[26],
6123
+ 'on_request_timeout': frame[27],
6124
+ 'deadband': frame[28],
6125
+ 'payload_length': frame[29]
6126
+ }
6127
+ }
6128
+ }
6129
+ },
6130
+ '111': {
6131
+ name: 'Two Channel Vibration Plus v4',
6132
+ parse: (payload, parsed, mac) => {
6133
+ parsed.data = {};
6134
+ if(payload[7] & 2){
6135
+ parsed.data['probe_1_error'] = true;
6136
+ }
6137
+ if(payload[7] & 4){
6138
+ parsed.data['probe_2_error'] = true;
6139
+ }
6140
+ if(payload[7] & 2 && payload[7] & 4){
6141
+ return parsed;
6142
+ }
6143
+
6144
+ if(payload[8] === 1){
6145
+ var deviceAddr = mac;
6146
+ var firmware = payload[1];
6147
+ var hour = payload[11];
6148
+ var minute = payload[12];
6149
+ var expected_packets = payload[15];
6150
+ var current_packet = payload[16];
6151
+ var sdata_start = 17;
6152
+
6153
+ if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
6154
+ if(expected_packets != 1){
6155
+ // if a packet is already stored with the same packet ID, or if packet ID is 1, or if current packet ID is not one more than last packet ID
6156
+ if(current_packet in globalDevices[deviceAddr].data || current_packet == 1 || !((current_packet-1) in globalDevices[deviceAddr].data)) {
6157
+ console.log('-----');
6158
+ console.log('bad packet breakdown deleting stream');
6159
+ console.log(current_packet);
6160
+ console.log(expected_packets);
6161
+ console.log(current_packet in globalDevices[deviceAddr].data);
6162
+ console.log(current_packet == 1);
6163
+ console.log(!((current_packet-1) in globalDevices[deviceAddr].data));
6164
+ if(this.hasOwnProperty('failure_no')){
6165
+ this.failure_no = this.failure_no + 1;
6166
+ }
6167
+ else{
6168
+ this.failure_no = 1;
6169
+ }
6170
+ if(this.hasOwnProperty('failure_no')){
6171
+ console.log('####falure no');
6172
+ console.log(this.failure_no);
6173
+ }
6174
+ // console.log(globalDevices[deviceAddr].data);
6175
+ delete globalDevices[deviceAddr];
6176
+ if(current_packet != 1){
6177
+ return;
6178
+ } else{
6179
+ var mode = payload[8];
6180
+ var odr = payload[9];
6181
+ var en_axis = payload[10] & 7;
6182
+ var fsr = payload[10] >> 5;
6183
+ var device_temp = msbLsb(payload[13], payload[14])/100;
6184
+
6185
+ switch(odr){
6186
+ case 6:
6187
+ odr = 50;
6188
+ break;
6189
+ case 7:
6190
+ odr = 100;
6191
+ break;
6192
+ case 8:
6193
+ odr = 200;
6194
+ break;
6195
+ case 9:
6196
+ odr = 400;
6197
+ break;
6198
+ case 10:
6199
+ odr = 800;
6200
+ break;
6201
+ case 11:
6202
+ odr = 1600;
6203
+ break;
6204
+ case 12:
6205
+ odr = 3200;
6206
+ break;
6207
+ case 13:
6208
+ odr = 6400;
6209
+ break;
6210
+ case 14:
6211
+ odr = 12800;
6212
+ break;
6213
+ case 15:
6214
+ odr = 25600;
6215
+ break;
6216
+ default:
6217
+ odr = 0;
6218
+ }
6219
+
6220
+ globalDevices[deviceAddr] = {
6221
+ // stream_size: expected_packets,
6222
+ data: {},
6223
+ odr: odr,
6224
+ mo: mode,
6225
+ en_axis: en_axis,
6226
+ fsr: fsr,
6227
+ hour: hour,
6228
+ minute: minute,
6229
+ device_temp: device_temp,
6230
+ }
6231
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
6232
+ return;
6233
+ }
6234
+ }
6235
+ else{
6236
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
6237
+ }
6238
+ }
6239
+ else{
6240
+ var mode = payload[8];
6241
+ var odr = payload[9];
6242
+ var en_axis = payload[10] & 7;
6243
+ var fsr = payload[10] >> 5;
6244
+ var device_temp = msbLsb(payload[13], payload[14])/100;
6245
+
6246
+
6247
+ switch(odr){
6248
+ case 6:
6249
+ odr = 50;
6250
+ break;
6251
+ case 7:
6252
+ odr = 100;
6253
+ break;
6254
+ case 8:
6255
+ odr = 200;
6256
+ break;
6257
+ case 9:
6258
+ odr = 400;
6259
+ break;
6260
+ case 10:
6261
+ odr = 800;
6262
+ break;
6263
+ case 11:
6264
+ odr = 1600;
6265
+ break;
6266
+ case 12:
6267
+ odr = 3200;
6268
+ break;
6269
+ case 13:
6270
+ odr = 6400;
6271
+ break;
6272
+ case 14:
6273
+ odr = 12800;
6274
+ break;
6275
+ case 15:
6276
+ odr = 25600;
6277
+ break;
6278
+ default:
6279
+ odr = 0;
6280
+ }
6281
+
6282
+ globalDevices[deviceAddr] = {
6283
+ // stream_size: expected_packets,
6284
+ data: {},
6285
+ odr: odr,
6286
+ mo: mode,
6287
+ en_axis: en_axis,
6288
+ fsr: fsr,
6289
+ hour: hour,
6290
+ minute: minute,
6291
+ device_temp: device_temp,
6292
+ }
6293
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
6294
+ }
6295
+ if(Object.keys(globalDevices[deviceAddr].data).length == expected_packets){
6296
+ var raw_data = new Array();
6297
+
6298
+ for(const packet in globalDevices[deviceAddr].data){
6299
+ raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
6300
+ }
6301
+ var label = 0;
6302
+
6303
+ var fft = new Array();
6304
+ var fft_concat = {};
6305
+
6306
+ var en_axis_data = {};
6307
+ switch (globalDevices[deviceAddr].en_axis){
6308
+ case 1:
6309
+ en_axis_data.x_offset = 0;
6310
+ en_axis_data.increment = 2;
6311
+ break;
6312
+ case 2:
6313
+ en_axis_data.y_offset = 0;
6314
+ en_axis_data.increment = 2;
6315
+ break;
6316
+ case 3:
6317
+ en_axis_data.x_offset = 0;
6318
+ en_axis_data.y_offset = 2;
6319
+ en_axis_data.increment = 4;
6320
+ break;
6321
+ case 4:
6322
+ en_axis_data.z_offset = 0;
6323
+ en_axis_data.increment = 2;
6324
+ break;
6325
+ case 5:
6326
+ en_axis_data.x_offset = 0;
6327
+ en_axis_data.z_offset = 2;
6328
+ en_axis_data.increment = 4;
6329
+ break;
6330
+ case 6:
6331
+ en_axis_data.y_offset = 0;
6332
+ en_axis_data.z_offset = 2;
6333
+ en_axis_data.increment = 4;
6334
+ break;
6335
+ case 7:
6336
+ en_axis_data.x_offset = 0;
6337
+ en_axis_data.y_offset = 2;
6338
+ en_axis_data.z_offset = 4;
6339
+ en_axis_data.increment = 6;
6340
+ break;
6341
+ default:
6342
+ en_axis_data.increment = 0;
6343
+ }
6344
+
6345
+ var fsr_mult = .00006;
6346
+ var fsr_text = "";
6347
+ switch(globalDevices[deviceAddr].fsr){
6348
+ case 0:
6349
+ fsr_mult = 0.00006;
6350
+ break;
6351
+ case 1:
6352
+ fsr_mult = 0.00012;
6353
+ break;
6354
+ case 2:
6355
+ fsr_mult = 0.00024;
6356
+ break;
6357
+ case 3:
6358
+ fsr_mult = 0.00049;
6359
+ break;
6360
+ }
6361
+ switch(globalDevices[deviceAddr].fsr){
6362
+ case 0:
6363
+ fsr_text = "2g";
6364
+ break;
6365
+ case 1:
6366
+ fsr_text = "4g";
6367
+ break;
6368
+ case 2:
6369
+ fsr_text = "8g";
6370
+ break;
6371
+ case 3:
6372
+ fsr_text = "16g";
6373
+ break;
6374
+ }
6375
+
6376
+ for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
6377
+ label++;
6378
+
6379
+ fft_concat[label] = {};
6380
+
6381
+ if('x_offset' in en_axis_data){
6382
+ 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));
6383
+ }
6384
+ if('y_offset' in en_axis_data){
6385
+ 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));
6386
+ }
6387
+ if('z_offset' in en_axis_data){
6388
+ 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));
6389
+ }
6390
+ }
6391
+
6392
+ // If 4th bit is 1 the packet is from the second probe, if 0 from the first
6393
+ var probe = '';
6394
+ if(payload[7] & 8){
6395
+ probe = '2';
6396
+ }
6397
+ else{
6398
+ probe = '1';
6399
+ }
6400
+
6401
+ var fft_concat_obj = {
6402
+ probe: probe,
6403
+ time_id: globalDevices[deviceAddr].hour +':'+ globalDevices[deviceAddr].minute,
6404
+ probe: probe,
6405
+ mac_address: deviceAddr,
6406
+ en_axis: globalDevices[deviceAddr].en_axis,
6407
+ fsr: fsr_text,
6408
+ odr: globalDevices[deviceAddr].odr,
6409
+ device_temp: globalDevices[deviceAddr].device_temp,
6410
+ data: fft_concat
6411
+ };
6412
+ sensor_data = fft_concat_obj;
6413
+ delete globalDevices[deviceAddr];
6414
+ if(this.hasOwnProperty('failure_no')){
6415
+ console.log('####falure no');
6416
+ console.log(this.failure_no);
6417
+ }
6418
+
6419
+ return sensor_data;
6420
+ }
6421
+ else{
6422
+ return;
6423
+ }
6424
+ }else{
6425
+ var mode = payload[8];
6426
+ var odr = payload[9];
6427
+ var en_axis = payload[10] & 7;
6428
+ var fsr = payload[10] >> 5;
6429
+ var device_temp = msbLsb(payload[13], payload[14])/100;
6430
+
6431
+
6432
+ switch(odr){
6433
+ case 6:
6434
+ odr = 50;
6435
+ break;
6436
+ case 7:
6437
+ odr = 100;
6438
+ break;
6439
+ case 8:
6440
+ odr = 200;
6441
+ break;
6442
+ case 9:
6443
+ odr = 400;
6444
+ break;
6445
+ case 10:
6446
+ odr = 800;
6447
+ break;
6448
+ case 11:
6449
+ odr = 1600;
6450
+ break;
6451
+ case 12:
6452
+ odr = 3200;
6453
+ break;
6454
+ case 13:
6455
+ odr = 6400;
6456
+ break;
6457
+ case 14:
6458
+ odr = 12800;
6459
+ break;
6460
+ case 15:
6461
+ odr = 25600;
6462
+ break;
6463
+ default:
6464
+ odr = 0;
6465
+ }
6466
+
6467
+ globalDevices[deviceAddr] = {
6468
+ // stream_size: expected_packets,
6469
+ data: {},
6470
+ odr: odr,
6471
+ mo: mode,
6472
+ en_axis: en_axis,
6473
+ fsr: fsr,
6474
+ hour: hour,
6475
+ minute: minute,
6476
+ device_temp: device_temp,
6477
+ }
6478
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
6479
+ return;
6480
+ }
6481
+ }
6482
+ else if(payload[8] === 0 || payload[8] === 2){
6483
+ // mode byte most significant bit will indicate fft data.
6484
+ // console.log(d);
6485
+ var odr1;
6486
+ switch(payload[9]){
6487
+ case 6:
6488
+ odr1 = "50Hz"
6489
+ break;
6490
+ case 7:
6491
+ odr1 = "100Hz";
6492
+ break;
6493
+ case 8:
6494
+ odr1 = "200Hz";
6495
+ break;
6496
+ case 9:
6497
+ odr1 = "400Hz";
6498
+ break;
6499
+ case 10:
6500
+ odr1 = "800Hz";
6501
+ break;
6502
+ case 11:
6503
+ odr1 = "1600Hz";
6504
+ break;
6505
+ case 12:
6506
+ odr1 = "3200Hz";
6507
+ break;
6508
+ case 13:
6509
+ odr1 = "6400Hz";
6510
+ break;
6511
+ case 14:
6512
+ odr1 = "12800Hz";
6513
+ break;
6514
+ case 15:
6515
+ odr1 = "25600Hz";
6516
+ break;
6517
+ }
6518
+ var odr2;
6519
+ switch(payload[54]){
6520
+ case 6:
6521
+ odr2 = "50Hz"
6522
+ break;
6523
+ case 7:
6524
+ odr2 = "100Hz";
6525
+ break;
6526
+ case 8:
6527
+ odr2 = "200Hz";
6528
+ break;
6529
+ case 9:
6530
+ odr2 = "400Hz";
6531
+ break;
6532
+ case 10:
6533
+ odr2 = "800Hz";
6534
+ break;
6535
+ case 11:
6536
+ odr2 = "1600Hz";
6537
+ break;
6538
+ case 12:
6539
+ odr2 = "3200Hz";
6540
+ break;
6541
+ case 13:
6542
+ odr2 = "6400Hz";
6543
+ break;
6544
+ case 14:
6545
+ odr2 = "12800Hz";
6546
+ break;
6547
+ case 15:
6548
+ odr2 = "25600Hz";
6549
+ break;
6550
+ }
6551
+
6552
+ // If 4th bit is 1 the packet is from the second probe, if 0 from the first
6553
+ // var probe = '';
6554
+ // if(payload[7] & 8){
6555
+ // probe = '2';
6556
+ // }
6557
+ // else{
6558
+ // probe = '1';
6559
+ // }
6560
+
6561
+ return {
6562
+ mode: payload[8],
6563
+
6564
+ s1_odr: odr1,
6565
+ s1_temperature: signInt(payload.slice(10, 12).reduce(msbLsb), 16) / 100,
6566
+
6567
+ x1_rms_ACC_G: payload.slice(12, 14).reduce(msbLsb)/1000,
6568
+ x1_max_ACC_G: payload.slice(14, 16).reduce(msbLsb)/1000,
6569
+ x1_velocity_mm_sec: payload.slice(16, 18).reduce(msbLsb) / 100,
6570
+ x1_displacement_mm: payload.slice(18, 20).reduce(msbLsb) / 100,
6571
+ x1_peak_one_Hz: payload.slice(20, 22).reduce(msbLsb),
6572
+ x1_peak_two_Hz: payload.slice(22, 24).reduce(msbLsb),
6573
+ x1_peak_three_Hz: payload.slice(24, 26).reduce(msbLsb),
6574
+
6575
+ y1_rms_ACC_G: payload.slice(26, 28).reduce(msbLsb)/1000,
6576
+ y1_max_ACC_G: payload.slice(28, 30).reduce(msbLsb)/1000,
6577
+ y1_velocity_mm_sec: payload.slice(30, 32).reduce(msbLsb) / 100,
6578
+ y1_displacement_mm: payload.slice(32, 34).reduce(msbLsb) / 100,
6579
+ y1_peak_one_Hz: payload.slice(34, 36).reduce(msbLsb),
6580
+ y1_peak_two_Hz: payload.slice(36, 38).reduce(msbLsb),
6581
+ y1_peak_three_Hz: payload.slice(38, 40).reduce(msbLsb),
6582
+
6583
+ z1_rms_ACC_G: payload.slice(40, 42).reduce(msbLsb)/1000,
6584
+ z1_max_ACC_G: payload.slice(42, 44).reduce(msbLsb)/1000,
6585
+ z1_velocity_mm_sec: payload.slice(44, 46).reduce(msbLsb) / 100,
6586
+ z1_displacement_mm: payload.slice(46, 48).reduce(msbLsb) / 100,
6587
+ z1_peak_one_Hz: payload.slice(48, 50).reduce(msbLsb),
6588
+ z1_peak_two_Hz: payload.slice(50, 52).reduce(msbLsb),
6589
+ z1_peak_three_Hz: payload.slice(52, 54).reduce(msbLsb),
6590
+
6591
+ s2_odr: odr2,
6592
+ s2_temperature: signInt(payload.slice(55, 57).reduce(msbLsb), 16) / 100,
6593
+
6594
+ x2_rms_ACC_G: payload.slice(57, 59).reduce(msbLsb)/1000,
6595
+ x2_max_ACC_G: payload.slice(59, 61).reduce(msbLsb)/1000,
6596
+ x2_velocity_mm_sec: payload.slice(61, 63).reduce(msbLsb) / 100,
6597
+ x2_displacement_mm: payload.slice(63, 65).reduce(msbLsb) / 100,
6598
+ x2_peak_one_Hz: payload.slice(65, 67).reduce(msbLsb),
6599
+ x2_peak_two_Hz: payload.slice(67, 69).reduce(msbLsb),
6600
+ x2_peak_three_Hz: payload.slice(69, 71).reduce(msbLsb),
6601
+
6602
+ y2_rms_ACC_G: payload.slice(71, 73).reduce(msbLsb)/1000,
6603
+ y2_max_ACC_G: payload.slice(73, 75).reduce(msbLsb)/1000,
6604
+ y2_velocity_mm_sec: payload.slice(75, 77).reduce(msbLsb) / 100,
6605
+ y2_displacement_mm: payload.slice(77, 79).reduce(msbLsb) / 100,
6606
+ y2_peak_one_Hz: payload.slice(79, 81).reduce(msbLsb),
6607
+ y2_peak_two_Hz: payload.slice(81, 83).reduce(msbLsb),
6608
+ y2_peak_three_Hz: payload.slice(83, 85).reduce(msbLsb),
6609
+
6610
+ z2_rms_ACC_G: payload.slice(85, 87).reduce(msbLsb)/1000,
6611
+ z2_max_ACC_G: payload.slice(87, 89).reduce(msbLsb)/1000,
6612
+ z2_velocity_mm_sec: payload.slice(89, 91).reduce(msbLsb) / 100,
6613
+ z2_displacement_mm: payload.slice(91, 93).reduce(msbLsb) / 100,
6614
+ z2_peak_one_Hz: payload.slice(93, 95).reduce(msbLsb),
6615
+ z2_peak_two_Hz: payload.slice(95, 97).reduce(msbLsb),
6616
+ z2_peak_three_Hz: payload.slice(97, 99).reduce(msbLsb)
6617
+ };
6618
+ }
6619
+ // else{
6620
+ // parsed.data = {'error': 'Vibration mode error'}
6621
+ // return parsed;
6622
+ // }
6623
+ },
6624
+ 'parse_fly': (frame) => {
6625
+ let frame_data = {};
6626
+ switch(frame[16]){
6627
+ case 0:
6628
+ frame_data.mode = "Processed";
6629
+ break;
6630
+ case 1:
6631
+ frame_data.mode = "Raw";
6632
+ break;
6633
+ case 2:
6634
+ frame_data.mode = "Processed + Raw on demand";
6635
+ break;
6636
+ }
6637
+ switch(frame[17]){
6638
+ case 6:
6639
+ frame_data.odr_1 = 50;
6640
+ break;
6641
+ case 7:
6642
+ frame_data.odr_1 = 100;
6643
+ break;
6644
+ case 8:
6645
+ frame_data.odr_1 = 200;
6646
+ break;
6647
+ case 9:
6648
+ frame_data.odr_1 = 400;
6649
+ break;
6650
+ case 10:
6651
+ frame_data.odr_1 = 800;
6652
+ break;
6653
+ case 11:
6654
+ frame_data.odr_1 = 1600;
6655
+ break;
6656
+ case 12:
6657
+ frame_data.odr_1 = 3200;
6658
+ break;
6659
+ case 13:
6660
+ frame_data.odr_1 = 6400;
6661
+ break;
6662
+ case 14:
6663
+ frame_data.odr_1 = 12800;
6664
+ break;
6665
+ case 15:
6666
+ frame_data.odr_1 = 25600;
6667
+ break;
6668
+ }
6669
+ switch(frame[18]){
6670
+ case 6:
6671
+ frame_data.odr_2 = 50;
6672
+ break;
6673
+ case 7:
6674
+ frame_data.odr_2 = 100;
6675
+ break;
6676
+ case 8:
6677
+ frame_data.odr_2 = 200;
6678
+ break;
6679
+ case 9:
6680
+ frame_data.odr_2 = 400;
6681
+ break;
6682
+ case 10:
6683
+ frame_data.odr_2 = 800;
6684
+ break;
6685
+ case 11:
6686
+ frame_data.odr_2 = 1600;
6687
+ break;
6688
+ case 12:
6689
+ frame_data.odr_2 = 3200;
6690
+ break;
6691
+ case 13:
6692
+ frame_data.odr_2 = 6400;
6693
+ break;
6694
+ case 14:
6695
+ frame_data.odr_2 = 12800;
6696
+ break;
6697
+ case 15:
6698
+ frame_data.odr_2 = 25600;
6699
+ break;
6700
+ }
6701
+ frame_data.sampling_duration_1 = frame[19]*50 + "ms";
6702
+ frame_data.sampling_duration_2 = frame[20]*50 + "ms";
6703
+ switch(frame[21]){
6704
+ case 0:
6705
+ frame_data.filter_status = "Disabled";
6706
+ break;
6707
+ case 1:
6708
+ frame_data.filter_status = "Enabled";
6709
+ break;
6710
+ }
6711
+ switch(frame[22]){
6712
+ case 0:
6713
+ frame_data.lpf_coeff_1 = 4;
6714
+ break;
6715
+ case 1:
6716
+ frame_data.lpf_coeff_1 = 8;
6717
+ break;
6718
+ case 2:
6719
+ frame_data.lpf_coeff_1 = 16;
6720
+ break;
6721
+ case 2:
6722
+ frame_data.lpf_coeff_1 = 32;
6723
+ break;
6724
+ case 4:
6725
+ frame_data.lpf_coeff_1 = 64;
6726
+ break;
6727
+ case 5:
6728
+ frame_data.lpf_coeff_1 = 128;
6729
+ break;
6730
+ case 6:
6731
+ frame_data.lpf_coeff_1 = 256;
6732
+ break;
6733
+ case 7:
6734
+ frame_data.lpf_coeff_1 = 512;
6735
+ break;
6736
+ case 8:
6737
+ frame_data.lpf_coeff_1 = 1024;
6738
+ break;
6739
+ case 9:
6740
+ frame_data.lpf_coeff_1 = 2048;
6741
+ break;
6742
+ }
6743
+ frame_data.lpf_freq_1 = frame_data.odr_1 / frame_data.lpf_coeff_1;
6744
+ switch(frame[23]){
6745
+ case 0:
6746
+ frame_data.lpf_coeff_2 = 4;
6747
+ break;
6748
+ case 1:
6749
+ frame_data.lpf_coeff_2 = 8;
6750
+ break;
6751
+ case 2:
6752
+ frame_data.lpf_coeff_2 = 16;
6753
+ break;
6754
+ case 2:
6755
+ frame_data.lpf_coeff_2 = 32;
6756
+ break;
6757
+ case 4:
6758
+ frame_data.lpf_coeff_2 = 64;
6759
+ break;
6760
+ case 5:
6761
+ frame_data.lpf_coeff_2 = 128;
6762
+ break;
6763
+ case 6:
6764
+ frame_data.lpf_coeff_2 = 256;
6765
+ break;
6766
+ case 7:
6767
+ frame_data.lpf_coeff_2 = 512;
6768
+ break;
6769
+ case 8:
6770
+ frame_data.lpf_coeff_2 = 1024;
6771
+ break;
6772
+ case 9:
6773
+ frame_data.lpf_coeff_2 = 2048;
6774
+ break;
6775
+ }
6776
+ frame_data.lpf_freq_2 = frame_data.odr_2 / frame_data.lpf_coeff_2;
6777
+ switch(frame[24]){
6778
+ case 0:
6779
+ frame_data.hpf_coeff_1 = 4;
6780
+ break;
6781
+ case 1:
6782
+ frame_data.hpf_coeff_1 = 8;
6783
+ break;
6784
+ case 2:
6785
+ frame_data.hpf_coeff_1 = 16;
6786
+ break;
6787
+ case 2:
6788
+ frame_data.hpf_coeff_1 = 32;
6789
+ break;
6790
+ case 4:
6791
+ frame_data.hpf_coeff_1 = 64;
6792
+ break;
6793
+ case 5:
6794
+ frame_data.hpf_coeff_1 = 128;
6795
+ break;
6796
+ case 6:
6797
+ frame_data.hpf_coeff_1 = 256;
6798
+ break;
6799
+ case 7:
6800
+ frame_data.hpf_coeff_1 = 512;
6801
+ break;
6802
+ case 8:
6803
+ frame_data.hpf_coeff_1 = 1024;
6804
+ break;
6805
+ case 9:
6806
+ frame_data.hpf_coeff_1 = 2048;
6807
+ break;
6808
+ }
6809
+ frame_data.hpf_freq_1 = frame_data.odr_1 / frame_data.hpf_coeff_1;
6810
+ switch(frame[25]){
6811
+ case 0:
6812
+ frame_data.hpf_coeff_2 = 4;
6813
+ break;
6814
+ case 1:
6815
+ frame_data.hpf_coeff_2 = 8;
6816
+ break;
6817
+ case 2:
6818
+ frame_data.hpf_coeff_2 = 16;
6819
+ break;
6820
+ case 2:
6821
+ frame_data.hpf_coeff_2 = 32;
6822
+ break;
6823
+ case 4:
6824
+ frame_data.hpf_coeff_2 = 64;
6825
+ break;
6826
+ case 5:
6827
+ frame_data.hpf_coeff_2 = 128;
6828
+ break;
6829
+ case 6:
6830
+ frame_data.hpf_coeff_2 = 256;
6831
+ break;
6832
+ case 7:
6833
+ frame_data.hpf_coeff_2 = 512;
6834
+ break;
6835
+ case 8:
6836
+ frame_data.hpf_coeff_2 = 1024;
6837
+ break;
6838
+ case 9:
6839
+ frame_data.hpf_coeff_2 = 2048;
6840
+ break;
6841
+ }
6842
+ frame_data.hpf_freq_2 = frame_data.odr_2 / frame_data.hpf_coeff_2;
6843
+ switch(frame[26]){
6844
+ case 0:
6845
+ frame_data.sampling_interval = "5 Minutes";
6846
+ break;
6847
+ case 1:
6848
+ frame_data.sampling_interval = "10 Minutes";
6849
+ break;
6850
+ case 2:
6851
+ frame_data.sampling_interval = "15 Minutes";
6852
+ break;
6853
+ case 2:
6854
+ frame_data.sampling_interval = "20 Minutes";
6855
+ break;
6856
+ case 4:
6857
+ frame_data.sampling_interval = "30 Minutes";
6858
+ break;
6859
+ case 5:
6860
+ frame_data.sampling_interval = "60 Minutes";
6861
+ break;
6862
+ case 6:
6863
+ frame_data.sampling_interval = "120 Minutes";
6864
+ break;
6865
+ case 7:
6866
+ frame_data.sampling_interval = "180 Minutes";
6867
+ break;
6868
+ case 8:
6869
+ frame_data.sampling_interval = "1 Minute";
6870
+ break;
6871
+ }
6872
+ frame_data.on_request_timeout = frame[27] + " Seconds";
6873
+ frame_data.deadband = frame[28] + "mg";
6874
+
6875
+ switch(frame[29]){
6876
+ case 0:
6877
+ frame_data.payload_length = "50 Bytes";
6878
+ break;
6879
+ case 1:
6880
+ frame_data.payload_length = "100 Bytes";
6881
+ break;
6882
+ case 2:
6883
+ frame_data.payload_length = "150 Bytes";
6884
+ break;
6885
+ case 3:
6886
+ frame_data.payload_length = "180 Bytes";
6887
+ break;
6888
+ }
6889
+
6890
+ return {
6891
+ 'firmware': frame[2],
6892
+ 'destination_address': toMac(frame.slice(12, 16)),
6893
+ 'mode': frame_data.mode,
6894
+ 'odr_1': frame_data.odr_1+'Hz',
6895
+ 'odr_2': frame_data.odr_2+'Hz',
6896
+ 'sampling_duration_1': frame_data.sampling_duration_1,
6897
+ 'sampling_duration_2': frame_data.sampling_duration_2,
6898
+ 'filter_status': frame_data.filter_status,
6899
+ 'lpf_coeff_1': frame_data.lpf_coeff_1,
6900
+ 'lpf_freq_1': frame_data.lpf_freq_1+'Hz',
6901
+ 'lpf_coeff_2': frame_data.lpf_coeff_2,
6902
+ 'lpf_freq_2': frame_data.lpf_freq_2+'Hz',
6903
+ 'hpf_coeff_1': frame_data.hpf_coeff_1,
6904
+ 'hpf_freq_1': frame_data.hpf_freq_1+'Hz',
6905
+ 'hpf_coeff_2': frame_data.hpf_coeff_2,
6906
+ 'hpf_freq_2': frame_data.hpf_freq_2+'Hz',
6907
+ 'sampling_interval': frame_data.sampling_interval,
6908
+ 'on_request_timeout': frame_data.on_request_timeout,
6909
+ 'deadband': frame_data.deadband,
6910
+ 'payload_length': frame_data.payload_length,
6911
+ 'machine_values': {
6912
+ 'firmware': frame[2],
6913
+ 'destination_address': toMac(frame.slice(12, 16), false),
6914
+ 'mode': frame[16],
6915
+ 'odr_1': frame[17],
6916
+ 'odr_2': frame[18],
6917
+ 'sampling_duration_1': frame[19],
6918
+ 'sampling_duration_2': frame[20],
6919
+ 'filter_status': frame[21],
6920
+ 'lpf_coeff_1': frame[22],
6921
+ 'lpf_coeff_2': frame[23],
6922
+ 'hpf_coeff_1': frame[24],
6923
+ 'hpf_coeff_2': frame[25],
6924
+ 'sampling_interval': frame[26],
6925
+ 'on_request_timeout': frame[27],
6926
+ 'deadband': frame[28],
6927
+ 'payload_length': frame[29]
6928
+ }
6929
+ }
6930
+ }
6931
+ },
6932
+ '112': {
6933
+ name: 'Condition Based/Predictive Maintenance Sensor v4',
6934
+ parse: (payload, parsed, mac) => {
6935
+ if(payload[7] >> 1 != 0){
6936
+ console.log('Error found');
6937
+ console.log(payload[7]);
6938
+ parsed.data = {error: 'Error found, Sensor Probe may be unattached'};
6939
+ return parsed;
6940
+ }
6941
+
6942
+ if(payload[8] === 1){
6943
+ var deviceAddr = mac;
6944
+ var firmware = payload[1];
6945
+ var hour = payload[11];
6946
+ var minute = payload[12];
6947
+ var expected_packets = payload[15];
6948
+ var current_packet = payload[16];
6949
+ var sdata_start = 17;
6950
+
6951
+ if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
6952
+ if(expected_packets != 1){
6953
+ // if a packet is already stored with the same packet ID, or if packet ID is 1, or if current packet ID is not one more than last packet ID
6954
+ if(current_packet in globalDevices[deviceAddr].data || current_packet == 1 || !((current_packet-1) in globalDevices[deviceAddr].data)) {
6955
+ console.log('-----');
6956
+ console.log('bad packet breakdown deleting stream');
6957
+ console.log(current_packet);
6958
+ console.log(expected_packets);
6959
+ console.log(current_packet in globalDevices[deviceAddr].data);
6960
+ console.log(current_packet == 1);
6961
+ console.log(!((current_packet-1) in globalDevices[deviceAddr].data));
6962
+ if(this.hasOwnProperty('failure_no')){
6963
+ this.failure_no = this.failure_no + 1;
6964
+ }
6965
+ else{
6966
+ this.failure_no = 1;
6967
+ }
6968
+ if(this.hasOwnProperty('failure_no')){
6969
+ console.log('####falure no');
6970
+ console.log(this.failure_no);
6971
+ }
6972
+ // console.log(globalDevices[deviceAddr].data);
6973
+ delete globalDevices[deviceAddr];
6974
+ if(current_packet != 1){
6975
+ return;
6976
+ } else{
6977
+
6978
+ var mode = payload[8];
6979
+ var odr = payload[9];
6980
+ var en_axis = payload[10] & 7;
6981
+ var fsr = payload[10] >> 5;
6982
+ var device_temp = msbLsb(payload[13], payload[14])/100;
6983
+
6984
+
6985
+ switch(odr){
6986
+ case 6:
6987
+ odr = 50;
6988
+ break;
6989
+ case 7:
6990
+ odr = 100;
6991
+ break;
6992
+ case 8:
6993
+ odr = 200;
6994
+ break;
6995
+ case 9:
6996
+ odr = 400;
6997
+ break;
6998
+ case 10:
6999
+ odr = 800;
7000
+ break;
7001
+ case 11:
7002
+ odr = 1600;
7003
+ break;
7004
+ case 12:
7005
+ odr = 3200;
7006
+ break;
7007
+ case 13:
7008
+ odr = 6400;
7009
+ break;
7010
+ case 14:
7011
+ odr = 12800;
7012
+ break;
7013
+ case 15:
7014
+ odr = 25600;
7015
+ break;
7016
+ default:
7017
+ odr = 0;
7018
+ }
7019
+
7020
+ globalDevices[deviceAddr] = {
7021
+ // stream_size: expected_packets,
7022
+ data: {},
7023
+ odr: odr,
7024
+ mo: mode,
7025
+ en_axis: en_axis,
7026
+ fsr: fsr,
7027
+ hour: hour,
7028
+ minute: minute,
7029
+ device_temp: device_temp,
7030
+ }
7031
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
7032
+ return;
7033
+ }
7034
+ }
7035
+ else{
7036
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
7037
+ }
7038
+ }
7039
+ else{
7040
+ var mode = payload[8];
7041
+ var odr = payload[9];
7042
+ var en_axis = payload[10] & 7;
7043
+ var fsr = payload[10] >> 5;
7044
+ var device_temp = msbLsb(payload[13], payload[14])/100;
7045
+
7046
+
7047
+ switch(odr){
7048
+ case 6:
7049
+ odr = 50;
7050
+ break;
7051
+ case 7:
7052
+ odr = 100;
7053
+ break;
7054
+ case 8:
7055
+ odr = 200;
7056
+ break;
7057
+ case 9:
7058
+ odr = 400;
7059
+ break;
7060
+ case 10:
7061
+ odr = 800;
7062
+ break;
7063
+ case 11:
7064
+ odr = 1600;
7065
+ break;
7066
+ case 12:
7067
+ odr = 3200;
7068
+ break;
7069
+ case 13:
7070
+ odr = 6400;
7071
+ break;
7072
+ case 14:
7073
+ odr = 12800;
7074
+ break;
7075
+ case 15:
7076
+ odr = 25600;
7077
+ break;
7078
+ default:
7079
+ odr = 0;
7080
+ }
7081
+
7082
+ globalDevices[deviceAddr] = {
7083
+ // stream_size: expected_packets,
7084
+ data: {},
7085
+ odr: odr,
7086
+ mo: mode,
7087
+ en_axis: en_axis,
7088
+ fsr: fsr,
7089
+ hour: hour,
7090
+ minute: minute,
7091
+ device_temp: device_temp,
7092
+ }
7093
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
7094
+ }
7095
+ if(Object.keys(globalDevices[deviceAddr].data).length == expected_packets){
7096
+ var raw_data = new Array();
7097
+ for(const packet in globalDevices[deviceAddr].data){
7098
+ raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
7099
+ }
7100
+ var label = 0;
7101
+
7102
+ var fft = new Array();
7103
+ var fft_concat = {};
7104
+
7105
+ var en_axis_data = {};
7106
+ switch (globalDevices[deviceAddr].en_axis){
7107
+ case 1:
7108
+ en_axis_data.x_offset = 0;
7109
+ en_axis_data.increment = 2;
7110
+ break;
7111
+ case 2:
7112
+ en_axis_data.y_offset = 0;
7113
+ en_axis_data.increment = 2;
7114
+ break;
7115
+ case 3:
7116
+ en_axis_data.x_offset = 0;
7117
+ en_axis_data.y_offset = 2;
7118
+ en_axis_data.increment = 4;
7119
+ break;
7120
+ case 4:
7121
+ en_axis_data.z_offset = 0;
7122
+ en_axis_data.increment = 2;
7123
+ break;
7124
+ case 5:
7125
+ en_axis_data.x_offset = 0;
7126
+ en_axis_data.z_offset = 2;
7127
+ en_axis_data.increment = 4;
7128
+ break;
7129
+ case 6:
7130
+ en_axis_data.y_offset = 0;
7131
+ en_axis_data.z_offset = 2;
7132
+ en_axis_data.increment = 4;
7133
+ break;
7134
+ case 7:
7135
+ en_axis_data.x_offset = 0;
7136
+ en_axis_data.y_offset = 2;
7137
+ en_axis_data.z_offset = 4;
7138
+ en_axis_data.increment = 6;
7139
+ break;
7140
+ default:
7141
+ en_axis_data.increment = 0;
7142
+ }
7143
+
7144
+ var fsr_mult = .00006;
7145
+ var fsr_text = "";
7146
+ switch(globalDevices[deviceAddr].fsr){
7147
+ case 0:
7148
+ fsr_mult = 0.00006;
7149
+ break;
7150
+ case 1:
7151
+ fsr_mult = 0.00012;
7152
+ break;
7153
+ case 2:
7154
+ fsr_mult = 0.00024;
7155
+ break;
7156
+ case 3:
7157
+ fsr_mult = 0.00049;
7158
+ break;
7159
+ }
7160
+ switch(globalDevices[deviceAddr].fsr){
7161
+ case 0:
7162
+ fsr_text = "2g";
7163
+ break;
7164
+ case 1:
7165
+ fsr_text = "4g";
7166
+ break;
7167
+ case 2:
7168
+ fsr_text = "8g";
7169
+ break;
7170
+ case 3:
7171
+ fsr_text = "16g";
7172
+ break;
7173
+ }
7174
+
7175
+ for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
7176
+ label++;
7177
+
7178
+ fft_concat[label] = {};
7179
+
7180
+ if('x_offset' in en_axis_data){
7181
+ 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));
7182
+ }
7183
+ if('y_offset' in en_axis_data){
7184
+ 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));
7185
+ }
7186
+ if('z_offset' in en_axis_data){
7187
+ 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));
7188
+ }
7189
+ }
7190
+ var fft_concat_obj = {
7191
+ time_id: globalDevices[deviceAddr].hour +':'+ globalDevices[deviceAddr].minute,
7192
+ mac_address: deviceAddr,
7193
+ en_axis: globalDevices[deviceAddr].en_axis,
7194
+ fsr: fsr_text,
7195
+ odr: globalDevices[deviceAddr].odr,
7196
+ device_temp: globalDevices[deviceAddr].device_temp,
7197
+ data: fft_concat
7198
+ };
7199
+ // console.log(globalDevices[deviceAddr].data);
7200
+ // console.log(raw_data);
7201
+ sensor_data = fft_concat_obj;
7202
+ // parsed.raw_packets = globalDevices[deviceAddr].data;
7203
+ // parsed.raw_data = raw_data;
7204
+ delete globalDevices[deviceAddr];
7205
+ if(this.hasOwnProperty('failure_no')){
7206
+ console.log('####falure no');
7207
+ console.log(this.failure_no);
7208
+ }
7209
+
7210
+ return sensor_data;
7211
+ }
7212
+ else{
7213
+ return;
7214
+ }
7215
+ }else{
7216
+
7217
+ var mode = payload[8];
7218
+ var odr = payload[9];
7219
+ var en_axis = payload[10] & 7;
7220
+ var fsr = payload[10] >> 5;
7221
+ var device_temp = msbLsb(payload[13], payload[14])/100;
7222
+
7223
+
7224
+ switch(odr){
7225
+ case 6:
7226
+ odr = 50;
7227
+ break;
7228
+ case 7:
7229
+ odr = 100;
7230
+ break;
7231
+ case 8:
7232
+ odr = 200;
7233
+ break;
7234
+ case 9:
7235
+ odr = 400;
7236
+ break;
7237
+ case 10:
7238
+ odr = 800;
7239
+ break;
7240
+ case 11:
7241
+ odr = 1600;
7242
+ break;
7243
+ case 12:
7244
+ odr = 3200;
7245
+ break;
7246
+ case 13:
7247
+ odr = 6400;
7248
+ break;
7249
+ case 14:
7250
+ odr = 12800;
7251
+ break;
7252
+ case 15:
7253
+ odr = 25600;
7254
+ break;
7255
+ default:
7256
+ odr = 0;
7257
+ }
7258
+
7259
+ globalDevices[deviceAddr] = {
7260
+ // stream_size: expected_packets,
7261
+ data: {},
7262
+ odr: odr,
7263
+ mo: mode,
7264
+ en_axis: en_axis,
7265
+ fsr: fsr,
7266
+ hour: hour,
7267
+ minute: minute,
7268
+ device_temp: device_temp,
7269
+ }
7270
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
7271
+ return;
7272
+ }
7273
+ }
7274
+ else if(payload[8] === 0 || payload[8] === 2){
7275
+ // mode byte most significant bit will indicate fft data.
7276
+ // console.log(d);
7277
+ var odr;
7278
+ switch(payload[9]){
7279
+ case 6:
7280
+ odr = "50Hz"
7281
+ break;
7282
+ case 7:
7283
+ odr = "100Hz";
7284
+ break;
7285
+ case 8:
7286
+ odr = "200Hz";
7287
+ break;
7288
+ case 9:
7289
+ odr = "400Hz";
7290
+ break;
7291
+ case 10:
7292
+ odr = "800Hz";
7293
+ break;
7294
+ case 11:
7295
+ odr = "1600Hz";
7296
+ break;
7297
+ case 12:
7298
+ odr = "3200Hz";
7299
+ break;
7300
+ case 13:
7301
+ odr = "6400Hz";
7302
+ break;
7303
+ case 14:
7304
+ odr = "12800Hz";
7305
+ break;
7306
+ case 15:
7307
+ odr = "25600Hz";
7308
+ break;
7309
+ }
7310
+ return {
7311
+ mode: payload[8],
7312
+
7313
+ odr: odr,
7314
+ temperature: signInt(payload.slice(10, 12).reduce(msbLsb), 16) / 100,
7315
+ Ext_temperature: signInt(payload.slice(12, 16).reduce(msbLsb), 32) / 100,
7316
+ Current: signInt(payload.slice(16, 20).reduce(msbLsb), 32) / 1000,
7317
+ x_rms_ACC_G: payload.slice(20, 22).reduce(msbLsb)/1000,
7318
+ x_max_ACC_G: payload.slice(22, 24).reduce(msbLsb)/1000,
7319
+ x_velocity_mm_sec: payload.slice(24, 26).reduce(msbLsb) / 100,
7320
+ x_displacement_mm: payload.slice(26, 28).reduce(msbLsb) / 100,
7321
+ x_peak_one_Hz: payload.slice(28, 30).reduce(msbLsb),
7322
+ x_peak_two_Hz: payload.slice(30, 32).reduce(msbLsb),
7323
+ x_peak_three_Hz: payload.slice(32, 34).reduce(msbLsb),
7324
+
7325
+ y_rms_ACC_G: payload.slice(34, 36).reduce(msbLsb)/1000,
7326
+ y_max_ACC_G: payload.slice(36, 38).reduce(msbLsb)/1000,
7327
+ y_velocity_mm_sec: payload.slice(38, 40).reduce(msbLsb) / 100,
7328
+ y_displacement_mm: payload.slice(40, 42).reduce(msbLsb) / 100,
7329
+ y_peak_one_Hz: payload.slice(42, 44).reduce(msbLsb),
7330
+ y_peak_two_Hz: payload.slice(44, 46).reduce(msbLsb),
7331
+ y_peak_three_Hz: payload.slice(46, 48).reduce(msbLsb),
7332
+
7333
+ z_rms_ACC_G: payload.slice(48, 50).reduce(msbLsb)/1000,
7334
+ z_max_ACC_G: payload.slice(50, 52).reduce(msbLsb)/1000,
7335
+ z_velocity_mm_sec: payload.slice(52, 54).reduce(msbLsb) / 100,
7336
+ z_displacement_mm: payload.slice(54, 56).reduce(msbLsb) / 100,
7337
+ z_peak_one_Hz: payload.slice(56, 58).reduce(msbLsb),
7338
+ z_peak_two_Hz: payload.slice(58, 60).reduce(msbLsb),
7339
+ z_peak_three_Hz: payload.slice(60, 62).reduce(msbLsb),
7340
+ };
7341
+ }
7342
+ // else{
7343
+ // parsed.data = {'error': 'Vibration mode error'}
7344
+ // return parsed;
7345
+ // }
7346
+ },
7347
+ 'parse_fly': (frame) => {
7348
+ let frame_data = {};
7349
+ switch(frame[16]){
7350
+ case 0:
7351
+ frame_data.mode = "Processed";
7352
+ break;
7353
+ case 1:
7354
+ frame_data.mode = "Raw";
7355
+ break;
7356
+ case 2:
7357
+ frame_data.mode = "Processed + Raw on demand";
7358
+ break;
7359
+ }
7360
+ switch(frame[17]){
7361
+ case 6:
7362
+ frame_data.odr_1 = 50;
7363
+ break;
7364
+ case 7:
7365
+ frame_data.odr_1 = 100;
7366
+ break;
7367
+ case 8:
7368
+ frame_data.odr_1 = 200;
7369
+ break;
7370
+ case 9:
7371
+ frame_data.odr_1 = 400;
7372
+ break;
7373
+ case 10:
7374
+ frame_data.odr_1 = 800;
7375
+ break;
7376
+ case 11:
7377
+ frame_data.odr_1 = 1600;
7378
+ break;
7379
+ case 12:
7380
+ frame_data.odr_1 = 3200;
7381
+ break;
7382
+ case 13:
7383
+ frame_data.odr_1 = 6400;
7384
+ break;
7385
+ case 14:
7386
+ frame_data.odr_1 = 12800;
7387
+ break;
7388
+ case 15:
7389
+ frame_data.odr_1 = 25600;
7390
+ break;
7391
+ }
7392
+ frame_data.sampling_duration_1 = frame[19]*50 + "ms";
7393
+ switch(frame[21]){
7394
+ case 0:
7395
+ frame_data.filter_status = "Disabled";
7396
+ break;
7397
+ case 1:
7398
+ frame_data.filter_status = "Enabled";
7399
+ break;
7400
+ }
7401
+ switch(frame[22]){
7402
+ case 0:
7403
+ frame_data.lpf_coeff_1 = 4;
7404
+ break;
7405
+ case 1:
7406
+ frame_data.lpf_coeff_1 = 8;
7407
+ break;
7408
+ case 2:
7409
+ frame_data.lpf_coeff_1 = 16;
7410
+ break;
7411
+ case 2:
7412
+ frame_data.lpf_coeff_1 = 32;
7413
+ break;
7414
+ case 4:
7415
+ frame_data.lpf_coeff_1 = 64;
7416
+ break;
7417
+ case 5:
7418
+ frame_data.lpf_coeff_1 = 128;
7419
+ break;
7420
+ case 6:
7421
+ frame_data.lpf_coeff_1 = 256;
7422
+ break;
7423
+ case 7:
7424
+ frame_data.lpf_coeff_1 = 512;
7425
+ break;
7426
+ case 8:
7427
+ frame_data.lpf_coeff_1 = 1024;
7428
+ break;
7429
+ case 9:
7430
+ frame_data.lpf_coeff_1 = 2048;
7431
+ break;
7432
+ }
7433
+ frame_data.lpf_freq_1 = frame_data.odr_1 / frame_data.lpf_coeff_1;
7434
+ switch(frame[24]){
7435
+ case 0:
7436
+ frame_data.hpf_coeff_1 = 4;
7437
+ break;
7438
+ case 1:
7439
+ frame_data.hpf_coeff_1 = 8;
7440
+ break;
7441
+ case 2:
7442
+ frame_data.hpf_coeff_1 = 16;
7443
+ break;
7444
+ case 2:
7445
+ frame_data.hpf_coeff_1 = 32;
7446
+ break;
7447
+ case 4:
7448
+ frame_data.hpf_coeff_1 = 64;
7449
+ break;
7450
+ case 5:
7451
+ frame_data.hpf_coeff_1 = 128;
7452
+ break;
7453
+ case 6:
7454
+ frame_data.hpf_coeff_1 = 256;
7455
+ break;
7456
+ case 7:
7457
+ frame_data.hpf_coeff_1 = 512;
7458
+ break;
7459
+ case 8:
7460
+ frame_data.hpf_coeff_1 = 1024;
7461
+ break;
7462
+ case 9:
7463
+ frame_data.hpf_coeff_1 = 2048;
7464
+ break;
7465
+ }
7466
+ frame_data.hpf_freq_1 = frame_data.odr_1 / frame_data.hpf_coeff_1;
7467
+ switch(frame[26]){
7468
+ case 0:
7469
+ frame_data.sampling_interval = "5 Minutes";
7470
+ break;
7471
+ case 1:
7472
+ frame_data.sampling_interval = "10 Minutes";
7473
+ break;
7474
+ case 2:
7475
+ frame_data.sampling_interval = "15 Minutes";
7476
+ break;
7477
+ case 2:
7478
+ frame_data.sampling_interval = "20 Minutes";
7479
+ break;
7480
+ case 4:
7481
+ frame_data.sampling_interval = "30 Minutes";
7482
+ break;
7483
+ case 5:
7484
+ frame_data.sampling_interval = "60 Minutes";
7485
+ break;
7486
+ case 6:
7487
+ frame_data.sampling_interval = "120 Minutes";
7488
+ break;
7489
+ case 7:
7490
+ frame_data.sampling_interval = "180 Minutes";
7491
+ break;
7492
+ case 8:
7493
+ frame_data.sampling_interval = "1 Minute";
7494
+ break;
7495
+ }
7496
+ frame_data.on_request_timeout = frame[27] + " Seconds";
7497
+ frame_data.deadband = frame[28] + "mg";
7498
+
7499
+ switch(frame[29]){
7500
+ case 0:
7501
+ frame_data.payload_length = "50 Bytes";
7502
+ break;
7503
+ case 1:
7504
+ frame_data.payload_length = "100 Bytes";
7505
+ break;
7506
+ case 2:
7507
+ frame_data.payload_length = "150 Bytes";
7508
+ break;
7509
+ case 3:
7510
+ frame_data.payload_length = "180 Bytes";
7511
+ break;
7512
+ }
7513
+
7514
+ return {
7515
+ 'firmware': frame[2],
7516
+ 'destination_address': toMac(frame.slice(12, 16)),
7517
+ 'mode': frame_data.mode,
7518
+ 'odr_1': frame_data.odr_1+'Hz',
7519
+ 'sampling_duration_1': frame_data.sampling_duration_1,
7520
+ 'sampling_duration_2': frame_data.sampling_duration_2,
7521
+ 'filter_status': frame_data.filter_status,
7522
+ 'lpf_coeff_1': frame_data.lpf_coeff_1,
7523
+ 'lpf_freq_1': frame_data.lpf_freq_1+'Hz',
7524
+ 'hpf_coeff_1': frame_data.hpf_coeff_1,
7525
+ 'hpf_freq_1': frame_data.hpf_freq_1+'Hz',
7526
+ 'sampling_interval': frame_data.sampling_interval,
7527
+ 'on_request_timeout': frame_data.on_request_timeout,
7528
+ 'deadband': frame_data.deadband,
7529
+ 'payload_length': frame_data.payload_length,
7530
+ 'machine_values': {
7531
+ 'firmware': frame[2],
7532
+ 'destination_address': toMac(frame.slice(12, 16), false),
7533
+ 'mode': frame[16],
7534
+ 'odr_1': frame[17],
7535
+ 'sampling_duration_1': frame[19],
7536
+ 'sampling_duration_2': frame[20],
7537
+ 'filter_status': frame[21],
7538
+ 'lpf_coeff_1': frame[22],
7539
+ 'hpf_coeff_1': frame[24],
7540
+ 'sampling_interval': frame[26],
7541
+ 'on_request_timeout': frame[27],
7542
+ 'deadband': frame[28],
7543
+ 'payload_length': frame[29]
7544
+ }
7545
+ }
7546
+ }
7547
+ },
7548
+ '114': {
7549
+ name: 'Standalone Smart Vibration Sensor v4',
7550
+ parse: (payload, parsed, mac) => {
7551
+ if(payload[7] >> 1 != 0){
7552
+ console.log('Error found');
7553
+ parsed.data = {error: 'Error found, Sensor Probe may be unattached'};
7554
+ return parsed;
7555
+ }
7556
+
7557
+ if(payload[8] === 1){
7558
+ var deviceAddr = mac;
7559
+ var firmware = payload[1];
7560
+ var hour = payload[11];
7561
+ var minute = payload[12];
7562
+ var expected_packets = payload[15];
7563
+ var current_packet = payload[16];
7564
+ var sdata_start = 17;
7565
+
7566
+ if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
7567
+ if(expected_packets != 1){
7568
+ // if a packet is already stored with the same packet ID, or if packet ID is 1, or if current packet ID is not one more than last packet ID
7569
+ if(current_packet in globalDevices[deviceAddr].data || current_packet == 1 || !((current_packet-1) in globalDevices[deviceAddr].data)) {
7570
+ console.log('-----');
7571
+ console.log('bad packet breakdown deleting stream');
7572
+ console.log(current_packet);
7573
+ console.log(expected_packets);
7574
+ console.log(current_packet in globalDevices[deviceAddr].data);
7575
+ console.log(current_packet == 1);
7576
+ console.log(!((current_packet-1) in globalDevices[deviceAddr].data));
7577
+ if(this.hasOwnProperty('failure_no')){
7578
+ this.failure_no = this.failure_no + 1;
7579
+ }
7580
+ else{
7581
+ this.failure_no = 1;
7582
+ }
7583
+ if(this.hasOwnProperty('failure_no')){
7584
+ console.log('####falure no');
7585
+ console.log(this.failure_no);
7586
+ }
7587
+ // console.log(globalDevices[deviceAddr].data);
7588
+ delete globalDevices[deviceAddr];
7589
+ if(current_packet != 1){
7590
+ return;
7591
+ } else{
7592
+
7593
+ var mode = payload[8];
7594
+ var odr = payload[9];
7595
+ var en_axis = payload[10] & 7;
7596
+ var fsr = payload[10] >> 5;
7597
+ var device_temp = msbLsb(payload[13], payload[14])/100;
7598
+
7599
+
7600
+ switch(odr){
7601
+ case 6:
7602
+ odr = 50;
7603
+ break;
7604
+ case 7:
7605
+ odr = 100;
7606
+ break;
7607
+ case 8:
7608
+ odr = 200;
7609
+ break;
7610
+ case 9:
7611
+ odr = 400;
7612
+ break;
7613
+ case 10:
7614
+ odr = 800;
7615
+ break;
7616
+ case 11:
7617
+ odr = 1600;
7618
+ break;
7619
+ case 12:
7620
+ odr = 3200;
7621
+ break;
7622
+ case 13:
7623
+ odr = 6400;
7624
+ break;
7625
+ case 14:
7626
+ odr = 12800;
7627
+ break;
7628
+ case 15:
7629
+ odr = 25600;
7630
+ break;
7631
+ default:
7632
+ odr = 0;
7633
+ }
7634
+
7635
+ globalDevices[deviceAddr] = {
7636
+ // stream_size: expected_packets,
7637
+ data: {},
7638
+ odr: odr,
7639
+ mo: mode,
7640
+ en_axis: en_axis,
7641
+ fsr: fsr,
7642
+ hour: hour,
7643
+ minute: minute,
7644
+ device_temp: device_temp,
7645
+ }
7646
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
7647
+ return;
7648
+ }
7649
+ }
7650
+ else{
7651
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
7652
+ }
7653
+ }
7654
+ else{
7655
+ var mode = payload[8];
7656
+ var odr = payload[9];
7657
+ var en_axis = payload[10] & 7;
7658
+ var fsr = payload[10] >> 5;
7659
+ var device_temp = msbLsb(payload[13], payload[14])/100;
7660
+
7661
+
7662
+ switch(odr){
7663
+ case 6:
7664
+ odr = 50;
7665
+ break;
7666
+ case 7:
7667
+ odr = 100;
7668
+ break;
7669
+ case 8:
7670
+ odr = 200;
7671
+ break;
7672
+ case 9:
7673
+ odr = 400;
7674
+ break;
7675
+ case 10:
7676
+ odr = 800;
7677
+ break;
7678
+ case 11:
7679
+ odr = 1600;
7680
+ break;
7681
+ case 12:
7682
+ odr = 3200;
7683
+ break;
7684
+ case 13:
7685
+ odr = 6400;
7686
+ break;
7687
+ case 14:
7688
+ odr = 12800;
7689
+ break;
7690
+ case 15:
7691
+ odr = 25600;
7692
+ break;
7693
+ default:
7694
+ odr = 0;
7695
+ }
7696
+
7697
+ globalDevices[deviceAddr] = {
7698
+ // stream_size: expected_packets,
7699
+ data: {},
7700
+ odr: odr,
7701
+ mo: mode,
7702
+ en_axis: en_axis,
7703
+ fsr: fsr,
7704
+ hour: hour,
7705
+ minute: minute,
7706
+ device_temp: device_temp,
7707
+ }
7708
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
7709
+ }
7710
+ if(Object.keys(globalDevices[deviceAddr].data).length == expected_packets){
7711
+ var raw_data = new Array();
7712
+ for(const packet in globalDevices[deviceAddr].data){
7713
+ raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
7714
+ }
7715
+ var label = 0;
7716
+
7717
+ var fft = new Array();
7718
+ var fft_concat = {};
7719
+
7720
+ var en_axis_data = {};
7721
+ switch (globalDevices[deviceAddr].en_axis){
7722
+ case 1:
7723
+ en_axis_data.x_offset = 0;
7724
+ en_axis_data.increment = 2;
7725
+ break;
7726
+ case 2:
7727
+ en_axis_data.y_offset = 0;
7728
+ en_axis_data.increment = 2;
7729
+ break;
7730
+ case 3:
7731
+ en_axis_data.x_offset = 0;
7732
+ en_axis_data.y_offset = 2;
7733
+ en_axis_data.increment = 4;
7734
+ break;
7735
+ case 4:
7736
+ en_axis_data.z_offset = 0;
7737
+ en_axis_data.increment = 2;
7738
+ break;
7739
+ case 5:
7740
+ en_axis_data.x_offset = 0;
7741
+ en_axis_data.z_offset = 2;
7742
+ en_axis_data.increment = 4;
7743
+ break;
7744
+ case 6:
7745
+ en_axis_data.y_offset = 0;
7746
+ en_axis_data.z_offset = 2;
7747
+ en_axis_data.increment = 4;
7748
+ break;
7749
+ case 7:
7750
+ en_axis_data.x_offset = 0;
7751
+ en_axis_data.y_offset = 2;
7752
+ en_axis_data.z_offset = 4;
7753
+ en_axis_data.increment = 6;
7754
+ break;
7755
+ default:
7756
+ en_axis_data.increment = 0;
7757
+ }
7758
+
7759
+ var fsr_mult = .00006;
7760
+ var fsr_text = "";
7761
+ switch(globalDevices[deviceAddr].fsr){
7762
+ case 0:
7763
+ fsr_mult = 0.00006;
7764
+ break;
7765
+ case 1:
7766
+ fsr_mult = 0.00012;
7767
+ break;
7768
+ case 2:
7769
+ fsr_mult = 0.00024;
7770
+ break;
7771
+ case 3:
7772
+ fsr_mult = 0.00049;
7773
+ break;
7774
+ }
7775
+ switch(globalDevices[deviceAddr].fsr){
7776
+ case 0:
7777
+ fsr_text = "2g";
7778
+ break;
7779
+ case 1:
7780
+ fsr_text = "4g";
7781
+ break;
7782
+ case 2:
7783
+ fsr_text = "8g";
7784
+ break;
7785
+ case 3:
7786
+ fsr_text = "16g";
7787
+ break;
7788
+ }
7789
+
7790
+ for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
7791
+ label++;
7792
+
7793
+ fft_concat[label] = {};
7794
+
7795
+ if('x_offset' in en_axis_data){
7796
+ 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));
7797
+ }
7798
+ if('y_offset' in en_axis_data){
7799
+ 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));
7800
+ }
7801
+ if('z_offset' in en_axis_data){
7802
+ 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));
7803
+ }
7804
+ }
7805
+ var fft_concat_obj = {
7806
+ time_id: globalDevices[deviceAddr].hour +':'+ globalDevices[deviceAddr].minute,
7807
+ mac_address: deviceAddr,
7808
+ en_axis: globalDevices[deviceAddr].en_axis,
7809
+ fsr: fsr_text,
7810
+ odr: globalDevices[deviceAddr].odr,
7811
+ device_temp: globalDevices[deviceAddr].device_temp,
7812
+ data: fft_concat
7813
+ };
7814
+ sensor_data = fft_concat_obj;
7815
+ delete globalDevices[deviceAddr];
7816
+ if(this.hasOwnProperty('failure_no')){
7817
+ console.log('####falure no');
7818
+ console.log(this.failure_no);
7819
+ }
7820
+
7821
+ return sensor_data;
7822
+ }
7823
+ else{
7824
+ return;
7825
+ }
7826
+ }else{
7827
+
7828
+ var mode = payload[8];
7829
+ var odr = payload[9];
7830
+ var en_axis = payload[10] & 7;
7831
+ var fsr = payload[10] >> 5;
7832
+ var device_temp = msbLsb(payload[13], payload[14])/100;
7833
+
7834
+
7835
+ switch(odr){
7836
+ case 6:
7837
+ odr = 50;
7838
+ break;
7839
+ case 7:
7840
+ odr = 100;
7841
+ break;
7842
+ case 8:
7843
+ odr = 200;
7844
+ break;
7845
+ case 9:
7846
+ odr = 400;
7847
+ break;
7848
+ case 10:
7849
+ odr = 800;
7850
+ break;
7851
+ case 11:
7852
+ odr = 1600;
7853
+ break;
7854
+ case 12:
7855
+ odr = 3200;
7856
+ break;
7857
+ case 13:
7858
+ odr = 6400;
7859
+ break;
7860
+ case 14:
7861
+ odr = 12800;
7862
+ break;
7863
+ case 15:
7864
+ odr = 25600;
7865
+ break;
7866
+ default:
7867
+ odr = 0;
7868
+ }
7869
+
7870
+ globalDevices[deviceAddr] = {
7871
+ // stream_size: expected_packets,
7872
+ data: {},
7873
+ odr: odr,
7874
+ mo: mode,
7875
+ en_axis: en_axis,
7876
+ fsr: fsr,
7877
+ hour: hour,
7878
+ minute: minute,
7879
+ device_temp: device_temp,
7880
+ }
7881
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
7882
+ return;
7883
+ }
7884
+ }
7885
+ else if(payload[8] === 0 || payload[8] === 2){
7886
+ // mode byte most significant bit will indicate fft data.
7887
+ // console.log(d);
7888
+ var odr;
7889
+ switch(payload[9]){
7890
+ case 6:
7891
+ odr = "50Hz"
7892
+ break;
7893
+ case 7:
7894
+ odr = "100Hz";
7895
+ break;
7896
+ case 8:
7897
+ odr = "200Hz";
7898
+ break;
7899
+ case 9:
7900
+ odr = "400Hz";
7901
+ break;
7902
+ case 10:
7903
+ odr = "800Hz";
7904
+ break;
7905
+ case 11:
7906
+ odr = "1600Hz";
7907
+ break;
7908
+ case 12:
7909
+ odr = "3200Hz";
7910
+ break;
7911
+ case 13:
7912
+ odr = "6400Hz";
7913
+ break;
7914
+ case 14:
7915
+ odr = "12800Hz";
7916
+ break;
7917
+ case 15:
7918
+ odr = "25600Hz";
7919
+ break;
7920
+ }
7921
+ return {
7922
+ mode: payload[8],
7923
+
7924
+ odr: odr,
7925
+ temperature: signInt(payload.slice(10, 12).reduce(msbLsb), 16) / 100,
7926
+
7927
+ x_rms_ACC_G: payload.slice(12, 14).reduce(msbLsb)/1000,
7928
+ x_max_ACC_G: payload.slice(14, 16).reduce(msbLsb)/1000,
7929
+ x_velocity_mm_sec: payload.slice(16, 18).reduce(msbLsb) / 100,
7930
+ x_displacement_mm: payload.slice(18, 20).reduce(msbLsb) / 100,
7931
+ x_peak_one_Hz: payload.slice(20, 22).reduce(msbLsb),
7932
+ x_peak_two_Hz: payload.slice(22, 24).reduce(msbLsb),
7933
+ x_peak_three_Hz: payload.slice(24, 26).reduce(msbLsb),
7934
+
7935
+ y_rms_ACC_G: payload.slice(26, 28).reduce(msbLsb)/1000,
7936
+ y_max_ACC_G: payload.slice(28, 30).reduce(msbLsb)/1000,
7937
+ y_velocity_mm_sec: payload.slice(30, 32).reduce(msbLsb) / 100,
7938
+ y_displacement_mm: payload.slice(32, 34).reduce(msbLsb) / 100,
7939
+ y_peak_one_Hz: payload.slice(34, 36).reduce(msbLsb),
7940
+ y_peak_two_Hz: payload.slice(36, 38).reduce(msbLsb),
7941
+ y_peak_three_Hz: payload.slice(38, 40).reduce(msbLsb),
7942
+
7943
+ z_rms_ACC_G: payload.slice(40, 42).reduce(msbLsb)/1000,
7944
+ z_max_ACC_G: payload.slice(42, 44).reduce(msbLsb)/1000,
7945
+ z_velocity_mm_sec: payload.slice(44, 46).reduce(msbLsb) / 100,
7946
+ z_displacement_mm: payload.slice(46, 48).reduce(msbLsb) / 100,
7947
+ z_peak_one_Hz: payload.slice(48, 50).reduce(msbLsb),
7948
+ z_peak_two_Hz: payload.slice(50, 52).reduce(msbLsb),
7949
+ z_peak_three_Hz: payload.slice(52, 54).reduce(msbLsb),
7950
+ };
7951
+ }
7952
+ // else{
7953
+ // parsed.data = {'error': 'Vibration mode error'}
7954
+ // return parsed;
7955
+ // }
7956
+ },
7957
+ 'parse_fly': (frame) => {
7958
+ let frame_data = {};
7959
+ switch(frame[16]){
7960
+ case 0:
7961
+ frame_data.mode = "Processed";
7962
+ break;
7963
+ case 1:
7964
+ frame_data.mode = "Raw";
7965
+ break;
7966
+ case 2:
7967
+ frame_data.mode = "Processed + Raw on demand";
7968
+ break;
7969
+ }
7970
+ switch(frame[17]){
7971
+ case 6:
7972
+ frame_data.odr_1 = 50;
7973
+ break;
7974
+ case 7:
7975
+ frame_data.odr_1 = 100;
7976
+ break;
7977
+ case 8:
7978
+ frame_data.odr_1 = 200;
7979
+ break;
7980
+ case 9:
7981
+ frame_data.odr_1 = 400;
7982
+ break;
7983
+ case 10:
7984
+ frame_data.odr_1 = 800;
7985
+ break;
7986
+ case 11:
7987
+ frame_data.odr_1 = 1600;
7988
+ break;
7989
+ case 12:
7990
+ frame_data.odr_1 = 3200;
7991
+ break;
7992
+ case 13:
7993
+ frame_data.odr_1 = 6400;
7994
+ break;
7995
+ case 14:
7996
+ frame_data.odr_1 = 12800;
7997
+ break;
7998
+ case 15:
7999
+ frame_data.odr_1 = 25600;
8000
+ break;
8001
+ }
8002
+ frame_data.sampling_duration_1 = frame[19]*50 + "ms";
8003
+ switch(frame[21]){
8004
+ case 0:
8005
+ frame_data.filter_status = "Disabled";
8006
+ break;
8007
+ case 1:
8008
+ frame_data.filter_status = "Enabled";
8009
+ break;
8010
+ }
8011
+ switch(frame[22]){
8012
+ case 0:
8013
+ frame_data.lpf_coeff_1 = 4;
8014
+ break;
8015
+ case 1:
8016
+ frame_data.lpf_coeff_1 = 8;
8017
+ break;
8018
+ case 2:
8019
+ frame_data.lpf_coeff_1 = 16;
8020
+ break;
8021
+ case 2:
8022
+ frame_data.lpf_coeff_1 = 32;
8023
+ break;
8024
+ case 4:
8025
+ frame_data.lpf_coeff_1 = 64;
8026
+ break;
8027
+ case 5:
8028
+ frame_data.lpf_coeff_1 = 128;
8029
+ break;
8030
+ case 6:
8031
+ frame_data.lpf_coeff_1 = 256;
8032
+ break;
8033
+ case 7:
8034
+ frame_data.lpf_coeff_1 = 512;
8035
+ break;
8036
+ case 8:
8037
+ frame_data.lpf_coeff_1 = 1024;
8038
+ break;
8039
+ case 9:
8040
+ frame_data.lpf_coeff_1 = 2048;
8041
+ break;
8042
+ }
8043
+ frame_data.lpf_freq_1 = frame_data.odr_1 / frame_data.lpf_coeff_1;
8044
+ switch(frame[24]){
8045
+ case 0:
8046
+ frame_data.hpf_coeff_1 = 4;
8047
+ break;
8048
+ case 1:
8049
+ frame_data.hpf_coeff_1 = 8;
8050
+ break;
8051
+ case 2:
8052
+ frame_data.hpf_coeff_1 = 16;
8053
+ break;
8054
+ case 2:
8055
+ frame_data.hpf_coeff_1 = 32;
8056
+ break;
8057
+ case 4:
8058
+ frame_data.hpf_coeff_1 = 64;
8059
+ break;
8060
+ case 5:
8061
+ frame_data.hpf_coeff_1 = 128;
8062
+ break;
8063
+ case 6:
8064
+ frame_data.hpf_coeff_1 = 256;
8065
+ break;
8066
+ case 7:
8067
+ frame_data.hpf_coeff_1 = 512;
8068
+ break;
8069
+ case 8:
8070
+ frame_data.hpf_coeff_1 = 1024;
8071
+ break;
8072
+ case 9:
8073
+ frame_data.hpf_coeff_1 = 2048;
8074
+ break;
8075
+ }
8076
+ frame_data.hpf_freq_1 = frame_data.odr_1 / frame_data.hpf_coeff_1;
8077
+ switch(frame[26]){
8078
+ case 0:
8079
+ frame_data.sampling_interval = "5 Minutes";
8080
+ break;
8081
+ case 1:
8082
+ frame_data.sampling_interval = "10 Minutes";
8083
+ break;
8084
+ case 2:
8085
+ frame_data.sampling_interval = "15 Minutes";
8086
+ break;
8087
+ case 2:
8088
+ frame_data.sampling_interval = "20 Minutes";
8089
+ break;
8090
+ case 4:
8091
+ frame_data.sampling_interval = "30 Minutes";
8092
+ break;
8093
+ case 5:
8094
+ frame_data.sampling_interval = "60 Minutes";
8095
+ break;
8096
+ case 6:
8097
+ frame_data.sampling_interval = "120 Minutes";
8098
+ break;
8099
+ case 7:
8100
+ frame_data.sampling_interval = "180 Minutes";
8101
+ break;
8102
+ case 8:
8103
+ frame_data.sampling_interval = "1 Minute";
8104
+ break;
8105
+ }
8106
+ frame_data.on_request_timeout = frame[27] + " Seconds";
8107
+ frame_data.deadband = frame[28] + "mg";
8108
+
8109
+ switch(frame[29]){
8110
+ case 0:
8111
+ frame_data.payload_length = "50 Bytes";
8112
+ break;
8113
+ case 1:
8114
+ frame_data.payload_length = "100 Bytes";
8115
+ break;
8116
+ case 2:
8117
+ frame_data.payload_length = "150 Bytes";
8118
+ break;
8119
+ case 3:
8120
+ frame_data.payload_length = "180 Bytes";
8121
+ break;
8122
+ }
8123
+
8124
+ return {
8125
+ 'firmware': frame[2],
8126
+ 'destination_address': toMac(frame.slice(12, 16)),
8127
+ 'mode': frame_data.mode,
8128
+ 'odr_1': frame_data.odr_1+'Hz',
8129
+ 'sampling_duration_1': frame_data.sampling_duration_1,
8130
+ 'sampling_duration_2': frame_data.sampling_duration_2,
8131
+ 'filter_status': frame_data.filter_status,
8132
+ 'lpf_coeff_1': frame_data.lpf_coeff_1,
8133
+ 'lpf_freq_1': frame_data.lpf_freq_1+'Hz',
8134
+ 'hpf_coeff_1': frame_data.hpf_coeff_1,
8135
+ 'hpf_freq_1': frame_data.hpf_freq_1+'Hz',
8136
+ 'sampling_interval': frame_data.sampling_interval,
8137
+ 'on_request_timeout': frame_data.on_request_timeout,
8138
+ 'deadband': frame_data.deadband,
8139
+ 'payload_length': frame_data.payload_length,
8140
+ 'machine_values': {
8141
+ 'firmware': frame[2],
8142
+ 'destination_address': toMac(frame.slice(12, 16), false),
8143
+ 'mode': frame[16],
8144
+ 'odr_1': frame[17],
8145
+ 'sampling_duration_1': frame[19],
8146
+ 'sampling_duration_2': frame[20],
8147
+ 'filter_status': frame[21],
8148
+ 'lpf_coeff_1': frame[22],
8149
+ 'hpf_coeff_1': frame[24],
8150
+ 'sampling_interval': frame[26],
8151
+ 'on_request_timeout': frame[27],
8152
+ 'deadband': frame[28],
8153
+ 'payload_length': frame[29]
8154
+ }
8155
+ }
8156
+ }
8157
+ },
8158
+
8159
+ '180': {
8160
+ name: 'C1D2 One Channel Vibration Plus',
8161
+ parse: (payload, parsed, mac) => {
8162
+ return parent.sensor_types[80].parse(payload, parsed, mac);
8163
+ }
8164
+ },
8165
+ '181': {
8166
+ name: 'C1D2 Two Channel Vibration Plus',
8167
+ parse: (payload, parsed, mac) => {
8168
+ return parent.sensor_types[81].parse(payload, parsed, mac);
8169
+ }
8170
+ },
8171
+ '180': {
8172
+ name: 'C1D2 One Channel Vibration Plus',
8173
+ parse: (payload, parsed, mac) => {
8174
+ return parent.sensor_types[80].parse(payload, parsed, mac);
8175
+ }
8176
+ },
8177
+ '181': {
8178
+ name: 'C1D2 Two Channel Vibration Plus',
8179
+ parse: (payload, parsed, mac) => {
8180
+ return parent.sensor_types[81].parse(payload, parsed, mac);
8181
+ }
8182
+ },
8183
+ '200': {
8184
+ name: '4-20mA Pass Through',
8185
+ parse: (d) => {
8186
+ var adc1 = signInt(d.slice(0, 2).reduce(msbLsb));
8187
+ var adc2 = signInt(d.slice(2, 4).reduce(msbLsb));
8188
+ var dac1 = signInt(d.slice(4, 6).reduce(msbLsb));
8189
+ return {
8190
+ adc1: adc1,
8191
+ adc2: adc2,
8192
+ dac1: dac1,
8193
+ mA1: adc1/100.00,
8194
+ raw_adc: adc2,
8195
+ raw_dac: dac1,
8196
+ byteOne: d[0],
8197
+ byteTwo: d[1],
8198
+ byteThree: d[2],
8199
+ byteFour: d[3],
8200
+ byteFive: d[4],
8201
+ byteSix: d[5]
8202
+ };
8203
+ }
8204
+ },
8205
+
8206
+ '202': {
8207
+ name: 'Wireless Weather Station',
8208
+ parse: (d) => {
8209
+ return {
8210
+ Temp: signInt(d.slice(0, 4).reduce(msbLsb), 32) / 100,
8211
+ Humid: signInt(d.slice(4, 8).reduce(msbLsb), 32) / 100,
8212
+ Pressure: signInt(d.slice(8, 12).reduce(msbLsb), 32) / 100,
8213
+ WindSpd: signInt(d.slice(12, 16).reduce(msbLsb),32) / 100,
8214
+ WindDir: signInt(d.slice(16, 20).reduce(msbLsb),32) / 100
8215
+
8216
+ };
8217
+ }
8218
+ },
8219
+ '502': {
8220
+ name: 'Custom Environmental Sensor',
8221
+ parse: (d, full) => {
8222
+ reserve = full[7];
8223
+ if (reserve == 0xAA){
8224
+ var obj = {};
8225
+ for(i = 0; i < 18; i++){
8226
+ var label = 'sound'+i;
8227
+ obj[label] = d[i];
8228
+ }
8229
+ return obj;
8230
+ }else{
8231
+ return {
8232
+
8233
+ temperature: signInt(d.slice(0, 2).reduce(msbLsb), 16) / 100,
8234
+ pressure: d.slice(2, 6).reduce(msbLsb) / 100,
8235
+ humidity: d.slice(6, 10).reduce(msbLsb) / 1000,
8236
+ gas_resistance: d.slice(10, 14).reduce(msbLsb),
8237
+ iaq: d.slice(14, 16).reduce(msbLsb),
8238
+ light: d.slice(16, 18).reduce(msbLsb),
8239
+ sound: d[18]
8240
+ };
8241
+ }
8242
+ }
8243
+ },
8244
+
8245
+ '505': {
8246
+ 'name': 'Custom SAP 1-Channel Current Monitor',
8247
+ parse: (d) => {
8248
+ return {
8249
+ channel_1_rms: d.slice(0, 3).reduce(msbLsb),
8250
+ channel_1_max: d.slice(4, 7).reduce(msbLsb),
8251
+ channel_1_min: d.slice(8, 11).reduce(msbLsb)
8252
+ };
8253
+ }
8254
+ },
8255
+
8256
+ '506': {
8257
+ 'name': 'Custom SAP 3-Channel Current Monitor',
8258
+ parse: (d) => {
8259
+ return {
8260
+ channel_1_rms: d.slice(0, 3).reduce(msbLsb),
8261
+ channel_1_max: d.slice(4, 7).reduce(msbLsb),
8262
+ channel_1_min: d.slice(8, 11).reduce(msbLsb),
8263
+ channel_2_rms: d.slice(12, 15).reduce(msbLsb),
8264
+ channel_2_max: d.slice(16, 19).reduce(msbLsb),
8265
+ channel_2_min: d.slice(20, 23).reduce(msbLsb),
8266
+ channel_3_rms: d.slice(24, 27).reduce(msbLsb),
8267
+ channel_3_max: d.slice(28, 31).reduce(msbLsb),
8268
+ channel_3_min: d.slice(32, 35).reduce(msbLsb)
8269
+ };
8270
+ }
8271
+ },
8272
+
8273
+ '507': {
8274
+ 'name': 'Custom SAP 7-Channel Current Monitor',
8275
+ parse: (d) => {
8276
+ return {
8277
+ channel_1_rms: d.slice(0, 3).reduce(msbLsb),
8278
+ channel_1_max: d.slice(4, 7).reduce(msbLsb),
8279
+ channel_1_min: d.slice(8, 11).reduce(msbLsb),
8280
+ channel_2_rms: d.slice(12, 15).reduce(msbLsb),
8281
+ channel_2_max: d.slice(16, 19).reduce(msbLsb),
8282
+ channel_2_min: d.slice(20, 23).reduce(msbLsb),
8283
+ channel_3_rms: d.slice(24, 27).reduce(msbLsb),
8284
+ channel_3_max: d.slice(28, 31).reduce(msbLsb),
8285
+ channel_3_min: d.slice(32, 35).reduce(msbLsb),
8286
+ channel_4_rms: d.slice(36, 39).reduce(msbLsb),
8287
+ channel_4_max: d.slice(40, 43).reduce(msbLsb),
8288
+ channel_4_min: d.slice(44, 47).reduce(msbLsb),
8289
+ channel_5_rms: d.slice(48, 51).reduce(msbLsb),
8290
+ channel_5_max: d.slice(52, 55).reduce(msbLsb),
8291
+ channel_5_min: d.slice(56, 59).reduce(msbLsb),
8292
+ channel_6_rms: d.slice(60, 63).reduce(msbLsb),
8293
+ channel_6_max: d.slice(64, 67).reduce(msbLsb),
8294
+ channel_6_min: d.slice(68, 71).reduce(msbLsb),
8295
+ channel_7_rms: d.slice(72, 75).reduce(msbLsb),
8296
+ channel_7_max: d.slice(76, 79).reduce(msbLsb),
8297
+ channel_7_min: d.slice(80, 83).reduce(msbLsb)
8298
+
8299
+
8300
+
8301
+ };
8302
+ }
8303
+ },
8304
+ '510': {
8305
+ name: 'GreenLight',
8306
+ parse: (d) => {
8307
+ var adc = d.slice(0, 2).reduce(msbLsb);
8308
+ return {
8309
+ mA: adc /100.00
8310
+ };
5584
8311
  }
5585
8312
  },
5586
8313
  '515': {
@@ -6364,13 +9091,13 @@ function sensor_types(parent){
6364
9091
  name: 'Type 521 - 3 Channel Light Sensor',
6365
9092
  parse: (payload, parsed) => {
6366
9093
  return {
6367
- lux_1: payload.slice(0, 2).reduce(msbLsb)/100,
9094
+ lux_1: payload.slice(0, 2).reduce(msbLsb),
6368
9095
  temp_1: payload.slice(2, 4).reduce(msbLsb)/100,
6369
9096
  ext_temp_1: payload.slice(4, 6).reduce(msbLsb)/100,
6370
- lux_2: payload.slice(6, 8).reduce(msbLsb)/100,
9097
+ lux_2: payload.slice(6, 8).reduce(msbLsb),
6371
9098
  temp_2: payload.slice(8, 10).reduce(msbLsb)/100,
6372
9099
  ext_temp_2: payload.slice(10, 12).reduce(msbLsb)/100,
6373
- lux_3: payload.slice(12, 14).reduce(msbLsb)/100,
9100
+ lux_3: payload.slice(12, 14).reduce(msbLsb),
6374
9101
  temp_3: payload.slice(14, 16).reduce(msbLsb)/100,
6375
9102
  ext_temp_3: payload.slice(16, 18).reduce(msbLsb)/100
6376
9103
  }
@@ -7047,6 +9774,16 @@ function sensor_types(parent){
7047
9774
  };
7048
9775
  },
7049
9776
  },
9777
+ '540': {
9778
+ name: 'Wireless Ultrasonic Flow Meter FD-Q32C',
9779
+ parse: (d) => {
9780
+ return {
9781
+ raw_adc: d.slice(0, 2).reduce(msbLsb),
9782
+ ma: d.slice(2, 4).reduce(msbLsb) / 100,
9783
+ flow_ltr_min: d.slice(4, 8).reduce(msbLsb) / 100
9784
+ };
9785
+ }
9786
+ },
7050
9787
  '10000': {
7051
9788
  name: '4-Relay',
7052
9789
  parse: (d) => {