@ncd-io/node-red-enterprise-sensors 1.0.0 → 1.0.2

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.
@@ -142,7 +142,7 @@ module.exports = class WirelessSensor{
142
142
  }
143
143
  }
144
144
  // #OTF
145
- 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,106,107,108,110,111,112,114,180,181,519,520,521,531,535,537,539,540];
146
146
  var device_type = msbLsb(frame.data[6], frame.data[7]);
147
147
  // var device_type = frame.data[7];
148
148
 
@@ -294,7 +294,7 @@ module.exports = class WirelessSensor{
294
294
  };
295
295
 
296
296
  // #OTF
297
- 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];
297
+ var otf_devices = [23,26,39,45,48,52,76,78,79,80,81,82,84,88,89,90,91,101,102,105,106,107,108,110,111,112,114,180,181,519,520,521,531,535,537,539,540];
298
298
  if(otf_devices.includes(parsed.sensor_type)){
299
299
  // If the message says FLY and there is not FLY timer in progress.
300
300
  if(payload[8] == 70 && payload[9] == 76 && payload[10] == 89) {
@@ -1312,8 +1312,8 @@ module.exports = class WirelessSensor{
1312
1312
  console.log(packet);
1313
1313
  return this.config_send(sensor_mac, packet);
1314
1314
  }
1315
- config_set_rs_node_id_539(sensor_mac, value){
1316
- console.log('config_set_rs_node_id_539');
1315
+ config_set_sub_device_type_539(sensor_mac, value){
1316
+ console.log('config_set_sub_device_type_539');
1317
1317
  var packet = [244, 40, 0, 0, 23, value];
1318
1318
  console.log(packet);
1319
1319
  return this.config_send(sensor_mac, packet);
@@ -1326,12 +1326,58 @@ module.exports = class WirelessSensor{
1326
1326
  }
1327
1327
  config_set_reg_539(sensor_mac, value, register){
1328
1328
  console.log('config_set_reg_539');
1329
+ // var packet = [244, 51, 0, 0, 23, ]
1329
1330
  var packet = [244, 30 + register, 0, 0, 23];
1330
1331
  let value_reg = int2Bytes((value), 2);
1331
1332
  packet.push(...value_reg);
1332
1333
  console.log(packet);
1333
1334
  return this.config_send(sensor_mac, packet);
1334
1335
  }
1336
+ config_set_all_register_data_539(sensor_mac, number_of_registers, registers){
1337
+ console.log('config_set_all_registers_539');
1338
+ // registers is an arbitrary number of 16 bit integers
1339
+ // var packet = [244, 53, 0, 0, 23, number_of_registers, registers.slice(0,2)...]
1340
+ var packet = [244, 53, 0, 0, 23, number_of_registers];
1341
+ for(let ind = 0; ind < number_of_registers; ind++){
1342
+ packet.push(...int2Bytes(registers[ind], 2));
1343
+ }
1344
+ console.log(packet);
1345
+ return this.config_send(sensor_mac, packet);
1346
+ }
1347
+ config_set_auto_raw_interval_110(sensor_mac, value){
1348
+ console.log('config_set_raw_interval_110');
1349
+ var packet = [244, 79, 0, 0, 80, 76, value];
1350
+ console.log(packet);
1351
+ return this.config_send(sensor_mac, packet);
1352
+ }
1353
+ config_set_auto_raw_destination_110(sensor_mac, value){
1354
+ console.log('config_set_auto_raw_destination_110');
1355
+ var packet = [244, 79, 0, 0, 80, 72];
1356
+ let value_dest = int2Bytes((value), 4);
1357
+ packet.push(...value_dest);
1358
+ console.log(packet);
1359
+ return this.config_send(sensor_mac, packet);
1360
+ }
1361
+ config_set_clear_probe_uptimers_110(sensor_mac, value){
1362
+ console.log('config_set_clear_probe_uptimers_110');
1363
+ var packet = [244, 79, 0, 0, 80, value];
1364
+ console.log(packet);
1365
+ return this.config_send(sensor_mac, packet);
1366
+ }
1367
+ config_set_smart_interval_110(sensor_mac, value){
1368
+ console.log('config_set_smart_interval_110');
1369
+ var packet = [244, 79, 0, 0, 101, 76, value];
1370
+ console.log(packet);
1371
+ return this.config_send(sensor_mac, packet);
1372
+ }
1373
+ config_set_smart_threshold_110(sensor_mac, value){
1374
+ console.log('config_set_smart_threshold_110');
1375
+ var packet = [244, 79, 0, 0, 101];
1376
+ let value_th = int2Bytes((value), 2);
1377
+ packet.push(...value_th);
1378
+ console.log(packet);
1379
+ return this.config_send(sensor_mac, packet);
1380
+ }
1335
1381
  config_get_delay(sensor_mac){
1336
1382
  return new Promise((fulfill, reject) => {
1337
1383
  this.config_send(sensor_mac, [247, 21, 0, 0, 0]).then((res) => {
@@ -2506,7 +2552,7 @@ function sensor_types(parent){
2506
2552
  name: 'ORP and Temperature Sensor',
2507
2553
  parse: (d) => {
2508
2554
  return {
2509
- ORP: signInt(d.slice(0, 2).reduce(msbLsb), 16) / 100,
2555
+ ORP: signInt(d.slice(0, 2).reduce(msbLsb), 16),
2510
2556
  Temp: signInt(d.slice(2, 4).reduce(msbLsb),16) / 100
2511
2557
  };
2512
2558
  }
@@ -2515,7 +2561,7 @@ function sensor_types(parent){
2515
2561
  name: 'ORP, pH and Temperature Sensor',
2516
2562
  parse: (d) => {
2517
2563
  return {
2518
- ORP: signInt(d.slice(0, 2).reduce(msbLsb), 16) / 100,
2564
+ ORP: signInt(d.slice(0, 2).reduce(msbLsb), 16),
2519
2565
  Temp: signInt(d.slice(2, 4).reduce(msbLsb),16) / 100,
2520
2566
  pH: signInt(d.slice(4, 6).reduce(msbLsb), 16) / 100,
2521
2567
  Temp: signInt(d.slice(6, 8).reduce(msbLsb),16) / 100
@@ -2623,96 +2669,2880 @@ function sensor_types(parent){
2623
2669
  };
2624
2670
  }
2625
2671
  },
2626
- '76': {
2627
- name: 'Wireless CO Sensor',
2672
+ '76': {
2673
+ name: 'Wireless CO Sensor',
2674
+ parse: (d) => {
2675
+ return {
2676
+ humidity: msbLsb(d[0], d[1])/100,
2677
+ temperature: signInt((msbLsb(d[2], d[3])), 16)/100,
2678
+ co_ppm: msbLsb(d[4], d[5])
2679
+ };
2680
+ }
2681
+ },
2682
+ '77': {
2683
+ name: '3 Channel SDI-12 Wireelss',
2684
+ parse: (d) => {
2685
+ return {
2686
+ Temperature_1: signInt(d.slice(0, 2).reduce(msbLsb), 16)/100,
2687
+ Soil_Moisture_1: signInt(d.slice(2, 4).reduce(msbLsb), 16)/100,
2688
+ Bulk_EC_1: signInt(d.slice(4, 6).reduce(msbLsb), 16),
2689
+ Pore_EC_1: signInt(d.slice(6, 8).reduce(msbLsb), 16),
2690
+ Permittivity_1: signInt(d.slice(8, 10).reduce(msbLsb), 16)/100,
2691
+ Temperature_2: signInt(d.slice(10, 12).reduce(msbLsb), 16)/100,
2692
+ Soil_Moisture_2: signInt(d.slice(12, 14).reduce(msbLsb), 16)/100,
2693
+ Bulk_EC_2: signInt(d.slice(14, 16).reduce(msbLsb), 16),
2694
+ Pore_EC_2: signInt(d.slice(16, 18).reduce(msbLsb), 16),
2695
+ Permittivity_2: signInt(d.slice(18, 20).reduce(msbLsb), 16)/100,
2696
+ Temperature_3: signInt(d.slice(20, 22).reduce(msbLsb), 16)/100,
2697
+ Soil_Moisture_3: signInt(d.slice(22, 24).reduce(msbLsb), 16)/100,
2698
+ Bulk_EC_3: signInt(d.slice(24, 26).reduce(msbLsb), 16),
2699
+ Pore_EC_3: signInt(d.slice(26, 28).reduce(msbLsb), 16),
2700
+ Permittivity_3: signInt(d.slice(28, 30).reduce(msbLsb), 16)/100
2701
+ };
2702
+ }
2703
+ },
2704
+ '78': {
2705
+ name: 'Oil Particulate Counter Sensor',
2706
+ parse: (d, original_payload) => {
2707
+ if(original_payload[1] <= 3){
2708
+ return {
2709
+ ferro_particles_30_50_um: d.slice(0, 4).reduce(msbLsb)/100,
2710
+ ferro_particles_50_100_um: d.slice(4, 8).reduce(msbLsb)/100,
2711
+ ferro_particles_100_200_um: d.slice(8, 12).reduce(msbLsb)/100,
2712
+ ferro_particles_200_400_um: d.slice(12, 16).reduce(msbLsb)/100,
2713
+ ferro_particles_400_800_um: d.slice(16, 20).reduce(msbLsb)/100,
2714
+ ferro_particles_gt_800_um: d.slice(20, 24).reduce(msbLsb)/100,
2715
+ ferro_particles_total: d.slice(24, 28).reduce(msbLsb)/100,
2716
+ non_ferro_particles_120_200_um: d.slice(28, 32).reduce(msbLsb)/100,
2717
+ non_ferro_particles_200_400_um: d.slice(32, 36).reduce(msbLsb)/100,
2718
+ non_ferro_particles_400_800_um: d.slice(36, 40).reduce(msbLsb)/100
2719
+ };
2720
+ }else{
2721
+ return {
2722
+ ferro_particles_30_50_um: d.slice(0, 4).reduce(msbLsb)/100,
2723
+ ferro_particles_50_100_um: d.slice(4, 8).reduce(msbLsb)/100,
2724
+ ferro_particles_100_200_um: d.slice(8, 12).reduce(msbLsb)/100,
2725
+ ferro_particles_200_400_um: d.slice(12, 16).reduce(msbLsb)/100,
2726
+ ferro_particles_400_800_um: d.slice(16, 20).reduce(msbLsb)/100,
2727
+ ferro_particles_gt_800_um: d.slice(20, 24).reduce(msbLsb)/100,
2728
+ ferro_particles_total: d.slice(24, 28).reduce(msbLsb)/100,
2729
+ non_ferro_particles_120_200_um: d.slice(28, 32).reduce(msbLsb)/100,
2730
+ non_ferro_particles_200_400_um: d.slice(32, 36).reduce(msbLsb)/100,
2731
+ non_ferro_particles_400_800_um: d.slice(36, 40).reduce(msbLsb)/100,
2732
+ non_ferro_particles_800_1600_um: d.slice(40, 44).reduce(msbLsb)/100,
2733
+ non_ferro_particles_gt_1600_um: d.slice(44, 48).reduce(msbLsb)/100,
2734
+ non_ferro_particles_total: d.slice(48, 52).reduce(msbLsb)/100,
2735
+ ferro_particles_total_24h: d.slice(52, 56).reduce(msbLsb)/100,
2736
+ non_ferro_particles_total_24h: d.slice(56, 60).reduce(msbLsb)/100,
2737
+ ferro_concentration: d.slice(60, 64).reduce(msbLsb)/100,
2738
+ non_ferro_concentration: d.slice(64, 68).reduce(msbLsb)/100,
2739
+ flow: d.slice(68, 72).reduce(msbLsb)/100,
2740
+ };
2741
+ }
2742
+ }
2743
+ },
2744
+ '79': {
2745
+ name: 'Oil Analysis Sensor',
2746
+ parse: (d) => {
2747
+ return {
2748
+ dynamic_viscosity: signInt(d.slice(0, 4).reduce(msbLsb), 32) / 100,
2749
+ density: signInt(d.slice(4, 8).reduce(msbLsb), 32) / 100,
2750
+ dialectric_constant: signInt(d.slice(8, 12).reduce(msbLsb), 32) / 100,
2751
+ temperature: signInt(d.slice(12, 16).reduce(msbLsb), 32) / 100,
2752
+ saturability: signInt(d.slice(16, 20).reduce(msbLsb), 32) / 100,
2753
+ moisture_content: signInt(d.slice(20, 24).reduce(msbLsb), 32) / 100,
2754
+ water_content: signInt(d.slice(24, 28).reduce(msbLsb), 32) / 100,
2755
+ kinematic_viscosity_40c: signInt(d.slice(28, 32).reduce(msbLsb), 32) / 100,
2756
+ kinematic_viscosity_100c: signInt(d.slice(32, 36).reduce(msbLsb), 32) / 100
2757
+ };
2758
+ }
2759
+ },
2760
+ '80': {
2761
+ name: 'One Channel Vibration Plus',
2762
+ parse: (payload, parsed, mac) => {
2763
+ if(payload[7] >> 1 != 0){
2764
+ console.log('Error found');
2765
+ parsed.data = {error: 'Error found, Sensor Probe may be unattached'};
2766
+ return parsed;
2767
+ }
2768
+
2769
+ if(payload[8] === 1){
2770
+ var deviceAddr = mac;
2771
+ var firmware = payload[1];
2772
+ var hour = payload[11];
2773
+ var minute = payload[12];
2774
+ var expected_packets = payload[15];
2775
+ var current_packet = payload[16];
2776
+ var sdata_start = 17;
2777
+
2778
+ if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
2779
+ if(expected_packets != 1){
2780
+ // 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
2781
+ if(current_packet in globalDevices[deviceAddr].data || current_packet == 1 || !(((current_packet&127)-1) in globalDevices[deviceAddr].data)) {
2782
+ console.log('-----');
2783
+ console.log('bad packet breakdown deleting stream');
2784
+ console.log(current_packet);
2785
+ console.log(expected_packets);
2786
+ console.log(current_packet in globalDevices[deviceAddr].data);
2787
+ console.log(current_packet == 1);
2788
+ console.log(!((current_packet-1) in globalDevices[deviceAddr].data));
2789
+ if(this.hasOwnProperty('failure_no')){
2790
+ this.failure_no = this.failure_no + 1;
2791
+ }
2792
+ else{
2793
+ this.failure_no = 1;
2794
+ }
2795
+ if(this.hasOwnProperty('failure_no')){
2796
+ console.log('####falure no');
2797
+ console.log(this.failure_no);
2798
+ }
2799
+ // console.log(globalDevices[deviceAddr].data);
2800
+ delete globalDevices[deviceAddr];
2801
+ if(current_packet != 1){
2802
+ return;
2803
+ } else{
2804
+
2805
+ var mode = payload[8];
2806
+ var odr = payload[9];
2807
+ var en_axis = payload[10] & 7;
2808
+ var fsr = payload[10] >> 5;
2809
+ var device_temp = msbLsb(payload[13], payload[14])/100;
2810
+
2811
+
2812
+ switch(odr){
2813
+ case 6:
2814
+ odr = 50;
2815
+ break;
2816
+ case 7:
2817
+ odr = 100;
2818
+ break;
2819
+ case 8:
2820
+ odr = 200;
2821
+ break;
2822
+ case 9:
2823
+ odr = 400;
2824
+ break;
2825
+ case 10:
2826
+ odr = 800;
2827
+ break;
2828
+ case 11:
2829
+ odr = 1600;
2830
+ break;
2831
+ case 12:
2832
+ odr = 3200;
2833
+ break;
2834
+ case 13:
2835
+ odr = 6400;
2836
+ break;
2837
+ case 14:
2838
+ odr = 12800;
2839
+ break;
2840
+ case 15:
2841
+ odr = 25600;
2842
+ break;
2843
+ default:
2844
+ odr = 0;
2845
+ }
2846
+
2847
+ globalDevices[deviceAddr] = {
2848
+ // stream_size: expected_packets,
2849
+ data: {},
2850
+ odr: odr,
2851
+ mo: mode,
2852
+ en_axis: en_axis,
2853
+ fsr: fsr,
2854
+ hour: hour,
2855
+ minute: minute,
2856
+ device_temp: device_temp,
2857
+ }
2858
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
2859
+ return;
2860
+ }
2861
+ }
2862
+ else{
2863
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
2864
+ }
2865
+ }
2866
+ else{
2867
+ var mode = payload[8];
2868
+ var odr = payload[9];
2869
+ var en_axis = payload[10] & 7;
2870
+ var fsr = payload[10] >> 5;
2871
+ var device_temp = msbLsb(payload[13], payload[14])/100;
2872
+
2873
+
2874
+ switch(odr){
2875
+ case 6:
2876
+ odr = 50;
2877
+ break;
2878
+ case 7:
2879
+ odr = 100;
2880
+ break;
2881
+ case 8:
2882
+ odr = 200;
2883
+ break;
2884
+ case 9:
2885
+ odr = 400;
2886
+ break;
2887
+ case 10:
2888
+ odr = 800;
2889
+ break;
2890
+ case 11:
2891
+ odr = 1600;
2892
+ break;
2893
+ case 12:
2894
+ odr = 3200;
2895
+ break;
2896
+ case 13:
2897
+ odr = 6400;
2898
+ break;
2899
+ case 14:
2900
+ odr = 12800;
2901
+ break;
2902
+ case 15:
2903
+ odr = 25600;
2904
+ break;
2905
+ default:
2906
+ odr = 0;
2907
+ }
2908
+
2909
+ globalDevices[deviceAddr] = {
2910
+ // stream_size: expected_packets,
2911
+ data: {},
2912
+ odr: odr,
2913
+ mo: mode,
2914
+ en_axis: en_axis,
2915
+ fsr: fsr,
2916
+ hour: hour,
2917
+ minute: minute,
2918
+ device_temp: device_temp,
2919
+ }
2920
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
2921
+ }
2922
+
2923
+ if(Object.keys(globalDevices[deviceAddr].data).length == expected_packets){
2924
+ var raw_data = new Array();
2925
+ for(const packet in globalDevices[deviceAddr].data){
2926
+ raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
2927
+ }
2928
+ var label = 0;
2929
+
2930
+ var fft = new Array();
2931
+ var fft_concat = {};
2932
+
2933
+ var en_axis_data = {};
2934
+ switch (globalDevices[deviceAddr].en_axis){
2935
+ case 1:
2936
+ en_axis_data.x_offset = 0;
2937
+ en_axis_data.increment = 2;
2938
+ break;
2939
+ case 2:
2940
+ en_axis_data.y_offset = 0;
2941
+ en_axis_data.increment = 2;
2942
+ break;
2943
+ case 3:
2944
+ en_axis_data.x_offset = 0;
2945
+ en_axis_data.y_offset = 2;
2946
+ en_axis_data.increment = 4;
2947
+ break;
2948
+ case 4:
2949
+ en_axis_data.z_offset = 0;
2950
+ en_axis_data.increment = 2;
2951
+ break;
2952
+ case 5:
2953
+ en_axis_data.x_offset = 0;
2954
+ en_axis_data.z_offset = 2;
2955
+ en_axis_data.increment = 4;
2956
+ break;
2957
+ case 6:
2958
+ en_axis_data.y_offset = 0;
2959
+ en_axis_data.z_offset = 2;
2960
+ en_axis_data.increment = 4;
2961
+ break;
2962
+ case 7:
2963
+ en_axis_data.x_offset = 0;
2964
+ en_axis_data.y_offset = 2;
2965
+ en_axis_data.z_offset = 4;
2966
+ en_axis_data.increment = 6;
2967
+ break;
2968
+ default:
2969
+ en_axis_data.increment = 0;
2970
+ }
2971
+
2972
+ var fsr_mult = .00006;
2973
+ var fsr_text = "";
2974
+ switch(globalDevices[deviceAddr].fsr){
2975
+ case 0:
2976
+ fsr_mult = 0.00006;
2977
+ break;
2978
+ case 1:
2979
+ fsr_mult = 0.00012;
2980
+ break;
2981
+ case 2:
2982
+ fsr_mult = 0.00024;
2983
+ break;
2984
+ case 3:
2985
+ fsr_mult = 0.00049;
2986
+ break;
2987
+ }
2988
+ switch(globalDevices[deviceAddr].fsr){
2989
+ case 0:
2990
+ fsr_text = "2g";
2991
+ break;
2992
+ case 1:
2993
+ fsr_text = "4g";
2994
+ break;
2995
+ case 2:
2996
+ fsr_text = "8g";
2997
+ break;
2998
+ case 3:
2999
+ fsr_text = "16g";
3000
+ break;
3001
+ }
3002
+
3003
+ for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
3004
+ label++;
3005
+
3006
+ fft_concat[label] = {};
3007
+
3008
+ if('x_offset' in en_axis_data){
3009
+ 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));
3010
+ }
3011
+ if('y_offset' in en_axis_data){
3012
+ 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));
3013
+ }
3014
+ if('z_offset' in en_axis_data){
3015
+ 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));
3016
+ }
3017
+ }
3018
+ var fft_concat_obj = {
3019
+ time_id: globalDevices[deviceAddr].hour +':'+ globalDevices[deviceAddr].minute,
3020
+ mac_address: deviceAddr,
3021
+ en_axis: globalDevices[deviceAddr].en_axis,
3022
+ fsr: fsr_text,
3023
+ odr: globalDevices[deviceAddr].odr,
3024
+ device_temp: globalDevices[deviceAddr].device_temp,
3025
+ data: fft_concat
3026
+ };
3027
+ sensor_data = fft_concat_obj;
3028
+ delete globalDevices[deviceAddr];
3029
+ if(this.hasOwnProperty('failure_no')){
3030
+ console.log('####falure no');
3031
+ console.log(this.failure_no);
3032
+ }
3033
+
3034
+ return sensor_data;
3035
+ }
3036
+ else{
3037
+ return;
3038
+ }
3039
+ }else{
3040
+
3041
+ var mode = payload[8];
3042
+ var odr = payload[9];
3043
+ var en_axis = payload[10] & 7;
3044
+ var fsr = payload[10] >> 5;
3045
+ var device_temp = msbLsb(payload[13], payload[14])/100;
3046
+
3047
+
3048
+ switch(odr){
3049
+ case 6:
3050
+ odr = 50;
3051
+ break;
3052
+ case 7:
3053
+ odr = 100;
3054
+ break;
3055
+ case 8:
3056
+ odr = 200;
3057
+ break;
3058
+ case 9:
3059
+ odr = 400;
3060
+ break;
3061
+ case 10:
3062
+ odr = 800;
3063
+ break;
3064
+ case 11:
3065
+ odr = 1600;
3066
+ break;
3067
+ case 12:
3068
+ odr = 3200;
3069
+ break;
3070
+ case 13:
3071
+ odr = 6400;
3072
+ break;
3073
+ case 14:
3074
+ odr = 12800;
3075
+ break;
3076
+ case 15:
3077
+ odr = 25600;
3078
+ break;
3079
+ default:
3080
+ odr = 0;
3081
+ }
3082
+
3083
+ globalDevices[deviceAddr] = {
3084
+ // stream_size: expected_packets,
3085
+ data: {},
3086
+ odr: odr,
3087
+ mo: mode,
3088
+ en_axis: en_axis,
3089
+ fsr: fsr,
3090
+ hour: hour,
3091
+ minute: minute,
3092
+ device_temp: device_temp,
3093
+ }
3094
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
3095
+ return;
3096
+ }
3097
+ }
3098
+ else if(payload[8] === 0 || payload[8] === 2){
3099
+ // mode byte most significant bit will indicate fft data.
3100
+ // console.log(d);
3101
+ var odr;
3102
+ switch(payload[9]){
3103
+ case 6:
3104
+ odr = "50Hz"
3105
+ break;
3106
+ case 7:
3107
+ odr = "100Hz";
3108
+ break;
3109
+ case 8:
3110
+ odr = "200Hz";
3111
+ break;
3112
+ case 9:
3113
+ odr = "400Hz";
3114
+ break;
3115
+ case 10:
3116
+ odr = "800Hz";
3117
+ break;
3118
+ case 11:
3119
+ odr = "1600Hz";
3120
+ break;
3121
+ case 12:
3122
+ odr = "3200Hz";
3123
+ break;
3124
+ case 13:
3125
+ odr = "6400Hz";
3126
+ break;
3127
+ case 14:
3128
+ odr = "12800Hz";
3129
+ break;
3130
+ case 15:
3131
+ odr = "25600Hz";
3132
+ break;
3133
+ }
3134
+ return {
3135
+ mode: payload[8],
3136
+
3137
+ odr: odr,
3138
+ temperature: signInt(payload.slice(10, 12).reduce(msbLsb), 16) / 100,
3139
+
3140
+ x_rms_ACC_G: payload.slice(12, 14).reduce(msbLsb)/1000,
3141
+ x_max_ACC_G: payload.slice(14, 16).reduce(msbLsb)/1000,
3142
+ x_velocity_mm_sec: payload.slice(16, 18).reduce(msbLsb) / 100,
3143
+ x_displacement_mm: payload.slice(18, 20).reduce(msbLsb) / 100,
3144
+ x_peak_one_Hz: payload.slice(20, 22).reduce(msbLsb),
3145
+ x_peak_two_Hz: payload.slice(22, 24).reduce(msbLsb),
3146
+ x_peak_three_Hz: payload.slice(24, 26).reduce(msbLsb),
3147
+
3148
+ y_rms_ACC_G: payload.slice(26, 28).reduce(msbLsb)/1000,
3149
+ y_max_ACC_G: payload.slice(28, 30).reduce(msbLsb)/1000,
3150
+ y_velocity_mm_sec: payload.slice(30, 32).reduce(msbLsb) / 100,
3151
+ y_displacement_mm: payload.slice(32, 34).reduce(msbLsb) / 100,
3152
+ y_peak_one_Hz: payload.slice(34, 36).reduce(msbLsb),
3153
+ y_peak_two_Hz: payload.slice(36, 38).reduce(msbLsb),
3154
+ y_peak_three_Hz: payload.slice(38, 40).reduce(msbLsb),
3155
+
3156
+ z_rms_ACC_G: payload.slice(40, 42).reduce(msbLsb)/1000,
3157
+ z_max_ACC_G: payload.slice(42, 44).reduce(msbLsb)/1000,
3158
+ z_velocity_mm_sec: payload.slice(44, 46).reduce(msbLsb) / 100,
3159
+ z_displacement_mm: payload.slice(46, 48).reduce(msbLsb) / 100,
3160
+ z_peak_one_Hz: payload.slice(48, 50).reduce(msbLsb),
3161
+ z_peak_two_Hz: payload.slice(50, 52).reduce(msbLsb),
3162
+ z_peak_three_Hz: payload.slice(52, 54).reduce(msbLsb),
3163
+ };
3164
+ }
3165
+ // else{
3166
+ // parsed.data = {'error': 'Vibration mode error'}
3167
+ // return parsed;
3168
+ // }
3169
+ },
3170
+ 'parse_fly': (frame) => {
3171
+ let frame_data = {};
3172
+ switch(frame[16]){
3173
+ case 0:
3174
+ frame_data.mode = "Processed";
3175
+ break;
3176
+ case 1:
3177
+ frame_data.mode = "Raw";
3178
+ break;
3179
+ case 2:
3180
+ frame_data.mode = "Processed + Raw on demand";
3181
+ break;
3182
+ }
3183
+ switch(frame[17]){
3184
+ case 6:
3185
+ frame_data.odr_1 = 50;
3186
+ break;
3187
+ case 7:
3188
+ frame_data.odr_1 = 100;
3189
+ break;
3190
+ case 8:
3191
+ frame_data.odr_1 = 200;
3192
+ break;
3193
+ case 9:
3194
+ frame_data.odr_1 = 400;
3195
+ break;
3196
+ case 10:
3197
+ frame_data.odr_1 = 800;
3198
+ break;
3199
+ case 11:
3200
+ frame_data.odr_1 = 1600;
3201
+ break;
3202
+ case 12:
3203
+ frame_data.odr_1 = 3200;
3204
+ break;
3205
+ case 13:
3206
+ frame_data.odr_1 = 6400;
3207
+ break;
3208
+ case 14:
3209
+ frame_data.odr_1 = 12800;
3210
+ break;
3211
+ case 15:
3212
+ frame_data.odr_1 = 25600;
3213
+ break;
3214
+ }
3215
+ frame_data.sampling_duration_1 = frame[19]*50 + "ms";
3216
+ switch(frame[21]){
3217
+ case 0:
3218
+ frame_data.filter_status = "Disabled";
3219
+ break;
3220
+ case 1:
3221
+ frame_data.filter_status = "Enabled";
3222
+ break;
3223
+ }
3224
+ switch(frame[22]){
3225
+ case 0:
3226
+ frame_data.lpf_coeff_1 = 4;
3227
+ break;
3228
+ case 1:
3229
+ frame_data.lpf_coeff_1 = 8;
3230
+ break;
3231
+ case 2:
3232
+ frame_data.lpf_coeff_1 = 16;
3233
+ break;
3234
+ case 2:
3235
+ frame_data.lpf_coeff_1 = 32;
3236
+ break;
3237
+ case 4:
3238
+ frame_data.lpf_coeff_1 = 64;
3239
+ break;
3240
+ case 5:
3241
+ frame_data.lpf_coeff_1 = 128;
3242
+ break;
3243
+ case 6:
3244
+ frame_data.lpf_coeff_1 = 256;
3245
+ break;
3246
+ case 7:
3247
+ frame_data.lpf_coeff_1 = 512;
3248
+ break;
3249
+ case 8:
3250
+ frame_data.lpf_coeff_1 = 1024;
3251
+ break;
3252
+ case 9:
3253
+ frame_data.lpf_coeff_1 = 2048;
3254
+ break;
3255
+ }
3256
+ frame_data.lpf_freq_1 = frame_data.odr_1 / frame_data.lpf_coeff_1;
3257
+ switch(frame[24]){
3258
+ case 0:
3259
+ frame_data.hpf_coeff_1 = 4;
3260
+ break;
3261
+ case 1:
3262
+ frame_data.hpf_coeff_1 = 8;
3263
+ break;
3264
+ case 2:
3265
+ frame_data.hpf_coeff_1 = 16;
3266
+ break;
3267
+ case 2:
3268
+ frame_data.hpf_coeff_1 = 32;
3269
+ break;
3270
+ case 4:
3271
+ frame_data.hpf_coeff_1 = 64;
3272
+ break;
3273
+ case 5:
3274
+ frame_data.hpf_coeff_1 = 128;
3275
+ break;
3276
+ case 6:
3277
+ frame_data.hpf_coeff_1 = 256;
3278
+ break;
3279
+ case 7:
3280
+ frame_data.hpf_coeff_1 = 512;
3281
+ break;
3282
+ case 8:
3283
+ frame_data.hpf_coeff_1 = 1024;
3284
+ break;
3285
+ case 9:
3286
+ frame_data.hpf_coeff_1 = 2048;
3287
+ break;
3288
+ }
3289
+ frame_data.hpf_freq_1 = frame_data.odr_1 / frame_data.hpf_coeff_1;
3290
+ switch(frame[26]){
3291
+ case 0:
3292
+ frame_data.sampling_interval = "5 Minutes";
3293
+ break;
3294
+ case 1:
3295
+ frame_data.sampling_interval = "10 Minutes";
3296
+ break;
3297
+ case 2:
3298
+ frame_data.sampling_interval = "15 Minutes";
3299
+ break;
3300
+ case 2:
3301
+ frame_data.sampling_interval = "20 Minutes";
3302
+ break;
3303
+ case 4:
3304
+ frame_data.sampling_interval = "30 Minutes";
3305
+ break;
3306
+ case 5:
3307
+ frame_data.sampling_interval = "60 Minutes";
3308
+ break;
3309
+ case 6:
3310
+ frame_data.sampling_interval = "120 Minutes";
3311
+ break;
3312
+ case 7:
3313
+ frame_data.sampling_interval = "180 Minutes";
3314
+ break;
3315
+ case 8:
3316
+ frame_data.sampling_interval = "1 Minute";
3317
+ break;
3318
+ }
3319
+ frame_data.on_request_timeout = frame[27] + " Seconds";
3320
+ frame_data.deadband = frame[28] + "mg";
3321
+
3322
+ switch(frame[29]){
3323
+ case 0:
3324
+ frame_data.payload_length = "50 Bytes";
3325
+ break;
3326
+ case 1:
3327
+ frame_data.payload_length = "100 Bytes";
3328
+ break;
3329
+ case 2:
3330
+ frame_data.payload_length = "150 Bytes";
3331
+ break;
3332
+ case 3:
3333
+ frame_data.payload_length = "180 Bytes";
3334
+ break;
3335
+ }
3336
+
3337
+ return {
3338
+ 'firmware': frame[2],
3339
+ 'destination_address': toMac(frame.slice(12, 16)),
3340
+ 'mode': frame_data.mode,
3341
+ 'odr_1': frame_data.odr_1+'Hz',
3342
+ 'sampling_duration_1': frame_data.sampling_duration_1,
3343
+ 'sampling_duration_2': frame_data.sampling_duration_2,
3344
+ 'filter_status': frame_data.filter_status,
3345
+ 'lpf_coeff_1': frame_data.lpf_coeff_1,
3346
+ 'lpf_freq_1': frame_data.lpf_freq_1+'Hz',
3347
+ 'hpf_coeff_1': frame_data.hpf_coeff_1,
3348
+ 'hpf_freq_1': frame_data.hpf_freq_1+'Hz',
3349
+ 'sampling_interval': frame_data.sampling_interval,
3350
+ 'on_request_timeout': frame_data.on_request_timeout,
3351
+ 'deadband': frame_data.deadband,
3352
+ 'payload_length': frame_data.payload_length,
3353
+ 'machine_values': {
3354
+ 'firmware': frame[2],
3355
+ 'destination_address': toMac(frame.slice(12, 16), false),
3356
+ 'mode': frame[16],
3357
+ 'odr_1': frame[17],
3358
+ 'sampling_duration_1': frame[19],
3359
+ 'sampling_duration_2': frame[20],
3360
+ 'filter_status': frame[21],
3361
+ 'lpf_coeff_1': frame[22],
3362
+ 'hpf_coeff_1': frame[24],
3363
+ 'sampling_interval': frame[26],
3364
+ 'on_request_timeout': frame[27],
3365
+ 'deadband': frame[28],
3366
+ 'payload_length': frame[29]
3367
+ }
3368
+ }
3369
+ }
3370
+ },
3371
+ '81': {
3372
+ name: 'Two Channel Vibration Plus',
3373
+ parse: (payload, parsed, mac) => {
3374
+ parsed.data = {};
3375
+ if(payload[7] & 2){
3376
+ parsed.data['probe_1_error'] = true;
3377
+ }
3378
+ if(payload[7] & 4){
3379
+ parsed.data['probe_2_error'] = true;
3380
+ }
3381
+ if(payload[7] & 2 && payload[7] & 4){
3382
+ return parsed;
3383
+ }
3384
+
3385
+ if(payload[8] === 1){
3386
+ var deviceAddr = mac;
3387
+ var firmware = payload[1];
3388
+ var hour = payload[11];
3389
+ var minute = payload[12];
3390
+ var expected_packets = payload[15];
3391
+ var current_packet = payload[16];
3392
+ var sdata_start = 17;
3393
+
3394
+ if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
3395
+ if(expected_packets != 1){
3396
+ // 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
3397
+ if(current_packet in globalDevices[deviceAddr].data || current_packet == 1 || !((current_packet-1) in globalDevices[deviceAddr].data)) {
3398
+ console.log('-----');
3399
+ console.log('bad packet breakdown deleting stream');
3400
+ console.log(current_packet);
3401
+ console.log(expected_packets);
3402
+ console.log(current_packet in globalDevices[deviceAddr].data);
3403
+ console.log(current_packet == 1);
3404
+ console.log(!((current_packet-1) in globalDevices[deviceAddr].data));
3405
+ if(this.hasOwnProperty('failure_no')){
3406
+ this.failure_no = this.failure_no + 1;
3407
+ }
3408
+ else{
3409
+ this.failure_no = 1;
3410
+ }
3411
+ if(this.hasOwnProperty('failure_no')){
3412
+ console.log('####falure no');
3413
+ console.log(this.failure_no);
3414
+ }
3415
+ // console.log(globalDevices[deviceAddr].data);
3416
+ delete globalDevices[deviceAddr];
3417
+ if(current_packet != 1){
3418
+ return;
3419
+ } else{
3420
+ var mode = payload[8];
3421
+ var odr = payload[9];
3422
+ var en_axis = payload[10] & 7;
3423
+ var fsr = payload[10] >> 5;
3424
+ var device_temp = msbLsb(payload[13], payload[14])/100;
3425
+
3426
+ switch(odr){
3427
+ case 6:
3428
+ odr = 50;
3429
+ break;
3430
+ case 7:
3431
+ odr = 100;
3432
+ break;
3433
+ case 8:
3434
+ odr = 200;
3435
+ break;
3436
+ case 9:
3437
+ odr = 400;
3438
+ break;
3439
+ case 10:
3440
+ odr = 800;
3441
+ break;
3442
+ case 11:
3443
+ odr = 1600;
3444
+ break;
3445
+ case 12:
3446
+ odr = 3200;
3447
+ break;
3448
+ case 13:
3449
+ odr = 6400;
3450
+ break;
3451
+ case 14:
3452
+ odr = 12800;
3453
+ break;
3454
+ case 15:
3455
+ odr = 25600;
3456
+ break;
3457
+ default:
3458
+ odr = 0;
3459
+ }
3460
+
3461
+ globalDevices[deviceAddr] = {
3462
+ // stream_size: expected_packets,
3463
+ data: {},
3464
+ odr: odr,
3465
+ mo: mode,
3466
+ en_axis: en_axis,
3467
+ fsr: fsr,
3468
+ hour: hour,
3469
+ minute: minute,
3470
+ device_temp: device_temp,
3471
+ }
3472
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
3473
+ return;
3474
+ }
3475
+ }
3476
+ else{
3477
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
3478
+ }
3479
+ }
3480
+ else{
3481
+ var mode = payload[8];
3482
+ var odr = payload[9];
3483
+ var en_axis = payload[10] & 7;
3484
+ var fsr = payload[10] >> 5;
3485
+ var device_temp = msbLsb(payload[13], payload[14])/100;
3486
+
3487
+
3488
+ switch(odr){
3489
+ case 6:
3490
+ odr = 50;
3491
+ break;
3492
+ case 7:
3493
+ odr = 100;
3494
+ break;
3495
+ case 8:
3496
+ odr = 200;
3497
+ break;
3498
+ case 9:
3499
+ odr = 400;
3500
+ break;
3501
+ case 10:
3502
+ odr = 800;
3503
+ break;
3504
+ case 11:
3505
+ odr = 1600;
3506
+ break;
3507
+ case 12:
3508
+ odr = 3200;
3509
+ break;
3510
+ case 13:
3511
+ odr = 6400;
3512
+ break;
3513
+ case 14:
3514
+ odr = 12800;
3515
+ break;
3516
+ case 15:
3517
+ odr = 25600;
3518
+ break;
3519
+ default:
3520
+ odr = 0;
3521
+ }
3522
+
3523
+ globalDevices[deviceAddr] = {
3524
+ // stream_size: expected_packets,
3525
+ data: {},
3526
+ odr: odr,
3527
+ mo: mode,
3528
+ en_axis: en_axis,
3529
+ fsr: fsr,
3530
+ hour: hour,
3531
+ minute: minute,
3532
+ device_temp: device_temp,
3533
+ }
3534
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
3535
+ }
3536
+ if(Object.keys(globalDevices[deviceAddr].data).length == expected_packets){
3537
+ var raw_data = new Array();
3538
+
3539
+ for(const packet in globalDevices[deviceAddr].data){
3540
+ raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
3541
+ }
3542
+ var label = 0;
3543
+
3544
+ var fft = new Array();
3545
+ var fft_concat = {};
3546
+
3547
+ var en_axis_data = {};
3548
+ switch (globalDevices[deviceAddr].en_axis){
3549
+ case 1:
3550
+ en_axis_data.x_offset = 0;
3551
+ en_axis_data.increment = 2;
3552
+ break;
3553
+ case 2:
3554
+ en_axis_data.y_offset = 0;
3555
+ en_axis_data.increment = 2;
3556
+ break;
3557
+ case 3:
3558
+ en_axis_data.x_offset = 0;
3559
+ en_axis_data.y_offset = 2;
3560
+ en_axis_data.increment = 4;
3561
+ break;
3562
+ case 4:
3563
+ en_axis_data.z_offset = 0;
3564
+ en_axis_data.increment = 2;
3565
+ break;
3566
+ case 5:
3567
+ en_axis_data.x_offset = 0;
3568
+ en_axis_data.z_offset = 2;
3569
+ en_axis_data.increment = 4;
3570
+ break;
3571
+ case 6:
3572
+ en_axis_data.y_offset = 0;
3573
+ en_axis_data.z_offset = 2;
3574
+ en_axis_data.increment = 4;
3575
+ break;
3576
+ case 7:
3577
+ en_axis_data.x_offset = 0;
3578
+ en_axis_data.y_offset = 2;
3579
+ en_axis_data.z_offset = 4;
3580
+ en_axis_data.increment = 6;
3581
+ break;
3582
+ default:
3583
+ en_axis_data.increment = 0;
3584
+ }
3585
+
3586
+ var fsr_mult = .00006;
3587
+ var fsr_text = "";
3588
+ switch(globalDevices[deviceAddr].fsr){
3589
+ case 0:
3590
+ fsr_mult = 0.00006;
3591
+ break;
3592
+ case 1:
3593
+ fsr_mult = 0.00012;
3594
+ break;
3595
+ case 2:
3596
+ fsr_mult = 0.00024;
3597
+ break;
3598
+ case 3:
3599
+ fsr_mult = 0.00049;
3600
+ break;
3601
+ }
3602
+ switch(globalDevices[deviceAddr].fsr){
3603
+ case 0:
3604
+ fsr_text = "2g";
3605
+ break;
3606
+ case 1:
3607
+ fsr_text = "4g";
3608
+ break;
3609
+ case 2:
3610
+ fsr_text = "8g";
3611
+ break;
3612
+ case 3:
3613
+ fsr_text = "16g";
3614
+ break;
3615
+ }
3616
+
3617
+ for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
3618
+ label++;
3619
+
3620
+ fft_concat[label] = {};
3621
+
3622
+ if('x_offset' in en_axis_data){
3623
+ 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));
3624
+ }
3625
+ if('y_offset' in en_axis_data){
3626
+ 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));
3627
+ }
3628
+ if('z_offset' in en_axis_data){
3629
+ 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));
3630
+ }
3631
+ }
3632
+
3633
+ // If 4th bit is 1 the packet is from the second probe, if 0 from the first
3634
+ var probe = '';
3635
+ if(payload[7] & 8){
3636
+ probe = '2';
3637
+ }
3638
+ else{
3639
+ probe = '1';
3640
+ }
3641
+
3642
+ var fft_concat_obj = {
3643
+ probe: probe,
3644
+ time_id: globalDevices[deviceAddr].hour +':'+ globalDevices[deviceAddr].minute,
3645
+ probe: probe,
3646
+ mac_address: deviceAddr,
3647
+ en_axis: globalDevices[deviceAddr].en_axis,
3648
+ fsr: fsr_text,
3649
+ odr: globalDevices[deviceAddr].odr,
3650
+ device_temp: globalDevices[deviceAddr].device_temp,
3651
+ data: fft_concat
3652
+ };
3653
+ sensor_data = fft_concat_obj;
3654
+ delete globalDevices[deviceAddr];
3655
+ if(this.hasOwnProperty('failure_no')){
3656
+ console.log('####falure no');
3657
+ console.log(this.failure_no);
3658
+ }
3659
+
3660
+ return sensor_data;
3661
+ }
3662
+ else{
3663
+ return;
3664
+ }
3665
+ }else{
3666
+ var mode = payload[8];
3667
+ var odr = payload[9];
3668
+ var en_axis = payload[10] & 7;
3669
+ var fsr = payload[10] >> 5;
3670
+ var device_temp = msbLsb(payload[13], payload[14])/100;
3671
+
3672
+
3673
+ switch(odr){
3674
+ case 6:
3675
+ odr = 50;
3676
+ break;
3677
+ case 7:
3678
+ odr = 100;
3679
+ break;
3680
+ case 8:
3681
+ odr = 200;
3682
+ break;
3683
+ case 9:
3684
+ odr = 400;
3685
+ break;
3686
+ case 10:
3687
+ odr = 800;
3688
+ break;
3689
+ case 11:
3690
+ odr = 1600;
3691
+ break;
3692
+ case 12:
3693
+ odr = 3200;
3694
+ break;
3695
+ case 13:
3696
+ odr = 6400;
3697
+ break;
3698
+ case 14:
3699
+ odr = 12800;
3700
+ break;
3701
+ case 15:
3702
+ odr = 25600;
3703
+ break;
3704
+ default:
3705
+ odr = 0;
3706
+ }
3707
+
3708
+ globalDevices[deviceAddr] = {
3709
+ // stream_size: expected_packets,
3710
+ data: {},
3711
+ odr: odr,
3712
+ mo: mode,
3713
+ en_axis: en_axis,
3714
+ fsr: fsr,
3715
+ hour: hour,
3716
+ minute: minute,
3717
+ device_temp: device_temp,
3718
+ }
3719
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
3720
+ return;
3721
+ }
3722
+ }
3723
+ else if(payload[8] === 0 || payload[8] === 2){
3724
+ // mode byte most significant bit will indicate fft data.
3725
+ // console.log(d);
3726
+ var odr1;
3727
+ switch(payload[9]){
3728
+ case 6:
3729
+ odr1 = "50Hz"
3730
+ break;
3731
+ case 7:
3732
+ odr1 = "100Hz";
3733
+ break;
3734
+ case 8:
3735
+ odr1 = "200Hz";
3736
+ break;
3737
+ case 9:
3738
+ odr1 = "400Hz";
3739
+ break;
3740
+ case 10:
3741
+ odr1 = "800Hz";
3742
+ break;
3743
+ case 11:
3744
+ odr1 = "1600Hz";
3745
+ break;
3746
+ case 12:
3747
+ odr1 = "3200Hz";
3748
+ break;
3749
+ case 13:
3750
+ odr1 = "6400Hz";
3751
+ break;
3752
+ case 14:
3753
+ odr1 = "12800Hz";
3754
+ break;
3755
+ case 15:
3756
+ odr1 = "25600Hz";
3757
+ break;
3758
+ }
3759
+ var odr2;
3760
+ switch(payload[54]){
3761
+ case 6:
3762
+ odr2 = "50Hz"
3763
+ break;
3764
+ case 7:
3765
+ odr2 = "100Hz";
3766
+ break;
3767
+ case 8:
3768
+ odr2 = "200Hz";
3769
+ break;
3770
+ case 9:
3771
+ odr2 = "400Hz";
3772
+ break;
3773
+ case 10:
3774
+ odr2 = "800Hz";
3775
+ break;
3776
+ case 11:
3777
+ odr2 = "1600Hz";
3778
+ break;
3779
+ case 12:
3780
+ odr2 = "3200Hz";
3781
+ break;
3782
+ case 13:
3783
+ odr2 = "6400Hz";
3784
+ break;
3785
+ case 14:
3786
+ odr2 = "12800Hz";
3787
+ break;
3788
+ case 15:
3789
+ odr2 = "25600Hz";
3790
+ break;
3791
+ }
3792
+
3793
+ // If 4th bit is 1 the packet is from the second probe, if 0 from the first
3794
+ // var probe = '';
3795
+ // if(payload[7] & 8){
3796
+ // probe = '2';
3797
+ // }
3798
+ // else{
3799
+ // probe = '1';
3800
+ // }
3801
+
3802
+ return {
3803
+ mode: payload[8],
3804
+
3805
+ s1_odr: odr1,
3806
+ s1_temperature: signInt(payload.slice(10, 12).reduce(msbLsb), 16) / 100,
3807
+
3808
+ x1_rms_ACC_G: payload.slice(12, 14).reduce(msbLsb)/1000,
3809
+ x1_max_ACC_G: payload.slice(14, 16).reduce(msbLsb)/1000,
3810
+ x1_velocity_mm_sec: payload.slice(16, 18).reduce(msbLsb) / 100,
3811
+ x1_displacement_mm: payload.slice(18, 20).reduce(msbLsb) / 100,
3812
+ x1_peak_one_Hz: payload.slice(20, 22).reduce(msbLsb),
3813
+ x1_peak_two_Hz: payload.slice(22, 24).reduce(msbLsb),
3814
+ x1_peak_three_Hz: payload.slice(24, 26).reduce(msbLsb),
3815
+
3816
+ y1_rms_ACC_G: payload.slice(26, 28).reduce(msbLsb)/1000,
3817
+ y1_max_ACC_G: payload.slice(28, 30).reduce(msbLsb)/1000,
3818
+ y1_velocity_mm_sec: payload.slice(30, 32).reduce(msbLsb) / 100,
3819
+ y1_displacement_mm: payload.slice(32, 34).reduce(msbLsb) / 100,
3820
+ y1_peak_one_Hz: payload.slice(34, 36).reduce(msbLsb),
3821
+ y1_peak_two_Hz: payload.slice(36, 38).reduce(msbLsb),
3822
+ y1_peak_three_Hz: payload.slice(38, 40).reduce(msbLsb),
3823
+
3824
+ z1_rms_ACC_G: payload.slice(40, 42).reduce(msbLsb)/1000,
3825
+ z1_max_ACC_G: payload.slice(42, 44).reduce(msbLsb)/1000,
3826
+ z1_velocity_mm_sec: payload.slice(44, 46).reduce(msbLsb) / 100,
3827
+ z1_displacement_mm: payload.slice(46, 48).reduce(msbLsb) / 100,
3828
+ z1_peak_one_Hz: payload.slice(48, 50).reduce(msbLsb),
3829
+ z1_peak_two_Hz: payload.slice(50, 52).reduce(msbLsb),
3830
+ z1_peak_three_Hz: payload.slice(52, 54).reduce(msbLsb),
3831
+
3832
+ s2_odr: odr2,
3833
+ s2_temperature: signInt(payload.slice(55, 57).reduce(msbLsb), 16) / 100,
3834
+
3835
+ x2_rms_ACC_G: payload.slice(57, 59).reduce(msbLsb)/1000,
3836
+ x2_max_ACC_G: payload.slice(59, 61).reduce(msbLsb)/1000,
3837
+ x2_velocity_mm_sec: payload.slice(61, 63).reduce(msbLsb) / 100,
3838
+ x2_displacement_mm: payload.slice(63, 65).reduce(msbLsb) / 100,
3839
+ x2_peak_one_Hz: payload.slice(65, 67).reduce(msbLsb),
3840
+ x2_peak_two_Hz: payload.slice(67, 69).reduce(msbLsb),
3841
+ x2_peak_three_Hz: payload.slice(69, 71).reduce(msbLsb),
3842
+
3843
+ y2_rms_ACC_G: payload.slice(71, 73).reduce(msbLsb)/1000,
3844
+ y2_max_ACC_G: payload.slice(73, 75).reduce(msbLsb)/1000,
3845
+ y2_velocity_mm_sec: payload.slice(75, 77).reduce(msbLsb) / 100,
3846
+ y2_displacement_mm: payload.slice(77, 79).reduce(msbLsb) / 100,
3847
+ y2_peak_one_Hz: payload.slice(79, 81).reduce(msbLsb),
3848
+ y2_peak_two_Hz: payload.slice(81, 83).reduce(msbLsb),
3849
+ y2_peak_three_Hz: payload.slice(83, 85).reduce(msbLsb),
3850
+
3851
+ z2_rms_ACC_G: payload.slice(85, 87).reduce(msbLsb)/1000,
3852
+ z2_max_ACC_G: payload.slice(87, 89).reduce(msbLsb)/1000,
3853
+ z2_velocity_mm_sec: payload.slice(89, 91).reduce(msbLsb) / 100,
3854
+ z2_displacement_mm: payload.slice(91, 93).reduce(msbLsb) / 100,
3855
+ z2_peak_one_Hz: payload.slice(93, 95).reduce(msbLsb),
3856
+ z2_peak_two_Hz: payload.slice(95, 97).reduce(msbLsb),
3857
+ z2_peak_three_Hz: payload.slice(97, 99).reduce(msbLsb)
3858
+ };
3859
+ }
3860
+ // else{
3861
+ // parsed.data = {'error': 'Vibration mode error'}
3862
+ // return parsed;
3863
+ // }
3864
+ },
3865
+ 'parse_fly': (frame) => {
3866
+ let frame_data = {};
3867
+ switch(frame[16]){
3868
+ case 0:
3869
+ frame_data.mode = "Processed";
3870
+ break;
3871
+ case 1:
3872
+ frame_data.mode = "Raw";
3873
+ break;
3874
+ case 2:
3875
+ frame_data.mode = "Processed + Raw on demand";
3876
+ break;
3877
+ }
3878
+ switch(frame[17]){
3879
+ case 6:
3880
+ frame_data.odr_1 = 50;
3881
+ break;
3882
+ case 7:
3883
+ frame_data.odr_1 = 100;
3884
+ break;
3885
+ case 8:
3886
+ frame_data.odr_1 = 200;
3887
+ break;
3888
+ case 9:
3889
+ frame_data.odr_1 = 400;
3890
+ break;
3891
+ case 10:
3892
+ frame_data.odr_1 = 800;
3893
+ break;
3894
+ case 11:
3895
+ frame_data.odr_1 = 1600;
3896
+ break;
3897
+ case 12:
3898
+ frame_data.odr_1 = 3200;
3899
+ break;
3900
+ case 13:
3901
+ frame_data.odr_1 = 6400;
3902
+ break;
3903
+ case 14:
3904
+ frame_data.odr_1 = 12800;
3905
+ break;
3906
+ case 15:
3907
+ frame_data.odr_1 = 25600;
3908
+ break;
3909
+ }
3910
+ switch(frame[18]){
3911
+ case 6:
3912
+ frame_data.odr_2 = 50;
3913
+ break;
3914
+ case 7:
3915
+ frame_data.odr_2 = 100;
3916
+ break;
3917
+ case 8:
3918
+ frame_data.odr_2 = 200;
3919
+ break;
3920
+ case 9:
3921
+ frame_data.odr_2 = 400;
3922
+ break;
3923
+ case 10:
3924
+ frame_data.odr_2 = 800;
3925
+ break;
3926
+ case 11:
3927
+ frame_data.odr_2 = 1600;
3928
+ break;
3929
+ case 12:
3930
+ frame_data.odr_2 = 3200;
3931
+ break;
3932
+ case 13:
3933
+ frame_data.odr_2 = 6400;
3934
+ break;
3935
+ case 14:
3936
+ frame_data.odr_2 = 12800;
3937
+ break;
3938
+ case 15:
3939
+ frame_data.odr_2 = 25600;
3940
+ break;
3941
+ }
3942
+ frame_data.sampling_duration_1 = frame[19]*50 + "ms";
3943
+ frame_data.sampling_duration_2 = frame[20]*50 + "ms";
3944
+ switch(frame[21]){
3945
+ case 0:
3946
+ frame_data.filter_status = "Disabled";
3947
+ break;
3948
+ case 1:
3949
+ frame_data.filter_status = "Enabled";
3950
+ break;
3951
+ }
3952
+ switch(frame[22]){
3953
+ case 0:
3954
+ frame_data.lpf_coeff_1 = 4;
3955
+ break;
3956
+ case 1:
3957
+ frame_data.lpf_coeff_1 = 8;
3958
+ break;
3959
+ case 2:
3960
+ frame_data.lpf_coeff_1 = 16;
3961
+ break;
3962
+ case 2:
3963
+ frame_data.lpf_coeff_1 = 32;
3964
+ break;
3965
+ case 4:
3966
+ frame_data.lpf_coeff_1 = 64;
3967
+ break;
3968
+ case 5:
3969
+ frame_data.lpf_coeff_1 = 128;
3970
+ break;
3971
+ case 6:
3972
+ frame_data.lpf_coeff_1 = 256;
3973
+ break;
3974
+ case 7:
3975
+ frame_data.lpf_coeff_1 = 512;
3976
+ break;
3977
+ case 8:
3978
+ frame_data.lpf_coeff_1 = 1024;
3979
+ break;
3980
+ case 9:
3981
+ frame_data.lpf_coeff_1 = 2048;
3982
+ break;
3983
+ }
3984
+ frame_data.lpf_freq_1 = frame_data.odr_1 / frame_data.lpf_coeff_1;
3985
+ switch(frame[23]){
3986
+ case 0:
3987
+ frame_data.lpf_coeff_2 = 4;
3988
+ break;
3989
+ case 1:
3990
+ frame_data.lpf_coeff_2 = 8;
3991
+ break;
3992
+ case 2:
3993
+ frame_data.lpf_coeff_2 = 16;
3994
+ break;
3995
+ case 2:
3996
+ frame_data.lpf_coeff_2 = 32;
3997
+ break;
3998
+ case 4:
3999
+ frame_data.lpf_coeff_2 = 64;
4000
+ break;
4001
+ case 5:
4002
+ frame_data.lpf_coeff_2 = 128;
4003
+ break;
4004
+ case 6:
4005
+ frame_data.lpf_coeff_2 = 256;
4006
+ break;
4007
+ case 7:
4008
+ frame_data.lpf_coeff_2 = 512;
4009
+ break;
4010
+ case 8:
4011
+ frame_data.lpf_coeff_2 = 1024;
4012
+ break;
4013
+ case 9:
4014
+ frame_data.lpf_coeff_2 = 2048;
4015
+ break;
4016
+ }
4017
+ frame_data.lpf_freq_2 = frame_data.odr_2 / frame_data.lpf_coeff_2;
4018
+ switch(frame[24]){
4019
+ case 0:
4020
+ frame_data.hpf_coeff_1 = 4;
4021
+ break;
4022
+ case 1:
4023
+ frame_data.hpf_coeff_1 = 8;
4024
+ break;
4025
+ case 2:
4026
+ frame_data.hpf_coeff_1 = 16;
4027
+ break;
4028
+ case 2:
4029
+ frame_data.hpf_coeff_1 = 32;
4030
+ break;
4031
+ case 4:
4032
+ frame_data.hpf_coeff_1 = 64;
4033
+ break;
4034
+ case 5:
4035
+ frame_data.hpf_coeff_1 = 128;
4036
+ break;
4037
+ case 6:
4038
+ frame_data.hpf_coeff_1 = 256;
4039
+ break;
4040
+ case 7:
4041
+ frame_data.hpf_coeff_1 = 512;
4042
+ break;
4043
+ case 8:
4044
+ frame_data.hpf_coeff_1 = 1024;
4045
+ break;
4046
+ case 9:
4047
+ frame_data.hpf_coeff_1 = 2048;
4048
+ break;
4049
+ }
4050
+ frame_data.hpf_freq_1 = frame_data.odr_1 / frame_data.hpf_coeff_1;
4051
+ switch(frame[25]){
4052
+ case 0:
4053
+ frame_data.hpf_coeff_2 = 4;
4054
+ break;
4055
+ case 1:
4056
+ frame_data.hpf_coeff_2 = 8;
4057
+ break;
4058
+ case 2:
4059
+ frame_data.hpf_coeff_2 = 16;
4060
+ break;
4061
+ case 2:
4062
+ frame_data.hpf_coeff_2 = 32;
4063
+ break;
4064
+ case 4:
4065
+ frame_data.hpf_coeff_2 = 64;
4066
+ break;
4067
+ case 5:
4068
+ frame_data.hpf_coeff_2 = 128;
4069
+ break;
4070
+ case 6:
4071
+ frame_data.hpf_coeff_2 = 256;
4072
+ break;
4073
+ case 7:
4074
+ frame_data.hpf_coeff_2 = 512;
4075
+ break;
4076
+ case 8:
4077
+ frame_data.hpf_coeff_2 = 1024;
4078
+ break;
4079
+ case 9:
4080
+ frame_data.hpf_coeff_2 = 2048;
4081
+ break;
4082
+ }
4083
+ frame_data.hpf_freq_2 = frame_data.odr_2 / frame_data.hpf_coeff_2;
4084
+ switch(frame[26]){
4085
+ case 0:
4086
+ frame_data.sampling_interval = "5 Minutes";
4087
+ break;
4088
+ case 1:
4089
+ frame_data.sampling_interval = "10 Minutes";
4090
+ break;
4091
+ case 2:
4092
+ frame_data.sampling_interval = "15 Minutes";
4093
+ break;
4094
+ case 2:
4095
+ frame_data.sampling_interval = "20 Minutes";
4096
+ break;
4097
+ case 4:
4098
+ frame_data.sampling_interval = "30 Minutes";
4099
+ break;
4100
+ case 5:
4101
+ frame_data.sampling_interval = "60 Minutes";
4102
+ break;
4103
+ case 6:
4104
+ frame_data.sampling_interval = "120 Minutes";
4105
+ break;
4106
+ case 7:
4107
+ frame_data.sampling_interval = "180 Minutes";
4108
+ break;
4109
+ case 8:
4110
+ frame_data.sampling_interval = "1 Minute";
4111
+ break;
4112
+ }
4113
+ frame_data.on_request_timeout = frame[27] + " Seconds";
4114
+ frame_data.deadband = frame[28] + "mg";
4115
+
4116
+ switch(frame[29]){
4117
+ case 0:
4118
+ frame_data.payload_length = "50 Bytes";
4119
+ break;
4120
+ case 1:
4121
+ frame_data.payload_length = "100 Bytes";
4122
+ break;
4123
+ case 2:
4124
+ frame_data.payload_length = "150 Bytes";
4125
+ break;
4126
+ case 3:
4127
+ frame_data.payload_length = "180 Bytes";
4128
+ break;
4129
+ }
4130
+
4131
+ return {
4132
+ 'firmware': frame[2],
4133
+ 'destination_address': toMac(frame.slice(12, 16)),
4134
+ 'mode': frame_data.mode,
4135
+ 'odr_1': frame_data.odr_1+'Hz',
4136
+ 'odr_2': frame_data.odr_2+'Hz',
4137
+ 'sampling_duration_1': frame_data.sampling_duration_1,
4138
+ 'sampling_duration_2': frame_data.sampling_duration_2,
4139
+ 'filter_status': frame_data.filter_status,
4140
+ 'lpf_coeff_1': frame_data.lpf_coeff_1,
4141
+ 'lpf_freq_1': frame_data.lpf_freq_1+'Hz',
4142
+ 'lpf_coeff_2': frame_data.lpf_coeff_2,
4143
+ 'lpf_freq_2': frame_data.lpf_freq_2+'Hz',
4144
+ 'hpf_coeff_1': frame_data.hpf_coeff_1,
4145
+ 'hpf_freq_1': frame_data.hpf_freq_1+'Hz',
4146
+ 'hpf_coeff_2': frame_data.hpf_coeff_2,
4147
+ 'hpf_freq_2': frame_data.hpf_freq_2+'Hz',
4148
+ 'sampling_interval': frame_data.sampling_interval,
4149
+ 'on_request_timeout': frame_data.on_request_timeout,
4150
+ 'deadband': frame_data.deadband,
4151
+ 'payload_length': frame_data.payload_length,
4152
+ 'machine_values': {
4153
+ 'firmware': frame[2],
4154
+ 'destination_address': toMac(frame.slice(12, 16), false),
4155
+ 'mode': frame[16],
4156
+ 'odr_1': frame[17],
4157
+ 'odr_2': frame[18],
4158
+ 'sampling_duration_1': frame[19],
4159
+ 'sampling_duration_2': frame[20],
4160
+ 'filter_status': frame[21],
4161
+ 'lpf_coeff_1': frame[22],
4162
+ 'lpf_coeff_2': frame[23],
4163
+ 'hpf_coeff_1': frame[24],
4164
+ 'hpf_coeff_2': frame[25],
4165
+ 'sampling_interval': frame[26],
4166
+ 'on_request_timeout': frame[27],
4167
+ 'deadband': frame[28],
4168
+ 'payload_length': frame[29]
4169
+ }
4170
+ }
4171
+ }
4172
+ },
4173
+
4174
+ '82': {
4175
+ name: 'Condition Based/Predictive Maintenance Sensor',
4176
+ parse: (payload, parsed, mac) => {
4177
+ if(payload[7] >> 1 != 0){
4178
+ console.log('Error found');
4179
+ console.log(payload[7]);
4180
+ parsed.data = {error: 'Error found, Sensor Probe may be unattached'};
4181
+ return parsed;
4182
+ }
4183
+
4184
+ if(payload[8] === 1){
4185
+ var deviceAddr = mac;
4186
+ var firmware = payload[1];
4187
+ var hour = payload[11];
4188
+ var minute = payload[12];
4189
+ var expected_packets = payload[15];
4190
+ var current_packet = payload[16];
4191
+ var sdata_start = 17;
4192
+
4193
+ if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
4194
+ if(expected_packets != 1){
4195
+ // 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
4196
+ if(current_packet in globalDevices[deviceAddr].data || current_packet == 1 || !((current_packet-1) in globalDevices[deviceAddr].data)) {
4197
+ console.log('-----');
4198
+ console.log('bad packet breakdown deleting stream');
4199
+ console.log(current_packet);
4200
+ console.log(expected_packets);
4201
+ console.log(current_packet in globalDevices[deviceAddr].data);
4202
+ console.log(current_packet == 1);
4203
+ console.log(!((current_packet-1) in globalDevices[deviceAddr].data));
4204
+ if(this.hasOwnProperty('failure_no')){
4205
+ this.failure_no = this.failure_no + 1;
4206
+ }
4207
+ else{
4208
+ this.failure_no = 1;
4209
+ }
4210
+ if(this.hasOwnProperty('failure_no')){
4211
+ console.log('####falure no');
4212
+ console.log(this.failure_no);
4213
+ }
4214
+ // console.log(globalDevices[deviceAddr].data);
4215
+ delete globalDevices[deviceAddr];
4216
+ if(current_packet != 1){
4217
+ return;
4218
+ } else{
4219
+
4220
+ var mode = payload[8];
4221
+ var odr = payload[9];
4222
+ var en_axis = payload[10] & 7;
4223
+ var fsr = payload[10] >> 5;
4224
+ var device_temp = msbLsb(payload[13], payload[14])/100;
4225
+
4226
+
4227
+ switch(odr){
4228
+ case 6:
4229
+ odr = 50;
4230
+ break;
4231
+ case 7:
4232
+ odr = 100;
4233
+ break;
4234
+ case 8:
4235
+ odr = 200;
4236
+ break;
4237
+ case 9:
4238
+ odr = 400;
4239
+ break;
4240
+ case 10:
4241
+ odr = 800;
4242
+ break;
4243
+ case 11:
4244
+ odr = 1600;
4245
+ break;
4246
+ case 12:
4247
+ odr = 3200;
4248
+ break;
4249
+ case 13:
4250
+ odr = 6400;
4251
+ break;
4252
+ case 14:
4253
+ odr = 12800;
4254
+ break;
4255
+ case 15:
4256
+ odr = 25600;
4257
+ break;
4258
+ default:
4259
+ odr = 0;
4260
+ }
4261
+
4262
+ globalDevices[deviceAddr] = {
4263
+ // stream_size: expected_packets,
4264
+ data: {},
4265
+ odr: odr,
4266
+ mo: mode,
4267
+ en_axis: en_axis,
4268
+ fsr: fsr,
4269
+ hour: hour,
4270
+ minute: minute,
4271
+ device_temp: device_temp,
4272
+ }
4273
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
4274
+ return;
4275
+ }
4276
+ }
4277
+ else{
4278
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
4279
+ }
4280
+ }
4281
+ else{
4282
+ var mode = payload[8];
4283
+ var odr = payload[9];
4284
+ var en_axis = payload[10] & 7;
4285
+ var fsr = payload[10] >> 5;
4286
+ var device_temp = msbLsb(payload[13], payload[14])/100;
4287
+
4288
+
4289
+ switch(odr){
4290
+ case 6:
4291
+ odr = 50;
4292
+ break;
4293
+ case 7:
4294
+ odr = 100;
4295
+ break;
4296
+ case 8:
4297
+ odr = 200;
4298
+ break;
4299
+ case 9:
4300
+ odr = 400;
4301
+ break;
4302
+ case 10:
4303
+ odr = 800;
4304
+ break;
4305
+ case 11:
4306
+ odr = 1600;
4307
+ break;
4308
+ case 12:
4309
+ odr = 3200;
4310
+ break;
4311
+ case 13:
4312
+ odr = 6400;
4313
+ break;
4314
+ case 14:
4315
+ odr = 12800;
4316
+ break;
4317
+ case 15:
4318
+ odr = 25600;
4319
+ break;
4320
+ default:
4321
+ odr = 0;
4322
+ }
4323
+
4324
+ globalDevices[deviceAddr] = {
4325
+ // stream_size: expected_packets,
4326
+ data: {},
4327
+ odr: odr,
4328
+ mo: mode,
4329
+ en_axis: en_axis,
4330
+ fsr: fsr,
4331
+ hour: hour,
4332
+ minute: minute,
4333
+ device_temp: device_temp,
4334
+ }
4335
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
4336
+ }
4337
+ if(Object.keys(globalDevices[deviceAddr].data).length == expected_packets){
4338
+ var raw_data = new Array();
4339
+ for(const packet in globalDevices[deviceAddr].data){
4340
+ raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
4341
+ }
4342
+ var label = 0;
4343
+
4344
+ var fft = new Array();
4345
+ var fft_concat = {};
4346
+
4347
+ var en_axis_data = {};
4348
+ switch (globalDevices[deviceAddr].en_axis){
4349
+ case 1:
4350
+ en_axis_data.x_offset = 0;
4351
+ en_axis_data.increment = 2;
4352
+ break;
4353
+ case 2:
4354
+ en_axis_data.y_offset = 0;
4355
+ en_axis_data.increment = 2;
4356
+ break;
4357
+ case 3:
4358
+ en_axis_data.x_offset = 0;
4359
+ en_axis_data.y_offset = 2;
4360
+ en_axis_data.increment = 4;
4361
+ break;
4362
+ case 4:
4363
+ en_axis_data.z_offset = 0;
4364
+ en_axis_data.increment = 2;
4365
+ break;
4366
+ case 5:
4367
+ en_axis_data.x_offset = 0;
4368
+ en_axis_data.z_offset = 2;
4369
+ en_axis_data.increment = 4;
4370
+ break;
4371
+ case 6:
4372
+ en_axis_data.y_offset = 0;
4373
+ en_axis_data.z_offset = 2;
4374
+ en_axis_data.increment = 4;
4375
+ break;
4376
+ case 7:
4377
+ en_axis_data.x_offset = 0;
4378
+ en_axis_data.y_offset = 2;
4379
+ en_axis_data.z_offset = 4;
4380
+ en_axis_data.increment = 6;
4381
+ break;
4382
+ default:
4383
+ en_axis_data.increment = 0;
4384
+ }
4385
+
4386
+ var fsr_mult = .00006;
4387
+ var fsr_text = "";
4388
+ switch(globalDevices[deviceAddr].fsr){
4389
+ case 0:
4390
+ fsr_mult = 0.00006;
4391
+ break;
4392
+ case 1:
4393
+ fsr_mult = 0.00012;
4394
+ break;
4395
+ case 2:
4396
+ fsr_mult = 0.00024;
4397
+ break;
4398
+ case 3:
4399
+ fsr_mult = 0.00049;
4400
+ break;
4401
+ }
4402
+ switch(globalDevices[deviceAddr].fsr){
4403
+ case 0:
4404
+ fsr_text = "2g";
4405
+ break;
4406
+ case 1:
4407
+ fsr_text = "4g";
4408
+ break;
4409
+ case 2:
4410
+ fsr_text = "8g";
4411
+ break;
4412
+ case 3:
4413
+ fsr_text = "16g";
4414
+ break;
4415
+ }
4416
+
4417
+ for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
4418
+ label++;
4419
+
4420
+ fft_concat[label] = {};
4421
+
4422
+ if('x_offset' in en_axis_data){
4423
+ 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));
4424
+ }
4425
+ if('y_offset' in en_axis_data){
4426
+ 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));
4427
+ }
4428
+ if('z_offset' in en_axis_data){
4429
+ 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));
4430
+ }
4431
+ }
4432
+ var fft_concat_obj = {
4433
+ time_id: globalDevices[deviceAddr].hour +':'+ globalDevices[deviceAddr].minute,
4434
+ mac_address: deviceAddr,
4435
+ en_axis: globalDevices[deviceAddr].en_axis,
4436
+ fsr: fsr_text,
4437
+ odr: globalDevices[deviceAddr].odr,
4438
+ device_temp: globalDevices[deviceAddr].device_temp,
4439
+ data: fft_concat
4440
+ };
4441
+ // console.log(globalDevices[deviceAddr].data);
4442
+ // console.log(raw_data);
4443
+ sensor_data = fft_concat_obj;
4444
+ // parsed.raw_packets = globalDevices[deviceAddr].data;
4445
+ // parsed.raw_data = raw_data;
4446
+ delete globalDevices[deviceAddr];
4447
+ if(this.hasOwnProperty('failure_no')){
4448
+ console.log('####falure no');
4449
+ console.log(this.failure_no);
4450
+ }
4451
+
4452
+ return sensor_data;
4453
+ }
4454
+ else{
4455
+ return;
4456
+ }
4457
+ }else{
4458
+
4459
+ var mode = payload[8];
4460
+ var odr = payload[9];
4461
+ var en_axis = payload[10] & 7;
4462
+ var fsr = payload[10] >> 5;
4463
+ var device_temp = msbLsb(payload[13], payload[14])/100;
4464
+
4465
+
4466
+ switch(odr){
4467
+ case 6:
4468
+ odr = 50;
4469
+ break;
4470
+ case 7:
4471
+ odr = 100;
4472
+ break;
4473
+ case 8:
4474
+ odr = 200;
4475
+ break;
4476
+ case 9:
4477
+ odr = 400;
4478
+ break;
4479
+ case 10:
4480
+ odr = 800;
4481
+ break;
4482
+ case 11:
4483
+ odr = 1600;
4484
+ break;
4485
+ case 12:
4486
+ odr = 3200;
4487
+ break;
4488
+ case 13:
4489
+ odr = 6400;
4490
+ break;
4491
+ case 14:
4492
+ odr = 12800;
4493
+ break;
4494
+ case 15:
4495
+ odr = 25600;
4496
+ break;
4497
+ default:
4498
+ odr = 0;
4499
+ }
4500
+
4501
+ globalDevices[deviceAddr] = {
4502
+ // stream_size: expected_packets,
4503
+ data: {},
4504
+ odr: odr,
4505
+ mo: mode,
4506
+ en_axis: en_axis,
4507
+ fsr: fsr,
4508
+ hour: hour,
4509
+ minute: minute,
4510
+ device_temp: device_temp,
4511
+ }
4512
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
4513
+ return;
4514
+ }
4515
+ }
4516
+ else if(payload[8] === 0 || payload[8] === 2){
4517
+ // mode byte most significant bit will indicate fft data.
4518
+ // console.log(d);
4519
+ var odr;
4520
+ switch(payload[9]){
4521
+ case 6:
4522
+ odr = "50Hz"
4523
+ break;
4524
+ case 7:
4525
+ odr = "100Hz";
4526
+ break;
4527
+ case 8:
4528
+ odr = "200Hz";
4529
+ break;
4530
+ case 9:
4531
+ odr = "400Hz";
4532
+ break;
4533
+ case 10:
4534
+ odr = "800Hz";
4535
+ break;
4536
+ case 11:
4537
+ odr = "1600Hz";
4538
+ break;
4539
+ case 12:
4540
+ odr = "3200Hz";
4541
+ break;
4542
+ case 13:
4543
+ odr = "6400Hz";
4544
+ break;
4545
+ case 14:
4546
+ odr = "12800Hz";
4547
+ break;
4548
+ case 15:
4549
+ odr = "25600Hz";
4550
+ break;
4551
+ }
4552
+ return {
4553
+ mode: payload[8],
4554
+
4555
+ odr: odr,
4556
+ temperature: signInt(payload.slice(10, 12).reduce(msbLsb), 16) / 100,
4557
+ Ext_temperature: signInt(payload.slice(12, 16).reduce(msbLsb), 32) / 100,
4558
+ Current: signInt(payload.slice(16, 20).reduce(msbLsb), 32) / 1000,
4559
+ x_rms_ACC_G: payload.slice(20, 22).reduce(msbLsb)/1000,
4560
+ x_max_ACC_G: payload.slice(22, 24).reduce(msbLsb)/1000,
4561
+ x_velocity_mm_sec: payload.slice(24, 26).reduce(msbLsb) / 100,
4562
+ x_displacement_mm: payload.slice(26, 28).reduce(msbLsb) / 100,
4563
+ x_peak_one_Hz: payload.slice(28, 30).reduce(msbLsb),
4564
+ x_peak_two_Hz: payload.slice(30, 32).reduce(msbLsb),
4565
+ x_peak_three_Hz: payload.slice(32, 34).reduce(msbLsb),
4566
+
4567
+ y_rms_ACC_G: payload.slice(34, 36).reduce(msbLsb)/1000,
4568
+ y_max_ACC_G: payload.slice(36, 38).reduce(msbLsb)/1000,
4569
+ y_velocity_mm_sec: payload.slice(38, 40).reduce(msbLsb) / 100,
4570
+ y_displacement_mm: payload.slice(40, 42).reduce(msbLsb) / 100,
4571
+ y_peak_one_Hz: payload.slice(42, 44).reduce(msbLsb),
4572
+ y_peak_two_Hz: payload.slice(44, 46).reduce(msbLsb),
4573
+ y_peak_three_Hz: payload.slice(46, 48).reduce(msbLsb),
4574
+
4575
+ z_rms_ACC_G: payload.slice(48, 50).reduce(msbLsb)/1000,
4576
+ z_max_ACC_G: payload.slice(50, 52).reduce(msbLsb)/1000,
4577
+ z_velocity_mm_sec: payload.slice(52, 54).reduce(msbLsb) / 100,
4578
+ z_displacement_mm: payload.slice(54, 56).reduce(msbLsb) / 100,
4579
+ z_peak_one_Hz: payload.slice(56, 58).reduce(msbLsb),
4580
+ z_peak_two_Hz: payload.slice(58, 60).reduce(msbLsb),
4581
+ z_peak_three_Hz: payload.slice(60, 62).reduce(msbLsb),
4582
+ };
4583
+ }
4584
+ // else{
4585
+ // parsed.data = {'error': 'Vibration mode error'}
4586
+ // return parsed;
4587
+ // }
4588
+ },
4589
+ 'parse_fly': (frame) => {
4590
+ let frame_data = {};
4591
+ switch(frame[16]){
4592
+ case 0:
4593
+ frame_data.mode = "Processed";
4594
+ break;
4595
+ case 1:
4596
+ frame_data.mode = "Raw";
4597
+ break;
4598
+ case 2:
4599
+ frame_data.mode = "Processed + Raw on demand";
4600
+ break;
4601
+ }
4602
+ switch(frame[17]){
4603
+ case 6:
4604
+ frame_data.odr_1 = 50;
4605
+ break;
4606
+ case 7:
4607
+ frame_data.odr_1 = 100;
4608
+ break;
4609
+ case 8:
4610
+ frame_data.odr_1 = 200;
4611
+ break;
4612
+ case 9:
4613
+ frame_data.odr_1 = 400;
4614
+ break;
4615
+ case 10:
4616
+ frame_data.odr_1 = 800;
4617
+ break;
4618
+ case 11:
4619
+ frame_data.odr_1 = 1600;
4620
+ break;
4621
+ case 12:
4622
+ frame_data.odr_1 = 3200;
4623
+ break;
4624
+ case 13:
4625
+ frame_data.odr_1 = 6400;
4626
+ break;
4627
+ case 14:
4628
+ frame_data.odr_1 = 12800;
4629
+ break;
4630
+ case 15:
4631
+ frame_data.odr_1 = 25600;
4632
+ break;
4633
+ }
4634
+ frame_data.sampling_duration_1 = frame[19]*50 + "ms";
4635
+ switch(frame[21]){
4636
+ case 0:
4637
+ frame_data.filter_status = "Disabled";
4638
+ break;
4639
+ case 1:
4640
+ frame_data.filter_status = "Enabled";
4641
+ break;
4642
+ }
4643
+ switch(frame[22]){
4644
+ case 0:
4645
+ frame_data.lpf_coeff_1 = 4;
4646
+ break;
4647
+ case 1:
4648
+ frame_data.lpf_coeff_1 = 8;
4649
+ break;
4650
+ case 2:
4651
+ frame_data.lpf_coeff_1 = 16;
4652
+ break;
4653
+ case 2:
4654
+ frame_data.lpf_coeff_1 = 32;
4655
+ break;
4656
+ case 4:
4657
+ frame_data.lpf_coeff_1 = 64;
4658
+ break;
4659
+ case 5:
4660
+ frame_data.lpf_coeff_1 = 128;
4661
+ break;
4662
+ case 6:
4663
+ frame_data.lpf_coeff_1 = 256;
4664
+ break;
4665
+ case 7:
4666
+ frame_data.lpf_coeff_1 = 512;
4667
+ break;
4668
+ case 8:
4669
+ frame_data.lpf_coeff_1 = 1024;
4670
+ break;
4671
+ case 9:
4672
+ frame_data.lpf_coeff_1 = 2048;
4673
+ break;
4674
+ }
4675
+ frame_data.lpf_freq_1 = frame_data.odr_1 / frame_data.lpf_coeff_1;
4676
+ switch(frame[24]){
4677
+ case 0:
4678
+ frame_data.hpf_coeff_1 = 4;
4679
+ break;
4680
+ case 1:
4681
+ frame_data.hpf_coeff_1 = 8;
4682
+ break;
4683
+ case 2:
4684
+ frame_data.hpf_coeff_1 = 16;
4685
+ break;
4686
+ case 2:
4687
+ frame_data.hpf_coeff_1 = 32;
4688
+ break;
4689
+ case 4:
4690
+ frame_data.hpf_coeff_1 = 64;
4691
+ break;
4692
+ case 5:
4693
+ frame_data.hpf_coeff_1 = 128;
4694
+ break;
4695
+ case 6:
4696
+ frame_data.hpf_coeff_1 = 256;
4697
+ break;
4698
+ case 7:
4699
+ frame_data.hpf_coeff_1 = 512;
4700
+ break;
4701
+ case 8:
4702
+ frame_data.hpf_coeff_1 = 1024;
4703
+ break;
4704
+ case 9:
4705
+ frame_data.hpf_coeff_1 = 2048;
4706
+ break;
4707
+ }
4708
+ frame_data.hpf_freq_1 = frame_data.odr_1 / frame_data.hpf_coeff_1;
4709
+ switch(frame[26]){
4710
+ case 0:
4711
+ frame_data.sampling_interval = "5 Minutes";
4712
+ break;
4713
+ case 1:
4714
+ frame_data.sampling_interval = "10 Minutes";
4715
+ break;
4716
+ case 2:
4717
+ frame_data.sampling_interval = "15 Minutes";
4718
+ break;
4719
+ case 2:
4720
+ frame_data.sampling_interval = "20 Minutes";
4721
+ break;
4722
+ case 4:
4723
+ frame_data.sampling_interval = "30 Minutes";
4724
+ break;
4725
+ case 5:
4726
+ frame_data.sampling_interval = "60 Minutes";
4727
+ break;
4728
+ case 6:
4729
+ frame_data.sampling_interval = "120 Minutes";
4730
+ break;
4731
+ case 7:
4732
+ frame_data.sampling_interval = "180 Minutes";
4733
+ break;
4734
+ case 8:
4735
+ frame_data.sampling_interval = "1 Minute";
4736
+ break;
4737
+ }
4738
+ frame_data.on_request_timeout = frame[27] + " Seconds";
4739
+ frame_data.deadband = frame[28] + "mg";
4740
+
4741
+ switch(frame[29]){
4742
+ case 0:
4743
+ frame_data.payload_length = "50 Bytes";
4744
+ break;
4745
+ case 1:
4746
+ frame_data.payload_length = "100 Bytes";
4747
+ break;
4748
+ case 2:
4749
+ frame_data.payload_length = "150 Bytes";
4750
+ break;
4751
+ case 3:
4752
+ frame_data.payload_length = "180 Bytes";
4753
+ break;
4754
+ }
4755
+
4756
+ return {
4757
+ 'firmware': frame[2],
4758
+ 'destination_address': toMac(frame.slice(12, 16)),
4759
+ 'mode': frame_data.mode,
4760
+ 'odr_1': frame_data.odr_1+'Hz',
4761
+ 'sampling_duration_1': frame_data.sampling_duration_1,
4762
+ 'sampling_duration_2': frame_data.sampling_duration_2,
4763
+ 'filter_status': frame_data.filter_status,
4764
+ 'lpf_coeff_1': frame_data.lpf_coeff_1,
4765
+ 'lpf_freq_1': frame_data.lpf_freq_1+'Hz',
4766
+ 'hpf_coeff_1': frame_data.hpf_coeff_1,
4767
+ 'hpf_freq_1': frame_data.hpf_freq_1+'Hz',
4768
+ 'sampling_interval': frame_data.sampling_interval,
4769
+ 'on_request_timeout': frame_data.on_request_timeout,
4770
+ 'deadband': frame_data.deadband,
4771
+ 'payload_length': frame_data.payload_length,
4772
+ 'machine_values': {
4773
+ 'firmware': frame[2],
4774
+ 'destination_address': toMac(frame.slice(12, 16), false),
4775
+ 'mode': frame[16],
4776
+ 'odr_1': frame[17],
4777
+ 'sampling_duration_1': frame[19],
4778
+ 'sampling_duration_2': frame[20],
4779
+ 'filter_status': frame[21],
4780
+ 'lpf_coeff_1': frame[22],
4781
+ 'hpf_coeff_1': frame[24],
4782
+ 'sampling_interval': frame[26],
4783
+ 'on_request_timeout': frame[27],
4784
+ 'deadband': frame[28],
4785
+ 'payload_length': frame[29]
4786
+ }
4787
+ }
4788
+ }
4789
+ },
4790
+
4791
+ '84': {
4792
+ name: 'Type 84 - Standalone Smart Vibration Sensor',
4793
+ parse: (payload, parsed, mac) => {
4794
+ if(payload[7] >> 1 != 0){
4795
+ console.log('Error found');
4796
+ parsed.data = {error: 'Error found, Sensor Probe may be unattached'};
4797
+ return parsed;
4798
+ }
4799
+
4800
+ if(payload[8] === 1){
4801
+ var deviceAddr = mac;
4802
+ var firmware = payload[1];
4803
+ var hour = payload[11];
4804
+ var minute = payload[12];
4805
+ var expected_packets = payload[15];
4806
+ var current_packet = payload[16];
4807
+ var sdata_start = 17;
4808
+
4809
+ if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
4810
+ if(expected_packets != 1){
4811
+ // 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
4812
+ if(current_packet in globalDevices[deviceAddr].data || current_packet == 1 || !((current_packet-1) in globalDevices[deviceAddr].data)) {
4813
+ console.log('-----');
4814
+ console.log('bad packet breakdown deleting stream');
4815
+ console.log(current_packet);
4816
+ console.log(expected_packets);
4817
+ console.log(current_packet in globalDevices[deviceAddr].data);
4818
+ console.log(current_packet == 1);
4819
+ console.log(!((current_packet-1) in globalDevices[deviceAddr].data));
4820
+ if(this.hasOwnProperty('failure_no')){
4821
+ this.failure_no = this.failure_no + 1;
4822
+ }
4823
+ else{
4824
+ this.failure_no = 1;
4825
+ }
4826
+ if(this.hasOwnProperty('failure_no')){
4827
+ console.log('####falure no');
4828
+ console.log(this.failure_no);
4829
+ }
4830
+ // console.log(globalDevices[deviceAddr].data);
4831
+ delete globalDevices[deviceAddr];
4832
+ if(current_packet != 1){
4833
+ return;
4834
+ } else{
4835
+
4836
+ var mode = payload[8];
4837
+ var odr = payload[9];
4838
+ var en_axis = payload[10] & 7;
4839
+ var fsr = payload[10] >> 5;
4840
+ var device_temp = msbLsb(payload[13], payload[14])/100;
4841
+
4842
+
4843
+ switch(odr){
4844
+ case 6:
4845
+ odr = 50;
4846
+ break;
4847
+ case 7:
4848
+ odr = 100;
4849
+ break;
4850
+ case 8:
4851
+ odr = 200;
4852
+ break;
4853
+ case 9:
4854
+ odr = 400;
4855
+ break;
4856
+ case 10:
4857
+ odr = 800;
4858
+ break;
4859
+ case 11:
4860
+ odr = 1600;
4861
+ break;
4862
+ case 12:
4863
+ odr = 3200;
4864
+ break;
4865
+ case 13:
4866
+ odr = 6400;
4867
+ break;
4868
+ case 14:
4869
+ odr = 12800;
4870
+ break;
4871
+ case 15:
4872
+ odr = 25600;
4873
+ break;
4874
+ default:
4875
+ odr = 0;
4876
+ }
4877
+
4878
+ globalDevices[deviceAddr] = {
4879
+ // stream_size: expected_packets,
4880
+ data: {},
4881
+ odr: odr,
4882
+ mo: mode,
4883
+ en_axis: en_axis,
4884
+ fsr: fsr,
4885
+ hour: hour,
4886
+ minute: minute,
4887
+ device_temp: device_temp,
4888
+ }
4889
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
4890
+ return;
4891
+ }
4892
+ }
4893
+ else{
4894
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
4895
+ }
4896
+ }
4897
+ else{
4898
+ var mode = payload[8];
4899
+ var odr = payload[9];
4900
+ var en_axis = payload[10] & 7;
4901
+ var fsr = payload[10] >> 5;
4902
+ var device_temp = msbLsb(payload[13], payload[14])/100;
4903
+
4904
+
4905
+ switch(odr){
4906
+ case 6:
4907
+ odr = 50;
4908
+ break;
4909
+ case 7:
4910
+ odr = 100;
4911
+ break;
4912
+ case 8:
4913
+ odr = 200;
4914
+ break;
4915
+ case 9:
4916
+ odr = 400;
4917
+ break;
4918
+ case 10:
4919
+ odr = 800;
4920
+ break;
4921
+ case 11:
4922
+ odr = 1600;
4923
+ break;
4924
+ case 12:
4925
+ odr = 3200;
4926
+ break;
4927
+ case 13:
4928
+ odr = 6400;
4929
+ break;
4930
+ case 14:
4931
+ odr = 12800;
4932
+ break;
4933
+ case 15:
4934
+ odr = 25600;
4935
+ break;
4936
+ default:
4937
+ odr = 0;
4938
+ }
4939
+
4940
+ globalDevices[deviceAddr] = {
4941
+ // stream_size: expected_packets,
4942
+ data: {},
4943
+ odr: odr,
4944
+ mo: mode,
4945
+ en_axis: en_axis,
4946
+ fsr: fsr,
4947
+ hour: hour,
4948
+ minute: minute,
4949
+ device_temp: device_temp,
4950
+ }
4951
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
4952
+ }
4953
+ if(Object.keys(globalDevices[deviceAddr].data).length == expected_packets){
4954
+ var raw_data = new Array();
4955
+ for(const packet in globalDevices[deviceAddr].data){
4956
+ raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
4957
+ }
4958
+ var label = 0;
4959
+
4960
+ var fft = new Array();
4961
+ var fft_concat = {};
4962
+
4963
+ var en_axis_data = {};
4964
+ switch (globalDevices[deviceAddr].en_axis){
4965
+ case 1:
4966
+ en_axis_data.x_offset = 0;
4967
+ en_axis_data.increment = 2;
4968
+ break;
4969
+ case 2:
4970
+ en_axis_data.y_offset = 0;
4971
+ en_axis_data.increment = 2;
4972
+ break;
4973
+ case 3:
4974
+ en_axis_data.x_offset = 0;
4975
+ en_axis_data.y_offset = 2;
4976
+ en_axis_data.increment = 4;
4977
+ break;
4978
+ case 4:
4979
+ en_axis_data.z_offset = 0;
4980
+ en_axis_data.increment = 2;
4981
+ break;
4982
+ case 5:
4983
+ en_axis_data.x_offset = 0;
4984
+ en_axis_data.z_offset = 2;
4985
+ en_axis_data.increment = 4;
4986
+ break;
4987
+ case 6:
4988
+ en_axis_data.y_offset = 0;
4989
+ en_axis_data.z_offset = 2;
4990
+ en_axis_data.increment = 4;
4991
+ break;
4992
+ case 7:
4993
+ en_axis_data.x_offset = 0;
4994
+ en_axis_data.y_offset = 2;
4995
+ en_axis_data.z_offset = 4;
4996
+ en_axis_data.increment = 6;
4997
+ break;
4998
+ default:
4999
+ en_axis_data.increment = 0;
5000
+ }
5001
+
5002
+ var fsr_mult = .00006;
5003
+ var fsr_text = "";
5004
+ switch(globalDevices[deviceAddr].fsr){
5005
+ case 0:
5006
+ fsr_mult = 0.00006;
5007
+ break;
5008
+ case 1:
5009
+ fsr_mult = 0.00012;
5010
+ break;
5011
+ case 2:
5012
+ fsr_mult = 0.00024;
5013
+ break;
5014
+ case 3:
5015
+ fsr_mult = 0.00049;
5016
+ break;
5017
+ }
5018
+ switch(globalDevices[deviceAddr].fsr){
5019
+ case 0:
5020
+ fsr_text = "2g";
5021
+ break;
5022
+ case 1:
5023
+ fsr_text = "4g";
5024
+ break;
5025
+ case 2:
5026
+ fsr_text = "8g";
5027
+ break;
5028
+ case 3:
5029
+ fsr_text = "16g";
5030
+ break;
5031
+ }
5032
+
5033
+ for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
5034
+ label++;
5035
+
5036
+ fft_concat[label] = {};
5037
+
5038
+ if('x_offset' in en_axis_data){
5039
+ 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));
5040
+ }
5041
+ if('y_offset' in en_axis_data){
5042
+ 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));
5043
+ }
5044
+ if('z_offset' in en_axis_data){
5045
+ 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));
5046
+ }
5047
+ }
5048
+ var fft_concat_obj = {
5049
+ time_id: globalDevices[deviceAddr].hour +':'+ globalDevices[deviceAddr].minute,
5050
+ mac_address: deviceAddr,
5051
+ en_axis: globalDevices[deviceAddr].en_axis,
5052
+ fsr: fsr_text,
5053
+ odr: globalDevices[deviceAddr].odr,
5054
+ device_temp: globalDevices[deviceAddr].device_temp,
5055
+ data: fft_concat
5056
+ };
5057
+ sensor_data = fft_concat_obj;
5058
+ delete globalDevices[deviceAddr];
5059
+ if(this.hasOwnProperty('failure_no')){
5060
+ console.log('####falure no');
5061
+ console.log(this.failure_no);
5062
+ }
5063
+
5064
+ return sensor_data;
5065
+ }
5066
+ else{
5067
+ return;
5068
+ }
5069
+ }else{
5070
+
5071
+ var mode = payload[8];
5072
+ var odr = payload[9];
5073
+ var en_axis = payload[10] & 7;
5074
+ var fsr = payload[10] >> 5;
5075
+ var device_temp = msbLsb(payload[13], payload[14])/100;
5076
+
5077
+
5078
+ switch(odr){
5079
+ case 6:
5080
+ odr = 50;
5081
+ break;
5082
+ case 7:
5083
+ odr = 100;
5084
+ break;
5085
+ case 8:
5086
+ odr = 200;
5087
+ break;
5088
+ case 9:
5089
+ odr = 400;
5090
+ break;
5091
+ case 10:
5092
+ odr = 800;
5093
+ break;
5094
+ case 11:
5095
+ odr = 1600;
5096
+ break;
5097
+ case 12:
5098
+ odr = 3200;
5099
+ break;
5100
+ case 13:
5101
+ odr = 6400;
5102
+ break;
5103
+ case 14:
5104
+ odr = 12800;
5105
+ break;
5106
+ case 15:
5107
+ odr = 25600;
5108
+ break;
5109
+ default:
5110
+ odr = 0;
5111
+ }
5112
+
5113
+ globalDevices[deviceAddr] = {
5114
+ // stream_size: expected_packets,
5115
+ data: {},
5116
+ odr: odr,
5117
+ mo: mode,
5118
+ en_axis: en_axis,
5119
+ fsr: fsr,
5120
+ hour: hour,
5121
+ minute: minute,
5122
+ device_temp: device_temp,
5123
+ }
5124
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
5125
+ return;
5126
+ }
5127
+ }
5128
+ else if(payload[8] === 0 || payload[8] === 2){
5129
+ // mode byte most significant bit will indicate fft data.
5130
+ // console.log(d);
5131
+ var odr;
5132
+ switch(payload[9]){
5133
+ case 6:
5134
+ odr = "50Hz"
5135
+ break;
5136
+ case 7:
5137
+ odr = "100Hz";
5138
+ break;
5139
+ case 8:
5140
+ odr = "200Hz";
5141
+ break;
5142
+ case 9:
5143
+ odr = "400Hz";
5144
+ break;
5145
+ case 10:
5146
+ odr = "800Hz";
5147
+ break;
5148
+ case 11:
5149
+ odr = "1600Hz";
5150
+ break;
5151
+ case 12:
5152
+ odr = "3200Hz";
5153
+ break;
5154
+ case 13:
5155
+ odr = "6400Hz";
5156
+ break;
5157
+ case 14:
5158
+ odr = "12800Hz";
5159
+ break;
5160
+ case 15:
5161
+ odr = "25600Hz";
5162
+ break;
5163
+ }
5164
+ return {
5165
+ mode: payload[8],
5166
+
5167
+ odr: odr,
5168
+ temperature: signInt(payload.slice(10, 12).reduce(msbLsb), 16) / 100,
5169
+
5170
+ x_rms_ACC_G: payload.slice(12, 14).reduce(msbLsb)/1000,
5171
+ x_max_ACC_G: payload.slice(14, 16).reduce(msbLsb)/1000,
5172
+ x_velocity_mm_sec: payload.slice(16, 18).reduce(msbLsb) / 100,
5173
+ x_displacement_mm: payload.slice(18, 20).reduce(msbLsb) / 100,
5174
+ x_peak_one_Hz: payload.slice(20, 22).reduce(msbLsb),
5175
+ x_peak_two_Hz: payload.slice(22, 24).reduce(msbLsb),
5176
+ x_peak_three_Hz: payload.slice(24, 26).reduce(msbLsb),
5177
+
5178
+ y_rms_ACC_G: payload.slice(26, 28).reduce(msbLsb)/1000,
5179
+ y_max_ACC_G: payload.slice(28, 30).reduce(msbLsb)/1000,
5180
+ y_velocity_mm_sec: payload.slice(30, 32).reduce(msbLsb) / 100,
5181
+ y_displacement_mm: payload.slice(32, 34).reduce(msbLsb) / 100,
5182
+ y_peak_one_Hz: payload.slice(34, 36).reduce(msbLsb),
5183
+ y_peak_two_Hz: payload.slice(36, 38).reduce(msbLsb),
5184
+ y_peak_three_Hz: payload.slice(38, 40).reduce(msbLsb),
5185
+
5186
+ z_rms_ACC_G: payload.slice(40, 42).reduce(msbLsb)/1000,
5187
+ z_max_ACC_G: payload.slice(42, 44).reduce(msbLsb)/1000,
5188
+ z_velocity_mm_sec: payload.slice(44, 46).reduce(msbLsb) / 100,
5189
+ z_displacement_mm: payload.slice(46, 48).reduce(msbLsb) / 100,
5190
+ z_peak_one_Hz: payload.slice(48, 50).reduce(msbLsb),
5191
+ z_peak_two_Hz: payload.slice(50, 52).reduce(msbLsb),
5192
+ z_peak_three_Hz: payload.slice(52, 54).reduce(msbLsb),
5193
+ };
5194
+ }
5195
+ // else{
5196
+ // parsed.data = {'error': 'Vibration mode error'}
5197
+ // return parsed;
5198
+ // }
5199
+ },
5200
+ 'parse_fly': (frame) => {
5201
+ let frame_data = {};
5202
+ switch(frame[16]){
5203
+ case 0:
5204
+ frame_data.mode = "Processed";
5205
+ break;
5206
+ case 1:
5207
+ frame_data.mode = "Raw";
5208
+ break;
5209
+ case 2:
5210
+ frame_data.mode = "Processed + Raw on demand";
5211
+ break;
5212
+ }
5213
+ switch(frame[17]){
5214
+ case 6:
5215
+ frame_data.odr_1 = 50;
5216
+ break;
5217
+ case 7:
5218
+ frame_data.odr_1 = 100;
5219
+ break;
5220
+ case 8:
5221
+ frame_data.odr_1 = 200;
5222
+ break;
5223
+ case 9:
5224
+ frame_data.odr_1 = 400;
5225
+ break;
5226
+ case 10:
5227
+ frame_data.odr_1 = 800;
5228
+ break;
5229
+ case 11:
5230
+ frame_data.odr_1 = 1600;
5231
+ break;
5232
+ case 12:
5233
+ frame_data.odr_1 = 3200;
5234
+ break;
5235
+ case 13:
5236
+ frame_data.odr_1 = 6400;
5237
+ break;
5238
+ case 14:
5239
+ frame_data.odr_1 = 12800;
5240
+ break;
5241
+ case 15:
5242
+ frame_data.odr_1 = 25600;
5243
+ break;
5244
+ }
5245
+ frame_data.sampling_duration_1 = frame[19]*50 + "ms";
5246
+ switch(frame[21]){
5247
+ case 0:
5248
+ frame_data.filter_status = "Disabled";
5249
+ break;
5250
+ case 1:
5251
+ frame_data.filter_status = "Enabled";
5252
+ break;
5253
+ }
5254
+ switch(frame[22]){
5255
+ case 0:
5256
+ frame_data.lpf_coeff_1 = 4;
5257
+ break;
5258
+ case 1:
5259
+ frame_data.lpf_coeff_1 = 8;
5260
+ break;
5261
+ case 2:
5262
+ frame_data.lpf_coeff_1 = 16;
5263
+ break;
5264
+ case 2:
5265
+ frame_data.lpf_coeff_1 = 32;
5266
+ break;
5267
+ case 4:
5268
+ frame_data.lpf_coeff_1 = 64;
5269
+ break;
5270
+ case 5:
5271
+ frame_data.lpf_coeff_1 = 128;
5272
+ break;
5273
+ case 6:
5274
+ frame_data.lpf_coeff_1 = 256;
5275
+ break;
5276
+ case 7:
5277
+ frame_data.lpf_coeff_1 = 512;
5278
+ break;
5279
+ case 8:
5280
+ frame_data.lpf_coeff_1 = 1024;
5281
+ break;
5282
+ case 9:
5283
+ frame_data.lpf_coeff_1 = 2048;
5284
+ break;
5285
+ }
5286
+ frame_data.lpf_freq_1 = frame_data.odr_1 / frame_data.lpf_coeff_1;
5287
+ switch(frame[24]){
5288
+ case 0:
5289
+ frame_data.hpf_coeff_1 = 4;
5290
+ break;
5291
+ case 1:
5292
+ frame_data.hpf_coeff_1 = 8;
5293
+ break;
5294
+ case 2:
5295
+ frame_data.hpf_coeff_1 = 16;
5296
+ break;
5297
+ case 2:
5298
+ frame_data.hpf_coeff_1 = 32;
5299
+ break;
5300
+ case 4:
5301
+ frame_data.hpf_coeff_1 = 64;
5302
+ break;
5303
+ case 5:
5304
+ frame_data.hpf_coeff_1 = 128;
5305
+ break;
5306
+ case 6:
5307
+ frame_data.hpf_coeff_1 = 256;
5308
+ break;
5309
+ case 7:
5310
+ frame_data.hpf_coeff_1 = 512;
5311
+ break;
5312
+ case 8:
5313
+ frame_data.hpf_coeff_1 = 1024;
5314
+ break;
5315
+ case 9:
5316
+ frame_data.hpf_coeff_1 = 2048;
5317
+ break;
5318
+ }
5319
+ frame_data.hpf_freq_1 = frame_data.odr_1 / frame_data.hpf_coeff_1;
5320
+ switch(frame[26]){
5321
+ case 0:
5322
+ frame_data.sampling_interval = "5 Minutes";
5323
+ break;
5324
+ case 1:
5325
+ frame_data.sampling_interval = "10 Minutes";
5326
+ break;
5327
+ case 2:
5328
+ frame_data.sampling_interval = "15 Minutes";
5329
+ break;
5330
+ case 2:
5331
+ frame_data.sampling_interval = "20 Minutes";
5332
+ break;
5333
+ case 4:
5334
+ frame_data.sampling_interval = "30 Minutes";
5335
+ break;
5336
+ case 5:
5337
+ frame_data.sampling_interval = "60 Minutes";
5338
+ break;
5339
+ case 6:
5340
+ frame_data.sampling_interval = "120 Minutes";
5341
+ break;
5342
+ case 7:
5343
+ frame_data.sampling_interval = "180 Minutes";
5344
+ break;
5345
+ case 8:
5346
+ frame_data.sampling_interval = "1 Minute";
5347
+ break;
5348
+ }
5349
+ frame_data.on_request_timeout = frame[27] + " Seconds";
5350
+ frame_data.deadband = frame[28] + "mg";
5351
+
5352
+ switch(frame[29]){
5353
+ case 0:
5354
+ frame_data.payload_length = "50 Bytes";
5355
+ break;
5356
+ case 1:
5357
+ frame_data.payload_length = "100 Bytes";
5358
+ break;
5359
+ case 2:
5360
+ frame_data.payload_length = "150 Bytes";
5361
+ break;
5362
+ case 3:
5363
+ frame_data.payload_length = "180 Bytes";
5364
+ break;
5365
+ }
5366
+
5367
+ return {
5368
+ 'firmware': frame[2],
5369
+ 'destination_address': toMac(frame.slice(12, 16)),
5370
+ 'mode': frame_data.mode,
5371
+ 'odr_1': frame_data.odr_1+'Hz',
5372
+ 'sampling_duration_1': frame_data.sampling_duration_1,
5373
+ 'sampling_duration_2': frame_data.sampling_duration_2,
5374
+ 'filter_status': frame_data.filter_status,
5375
+ 'lpf_coeff_1': frame_data.lpf_coeff_1,
5376
+ 'lpf_freq_1': frame_data.lpf_freq_1+'Hz',
5377
+ 'hpf_coeff_1': frame_data.hpf_coeff_1,
5378
+ 'hpf_freq_1': frame_data.hpf_freq_1+'Hz',
5379
+ 'sampling_interval': frame_data.sampling_interval,
5380
+ 'on_request_timeout': frame_data.on_request_timeout,
5381
+ 'deadband': frame_data.deadband,
5382
+ 'payload_length': frame_data.payload_length,
5383
+ 'machine_values': {
5384
+ 'firmware': frame[2],
5385
+ 'destination_address': toMac(frame.slice(12, 16), false),
5386
+ 'mode': frame[16],
5387
+ 'odr_1': frame[17],
5388
+ 'sampling_duration_1': frame[19],
5389
+ 'sampling_duration_2': frame[20],
5390
+ 'filter_status': frame[21],
5391
+ 'lpf_coeff_1': frame[22],
5392
+ 'hpf_coeff_1': frame[24],
5393
+ 'sampling_interval': frame[26],
5394
+ 'on_request_timeout': frame[27],
5395
+ 'deadband': frame[28],
5396
+ 'payload_length': frame[29]
5397
+ }
5398
+ }
5399
+ }
5400
+ },
5401
+ '88': {
5402
+ name: '1 Channel Ultrasound Vibration Sensor',
5403
+ parse: (d) => {
5404
+ return {
5405
+ raw_adc: d.slice(0, 2).reduce(msbLsb),
5406
+ ma: d.slice(2, 4).reduce(msbLsb) / 100,
5407
+ db: d.slice(4, 6).reduce(msbLsb) / 100
5408
+ };
5409
+ }
5410
+ },
5411
+ '89': {
5412
+ name: '2 Channel Ultrasound Vibration Sensor',
5413
+ parse: (d) => {
5414
+ return {
5415
+ c1_raw_adc: d.slice(0, 2).reduce(msbLsb),
5416
+ c1_ma: d.slice(2, 4).reduce(msbLsb) / 100,
5417
+ c1_db: d.slice(4, 6).reduce(msbLsb) / 100,
5418
+ c2_raw_adc: d.slice(6, 8).reduce(msbLsb),
5419
+ c2_ma: d.slice(8, 10).reduce(msbLsb) / 100,
5420
+ c2_db: d.slice(10, 12).reduce(msbLsb) / 100
5421
+ };
5422
+ }
5423
+ },
5424
+ '90': {
5425
+ name: 'DC Current Sensor',
5426
+ parse: (d) => {
5427
+ return {
5428
+ raw_adc: d.slice(0, 2).reduce(msbLsb),
5429
+ amps: d.slice(2, 6).reduce(msbLsb) / 10,
5430
+ };
5431
+ }
5432
+ },
5433
+ '91': {
5434
+ name: 'Wireless Air Velocity Sensor HVAC',
5435
+ parse: (d) => {
5436
+ return {
5437
+ velocity_mps: signInt(msbLsb(d[0], d[1]), 16) / 1000
5438
+ };
5439
+ }
5440
+ },
5441
+ '92': {
5442
+ name: 'Sound Sensor',
5443
+ parse: (d) => {
5444
+ return {
5445
+ sound: signInt(d[3], 8)/100
5446
+ };
5447
+ }
5448
+ },
5449
+ '95': {
5450
+ name: '16-Bit 1-Channel 0-24VDC Receiver',
5451
+ parse: (d) => {
5452
+ return {
5453
+ adc: signInt(d.slice(0, 2).reduce(msbLsb), 16),
5454
+ vdc: signInt(d.slice(2, 4).reduce(msbLsb), 16)/100
5455
+ };
5456
+ }
5457
+ },
5458
+ '96': {
5459
+ name: '16-Bit 1-Channel 0-48VDC Receiver',
5460
+ parse: (d) => {
5461
+ return {
5462
+ adc: signInt(d.slice(0, 2).reduce(msbLsb), 16),
5463
+ vdc: signInt(d.slice(2, 4).reduce(msbLsb), 16)/100
5464
+ };
5465
+ }
5466
+ },
5467
+ '101':{
5468
+ name: 'Pro Vibration',
5469
+ parse: (d, full)=>{
5470
+ return{
5471
+ mode: full[7] == 1? "raw" : "normal"
5472
+ };
5473
+ }
5474
+ },
5475
+ '105': {
5476
+ name: '1 Channel Automatic Luber With Ultrasound Vibration Sensor',
5477
+ parse: (d) => {
5478
+ return {
5479
+ raw_adc: d.slice(0, 2).reduce(msbLsb),
5480
+ ma: d.slice(2, 4).reduce(msbLsb) / 100,
5481
+ db: d.slice(4, 6).reduce(msbLsb) / 100
5482
+ };
5483
+ }
5484
+ },
5485
+ '106': {
5486
+ name: '2 Channel Automatic Luber With Ultrasound Vibration Sensor',
2628
5487
  parse: (d) => {
2629
5488
  return {
2630
- humidity: msbLsb(d[0], d[1])/100,
2631
- temperature: signInt((msbLsb(d[2], d[3])), 16)/100,
2632
- co_ppm: msbLsb(d[4], d[5])
5489
+ c1_raw_adc: d.slice(0, 2).reduce(msbLsb),
5490
+ c1_ma: d.slice(2, 4).reduce(msbLsb) / 100,
5491
+ c1_db: d.slice(4, 6).reduce(msbLsb) / 100,
5492
+ c2_raw_adc: d.slice(6, 8).reduce(msbLsb),
5493
+ c2_ma: d.slice(8, 10).reduce(msbLsb) / 100,
5494
+ c2_db: d.slice(10, 12).reduce(msbLsb) / 100
2633
5495
  };
2634
5496
  }
2635
5497
  },
2636
- '77': {
2637
- name: '3 Channel SDI-12 Wireelss',
5498
+ '107': {
5499
+ name: '16-Bit 4-Channel 4-20mA',
2638
5500
  parse: (d) => {
5501
+ var adc1 = signInt(d.slice(0, 2).reduce(msbLsb));
5502
+ var adc2 = signInt(d.slice(2, 4).reduce(msbLsb));
5503
+ var adc3 = signInt(d.slice(4, 6).reduce(msbLsb));
5504
+ var adc4 = signInt(d.slice(6, 8).reduce(msbLsb));
5505
+ var ma1 = (signInt(d.slice(8, 10).reduce(msbLsb)))/100.0;
5506
+ var ma2 = (signInt(d.slice(10, 12).reduce(msbLsb)))/100.0;
5507
+ var ma3 = (signInt(d.slice(12, 14).reduce(msbLsb)))/100.0;
5508
+ var ma4 = (signInt(d.slice(14, 16).reduce(msbLsb)))/100.0;
2639
5509
  return {
2640
- Temperature_1: signInt(d.slice(0, 2).reduce(msbLsb), 16)/100,
2641
- Soil_Moisture_1: signInt(d.slice(2, 4).reduce(msbLsb), 16)/100,
2642
- Bulk_EC_1: signInt(d.slice(4, 6).reduce(msbLsb), 16),
2643
- Pore_EC_1: signInt(d.slice(6, 8).reduce(msbLsb), 16),
2644
- Permittivity_1: signInt(d.slice(8, 10).reduce(msbLsb), 16)/100,
2645
- Temperature_2: signInt(d.slice(10, 12).reduce(msbLsb), 16)/100,
2646
- Soil_Moisture_2: signInt(d.slice(12, 14).reduce(msbLsb), 16)/100,
2647
- Bulk_EC_2: signInt(d.slice(14, 16).reduce(msbLsb), 16),
2648
- Pore_EC_2: signInt(d.slice(16, 18).reduce(msbLsb), 16),
2649
- Permittivity_2: signInt(d.slice(18, 20).reduce(msbLsb), 16)/100,
2650
- Temperature_3: signInt(d.slice(20, 22).reduce(msbLsb), 16)/100,
2651
- Soil_Moisture_3: signInt(d.slice(22, 24).reduce(msbLsb), 16)/100,
2652
- Bulk_EC_3: signInt(d.slice(24, 26).reduce(msbLsb), 16),
2653
- Pore_EC_3: signInt(d.slice(26, 28).reduce(msbLsb), 16),
2654
- Permittivity_3: signInt(d.slice(28, 30).reduce(msbLsb), 16)/100
5510
+ adc1: adc1,
5511
+ adc2: adc2,
5512
+ adc3: adc3,
5513
+ adc4: adc4,
5514
+ ma1: ma1,
5515
+ ma2: ma2,
5516
+ ma3: ma3,
5517
+ ma4: ma4
2655
5518
  };
2656
5519
  }
2657
5520
  },
2658
- '78': {
2659
- name: 'Oil Particulate Counter Sensor',
2660
- parse: (d, original_payload) => {
2661
- if(original_payload[1] <= 3){
2662
- return {
2663
- ferro_particles_30_50_um: d.slice(0, 4).reduce(msbLsb)/100,
2664
- ferro_particles_50_100_um: d.slice(4, 8).reduce(msbLsb)/100,
2665
- ferro_particles_100_200_um: d.slice(8, 12).reduce(msbLsb)/100,
2666
- ferro_particles_200_400_um: d.slice(12, 16).reduce(msbLsb)/100,
2667
- ferro_particles_400_800_um: d.slice(16, 20).reduce(msbLsb)/100,
2668
- ferro_particles_gt_800_um: d.slice(20, 24).reduce(msbLsb)/100,
2669
- ferro_particles_total: d.slice(24, 28).reduce(msbLsb)/100,
2670
- non_ferro_particles_120_200_um: d.slice(28, 32).reduce(msbLsb)/100,
2671
- non_ferro_particles_200_400_um: d.slice(32, 36).reduce(msbLsb)/100,
2672
- non_ferro_particles_400_800_um: d.slice(36, 40).reduce(msbLsb)/100
2673
- };
2674
- }else{
2675
- return {
2676
- ferro_particles_30_50_um: d.slice(0, 4).reduce(msbLsb)/100,
2677
- ferro_particles_50_100_um: d.slice(4, 8).reduce(msbLsb)/100,
2678
- ferro_particles_100_200_um: d.slice(8, 12).reduce(msbLsb)/100,
2679
- ferro_particles_200_400_um: d.slice(12, 16).reduce(msbLsb)/100,
2680
- ferro_particles_400_800_um: d.slice(16, 20).reduce(msbLsb)/100,
2681
- ferro_particles_gt_800_um: d.slice(20, 24).reduce(msbLsb)/100,
2682
- ferro_particles_total: d.slice(24, 28).reduce(msbLsb)/100,
2683
- non_ferro_particles_120_200_um: d.slice(28, 32).reduce(msbLsb)/100,
2684
- non_ferro_particles_200_400_um: d.slice(32, 36).reduce(msbLsb)/100,
2685
- non_ferro_particles_400_800_um: d.slice(36, 40).reduce(msbLsb)/100,
2686
- non_ferro_particles_800_1600_um: d.slice(40, 44).reduce(msbLsb)/100,
2687
- non_ferro_particles_gt_1600_um: d.slice(44, 48).reduce(msbLsb)/100,
2688
- non_ferro_particles_total: d.slice(48, 52).reduce(msbLsb)/100,
2689
- ferro_particles_total_24h: d.slice(52, 56).reduce(msbLsb)/100,
2690
- non_ferro_particles_total_24h: d.slice(56, 60).reduce(msbLsb)/100,
2691
- ferro_concentration: d.slice(60, 64).reduce(msbLsb)/100,
2692
- non_ferro_concentration: d.slice(64, 68).reduce(msbLsb)/100,
2693
- flow: d.slice(68, 72).reduce(msbLsb)/100,
2694
- };
5521
+ '108': {
5522
+ name: 'Machine Uptime Monitoring Sensor',
5523
+ parse: (d, payload) => {
5524
+ if(payload[7] & 2 != 0){
5525
+ console.log('Error found');
5526
+ // parsed.data = {error: 'Error found, Acclerometer Probe may be unattached'};
5527
+ let error = {error: 'Error found, Acclerometer Probe may be unattached'};
5528
+ return error;
2695
5529
  }
2696
- }
2697
- },
2698
- '79': {
2699
- name: 'Oil Analysis Sensor',
2700
- parse: (d) => {
2701
5530
  return {
2702
- dynamic_viscosity: signInt(d.slice(0, 4).reduce(msbLsb), 32) / 100,
2703
- density: signInt(d.slice(4, 8).reduce(msbLsb), 32) / 100,
2704
- dialectric_constant: signInt(d.slice(8, 12).reduce(msbLsb), 32) / 100,
2705
- temperature: signInt(d.slice(12, 16).reduce(msbLsb), 32) / 100,
2706
- saturability: signInt(d.slice(16, 20).reduce(msbLsb), 32) / 100,
2707
- moisture_content: signInt(d.slice(20, 24).reduce(msbLsb), 32) / 100,
2708
- water_content: signInt(d.slice(24, 28).reduce(msbLsb), 32) / 100,
2709
- kinematic_viscosity_40c: signInt(d.slice(28, 32).reduce(msbLsb), 32) / 100,
2710
- kinematic_viscosity_100c: signInt(d.slice(32, 36).reduce(msbLsb), 32) / 100
5531
+ digital_input_1_counter: d.slice(0, 4).reduce(msbLsb),
5532
+ digital_input_1_uptime: d.slice(4, 8).reduce(msbLsb),
5533
+ digital_input_2_counter: d.slice(8, 12).reduce(msbLsb),
5534
+ digital_input_2_uptime: d.slice(12, 16).reduce(msbLsb),
5535
+ digital_input_3_counter: d.slice(16, 20).reduce(msbLsb),
5536
+ digital_input_3_uptime: d.slice(20, 24).reduce(msbLsb),
5537
+ accelerometer_counter: d.slice(24, 28).reduce(msbLsb),
5538
+ accelerometer_uptime: d.slice(28, 32).reduce(msbLsb),
5539
+ magnetometer_counter: d.slice(32, 36).reduce(msbLsb),
5540
+ magnetometer_uptime: d.slice(36, 40).reduce(msbLsb)
2711
5541
  };
2712
5542
  }
2713
5543
  },
2714
- '80': {
2715
- name: 'One Channel Vibration Plus',
5544
+ '110': {
5545
+ name: 'One Channel Vibration Plus v4',
2716
5546
  parse: (payload, parsed, mac) => {
2717
5547
  if(payload[7] >> 1 != 0){
2718
5548
  console.log('Error found');
@@ -3322,8 +6152,8 @@ function sensor_types(parent){
3322
6152
  }
3323
6153
  }
3324
6154
  },
3325
- '81': {
3326
- name: 'Two Channel Vibration Plus',
6155
+ '111': {
6156
+ name: 'Two Channel Vibration Plus v4',
3327
6157
  parse: (payload, parsed, mac) => {
3328
6158
  parsed.data = {};
3329
6159
  if(payload[7] & 2){
@@ -4124,8 +6954,8 @@ function sensor_types(parent){
4124
6954
  }
4125
6955
  }
4126
6956
  },
4127
- '82': {
4128
- name: 'Condition Based/Predictive Maintenance Sensor',
6957
+ '112': {
6958
+ name: 'Condition Based/Predictive Maintenance Sensor v4',
4129
6959
  parse: (payload, parsed, mac) => {
4130
6960
  if(payload[7] >> 1 != 0){
4131
6961
  console.log('Error found');
@@ -4740,9 +7570,8 @@ function sensor_types(parent){
4740
7570
  }
4741
7571
  }
4742
7572
  },
4743
-
4744
- '84': {
4745
- name: 'Type 84 - Standalone Smart Vibration Sensor',
7573
+ '114': {
7574
+ name: 'Standalone Smart Vibration Sensor v4',
4746
7575
  parse: (payload, parsed, mac) => {
4747
7576
  if(payload[7] >> 1 != 0){
4748
7577
  console.log('Error found');
@@ -5351,124 +8180,17 @@ function sensor_types(parent){
5351
8180
  }
5352
8181
  }
5353
8182
  },
5354
- '88': {
5355
- name: '1 Channel Ultrasound Vibration Sensor',
5356
- parse: (d) => {
5357
- return {
5358
- raw_adc: d.slice(0, 2).reduce(msbLsb),
5359
- ma: d.slice(2, 4).reduce(msbLsb) / 100,
5360
- db: d.slice(4, 6).reduce(msbLsb) / 100
5361
- };
5362
- }
5363
- },
5364
- '89': {
5365
- name: '2 Channel Ultrasound Vibration Sensor',
5366
- parse: (d) => {
5367
- return {
5368
- c1_raw_adc: d.slice(0, 2).reduce(msbLsb),
5369
- c1_ma: d.slice(2, 4).reduce(msbLsb) / 100,
5370
- c1_db: d.slice(4, 6).reduce(msbLsb) / 100,
5371
- c2_raw_adc: d.slice(6, 8).reduce(msbLsb),
5372
- c2_ma: d.slice(8, 10).reduce(msbLsb) / 100,
5373
- c2_db: d.slice(10, 12).reduce(msbLsb) / 100
5374
- };
5375
- }
5376
- },
5377
- '90': {
5378
- name: 'DC Current Sensor',
5379
- parse: (d) => {
5380
- return {
5381
- raw_adc: d.slice(0, 2).reduce(msbLsb),
5382
- amps: d.slice(2, 6).reduce(msbLsb) / 10,
5383
- };
5384
- }
5385
- },
5386
- '91': {
5387
- name: 'Wireless Air Velocity Sensor HVAC',
5388
- parse: (d) => {
5389
- return {
5390
- velocity_mps: signInt(msbLsb(d[0], d[1]), 16) / 1000
5391
- };
5392
- }
5393
- },
5394
- '92': {
5395
- name: 'Sound Sensor',
5396
- parse: (d) => {
5397
- return {
5398
- sound: signInt(d[3], 8)/100
5399
- };
5400
- }
5401
- },
5402
- '95': {
5403
- name: '16-Bit 1-Channel 0-24VDC Receiver',
5404
- parse: (d) => {
5405
- return {
5406
- adc: signInt(d.slice(0, 2).reduce(msbLsb), 16),
5407
- vdc: signInt(d.slice(2, 4).reduce(msbLsb), 16)/100
5408
- };
5409
- }
5410
- },
5411
- '96': {
5412
- name: '16-Bit 1-Channel 0-48VDC Receiver',
5413
- parse: (d) => {
5414
- return {
5415
- adc: signInt(d.slice(0, 2).reduce(msbLsb), 16),
5416
- vdc: signInt(d.slice(2, 4).reduce(msbLsb), 16)/100
5417
- };
5418
- }
5419
- },
5420
- '101':{
5421
- name: 'Pro Vibration',
5422
- parse: (d, full)=>{
5423
- return{
5424
- mode: full[7] == 1? "raw" : "normal"
5425
- };
5426
- }
5427
- },
5428
- '107': {
5429
- name: '16-Bit 4-Channel 4-20mA',
5430
- parse: (d) => {
5431
- var adc1 = signInt(d.slice(0, 2).reduce(msbLsb));
5432
- var adc2 = signInt(d.slice(2, 4).reduce(msbLsb));
5433
- var adc3 = signInt(d.slice(4, 6).reduce(msbLsb));
5434
- var adc4 = signInt(d.slice(6, 8).reduce(msbLsb));
5435
- var ma1 = (signInt(d.slice(8, 10).reduce(msbLsb)))/100.0;
5436
- var ma2 = (signInt(d.slice(10, 12).reduce(msbLsb)))/100.0;
5437
- var ma3 = (signInt(d.slice(12, 14).reduce(msbLsb)))/100.0;
5438
- var ma4 = (signInt(d.slice(14, 16).reduce(msbLsb)))/100.0;
5439
- return {
5440
- adc1: adc1,
5441
- adc2: adc2,
5442
- adc3: adc3,
5443
- adc4: adc4,
5444
- ma1: ma1,
5445
- ma2: ma2,
5446
- ma3: ma3,
5447
- ma4: ma4
5448
- };
8183
+
8184
+ '180': {
8185
+ name: 'C1D2 One Channel Vibration Plus',
8186
+ parse: (payload, parsed, mac) => {
8187
+ return parent.sensor_types[80].parse(payload, parsed, mac);
5449
8188
  }
5450
8189
  },
5451
- '108': {
5452
- name: 'Machine Uptime Monitoring Sensor',
5453
- parse: (d, payload) => {
5454
- if(payload[7] & 2 != 0){
5455
- console.log('Error found');
5456
- // parsed.data = {error: 'Error found, Acclerometer Probe may be unattached'};
5457
- let error = {error: 'Error found, Acclerometer Probe may be unattached'};
5458
- return error;
5459
- }
5460
- return {
5461
- digital_input_1_counter: d.slice(0, 4).reduce(msbLsb),
5462
- digital_input_1_uptime: d.slice(4, 8).reduce(msbLsb),
5463
- digital_input_2_counter: d.slice(8, 12).reduce(msbLsb),
5464
- digital_input_2_uptime: d.slice(12, 16).reduce(msbLsb),
5465
- digital_input_3_counter: d.slice(16, 20).reduce(msbLsb),
5466
- digital_input_3_uptime: d.slice(20, 24).reduce(msbLsb),
5467
- accelerometer_counter: d.slice(24, 28).reduce(msbLsb),
5468
- accelerometer_uptime: d.slice(28, 32).reduce(msbLsb),
5469
- magnetometer_counter: d.slice(32, 36).reduce(msbLsb),
5470
- magnetometer_uptime: d.slice(36, 40).reduce(msbLsb)
5471
- };
8190
+ '181': {
8191
+ name: 'C1D2 Two Channel Vibration Plus',
8192
+ parse: (payload, parsed, mac) => {
8193
+ return parent.sensor_types[81].parse(payload, parsed, mac);
5472
8194
  }
5473
8195
  },
5474
8196
  '180': {
@@ -6394,13 +9116,13 @@ function sensor_types(parent){
6394
9116
  name: 'Type 521 - 3 Channel Light Sensor',
6395
9117
  parse: (payload, parsed) => {
6396
9118
  return {
6397
- lux_1: payload.slice(0, 2).reduce(msbLsb)/100,
9119
+ lux_1: payload.slice(0, 2).reduce(msbLsb),
6398
9120
  temp_1: payload.slice(2, 4).reduce(msbLsb)/100,
6399
9121
  ext_temp_1: payload.slice(4, 6).reduce(msbLsb)/100,
6400
- lux_2: payload.slice(6, 8).reduce(msbLsb)/100,
9122
+ lux_2: payload.slice(6, 8).reduce(msbLsb),
6401
9123
  temp_2: payload.slice(8, 10).reduce(msbLsb)/100,
6402
9124
  ext_temp_2: payload.slice(10, 12).reduce(msbLsb)/100,
6403
- lux_3: payload.slice(12, 14).reduce(msbLsb)/100,
9125
+ lux_3: payload.slice(12, 14).reduce(msbLsb),
6404
9126
  temp_3: payload.slice(14, 16).reduce(msbLsb)/100,
6405
9127
  ext_temp_3: payload.slice(16, 18).reduce(msbLsb)/100
6406
9128
  }
@@ -7073,10 +9795,27 @@ function sensor_types(parent){
7073
9795
  name: 'RS-485 Modbus Wireless Converter',
7074
9796
  parse: (d) => {
7075
9797
  return {
7076
- data: d
9798
+ subdevice_type: d[0],
9799
+ number_of_registers: d[1],
9800
+ // TODO we can automatically determine how many registers are here based on the number_of_registers and create data objects appropriately
9801
+ // r1: d.slice(2,4),
9802
+ // r2: d.slice(4,6),
9803
+ // r3: d.slice(6,8),
9804
+ // r4: d.slice(8,10),
9805
+ data: d.slice(2)
7077
9806
  };
7078
9807
  },
7079
9808
  },
9809
+ '540': {
9810
+ name: 'Wireless Ultrasonic Flow Meter FD-Q32C',
9811
+ parse: (d) => {
9812
+ return {
9813
+ raw_adc: d.slice(0, 2).reduce(msbLsb),
9814
+ ma: d.slice(2, 4).reduce(msbLsb) / 100,
9815
+ flow_ltr_min: d.slice(4, 8).reduce(msbLsb) / 100
9816
+ };
9817
+ }
9818
+ },
7080
9819
  '10000': {
7081
9820
  name: '4-Relay',
7082
9821
  parse: (d) => {