@ncd-io/node-red-enterprise-sensors 1.4.6 → 1.6.0

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){
@@ -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],
@@ -4265,8 +4318,8 @@ function sensor_types(parent){
4265
4318
  return {
4266
4319
  'firmware': frame[2],
4267
4320
  'fsr': frame_data.fsr,
4268
- 'boot_time': frame[17] + " sec",
4269
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
4321
+ 'boot_up_time': frame[17] + " sec",
4322
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
4270
4323
  'auto_check_interval': frame_data.auto_check_interval,
4271
4324
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
4272
4325
  'always_on': frame_data.always_on,
@@ -4279,8 +4332,8 @@ function sensor_types(parent){
4279
4332
  'machine_values': {
4280
4333
  'firmware': frame[2],
4281
4334
  'fsr': frame[16],
4282
- 'boot_time': frame[17],
4283
- 'power_adc': frame.slice(18, 20),
4335
+ 'boot_up_time': frame[17],
4336
+ 'adc_pin_reading': frame.slice(18, 20),
4284
4337
  'auto_check_interval': frame.slice(20, 22),
4285
4338
  'auto_check_percentage': frame.slice(22, 24),
4286
4339
  'always_on': frame[24],
@@ -4354,8 +4407,8 @@ function sensor_types(parent){
4354
4407
  return {
4355
4408
  'firmware': frame[2],
4356
4409
  'fsr': frame_data.fsr,
4357
- 'boot_time': frame[17] + " sec",
4358
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
4410
+ 'boot_up_time': frame[17] + " sec",
4411
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
4359
4412
  'auto_check_interval': frame_data.auto_check_interval,
4360
4413
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
4361
4414
  'always_on': frame_data.always_on,
@@ -4368,8 +4421,8 @@ function sensor_types(parent){
4368
4421
  'machine_values': {
4369
4422
  'firmware': frame[2],
4370
4423
  'fsr': frame[16],
4371
- 'boot_time': frame[17],
4372
- 'power_adc': frame.slice(18, 20),
4424
+ 'boot_up_time': frame[17],
4425
+ 'adc_pin_reading': frame.slice(18, 20),
4373
4426
  'auto_check_interval': frame.slice(20, 22),
4374
4427
  'auto_check_percentage': frame.slice(22, 24),
4375
4428
  'always_on': frame[24],
@@ -4805,8 +4858,8 @@ function sensor_types(parent){
4805
4858
  return {
4806
4859
  'firmware': frame[2],
4807
4860
  'fsr': frame_data.fsr,
4808
- 'boot_time': frame[17] + " sec",
4809
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
4861
+ 'boot_up_time': frame[17] + " sec",
4862
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
4810
4863
  'auto_check_interval': frame_data.auto_check_interval,
4811
4864
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
4812
4865
  'always_on': frame_data.always_on,
@@ -4819,8 +4872,8 @@ function sensor_types(parent){
4819
4872
  'machine_values': {
4820
4873
  'firmware': frame[2],
4821
4874
  'fsr': frame[16],
4822
- 'boot_time': frame[17],
4823
- 'power_adc': frame.slice(18, 20),
4875
+ 'boot_up_time': frame[17],
4876
+ 'adc_pin_reading': frame.slice(18, 20),
4824
4877
  'auto_check_interval': frame.slice(20, 22),
4825
4878
  'auto_check_percentage': frame.slice(22, 24),
4826
4879
  'always_on': frame[24],
@@ -5021,7 +5074,7 @@ function sensor_types(parent){
5021
5074
  'calibration_days': frame[12] + ' days',
5022
5075
  'sensor_update_rate':frame.slice(13, 15).reduce(msbLsb) + ' sec',
5023
5076
  'heater_duration': frame.slice(15, 17).reduce(msbLsb) + ' msec',
5024
- 'heater_temperature': frame.slice(17, 19).reduce(msbLsb) + ' °C',
5077
+ 'heater_temperature': frame.slice(17, 19).reduce(msbLsb) + ' C',
5025
5078
  'hardware_id': frame.slice(19, 22),
5026
5079
  'report_rate': frame.slice(22, 26).reduce(msbLsb) + ' sec',
5027
5080
  'tx_counter': frame.slice(26, 30).reduce(msbLsb),
@@ -5101,8 +5154,8 @@ function sensor_types(parent){
5101
5154
  return {
5102
5155
  'firmware': frame[2],
5103
5156
  'fsr': frame_data.fsr,
5104
- 'boot_time': frame[17] + " sec",
5105
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
5157
+ 'boot_up_time': frame[17] + " sec",
5158
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
5106
5159
  'auto_check_interval': frame_data.auto_check_interval,
5107
5160
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
5108
5161
  'always_on': frame_data.always_on,
@@ -5115,8 +5168,8 @@ function sensor_types(parent){
5115
5168
  'machine_values': {
5116
5169
  'firmware': frame[2],
5117
5170
  'fsr': frame[16],
5118
- 'boot_time': frame[17],
5119
- 'power_adc': frame.slice(18, 20),
5171
+ 'boot_up_time': frame[17],
5172
+ 'adc_pin_reading': frame.slice(18, 20),
5120
5173
  'auto_check_interval': frame.slice(20, 22),
5121
5174
  'auto_check_percentage': frame.slice(22, 24),
5122
5175
  'always_on': frame[24],
@@ -5174,8 +5227,8 @@ function sensor_types(parent){
5174
5227
  return {
5175
5228
  'firmware': frame[2],
5176
5229
  'fsr': frame_data.fsr,
5177
- 'boot_time': frame[17] + " sec",
5178
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
5230
+ 'boot_up_time': frame[17] + " sec",
5231
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
5179
5232
  'auto_check_interval': frame_data.auto_check_interval,
5180
5233
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
5181
5234
  'always_on': frame_data.always_on,
@@ -5188,8 +5241,8 @@ function sensor_types(parent){
5188
5241
  'machine_values': {
5189
5242
  'firmware': frame[2],
5190
5243
  'fsr': frame[16],
5191
- 'boot_time': frame[17],
5192
- 'power_adc': frame.slice(18, 20),
5244
+ 'boot_up_time': frame[17],
5245
+ 'adc_pin_reading': frame.slice(18, 20),
5193
5246
  'auto_check_interval': frame.slice(20, 22),
5194
5247
  'auto_check_percentage': frame.slice(22, 24),
5195
5248
  'always_on': frame[24],
@@ -7858,8 +7911,8 @@ function sensor_types(parent){
7858
7911
  return {
7859
7912
  'firmware': frame[2],
7860
7913
  'fsr': frame_data.fsr,
7861
- 'boot_time': frame[17] + " sec",
7862
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
7914
+ 'boot_up_time': frame[17] + " sec",
7915
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
7863
7916
  'auto_check_interval': frame_data.auto_check_interval,
7864
7917
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
7865
7918
  'always_on': frame_data.always_on,
@@ -7870,8 +7923,8 @@ function sensor_types(parent){
7870
7923
  'machine_values': {
7871
7924
  'firmware': frame[2],
7872
7925
  'fsr': frame[16],
7873
- 'boot_time': frame[17],
7874
- 'power_adc': frame.slice(18, 20),
7926
+ 'boot_up_time': frame[17],
7927
+ 'adc_pin_reading': frame.slice(18, 20),
7875
7928
  'auto_check_interval': frame.slice(20, 22),
7876
7929
  'auto_check_threshold': frame.slice(22, 24),
7877
7930
  'always_on': frame[24],
@@ -7942,8 +7995,8 @@ function sensor_types(parent){
7942
7995
  return {
7943
7996
  'firmware': frame[2],
7944
7997
  'fsr': frame_data.fsr,
7945
- 'boot_time': frame[17] + " sec",
7946
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
7998
+ 'boot_up_time': frame[17] + " sec",
7999
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
7947
8000
  'auto_check_interval': frame_data.auto_check_interval,
7948
8001
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
7949
8002
  'always_on': frame_data.always_on,
@@ -7956,8 +8009,8 @@ function sensor_types(parent){
7956
8009
  'machine_values': {
7957
8010
  'firmware': frame[2],
7958
8011
  'fsr': frame[16],
7959
- 'boot_time': frame[17],
7960
- 'power_adc': frame.slice(18, 20),
8012
+ 'boot_up_time': frame[17],
8013
+ 'adc_pin_reading': frame.slice(18, 20),
7961
8014
  'auto_check_interval': frame.slice(20, 22),
7962
8015
  'auto_check_percentage': frame.slice(22, 24),
7963
8016
  'always_on': frame[24],
@@ -8014,8 +8067,8 @@ function sensor_types(parent){
8014
8067
  return {
8015
8068
  'firmware': frame[2],
8016
8069
  'fsr': frame_data.fsr,
8017
- 'boot_time': frame[17] + " sec",
8018
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
8070
+ 'boot_up_time': frame[17] + " sec",
8071
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
8019
8072
  'auto_check_interval': frame_data.auto_check_interval,
8020
8073
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
8021
8074
  'always_on': frame_data.always_on,
@@ -8028,8 +8081,8 @@ function sensor_types(parent){
8028
8081
  'machine_values': {
8029
8082
  'firmware': frame[2],
8030
8083
  'fsr': frame[16],
8031
- 'boot_time': frame[17],
8032
- 'power_adc': frame.slice(18, 20),
8084
+ 'boot_up_time': frame[17],
8085
+ 'adc_pin_reading': frame.slice(18, 20),
8033
8086
  'auto_check_interval': frame.slice(20, 22),
8034
8087
  'auto_check_percentage': frame.slice(22, 24),
8035
8088
  'always_on': frame[24],
@@ -8390,8 +8443,8 @@ function sensor_types(parent){
8390
8443
  return {
8391
8444
  'firmware': frame[2],
8392
8445
  'fsr': frame_data.fsr,
8393
- 'boot_time': frame[17] + " sec",
8394
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
8446
+ 'boot_up_time': frame[17] + " sec",
8447
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
8395
8448
  'auto_check_interval': frame_data.auto_check_interval,
8396
8449
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
8397
8450
  'always_on': frame_data.always_on,
@@ -8404,8 +8457,8 @@ function sensor_types(parent){
8404
8457
  'machine_values': {
8405
8458
  'firmware': frame[2],
8406
8459
  'fsr': frame[16],
8407
- 'boot_time': frame[17],
8408
- 'power_adc': frame.slice(18, 20),
8460
+ 'boot_up_time': frame[17],
8461
+ 'adc_pin_reading': frame.slice(18, 20),
8409
8462
  'auto_check_interval': frame.slice(20, 22),
8410
8463
  'auto_check_percentage': frame.slice(22, 24),
8411
8464
  'always_on': frame[24],
@@ -8480,14 +8533,46 @@ function sensor_types(parent){
8480
8533
  name: 'Custom Wireless Accelerometer Sensor',
8481
8534
  parse: (payload, parsed, mac) => {
8482
8535
  if(payload[9] === 0){ // mode raw
8536
+ var sensor_type = payload[8];
8483
8537
  var deviceAddr = mac;
8484
8538
  var data = {};
8485
- switch(payload[8]){
8539
+ switch(sensor_type){
8486
8540
  case 1:
8487
8541
  data.sensor_type = 'Accel';
8542
+ switch(payload[11]){
8543
+ case 0:
8544
+ data.odr = '8000Hz';
8545
+ break;
8546
+ case 1:
8547
+ data.odr = '4000Hz';
8548
+ break;
8549
+ case 2:
8550
+ data.odr = '2000Hz';
8551
+ break;
8552
+ case 3:
8553
+ data.odr = '1000Hz';
8554
+ break;
8555
+ case 4:
8556
+ data.odr = '100Hz';
8557
+ break;
8558
+ }
8488
8559
  break;
8489
8560
  case 2:
8490
8561
  data.sensor_type = 'gyro';
8562
+ switch(payload[11]){
8563
+ case 0:
8564
+ data.odr = '125Hz';
8565
+ break;
8566
+ case 1:
8567
+ data.odr = '250Hz';
8568
+ break;
8569
+ case 2:
8570
+ data.odr = '500Hz';
8571
+ break;
8572
+ case 3:
8573
+ data.odr = '1000Hz';
8574
+ break;
8575
+ }
8491
8576
  break;
8492
8577
  }
8493
8578
  switch(payload[10]){
@@ -8500,7 +8585,7 @@ function sensor_types(parent){
8500
8585
  }
8501
8586
 
8502
8587
  var mode = payload[9];
8503
- var odr = payload[11];
8588
+ var odr = data.odr;
8504
8589
  var en_axis = payload[12] & 7;
8505
8590
  var fsr = payload[12] >> 5;
8506
8591
  var hour = payload[13];
@@ -8511,23 +8596,6 @@ function sensor_types(parent){
8511
8596
  var current_packet = payload.slice(21, 23).reduce(msbLsb);
8512
8597
  var data_start = 23;
8513
8598
 
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
8599
  if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
8532
8600
  if(expected_packets != 1){
8533
8601
  // if current packet is equal to last one (duplicated data). This does not apply to the last package
@@ -8613,28 +8681,28 @@ function sensor_types(parent){
8613
8681
 
8614
8682
  /* Evaluate sensor type */
8615
8683
  if(payload[8] == 1){ // accelerometer
8616
- var fsr_mult = 0.00030;
8684
+ var fsr_mult = 0.00732;
8617
8685
  var fsr_text = "";
8618
8686
  switch(globalDevices[deviceAddr].fsr){
8619
8687
  case 0:
8620
- fsr_mult = 0.00030;
8688
+ fsr_mult = 0.00732;
8621
8689
  break;
8622
8690
  case 1:
8623
- fsr_mult = 0.00061;
8691
+ fsr_mult = 0.01464;
8624
8692
  break;
8625
8693
  case 2:
8626
- fsr_mult = 0.00122;
8694
+ fsr_mult = 0.02929;
8627
8695
  break;
8628
8696
  }
8629
8697
  switch(globalDevices[deviceAddr].fsr){
8630
8698
  case 0:
8631
- fsr_text = "10g";
8699
+ fsr_text = "15g";
8632
8700
  break;
8633
8701
  case 1:
8634
- fsr_text = "20g";
8702
+ fsr_text = "30g";
8635
8703
  break;
8636
8704
  case 2:
8637
- fsr_text = "40g";
8705
+ fsr_text = "60g";
8638
8706
  break;
8639
8707
  }
8640
8708
  }else{ // gyro
@@ -8707,210 +8775,395 @@ function sensor_types(parent){
8707
8775
  }
8708
8776
  }
8709
8777
  },
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
8778
  'parse_fly': (frame) => {
8865
8779
  let firmware = frame[2];
8866
- if(firmware > 13){ // firmware 14 and above
8780
+ if(firmware > 1){
8867
8781
  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";
8782
+ switch(frame[12]){
8783
+ case 0:
8784
+ frame_data.gyro_odr = 125;
8785
+ break;
8786
+ case 1:
8787
+ frame_data.gyro_odr = 250;
8788
+ break;
8789
+ case 2:
8790
+ frame_data.gyro_odr = 500;
8791
+ break;
8792
+ case 3:
8793
+ frame_data.gyro_odr = 1000;
8794
+ break;
8873
8795
  }
8874
- frame_data.always_on = frame[24]?"Enabled":"Disabled";
8875
- switch(frame[16]){
8796
+ switch(frame[13]){
8876
8797
  case 0:
8877
- frame_data.fsr = "+-6.114 V";
8878
- break;
8798
+ frame_data.acc_odr = 8000;
8799
+ break;
8879
8800
  case 1:
8880
- frame_data.fsr = "+-4.096 V";
8881
- break;
8801
+ frame_data.acc_odr = 4000;
8802
+ break;
8882
8803
  case 2:
8883
- frame_data.fsr = "+-2.048 V";
8884
- break;
8804
+ frame_data.acc_odr = 2000;
8805
+ break;
8885
8806
  case 3:
8886
- frame_data.fsr = "+-1.024 V";
8887
- break;
8807
+ frame_data.acc_odr = 1000;
8808
+ break;
8888
8809
  case 4:
8889
- frame_data.fsr = "+-0.512 V";
8890
- break;
8810
+ frame_data.acc_odr = 100;
8811
+ break;
8812
+ }
8813
+ switch(frame[15]){
8814
+ case 0:
8815
+ frame_data.hpf_cutoff = false;
8816
+ break;
8817
+ case 1:
8818
+ frame_data.hpf_cutoff = 0.00247;
8819
+ break;
8820
+ case 2:
8821
+ frame_data.hpf_cutoff = 0.00062084;
8822
+ break;
8823
+ case 3:
8824
+ frame_data.hpf_cutoff = 0.00015545;
8825
+ break;
8826
+ case 4:
8827
+ frame_data.hpf_cutoff = 0.00003862;
8828
+ break;
8891
8829
  case 5:
8892
- frame_data.fsr = "+-0.256 V";
8893
- break;
8830
+ frame_data.hpf_cutoff = 0.00000954;
8831
+ break;
8832
+ case 6:
8833
+ frame_data.hpf_cutoff = 0.00000238;
8834
+ break;
8894
8835
  }
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",
8908
- 'tx_life_counter': frame.slice(44, 48).reduce(msbLsb),
8909
- 'machine_values': {
8836
+ switch(frame[16]){
8837
+ case 0:
8838
+ frame_data.fsr_acc = "15g";
8839
+ break;
8840
+ case 1:
8841
+ frame_data.fsr_acc = "30g";
8842
+ break;
8843
+ case 2:
8844
+ frame_data.fsr_acc = "60g";
8845
+ break;
8846
+ }
8847
+ switch(frame[17]){
8848
+ case 0:
8849
+ frame_data.fsr_gyro = "250dps";
8850
+ break;
8851
+ case 1:
8852
+ frame_data.fsr_gyro = "500dps";
8853
+ break;
8854
+ case 2:
8855
+ frame_data.fsr_gyro = "1000dps";
8856
+ break;
8857
+ case 3:
8858
+ frame_data.fsr_gyro = "2000dps";
8859
+ break;
8860
+ }
8861
+ switch(frame[18]){
8862
+ case 1:
8863
+ frame_data.en_axis = "X Axis";
8864
+ break;
8865
+ case 2:
8866
+ frame_data.en_axis = "Y Axis";
8867
+ break;
8868
+ case 3:
8869
+ frame_data.en_axis = "X-Y Axes";
8870
+ break;
8871
+ case 4:
8872
+ frame_data.en_axis = "Z Axis";
8873
+ break;
8874
+ case 5:
8875
+ frame_data.en_axis = "X-Z Axes";
8876
+ break;
8877
+ case 6:
8878
+ frame_data.en_axis = "Y-Z Axes";
8879
+ break;
8880
+ case 7:
8881
+ frame_data.en_axis = "All Axes";
8882
+ break;
8883
+ }
8884
+ switch(frame[19]){
8885
+ case 0:
8886
+ frame_data.sampling_interval = 5;
8887
+ break;
8888
+ case 1:
8889
+ frame_data.sampling_interval = 10;
8890
+ break;
8891
+ case 2:
8892
+ frame_data.sampling_interval = 15;
8893
+ break;
8894
+ case 3:
8895
+ frame_data.sampling_interval = 20;
8896
+ break;
8897
+ case 4:
8898
+ frame_data.sampling_interval = 30;
8899
+ break;
8900
+ case 5:
8901
+ frame_data.sampling_interval = 60;
8902
+ break;
8903
+ case 6:
8904
+ frame_data.sampling_interval = 120;
8905
+ break;
8906
+ case 7:
8907
+ frame_data.sampling_interval = 180;
8908
+ break;
8909
+ }
8910
+ switch(frame[21]){
8911
+ case 0:
8912
+ frame_data.en_sensors = "acc_only";
8913
+ break;
8914
+ case 1:
8915
+ frame_data.en_sensors = "gyro_only";
8916
+ break;
8917
+ case 2:
8918
+ frame_data.en_sensors = "both_enabled";
8919
+ break;
8920
+ }
8921
+ frame_data.hpf_cutoff = (frame_data.hpf_cutoff)?((frame_data.hpf_cutoff * frame_data.acc_odr).toFixed(2) + 'Hz'):'disabled';
8922
+ return {
8923
+ 'firmware': firmware,
8924
+ 'gyro_sample_rate': frame_data.gyro_odr + 'Hz',
8925
+ 'acc_sample_rate': frame_data.acc_odr + 'Hz',
8926
+ 'sampling_duration': (frame[14]* 50) + 'msec',
8927
+ 'hpf_cutoff': frame_data.hpf_cutoff,
8928
+ 'acc_fsr': frame_data.fsr_acc,
8929
+ 'gyro_fsr': frame_data.fsr_gyro,
8930
+ 'axis_enabled': frame_data.en_axis,
8931
+ 'sampling_interval': frame_data.sampling_interval + 'min',
8932
+ 'accelerometer_threshold': (frame[20]* 32) + "mg",
8933
+ 'enabled_sensors': frame_data.en_sensors,
8934
+ 'max_num_of_motion_tx_per_interval': frame[22],
8935
+ 'rtc': [
8936
+ String(frame[23]).padStart(2, '0'),
8937
+ String(frame[24]).padStart(2, '0'),
8938
+ String(frame[25]).padStart(2, '0')
8939
+ ].join(':'),
8940
+ 'hardware_id': frame.slice(26, 29),
8941
+ 'report_rate': frame.slice(29, 33).reduce(msbLsb),
8942
+ 'tx_life_counter': frame.slice(33, 37).reduce(msbLsb),
8943
+ 'machine_values': {
8944
+ 'firmware': frame[2],
8945
+ 'gyro_sample_rate': frame[12],
8946
+ 'acc_sample_rate': frame[13],
8947
+ 'sampling_duration': frame[14],
8948
+ 'hpf_cutoff': frame[15],
8949
+ 'acc_fsr': frame[16],
8950
+ 'gyro_fsr': frame[17],
8951
+ 'axis_enabled': frame[18],
8952
+ 'sampling_interval': frame[19],
8953
+ 'accelerometer_threshold': frame[20],
8954
+ 'enabled_sensors': frame[21],
8955
+ 'max_num_of_motion_tx_per_interval': frame[22],
8956
+ 'hour': frame[23],
8957
+ 'minute': frame[24],
8958
+ 'second': frame[25],
8959
+ 'hardware_id': frame.slice(26, 29),
8960
+ 'report_rate': frame.slice(29, 33),
8961
+ 'tx_life_counter': frame.slice(33, 37)
8962
+ }
8963
+ }
8964
+ }else{
8965
+ let frame_data = {};
8966
+ switch(frame[12]){
8967
+ case 0:
8968
+ frame_data.odr = 125;
8969
+ break;
8970
+ case 1:
8971
+ frame_data.odr = 250;
8972
+ break;
8973
+ case 2:
8974
+ frame_data.odr = 500;
8975
+ break;
8976
+ case 3:
8977
+ frame_data.odr = 1000;
8978
+ break;
8979
+ }
8980
+ switch(frame[15]){
8981
+ case 0:
8982
+ frame_data.fsr_acc = "10g";
8983
+ break;
8984
+ case 1:
8985
+ frame_data.fsr_acc = "20g";
8986
+ break;
8987
+ case 2:
8988
+ frame_data.fsr_acc = "40g";
8989
+ break;
8990
+ }
8991
+ switch(frame[16]){
8992
+ case 0:
8993
+ frame_data.fsr_gyro = "250dps";
8994
+ break;
8995
+ case 1:
8996
+ frame_data.fsr_gyro = "500dps";
8997
+ break;
8998
+ case 2:
8999
+ frame_data.fsr_gyro = "1000dps";
9000
+ break;
9001
+ case 3:
9002
+ frame_data.fsr_gyro = "2000dps";
9003
+ break;
9004
+ }
9005
+ switch(frame[17]){
9006
+ case 7:
9007
+ frame_data.en_axis = "all";
9008
+ break;
9009
+ }
9010
+ switch(frame[20]){
9011
+ case 1:
9012
+ frame_data.en_sensors = "gyro_only";
9013
+ break;
9014
+ case 2:
9015
+ frame_data.en_sensors = "accel_only";
9016
+ break;
9017
+ case 3:
9018
+ frame_data.en_sensors = "all_enabled";
9019
+ break;
9020
+ }
9021
+ switch(frame[18]){
9022
+ case 0:
9023
+ frame_data.sampling_interval = 5;
9024
+ break;
9025
+ case 1:
9026
+ frame_data.sampling_interval = 10;
9027
+ break;
9028
+ case 2:
9029
+ frame_data.sampling_interval = 15;
9030
+ break;
9031
+ case 3:
9032
+ frame_data.sampling_interval = 20;
9033
+ break;
9034
+ case 4:
9035
+ frame_data.sampling_interval = 30;
9036
+ break;
9037
+ case 5:
9038
+ frame_data.sampling_interval = 60;
9039
+ break;
9040
+ case 6:
9041
+ frame_data.sampling_interval = 120;
9042
+ break;
9043
+ case 7:
9044
+ frame_data.sampling_interval = 180;
9045
+ break;
9046
+ }
9047
+ switch(frame[14]){
9048
+ case 0:
9049
+ frame_data.hpf_cutoff = 0.00247;
9050
+ break;
9051
+ case 1:
9052
+ frame_data.hpf_cutoff = 0.00062084;
9053
+ break;
9054
+ case 2:
9055
+ frame_data.hpf_cutoff = 0.00015545;
9056
+ break;
9057
+ case 3:
9058
+ frame_data.hpf_cutoff = 0.00003862;
9059
+ break;
9060
+ case 4:
9061
+ frame_data.hpf_cutoff = 0.00000954;
9062
+ break;
9063
+ case 5:
9064
+ frame_data.hpf_cutoff = 0.00000238;
9065
+ break;
9066
+ }
9067
+ return {
9068
+ 'firmware': firmware,
9069
+ 'sample_rate': frame_data.odr + 'Hz',
9070
+ 'sampling_duration': (frame[13]* 50) + 'msec',
9071
+ 'hpf_cutoff': (frame_data.hpf_cutoff * frame_data.odr).toFixed(2) + 'Hz',
9072
+ 'acc_fsr': frame_data.fsr_acc,
9073
+ 'gyro_fsr': frame_data.fsr_gyro,
9074
+ 'axis_enabled': frame_data.en_axis,
9075
+ 'sampling_interval': frame_data.sampling_interval + 'min',
9076
+ 'accelerometer_threshold': (frame[19]* 32) + "mg",
9077
+ 'enabled_sensors': frame_data.en_sensors,
9078
+ 'rtc': [
9079
+ String(frame[21]).padStart(2, '0'),
9080
+ String(frame[22]).padStart(2, '0'),
9081
+ String(frame[23]).padStart(2, '0')
9082
+ ].join(':'),
9083
+ 'hardware_id': frame.slice(24, 27),
9084
+ 'report_rate': frame.slice(27, 31).reduce(msbLsb),
9085
+ 'tx_life_counter': frame.slice(31, 35).reduce(msbLsb),
9086
+ 'machine_values': {
9087
+ 'firmware': frame[2],
9088
+ 'odr': frame[12],
9089
+ 'sampling_duration': frame[13],
9090
+ 'hpf_cutoff': frame[14],
9091
+ 'acc_fsr': frame[15],
9092
+ 'gyro_fsr': frame[16],
9093
+ 'axis_enabled': frame[17],
9094
+ 'sampling_interval': frame[18],
9095
+ 'accelerometer_threshold': frame[19],
9096
+ 'enabled_sensors': frame[20],
9097
+ 'hour': frame[21],
9098
+ 'minute': frame[22],
9099
+ 'second': frame[23],
9100
+ 'hardware_id': frame.slice(24, 27),
9101
+ 'report_rate': frame.slice(27, 31),
9102
+ 'tx_life_counter': frame.slice(31, 35)
9103
+ }
9104
+ }
9105
+ }
9106
+ }
9107
+ },
9108
+ '105': {
9109
+ name: '1 Channel Automatic Luber With Ultrasound Vibration Sensor',
9110
+ parse: (d) => {
9111
+ return {
9112
+ raw_adc: d.slice(0, 2).reduce(msbLsb),
9113
+ ma: d.slice(2, 4).reduce(msbLsb) / 100,
9114
+ db: d.slice(4, 6).reduce(msbLsb) / 100
9115
+ };
9116
+ },
9117
+ 'parse_fly': (frame) => {
9118
+ let firmware = frame[2];
9119
+ if(firmware > 13){ // firmware 14 and above
9120
+ let frame_data = {};
9121
+ let auto_check_interval = frame.slice(20, 22).reduce(msbLsb);
9122
+ if(!auto_check_interval){
9123
+ frame_data.auto_check_interval = 'Disabled';
9124
+ }else{
9125
+ frame_data.auto_check_interval = auto_check_interval + " sec";
9126
+ }
9127
+ frame_data.always_on = frame[24]?"Enabled":"Disabled";
9128
+ switch(frame[16]){
9129
+ case 0:
9130
+ frame_data.fsr = "+-6.114 V";
9131
+ break;
9132
+ case 1:
9133
+ frame_data.fsr = "+-4.096 V";
9134
+ break;
9135
+ case 2:
9136
+ frame_data.fsr = "+-2.048 V";
9137
+ break;
9138
+ case 3:
9139
+ frame_data.fsr = "+-1.024 V";
9140
+ break;
9141
+ case 4:
9142
+ frame_data.fsr = "+-0.512 V";
9143
+ break;
9144
+ case 5:
9145
+ frame_data.fsr = "+-0.256 V";
9146
+ break;
9147
+ }
9148
+ return {
9149
+ 'firmware': frame[2],
9150
+ 'fsr': frame_data.fsr,
9151
+ 'boot_up_time': frame[17] + " sec",
9152
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
9153
+ 'auto_check_interval': frame_data.auto_check_interval,
9154
+ 'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
9155
+ 'always_on': frame_data.always_on,
9156
+ 'calibration_one': frame.slice(25, 29).reduce(msbLsb),
9157
+ 'calibration_two':frame.slice(29, 33).reduce(msbLsb),
9158
+ 'calibration_three':frame.slice(33, 37).reduce(msbLsb),
9159
+ 'hardware_id': frame.slice(37, 40),
9160
+ 'report_rate': frame.slice(40, 44).reduce(msbLsb) + " sec",
9161
+ 'tx_life_counter': frame.slice(44, 48).reduce(msbLsb),
9162
+ 'machine_values': {
8910
9163
  'firmware': frame[2],
8911
9164
  'fsr': frame[16],
8912
- 'boot_time': frame[17],
8913
- 'power_adc': frame.slice(18, 20),
9165
+ 'boot_up_time': frame[17],
9166
+ 'adc_pin_reading': frame.slice(18, 20),
8914
9167
  'auto_check_interval': frame.slice(20, 22),
8915
9168
  'auto_check_percentage': frame.slice(22, 24),
8916
9169
  'always_on': frame[24],
@@ -8971,8 +9224,8 @@ function sensor_types(parent){
8971
9224
  return {
8972
9225
  'firmware': frame[2],
8973
9226
  'fsr': frame_data.fsr,
8974
- 'boot_time': frame[17] + " sec",
8975
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
9227
+ 'boot_up_time': frame[17] + " sec",
9228
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
8976
9229
  'auto_check_interval': frame_data.auto_check_interval,
8977
9230
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
8978
9231
  'always_on': frame_data.always_on,
@@ -8985,8 +9238,8 @@ function sensor_types(parent){
8985
9238
  'machine_values': {
8986
9239
  'firmware': frame[2],
8987
9240
  'fsr': frame[16],
8988
- 'boot_time': frame[17],
8989
- 'power_adc': frame.slice(18, 20),
9241
+ 'boot_up_time': frame[17],
9242
+ 'adc_pin_reading': frame.slice(18, 20),
8990
9243
  'auto_check_interval': frame.slice(20, 22),
8991
9244
  'auto_check_percentage': frame.slice(22, 24),
8992
9245
  'always_on': frame[24],
@@ -9057,8 +9310,8 @@ function sensor_types(parent){
9057
9310
  return {
9058
9311
  'firmware': frame[2],
9059
9312
  'fsr': frame_data.fsr,
9060
- 'boot_time': frame[17] + " sec",
9061
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
9313
+ 'boot_up_time': frame[17] + " sec",
9314
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
9062
9315
  'auto_check_interval': frame_data.auto_check_interval,
9063
9316
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
9064
9317
  'always_on': frame_data.always_on,
@@ -9071,8 +9324,8 @@ function sensor_types(parent){
9071
9324
  'machine_values': {
9072
9325
  'firmware': frame[2],
9073
9326
  'fsr': frame[16],
9074
- 'boot_time': frame[17],
9075
- 'power_adc': frame.slice(18, 20),
9327
+ 'boot_up_time': frame[17],
9328
+ 'adc_pin_reading': frame.slice(18, 20),
9076
9329
  'auto_check_interval': frame.slice(20, 22),
9077
9330
  'auto_check_percentage': frame.slice(22, 24),
9078
9331
  'always_on': frame[24],
@@ -10111,51 +10364,36 @@ function sensor_types(parent){
10111
10364
 
10112
10365
  if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
10113
10366
  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);
10367
+ // if current packet is equal to last one (duplicated data). This does not apply to the last package
10368
+ if (globalDevices[deviceAddr].last_packet_counter == current_packet){
10369
+ console.log('Duplicated message')
10370
+ return;
10371
+ }
10372
+ // if current packet is equal to 1 or last packet counter is higher thant current packet
10373
+ if(current_packet == 1 || (globalDevices[deviceAddr].last_packet_counter > current_packet)){
10374
+ // clear stream
10134
10375
  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;
10376
+ // create new stream
10377
+ var mode = payload[8];
10378
+ var odr = msbLsb(payload[9], payload[10]);
10379
+ var fsr = payload[11] >> 5;
10380
+ var temperature = msbLsb(payload[14], payload[15])/100;
10143
10381
 
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;
10382
+ globalDevices[deviceAddr] = {
10383
+ data: {},
10384
+ odr: odr,
10385
+ mo: mode,
10386
+ fsr: fsr,
10387
+ hour: hour,
10388
+ minute: minute,
10389
+ temperature: temperature,
10156
10390
  }
10391
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
10392
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10393
+ return;
10157
10394
  }
10158
10395
  else{
10396
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
10159
10397
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10160
10398
  }
10161
10399
  }
@@ -10166,7 +10404,6 @@ function sensor_types(parent){
10166
10404
  var temperature = msbLsb(payload[14], payload[15])/100;
10167
10405
 
10168
10406
  globalDevices[deviceAddr] = {
10169
- // stream_size: expected_packets,
10170
10407
  data: {},
10171
10408
  odr: odr,
10172
10409
  mo: mode,
@@ -10175,106 +10412,17 @@ function sensor_types(parent){
10175
10412
  minute: minute,
10176
10413
  temperature: temperature,
10177
10414
  }
10415
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
10178
10416
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10179
10417
  }
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
-
10418
+ }
10419
+ else{
10271
10420
  var mode = payload[8];
10272
10421
  var odr = msbLsb(payload[9], payload[10]);
10273
10422
  var fsr = payload[11] >> 5;
10274
10423
  var temperature = msbLsb(payload[14], payload[15])/100;
10275
10424
 
10276
10425
  globalDevices[deviceAddr] = {
10277
- // stream_size: expected_packets,
10278
10426
  data: {},
10279
10427
  odr: odr,
10280
10428
  mo: mode,
@@ -10283,7 +10431,91 @@ function sensor_types(parent){
10283
10431
  minute: minute,
10284
10432
  temperature: temperature,
10285
10433
  }
10434
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
10286
10435
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10436
+ }
10437
+ if(current_packet == expected_packets){
10438
+ var raw_data = new Array();
10439
+ for(const packet in globalDevices[deviceAddr].data){
10440
+ raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
10441
+ }
10442
+ var label = 0;
10443
+
10444
+ var fft = new Array();
10445
+ var fft_concat = {};
10446
+
10447
+ var en_axis_data = {};
10448
+ en_axis_data.x_offset = 0;
10449
+ en_axis_data.y_offset = 2;
10450
+ en_axis_data.z_offset = 4;
10451
+ en_axis_data.increment = 6;
10452
+ fft_concat = {x: [], y: [], z: []};
10453
+
10454
+ var fsr_mult = .00006;
10455
+ var fsr_text = "";
10456
+
10457
+ switch(globalDevices[deviceAddr].fsr){
10458
+ case 0:
10459
+ fsr_mult = 0.00006;
10460
+ break;
10461
+ case 1:
10462
+ fsr_mult = 0.00012;
10463
+ break;
10464
+ case 2:
10465
+ fsr_mult = 0.00024;
10466
+ break;
10467
+ case 3:
10468
+ fsr_mult = 0.00049;
10469
+ break;
10470
+ }
10471
+ switch(globalDevices[deviceAddr].fsr){
10472
+ case 0:
10473
+ fsr_text = "2g";
10474
+ break;
10475
+ case 1:
10476
+ fsr_text = "4g";
10477
+ break;
10478
+ case 2:
10479
+ fsr_text = "8g";
10480
+ break;
10481
+ case 3:
10482
+ fsr_text = "16g";
10483
+ break;
10484
+ }
10485
+
10486
+ for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
10487
+ label++;
10488
+
10489
+ if('x_offset' in en_axis_data){
10490
+ 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)));
10491
+ }
10492
+ if('y_offset' in en_axis_data){
10493
+ 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)));
10494
+ }
10495
+ if('z_offset' in en_axis_data){
10496
+ 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)));
10497
+ }
10498
+ }
10499
+ var fft_concat_obj = {
10500
+ mode: payload[8],
10501
+ msg_type: msg_type,
10502
+ time_id: [
10503
+ String(globalDevices[deviceAddr].hour).padStart(2, '0'),
10504
+ String(globalDevices[deviceAddr].minute).padStart(2, '0'),
10505
+ ].join(':'),
10506
+ mac_address: deviceAddr,
10507
+ fsr: fsr_text,
10508
+ odr: globalDevices[deviceAddr].odr,
10509
+ temperature: globalDevices[deviceAddr].temperature,
10510
+ total_samples: label,
10511
+ fft_confidence : ((Object.keys(globalDevices[deviceAddr].data).length / expected_packets) * 100).toFixed(2) + '%',
10512
+ data: fft_concat
10513
+ };
10514
+ sensor_data = fft_concat_obj;
10515
+ delete globalDevices[deviceAddr];
10516
+ return sensor_data;
10517
+ }
10518
+ else{
10287
10519
  return;
10288
10520
  }
10289
10521
  }
@@ -10747,50 +10979,36 @@ function sensor_types(parent){
10747
10979
 
10748
10980
  if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
10749
10981
  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);
10982
+ // if current packet is equal to last one (duplicated data). This does not apply to the last package
10983
+ if (globalDevices[deviceAddr].last_packet_counter == current_packet){
10984
+ console.log('Duplicated message')
10985
+ return;
10986
+ }
10987
+ // if current packet is equal to 1 or last packet counter is higher thant current packet
10988
+ if(current_packet == 1 || (globalDevices[deviceAddr].last_packet_counter > current_packet)){
10989
+ // clear stream
10770
10990
  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;
10991
+ // create new stream
10992
+ var mode = payload[8];
10993
+ var odr = msbLsb(payload[9], payload[10]);
10994
+ var fsr = payload[11] >> 5;
10995
+ var temperature = msbLsb(payload[14], payload[15])/100;
10778
10996
 
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;
10997
+ globalDevices[deviceAddr] = {
10998
+ data: {},
10999
+ odr: odr,
11000
+ mo: mode,
11001
+ fsr: fsr,
11002
+ hour: hour,
11003
+ minute: minute,
11004
+ temperature: temperature,
10791
11005
  }
10792
- }
11006
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
11007
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
11008
+ return;
11009
+ }
10793
11010
  else{
11011
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
10794
11012
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10795
11013
  }
10796
11014
  }
@@ -10801,7 +11019,6 @@ function sensor_types(parent){
10801
11019
  var temperature = msbLsb(payload[14], payload[15])/100;
10802
11020
 
10803
11021
  globalDevices[deviceAddr] = {
10804
- // stream_size: expected_packets,
10805
11022
  data: {},
10806
11023
  odr: odr,
10807
11024
  mo: mode,
@@ -10810,116 +11027,17 @@ function sensor_types(parent){
10810
11027
  minute: minute,
10811
11028
  temperature: temperature,
10812
11029
  }
11030
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
10813
11031
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10814
11032
  }
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;
10862
- }
10863
-
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)));
10875
- }
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';
10882
- }
10883
- 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);
10908
- }
10909
-
10910
- return sensor_data;
10911
- }
10912
- else{
10913
- return;
10914
- }
10915
- }else{
11033
+ }
11034
+ else{
10916
11035
  var mode = payload[8];
10917
11036
  var odr = msbLsb(payload[9], payload[10]);
10918
11037
  var fsr = payload[11] >> 5;
10919
11038
  var temperature = msbLsb(payload[14], payload[15])/100;
10920
11039
 
10921
11040
  globalDevices[deviceAddr] = {
10922
- // stream_size: expected_packets,
10923
11041
  data: {},
10924
11042
  odr: odr,
10925
11043
  mo: mode,
@@ -10928,7 +11046,101 @@ function sensor_types(parent){
10928
11046
  minute: minute,
10929
11047
  temperature: temperature,
10930
11048
  }
11049
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
10931
11050
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
11051
+ }
11052
+ if(current_packet == expected_packets){
11053
+ var raw_data = new Array();
11054
+ for(const packet in globalDevices[deviceAddr].data){
11055
+ raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
11056
+ }
11057
+ var label = 0;
11058
+
11059
+ var fft = new Array();
11060
+ var fft_concat = {};
11061
+
11062
+ var en_axis_data = {};
11063
+ en_axis_data.x_offset = 0;
11064
+ en_axis_data.y_offset = 2;
11065
+ en_axis_data.z_offset = 4;
11066
+ en_axis_data.increment = 6;
11067
+ fft_concat = {x: [], y: [], z: []};
11068
+
11069
+ var fsr_mult = .00006;
11070
+ var fsr_text = "";
11071
+
11072
+ switch(globalDevices[deviceAddr].fsr){
11073
+ case 0:
11074
+ fsr_mult = 0.00006;
11075
+ break;
11076
+ case 1:
11077
+ fsr_mult = 0.00012;
11078
+ break;
11079
+ case 2:
11080
+ fsr_mult = 0.00024;
11081
+ break;
11082
+ case 3:
11083
+ fsr_mult = 0.00049;
11084
+ break;
11085
+ }
11086
+ switch(globalDevices[deviceAddr].fsr){
11087
+ case 0:
11088
+ fsr_text = "2g";
11089
+ break;
11090
+ case 1:
11091
+ fsr_text = "4g";
11092
+ break;
11093
+ case 2:
11094
+ fsr_text = "8g";
11095
+ break;
11096
+ case 3:
11097
+ fsr_text = "16g";
11098
+ break;
11099
+ }
11100
+
11101
+ for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
11102
+ label++;
11103
+
11104
+ if('x_offset' in en_axis_data){
11105
+ 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)));
11106
+ }
11107
+ if('y_offset' in en_axis_data){
11108
+ 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)));
11109
+ }
11110
+ if('z_offset' in en_axis_data){
11111
+ 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)));
11112
+ }
11113
+ }
11114
+ // If 4th bit is 1 the packet is from the second probe, if 0 from the first
11115
+ var probe = '';
11116
+ if(payload[7] & 8){
11117
+ probe = '2';
11118
+ }
11119
+ else{
11120
+ probe = '1';
11121
+ }
11122
+
11123
+ var fft_concat_obj = {
11124
+ mode: payload[8],
11125
+ msg_type: msg_type,
11126
+ probe: probe,
11127
+ time_id: [
11128
+ String(globalDevices[deviceAddr].hour).padStart(2, '0'),
11129
+ String(globalDevices[deviceAddr].minute).padStart(2, '0'),
11130
+ ].join(':'),
11131
+ mac_address: deviceAddr,
11132
+ fsr: fsr_text,
11133
+ odr: globalDevices[deviceAddr].odr,
11134
+ temperature: globalDevices[deviceAddr].temperature,
11135
+ total_samples: label,
11136
+ fft_confidence : ((Object.keys(globalDevices[deviceAddr].data).length / expected_packets) * 100).toFixed(2) + '%',
11137
+ data: fft_concat
11138
+ };
11139
+ sensor_data = fft_concat_obj;
11140
+ delete globalDevices[deviceAddr];
11141
+ return sensor_data;
11142
+ }
11143
+ else{
10932
11144
  return;
10933
11145
  }
10934
11146
  }
@@ -12264,8 +12476,8 @@ function sensor_types(parent){
12264
12476
  }
12265
12477
  else{
12266
12478
  globalDevices[deviceAddr].last_packet_counter = current_packet;
12267
- globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
12268
- }
12479
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
12480
+ }
12269
12481
  }
12270
12482
  else{
12271
12483
  var mode = payload[8];
@@ -13120,21 +13332,25 @@ function sensor_types(parent){
13120
13332
  '118': {
13121
13333
  name: 'Dual Pressure and Temperature Sensor',
13122
13334
  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
- },
13335
+ let res = {};
13336
+ if(!(payload[7] & 2)){
13337
+ res.pressure_s1 = signInt(payload.slice(8, 12).reduce(msbLsb),16)/100;
13338
+ res.temperature_s1 = signInt(payload.slice(12, 14).reduce(msbLsb),16)/100;
13339
+ }else{
13340
+ res.pressure_s1 = null;
13341
+ res.temperature_s1 = null;
13342
+ res.error_s1 = 'Error: Sensor Probe 1 communication error';
13343
+ }
13344
+ if(!(payload[7] & 4)){
13345
+ res.pressure_s2 = signInt(payload.slice(14, 18).reduce(msbLsb),16)/100;
13346
+ res.temperature_s2 = signInt(payload.slice(18, 20).reduce(msbLsb),16)/100;
13347
+ }else{
13348
+ res.pressure_s2 = null;
13349
+ res.temperature_s2 = null;
13350
+ res.error_s2 = 'Error: Sensor Probe 2 communication error';
13351
+ }
13352
+ return res;
13353
+ },
13138
13354
  'parse_fly': (frame) => {
13139
13355
  let psi_1;
13140
13356
  let psi_2;
@@ -13480,304 +13696,31 @@ function sensor_types(parent){
13480
13696
  }
13481
13697
  }
13482
13698
  },
13483
- '119': {
13484
- name: 'Wireless Machine Run Time Hour Meter',
13485
- parse: (d, payload) => {
13486
- let firmware = payload[1];
13487
- if(payload[7] & 2 != 0){
13488
- console.log('Error found');
13489
- // parsed.data = {error: 'Error found, Acclerometer Probe may be unattached'};
13490
- let error = {error: 'Error found, Acclerometer Probe may be unattached'};
13491
- return error;
13492
- }
13493
- let report_type = "Regular";
13494
- switch(d[17]){
13495
- case 0:
13496
- report_type = "Regular";
13497
- break;
13498
- case 1:
13499
- report_type = "Shift end";
13500
- break;
13501
- case 2:
13502
- report_type = "Interrupt";
13503
- break;
13504
- case 3:
13505
- report_type = "Threshold";
13506
- break;
13507
- }
13508
- if ((payload[7] & 4) != 0) {
13509
- return {
13510
- raw_data: "Enabled",
13511
- accelerometer_counter: d.slice(0, 4).reduce(msbLsb),
13512
- accelerometer_uptime: d.slice(4, 8).reduce(msbLsb),
13513
- magnetometer_counter: d.slice(8, 12).reduce(msbLsb),
13514
- magnetometer_uptime: d.slice(12, 16).reduce(msbLsb),
13515
- input_acc: d[16] & 8 ? 1 : 0,
13516
- input_mag: d[16] & 16 ? 1 : 0,
13517
- report_type: report_type,
13518
- rtc: [
13519
- String(d[18]).padStart(2, '0'),
13520
- String(d[19]).padStart(2, '0'),
13521
- String(d[20]).padStart(2, '0')
13522
- ].join(':'),
13523
- 'temperature': d.slice(21, 23).reduce(msbLsb)/100,
13524
- 'accelero_sample_1':{
13525
- x:[signInt(d.slice(23, 25).reduce(msbLsb),16)/100],
13526
- y:[signInt(d.slice(25, 27).reduce(msbLsb),16)/100],
13527
- z:[signInt(d.slice(27, 29).reduce(msbLsb),16)/100]
13528
- },
13529
- 'accelero_sample_2':{
13530
- x:[signInt(d.slice(29, 31).reduce(msbLsb),16)/100],
13531
- y:[signInt(d.slice(31, 33).reduce(msbLsb),16)/100],
13532
- z:[signInt(d.slice(33, 35).reduce(msbLsb),16)/100]
13533
- },
13534
- 'accelero_sample_3':{
13535
- x:[signInt(d.slice(35, 37).reduce(msbLsb),16)/100],
13536
- y:[signInt(d.slice(37, 39).reduce(msbLsb),16)/100],
13537
- z:[signInt(d.slice(39, 41).reduce(msbLsb),16)/100]
13538
- },
13539
- 'accelero_sample_4':{
13540
- x:[signInt(d.slice(41, 43).reduce(msbLsb),16)/100],
13541
- y:[signInt(d.slice(43, 45).reduce(msbLsb),16)/100],
13542
- z:[signInt(d.slice(45, 47).reduce(msbLsb),16)/100]
13543
- },
13544
- 'accelero_sample_5':{
13545
- x:[signInt(d.slice(47, 49).reduce(msbLsb),16)/100],
13546
- y:[signInt(d.slice(49, 51).reduce(msbLsb),16)/100],
13547
- z:[signInt(d.slice(51, 53).reduce(msbLsb),16)/100]
13548
- },
13549
- 'accelero_sample_6':{
13550
- x:[signInt(d.slice(53, 55).reduce(msbLsb),16)/100],
13551
- y:[signInt(d.slice(55, 57).reduce(msbLsb),16)/100],
13552
- z:[signInt(d.slice(57, 59).reduce(msbLsb),16)/100]
13553
- },
13554
- 'accelero_sample_7':{
13555
- x:[signInt(d.slice(59, 61).reduce(msbLsb),16)/100],
13556
- y:[signInt(d.slice(61, 63).reduce(msbLsb),16)/100],
13557
- z:[signInt(d.slice(63, 65).reduce(msbLsb),16)/100]
13558
- },
13559
- 'accelero_sample_8':{
13560
- x:[signInt(d.slice(65, 67).reduce(msbLsb),16)/100],
13561
- y:[signInt(d.slice(67, 69).reduce(msbLsb),16)/100],
13562
- z:[signInt(d.slice(69, 71).reduce(msbLsb),16)/100]
13563
- },
13564
- 'accelero_sample_9':{
13565
- x:[signInt(d.slice(71, 73).reduce(msbLsb),16)/100],
13566
- y:[signInt(d.slice(73, 75).reduce(msbLsb),16)/100],
13567
- z:[signInt(d.slice(75, 77).reduce(msbLsb),16)/100]
13568
- },
13569
- 'accelero_sample_10':{
13570
- x:[signInt(d.slice(77, 79).reduce(msbLsb),16)/100],
13571
- y:[signInt(d.slice(79, 81).reduce(msbLsb),16)/100],
13572
- z:[signInt(d.slice(81, 83).reduce(msbLsb),16)/100]
13573
- }
13574
- };
13575
- }else{
13576
- return {
13577
- raw_data: "Disabled",
13578
- accelerometer_counter: d.slice(0, 4).reduce(msbLsb),
13579
- accelerometer_uptime: d.slice(4, 8).reduce(msbLsb),
13580
- magnetometer_counter: d.slice(8, 12).reduce(msbLsb),
13581
- magnetometer_uptime: d.slice(12, 16).reduce(msbLsb),
13582
- input_acc: d[16] & 8 ? 1 : 0,
13583
- input_mag: d[16] & 16 ? 1 : 0,
13584
- report_type: report_type,
13585
- rtc: [
13586
- String(d[18]).padStart(2, '0'),
13587
- String(d[19]).padStart(2, '0'),
13588
- String(d[20]).padStart(2, '0')
13589
- ].join(':'),
13590
- 'temperature': d.slice(21, 23).reduce(msbLsb)/100
13591
- };
13592
- }
13593
- },
13594
- 'parse_fly': (frame) => {
13595
- let reset_mode = "Disabled";
13596
- switch(frame[35]){
13597
- case 0:
13598
- reset_mode = "Disabled";
13599
- break;
13600
- case 1:
13601
- reset_mode = "Shift Ends";
13602
- break;
13603
- case 2:
13604
- reset_mode = "Timeout";
13605
- break;
13606
- }
13607
- let acc_odr = "10 Hz";
13608
- switch(frame[37]){
13609
- case 0:
13610
- acc_odr = "10 Hz";
13611
- break;
13612
- case 1:
13613
- acc_odr = "20 Hz";
13614
- break;
13615
- case 2:
13616
- acc_odr = "50 Hz";
13617
- break;
13618
- case 3:
13619
- acc_odr = "100 Hz";
13620
- break;
13621
- case 4:
13622
- acc_odr = "200 Hz";
13623
- break;
13624
- case 5:
13625
- acc_odr = "400 Hz";
13626
- break;
13627
- }
13628
- let rtc_sampling_interval = "5 sec";
13629
- switch(frame[36]){
13630
- case 0:
13631
- rtc_sampling_interval = "1 min";
13632
- break;
13633
- case 1:
13634
- rtc_sampling_interval = "5 min";
13635
- break;
13636
- case 2:
13637
- rtc_sampling_interval = "15 min";
13638
- break;
13639
- case 3:
13640
- rtc_sampling_interval = "30 min";
13641
- break;
13642
- case 4:
13643
- rtc_sampling_interval = "1 hour";
13644
- break;
13645
- case 5:
13646
- rtc_sampling_interval = "2 hours";
13647
- break;
13648
- case 6:
13649
- rtc_sampling_interval = "3 hours";
13650
- break;
13651
- case 7:
13652
- rtc_sampling_interval = "6 hours";
13653
- break;
13654
- case 8:
13655
- rtc_sampling_interval = "12 hours";
13656
- break;
13657
- case 9:
13658
- rtc_sampling_interval = "5 sec";
13659
- break;
13660
- case 10:
13661
- rtc_sampling_interval = "10 sec";
13662
- break;
13663
- case 11:
13664
- rtc_sampling_interval = "15 sec";
13665
- break;
13666
- case 12:
13667
- rtc_sampling_interval = "30 sec";
13668
- break;
13669
- }
13670
- let acc_enabled_axis = 'Disabled All';
13671
- switch(frame[40]){
13672
- case 0:
13673
- acc_enabled_axis = 'Disabled All';
13674
- break;
13675
- case 1:
13676
- acc_enabled_axis = 'x axis';
13677
- break;
13678
- case 2:
13679
- acc_enabled_axis = 'y axis';
13680
- break;
13681
- case 3:
13682
- acc_enabled_axis = 'z axis';
13683
- break;
13684
- case 7:
13685
- acc_enabled_axis = 'all axis';
13686
- break;
13687
- }
13688
- return {
13689
- 'firmware': frame[2],
13690
- 'accelerometer_threshold': (frame[16]* 32) + " mg",
13691
- 'debouncing_timeout': frame.slice(17, 19).reduce(msbLsb) + " msec",
13692
- 'accelero_state': frame[19]? "Enabled": "Disabled",
13693
- 'counter_threshold': frame.slice(20, 24).reduce(msbLsb),
13694
- 'trasnmit_on_change_status': frame[24]? "Enabled": "Disabled",
13695
- 'Shift_end_1': [
13696
- String(frame[25]).padStart(2, '0'),
13697
- String(frame[26]).padStart(2, '0')
13698
- ].join(':'),
13699
- 'Shift_end_2': [
13700
- String(frame[27]).padStart(2, '0'),
13701
- String(frame[28]).padStart(2, '0')
13702
- ].join(':'),
13703
- 'Shift_end_3': [
13704
- String(frame[29]).padStart(2, '0'),
13705
- String(frame[30]).padStart(2, '0')
13706
- ].join(':'),
13707
- 'Shift_end_4': [
13708
- String(frame[31]).padStart(2, '0'),
13709
- String(frame[32]).padStart(2, '0')
13710
- ].join(':'),
13711
- 'reset_timeout': frame.slice(33, 35).reduce(msbLsb) + " min",
13712
- 'counter_reset_mode': reset_mode,
13713
- 'sampling_interval': rtc_sampling_interval,
13714
- 'acc_odr': acc_odr,
13715
- 'interrupt_timeout': frame.slice(38, 40).reduce(msbLsb) + ' msec',
13716
- 'acc_enabled_axis': acc_enabled_axis,
13717
- 'hardware_id': frame.slice(41, 44),
13718
- 'report_rate': frame.slice(44, 48).reduce(msbLsb) + " sec",
13719
- 'tx_life_counter': frame.slice(48, 52).reduce(msbLsb),
13720
- 'machine_values': {
13721
- 'firmware': frame[2],
13722
- 'accelerometer_threshold': (frame[16]* 32),
13723
- 'debouncing_timeout': frame.slice(17, 19),
13724
- 'accelero_state': frame[19],
13725
- 'counter_threshold': frame.slice(20, 24),
13726
- 'trasnmit_on_change_status': frame[24],
13727
- 'Shift_end_1': [
13728
- frame[25],
13729
- frame[26]
13730
- ],
13731
- 'Shift_end_2': [
13732
- frame[27],
13733
- frame[28]
13734
- ],
13735
- 'Shift_end_3': [
13736
- frame[29],
13737
- frame[30]
13738
- ],
13739
- 'Shift_end_4': [
13740
- frame[31],
13741
- frame[32]
13742
- ],
13743
- 'reset_timeout': frame.slice(33, 35),
13744
- 'counter_reset_mode': frame[35],
13745
- 'sampling_interval': frame[36],
13746
- 'acc_odr': frame[37],
13747
- 'interrupt_timeout': frame.slice(38, 40),
13748
- 'acc_enabled_axis': frame[40],
13749
- 'hardware_id': frame.slice(41, 44),
13750
- 'report_rate': frame.slice(44, 48),
13751
- 'tx_life_counter': frame.slice(48, 52)
13752
- }
13753
- }
13754
- }
13755
- },
13756
- '120': {
13757
- name: 'Wireless H2S Sensor',
13758
- parse: (d) => {
13759
- return {
13760
- ppm: d.slice(0, 2).reduce(msbLsb),
13761
- temperature: signInt(d.slice(2, 4).reduce(msbLsb), 16) / 100,
13762
- humidity: signInt(d.slice(4, 6).reduce(msbLsb), 16) / 100
13763
- };
13764
- },
13765
- 'parse_fly': (frame) => {
13766
- return {
13767
- 'firmware': frame[2],
13768
- 'h2s_threshold': frame[12],
13769
- 'always_on_status': frame[13],
13770
- 'hardware_id': frame.slice(14, 17),
13771
- 'sample_rate': frame.slice(17, 21).reduce(msbLsb) + " Sec.",
13772
- 'tx_life_counter': frame.slice(21, 25).reduce(msbLsb),
13773
- 'machine_values': {
13774
- 'firmware': frame[2],
13775
- 'h2s threshold': frame[12],
13776
- 'always_on_status': frame[13],
13777
- 'hardware_id': frame.slice(14, 17),
13778
- 'sample_rate': frame.slice(17, 21).reduce(msbLsb),
13779
- 'tx_life_counter': frame.slice(21, 25).reduce(msbLsb)
13780
- }
13699
+ '120': {
13700
+ name: 'Wireless H2S Sensor',
13701
+ parse: (d) => {
13702
+ return {
13703
+ ppm: d.slice(0, 2).reduce(msbLsb),
13704
+ temperature: signInt(d.slice(2, 4).reduce(msbLsb), 16) / 100,
13705
+ humidity: signInt(d.slice(4, 6).reduce(msbLsb), 16) / 100
13706
+ };
13707
+ },
13708
+ 'parse_fly': (frame) => {
13709
+ return {
13710
+ 'firmware': frame[2],
13711
+ 'h2s_threshold': frame[12],
13712
+ 'always_on_status': frame[13],
13713
+ 'hardware_id': frame.slice(14, 17),
13714
+ 'sample_rate': frame.slice(17, 21).reduce(msbLsb) + " Sec.",
13715
+ 'tx_life_counter': frame.slice(21, 25).reduce(msbLsb),
13716
+ 'machine_values': {
13717
+ 'firmware': frame[2],
13718
+ 'h2s threshold': frame[12],
13719
+ 'always_on_status': frame[13],
13720
+ 'hardware_id': frame.slice(14, 17),
13721
+ 'sample_rate': frame.slice(17, 21).reduce(msbLsb),
13722
+ 'tx_life_counter': frame.slice(21, 25).reduce(msbLsb)
13723
+ }
13781
13724
  }
13782
13725
  }
13783
13726
  },
@@ -13850,7 +13793,7 @@ function sensor_types(parent){
13850
13793
  return {
13851
13794
  'firmware': frame[2],
13852
13795
  'fsr': frame_data.fsr,
13853
- 'boot_time': frame[17] + " sec",
13796
+ 'boot_up_time': frame[17] + " sec",
13854
13797
  'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
13855
13798
  'auto_check_interval': frame_data.auto_check_interval,
13856
13799
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
@@ -13864,7 +13807,7 @@ function sensor_types(parent){
13864
13807
  'machine_values': {
13865
13808
  'firmware': frame[2],
13866
13809
  'fsr': frame[16],
13867
- 'boot_time': frame[17],
13810
+ 'boot_up_time': frame[17],
13868
13811
  'adc_pin_reading': frame.slice(18, 20),
13869
13812
  'auto_check_interval': frame.slice(20, 22),
13870
13813
  'auto_check_percentage': frame.slice(22, 24),
@@ -14025,637 +13968,53 @@ function sensor_types(parent){
14025
13968
  String(frame[32]).padStart(2, '0'),
14026
13969
  String(frame[33]).padStart(2, '0')
14027
13970
  ].join(':'),
14028
- 'reset_timeout': frame.slice(34, 36).reduce(msbLsb) + "min",
14029
- 'counter_reset_mode': reset_mode,
14030
- 'sampling_interval': rtc_sampling_interval,
14031
- 'interrupt_timeout': frame.slice(38, 40).reduce(msbLsb) + "msec",
14032
- 'hardware_id': frame.slice(40, 43),
14033
- 'report_rate': frame.slice(43, 47).reduce(msbLsb) + "sec",
14034
- 'tx_life_counter': frame.slice(47, 51).reduce(msbLsb),
14035
- 'machine_values': {
14036
- 'firmware': frame[2],
14037
- 'debouncing_timeout': frame.slice(16, 18),
14038
- 'input_1_active_edge': frame[18],
14039
- 'input_2_active_edge': frame[19],
14040
- 'input_3_active_edge': frame[20],
14041
- 'counter_threshold': frame.slice(21, 25),
14042
- 'trasnmit_on_change_status': frame[25],
14043
- 'Shift_end_1': frame.slice(26, 28),
14044
- 'Shift_end_2': frame.slice(28, 30),
14045
- 'Shift_end_3': frame.slice(30, 32),
14046
- 'Shift_end_4': frame.slice(32, 34),
14047
- 'reset_timeout': frame.slice(34, 36),
14048
- 'counter_reset_mode': frame[36],
14049
- 'sampling_interval': frame[37],
14050
- 'interrupt_timeout': frame.slice(38, 40),
14051
- 'hardware_id': frame.slice(40, 43),
14052
- 'report_rate': frame.slice(43, 47),
14053
- 'tx_life_counter': frame.slice(47, 51)
14054
- }
14055
- }
14056
- }
14057
- },
14058
- '124': {
14059
- name: 'Wireless EH Flow Sensor',
14060
- parse: (d) => {
14061
- return {
14062
- volume_flow: signInt(d.slice(0, 4).reduce(msbLsb), 32) / 100,
14063
- conductivity: d.slice(4, 8).reduce(msbLsb),
14064
- flow_velocity: signInt(d.slice(8, 12).reduce(msbLsb), 32) / 100,
14065
- pressure: signInt(d.slice(12, 16).reduce(msbLsb),32) / 100,
14066
- // WARNING doesn't handle decimal values and will round to whole number.
14067
- total_flow_1: d.slice(16, 24).reduce(msbLsb_to_SignedInt, 0n) / BigInt(100),
14068
- total_flow_2: d.slice(24, 32).reduce(msbLsb_to_SignedInt, 0n) / BigInt(100),
14069
- total_flow_3: d.slice(32, 40).reduce(msbLsb_to_SignedInt, 0n) / BigInt(100),
14070
- battery_life: d.slice(40, 42).reduce(msbLsb),
14071
- battery_state: d[42],
14072
- total_flow_1_raw: d.slice(16, 24),
14073
- total_flow_2_raw: d.slice(24, 32),
14074
- total_flow_3_raw: d.slice(32, 40)
14075
- };
14076
- },
14077
- 'parse_fly': (frame) => {
14078
- let frame_data = {};
14079
- switch(frame[12]){
14080
- case 0:
14081
- frame_data.flow_unit = 'cm³/s';
14082
- break;
14083
- case 1:
14084
- frame_data.flow_unit = 'cm³/min';
14085
- break;
14086
- case 2:
14087
- frame_data.flow_unit = 'cm³/h';
14088
- break;
14089
- case 3:
14090
- frame_data.flow_unit = 'cm³/d';
14091
- break;
14092
- case 4:
14093
- frame_data.flow_unit = 'dm³/s';
14094
- break;
14095
- case 5:
14096
- frame_data.flow_unit = 'dm³/min';
14097
- break;
14098
- case 6:
14099
- frame_data.flow_unit = 'dm³/h';
14100
- break;
14101
- case 7:
14102
- frame_data.flow_unit = 'dm³/d';
14103
- break;
14104
- case 8:
14105
- frame_data.flow_unit = 'm³/s';
14106
- break;
14107
- case 9:
14108
- frame_data.flow_unit = 'm³/min';
14109
- break;
14110
- case 10:
14111
- frame_data.flow_unit = 'm³/h';
14112
- break;
14113
- case 11:
14114
- frame_data.flow_unit = 'm³/d';
14115
- break;
14116
- case 12:
14117
- frame_data.flow_unit = 'ml/s';
14118
- break;
14119
- case 13:
14120
- frame_data.flow_unit = 'ml/min';
14121
- break;
14122
- case 14:
14123
- frame_data.flow_unit = 'ml/h';
14124
- break;
14125
- case 15:
14126
- frame_data.flow_unit = 'ml/d';
14127
- break;
14128
- case 16:
14129
- unitStrframe_data.flow_uniting = 'l/s';
14130
- break;
14131
- case 17:
14132
- frame_data.flow_unit = 'l/min';
14133
- break;
14134
- case 18:
14135
- frame_data.flow_unit = 'l/h';
14136
- break;
14137
- case 19:
14138
- frame_data.flow_unit = 'l/d';
14139
- break;
14140
- case 20:
14141
- frame_data.flow_unit = 'hl/s';
14142
- break;
14143
- case 21:
14144
- frame_data.flow_unit = 'hl/min';
14145
- break;
14146
- case 22:
14147
- frame_data.flow_unit = 'hl/h';
14148
- break;
14149
- case 23:
14150
- frame_data.flow_unit = 'hl/d';
14151
- break;
14152
- case 24:
14153
- frame_data.flow_unit = 'Ml/s';
14154
- break;
14155
- case 25:
14156
- frame_data.flow_unit = 'Ml/min';
14157
- break;
14158
- case 26:
14159
- frame_data.flow_unit = 'Ml/h';
14160
- break;
14161
- case 27:
14162
- frame_data.flow_unit = 'Ml/d';
14163
- break;
14164
-
14165
- // US Customary & Imperial Flow Rates
14166
- case 32:
14167
- frame_data.flow_unit = 'af/s';
14168
- break;
14169
- case 33:
14170
- frame_data.flow_unit = 'af/min';
14171
- break;
14172
- case 34:
14173
- frame_data.flow_unit = 'af/h';
14174
- break;
14175
- case 35:
14176
- frame_data.flow_unit = 'af/d';
14177
- break;
14178
- case 36:
14179
- frame_data.flow_unit = 'ft³/s';
14180
- break;
14181
- case 37:
14182
- frame_data.flow_unit = 'ft³/min';
14183
- break;
14184
- case 38:
14185
- frame_data.flow_unit = 'ft³/h';
14186
- break;
14187
- case 39:
14188
- frame_data.flow_unit = 'ft³/d';
14189
- break;
14190
- case 40:
14191
- frame_data.flow_unit = 'fl oz/s (us)';
14192
- break;
14193
- case 41:
14194
- frame_data.flow_unit = 'fl oz/min (us)';
14195
- break;
14196
- case 42:
14197
- frame_data.flow_unit = 'fl oz/h (us)';
14198
- break;
14199
- case 43:
14200
- frame_data.flow_unit = 'fl oz/d (us)';
14201
- break;
14202
- case 44:
14203
- frame_data.flow_unit = 'gal/s (us)';
14204
- break;
14205
- case 45:
14206
- frame_data.flow_unit = 'gal/min (us)';
14207
- break;
14208
- case 46:
14209
- frame_data.flow_unit = 'gal/h (us)';
14210
- break;
14211
- case 47:
14212
- frame_data.flow_unit = 'gal/d (us)';
14213
- break;
14214
- case 48:
14215
- frame_data.flow_unit = 'Mgal/s (us)';
14216
- break;
14217
- case 49:
14218
- frame_data.flow_unit = 'Mgal/min (us)';
14219
- break;
14220
- case 50:
14221
- frame_data.flow_unit = 'Mgal/h (us)';
14222
- break;
14223
- case 51:
14224
- frame_data.flow_unit = 'Mgal/d (us)';
14225
- break;
14226
- case 52:
14227
- frame_data.flow_unit = 'bbl/s (us;liq.)';
14228
- break;
14229
- case 53:
14230
- frame_data.flow_unit = 'bbl/min (us;liq.)';
14231
- break;
14232
- case 54:
14233
- frame_data.flow_unit = 'bbl/h (us;liq.)';
14234
- break;
14235
- case 55:
14236
- frame_data.flow_unit = 'bbl/d (us;liq.)';
14237
- break;
14238
- case 56:
14239
- frame_data.flow_unit = 'bbl/s (us;beer)';
14240
- break;
14241
- case 57:
14242
- frame_data.flow_unit = 'bbl/min (us;beer)';
14243
- break;
14244
- case 58:
14245
- frame_data.flow_unit = 'bbl/h (us;beer)';
14246
- break;
14247
- case 59:
14248
- frame_data.flow_unit = 'bbl/d (us;beer)';
14249
- break;
14250
- case 60:
14251
- frame_data.flow_unit = 'bbl/s (us;oil)';
14252
- break;
14253
- case 61:
14254
- frame_data.flow_unit = 'bbl/min (us;oil)';
14255
- break;
14256
- case 62:
14257
- frame_data.flow_unit = 'bbl/h (us;oil)';
14258
- break;
14259
- case 63:
14260
- frame_data.flow_unit = 'bbl/d (us;oil)';
14261
- break;
14262
- case 64:
14263
- frame_data.flow_unit = 'bbl/s (us;tank)';
14264
- break;
14265
- case 65:
14266
- frame_data.flow_unit = 'bbl/min (us;tank)';
14267
- break;
14268
- case 66:
14269
- frame_data.flow_unit = 'bbl/h (us;tank)';
14270
- break;
14271
- case 67:
14272
- frame_data.flow_unit = 'bbl/d (us;tank)';
14273
- break;
14274
- case 68:
14275
- frame_data.flow_unit = 'gal/s (imp)';
14276
- break;
14277
- case 69:
14278
- frame_data.flow_unit = 'gal/min (imp)';
14279
- break;
14280
- case 70:
14281
- frame_data.flow_unit = 'gal/h (imp)';
14282
- break;
14283
- case 71:
14284
- frame_data.flow_unit = 'gal/d (imp)';
14285
- break;
14286
- case 72:
14287
- frame_data.flow_unit = 'Mgal/s (imp)';
14288
- break;
14289
- case 73:
14290
- frame_data.flow_unit = 'Mgal/min (imp)';
14291
- break;
14292
- case 74:
14293
- frame_data.flow_unit = 'Mgal/h (imp)';
14294
- break;
14295
- case 75:
14296
- frame_data.flow_unit = 'Mgal/d (imp)';
14297
- break;
14298
- case 76:
14299
- frame_data.flow_unit = 'bbl/s (imp;beer)';
14300
- break;
14301
- case 77:
14302
- frame_data.flow_unit = 'bbl/min (imp;beer)';
14303
- break;
14304
- case 78:
14305
- frame_data.flow_unit = 'bbl/h (imp;beer)';
14306
- break;
14307
- case 79:
14308
- frame_data.flow_unit = 'bbl/d (imp;beer)';
14309
- break;
14310
- case 80:
14311
- frame_data.flow_unit = 'bbl/s (imp;oil)';
14312
- break;
14313
- case 81:
14314
- frame_data.flow_unit = 'bbl/min (imp;oil)';
14315
- break;
14316
- case 82:
14317
- frame_data.flow_unit = 'bbl/h (imp;oil)';
14318
- break;
14319
- case 83:
14320
- frame_data.flow_unit = 'bbl/d (imp;oil)';
14321
- break;
14322
- case 88:
14323
- frame_data.flow_unit = 'kgal/s (us)';
14324
- break;
14325
- case 89:
14326
- frame_data.flow_unit = 'kgal/min (us)';
14327
- break;
14328
- case 90:
14329
- frame_data.flow_unit = 'kgal/h (us)';
14330
- break;
14331
- case 91:
14332
- frame_data.flow_unit = 'kgal/d (us)';
14333
- break;
14334
- case 92:
14335
- frame_data.flow_unit = 'MMft³/s';
14336
- break;
14337
- case 93:
14338
- frame_data.flow_unit = 'MMft³/min';
14339
- break;
14340
- case 94:
14341
- frame_data.flow_unit = 'MMft³/h';
14342
- break;
14343
- case 96:
14344
- frame_data.flow_unit = 'Mft³/d';
14345
- break;
14346
- }
14347
- switch(frame[13]){
14348
- case 0:
14349
- frame_data.pressure_unit = 'bar';
14350
- break;
14351
- case 1:
14352
- frame_data.pressure_unit = 'psi a';
14353
- break;
14354
- case 2:
14355
- frame_data.pressure_unit = 'bar g';
14356
- break;
14357
- case 3:
14358
- frame_data.pressure_unit = 'psi g';
14359
- break;
14360
- case 4:
14361
- frame_data.pressure_unit = 'Pa a';
14362
- break;
14363
- case 5:
14364
- frame_data.pressure_unit = 'kPa a';
14365
- break;
14366
- case 6:
14367
- frame_data.pressure_unit = 'MPa a';
14368
- break;
14369
- case 7:
14370
- frame_data.pressure_unit = 'Pa g';
14371
- break;
14372
- case 8:
14373
- frame_data.pressure_unit = 'kPa g';
14374
- break;
14375
- case 9:
14376
- frame_data.pressure_unit = 'MPa g';
14377
- break;
14378
- }
14379
- switch(frame[14]){
14380
- case 1:
14381
- frame_data.conductivity_unit = 'MS/m';
14382
- break;
14383
- case 2:
14384
- frame_data.conductivity_unit = 'kS/m';
14385
- break;
14386
- case 3:
14387
- frame_data.conductivity_unit = 'S/m';
14388
- break;
14389
- case 4:
14390
- frame_data.conductivity_unit = 'S/cm';
14391
- break;
14392
- case 5:
14393
- frame_data.conductivity_unit = 'mS/m';
14394
- break;
14395
- case 6:
14396
- frame_data.conductivity_unit = 'mS/cm';
14397
- break;
14398
- case 7:
14399
- frame_data.conductivity_unit = 'μS/m';
14400
- break;
14401
- case 8:
14402
- frame_data.conductivity_unit = 'μS/cm';
14403
- break;
14404
- case 9:
14405
- frame_data.conductivity_unit = 'μS/mm';
14406
- break;
14407
- case 10:
14408
- frame_data.conductivity_unit = 'nS/cm';
14409
- break;
14410
- }
14411
-
14412
- frame_data.totalizer_unit = [];
14413
-
14414
- for (let index = 0; index < 3; index++) {
14415
- switch(frame[index + 15]){
14416
- case 0:
14417
- frame_data.totalizer_unit[index] = 'cm³';
14418
- break;
14419
- case 1:
14420
- frame_data.totalizer_unit[index] = 'dm³';
14421
- break;
14422
- case 2:
14423
- frame_data.totalizer_unit[index] = 'm³';
14424
- break;
14425
- case 3:
14426
- frame_data.totalizer_unit[index] = 'ml';
14427
- break;
14428
- case 4:
14429
- frame_data.totalizer_unit[index] = 'l';
14430
- break;
14431
- case 5:
14432
- frame_data.totalizer_unit[index] = 'hl';
14433
- break;
14434
- case 6:
14435
- frame_data.totalizer_unit[index] = 'Ml Mega';
14436
- break;
14437
- case 8:
14438
- frame_data.totalizer_unit[index] = 'af';
14439
- break;
14440
- case 9:
14441
- frame_data.totalizer_unit[index] = 'ft³';
14442
- break;
14443
- case 10:
14444
- frame_data.totalizer_unit[index] = 'fl oz (us)';
14445
- break;
14446
- case 11:
14447
- frame_data.totalizer_unit[index] = 'gal (us)';
14448
- break;
14449
- case 12:
14450
- frame_data.totalizer_unit[index] = 'Mgal (us)';
14451
- break;
14452
- case 13:
14453
- frame_data.totalizer_unit[index] = 'bbl (us;liq.)';
14454
- break;
14455
- case 14:
14456
- frame_data.totalizer_unit[index] = 'bbl (us;beer)';
14457
- break;
14458
- case 15:
14459
- frame_data.totalizer_unit[index] = 'bbl (us;oil)';
14460
- break;
14461
- case 16:
14462
- frame_data.totalizer_unit[index] = 'bbl (us;tank)';
14463
- break;
14464
- case 17:
14465
- frame_data.totalizer_unit[index] = 'gal (imp)';
14466
- break;
14467
- case 18:
14468
- frame_data.totalizer_unit[index] = 'Mgal (imp)';
14469
- break;
14470
- case 19:
14471
- frame_data.totalizer_unit[index] = 'bbl (imp;beer)';
14472
- break;
14473
- case 20:
14474
- frame_data.totalizer_unit[index] = 'bbl (imp;oil)';
14475
- break;
14476
- case 22:
14477
- frame_data.totalizer_unit[index] = 'kgal (us)';
14478
- break;
14479
- case 23:
14480
- frame_data.totalizer_unit[index] = 'Mft³';
14481
- break;
14482
- }
14483
-
14484
- }
14485
- return {
14486
- 'firmware': frame[2],
14487
- 'flow_unit': frame_data.flow_unit,
14488
- 'pressure_unit': frame_data.pressure_unit,
14489
- 'conductivity_unit': frame_data.conductivity_unit,
14490
- 'totalizer_1_unit': frame_data.totalizer_unit[0],
14491
- 'totalizer_2_unit': frame_data.totalizer_unit[1],
14492
- 'totalizer_3_unit': frame_data.totalizer_unit[2],
14493
- 'hardware_id': frame.slice(18, 21),
14494
- 'sample_rate': frame.slice(21, 25).reduce(msbLsb),
14495
- 'tx_life_counter': frame.slice(25, 29).reduce(msbLsb),
14496
- 'machine_values': {
14497
- 'firmware': frame[2],
14498
- 'flow_unit': frame[12],
14499
- 'pressure_unit': frame[13],
14500
- 'conductivity_unit': frame[14],
14501
- 'totalizer_1_unit': frame[15],
14502
- 'totalizer_2_unit': frame[16],
14503
- 'totalizer_3_unit': frame[17],
14504
- 'hardware_id': frame.slice(18, 21),
14505
- 'sample_rate': frame.slice(21, 25),
14506
- 'tx_life_counter': frame.slice(25, 29)
14507
- }
14508
- }
14509
- }
14510
- },
14511
- '124': {
14512
- name: 'Wireless EH Flow Sensor',
14513
- parse: (d) => {
14514
- return {
14515
- Temp: signInt(payload.slice(8, 12).reduce(msbLsb), 32) / 100,
14516
- Humid: signInt(payload.slice(12, 16).reduce(msbLsb), 32) / 100,
14517
- Pressure: signInt(payload.slice(16, 20).reduce(msbLsb), 32) / 100,
14518
- WindSpd: signInt(payload.slice(20, 24).reduce(msbLsb),32) / 100,
14519
- WindDir: signInt(payload.slice(24, 28).reduce(msbLsb),32) / 100,
14520
- reserve: payload[7]
14521
- };
14522
- }
14523
- },
14524
- '211': {
14525
- name: 'DO and Flow Sensor',
14526
- parse: (payload, parsed, mac) => {
14527
- if(payload[0] == 0){ // regular
14528
- return {
14529
- msg_type: 'regular',
14530
- temperature: signInt(payload.slice(1, 3).reduce(msbLsb), 16),
14531
- oxygen_saturation_percent: payload.slice(3, 7).reduce(msbLsb),
14532
- oxygen_ppm: payload.slice(7, 11).reduce(msbLsb),
14533
- oxygen_mg_l: payload.slice(11, 15).reduce(msbLsb)
14534
- };
14535
- }
14536
- else{ // theshold
14537
- let solenoid_status = payload[2];
14538
- if(solenoid_status == 1){ // Solenoid On
14539
- return {
14540
- msg_type: 'threshold',
14541
- solenoid_number: payload[1],
14542
- solenoid_status: 'on',
14543
- temperature: signInt(payload.slice(3, 5).reduce(msbLsb), 16),
14544
- oxygen_saturation_percent: payload.slice(5, 9).reduce(msbLsb),
14545
- oxygen_ppm: payload.slice(9, 13).reduce(msbLsb),
14546
- oxygen_mg_l: payload.slice(13, 17).reduce(msbLsb),
14547
- flow_rate: payload.slice(17, 21).reduce(msbLsb)
14548
- };
14549
- } else{ // Solenoid Off
14550
- return {
14551
- msg_type: 'threshold',
14552
- solenoid_number: payload[1],
14553
- solenoid_status: 'off',
14554
- temperature: signInt(payload.slice(3, 5).reduce(msbLsb), 16),
14555
- oxygen_saturation_percent: payload.slice(5, 9).reduce(msbLsb),
14556
- oxygen_ppm: payload.slice(9, 13).reduce(msbLsb),
14557
- oxygen_mg_l: payload.slice(13, 17).reduce(msbLsb)
14558
- };
14559
- }
14560
- }
14561
- },
14562
- 'parse_fly': (frame) => {
14563
- return {
14564
- 'firmware': frame[2],
14565
- 'hardware_id': frame.slice(12, 15),
14566
- 'report_rate': frame.slice(15, 19).reduce(msbLsb) + "Sec",
14567
- 'tx_life_counter': frame.slice(19, 23).reduce(msbLsb),
13971
+ 'reset_timeout': frame.slice(34, 36).reduce(msbLsb) + "min",
13972
+ 'counter_reset_mode': reset_mode,
13973
+ 'sampling_interval': rtc_sampling_interval,
13974
+ 'interrupt_timeout': frame.slice(38, 40).reduce(msbLsb) + "msec",
13975
+ 'hardware_id': frame.slice(40, 43),
13976
+ 'report_rate': frame.slice(43, 47).reduce(msbLsb) + "sec",
13977
+ 'tx_life_counter': frame.slice(47, 51).reduce(msbLsb),
14568
13978
  'machine_values': {
14569
13979
  'firmware': frame[2],
14570
- 'hardware_id': frame.slice(12, 15),
14571
- 'report_rate': frame.slice(15, 19),
14572
- 'tx_life_counter': frame.slice(19, 23)
14573
- }
14574
- }
14575
- }
14576
- },
14577
- '217': {
14578
- name: 'Wireless Weight Scale',
14579
- parse: (d, parsed, mac) => {
14580
- if(d[7] == 254){
14581
- console.log('Error found');
14582
- parsed.data = {error: 'Error found, Load cell comm error'};
14583
- return parsed;
14584
- }
14585
- return {
14586
- weight: signInt(d.slice(8, 12).reduce(msbLsb), 32) / 100
14587
- };
14588
- },
14589
- 'parse_fly': (frame) => {
14590
- if(frame[2] > 2){
14591
- let date = [
14592
- String(frame.slice(20, 22).reduce(msbLsb)),
14593
- String(frame[22]).padStart(2, '0'),
14594
- String(frame[23]).padStart(2, '0')
14595
- ].join('-');
14596
- let time = [
14597
- String(frame[24]).padStart(2, '0'),
14598
- String(frame[25]).padStart(2, '0'),
14599
- String(frame[26]).padStart(2, '0')
14600
- ].join(':');
14601
- return {
14602
- 'firmware': frame[2],
14603
- 'calibration_tare': frame.slice(12, 16).reduce(msbLsb),
14604
- 'tare_counter': frame.slice(16, 20).reduce(msbLsb),
14605
- 'timestamp': date + 'T' + time,
14606
- 'hardware_id': frame.slice(27, 30),
14607
- 'report_rate': frame.slice(30, 34).reduce(msbLsb) + "Sec",
14608
- 'tx_life_counter': frame.slice(34, 38).reduce(msbLsb),
14609
- 'machine_values': {
14610
- 'firmware': frame[2],
14611
- 'calibration_tare': frame.slice(12, 16),
14612
- 'tare_counter': frame.slice(16, 20),
14613
- 'date': frame.slice(20, 27),
14614
- 'hardware_id': frame.slice(27, 30),
14615
- 'report_rate': frame.slice(30, 34),
14616
- 'tx_life_counter': frame.slice(34, 38)
14617
- }
13980
+ 'debouncing_timeout': frame.slice(16, 18),
13981
+ 'input_1_active_edge': frame[18],
13982
+ 'input_2_active_edge': frame[19],
13983
+ 'input_3_active_edge': frame[20],
13984
+ 'counter_threshold': frame.slice(21, 25),
13985
+ 'trasnmit_on_change_status': frame[25],
13986
+ 'Shift_end_1': frame.slice(26, 28),
13987
+ 'Shift_end_2': frame.slice(28, 30),
13988
+ 'Shift_end_3': frame.slice(30, 32),
13989
+ 'Shift_end_4': frame.slice(32, 34),
13990
+ 'reset_timeout': frame.slice(34, 36),
13991
+ 'counter_reset_mode': frame[36],
13992
+ 'sampling_interval': frame[37],
13993
+ 'interrupt_timeout': frame.slice(38, 40),
13994
+ 'hardware_id': frame.slice(40, 43),
13995
+ 'report_rate': frame.slice(43, 47),
13996
+ 'tx_life_counter': frame.slice(47, 51)
14618
13997
  }
14619
13998
  }
14620
13999
  }
14621
14000
  },
14622
- '270': {
14623
- name: 'Custom Salinity DO sensor',
14001
+ '124': {
14002
+ name: 'Wireless EH Flow Sensor',
14624
14003
  parse: (d) => {
14625
14004
  return {
14626
- sensor_status: d[0],
14627
- do_temperature_1: d.slice(1, 3).reduce(msbLsb) / 100,
14628
- do_temperature_2: d.slice(3, 5).reduce(msbLsb) / 100,
14629
- do_temperature_3: d.slice(5, 7).reduce(msbLsb) / 100,
14630
- do_temperature_4: d.slice(7, 9).reduce(msbLsb) / 100,
14631
- ec_temperature_1: d.slice(9, 11).reduce(msbLsb) / 100,
14632
- ec_temperature_2: d.slice(11, 13).reduce(msbLsb) / 100,
14633
- ec_temperature_3: d.slice(13, 15).reduce(msbLsb) / 100,
14634
- ec_temperature_4: d.slice(15, 17).reduce(msbLsb) / 100,
14635
- do_saturation_perc_1: d.slice(17, 19).reduce(msbLsb) / 100,
14636
- do_saturation_perc_2: d.slice(19, 21).reduce(msbLsb) / 100,
14637
- do_saturation_perc_3: d.slice(21, 23).reduce(msbLsb) / 100,
14638
- do_saturation_perc_4: d.slice(23, 25).reduce(msbLsb) / 100,
14639
- do_ppm_1: d.slice(25, 27).reduce(msbLsb) / 100,
14640
- do_ppm_2: d.slice(27, 29).reduce(msbLsb) / 100,
14641
- do_ppm_3: d.slice(29, 31).reduce(msbLsb) / 100,
14642
- do_ppm_4: d.slice(31, 33).reduce(msbLsb) / 100,
14643
- do_mgl_1: d.slice(33, 35).reduce(msbLsb) / 100,
14644
- do_mgl_2: d.slice(35, 37).reduce(msbLsb) / 100,
14645
- do_mgl_3: d.slice(37, 39).reduce(msbLsb) / 100,
14646
- do_mgl_4: d.slice(39, 41).reduce(msbLsb) / 100,
14647
- ec_conductivity_1: d.slice(41, 43).reduce(msbLsb) / 100,
14648
- ec_conductivity_2: d.slice(43, 45).reduce(msbLsb) / 100,
14649
- ec_conductivity_3: d.slice(45, 47).reduce(msbLsb) / 100,
14650
- ec_conductivity_4: d.slice(47, 49).reduce(msbLsb) / 100,
14651
- ec_salinity_ppt_1: d.slice(49, 57).reduce(msbLsb) / 100,
14652
- ec_salinity_ppt_2: d.slice(57, 65).reduce(msbLsb) / 100,
14653
- ec_salinity_ppt_3: d.slice(65, 73).reduce(msbLsb) / 100,
14654
- ec_salinity_ppt_4: d.slice(73, 81).reduce(msbLsb) / 100,
14655
- ec_tds_1: d.slice(81, 85).reduce(msbLsb) / 100,
14656
- ec_tds_2: d.slice(85, 89).reduce(msbLsb) / 100,
14657
- ec_tds_3: d.slice(89, 93).reduce(msbLsb) / 100,
14658
- ec_tds_4: d.slice(93, 97).reduce(msbLsb) / 100
14005
+ volume_flow: signInt(d.slice(0, 4).reduce(msbLsb), 32) / 100,
14006
+ conductivity: d.slice(4, 8).reduce(msbLsb),
14007
+ flow_velocity: signInt(d.slice(8, 12).reduce(msbLsb), 32) / 100,
14008
+ pressure: signInt(d.slice(12, 16).reduce(msbLsb),32) / 100,
14009
+ // WARNING doesn't handle decimal values and will round to whole number.
14010
+ total_flow_1: d.slice(16, 24).reduce(msbLsb_to_SignedInt, 0n) / BigInt(100),
14011
+ total_flow_2: d.slice(24, 32).reduce(msbLsb_to_SignedInt, 0n) / BigInt(100),
14012
+ total_flow_3: d.slice(32, 40).reduce(msbLsb_to_SignedInt, 0n) / BigInt(100),
14013
+ battery_life: d.slice(40, 42).reduce(msbLsb),
14014
+ battery_state: d[42],
14015
+ total_flow_1_raw: d.slice(16, 24),
14016
+ total_flow_2_raw: d.slice(24, 32),
14017
+ total_flow_3_raw: d.slice(32, 40)
14659
14018
  };
14660
14019
  },
14661
14020
  'parse_fly': (frame) => {
@@ -15194,10 +14553,47 @@ function sensor_types(parent){
15194
14553
  },
15195
14554
  '217': {
15196
14555
  name: 'Wireless Weight Scale',
15197
- parse: (d) => {
14556
+ parse: (d, parsed, mac) => {
14557
+ if(d[7] == 254){
14558
+ console.log('Error found');
14559
+ parsed.data = {error: 'Error found, Load cell comm error'};
14560
+ return parsed;
14561
+ }
15198
14562
  return {
15199
- weight: signInt(d.slice(0, 4).reduce(msbLsb)) / 100
14563
+ weight: signInt(d.slice(8, 12).reduce(msbLsb), 32) / 100
15200
14564
  };
14565
+ },
14566
+ 'parse_fly': (frame) => {
14567
+ if(frame[2] > 3){
14568
+ let date = [
14569
+ String(frame.slice(20, 22).reduce(msbLsb)),
14570
+ String(frame[22]).padStart(2, '0'),
14571
+ String(frame[23]).padStart(2, '0')
14572
+ ].join('-');
14573
+ let time = [
14574
+ String(frame[24]).padStart(2, '0'),
14575
+ String(frame[25]).padStart(2, '0'),
14576
+ String(frame[26]).padStart(2, '0')
14577
+ ].join(':');
14578
+ return {
14579
+ 'firmware': frame[2],
14580
+ 'calibration_tare': frame.slice(12, 16).reduce(msbLsb),
14581
+ 'tare_counter': frame.slice(16, 20).reduce(msbLsb),
14582
+ 'timestamp': date + 'T' + time,
14583
+ 'hardware_id': frame.slice(27, 30),
14584
+ 'report_rate': frame.slice(30, 34).reduce(msbLsb) + "Sec",
14585
+ 'tx_life_counter': frame.slice(34, 38).reduce(msbLsb),
14586
+ 'machine_values': {
14587
+ 'firmware': frame[2],
14588
+ 'calibration_tare': frame.slice(12, 16),
14589
+ 'tare_counter': frame.slice(16, 20),
14590
+ 'date': frame.slice(20, 27),
14591
+ 'hardware_id': frame.slice(27, 30),
14592
+ 'report_rate': frame.slice(30, 34),
14593
+ 'tx_life_counter': frame.slice(34, 38)
14594
+ }
14595
+ }
14596
+ }
15201
14597
  }
15202
14598
  },
15203
14599
  '270': {
@@ -17726,8 +17122,8 @@ function sensor_types(parent){
17726
17122
  return {
17727
17123
  'firmware': frame[2],
17728
17124
  'fsr': frame_data.fsr,
17729
- 'boot_time': frame[17] + " sec",
17730
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
17125
+ 'boot_up_time': frame[17] + " sec",
17126
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
17731
17127
  'auto_check_interval': frame_data.auto_check_interval,
17732
17128
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
17733
17129
  'always_on': frame_data.always_on,
@@ -17740,8 +17136,8 @@ function sensor_types(parent){
17740
17136
  'machine_values': {
17741
17137
  'firmware': frame[2],
17742
17138
  'fsr': frame[16],
17743
- 'boot_time': frame[17],
17744
- 'power_adc': frame.slice(18, 20),
17139
+ 'boot_up_time': frame[17],
17140
+ 'adc_pin_reading': frame.slice(18, 20),
17745
17141
  'auto_check_interval': frame.slice(20, 22),
17746
17142
  'auto_check_percentage': frame.slice(22, 24),
17747
17143
  'always_on': frame[24],
@@ -18337,6 +17733,167 @@ function sensor_types(parent){
18337
17733
  }
18338
17734
  }
18339
17735
  },
17736
+ '545': {
17737
+ name: 'Fox Thermal Flow Sensor',
17738
+ parse: (payload, parsed, mac) => {
17739
+ let sensor_status = '';
17740
+ const error_message = [];
17741
+ if(payload[8] & 1){
17742
+ error_message.push('pwr_up');
17743
+ }
17744
+ if(payload[8] & 2){
17745
+ error_message.push('flw_hi_lim');
17746
+ }
17747
+ if(payload[8] & 4){
17748
+ error_message.push('flw_lo_lim');
17749
+ }
17750
+ if(payload[8] & 8){
17751
+ error_message.push('tmp_hi_lim');
17752
+ }
17753
+ if(payload[8] & 16){
17754
+ error_message.push('tmp_lo_lim');
17755
+ }
17756
+ if(payload[8] & 32){
17757
+ error_message.push('sensor_oor');
17758
+ }
17759
+ if(payload[8] & 64){
17760
+ error_message.push('gas_mix_err');
17761
+ }
17762
+ if(payload[8] & 128){
17763
+ error_message.push('inc_set');
17764
+ }
17765
+ if(error_message.length === 0){
17766
+ sensor_status = 'ready';
17767
+ } else {
17768
+ sensor_status = error_message.join(', ');
17769
+ }
17770
+
17771
+ const calv_value = payload.slice(9, 11).reduce(msbLsb) / 100;
17772
+ let cal_val = '';
17773
+ if(calv_value < 0.80){
17774
+ cal_val = 'pass';
17775
+ } else if(calv_value <= 1.0){
17776
+ cal_val = 'warning';
17777
+ } else {
17778
+ cal_val = 'fail';
17779
+ }
17780
+
17781
+ return {
17782
+ sensor_status: sensor_status,
17783
+ calcv_value: payload.slice(9, 11).reduce(msbLsb) / 100,
17784
+ calcv_status: cal_val,
17785
+ flow: payload.slice(11, 15).reduce(msbLsb)/100,
17786
+ ghv: payload.slice(15, 19).reduce(msbLsb)/100,
17787
+ total_flow: payload.slice(19, 27).reduce(msbLsb)/100,
17788
+ temperature: payload.slice(27,29).reduce(msbLsb)/100,
17789
+ density: payload.slice(29, 31).reduce(msbLsb)/100
17790
+ };
17791
+ },
17792
+ 'parse_fly': (frame) => {
17793
+ let frame_data = {};
17794
+ switch(frame[12]){
17795
+ case 0:
17796
+ frame_data.flow_unit = 'scf_m';
17797
+ break;
17798
+ case 1:
17799
+ frame_data.flow_unit = 'scf_h';
17800
+ break;
17801
+ case 2:
17802
+ frame_data.flow_unit = 'nm3_h';
17803
+ break;
17804
+ case 3:
17805
+ frame_data.flow_unit = 'nm3_m';
17806
+ break;
17807
+ case 4:
17808
+ frame_data.flow_unit = 'kg_h';
17809
+ break;
17810
+ case 5:
17811
+ frame_data.flow_unit = 'kg_m';
17812
+ break;
17813
+ case 6:
17814
+ frame_data.flow_unit = 'kg_s';
17815
+ break;
17816
+ case 7:
17817
+ frame_data.flow_unit = 'lbs_h';
17818
+ break;
17819
+ case 8:
17820
+ frame_data.flow_unit = 'lbs_m';
17821
+ break;
17822
+ case 9:
17823
+ frame_data.flow_unit = 'lbs_s';
17824
+ break;
17825
+ case 10:
17826
+ frame_data.flow_unit = 'nlp_h';
17827
+ break;
17828
+ case 11:
17829
+ frame_data.flow_unit = 'nlp_m';
17830
+ break;
17831
+ case 12:
17832
+ frame_data.flow_unit = 'mmscf_d';
17833
+ break;
17834
+ case 13:
17835
+ frame_data.flow_unit = 'lbs_d';
17836
+ break;
17837
+ case 14:
17838
+ frame_data.flow_unit = 'slp_m';
17839
+ break;
17840
+ case 15:
17841
+ frame_data.flow_unit = 'nlp_s';
17842
+ break;
17843
+ case 16:
17844
+ frame_data.flow_unit = 'mscf_d';
17845
+ break;
17846
+ case 17:
17847
+ frame_data.flow_unit = 'sm3_h';
17848
+ break;
17849
+ case 18:
17850
+ frame_data.flow_unit = 'mt_h';
17851
+ break;
17852
+ case 19:
17853
+ frame_data.flow_unit = 'nm3_d';
17854
+ break;
17855
+ case 20:
17856
+ frame_data.flow_unit = 'mmscf_m';
17857
+ break;
17858
+ case 21:
17859
+ frame_data.flow_unit = 'scf_d';
17860
+ break;
17861
+ case 22:
17862
+ frame_data.flow_unit = 'mcf_d';
17863
+ break;
17864
+ case 23:
17865
+ frame_data.flow_unit = 'sm3_m';
17866
+ break;
17867
+ case 24:
17868
+ frame_data.flow_unit = 'sm3_d';
17869
+ break;
17870
+ }
17871
+ switch(frame[13]){
17872
+ case 0:
17873
+ frame_data.temperature_unit = 'F';
17874
+ break;
17875
+ case 1:
17876
+ frame_data.temperature_unit = 'C';
17877
+ break;
17878
+ }
17879
+ return {
17880
+ 'firmware': frame[2],
17881
+ 'flow_unit': frame_data.flow_unit,
17882
+ 'temperature_unit': frame_data.temperature_unit,
17883
+ 'hardware_id': frame.slice(14, 17),
17884
+ 'report_rate': frame.slice(17, 21).reduce(msbLsb),
17885
+ 'tx_life_counter': frame.slice(21, 25).reduce(msbLsb),
17886
+ 'machine_values': {
17887
+ 'firmware': frame[2],
17888
+ 'flow_unit': frame[12],
17889
+ 'temperature_unit': frame[13],
17890
+ 'hardware_id': frame.slice(14, 17),
17891
+ 'report_rate': frame.slice(17, 21),
17892
+ 'tx_life_counter': frame.slice(21, 25)
17893
+ }
17894
+ }
17895
+ }
17896
+ },
18340
17897
  '1010': {
18341
17898
  name: 'RS232 Wireless Converter',
18342
17899
  parse: (d) => {