@ncd-io/node-red-enterprise-sensors 1.4.7 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -160,7 +160,7 @@ module.exports = class WirelessSensor{
160
160
  }
161
161
  }
162
162
  // #OTF
163
- var otf_devices = [4,12,21,23,26,29,32,33,39,44,45,48,52,53,54,55,56,58,74,76,78,79,80,81,82,84,88,89,90,91,97,98,101,102,103,105,106,107,108,109,110,111,112,114,117,118,119,120,121,122,123,124,180,181,202,217,211,270,519,520,521,531,535,536,537,538,539,540,541,542,543,1010,1011];
163
+ var otf_devices = [4,12,21,23,26,29,32,33,39,44,45,48,52,53,54,55,56,58,74,76,78,79,80,81,82,84,88,89,90,91,97,98,101,102,103,105,106,107,108,109,110,111,112,114,117,118,119,120,121,122,123,124,180,181,202,217,211,270,519,520,521,531,535,536,537,538,539,540,541,542,543,545,1010,1011];
164
164
  var device_type = msbLsb(frame.data[6], frame.data[7]);
165
165
  // var device_type = frame.data[7];
166
166
 
@@ -361,7 +361,7 @@ module.exports = class WirelessSensor{
361
361
  };
362
362
 
363
363
  // #OTF
364
- var otf_devices = [4,12,21,23,26,29,32,33,39,44,45,48,52,53,54,55,56,58,74,76,78,79,80,81,82,84,88,89,90,91,97,98,101,102,103,105,106,107,108,109,110,111,112,114,117,118,119,120,121,122,123,124,180,181,202,211,217,270,519,520,521,531,535,536,537,538,539,540,541,542,543,1010,1011];
364
+ var otf_devices = [4,12,21,23,26,29,32,33,39,44,45,48,52,53,54,55,56,58,74,76,78,79,80,81,82,84,88,89,90,91,97,98,101,102,103,105,106,107,108,109,110,111,112,114,117,118,119,120,121,122,123,124,180,181,202,211,217,270,519,520,521,531,535,536,537,538,539,540,541,542,543,545,1010,1011];
365
365
  if(otf_devices.includes(parsed.sensor_type)){
366
366
  // If the message says FLY and there is not FLY timer in progress.
367
367
  if(payload[8] == 70 && payload[9] == 76 && payload[10] == 89) {
@@ -783,7 +783,7 @@ module.exports = class WirelessSensor{
783
783
  data: payload.slice(8)
784
784
  };
785
785
  // #OTF
786
- }else if(parsed.sensor_type == 21 || parsed.sensor_type == 33 || parsed.sensor_type == 39 || parsed.sensor_type == 29 || parsed.sensor_type == 54 || parsed.sensor_type == 55 || parsed.sensor_type == 80 || parsed.sensor_type == 81 || parsed.sensor_type == 82 || parsed.sensor_type == 84 || parsed.sensor_type == 97 || parsed.sensor_type == 98 || parsed.sensor_type == 103 || parsed.sensor_type == 110 || parsed.sensor_type == 111 || parsed.sensor_type == 112 || parsed.sensor_type == 114 || parsed.sensor_type == 117 || parsed.sensor_type == 118 || parsed.sensor_type == 180 || parsed.sensor_type == 181 || parsed.sensor_type == 202 || parsed.sensor_type == 217 || parsed.sensor_type == 515 || parsed.sensor_type == 519 || parsed.sensor_type == 531 || parsed.sensor_type == 537 || parsed.sensor_type == 538 || parsed.sensor_type == 543){
786
+ }else if(parsed.sensor_type == 21 || parsed.sensor_type == 33 || parsed.sensor_type == 39 || parsed.sensor_type == 29 || parsed.sensor_type == 54 || parsed.sensor_type == 55 || parsed.sensor_type == 80 || parsed.sensor_type == 81 || parsed.sensor_type == 82 || parsed.sensor_type == 84 || parsed.sensor_type == 97 || parsed.sensor_type == 98 || parsed.sensor_type == 103 || parsed.sensor_type == 110 || parsed.sensor_type == 111 || parsed.sensor_type == 112 || parsed.sensor_type == 114 || parsed.sensor_type == 117 || parsed.sensor_type == 118 || parsed.sensor_type == 180 || parsed.sensor_type == 181 || parsed.sensor_type == 202 || parsed.sensor_type == 217 || parsed.sensor_type == 515 || parsed.sensor_type == 519 || parsed.sensor_type == 531 || parsed.sensor_type == 537 || parsed.sensor_type == 538 || parsed.sensor_type == 543 || parsed.sensor_type == 545){
787
787
  parsed.sensor_data = this.sensor_types[parsed.sensor_type].parse(payload, parsed, frame.mac);
788
788
  if(!parsed.sensor_data){
789
789
  return;
@@ -848,15 +848,28 @@ module.exports = class WirelessSensor{
848
848
  return config_set_destination(sensor_mac, 0x0000FFFF);
849
849
  }
850
850
  config_set_destination(sensor_mac, modem_mac){
851
+ console.log('config_set_destination');
852
+ console.log(modem_mac);
851
853
  var packet = [247, 3, 0, 0, 0];
852
854
  var bytes = int2Bytes(modem_mac, 4);
853
855
  packet.push(...bytes);
856
+ console.log(packet);
854
857
  return this.config_send(sensor_mac, packet);
855
858
  }
856
859
  config_set_id_delay(sensor_mac, node_id, delay_s){
860
+ console.log('config_set_id_delay');
857
861
  var packet = [247, 2, 0, 0, 0, node_id];
858
862
  var delay_b = int2Bytes(delay_s, 3);
859
863
  packet.push(...delay_b);
864
+ console.log(packet);
865
+ return this.config_send(sensor_mac, packet);
866
+ }
867
+ config_set_only_delay(sensor_mac, delay_s){
868
+ console.log('config_set_only_delay');
869
+ var packet = [247, 2, 0, 0, 0, 0];
870
+ var delay_b = int2Bytes(delay_s, 3);
871
+ packet.push(...delay_b);
872
+ console.log(packet);
860
873
  return this.config_send(sensor_mac, packet);
861
874
  }
862
875
  config_set_power(sensor_mac, pwr){
@@ -1329,8 +1342,8 @@ module.exports = class WirelessSensor{
1329
1342
  }
1330
1343
  config_set_counter_threshold_108(sensor_mac, value){
1331
1344
  console.log('config_set_counter_threshold_108');
1332
- var packet = [244, 43, 0, 0, 0, 0, 0];
1333
- let threshold = int2Bytes((value), 2);
1345
+ var packet = [244, 43, 0, 0, 0];
1346
+ let threshold = int2Bytes((value), 4);
1334
1347
  packet.push(...threshold);
1335
1348
  console.log(packet);
1336
1349
  return this.config_send(sensor_mac, packet);
@@ -2517,6 +2530,46 @@ module.exports = class WirelessSensor{
2517
2530
  console.log(packet);
2518
2531
  return this.config_send(sensor_mac, packet);
2519
2532
  }
2533
+ config_set_max_num_motion_103(sensor_mac, value){
2534
+ console.log('config_set_max_num_motion_103');
2535
+ let packet = [244, 79, 0, 0, 101, 33, value];
2536
+ console.log(packet);
2537
+ return this.config_send(sensor_mac, packet);
2538
+ }
2539
+ config_set_acc_output_data_rate_103(sensor_mac, value){
2540
+ console.log('config_set_acc_output_data_rate_103');
2541
+ let packet = [244, 79, 0, 0, 101, 25, value];
2542
+ console.log(packet);
2543
+ return this.config_send(sensor_mac, packet);
2544
+ }
2545
+ config_set_temperature_unit_545(sensor_mac, value){
2546
+ console.log('config_set_temperature_unit_545');
2547
+ let packet = [244, 37, 0, 0, 0, value];
2548
+ console.log(packet);
2549
+ return this.config_send(sensor_mac, packet);
2550
+ }
2551
+ config_set_flow_unit_545(sensor_mac, value){
2552
+ console.log('config_set_flow_unit_545');
2553
+ let packet = [244, 38, 0, 0, 0, value];
2554
+ console.log(packet);
2555
+ return this.config_send(sensor_mac, packet);
2556
+ }
2557
+ config_set_gas_type_545(sensor_mac, value){
2558
+ console.log('config_set_gas_type_545');
2559
+ let packet = [244, 34, 0, 0, 0, value];
2560
+ console.log(packet);
2561
+ return this.config_send(sensor_mac, packet);
2562
+ }
2563
+ config_set_gas_type_mix_545(sensor_mac, num, gas_type, percentage){
2564
+ console.log('config_set_gas_type_mix_545');
2565
+ var packet = [244, 35, 0, 0, 0];
2566
+ for(let index = 0; index < num; index++){
2567
+ packet.push(...int2Bytes(gas_type[index], 1));
2568
+ packet.push(...int2Bytes(percentage[index]*100, 2));
2569
+ }
2570
+ console.log(packet);
2571
+ return this.config_send(sensor_mac, packet);
2572
+ }
2520
2573
  config_get_delay(sensor_mac){
2521
2574
  return new Promise((fulfill, reject) => {
2522
2575
  this.config_send(sensor_mac, [247, 21, 0, 0, 0]).then((res) => {
@@ -3597,8 +3650,8 @@ function sensor_types(parent){
3597
3650
  return {
3598
3651
  'firmware': frame[2],
3599
3652
  'fsr': frame_data.fsr,
3600
- 'boot_time': frame[17] + " sec",
3601
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
3653
+ 'boot_up_time': frame[17] + " sec",
3654
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
3602
3655
  'auto_check_interval': frame_data.auto_check_interval,
3603
3656
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
3604
3657
  'always_on': frame_data.always_on,
@@ -3611,8 +3664,8 @@ function sensor_types(parent){
3611
3664
  'machine_values': {
3612
3665
  'firmware': frame[2],
3613
3666
  'fsr': frame[16],
3614
- 'boot_time': frame[17],
3615
- 'power_adc': frame.slice(18, 20),
3667
+ 'boot_up_time': frame[17],
3668
+ 'adc_pin_reading': frame.slice(18, 20),
3616
3669
  'auto_check_interval': frame.slice(20, 22),
3617
3670
  'auto_check_percentage': frame.slice(22, 24),
3618
3671
  'always_on': frame[24],
@@ -4108,13 +4161,14 @@ function sensor_types(parent){
4108
4161
  name: 'RTD Temperature Sensor',
4109
4162
  parse: (payload, parsed, mac) => {
4110
4163
  if(parsed.firmware > 5){
4164
+ let reserved = payload[7] >> 1; // Fault status (1-bit left shifted)
4111
4165
  let fault_status = '';
4112
- if (payload[7] === 0) {
4166
+ if (reserved === 0) {
4113
4167
  fault_status = 'data_valid';
4114
- } else if (payload[7] === 15) {
4168
+ } else if (reserved === 15) {
4115
4169
  fault_status = 'data_invalid';
4116
4170
  } else {
4117
- const faultTypeBits = payload[7] & 0b00111100;
4171
+ const faultTypeBits = reserved & 0b00111100;
4118
4172
  switch (faultTypeBits) {
4119
4173
  case 32:
4120
4174
  fault_status = 'ref_in_vbias';
@@ -4265,8 +4319,8 @@ function sensor_types(parent){
4265
4319
  return {
4266
4320
  'firmware': frame[2],
4267
4321
  'fsr': frame_data.fsr,
4268
- 'boot_time': frame[17] + " sec",
4269
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
4322
+ 'boot_up_time': frame[17] + " sec",
4323
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
4270
4324
  'auto_check_interval': frame_data.auto_check_interval,
4271
4325
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
4272
4326
  'always_on': frame_data.always_on,
@@ -4279,8 +4333,8 @@ function sensor_types(parent){
4279
4333
  'machine_values': {
4280
4334
  'firmware': frame[2],
4281
4335
  'fsr': frame[16],
4282
- 'boot_time': frame[17],
4283
- 'power_adc': frame.slice(18, 20),
4336
+ 'boot_up_time': frame[17],
4337
+ 'adc_pin_reading': frame.slice(18, 20),
4284
4338
  'auto_check_interval': frame.slice(20, 22),
4285
4339
  'auto_check_percentage': frame.slice(22, 24),
4286
4340
  'always_on': frame[24],
@@ -4354,8 +4408,8 @@ function sensor_types(parent){
4354
4408
  return {
4355
4409
  'firmware': frame[2],
4356
4410
  'fsr': frame_data.fsr,
4357
- 'boot_time': frame[17] + " sec",
4358
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
4411
+ 'boot_up_time': frame[17] + " sec",
4412
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
4359
4413
  'auto_check_interval': frame_data.auto_check_interval,
4360
4414
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
4361
4415
  'always_on': frame_data.always_on,
@@ -4368,8 +4422,8 @@ function sensor_types(parent){
4368
4422
  'machine_values': {
4369
4423
  'firmware': frame[2],
4370
4424
  'fsr': frame[16],
4371
- 'boot_time': frame[17],
4372
- 'power_adc': frame.slice(18, 20),
4425
+ 'boot_up_time': frame[17],
4426
+ 'adc_pin_reading': frame.slice(18, 20),
4373
4427
  'auto_check_interval': frame.slice(20, 22),
4374
4428
  'auto_check_percentage': frame.slice(22, 24),
4375
4429
  'always_on': frame[24],
@@ -4615,13 +4669,14 @@ function sensor_types(parent){
4615
4669
  name: '2-Channel RTD Temperature Sensor',
4616
4670
  parse: (payload, parsed, mac) => {
4617
4671
  if(parsed.firmware > 5){
4672
+ let reserved = payload[7] >> 1; // Fault status (1-bit left shifted)
4618
4673
  let fault_status = '';
4619
- if (payload[7] === 0) {
4674
+ if (reserved === 0) {
4620
4675
  fault_status = 'data_valid';
4621
- } else if (payload[7] === 15) {
4676
+ } else if (reserved === 15) {
4622
4677
  fault_status = 'data_invalid';
4623
4678
  } else {
4624
- const fault_bits = (payload[7] >> 2) & 0b00001111;
4679
+ const fault_bits = (reserved >> 2) & 0b00001111;
4625
4680
  switch (fault_bits) {
4626
4681
  case 8:
4627
4682
  fault_status = 'ref_in_vbias';
@@ -4636,7 +4691,7 @@ function sensor_types(parent){
4636
4691
  fault_status = 'over_under_voltage';
4637
4692
  break;
4638
4693
  }
4639
- const channel_bits = payload[7] & 0b00000011;
4694
+ const channel_bits = reserved & 0b00000011;
4640
4695
  switch (channel_bits) {
4641
4696
  case 1:
4642
4697
  fault_status = fault_status + '_ch1';
@@ -4689,13 +4744,14 @@ function sensor_types(parent){
4689
4744
  '55': {
4690
4745
  name: '3-Channel RTD Temperature Sensor',
4691
4746
  parse: (payload, parsed, mac) => {
4747
+ let reserved = payload[7] >> 1; // Fault status (1-bit left shifted)
4692
4748
  let fault_status = '';
4693
- if (payload[7] === 0) {
4749
+ if (reserved === 0) {
4694
4750
  fault_status = 'data_valid';
4695
- } else if (payload[7] === 15) {
4751
+ } else if (reserved === 15) {
4696
4752
  fault_status = 'data_invalid';
4697
4753
  } else {
4698
- const fault_bits = (payload[7] >> 2) & 0b00001111;
4754
+ const fault_bits = (reserved >> 2) & 0b00001111;
4699
4755
  switch (fault_bits) {
4700
4756
  case 8:
4701
4757
  fault_status = 'ref_in_vbias';
@@ -4710,7 +4766,7 @@ function sensor_types(parent){
4710
4766
  fault_status = 'over_under_voltage';
4711
4767
  break;
4712
4768
  }
4713
- const channel_bits = payload[7] & 0b00000011;
4769
+ const channel_bits = reserved & 0b00000011;
4714
4770
  switch (channel_bits) {
4715
4771
  case 1:
4716
4772
  fault_status = fault_status + '_ch1';
@@ -4805,8 +4861,8 @@ function sensor_types(parent){
4805
4861
  return {
4806
4862
  'firmware': frame[2],
4807
4863
  'fsr': frame_data.fsr,
4808
- 'boot_time': frame[17] + " sec",
4809
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
4864
+ 'boot_up_time': frame[17] + " sec",
4865
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
4810
4866
  'auto_check_interval': frame_data.auto_check_interval,
4811
4867
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
4812
4868
  'always_on': frame_data.always_on,
@@ -4819,8 +4875,8 @@ function sensor_types(parent){
4819
4875
  'machine_values': {
4820
4876
  'firmware': frame[2],
4821
4877
  'fsr': frame[16],
4822
- 'boot_time': frame[17],
4823
- 'power_adc': frame.slice(18, 20),
4878
+ 'boot_up_time': frame[17],
4879
+ 'adc_pin_reading': frame.slice(18, 20),
4824
4880
  'auto_check_interval': frame.slice(20, 22),
4825
4881
  'auto_check_percentage': frame.slice(22, 24),
4826
4882
  'always_on': frame[24],
@@ -5021,7 +5077,7 @@ function sensor_types(parent){
5021
5077
  'calibration_days': frame[12] + ' days',
5022
5078
  'sensor_update_rate':frame.slice(13, 15).reduce(msbLsb) + ' sec',
5023
5079
  'heater_duration': frame.slice(15, 17).reduce(msbLsb) + ' msec',
5024
- 'heater_temperature': frame.slice(17, 19).reduce(msbLsb) + ' °C',
5080
+ 'heater_temperature': frame.slice(17, 19).reduce(msbLsb) + ' C',
5025
5081
  'hardware_id': frame.slice(19, 22),
5026
5082
  'report_rate': frame.slice(22, 26).reduce(msbLsb) + ' sec',
5027
5083
  'tx_counter': frame.slice(26, 30).reduce(msbLsb),
@@ -5101,8 +5157,8 @@ function sensor_types(parent){
5101
5157
  return {
5102
5158
  'firmware': frame[2],
5103
5159
  'fsr': frame_data.fsr,
5104
- 'boot_time': frame[17] + " sec",
5105
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
5160
+ 'boot_up_time': frame[17] + " sec",
5161
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
5106
5162
  'auto_check_interval': frame_data.auto_check_interval,
5107
5163
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
5108
5164
  'always_on': frame_data.always_on,
@@ -5115,8 +5171,8 @@ function sensor_types(parent){
5115
5171
  'machine_values': {
5116
5172
  'firmware': frame[2],
5117
5173
  'fsr': frame[16],
5118
- 'boot_time': frame[17],
5119
- 'power_adc': frame.slice(18, 20),
5174
+ 'boot_up_time': frame[17],
5175
+ 'adc_pin_reading': frame.slice(18, 20),
5120
5176
  'auto_check_interval': frame.slice(20, 22),
5121
5177
  'auto_check_percentage': frame.slice(22, 24),
5122
5178
  'always_on': frame[24],
@@ -5174,8 +5230,8 @@ function sensor_types(parent){
5174
5230
  return {
5175
5231
  'firmware': frame[2],
5176
5232
  'fsr': frame_data.fsr,
5177
- 'boot_time': frame[17] + " sec",
5178
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
5233
+ 'boot_up_time': frame[17] + " sec",
5234
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
5179
5235
  'auto_check_interval': frame_data.auto_check_interval,
5180
5236
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
5181
5237
  'always_on': frame_data.always_on,
@@ -5188,8 +5244,8 @@ function sensor_types(parent){
5188
5244
  'machine_values': {
5189
5245
  'firmware': frame[2],
5190
5246
  'fsr': frame[16],
5191
- 'boot_time': frame[17],
5192
- 'power_adc': frame.slice(18, 20),
5247
+ 'boot_up_time': frame[17],
5248
+ 'adc_pin_reading': frame.slice(18, 20),
5193
5249
  'auto_check_interval': frame.slice(20, 22),
5194
5250
  'auto_check_percentage': frame.slice(22, 24),
5195
5251
  'always_on': frame[24],
@@ -7858,8 +7914,8 @@ function sensor_types(parent){
7858
7914
  return {
7859
7915
  'firmware': frame[2],
7860
7916
  'fsr': frame_data.fsr,
7861
- 'boot_time': frame[17] + " sec",
7862
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
7917
+ 'boot_up_time': frame[17] + " sec",
7918
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
7863
7919
  'auto_check_interval': frame_data.auto_check_interval,
7864
7920
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
7865
7921
  'always_on': frame_data.always_on,
@@ -7870,8 +7926,8 @@ function sensor_types(parent){
7870
7926
  'machine_values': {
7871
7927
  'firmware': frame[2],
7872
7928
  'fsr': frame[16],
7873
- 'boot_time': frame[17],
7874
- 'power_adc': frame.slice(18, 20),
7929
+ 'boot_up_time': frame[17],
7930
+ 'adc_pin_reading': frame.slice(18, 20),
7875
7931
  'auto_check_interval': frame.slice(20, 22),
7876
7932
  'auto_check_threshold': frame.slice(22, 24),
7877
7933
  'always_on': frame[24],
@@ -7942,8 +7998,8 @@ function sensor_types(parent){
7942
7998
  return {
7943
7999
  'firmware': frame[2],
7944
8000
  'fsr': frame_data.fsr,
7945
- 'boot_time': frame[17] + " sec",
7946
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
8001
+ 'boot_up_time': frame[17] + " sec",
8002
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
7947
8003
  'auto_check_interval': frame_data.auto_check_interval,
7948
8004
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
7949
8005
  'always_on': frame_data.always_on,
@@ -7956,8 +8012,8 @@ function sensor_types(parent){
7956
8012
  'machine_values': {
7957
8013
  'firmware': frame[2],
7958
8014
  'fsr': frame[16],
7959
- 'boot_time': frame[17],
7960
- 'power_adc': frame.slice(18, 20),
8015
+ 'boot_up_time': frame[17],
8016
+ 'adc_pin_reading': frame.slice(18, 20),
7961
8017
  'auto_check_interval': frame.slice(20, 22),
7962
8018
  'auto_check_percentage': frame.slice(22, 24),
7963
8019
  'always_on': frame[24],
@@ -8014,8 +8070,8 @@ function sensor_types(parent){
8014
8070
  return {
8015
8071
  'firmware': frame[2],
8016
8072
  'fsr': frame_data.fsr,
8017
- 'boot_time': frame[17] + " sec",
8018
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
8073
+ 'boot_up_time': frame[17] + " sec",
8074
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
8019
8075
  'auto_check_interval': frame_data.auto_check_interval,
8020
8076
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
8021
8077
  'always_on': frame_data.always_on,
@@ -8028,8 +8084,8 @@ function sensor_types(parent){
8028
8084
  'machine_values': {
8029
8085
  'firmware': frame[2],
8030
8086
  'fsr': frame[16],
8031
- 'boot_time': frame[17],
8032
- 'power_adc': frame.slice(18, 20),
8087
+ 'boot_up_time': frame[17],
8088
+ 'adc_pin_reading': frame.slice(18, 20),
8033
8089
  'auto_check_interval': frame.slice(20, 22),
8034
8090
  'auto_check_percentage': frame.slice(22, 24),
8035
8091
  'always_on': frame[24],
@@ -8390,8 +8446,8 @@ function sensor_types(parent){
8390
8446
  return {
8391
8447
  'firmware': frame[2],
8392
8448
  'fsr': frame_data.fsr,
8393
- 'boot_time': frame[17] + " sec",
8394
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
8449
+ 'boot_up_time': frame[17] + " sec",
8450
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
8395
8451
  'auto_check_interval': frame_data.auto_check_interval,
8396
8452
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
8397
8453
  'always_on': frame_data.always_on,
@@ -8404,8 +8460,8 @@ function sensor_types(parent){
8404
8460
  'machine_values': {
8405
8461
  'firmware': frame[2],
8406
8462
  'fsr': frame[16],
8407
- 'boot_time': frame[17],
8408
- 'power_adc': frame.slice(18, 20),
8463
+ 'boot_up_time': frame[17],
8464
+ 'adc_pin_reading': frame.slice(18, 20),
8409
8465
  'auto_check_interval': frame.slice(20, 22),
8410
8466
  'auto_check_percentage': frame.slice(22, 24),
8411
8467
  'always_on': frame[24],
@@ -8480,14 +8536,46 @@ function sensor_types(parent){
8480
8536
  name: 'Custom Wireless Accelerometer Sensor',
8481
8537
  parse: (payload, parsed, mac) => {
8482
8538
  if(payload[9] === 0){ // mode raw
8539
+ var sensor_type = payload[8];
8483
8540
  var deviceAddr = mac;
8484
8541
  var data = {};
8485
- switch(payload[8]){
8542
+ switch(sensor_type){
8486
8543
  case 1:
8487
8544
  data.sensor_type = 'Accel';
8545
+ switch(payload[11]){
8546
+ case 0:
8547
+ data.odr = '8000Hz';
8548
+ break;
8549
+ case 1:
8550
+ data.odr = '4000Hz';
8551
+ break;
8552
+ case 2:
8553
+ data.odr = '2000Hz';
8554
+ break;
8555
+ case 3:
8556
+ data.odr = '1000Hz';
8557
+ break;
8558
+ case 4:
8559
+ data.odr = '100Hz';
8560
+ break;
8561
+ }
8488
8562
  break;
8489
8563
  case 2:
8490
8564
  data.sensor_type = 'gyro';
8565
+ switch(payload[11]){
8566
+ case 0:
8567
+ data.odr = '125Hz';
8568
+ break;
8569
+ case 1:
8570
+ data.odr = '250Hz';
8571
+ break;
8572
+ case 2:
8573
+ data.odr = '500Hz';
8574
+ break;
8575
+ case 3:
8576
+ data.odr = '1000Hz';
8577
+ break;
8578
+ }
8491
8579
  break;
8492
8580
  }
8493
8581
  switch(payload[10]){
@@ -8500,7 +8588,7 @@ function sensor_types(parent){
8500
8588
  }
8501
8589
 
8502
8590
  var mode = payload[9];
8503
- var odr = payload[11];
8591
+ var odr = data.odr;
8504
8592
  var en_axis = payload[12] & 7;
8505
8593
  var fsr = payload[12] >> 5;
8506
8594
  var hour = payload[13];
@@ -8511,23 +8599,6 @@ function sensor_types(parent){
8511
8599
  var current_packet = payload.slice(21, 23).reduce(msbLsb);
8512
8600
  var data_start = 23;
8513
8601
 
8514
- switch(odr){
8515
- case 0:
8516
- odr = '125Hz';
8517
- break;
8518
- case 1:
8519
- odr = '250Hz';
8520
- break;
8521
- case 2:
8522
- odr = '500Hz';
8523
- break;
8524
- case 3:
8525
- odr = '1000Hz';
8526
- break;
8527
- default:
8528
- odr = 0;
8529
- }
8530
-
8531
8602
  if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
8532
8603
  if(expected_packets != 1){
8533
8604
  // if current packet is equal to last one (duplicated data). This does not apply to the last package
@@ -8613,28 +8684,28 @@ function sensor_types(parent){
8613
8684
 
8614
8685
  /* Evaluate sensor type */
8615
8686
  if(payload[8] == 1){ // accelerometer
8616
- var fsr_mult = 0.00030;
8687
+ var fsr_mult = 0.00732;
8617
8688
  var fsr_text = "";
8618
8689
  switch(globalDevices[deviceAddr].fsr){
8619
8690
  case 0:
8620
- fsr_mult = 0.00030;
8691
+ fsr_mult = 0.00732;
8621
8692
  break;
8622
8693
  case 1:
8623
- fsr_mult = 0.00061;
8694
+ fsr_mult = 0.01464;
8624
8695
  break;
8625
8696
  case 2:
8626
- fsr_mult = 0.00122;
8697
+ fsr_mult = 0.02929;
8627
8698
  break;
8628
8699
  }
8629
8700
  switch(globalDevices[deviceAddr].fsr){
8630
8701
  case 0:
8631
- fsr_text = "10g";
8702
+ fsr_text = "15g";
8632
8703
  break;
8633
8704
  case 1:
8634
- fsr_text = "20g";
8705
+ fsr_text = "30g";
8635
8706
  break;
8636
8707
  case 2:
8637
- fsr_text = "40g";
8708
+ fsr_text = "60g";
8638
8709
  break;
8639
8710
  }
8640
8711
  }else{ // gyro
@@ -8707,210 +8778,395 @@ function sensor_types(parent){
8707
8778
  }
8708
8779
  }
8709
8780
  },
8710
- 'parse_fly': (frame) => {
8711
- let frame_data = {};
8712
- switch(frame[12]){
8713
- case 0:
8714
- frame_data.odr = 125;
8715
- break;
8716
- case 1:
8717
- frame_data.odr = 250;
8718
- break;
8719
- case 2:
8720
- frame_data.odr = 500;
8721
- break;
8722
- case 3:
8723
- frame_data.odr = 1000;
8724
- break;
8725
- default:
8726
- frame_data.odr = 0;
8727
- }
8728
- switch(frame[15]){
8729
- case 0:
8730
- frame_data.fsr_acc = "10g";
8731
- break;
8732
- case 1:
8733
- frame_data.fsr_acc = "20g";
8734
- break;
8735
- case 2:
8736
- frame_data.fsr_acc = "40g";
8737
- break;
8738
- }
8739
- switch(frame[16]){
8740
- case 0:
8741
- frame_data.fsr_gyro = "250dps";
8742
- break;
8743
- case 1:
8744
- frame_data.fsr_gyro = "500dps";
8745
- break;
8746
- case 2:
8747
- frame_data.fsr_gyro = "1000dps";
8748
- break;
8749
- case 3:
8750
- frame_data.fsr_gyro = "2000dps";
8751
- break;
8752
- }
8753
- switch(frame[17]){
8754
- case 7:
8755
- frame_data.en_axis = "all";
8756
- break;
8757
- }
8758
- switch(frame[20]){
8759
- case 1:
8760
- frame_data.en_sensors = "gyro_only";
8761
- break;
8762
- case 2:
8763
- frame_data.en_sensors = "accel_only";
8764
- break;
8765
- case 3:
8766
- frame_data.en_sensors = "all_enabled";
8767
- break;
8768
- }
8769
- switch(frame[18]){
8770
- case 0:
8771
- frame_data.sampling_interval = 5;
8772
- break;
8773
- case 1:
8774
- frame_data.sampling_interval = 10;
8775
- break;
8776
- case 2:
8777
- frame_data.sampling_interval = 15;
8778
- break;
8779
- case 3:
8780
- frame_data.sampling_interval = 20;
8781
- break;
8782
- case 4:
8783
- frame_data.sampling_interval = 30;
8784
- break;
8785
- case 5:
8786
- frame_data.sampling_interval = 60;
8787
- break;
8788
- case 6:
8789
- frame_data.sampling_interval = 120;
8790
- break;
8791
- case 7:
8792
- frame_data.sampling_interval = 180;
8793
- break;
8794
- }
8795
- switch(frame[14]){
8796
- case 0:
8797
- frame_data.hpf_cutoff = 0.00247;
8798
- break;
8799
- case 1:
8800
- frame_data.hpf_cutoff = 0.00062084;
8801
- break;
8802
- case 2:
8803
- frame_data.hpf_cutoff = 0.00015545;
8804
- break;
8805
- case 3:
8806
- frame_data.hpf_cutoff = 0.00003862;
8807
- break;
8808
- case 4:
8809
- frame_data.hpf_cutoff = 0.00000954;
8810
- break;
8811
- case 5:
8812
- frame_data.hpf_cutoff = 0.00000238;
8813
- break;
8814
- }
8815
- return {
8816
- 'firmware': frame[2],
8817
- 'sample_rate': frame_data.odr + 'Hz',
8818
- 'sampling_duration': (frame[13]* 50) + 'msec',
8819
- 'hpf_cutoff': (frame_data.hpf_cutoff * frame_data.odr).toFixed(2) + 'Hz',
8820
- 'acc_fsr': frame_data.fsr_acc,
8821
- 'gyro_fsr': frame_data.fsr_gyro,
8822
- 'axis_enabled': frame_data.en_axis,
8823
- 'sampling_interval': frame_data.sampling_interval + 'min',
8824
- 'accelerometer_threshold': (frame[19]* 32) + "mg",
8825
- 'enabled_sensors': frame_data.en_sensors,
8826
- 'rtc': [
8827
- String(frame[21]).padStart(2, '0'),
8828
- String(frame[22]).padStart(2, '0'),
8829
- String(frame[23]).padStart(2, '0')
8830
- ].join(':'),
8831
- 'hardware_id': frame.slice(24, 27),
8832
- 'report_rate': frame.slice(27, 31).reduce(msbLsb),
8833
- 'tx_life_counter': frame.slice(31, 35).reduce(msbLsb),
8834
- 'machine_values': {
8835
- 'firmware': frame[2],
8836
- 'odr': frame[12],
8837
- 'sampling_duration': frame[13],
8838
- 'hpf_cutoff': frame[14],
8839
- 'acc_fsr': frame[15],
8840
- 'gyro_fsr': frame[16],
8841
- 'axis_enabled': frame[17],
8842
- 'sampling_interval': frame[18],
8843
- 'accelerometer_threshold': frame[19],
8844
- 'enabled_sensors': frame[20],
8845
- 'hour': frame[21],
8846
- 'minute': frame[22],
8847
- 'second': frame[23],
8848
- 'hardware_id': frame.slice(24, 27),
8849
- 'report_rate': frame.slice(27, 31),
8850
- 'tx_life_counter': frame.slice(31, 35)
8851
- }
8852
- }
8853
- }
8854
- },
8855
- '105': {
8856
- name: '1 Channel Automatic Luber With Ultrasound Vibration Sensor',
8857
- parse: (d) => {
8858
- return {
8859
- raw_adc: d.slice(0, 2).reduce(msbLsb),
8860
- ma: d.slice(2, 4).reduce(msbLsb) / 100,
8861
- db: d.slice(4, 6).reduce(msbLsb) / 100
8862
- };
8863
- },
8864
8781
  'parse_fly': (frame) => {
8865
8782
  let firmware = frame[2];
8866
- if(firmware > 13){ // firmware 14 and above
8783
+ if(firmware > 1){
8867
8784
  let frame_data = {};
8868
- let auto_check_interval = frame.slice(20, 22).reduce(msbLsb);
8869
- if(!auto_check_interval){
8870
- frame_data.auto_check_interval = 'Disabled';
8871
- }else{
8872
- frame_data.auto_check_interval = auto_check_interval + " sec";
8785
+ switch(frame[12]){
8786
+ case 0:
8787
+ frame_data.gyro_odr = 125;
8788
+ break;
8789
+ case 1:
8790
+ frame_data.gyro_odr = 250;
8791
+ break;
8792
+ case 2:
8793
+ frame_data.gyro_odr = 500;
8794
+ break;
8795
+ case 3:
8796
+ frame_data.gyro_odr = 1000;
8797
+ break;
8873
8798
  }
8874
- frame_data.always_on = frame[24]?"Enabled":"Disabled";
8875
- switch(frame[16]){
8799
+ switch(frame[13]){
8876
8800
  case 0:
8877
- frame_data.fsr = "+-6.114 V";
8878
- break;
8801
+ frame_data.acc_odr = 8000;
8802
+ break;
8879
8803
  case 1:
8880
- frame_data.fsr = "+-4.096 V";
8881
- break;
8804
+ frame_data.acc_odr = 4000;
8805
+ break;
8882
8806
  case 2:
8883
- frame_data.fsr = "+-2.048 V";
8884
- break;
8807
+ frame_data.acc_odr = 2000;
8808
+ break;
8885
8809
  case 3:
8886
- frame_data.fsr = "+-1.024 V";
8887
- break;
8810
+ frame_data.acc_odr = 1000;
8811
+ break;
8888
8812
  case 4:
8889
- frame_data.fsr = "+-0.512 V";
8890
- break;
8813
+ frame_data.acc_odr = 100;
8814
+ break;
8815
+ }
8816
+ switch(frame[15]){
8817
+ case 0:
8818
+ frame_data.hpf_cutoff = false;
8819
+ break;
8820
+ case 1:
8821
+ frame_data.hpf_cutoff = 0.00247;
8822
+ break;
8823
+ case 2:
8824
+ frame_data.hpf_cutoff = 0.00062084;
8825
+ break;
8826
+ case 3:
8827
+ frame_data.hpf_cutoff = 0.00015545;
8828
+ break;
8829
+ case 4:
8830
+ frame_data.hpf_cutoff = 0.00003862;
8831
+ break;
8891
8832
  case 5:
8892
- frame_data.fsr = "+-0.256 V";
8893
- break;
8833
+ frame_data.hpf_cutoff = 0.00000954;
8834
+ break;
8835
+ case 6:
8836
+ frame_data.hpf_cutoff = 0.00000238;
8837
+ break;
8894
8838
  }
8895
- return {
8896
- 'firmware': frame[2],
8897
- 'fsr': frame_data.fsr,
8898
- 'boot_time': frame[17] + " sec",
8899
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
8900
- 'auto_check_interval': frame_data.auto_check_interval,
8901
- 'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
8902
- 'always_on': frame_data.always_on,
8903
- 'calibration_one': frame.slice(25, 29).reduce(msbLsb),
8904
- 'calibration_two':frame.slice(29, 33).reduce(msbLsb),
8905
- 'calibration_three':frame.slice(33, 37).reduce(msbLsb),
8906
- 'hardware_id': frame.slice(37, 40),
8907
- 'report_rate': frame.slice(40, 44).reduce(msbLsb) + " sec",
8839
+ switch(frame[16]){
8840
+ case 0:
8841
+ frame_data.fsr_acc = "15g";
8842
+ break;
8843
+ case 1:
8844
+ frame_data.fsr_acc = "30g";
8845
+ break;
8846
+ case 2:
8847
+ frame_data.fsr_acc = "60g";
8848
+ break;
8849
+ }
8850
+ switch(frame[17]){
8851
+ case 0:
8852
+ frame_data.fsr_gyro = "250dps";
8853
+ break;
8854
+ case 1:
8855
+ frame_data.fsr_gyro = "500dps";
8856
+ break;
8857
+ case 2:
8858
+ frame_data.fsr_gyro = "1000dps";
8859
+ break;
8860
+ case 3:
8861
+ frame_data.fsr_gyro = "2000dps";
8862
+ break;
8863
+ }
8864
+ switch(frame[18]){
8865
+ case 1:
8866
+ frame_data.en_axis = "X Axis";
8867
+ break;
8868
+ case 2:
8869
+ frame_data.en_axis = "Y Axis";
8870
+ break;
8871
+ case 3:
8872
+ frame_data.en_axis = "X-Y Axes";
8873
+ break;
8874
+ case 4:
8875
+ frame_data.en_axis = "Z Axis";
8876
+ break;
8877
+ case 5:
8878
+ frame_data.en_axis = "X-Z Axes";
8879
+ break;
8880
+ case 6:
8881
+ frame_data.en_axis = "Y-Z Axes";
8882
+ break;
8883
+ case 7:
8884
+ frame_data.en_axis = "All Axes";
8885
+ break;
8886
+ }
8887
+ switch(frame[19]){
8888
+ case 0:
8889
+ frame_data.sampling_interval = 5;
8890
+ break;
8891
+ case 1:
8892
+ frame_data.sampling_interval = 10;
8893
+ break;
8894
+ case 2:
8895
+ frame_data.sampling_interval = 15;
8896
+ break;
8897
+ case 3:
8898
+ frame_data.sampling_interval = 20;
8899
+ break;
8900
+ case 4:
8901
+ frame_data.sampling_interval = 30;
8902
+ break;
8903
+ case 5:
8904
+ frame_data.sampling_interval = 60;
8905
+ break;
8906
+ case 6:
8907
+ frame_data.sampling_interval = 120;
8908
+ break;
8909
+ case 7:
8910
+ frame_data.sampling_interval = 180;
8911
+ break;
8912
+ }
8913
+ switch(frame[21]){
8914
+ case 0:
8915
+ frame_data.en_sensors = "acc_only";
8916
+ break;
8917
+ case 1:
8918
+ frame_data.en_sensors = "gyro_only";
8919
+ break;
8920
+ case 2:
8921
+ frame_data.en_sensors = "both_enabled";
8922
+ break;
8923
+ }
8924
+ frame_data.hpf_cutoff = (frame_data.hpf_cutoff)?((frame_data.hpf_cutoff * frame_data.acc_odr).toFixed(2) + 'Hz'):'disabled';
8925
+ return {
8926
+ 'firmware': firmware,
8927
+ 'gyro_sample_rate': frame_data.gyro_odr + 'Hz',
8928
+ 'acc_sample_rate': frame_data.acc_odr + 'Hz',
8929
+ 'sampling_duration': (frame[14]* 50) + 'msec',
8930
+ 'hpf_cutoff': frame_data.hpf_cutoff,
8931
+ 'acc_fsr': frame_data.fsr_acc,
8932
+ 'gyro_fsr': frame_data.fsr_gyro,
8933
+ 'axis_enabled': frame_data.en_axis,
8934
+ 'sampling_interval': frame_data.sampling_interval + 'min',
8935
+ 'accelerometer_threshold': (frame[20]* 32) + "mg",
8936
+ 'enabled_sensors': frame_data.en_sensors,
8937
+ 'max_num_of_motion_tx_per_interval': frame[22],
8938
+ 'rtc': [
8939
+ String(frame[23]).padStart(2, '0'),
8940
+ String(frame[24]).padStart(2, '0'),
8941
+ String(frame[25]).padStart(2, '0')
8942
+ ].join(':'),
8943
+ 'hardware_id': frame.slice(26, 29),
8944
+ 'report_rate': frame.slice(29, 33).reduce(msbLsb),
8945
+ 'tx_life_counter': frame.slice(33, 37).reduce(msbLsb),
8946
+ 'machine_values': {
8947
+ 'firmware': frame[2],
8948
+ 'gyro_sample_rate': frame[12],
8949
+ 'acc_sample_rate': frame[13],
8950
+ 'sampling_duration': frame[14],
8951
+ 'hpf_cutoff': frame[15],
8952
+ 'acc_fsr': frame[16],
8953
+ 'gyro_fsr': frame[17],
8954
+ 'axis_enabled': frame[18],
8955
+ 'sampling_interval': frame[19],
8956
+ 'accelerometer_threshold': frame[20],
8957
+ 'enabled_sensors': frame[21],
8958
+ 'max_num_of_motion_tx_per_interval': frame[22],
8959
+ 'hour': frame[23],
8960
+ 'minute': frame[24],
8961
+ 'second': frame[25],
8962
+ 'hardware_id': frame.slice(26, 29),
8963
+ 'report_rate': frame.slice(29, 33),
8964
+ 'tx_life_counter': frame.slice(33, 37)
8965
+ }
8966
+ }
8967
+ }else{
8968
+ let frame_data = {};
8969
+ switch(frame[12]){
8970
+ case 0:
8971
+ frame_data.odr = 125;
8972
+ break;
8973
+ case 1:
8974
+ frame_data.odr = 250;
8975
+ break;
8976
+ case 2:
8977
+ frame_data.odr = 500;
8978
+ break;
8979
+ case 3:
8980
+ frame_data.odr = 1000;
8981
+ break;
8982
+ }
8983
+ switch(frame[15]){
8984
+ case 0:
8985
+ frame_data.fsr_acc = "10g";
8986
+ break;
8987
+ case 1:
8988
+ frame_data.fsr_acc = "20g";
8989
+ break;
8990
+ case 2:
8991
+ frame_data.fsr_acc = "40g";
8992
+ break;
8993
+ }
8994
+ switch(frame[16]){
8995
+ case 0:
8996
+ frame_data.fsr_gyro = "250dps";
8997
+ break;
8998
+ case 1:
8999
+ frame_data.fsr_gyro = "500dps";
9000
+ break;
9001
+ case 2:
9002
+ frame_data.fsr_gyro = "1000dps";
9003
+ break;
9004
+ case 3:
9005
+ frame_data.fsr_gyro = "2000dps";
9006
+ break;
9007
+ }
9008
+ switch(frame[17]){
9009
+ case 7:
9010
+ frame_data.en_axis = "all";
9011
+ break;
9012
+ }
9013
+ switch(frame[20]){
9014
+ case 1:
9015
+ frame_data.en_sensors = "gyro_only";
9016
+ break;
9017
+ case 2:
9018
+ frame_data.en_sensors = "accel_only";
9019
+ break;
9020
+ case 3:
9021
+ frame_data.en_sensors = "all_enabled";
9022
+ break;
9023
+ }
9024
+ switch(frame[18]){
9025
+ case 0:
9026
+ frame_data.sampling_interval = 5;
9027
+ break;
9028
+ case 1:
9029
+ frame_data.sampling_interval = 10;
9030
+ break;
9031
+ case 2:
9032
+ frame_data.sampling_interval = 15;
9033
+ break;
9034
+ case 3:
9035
+ frame_data.sampling_interval = 20;
9036
+ break;
9037
+ case 4:
9038
+ frame_data.sampling_interval = 30;
9039
+ break;
9040
+ case 5:
9041
+ frame_data.sampling_interval = 60;
9042
+ break;
9043
+ case 6:
9044
+ frame_data.sampling_interval = 120;
9045
+ break;
9046
+ case 7:
9047
+ frame_data.sampling_interval = 180;
9048
+ break;
9049
+ }
9050
+ switch(frame[14]){
9051
+ case 0:
9052
+ frame_data.hpf_cutoff = 0.00247;
9053
+ break;
9054
+ case 1:
9055
+ frame_data.hpf_cutoff = 0.00062084;
9056
+ break;
9057
+ case 2:
9058
+ frame_data.hpf_cutoff = 0.00015545;
9059
+ break;
9060
+ case 3:
9061
+ frame_data.hpf_cutoff = 0.00003862;
9062
+ break;
9063
+ case 4:
9064
+ frame_data.hpf_cutoff = 0.00000954;
9065
+ break;
9066
+ case 5:
9067
+ frame_data.hpf_cutoff = 0.00000238;
9068
+ break;
9069
+ }
9070
+ return {
9071
+ 'firmware': firmware,
9072
+ 'sample_rate': frame_data.odr + 'Hz',
9073
+ 'sampling_duration': (frame[13]* 50) + 'msec',
9074
+ 'hpf_cutoff': (frame_data.hpf_cutoff * frame_data.odr).toFixed(2) + 'Hz',
9075
+ 'acc_fsr': frame_data.fsr_acc,
9076
+ 'gyro_fsr': frame_data.fsr_gyro,
9077
+ 'axis_enabled': frame_data.en_axis,
9078
+ 'sampling_interval': frame_data.sampling_interval + 'min',
9079
+ 'accelerometer_threshold': (frame[19]* 32) + "mg",
9080
+ 'enabled_sensors': frame_data.en_sensors,
9081
+ 'rtc': [
9082
+ String(frame[21]).padStart(2, '0'),
9083
+ String(frame[22]).padStart(2, '0'),
9084
+ String(frame[23]).padStart(2, '0')
9085
+ ].join(':'),
9086
+ 'hardware_id': frame.slice(24, 27),
9087
+ 'report_rate': frame.slice(27, 31).reduce(msbLsb),
9088
+ 'tx_life_counter': frame.slice(31, 35).reduce(msbLsb),
9089
+ 'machine_values': {
9090
+ 'firmware': frame[2],
9091
+ 'odr': frame[12],
9092
+ 'sampling_duration': frame[13],
9093
+ 'hpf_cutoff': frame[14],
9094
+ 'acc_fsr': frame[15],
9095
+ 'gyro_fsr': frame[16],
9096
+ 'axis_enabled': frame[17],
9097
+ 'sampling_interval': frame[18],
9098
+ 'accelerometer_threshold': frame[19],
9099
+ 'enabled_sensors': frame[20],
9100
+ 'hour': frame[21],
9101
+ 'minute': frame[22],
9102
+ 'second': frame[23],
9103
+ 'hardware_id': frame.slice(24, 27),
9104
+ 'report_rate': frame.slice(27, 31),
9105
+ 'tx_life_counter': frame.slice(31, 35)
9106
+ }
9107
+ }
9108
+ }
9109
+ }
9110
+ },
9111
+ '105': {
9112
+ name: '1 Channel Automatic Luber With Ultrasound Vibration Sensor',
9113
+ parse: (d) => {
9114
+ return {
9115
+ raw_adc: d.slice(0, 2).reduce(msbLsb),
9116
+ ma: d.slice(2, 4).reduce(msbLsb) / 100,
9117
+ db: d.slice(4, 6).reduce(msbLsb) / 100
9118
+ };
9119
+ },
9120
+ 'parse_fly': (frame) => {
9121
+ let firmware = frame[2];
9122
+ if(firmware > 13){ // firmware 14 and above
9123
+ let frame_data = {};
9124
+ let auto_check_interval = frame.slice(20, 22).reduce(msbLsb);
9125
+ if(!auto_check_interval){
9126
+ frame_data.auto_check_interval = 'Disabled';
9127
+ }else{
9128
+ frame_data.auto_check_interval = auto_check_interval + " sec";
9129
+ }
9130
+ frame_data.always_on = frame[24]?"Enabled":"Disabled";
9131
+ switch(frame[16]){
9132
+ case 0:
9133
+ frame_data.fsr = "+-6.114 V";
9134
+ break;
9135
+ case 1:
9136
+ frame_data.fsr = "+-4.096 V";
9137
+ break;
9138
+ case 2:
9139
+ frame_data.fsr = "+-2.048 V";
9140
+ break;
9141
+ case 3:
9142
+ frame_data.fsr = "+-1.024 V";
9143
+ break;
9144
+ case 4:
9145
+ frame_data.fsr = "+-0.512 V";
9146
+ break;
9147
+ case 5:
9148
+ frame_data.fsr = "+-0.256 V";
9149
+ break;
9150
+ }
9151
+ return {
9152
+ 'firmware': frame[2],
9153
+ 'fsr': frame_data.fsr,
9154
+ 'boot_up_time': frame[17] + " sec",
9155
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
9156
+ 'auto_check_interval': frame_data.auto_check_interval,
9157
+ 'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
9158
+ 'always_on': frame_data.always_on,
9159
+ 'calibration_one': frame.slice(25, 29).reduce(msbLsb),
9160
+ 'calibration_two':frame.slice(29, 33).reduce(msbLsb),
9161
+ 'calibration_three':frame.slice(33, 37).reduce(msbLsb),
9162
+ 'hardware_id': frame.slice(37, 40),
9163
+ 'report_rate': frame.slice(40, 44).reduce(msbLsb) + " sec",
8908
9164
  'tx_life_counter': frame.slice(44, 48).reduce(msbLsb),
8909
9165
  'machine_values': {
8910
9166
  'firmware': frame[2],
8911
9167
  'fsr': frame[16],
8912
- 'boot_time': frame[17],
8913
- 'power_adc': frame.slice(18, 20),
9168
+ 'boot_up_time': frame[17],
9169
+ 'adc_pin_reading': frame.slice(18, 20),
8914
9170
  'auto_check_interval': frame.slice(20, 22),
8915
9171
  'auto_check_percentage': frame.slice(22, 24),
8916
9172
  'always_on': frame[24],
@@ -8971,8 +9227,8 @@ function sensor_types(parent){
8971
9227
  return {
8972
9228
  'firmware': frame[2],
8973
9229
  'fsr': frame_data.fsr,
8974
- 'boot_time': frame[17] + " sec",
8975
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
9230
+ 'boot_up_time': frame[17] + " sec",
9231
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
8976
9232
  'auto_check_interval': frame_data.auto_check_interval,
8977
9233
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
8978
9234
  'always_on': frame_data.always_on,
@@ -8985,8 +9241,8 @@ function sensor_types(parent){
8985
9241
  'machine_values': {
8986
9242
  'firmware': frame[2],
8987
9243
  'fsr': frame[16],
8988
- 'boot_time': frame[17],
8989
- 'power_adc': frame.slice(18, 20),
9244
+ 'boot_up_time': frame[17],
9245
+ 'adc_pin_reading': frame.slice(18, 20),
8990
9246
  'auto_check_interval': frame.slice(20, 22),
8991
9247
  'auto_check_percentage': frame.slice(22, 24),
8992
9248
  'always_on': frame[24],
@@ -9057,8 +9313,8 @@ function sensor_types(parent){
9057
9313
  return {
9058
9314
  'firmware': frame[2],
9059
9315
  'fsr': frame_data.fsr,
9060
- 'boot_time': frame[17] + " sec",
9061
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
9316
+ 'boot_up_time': frame[17] + " sec",
9317
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
9062
9318
  'auto_check_interval': frame_data.auto_check_interval,
9063
9319
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
9064
9320
  'always_on': frame_data.always_on,
@@ -9071,8 +9327,8 @@ function sensor_types(parent){
9071
9327
  'machine_values': {
9072
9328
  'firmware': frame[2],
9073
9329
  'fsr': frame[16],
9074
- 'boot_time': frame[17],
9075
- 'power_adc': frame.slice(18, 20),
9330
+ 'boot_up_time': frame[17],
9331
+ 'adc_pin_reading': frame.slice(18, 20),
9076
9332
  'auto_check_interval': frame.slice(20, 22),
9077
9333
  'auto_check_percentage': frame.slice(22, 24),
9078
9334
  'always_on': frame[24],
@@ -10111,51 +10367,36 @@ function sensor_types(parent){
10111
10367
 
10112
10368
  if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
10113
10369
  if(expected_packets != 1){
10114
- // 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
10115
- if(current_packet in globalDevices[deviceAddr].data || current_packet == 1 || !(((current_packet)-1) in globalDevices[deviceAddr].data)) {
10116
- console.log('-----');
10117
- console.log('bad packet breakdown deleting stream');
10118
- console.log(current_packet);
10119
- console.log(expected_packets);
10120
- console.log(current_packet in globalDevices[deviceAddr].data);
10121
- console.log(current_packet == 1);
10122
- console.log(!((current_packet-1) in globalDevices[deviceAddr].data));
10123
- if(this.hasOwnProperty('failure_no')){
10124
- this.failure_no = this.failure_no + 1;
10125
- }
10126
- else{
10127
- this.failure_no = 1;
10128
- }
10129
- if(this.hasOwnProperty('failure_no')){
10130
- console.log('####falure no');
10131
- console.log(this.failure_no);
10132
- }
10133
- // console.log(globalDevices[deviceAddr].data);
10370
+ // if current packet is equal to last one (duplicated data). This does not apply to the last package
10371
+ if (globalDevices[deviceAddr].last_packet_counter == current_packet){
10372
+ console.log('Duplicated message')
10373
+ return;
10374
+ }
10375
+ // if current packet is equal to 1 or last packet counter is higher thant current packet
10376
+ if(current_packet == 1 || (globalDevices[deviceAddr].last_packet_counter > current_packet)){
10377
+ // clear stream
10134
10378
  delete globalDevices[deviceAddr];
10135
- if(current_packet != 1){
10136
- return;
10137
- } else{
10138
-
10139
- var mode = payload[8];
10140
- var odr = msbLsb(payload[9], payload[10]);
10141
- var fsr = payload[11] >> 5;
10142
- var temperature = msbLsb(payload[14], payload[15])/100;
10379
+ // create new stream
10380
+ var mode = payload[8];
10381
+ var odr = msbLsb(payload[9], payload[10]);
10382
+ var fsr = payload[11] >> 5;
10383
+ var temperature = msbLsb(payload[14], payload[15])/100;
10143
10384
 
10144
- globalDevices[deviceAddr] = {
10145
- // stream_size: expected_packets,
10146
- data: {},
10147
- odr: odr,
10148
- mo: mode,
10149
- fsr: fsr,
10150
- hour: hour,
10151
- minute: minute,
10152
- temperature: temperature,
10153
- }
10154
- globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10155
- return;
10385
+ globalDevices[deviceAddr] = {
10386
+ data: {},
10387
+ odr: odr,
10388
+ mo: mode,
10389
+ fsr: fsr,
10390
+ hour: hour,
10391
+ minute: minute,
10392
+ temperature: temperature,
10156
10393
  }
10394
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
10395
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10396
+ return;
10157
10397
  }
10158
10398
  else{
10399
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
10159
10400
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10160
10401
  }
10161
10402
  }
@@ -10166,7 +10407,6 @@ function sensor_types(parent){
10166
10407
  var temperature = msbLsb(payload[14], payload[15])/100;
10167
10408
 
10168
10409
  globalDevices[deviceAddr] = {
10169
- // stream_size: expected_packets,
10170
10410
  data: {},
10171
10411
  odr: odr,
10172
10412
  mo: mode,
@@ -10175,106 +10415,17 @@ function sensor_types(parent){
10175
10415
  minute: minute,
10176
10416
  temperature: temperature,
10177
10417
  }
10418
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
10178
10419
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10179
10420
  }
10180
-
10181
- if(Object.keys(globalDevices[deviceAddr].data).length == expected_packets){
10182
- var raw_data = new Array();
10183
- for(const packet in globalDevices[deviceAddr].data){
10184
- raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
10185
- }
10186
- var label = 0;
10187
-
10188
- var fft = new Array();
10189
- var fft_concat = {};
10190
-
10191
- var en_axis_data = {};
10192
- en_axis_data.x_offset = 0;
10193
- en_axis_data.y_offset = 2;
10194
- en_axis_data.z_offset = 4;
10195
- en_axis_data.increment = 6;
10196
- fft_concat = {x: [], y: [], z: []};
10197
-
10198
- var fsr_mult = .00006;
10199
- var fsr_text = "";
10200
- switch(globalDevices[deviceAddr].fsr){
10201
- case 0:
10202
- fsr_mult = 0.00006;
10203
- break;
10204
- case 1:
10205
- fsr_mult = 0.00012;
10206
- break;
10207
- case 2:
10208
- fsr_mult = 0.00024;
10209
- break;
10210
- case 3:
10211
- fsr_mult = 0.00049;
10212
- break;
10213
- }
10214
- switch(globalDevices[deviceAddr].fsr){
10215
- case 0:
10216
- fsr_text = "2g";
10217
- break;
10218
- case 1:
10219
- fsr_text = "4g";
10220
- break;
10221
- case 2:
10222
- fsr_text = "8g";
10223
- break;
10224
- case 3:
10225
- fsr_text = "16g";
10226
- break;
10227
- }
10228
-
10229
-
10230
- for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
10231
- label++;
10232
-
10233
- if('x_offset' in en_axis_data){
10234
- fft_concat.x.push(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)));
10235
- }
10236
- if('y_offset' in en_axis_data){
10237
- fft_concat.y.push(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)));
10238
- }
10239
- if('z_offset' in en_axis_data){
10240
- fft_concat.z.push(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)));
10241
- }
10242
- }
10243
- var fft_concat_obj = {
10244
- mode: payload[8],
10245
- msg_type: msg_type,
10246
- time_id: [
10247
- String(globalDevices[deviceAddr].hour).padStart(2, '0'),
10248
- String(globalDevices[deviceAddr].minute).padStart(2, '0'),
10249
- ].join(':'),
10250
- mac_address: deviceAddr,
10251
- fsr: fsr_text,
10252
- odr: globalDevices[deviceAddr].odr,
10253
- temperature: globalDevices[deviceAddr].temperature,
10254
- total_samples: label,
10255
- data: fft_concat
10256
- };
10257
- sensor_data = fft_concat_obj;
10258
- delete globalDevices[deviceAddr];
10259
- if(this.hasOwnProperty('failure_no')){
10260
- console.log('####falure no');
10261
- console.log(this.failure_no);
10262
- }
10263
-
10264
- return sensor_data;
10265
- }
10266
- else{
10267
- return;
10268
- }
10269
- }else{
10270
-
10421
+ }
10422
+ else{
10271
10423
  var mode = payload[8];
10272
10424
  var odr = msbLsb(payload[9], payload[10]);
10273
10425
  var fsr = payload[11] >> 5;
10274
10426
  var temperature = msbLsb(payload[14], payload[15])/100;
10275
10427
 
10276
10428
  globalDevices[deviceAddr] = {
10277
- // stream_size: expected_packets,
10278
10429
  data: {},
10279
10430
  odr: odr,
10280
10431
  mo: mode,
@@ -10283,7 +10434,91 @@ function sensor_types(parent){
10283
10434
  minute: minute,
10284
10435
  temperature: temperature,
10285
10436
  }
10437
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
10286
10438
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10439
+ }
10440
+ if(current_packet == expected_packets){
10441
+ var raw_data = new Array();
10442
+ for(const packet in globalDevices[deviceAddr].data){
10443
+ raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
10444
+ }
10445
+ var label = 0;
10446
+
10447
+ var fft = new Array();
10448
+ var fft_concat = {};
10449
+
10450
+ var en_axis_data = {};
10451
+ en_axis_data.x_offset = 0;
10452
+ en_axis_data.y_offset = 2;
10453
+ en_axis_data.z_offset = 4;
10454
+ en_axis_data.increment = 6;
10455
+ fft_concat = {x: [], y: [], z: []};
10456
+
10457
+ var fsr_mult = .00006;
10458
+ var fsr_text = "";
10459
+
10460
+ switch(globalDevices[deviceAddr].fsr){
10461
+ case 0:
10462
+ fsr_mult = 0.00006;
10463
+ break;
10464
+ case 1:
10465
+ fsr_mult = 0.00012;
10466
+ break;
10467
+ case 2:
10468
+ fsr_mult = 0.00024;
10469
+ break;
10470
+ case 3:
10471
+ fsr_mult = 0.00049;
10472
+ break;
10473
+ }
10474
+ switch(globalDevices[deviceAddr].fsr){
10475
+ case 0:
10476
+ fsr_text = "2g";
10477
+ break;
10478
+ case 1:
10479
+ fsr_text = "4g";
10480
+ break;
10481
+ case 2:
10482
+ fsr_text = "8g";
10483
+ break;
10484
+ case 3:
10485
+ fsr_text = "16g";
10486
+ break;
10487
+ }
10488
+
10489
+ for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
10490
+ label++;
10491
+
10492
+ if('x_offset' in en_axis_data){
10493
+ fft_concat.x.push(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)));
10494
+ }
10495
+ if('y_offset' in en_axis_data){
10496
+ fft_concat.y.push(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)));
10497
+ }
10498
+ if('z_offset' in en_axis_data){
10499
+ fft_concat.z.push(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)));
10500
+ }
10501
+ }
10502
+ var fft_concat_obj = {
10503
+ mode: payload[8],
10504
+ msg_type: msg_type,
10505
+ time_id: [
10506
+ String(globalDevices[deviceAddr].hour).padStart(2, '0'),
10507
+ String(globalDevices[deviceAddr].minute).padStart(2, '0'),
10508
+ ].join(':'),
10509
+ mac_address: deviceAddr,
10510
+ fsr: fsr_text,
10511
+ odr: globalDevices[deviceAddr].odr,
10512
+ temperature: globalDevices[deviceAddr].temperature,
10513
+ total_samples: label,
10514
+ fft_confidence : ((Object.keys(globalDevices[deviceAddr].data).length / expected_packets) * 100).toFixed(2) + '%',
10515
+ data: fft_concat
10516
+ };
10517
+ sensor_data = fft_concat_obj;
10518
+ delete globalDevices[deviceAddr];
10519
+ return sensor_data;
10520
+ }
10521
+ else{
10287
10522
  return;
10288
10523
  }
10289
10524
  }
@@ -10747,179 +10982,65 @@ function sensor_types(parent){
10747
10982
 
10748
10983
  if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
10749
10984
  if(expected_packets != 1){
10750
- // 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
10751
- if(current_packet in globalDevices[deviceAddr].data || current_packet == 1 || !((current_packet-1) in globalDevices[deviceAddr].data)) {
10752
- console.log('-----');
10753
- console.log('bad packet breakdown deleting stream');
10754
- console.log(current_packet);
10755
- console.log(expected_packets);
10756
- console.log(current_packet in globalDevices[deviceAddr].data);
10757
- console.log(current_packet == 1);
10758
- console.log(!((current_packet-1) in globalDevices[deviceAddr].data));
10759
- if(this.hasOwnProperty('failure_no')){
10760
- this.failure_no = this.failure_no + 1;
10761
- }
10762
- else{
10763
- this.failure_no = 1;
10764
- }
10765
- if(this.hasOwnProperty('failure_no')){
10766
- console.log('####falure no');
10767
- console.log(this.failure_no);
10768
- }
10769
- // console.log(globalDevices[deviceAddr].data);
10770
- delete globalDevices[deviceAddr];
10771
- if(current_packet != 1){
10772
- return;
10773
- } else{
10774
- var mode = payload[8];
10775
- var odr = msbLsb(payload[9], payload[10]);
10776
- var fsr = payload[11] >> 5;
10777
- var temperature = msbLsb(payload[14], payload[15])/100;
10778
-
10779
- globalDevices[deviceAddr] = {
10780
- // stream_size: expected_packets,
10781
- data: {},
10782
- odr: odr,
10783
- mo: mode,
10784
- fsr: fsr,
10785
- hour: hour,
10786
- minute: minute,
10787
- temperature: temperature,
10788
- }
10789
- globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10790
- return;
10791
- }
10792
- }
10793
- else{
10794
- globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10795
- }
10796
- }
10797
- else{
10798
- var mode = payload[8];
10799
- var odr = msbLsb(payload[9], payload[10]);
10800
- var fsr = payload[11] >> 5;
10801
- var temperature = msbLsb(payload[14], payload[15])/100;
10802
-
10803
- globalDevices[deviceAddr] = {
10804
- // stream_size: expected_packets,
10805
- data: {},
10806
- odr: odr,
10807
- mo: mode,
10808
- fsr: fsr,
10809
- hour: hour,
10810
- minute: minute,
10811
- temperature: temperature,
10812
- }
10813
- globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10814
- }
10815
- if(Object.keys(globalDevices[deviceAddr].data).length == expected_packets){
10816
- var raw_data = new Array();
10817
-
10818
- for(const packet in globalDevices[deviceAddr].data){
10819
- raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
10820
- }
10821
- var label = 0;
10822
-
10823
- var fft = new Array();
10824
- var fft_concat = {};
10825
-
10826
- var en_axis_data = {};
10827
- en_axis_data.x_offset = 0;
10828
- en_axis_data.y_offset = 2;
10829
- en_axis_data.z_offset = 4;
10830
- en_axis_data.increment = 6;
10831
- fft_concat = {x: [], y: [], z: []};
10832
-
10833
- var fsr_mult = .00006;
10834
- var fsr_text = "";
10835
- switch(globalDevices[deviceAddr].fsr){
10836
- case 0:
10837
- fsr_mult = 0.00006;
10838
- break;
10839
- case 1:
10840
- fsr_mult = 0.00012;
10841
- break;
10842
- case 2:
10843
- fsr_mult = 0.00024;
10844
- break;
10845
- case 3:
10846
- fsr_mult = 0.00049;
10847
- break;
10848
- }
10849
- switch(globalDevices[deviceAddr].fsr){
10850
- case 0:
10851
- fsr_text = "2g";
10852
- break;
10853
- case 1:
10854
- fsr_text = "4g";
10855
- break;
10856
- case 2:
10857
- fsr_text = "8g";
10858
- break;
10859
- case 3:
10860
- fsr_text = "16g";
10861
- break;
10985
+ // if current packet is equal to last one (duplicated data). This does not apply to the last package
10986
+ if (globalDevices[deviceAddr].last_packet_counter == current_packet){
10987
+ console.log('Duplicated message')
10988
+ return;
10862
10989
  }
10990
+ // if current packet is equal to 1 or last packet counter is higher thant current packet
10991
+ if(current_packet == 1 || (globalDevices[deviceAddr].last_packet_counter > current_packet)){
10992
+ // clear stream
10993
+ delete globalDevices[deviceAddr];
10994
+ // create new stream
10995
+ var mode = payload[8];
10996
+ var odr = msbLsb(payload[9], payload[10]);
10997
+ var fsr = payload[11] >> 5;
10998
+ var temperature = msbLsb(payload[14], payload[15])/100;
10863
10999
 
10864
- for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
10865
- label++;
10866
-
10867
- if('x_offset' in en_axis_data){
10868
- fft_concat.x.push(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)));
10869
- }
10870
- if('y_offset' in en_axis_data){
10871
- fft_concat.y.push(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)));
10872
- }
10873
- if('z_offset' in en_axis_data){
10874
- fft_concat.z.push(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)));
11000
+ globalDevices[deviceAddr] = {
11001
+ data: {},
11002
+ odr: odr,
11003
+ mo: mode,
11004
+ fsr: fsr,
11005
+ hour: hour,
11006
+ minute: minute,
11007
+ temperature: temperature,
10875
11008
  }
10876
- }
10877
-
10878
- // If 4th bit is 1 the packet is from the second probe, if 0 from the first
10879
- var probe = '';
10880
- if(payload[7] & 8){
10881
- probe = '2';
11009
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
11010
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
11011
+ return;
10882
11012
  }
10883
11013
  else{
10884
- probe = '1';
10885
- }
10886
-
10887
- var fft_concat_obj = {
10888
- mode: payload[8],
10889
- msg_type: msg_type,
10890
- probe: probe,
10891
- time_id: [
10892
- String(globalDevices[deviceAddr].hour).padStart(2, '0'),
10893
- String(globalDevices[deviceAddr].minute).padStart(2, '0'),
10894
- ].join(':'),
10895
- probe: probe,
10896
- mac_address: deviceAddr,
10897
- fsr: fsr_text,
10898
- odr: globalDevices[deviceAddr].odr,
10899
- temperature: globalDevices[deviceAddr].temperature,
10900
- total_samples: label,
10901
- data: fft_concat
10902
- };
10903
- sensor_data = fft_concat_obj;
10904
- delete globalDevices[deviceAddr];
10905
- if(this.hasOwnProperty('failure_no')){
10906
- console.log('####falure no');
10907
- console.log(this.failure_no);
11014
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
11015
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10908
11016
  }
10909
-
10910
- return sensor_data;
10911
11017
  }
10912
11018
  else{
10913
- return;
11019
+ var mode = payload[8];
11020
+ var odr = msbLsb(payload[9], payload[10]);
11021
+ var fsr = payload[11] >> 5;
11022
+ var temperature = msbLsb(payload[14], payload[15])/100;
11023
+
11024
+ globalDevices[deviceAddr] = {
11025
+ data: {},
11026
+ odr: odr,
11027
+ mo: mode,
11028
+ fsr: fsr,
11029
+ hour: hour,
11030
+ minute: minute,
11031
+ temperature: temperature,
11032
+ }
11033
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
11034
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10914
11035
  }
10915
- }else{
11036
+ }
11037
+ else{
10916
11038
  var mode = payload[8];
10917
11039
  var odr = msbLsb(payload[9], payload[10]);
10918
11040
  var fsr = payload[11] >> 5;
10919
11041
  var temperature = msbLsb(payload[14], payload[15])/100;
10920
11042
 
10921
11043
  globalDevices[deviceAddr] = {
10922
- // stream_size: expected_packets,
10923
11044
  data: {},
10924
11045
  odr: odr,
10925
11046
  mo: mode,
@@ -10928,7 +11049,101 @@ function sensor_types(parent){
10928
11049
  minute: minute,
10929
11050
  temperature: temperature,
10930
11051
  }
11052
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
10931
11053
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
11054
+ }
11055
+ if(current_packet == expected_packets){
11056
+ var raw_data = new Array();
11057
+ for(const packet in globalDevices[deviceAddr].data){
11058
+ raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
11059
+ }
11060
+ var label = 0;
11061
+
11062
+ var fft = new Array();
11063
+ var fft_concat = {};
11064
+
11065
+ var en_axis_data = {};
11066
+ en_axis_data.x_offset = 0;
11067
+ en_axis_data.y_offset = 2;
11068
+ en_axis_data.z_offset = 4;
11069
+ en_axis_data.increment = 6;
11070
+ fft_concat = {x: [], y: [], z: []};
11071
+
11072
+ var fsr_mult = .00006;
11073
+ var fsr_text = "";
11074
+
11075
+ switch(globalDevices[deviceAddr].fsr){
11076
+ case 0:
11077
+ fsr_mult = 0.00006;
11078
+ break;
11079
+ case 1:
11080
+ fsr_mult = 0.00012;
11081
+ break;
11082
+ case 2:
11083
+ fsr_mult = 0.00024;
11084
+ break;
11085
+ case 3:
11086
+ fsr_mult = 0.00049;
11087
+ break;
11088
+ }
11089
+ switch(globalDevices[deviceAddr].fsr){
11090
+ case 0:
11091
+ fsr_text = "2g";
11092
+ break;
11093
+ case 1:
11094
+ fsr_text = "4g";
11095
+ break;
11096
+ case 2:
11097
+ fsr_text = "8g";
11098
+ break;
11099
+ case 3:
11100
+ fsr_text = "16g";
11101
+ break;
11102
+ }
11103
+
11104
+ for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
11105
+ label++;
11106
+
11107
+ if('x_offset' in en_axis_data){
11108
+ fft_concat.x.push(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)));
11109
+ }
11110
+ if('y_offset' in en_axis_data){
11111
+ fft_concat.y.push(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)));
11112
+ }
11113
+ if('z_offset' in en_axis_data){
11114
+ fft_concat.z.push(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)));
11115
+ }
11116
+ }
11117
+ // If 4th bit is 1 the packet is from the second probe, if 0 from the first
11118
+ var probe = '';
11119
+ if(payload[7] & 8){
11120
+ probe = '2';
11121
+ }
11122
+ else{
11123
+ probe = '1';
11124
+ }
11125
+
11126
+ var fft_concat_obj = {
11127
+ mode: payload[8],
11128
+ msg_type: msg_type,
11129
+ probe: probe,
11130
+ time_id: [
11131
+ String(globalDevices[deviceAddr].hour).padStart(2, '0'),
11132
+ String(globalDevices[deviceAddr].minute).padStart(2, '0'),
11133
+ ].join(':'),
11134
+ mac_address: deviceAddr,
11135
+ fsr: fsr_text,
11136
+ odr: globalDevices[deviceAddr].odr,
11137
+ temperature: globalDevices[deviceAddr].temperature,
11138
+ total_samples: label,
11139
+ fft_confidence : ((Object.keys(globalDevices[deviceAddr].data).length / expected_packets) * 100).toFixed(2) + '%',
11140
+ data: fft_concat
11141
+ };
11142
+ sensor_data = fft_concat_obj;
11143
+ delete globalDevices[deviceAddr];
11144
+ return sensor_data;
11145
+ }
11146
+ else{
10932
11147
  return;
10933
11148
  }
10934
11149
  }
@@ -12264,8 +12479,8 @@ function sensor_types(parent){
12264
12479
  }
12265
12480
  else{
12266
12481
  globalDevices[deviceAddr].last_packet_counter = current_packet;
12267
- globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
12268
- }
12482
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
12483
+ }
12269
12484
  }
12270
12485
  else{
12271
12486
  var mode = payload[8];
@@ -13120,21 +13335,25 @@ function sensor_types(parent){
13120
13335
  '118': {
13121
13336
  name: 'Dual Pressure and Temperature Sensor',
13122
13337
  parse: (payload, parsed, mac) => {
13123
- let res = {
13124
- pressure_s1: signInt(payload.slice(8, 12).reduce(msbLsb),16)/100,
13125
- temperature_s1: signInt(payload.slice(12, 14).reduce(msbLsb),16)/100,
13126
- pressure_s2: signInt(payload.slice(14, 18).reduce(msbLsb),16)/100,
13127
- temperature_s2: signInt(payload.slice(18, 20).reduce(msbLsb),16)/100
13128
- };
13129
- if(payload[7] & 2 && payload[7] & 4){
13130
- res.error = 'Error: Sensor Probe 1 and 2 communication error';
13131
- } else if(payload[7] & 2){
13132
- res.error = 'Error: Sensor Probe 1 communication error';
13133
- } else if(payload[7] & 4){
13134
- res.error = 'Error: Sensor Probe 2 communication error';
13135
- }
13136
- return res;
13137
- },
13338
+ let res = {};
13339
+ if(!(payload[7] & 2)){
13340
+ res.pressure_s1 = signInt(payload.slice(8, 12).reduce(msbLsb),32)/100;
13341
+ res.temperature_s1 = signInt(payload.slice(12, 14).reduce(msbLsb),16)/100;
13342
+ }else{
13343
+ res.pressure_s1 = null;
13344
+ res.temperature_s1 = null;
13345
+ res.error_s1 = 'Error: Sensor Probe 1 communication error';
13346
+ }
13347
+ if(!(payload[7] & 4)){
13348
+ res.pressure_s2 = signInt(payload.slice(14, 18).reduce(msbLsb),32)/100;
13349
+ res.temperature_s2 = signInt(payload.slice(18, 20).reduce(msbLsb),16)/100;
13350
+ }else{
13351
+ res.pressure_s2 = null;
13352
+ res.temperature_s2 = null;
13353
+ res.error_s2 = 'Error: Sensor Probe 2 communication error';
13354
+ }
13355
+ return res;
13356
+ },
13138
13357
  'parse_fly': (frame) => {
13139
13358
  let psi_1;
13140
13359
  let psi_2;
@@ -13577,7 +13796,7 @@ function sensor_types(parent){
13577
13796
  return {
13578
13797
  'firmware': frame[2],
13579
13798
  'fsr': frame_data.fsr,
13580
- 'boot_time': frame[17] + " sec",
13799
+ 'boot_up_time': frame[17] + " sec",
13581
13800
  'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
13582
13801
  'auto_check_interval': frame_data.auto_check_interval,
13583
13802
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
@@ -13591,7 +13810,7 @@ function sensor_types(parent){
13591
13810
  'machine_values': {
13592
13811
  'firmware': frame[2],
13593
13812
  'fsr': frame[16],
13594
- 'boot_time': frame[17],
13813
+ 'boot_up_time': frame[17],
13595
13814
  'adc_pin_reading': frame.slice(18, 20),
13596
13815
  'auto_check_interval': frame.slice(20, 22),
13597
13816
  'auto_check_percentage': frame.slice(22, 24),
@@ -14348,7 +14567,7 @@ function sensor_types(parent){
14348
14567
  };
14349
14568
  },
14350
14569
  'parse_fly': (frame) => {
14351
- if(frame[2] > 2){
14570
+ if(frame[2] > 3){
14352
14571
  let date = [
14353
14572
  String(frame.slice(20, 22).reduce(msbLsb)),
14354
14573
  String(frame[22]).padStart(2, '0'),
@@ -16906,8 +17125,8 @@ function sensor_types(parent){
16906
17125
  return {
16907
17126
  'firmware': frame[2],
16908
17127
  'fsr': frame_data.fsr,
16909
- 'boot_time': frame[17] + " sec",
16910
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
17128
+ 'boot_up_time': frame[17] + " sec",
17129
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
16911
17130
  'auto_check_interval': frame_data.auto_check_interval,
16912
17131
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
16913
17132
  'always_on': frame_data.always_on,
@@ -16920,8 +17139,8 @@ function sensor_types(parent){
16920
17139
  'machine_values': {
16921
17140
  'firmware': frame[2],
16922
17141
  'fsr': frame[16],
16923
- 'boot_time': frame[17],
16924
- 'power_adc': frame.slice(18, 20),
17142
+ 'boot_up_time': frame[17],
17143
+ 'adc_pin_reading': frame.slice(18, 20),
16925
17144
  'auto_check_interval': frame.slice(20, 22),
16926
17145
  'auto_check_percentage': frame.slice(22, 24),
16927
17146
  'always_on': frame[24],
@@ -17517,6 +17736,167 @@ function sensor_types(parent){
17517
17736
  }
17518
17737
  }
17519
17738
  },
17739
+ '545': {
17740
+ name: 'Fox Thermal Flow Sensor',
17741
+ parse: (payload, parsed, mac) => {
17742
+ let sensor_status = '';
17743
+ const error_message = [];
17744
+ if(payload[8] & 1){
17745
+ error_message.push('pwr_up');
17746
+ }
17747
+ if(payload[8] & 2){
17748
+ error_message.push('flw_hi_lim');
17749
+ }
17750
+ if(payload[8] & 4){
17751
+ error_message.push('flw_lo_lim');
17752
+ }
17753
+ if(payload[8] & 8){
17754
+ error_message.push('tmp_hi_lim');
17755
+ }
17756
+ if(payload[8] & 16){
17757
+ error_message.push('tmp_lo_lim');
17758
+ }
17759
+ if(payload[8] & 32){
17760
+ error_message.push('sensor_oor');
17761
+ }
17762
+ if(payload[8] & 64){
17763
+ error_message.push('gas_mix_err');
17764
+ }
17765
+ if(payload[8] & 128){
17766
+ error_message.push('inc_set');
17767
+ }
17768
+ if(error_message.length === 0){
17769
+ sensor_status = 'ready';
17770
+ } else {
17771
+ sensor_status = error_message.join(', ');
17772
+ }
17773
+
17774
+ const calv_value = payload.slice(9, 11).reduce(msbLsb) / 100;
17775
+ let cal_val = '';
17776
+ if(calv_value < 0.80){
17777
+ cal_val = 'pass';
17778
+ } else if(calv_value <= 1.0){
17779
+ cal_val = 'warning';
17780
+ } else {
17781
+ cal_val = 'fail';
17782
+ }
17783
+
17784
+ return {
17785
+ sensor_status: sensor_status,
17786
+ calcv_value: payload.slice(9, 11).reduce(msbLsb) / 100,
17787
+ calcv_status: cal_val,
17788
+ flow: payload.slice(11, 15).reduce(msbLsb)/100,
17789
+ ghv: payload.slice(15, 19).reduce(msbLsb)/100,
17790
+ total_flow: payload.slice(19, 27).reduce(msbLsb)/100,
17791
+ temperature: payload.slice(27,29).reduce(msbLsb)/100,
17792
+ density: payload.slice(29, 31).reduce(msbLsb)/100
17793
+ };
17794
+ },
17795
+ 'parse_fly': (frame) => {
17796
+ let frame_data = {};
17797
+ switch(frame[12]){
17798
+ case 0:
17799
+ frame_data.flow_unit = 'scf_m';
17800
+ break;
17801
+ case 1:
17802
+ frame_data.flow_unit = 'scf_h';
17803
+ break;
17804
+ case 2:
17805
+ frame_data.flow_unit = 'nm3_h';
17806
+ break;
17807
+ case 3:
17808
+ frame_data.flow_unit = 'nm3_m';
17809
+ break;
17810
+ case 4:
17811
+ frame_data.flow_unit = 'kg_h';
17812
+ break;
17813
+ case 5:
17814
+ frame_data.flow_unit = 'kg_m';
17815
+ break;
17816
+ case 6:
17817
+ frame_data.flow_unit = 'kg_s';
17818
+ break;
17819
+ case 7:
17820
+ frame_data.flow_unit = 'lbs_h';
17821
+ break;
17822
+ case 8:
17823
+ frame_data.flow_unit = 'lbs_m';
17824
+ break;
17825
+ case 9:
17826
+ frame_data.flow_unit = 'lbs_s';
17827
+ break;
17828
+ case 10:
17829
+ frame_data.flow_unit = 'nlp_h';
17830
+ break;
17831
+ case 11:
17832
+ frame_data.flow_unit = 'nlp_m';
17833
+ break;
17834
+ case 12:
17835
+ frame_data.flow_unit = 'mmscf_d';
17836
+ break;
17837
+ case 13:
17838
+ frame_data.flow_unit = 'lbs_d';
17839
+ break;
17840
+ case 14:
17841
+ frame_data.flow_unit = 'slp_m';
17842
+ break;
17843
+ case 15:
17844
+ frame_data.flow_unit = 'nlp_s';
17845
+ break;
17846
+ case 16:
17847
+ frame_data.flow_unit = 'mscf_d';
17848
+ break;
17849
+ case 17:
17850
+ frame_data.flow_unit = 'sm3_h';
17851
+ break;
17852
+ case 18:
17853
+ frame_data.flow_unit = 'mt_h';
17854
+ break;
17855
+ case 19:
17856
+ frame_data.flow_unit = 'nm3_d';
17857
+ break;
17858
+ case 20:
17859
+ frame_data.flow_unit = 'mmscf_m';
17860
+ break;
17861
+ case 21:
17862
+ frame_data.flow_unit = 'scf_d';
17863
+ break;
17864
+ case 22:
17865
+ frame_data.flow_unit = 'mcf_d';
17866
+ break;
17867
+ case 23:
17868
+ frame_data.flow_unit = 'sm3_m';
17869
+ break;
17870
+ case 24:
17871
+ frame_data.flow_unit = 'sm3_d';
17872
+ break;
17873
+ }
17874
+ switch(frame[13]){
17875
+ case 0:
17876
+ frame_data.temperature_unit = 'F';
17877
+ break;
17878
+ case 1:
17879
+ frame_data.temperature_unit = 'C';
17880
+ break;
17881
+ }
17882
+ return {
17883
+ 'firmware': frame[2],
17884
+ 'flow_unit': frame_data.flow_unit,
17885
+ 'temperature_unit': frame_data.temperature_unit,
17886
+ 'hardware_id': frame.slice(14, 17),
17887
+ 'report_rate': frame.slice(17, 21).reduce(msbLsb),
17888
+ 'tx_life_counter': frame.slice(21, 25).reduce(msbLsb),
17889
+ 'machine_values': {
17890
+ 'firmware': frame[2],
17891
+ 'flow_unit': frame[12],
17892
+ 'temperature_unit': frame[13],
17893
+ 'hardware_id': frame.slice(14, 17),
17894
+ 'report_rate': frame.slice(17, 21),
17895
+ 'tx_life_counter': frame.slice(21, 25)
17896
+ }
17897
+ }
17898
+ }
17899
+ },
17520
17900
  '1010': {
17521
17901
  name: 'RS232 Wireless Converter',
17522
17902
  parse: (d) => {