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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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,545,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,99,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,545,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,99,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) {
@@ -1342,8 +1342,8 @@ module.exports = class WirelessSensor{
1342
1342
  }
1343
1343
  config_set_counter_threshold_108(sensor_mac, value){
1344
1344
  console.log('config_set_counter_threshold_108');
1345
- var packet = [244, 43, 0, 0, 0, 0, 0];
1346
- let threshold = int2Bytes((value), 2);
1345
+ var packet = [244, 43, 0, 0, 0];
1346
+ let threshold = int2Bytes((value), 4);
1347
1347
  packet.push(...threshold);
1348
1348
  console.log(packet);
1349
1349
  return this.config_send(sensor_mac, packet);
@@ -2570,6 +2570,58 @@ module.exports = class WirelessSensor{
2570
2570
  console.log(packet);
2571
2571
  return this.config_send(sensor_mac, packet);
2572
2572
  }
2573
+ config_set_screen_on_time_217(sensor_mac, value){
2574
+ console.log('config_set_screen_on_time_217');
2575
+ let packet = [244, 40, 0, 0, 26, value];
2576
+ console.log(packet);
2577
+ return this.config_send(sensor_mac, packet);
2578
+ }
2579
+ config_set_weight_unit_217(sensor_mac, value){
2580
+ console.log('config_set_weight_unit_217');
2581
+ let packet = [244, 38, 0, 0, 26, value];
2582
+ console.log(packet);
2583
+ return this.config_send(sensor_mac, packet);
2584
+ }
2585
+ config_set_clean_cycle_99(sensor_mac, value){
2586
+ console.log('config_set_clean_cycle_99');
2587
+ let packet = [244, 34, 0, 0, 0, value];
2588
+ console.log(packet);
2589
+ return this.config_send(sensor_mac, packet);
2590
+ }
2591
+ config_set_wiper_rounds_number_99(sensor_mac, value){
2592
+ console.log('config_set_wiper_rounds_number_99');
2593
+ let packet = [244, 36, 0, 0, 0, value];
2594
+ console.log(packet);
2595
+ return this.config_send(sensor_mac, packet);
2596
+ }
2597
+ config_set_distance_under_strength_threshold_99(sensor_mac, distance, threshold){
2598
+ console.log('config_set_distance_under_strength_threshold_99');
2599
+ let packet = [244, 25, 0, 0, 0];
2600
+ let distance_ = int2Bytes(distance, 2);
2601
+ packet.push(...distance_);
2602
+ let threshold_ = int2Bytes(threshold, 2);
2603
+ packet.push(...threshold_);
2604
+ console.log(packet);
2605
+ return this.config_send(sensor_mac, packet);
2606
+ }
2607
+ config_set_clean_sensor_99(sensor_mac, value){
2608
+ console.log('config_set_clean_sensor_99');
2609
+ let packet = [244, 40, 0, 0, 0];
2610
+ console.log(packet);
2611
+ return this.config_send(sensor_mac, packet);
2612
+ }
2613
+ config_set_reset_sensor_99(sensor_mac, value){
2614
+ console.log('config_set_reset_sensor_99');
2615
+ let packet = [244, 38, 0, 0, 0];
2616
+ console.log(packet);
2617
+ return this.config_send(sensor_mac, packet);
2618
+ }
2619
+ config_set_factory_reset_sensor_99(sensor_mac, value){
2620
+ console.log('config_set_factory_reset_sensor_99');
2621
+ let packet = [244, 39, 0, 0, 0];
2622
+ console.log(packet);
2623
+ return this.config_send(sensor_mac, packet);
2624
+ }
2573
2625
  config_get_delay(sensor_mac){
2574
2626
  return new Promise((fulfill, reject) => {
2575
2627
  this.config_send(sensor_mac, [247, 21, 0, 0, 0]).then((res) => {
@@ -4161,13 +4213,14 @@ function sensor_types(parent){
4161
4213
  name: 'RTD Temperature Sensor',
4162
4214
  parse: (payload, parsed, mac) => {
4163
4215
  if(parsed.firmware > 5){
4216
+ let reserved = payload[7] >> 1; // Fault status (1-bit left shifted)
4164
4217
  let fault_status = '';
4165
- if (payload[7] === 0) {
4218
+ if (reserved === 0) {
4166
4219
  fault_status = 'data_valid';
4167
- } else if (payload[7] === 15) {
4220
+ } else if (reserved === 15) {
4168
4221
  fault_status = 'data_invalid';
4169
4222
  } else {
4170
- const faultTypeBits = payload[7] & 0b00111100;
4223
+ const faultTypeBits = reserved & 0b00111100;
4171
4224
  switch (faultTypeBits) {
4172
4225
  case 32:
4173
4226
  fault_status = 'ref_in_vbias';
@@ -4668,13 +4721,14 @@ function sensor_types(parent){
4668
4721
  name: '2-Channel RTD Temperature Sensor',
4669
4722
  parse: (payload, parsed, mac) => {
4670
4723
  if(parsed.firmware > 5){
4724
+ let reserved = payload[7] >> 1; // Fault status (1-bit left shifted)
4671
4725
  let fault_status = '';
4672
- if (payload[7] === 0) {
4726
+ if (reserved === 0) {
4673
4727
  fault_status = 'data_valid';
4674
- } else if (payload[7] === 15) {
4728
+ } else if (reserved === 15) {
4675
4729
  fault_status = 'data_invalid';
4676
4730
  } else {
4677
- const fault_bits = (payload[7] >> 2) & 0b00001111;
4731
+ const fault_bits = (reserved >> 2) & 0b00001111;
4678
4732
  switch (fault_bits) {
4679
4733
  case 8:
4680
4734
  fault_status = 'ref_in_vbias';
@@ -4689,7 +4743,7 @@ function sensor_types(parent){
4689
4743
  fault_status = 'over_under_voltage';
4690
4744
  break;
4691
4745
  }
4692
- const channel_bits = payload[7] & 0b00000011;
4746
+ const channel_bits = reserved & 0b00000011;
4693
4747
  switch (channel_bits) {
4694
4748
  case 1:
4695
4749
  fault_status = fault_status + '_ch1';
@@ -4742,13 +4796,14 @@ function sensor_types(parent){
4742
4796
  '55': {
4743
4797
  name: '3-Channel RTD Temperature Sensor',
4744
4798
  parse: (payload, parsed, mac) => {
4799
+ let reserved = payload[7] >> 1; // Fault status (1-bit left shifted)
4745
4800
  let fault_status = '';
4746
- if (payload[7] === 0) {
4801
+ if (reserved === 0) {
4747
4802
  fault_status = 'data_valid';
4748
- } else if (payload[7] === 15) {
4803
+ } else if (reserved === 15) {
4749
4804
  fault_status = 'data_invalid';
4750
4805
  } else {
4751
- const fault_bits = (payload[7] >> 2) & 0b00001111;
4806
+ const fault_bits = (reserved >> 2) & 0b00001111;
4752
4807
  switch (fault_bits) {
4753
4808
  case 8:
4754
4809
  fault_status = 'ref_in_vbias';
@@ -4763,7 +4818,7 @@ function sensor_types(parent){
4763
4818
  fault_status = 'over_under_voltage';
4764
4819
  break;
4765
4820
  }
4766
- const channel_bits = payload[7] & 0b00000011;
4821
+ const channel_bits = reserved & 0b00000011;
4767
4822
  switch (channel_bits) {
4768
4823
  case 1:
4769
4824
  fault_status = fault_status + '_ch1';
@@ -8521,6 +8576,28 @@ function sensor_types(parent){
8521
8576
  }
8522
8577
  }
8523
8578
  },
8579
+ '99': {
8580
+ name: 'Laser Sensor',
8581
+ parse: (d) => {
8582
+ return {
8583
+ distance: d.slice(0, 2).reduce(msbLsb)
8584
+ };
8585
+ },
8586
+ 'parse_fly': (frame) => {
8587
+ return {
8588
+ 'firmware': frame[2],
8589
+ 'hardware_id': frame.slice(12, 15),
8590
+ 'report_rate': frame.slice(15, 19).reduce(msbLsb) + " sec",
8591
+ 'tx_life_counter': frame.slice(19, 23).reduce(msbLsb),
8592
+ 'machine_values': {
8593
+ 'firmware': frame[2],
8594
+ 'hardware_id': frame.slice(12, 15),
8595
+ 'report_rate': frame.slice(15, 19),
8596
+ 'tx_life_counter': frame.slice(19, 23)
8597
+ }
8598
+ }
8599
+ }
8600
+ },
8524
8601
  '101':{
8525
8602
  name: 'Pro Vibration',
8526
8603
  parse: (d, full)=>{
@@ -9422,7 +9499,7 @@ function sensor_types(parent){
9422
9499
  }
9423
9500
  },
9424
9501
  'parse_fly': (frame) => {
9425
- if(frame[2] == 19){ // Screen version fw 19
9502
+ if(frame[2] > 18){
9426
9503
  let reset_mode = "Disabled";
9427
9504
  switch(frame[38]){
9428
9505
  case 0:
@@ -9548,165 +9625,10 @@ function sensor_types(parent){
9548
9625
  'acc_odr': acc_odr,
9549
9626
  'screen_control': screen_control,
9550
9627
  'screen_on_time': frame[42] + ' sec',
9551
- 'interrupt_timeout': frame[43] + ' msec',
9552
- 'hardware_id': frame.slice(44, 47),
9553
- 'report_rate': frame.slice(47, 51).reduce(msbLsb) + " sec",
9554
- 'tx_life_counter': frame.slice(51, 55).reduce(msbLsb),
9555
- 'machine_values': {
9556
- 'firmware': frame[2],
9557
- 'accelerometer_threshold': frame[16],
9558
- 'debouncing_timeout': frame.slice(17, 19),
9559
- 'accelero_state': frame[19],
9560
- 'input_1_active_edge': frame[20],
9561
- 'input_2_active_edge': frame[21],
9562
- 'input_3_active_edge': frame[22],
9563
- 'counter_threshold': frame.slice(23, 27),
9564
- 'trasnmit_on_change_status': frame[27],
9565
- 'Shift_end_1': frame.slice(28, 30),
9566
- 'Shift_end_2': frame.slice(30, 32),
9567
- 'Shift_end_3': frame.slice(32, 34),
9568
- 'Shift_end_4': frame.slice(34, 36),
9569
- 'reset_timeout': frame.slice(36, 38),
9570
- 'counter_reset_mode': frame[38],
9571
- 'sampling_interval': frame[39],
9572
- 'acc_odr': frame[40],
9573
- 'screen_control': frame[41],
9574
- 'screen_on_time': frame[42],
9575
- 'interrupt_timeout': frame[43],
9576
- 'hardware_id': frame.slice(44, 47),
9577
- 'report_rate': frame.slice(47, 51),
9578
- 'tx_life_counter': frame.slice(51, 55)
9579
- }
9580
- }
9581
- } else if(frame[2] == 16){ // Screen version
9582
- let reset_mode = "Disabled";
9583
- switch(frame[38]){
9584
- case 0:
9585
- reset_mode = "Disabled";
9586
- break;
9587
- case 1:
9588
- reset_mode = "Shift Ends";
9589
- break;
9590
- case 2:
9591
- reset_mode = "Timeout";
9592
- break;
9593
- }
9594
- let acc_odr = "10Hz";
9595
- switch(frame[40]){
9596
- case 0:
9597
- acc_odr = "10Hz";
9598
- break;
9599
- case 1:
9600
- acc_odr = "20Hz";
9601
- break;
9602
- case 2:
9603
- acc_odr = "50Hz";
9604
- break;
9605
- case 3:
9606
- acc_odr = "100Hz";
9607
- break;
9608
- case 4:
9609
- acc_odr = "200Hz";
9610
- break;
9611
- case 5:
9612
- acc_odr = "400Hz";
9613
- break;
9614
- }
9615
- let rtc_sampling_interval = "5 seconds";
9616
- switch(frame[39]){
9617
- case 0:
9618
- rtc_sampling_interval = "1 minute";
9619
- break;
9620
- case 1:
9621
- rtc_sampling_interval = "5 minutes";
9622
- break;
9623
- case 2:
9624
- rtc_sampling_interval = "15 minutes";
9625
- break;
9626
- case 3:
9627
- rtc_sampling_interval = "30 minutes";
9628
- break;
9629
- case 4:
9630
- rtc_sampling_interval = "1 hour";
9631
- break;
9632
- case 5:
9633
- rtc_sampling_interval = "2 hours";
9634
- break;
9635
- case 6:
9636
- rtc_sampling_interval = "3 hours";
9637
- break;
9638
- case 7:
9639
- rtc_sampling_interval = "6 hours";
9640
- break;
9641
- case 8:
9642
- rtc_sampling_interval = "12 hours";
9643
- break;
9644
- case 9:
9645
- rtc_sampling_interval = "5 seconds";
9646
- break;
9647
- case 10:
9648
- rtc_sampling_interval = "10 seconds";
9649
- break;
9650
- case 11:
9651
- rtc_sampling_interval = "15 seconds";
9652
- break;
9653
- case 12:
9654
- rtc_sampling_interval = "30 seconds";
9655
- break;
9656
- }
9657
- let screen_control = 0;
9658
- switch(frame[41]){
9659
- case 0:
9660
- screen_control = "IO1";
9661
- break;
9662
- case 1:
9663
- screen_control = "IO2";
9664
- break;
9665
- case 2:
9666
- screen_control = "IO3";
9667
- break;
9668
- case 3:
9669
- screen_control = "Accelero";
9670
- break;
9671
- case 4:
9672
- screen_control = "Magneto";
9673
- break;
9674
- }
9675
- return {
9676
- 'firmware': frame[2],
9677
- 'accelerometer_threshold': (frame[16]* 32) + "mg",
9678
- 'debouncing_timeout': frame.slice(17, 19).reduce(msbLsb) + "msec",
9679
- 'accelero_state': frame[19]? "Enabled": "Disabled",
9680
- 'input_1_active_edge': frame[20]? "Rising": "Falling",
9681
- 'input_2_active_edge': frame[21]? "Rising": "Falling",
9682
- 'input_3_active_edge': frame[22]? "Rising": "Falling",
9683
- 'counter_threshold': frame.slice(23, 27).reduce(msbLsb),
9684
- 'trasnmit_on_change_status': frame[27]? "Enabled": "Disabled",
9685
- 'Shift_end_1': [
9686
- String(frame[28]).padStart(2, '0'),
9687
- String(frame[29]).padStart(2, '0')
9688
- ].join(':'),
9689
- 'Shift_end_2': [
9690
- String(frame[30]).padStart(2, '0'),
9691
- String(frame[31]).padStart(2, '0')
9692
- ].join(':'),
9693
- 'Shift_end_3': [
9694
- String(frame[32]).padStart(2, '0'),
9695
- String(frame[33]).padStart(2, '0')
9696
- ].join(':'),
9697
- 'Shift_end_4': [
9698
- String(frame[34]).padStart(2, '0'),
9699
- String(frame[35]).padStart(2, '0')
9700
- ].join(':'),
9701
- 'reset_timeout': frame.slice(36, 38).reduce(msbLsb) + "min",
9702
- 'counter_reset_mode': reset_mode,
9703
- 'sampling_interval': rtc_sampling_interval,
9704
- 'acc_odr': acc_odr,
9705
- 'screen_control': screen_control,
9706
- 'screen_on_time': frame[42] + 'sec',
9707
- 'hardware_id': frame.slice(43, 46),
9708
- 'report_rate': frame.slice(46, 50).reduce(msbLsb) + "sec",
9709
- 'tx_life_counter': frame.slice(50, 54).reduce(msbLsb),
9628
+ 'interrupt_timeout': frame.slice(43, 45).reduce(msbLsb) + ' msec',
9629
+ 'hardware_id': frame.slice(45, 48),
9630
+ 'report_rate': frame.slice(48, 52).reduce(msbLsb) + " sec",
9631
+ 'tx_life_counter': frame.slice(52, 56).reduce(msbLsb),
9710
9632
  'machine_values': {
9711
9633
  'firmware': frame[2],
9712
9634
  'accelerometer_threshold': frame[16],
@@ -9727,12 +9649,13 @@ function sensor_types(parent){
9727
9649
  'acc_odr': frame[40],
9728
9650
  'screen_control': frame[41],
9729
9651
  'screen_on_time': frame[42],
9730
- 'hardware_id': frame.slice(43, 46),
9731
- 'report_rate': frame.slice(46, 50),
9732
- 'tx_life_counter': frame.slice(50, 54)
9652
+ 'interrupt_timeout': frame.slice(43, 45),
9653
+ 'hardware_id': frame.slice(45, 48),
9654
+ 'report_rate': frame.slice(48, 52),
9655
+ 'tx_life_counter': frame.slice(52, 56)
9733
9656
  }
9734
9657
  }
9735
- } else if(frame[2] == 14){ // 14
9658
+ }else if(frame[2] > 13){
9736
9659
  let reset_mode = "Disabled";
9737
9660
  switch(frame[38]){
9738
9661
  case 0:
@@ -9866,7 +9789,7 @@ function sensor_types(parent){
9866
9789
  'tx_life_counter': frame.slice(50, 54)
9867
9790
  }
9868
9791
  }
9869
- } else if(frame[2] > 9){ // firmware 10 11 12 13 14 15
9792
+ } else if(frame[2] > 9){
9870
9793
  let reset_mode = "Disabled";
9871
9794
  switch(frame[38]){
9872
9795
  case 0:
@@ -10355,164 +10278,63 @@ function sensor_types(parent){
10355
10278
  let msg_type = (payload[7] & 16)? 'motion' : 'regular';
10356
10279
  if(payload[8] === 1){
10357
10280
  var deviceAddr = mac;
10358
- var firmware = payload[1];
10359
- var hour = payload[12];
10360
- var minute = payload[13];
10281
+ // var firmware = payload[1];
10282
+ // var hour = payload[12];
10283
+ // var minute = payload[13];
10361
10284
  var expected_packets = msbLsb(payload[16], payload[17]);
10362
10285
  var current_packet = msbLsb(payload[18], payload[19]);
10363
10286
  var sdata_start = 20;
10364
10287
 
10365
10288
  if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
10366
- if(expected_packets != 1){
10289
+ if (expected_packets != 1) {
10367
10290
  // 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){
10291
+ if (globalDevices[deviceAddr].last_packet_counter == current_packet) {
10369
10292
  console.log('Duplicated message')
10370
10293
  return;
10371
10294
  }
10372
10295
  // 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
10375
- delete globalDevices[deviceAddr];
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;
10381
-
10382
- globalDevices[deviceAddr] = {
10383
- data: {},
10384
- odr: odr,
10385
- mo: mode,
10386
- fsr: fsr,
10387
- hour: hour,
10388
- minute: minute,
10389
- temperature: temperature,
10390
- }
10296
+ if (current_packet == 1 || (globalDevices[deviceAddr].last_packet_counter > current_packet)) {
10297
+ console.log('Recovering bad packet');
10298
+ // clear stream object & timeout
10299
+ parent.sensor_types[110].utils.clear_globalDevices_stream(deviceAddr);
10300
+
10301
+ // init new stream
10302
+ parent.sensor_types[110].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
10303
+
10391
10304
  globalDevices[deviceAddr].last_packet_counter = current_packet;
10392
10305
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10393
10306
  return;
10394
- }
10395
- else{
10307
+ } else {
10396
10308
  globalDevices[deviceAddr].last_packet_counter = current_packet;
10397
10309
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10398
10310
  }
10399
10311
  }
10400
10312
  else{
10401
- var mode = payload[8];
10402
- var odr = msbLsb(payload[9], payload[10]);
10403
- var fsr = payload[11] >> 5;
10404
- var temperature = msbLsb(payload[14], payload[15])/100;
10313
+ // clear stream object & timeout
10314
+ parent.sensor_types[110].utils.clear_globalDevices_stream(deviceAddr);
10405
10315
 
10406
- globalDevices[deviceAddr] = {
10407
- data: {},
10408
- odr: odr,
10409
- mo: mode,
10410
- fsr: fsr,
10411
- hour: hour,
10412
- minute: minute,
10413
- temperature: temperature,
10414
- }
10415
- globalDevices[deviceAddr].last_packet_counter = current_packet;
10416
- globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10316
+ // init new stream
10317
+ parent.sensor_types[110].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
10318
+
10319
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
10320
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10417
10321
  }
10418
10322
  }
10419
10323
  else{
10420
- var mode = payload[8];
10421
- var odr = msbLsb(payload[9], payload[10]);
10422
- var fsr = payload[11] >> 5;
10423
- var temperature = msbLsb(payload[14], payload[15])/100;
10324
+ // clear stream object & timeout
10325
+ parent.sensor_types[110].utils.clear_globalDevices_stream(deviceAddr);
10326
+
10327
+ // init new stream
10328
+ parent.sensor_types[110].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
10424
10329
 
10425
- globalDevices[deviceAddr] = {
10426
- data: {},
10427
- odr: odr,
10428
- mo: mode,
10429
- fsr: fsr,
10430
- hour: hour,
10431
- minute: minute,
10432
- temperature: temperature,
10433
- }
10434
10330
  globalDevices[deviceAddr].last_packet_counter = current_packet;
10435
10331
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10436
10332
  }
10437
10333
  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];
10334
+ // concatenate stream
10335
+ sensor_data = parent.sensor_types[114].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
10336
+ // clear stream object & timeout
10337
+ parent.sensor_types[114].utils.clear_globalDevices_stream(deviceAddr);
10516
10338
  return sensor_data;
10517
10339
  }
10518
10340
  else{
@@ -10593,6 +10415,119 @@ function sensor_types(parent){
10593
10415
  // return parsed;
10594
10416
  // }
10595
10417
  },
10418
+ 'utils': {
10419
+ 'clear_globalDevices_stream': (deviceAddr) => {
10420
+ if(Object.hasOwn(globalDevices, deviceAddr)){
10421
+ if(Object.hasOwn(globalDevices[deviceAddr], 'packet_stream_timeout')){
10422
+ clearTimeout(globalDevices[deviceAddr].packet_stream_timeout);
10423
+ }
10424
+ delete globalDevices[deviceAddr];
10425
+ }
10426
+ },
10427
+ 'init_globalDevices_stream'(deviceAddr, payload, expected_packets, parsed, msg_type){
10428
+ globalDevices[deviceAddr] = {
10429
+ data: {},
10430
+ odr: msbLsb(payload[9], payload[10]),
10431
+ mo: payload[8],
10432
+ fsr: payload[11] >> 5,
10433
+ hour: payload[12],
10434
+ minute: payload[13],
10435
+ temperature: msbLsb(payload[14], payload[15]) / 100,
10436
+ expected_packets: expected_packets
10437
+ }
10438
+ globalDevices[deviceAddr].packet_stream_timeout = setTimeout(() => {
10439
+ parsed.sensor_data = parent.sensor_types[110].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
10440
+ parsed.sensor_data.error = 'Time Series Data Stream Timeout - incomplete data received';
10441
+
10442
+ parsed.sensor_name = parent.sensor_types[110].name;
10443
+ parsed.type = 'sensor_data';
10444
+ parsed.addr = deviceAddr;
10445
+ parsed.received = Date.now();
10446
+
10447
+ parent._emitter.emit('sensor_data', parsed);
10448
+ parent._emitter.emit('sensor_data-110', parsed);
10449
+ parent._emitter.emit('sensor_data'+'-'+deviceAddr, parsed);
10450
+ }, 60000);
10451
+ },
10452
+ 'concat_fft_data': (deviceAddr, mode, msg_type) => {
10453
+ var raw_data = new Array();
10454
+ for(const packet in globalDevices[deviceAddr].data){
10455
+ raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
10456
+ }
10457
+ var label = 0;
10458
+
10459
+ var fft_concat = {};
10460
+
10461
+ var en_axis_data = {};
10462
+ en_axis_data.x_offset = 0;
10463
+ en_axis_data.y_offset = 2;
10464
+ en_axis_data.z_offset = 4;
10465
+ en_axis_data.increment = 6;
10466
+ fft_concat = {x: [], y: [], z: []};
10467
+
10468
+ var fsr_mult = .00006;
10469
+ var fsr_text = "";
10470
+
10471
+ switch(globalDevices[deviceAddr].fsr){
10472
+ case 0:
10473
+ fsr_mult = 0.00006;
10474
+ break;
10475
+ case 1:
10476
+ fsr_mult = 0.00012;
10477
+ break;
10478
+ case 2:
10479
+ fsr_mult = 0.00024;
10480
+ break;
10481
+ case 3:
10482
+ fsr_mult = 0.00049;
10483
+ break;
10484
+ }
10485
+ switch(globalDevices[deviceAddr].fsr){
10486
+ case 0:
10487
+ fsr_text = "2g";
10488
+ break;
10489
+ case 1:
10490
+ fsr_text = "4g";
10491
+ break;
10492
+ case 2:
10493
+ fsr_text = "8g";
10494
+ break;
10495
+ case 3:
10496
+ fsr_text = "16g";
10497
+ break;
10498
+ }
10499
+
10500
+ for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
10501
+ label++;
10502
+
10503
+ if('x_offset' in en_axis_data){
10504
+ 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)));
10505
+ }
10506
+ if('y_offset' in en_axis_data){
10507
+ 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)));
10508
+ }
10509
+ if('z_offset' in en_axis_data){
10510
+ 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)));
10511
+ }
10512
+ }
10513
+ var fft_concat_obj = {
10514
+ mode: mode,
10515
+ msg_type: msg_type,
10516
+ time_id: [
10517
+ String(globalDevices[deviceAddr].hour).padStart(2, '0'),
10518
+ String(globalDevices[deviceAddr].minute).padStart(2, '0'),
10519
+ ].join(':'),
10520
+ mac_address: deviceAddr,
10521
+ fsr: fsr_text,
10522
+ odr: globalDevices[deviceAddr].odr,
10523
+ temperature: globalDevices[deviceAddr].temperature,
10524
+ total_samples: label,
10525
+ fft_confidence : ((Object.keys(globalDevices[deviceAddr].data).length / globalDevices[deviceAddr].expected_packets) * 100).toFixed(2) + '%',
10526
+ data: fft_concat
10527
+ };
10528
+ return fft_concat_obj;
10529
+ }
10530
+ },
10596
10531
  'parse_fly': (frame) => {
10597
10532
  let frame_data = {};
10598
10533
  switch(frame[16]){
@@ -10957,7 +10892,7 @@ function sensor_types(parent){
10957
10892
  '111': {
10958
10893
  name: 'Two Channel Vibration Plus v4',
10959
10894
  parse: (payload, parsed, mac) => {
10960
- parsed.data = {};
10895
+ // parsed.data = {};
10961
10896
  if(payload[7] & 2){
10962
10897
  parsed.data['probe_1_error'] = true;
10963
10898
  }
@@ -10970,174 +10905,77 @@ function sensor_types(parent){
10970
10905
  let msg_type = (payload[7] & 16)? 'motion' : 'regular';
10971
10906
  if(payload[8] === 1){
10972
10907
  var deviceAddr = mac;
10973
- var firmware = payload[1];
10974
- var hour = payload[12];
10975
- var minute = payload[13];
10908
+ // var firmware = payload[1];
10909
+ // var hour = payload[12];
10910
+ // var minute = payload[13];
10976
10911
  var expected_packets = msbLsb(payload[16], payload[17]);
10977
10912
  var current_packet = msbLsb(payload[18], payload[19]);
10978
10913
  var sdata_start = 20;
10914
+ // If 4th bit is 1 the packet is from the second probe, if 0 from the first
10915
+ var probe;
10916
+ if (payload[7] & 8) {
10917
+ probe = 2;
10918
+ } else {
10919
+ probe = 1;
10920
+ }
10979
10921
 
10980
- if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
10981
- if(expected_packets != 1){
10922
+ // initialize globalDevices for this sensor if it doesn't exist
10923
+ // exlusively for multi-probe sensors
10924
+ if(!Object.hasOwn(globalDevices, deviceAddr)){
10925
+ globalDevices[deviceAddr] = {};
10926
+ }
10927
+ if(globalDevices[deviceAddr].hasOwnProperty(probe) || expected_packets == 1){
10928
+ console.log('Continuing existing probe stream');
10929
+ if (expected_packets != 1) {
10930
+ console.log('Expected packets more than 1');
10982
10931
  // 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){
10932
+ if (globalDevices[deviceAddr][probe].last_packet_counter == current_packet) {
10984
10933
  console.log('Duplicated message')
10985
10934
  return;
10986
10935
  }
10987
10936
  // 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
10990
- delete globalDevices[deviceAddr];
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;
10937
+ if (current_packet == 1 || (globalDevices[deviceAddr][probe].last_packet_counter > current_packet)) {
10938
+ console.log('Recovering bad packet');
10939
+ // clear stream object & timeout
10940
+ parent.sensor_types[111].utils.clear_globalDevices_stream(deviceAddr, probe);
10996
10941
 
10997
- globalDevices[deviceAddr] = {
10998
- data: {},
10999
- odr: odr,
11000
- mo: mode,
11001
- fsr: fsr,
11002
- hour: hour,
11003
- minute: minute,
11004
- temperature: temperature,
11005
- }
11006
- globalDevices[deviceAddr].last_packet_counter = current_packet;
11007
- globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
11008
- return;
11009
- }
11010
- else{
11011
- globalDevices[deviceAddr].last_packet_counter = current_packet;
11012
- globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
11013
- }
11014
- }
11015
- else{
11016
- var mode = payload[8];
11017
- var odr = msbLsb(payload[9], payload[10]);
11018
- var fsr = payload[11] >> 5;
11019
- var temperature = msbLsb(payload[14], payload[15])/100;
10942
+ // init new stream
10943
+ parent.sensor_types[111].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type, probe);
11020
10944
 
11021
- globalDevices[deviceAddr] = {
11022
- data: {},
11023
- odr: odr,
11024
- mo: mode,
11025
- fsr: fsr,
11026
- hour: hour,
11027
- minute: minute,
11028
- temperature: temperature,
10945
+ globalDevices[deviceAddr][probe].last_packet_counter = current_packet;
10946
+ globalDevices[deviceAddr][probe].data[current_packet] = payload.slice(sdata_start);
10947
+ return;
10948
+ } else {
10949
+ globalDevices[deviceAddr][probe].last_packet_counter = current_packet;
10950
+ globalDevices[deviceAddr][probe].data[current_packet] = payload.slice(sdata_start);
11029
10951
  }
11030
- globalDevices[deviceAddr].last_packet_counter = current_packet;
11031
- globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10952
+ } else {
10953
+ // clear stream object & timeout
10954
+ parent.sensor_types[111].utils.clear_globalDevices_stream(deviceAddr, probe);
10955
+
10956
+ // init new stream
10957
+ parent.sensor_types[111].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type, probe);
10958
+
10959
+ globalDevices[deviceAddr][probe].last_packet_counter = current_packet;
10960
+ globalDevices[deviceAddr][probe].data[current_packet] = payload.slice(sdata_start);
11032
10961
  }
11033
10962
  }
11034
10963
  else{
11035
- var mode = payload[8];
11036
- var odr = msbLsb(payload[9], payload[10]);
11037
- var fsr = payload[11] >> 5;
11038
- var temperature = msbLsb(payload[14], payload[15])/100;
10964
+ // clear stream object & timeout
10965
+ parent.sensor_types[111].utils.clear_globalDevices_stream(deviceAddr, probe);
11039
10966
 
11040
- globalDevices[deviceAddr] = {
11041
- data: {},
11042
- odr: odr,
11043
- mo: mode,
11044
- fsr: fsr,
11045
- hour: hour,
11046
- minute: minute,
11047
- temperature: temperature,
11048
- }
11049
- globalDevices[deviceAddr].last_packet_counter = current_packet;
11050
- globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10967
+ // init new stream
10968
+ parent.sensor_types[111].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type, probe);
10969
+
10970
+ globalDevices[deviceAddr][probe].last_packet_counter = current_packet;
10971
+ globalDevices[deviceAddr][probe].data[current_packet] = payload.slice(sdata_start);
11051
10972
  }
11052
10973
  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;
10974
+ // concatenate stream
10975
+ sensor_data = parent.sensor_types[111].utils.concat_fft_data(deviceAddr, payload[8], msg_type, probe);
11058
10976
 
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];
10977
+ // clear stream object & timeout
10978
+ parent.sensor_types[111].utils.clear_globalDevices_stream(deviceAddr, probe);
11141
10979
  return sensor_data;
11142
10980
  }
11143
10981
  else{
@@ -11288,6 +11126,120 @@ function sensor_types(parent){
11288
11126
  // return parsed;
11289
11127
  // }
11290
11128
  },
11129
+ 'utils': {
11130
+ 'clear_globalDevices_stream': (deviceAddr, probe) => {
11131
+ if(Object.hasOwn(globalDevices, deviceAddr) && Object.hasOwn(globalDevices[deviceAddr], probe)){
11132
+ if(Object.hasOwn(globalDevices[deviceAddr][probe], 'packet_stream_timeout')){
11133
+ clearTimeout(globalDevices[deviceAddr][probe].packet_stream_timeout);
11134
+ }
11135
+ delete globalDevices[deviceAddr][probe];
11136
+ }
11137
+ },
11138
+ 'init_globalDevices_stream'(deviceAddr, payload, expected_packets, parsed, msg_type, probe){
11139
+ globalDevices[deviceAddr][probe] = {
11140
+ data: {},
11141
+ odr: msbLsb(payload[9], payload[10]),
11142
+ mo: payload[8],
11143
+ fsr: payload[11] >> 5,
11144
+ hour: payload[12],
11145
+ minute: payload[13],
11146
+ temperature: msbLsb(payload[14], payload[15]) / 100,
11147
+ expected_packets: expected_packets
11148
+ }
11149
+ globalDevices[deviceAddr][probe].packet_stream_timeout = setTimeout(() => {
11150
+ parsed.sensor_data = parent.sensor_types[111].utils.concat_fft_data(deviceAddr, payload[8], msg_type, probe);
11151
+ parsed.sensor_data.error = 'Time Series Data Stream Timeout - incomplete data received';
11152
+
11153
+ parsed.sensor_name = parent.sensor_types[111].name;
11154
+ parsed.type = 'sensor_data';
11155
+ parsed.addr = deviceAddr;
11156
+ parsed.received = Date.now();
11157
+
11158
+ parent._emitter.emit('sensor_data', parsed);
11159
+ parent._emitter.emit('sensor_data-111', parsed);
11160
+ parent._emitter.emit('sensor_data'+'-'+deviceAddr, parsed);
11161
+ }, 60000);
11162
+ },
11163
+ 'concat_fft_data': (deviceAddr, mode, msg_type, probe) => {
11164
+ var raw_data = new Array();
11165
+ for(const packet in globalDevices[deviceAddr][probe].data){
11166
+ raw_data = raw_data.concat(globalDevices[deviceAddr][probe].data[packet]);
11167
+ }
11168
+ var label = 0;
11169
+
11170
+ var fft_concat = {};
11171
+
11172
+ var en_axis_data = {};
11173
+ en_axis_data.x_offset = 0;
11174
+ en_axis_data.y_offset = 2;
11175
+ en_axis_data.z_offset = 4;
11176
+ en_axis_data.increment = 6;
11177
+ fft_concat = {x: [], y: [], z: []};
11178
+
11179
+ var fsr_mult = .00006;
11180
+ var fsr_text = "";
11181
+
11182
+ switch(globalDevices[deviceAddr][probe].fsr){
11183
+ case 0:
11184
+ fsr_mult = 0.00006;
11185
+ break;
11186
+ case 1:
11187
+ fsr_mult = 0.00012;
11188
+ break;
11189
+ case 2:
11190
+ fsr_mult = 0.00024;
11191
+ break;
11192
+ case 3:
11193
+ fsr_mult = 0.00049;
11194
+ break;
11195
+ }
11196
+ switch(globalDevices[deviceAddr][probe].fsr){
11197
+ case 0:
11198
+ fsr_text = "2g";
11199
+ break;
11200
+ case 1:
11201
+ fsr_text = "4g";
11202
+ break;
11203
+ case 2:
11204
+ fsr_text = "8g";
11205
+ break;
11206
+ case 3:
11207
+ fsr_text = "16g";
11208
+ break;
11209
+ }
11210
+
11211
+ for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
11212
+ label++;
11213
+
11214
+ if('x_offset' in en_axis_data){
11215
+ 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)));
11216
+ }
11217
+ if('y_offset' in en_axis_data){
11218
+ 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)));
11219
+ }
11220
+ if('z_offset' in en_axis_data){
11221
+ 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)));
11222
+ }
11223
+ }
11224
+ var fft_concat_obj = {
11225
+ mode: mode,
11226
+ msg_type: msg_type,
11227
+ probe: probe,
11228
+ time_id: [
11229
+ String(globalDevices[deviceAddr][probe].hour).padStart(2, '0'),
11230
+ String(globalDevices[deviceAddr][probe].minute).padStart(2, '0'),
11231
+ ].join(':'),
11232
+ mac_address: deviceAddr,
11233
+ fsr: fsr_text,
11234
+ odr: globalDevices[deviceAddr][probe].odr,
11235
+ temperature: globalDevices[deviceAddr][probe].temperature,
11236
+ total_samples: label,
11237
+ fft_confidence : ((Object.keys(globalDevices[deviceAddr][probe].data).length / globalDevices[deviceAddr][probe].expected_packets) * 100).toFixed(2) + '%',
11238
+ data: fft_concat
11239
+ };
11240
+ return fft_concat_obj;
11241
+ }
11242
+ },
11291
11243
  'parse_fly': (frame) => {
11292
11244
  let frame_data = {};
11293
11245
  switch(frame[16]){
@@ -11801,192 +11753,66 @@ function sensor_types(parent){
11801
11753
  return parsed;
11802
11754
  }
11803
11755
  let msg_type = (payload[7] & 16)? 'motion' : 'regular';
11804
- if(payload[8] === 1){
11756
+ if (payload[8] === 1) {
11805
11757
  var deviceAddr = mac;
11806
- var firmware = payload[1];
11807
- var hour = payload[12];
11808
- var minute = payload[13];
11758
+ // var firmware = payload[1];
11759
+ // var hour = payload[12];
11760
+ // var minute = payload[13];
11809
11761
  var expected_packets = msbLsb(payload[16], payload[17]);
11810
11762
  var current_packet = msbLsb(payload[18], payload[19]);
11811
11763
  var sdata_start = 20;
11812
-
11813
- if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
11814
- if(expected_packets != 1){
11815
- // 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
11816
- if(current_packet in globalDevices[deviceAddr].data || current_packet == 1 || !((current_packet-1) in globalDevices[deviceAddr].data)) {
11817
- console.log('-----');
11818
- console.log('bad packet breakdown deleting stream');
11819
- console.log(current_packet);
11820
- console.log(expected_packets);
11821
- console.log(current_packet in globalDevices[deviceAddr].data);
11822
- console.log(current_packet == 1);
11823
- console.log(!((current_packet-1) in globalDevices[deviceAddr].data));
11824
- if(this.hasOwnProperty('failure_no')){
11825
- this.failure_no = this.failure_no + 1;
11826
- }
11827
- else{
11828
- this.failure_no = 1;
11829
- }
11830
- if(this.hasOwnProperty('failure_no')){
11831
- console.log('####falure no');
11832
- console.log(this.failure_no);
11833
- }
11834
- // console.log(globalDevices[deviceAddr].data);
11835
- delete globalDevices[deviceAddr];
11836
- if(current_packet != 1){
11837
- return;
11838
- } else{
11839
-
11840
- var mode = payload[8];
11841
- var odr = msbLsb(payload[9], payload[10]);
11842
- var fsr = payload[11] >> 5;
11843
- var temperature = msbLsb(payload[14], payload[15])/100;
11844
-
11845
- globalDevices[deviceAddr] = {
11846
- // stream_size: expected_packets,
11847
- data: {},
11848
- odr: odr,
11849
- mo: mode,
11850
- fsr: fsr,
11851
- hour: hour,
11852
- minute: minute,
11853
- temperature: temperature,
11854
- }
11855
- globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
11856
- return;
11857
- }
11764
+
11765
+
11766
+ if (globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1) {
11767
+ if (expected_packets != 1) {
11768
+ // if current packet is equal to last one (duplicated data). This does not apply to the last package
11769
+ if (globalDevices[deviceAddr].last_packet_counter == current_packet) {
11770
+ console.log('Duplicated message')
11771
+ return;
11858
11772
  }
11859
- else{
11773
+ // if current packet is equal to 1 or last packet counter is higher thant current packet
11774
+ if (current_packet == 1 || (globalDevices[deviceAddr].last_packet_counter > current_packet)) {
11775
+ console.log('Recovering bad packet');
11776
+ // clear stream object & timeout
11777
+ parent.sensor_types[112].utils.clear_globalDevices_stream(deviceAddr);
11778
+
11779
+ // init new stream
11780
+ parent.sensor_types[112].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
11781
+
11782
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
11783
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
11784
+ return;
11785
+ } else {
11786
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
11860
11787
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
11861
11788
  }
11862
- }
11863
- else{
11864
- var mode = payload[8];
11865
- var odr = msbLsb(payload[9], payload[10]);
11866
- var fsr = payload[11] >> 5;
11867
- var temperature = msbLsb(payload[14], payload[15])/100;
11868
-
11869
- globalDevices[deviceAddr] = {
11870
- // stream_size: expected_packets,
11871
- data: {},
11872
- odr: odr,
11873
- mo: mode,
11874
- fsr: fsr,
11875
- hour: hour,
11876
- minute: minute,
11877
- temperature: temperature,
11878
- }
11789
+ } else {
11790
+ // clear stream object & timeout
11791
+ parent.sensor_types[112].utils.clear_globalDevices_stream(deviceAddr);
11792
+
11793
+ // init new stream
11794
+ parent.sensor_types[112].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
11795
+
11796
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
11879
11797
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
11880
11798
  }
11881
- if(Object.keys(globalDevices[deviceAddr].data).length == expected_packets){
11882
- var raw_data = new Array();
11883
- for(const packet in globalDevices[deviceAddr].data){
11884
- raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
11885
- }
11886
- var label = 0;
11887
-
11888
- var fft = new Array();
11889
- var fft_concat = {};
11890
-
11891
- var en_axis_data = {};
11892
- en_axis_data.x_offset = 0;
11893
- en_axis_data.y_offset = 2;
11894
- en_axis_data.z_offset = 4;
11895
- en_axis_data.increment = 6;
11896
- fft_concat = {x: [], y: [], z: []};
11897
-
11898
- var fsr_mult = .00006;
11899
- var fsr_text = "";
11900
- switch(globalDevices[deviceAddr].fsr){
11901
- case 0:
11902
- fsr_mult = 0.00006;
11903
- break;
11904
- case 1:
11905
- fsr_mult = 0.00012;
11906
- break;
11907
- case 2:
11908
- fsr_mult = 0.00024;
11909
- break;
11910
- case 3:
11911
- fsr_mult = 0.00049;
11912
- break;
11913
- }
11914
- switch(globalDevices[deviceAddr].fsr){
11915
- case 0:
11916
- fsr_text = "2g";
11917
- break;
11918
- case 1:
11919
- fsr_text = "4g";
11920
- break;
11921
- case 2:
11922
- fsr_text = "8g";
11923
- break;
11924
- case 3:
11925
- fsr_text = "16g";
11926
- break;
11927
- }
11928
-
11929
- for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
11930
- label++;
11931
-
11932
- if('x_offset' in en_axis_data){
11933
- 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)));
11934
- }
11935
- if('y_offset' in en_axis_data){
11936
- 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)));
11937
- }
11938
- if('z_offset' in en_axis_data){
11939
- 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)));
11940
- }
11941
- }
11942
- var fft_concat_obj = {
11943
- mode: payload[8],
11944
- msg_type: msg_type,
11945
- time_id: [
11946
- String(globalDevices[deviceAddr].hour).padStart(2, '0'),
11947
- String(globalDevices[deviceAddr].minute).padStart(2, '0'),
11948
- ].join(':'),
11949
- mac_address: deviceAddr,
11950
- fsr: fsr_text,
11951
- odr: globalDevices[deviceAddr].odr,
11952
- temperature: globalDevices[deviceAddr].temperature,
11953
- total_samples: label,
11954
- data: fft_concat
11955
- };
11956
- // console.log(globalDevices[deviceAddr].data);
11957
- // console.log(raw_data);
11958
- sensor_data = fft_concat_obj;
11959
- // parsed.raw_packets = globalDevices[deviceAddr].data;
11960
- // parsed.raw_data = raw_data;
11961
- delete globalDevices[deviceAddr];
11962
- if(this.hasOwnProperty('failure_no')){
11963
- console.log('####falure no');
11964
- console.log(this.failure_no);
11965
- }
11966
-
11967
- return sensor_data;
11968
- }
11969
- else{
11970
- return;
11971
- }
11972
- }else{
11973
-
11974
- var mode = payload[8];
11975
- var odr = msbLsb(payload[9], payload[10]);
11976
- var fsr = payload[11] >> 5;
11977
- var temperature = msbLsb(payload[14], payload[15])/100;
11978
-
11979
- globalDevices[deviceAddr] = {
11980
- // stream_size: expected_packets,
11981
- data: {},
11982
- odr: odr,
11983
- mo: mode,
11984
- fsr: fsr,
11985
- hour: hour,
11986
- minute: minute,
11987
- temperature: temperature,
11988
- }
11799
+ } else {
11800
+ // clear stream object & timeout
11801
+ parent.sensor_types[112].utils.clear_globalDevices_stream(deviceAddr);
11802
+
11803
+ // init new stream
11804
+ parent.sensor_types[112].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
11805
+
11806
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
11989
11807
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
11808
+ }
11809
+ if (current_packet == expected_packets) {
11810
+ // concatenate stream
11811
+ sensor_data = parent.sensor_types[112].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
11812
+ // clear stream object & timeout
11813
+ parent.sensor_types[112].utils.clear_globalDevices_stream(deviceAddr);
11814
+ return sensor_data;
11815
+ } else {
11990
11816
  return;
11991
11817
  }
11992
11818
  }
@@ -12065,6 +11891,119 @@ function sensor_types(parent){
12065
11891
  // return parsed;
12066
11892
  // }
12067
11893
  },
11894
+ 'utils': {
11895
+ 'clear_globalDevices_stream': (deviceAddr) => {
11896
+ if(Object.hasOwn(globalDevices, deviceAddr)){
11897
+ if(Object.hasOwn(globalDevices[deviceAddr], 'packet_stream_timeout')){
11898
+ clearTimeout(globalDevices[deviceAddr].packet_stream_timeout);
11899
+ }
11900
+ delete globalDevices[deviceAddr];
11901
+ }
11902
+ },
11903
+ 'init_globalDevices_stream'(deviceAddr, payload, expected_packets, parsed, msg_type){
11904
+ globalDevices[deviceAddr] = {
11905
+ data: {},
11906
+ odr: msbLsb(payload[9], payload[10]),
11907
+ mo: payload[8],
11908
+ fsr: payload[11] >> 5,
11909
+ hour: payload[12],
11910
+ minute: payload[13],
11911
+ temperature: msbLsb(payload[14], payload[15]) / 100,
11912
+ expected_packets: expected_packets
11913
+ }
11914
+ globalDevices[deviceAddr].packet_stream_timeout = setTimeout(() => {
11915
+ parsed.sensor_data = parent.sensor_types[112].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
11916
+ parsed.sensor_data.error = 'Time Series Data Stream Timeout - incomplete data received';
11917
+
11918
+ parsed.sensor_name = parent.sensor_types[112].name;
11919
+ parsed.type = 'sensor_data';
11920
+ parsed.addr = deviceAddr;
11921
+ parsed.received = Date.now();
11922
+
11923
+ parent._emitter.emit('sensor_data', parsed);
11924
+ parent._emitter.emit('sensor_data-112', parsed);
11925
+ parent._emitter.emit('sensor_data'+'-'+deviceAddr, parsed);
11926
+ }, 60000);
11927
+ },
11928
+ 'concat_fft_data': (deviceAddr, mode, msg_type) => {
11929
+ var raw_data = new Array();
11930
+ for(const packet in globalDevices[deviceAddr].data){
11931
+ raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
11932
+ }
11933
+ var label = 0;
11934
+
11935
+ var fft_concat = {};
11936
+
11937
+ var en_axis_data = {};
11938
+ en_axis_data.x_offset = 0;
11939
+ en_axis_data.y_offset = 2;
11940
+ en_axis_data.z_offset = 4;
11941
+ en_axis_data.increment = 6;
11942
+ fft_concat = {x: [], y: [], z: []};
11943
+
11944
+ var fsr_mult = .00006;
11945
+ var fsr_text = "";
11946
+
11947
+ switch(globalDevices[deviceAddr].fsr){
11948
+ case 0:
11949
+ fsr_mult = 0.00006;
11950
+ break;
11951
+ case 1:
11952
+ fsr_mult = 0.00012;
11953
+ break;
11954
+ case 2:
11955
+ fsr_mult = 0.00024;
11956
+ break;
11957
+ case 3:
11958
+ fsr_mult = 0.00049;
11959
+ break;
11960
+ }
11961
+ switch(globalDevices[deviceAddr].fsr){
11962
+ case 0:
11963
+ fsr_text = "2g";
11964
+ break;
11965
+ case 1:
11966
+ fsr_text = "4g";
11967
+ break;
11968
+ case 2:
11969
+ fsr_text = "8g";
11970
+ break;
11971
+ case 3:
11972
+ fsr_text = "16g";
11973
+ break;
11974
+ }
11975
+
11976
+ for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
11977
+ label++;
11978
+
11979
+ if('x_offset' in en_axis_data){
11980
+ 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)));
11981
+ }
11982
+ if('y_offset' in en_axis_data){
11983
+ 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)));
11984
+ }
11985
+ if('z_offset' in en_axis_data){
11986
+ 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)));
11987
+ }
11988
+ }
11989
+ var fft_concat_obj = {
11990
+ mode: mode,
11991
+ msg_type: msg_type,
11992
+ time_id: [
11993
+ String(globalDevices[deviceAddr].hour).padStart(2, '0'),
11994
+ String(globalDevices[deviceAddr].minute).padStart(2, '0'),
11995
+ ].join(':'),
11996
+ mac_address: deviceAddr,
11997
+ fsr: fsr_text,
11998
+ odr: globalDevices[deviceAddr].odr,
11999
+ temperature: globalDevices[deviceAddr].temperature,
12000
+ total_samples: label,
12001
+ fft_confidence : ((Object.keys(globalDevices[deviceAddr].data).length / globalDevices[deviceAddr].expected_packets) * 100).toFixed(2) + '%',
12002
+ data: fft_concat
12003
+ };
12004
+ return fft_concat_obj;
12005
+ }
12006
+ },
12068
12007
  'parse_fly': (frame) => {
12069
12008
  let frame_data = {};
12070
12009
  switch(frame[16]){
@@ -12437,9 +12376,9 @@ function sensor_types(parent){
12437
12376
  let msg_type = (payload[7] & 16)? 'motion' : 'regular';
12438
12377
  if(payload[8] === 1){
12439
12378
  var deviceAddr = mac;
12440
- var firmware = payload[1];
12441
- var hour = payload[12];
12442
- var minute = payload[13];
12379
+ // var firmware = payload[1];
12380
+ // var hour = payload[12];
12381
+ // var minute = payload[13];
12443
12382
  var expected_packets = msbLsb(payload[16], payload[17]);
12444
12383
  var current_packet = msbLsb(payload[18], payload[19]);
12445
12384
  var sdata_start = 20;
@@ -12453,23 +12392,13 @@ function sensor_types(parent){
12453
12392
  }
12454
12393
  // if current packet is equal to 1 or last packet counter is higher thant current packet
12455
12394
  if(current_packet == 1 || (globalDevices[deviceAddr].last_packet_counter > current_packet)){
12456
- // clear stream
12457
- delete globalDevices[deviceAddr];
12458
- // create new stream
12459
- var mode = payload[8];
12460
- var odr = msbLsb(payload[9], payload[10]);
12461
- var fsr = payload[11] >> 5;
12462
- var temperature = msbLsb(payload[14], payload[15])/100;
12395
+ console.log('Recovering bad packet');
12396
+ // clear stream object & timeout
12397
+ parent.sensor_types[114].utils.clear_globalDevices_stream(deviceAddr);
12398
+
12399
+ // init new stream
12400
+ parent.sensor_types[114].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
12463
12401
 
12464
- globalDevices[deviceAddr] = {
12465
- data: {},
12466
- odr: odr,
12467
- mo: mode,
12468
- fsr: fsr,
12469
- hour: hour,
12470
- minute: minute,
12471
- temperature: temperature,
12472
- }
12473
12402
  globalDevices[deviceAddr].last_packet_counter = current_packet;
12474
12403
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
12475
12404
  return;
@@ -12480,121 +12409,31 @@ function sensor_types(parent){
12480
12409
  }
12481
12410
  }
12482
12411
  else{
12483
- var mode = payload[8];
12484
- var odr = msbLsb(payload[9], payload[10]);
12485
- var fsr = payload[11] >> 5;
12486
- var temperature = msbLsb(payload[14], payload[15])/100;
12412
+ // clear stream object & timeout
12413
+ parent.sensor_types[114].utils.clear_globalDevices_stream(deviceAddr);
12414
+
12415
+ // init new stream
12416
+ parent.sensor_types[114].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
12487
12417
 
12488
- globalDevices[deviceAddr] = {
12489
- data: {},
12490
- odr: odr,
12491
- mo: mode,
12492
- fsr: fsr,
12493
- hour: hour,
12494
- minute: minute,
12495
- temperature: temperature,
12496
- }
12497
12418
  globalDevices[deviceAddr].last_packet_counter = current_packet;
12498
12419
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
12499
12420
  }
12500
12421
  }
12501
12422
  else{
12502
- var mode = payload[8];
12503
- var odr = msbLsb(payload[9], payload[10]);
12504
- var fsr = payload[11] >> 5;
12505
- var temperature = msbLsb(payload[14], payload[15])/100;
12423
+ // clear stream object & timeout
12424
+ parent.sensor_types[114].utils.clear_globalDevices_stream(deviceAddr);
12425
+
12426
+ // init new stream
12427
+ parent.sensor_types[114].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
12506
12428
 
12507
- globalDevices[deviceAddr] = {
12508
- data: {},
12509
- odr: odr,
12510
- mo: mode,
12511
- fsr: fsr,
12512
- hour: hour,
12513
- minute: minute,
12514
- temperature: temperature,
12515
- }
12516
12429
  globalDevices[deviceAddr].last_packet_counter = current_packet;
12517
12430
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
12518
12431
  }
12519
12432
  if(current_packet == expected_packets){
12520
- var raw_data = new Array();
12521
- for(const packet in globalDevices[deviceAddr].data){
12522
- raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
12523
- }
12524
- var label = 0;
12525
-
12526
- var fft = new Array();
12527
- var fft_concat = {};
12528
-
12529
- var en_axis_data = {};
12530
- en_axis_data.x_offset = 0;
12531
- en_axis_data.y_offset = 2;
12532
- en_axis_data.z_offset = 4;
12533
- en_axis_data.increment = 6;
12534
- fft_concat = {x: [], y: [], z: []};
12535
-
12536
- var fsr_mult = .00006;
12537
- var fsr_text = "";
12538
-
12539
- switch(globalDevices[deviceAddr].fsr){
12540
- case 0:
12541
- fsr_mult = 0.00006;
12542
- break;
12543
- case 1:
12544
- fsr_mult = 0.00012;
12545
- break;
12546
- case 2:
12547
- fsr_mult = 0.00024;
12548
- break;
12549
- case 3:
12550
- fsr_mult = 0.00049;
12551
- break;
12552
- }
12553
- switch(globalDevices[deviceAddr].fsr){
12554
- case 0:
12555
- fsr_text = "2g";
12556
- break;
12557
- case 1:
12558
- fsr_text = "4g";
12559
- break;
12560
- case 2:
12561
- fsr_text = "8g";
12562
- break;
12563
- case 3:
12564
- fsr_text = "16g";
12565
- break;
12566
- }
12567
-
12568
- for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
12569
- label++;
12570
-
12571
- if('x_offset' in en_axis_data){
12572
- 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)));
12573
- }
12574
- if('y_offset' in en_axis_data){
12575
- 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)));
12576
- }
12577
- if('z_offset' in en_axis_data){
12578
- 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)));
12579
- }
12580
- }
12581
- var fft_concat_obj = {
12582
- mode: payload[8],
12583
- msg_type: msg_type,
12584
- time_id: [
12585
- String(globalDevices[deviceAddr].hour).padStart(2, '0'),
12586
- String(globalDevices[deviceAddr].minute).padStart(2, '0'),
12587
- ].join(':'),
12588
- mac_address: deviceAddr,
12589
- fsr: fsr_text,
12590
- odr: globalDevices[deviceAddr].odr,
12591
- temperature: globalDevices[deviceAddr].temperature,
12592
- total_samples: label,
12593
- fft_confidence : ((Object.keys(globalDevices[deviceAddr].data).length / expected_packets) * 100).toFixed(2) + '%',
12594
- data: fft_concat
12595
- };
12596
- sensor_data = fft_concat_obj;
12597
- delete globalDevices[deviceAddr];
12433
+ // concatenate stream
12434
+ sensor_data = parent.sensor_types[114].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
12435
+ // clear stream object & timeout
12436
+ parent.sensor_types[114].utils.clear_globalDevices_stream(deviceAddr);
12598
12437
  return sensor_data;
12599
12438
  }
12600
12439
  else{
@@ -12675,6 +12514,114 @@ function sensor_types(parent){
12675
12514
  // return parsed;
12676
12515
  // }
12677
12516
  },
12517
+ 'utils': {
12518
+ 'clear_globalDevices_stream': (deviceAddr) => {
12519
+ if(Object.hasOwn(globalDevices, deviceAddr)){
12520
+ if(Object.hasOwn(globalDevices[deviceAddr], 'packet_stream_timeout')){
12521
+ clearTimeout(globalDevices[deviceAddr].packet_stream_timeout);
12522
+ }
12523
+ delete globalDevices[deviceAddr];
12524
+ }
12525
+ },
12526
+ 'init_globalDevices_stream'(deviceAddr, payload, expected_packets, parsed, msg_type){
12527
+ globalDevices[deviceAddr] = {
12528
+ data: {},
12529
+ odr: msbLsb(payload[9], payload[10]),
12530
+ mo: payload[8],
12531
+ fsr: payload[11] >> 5,
12532
+ hour: payload[12],
12533
+ minute: payload[13],
12534
+ temperature: msbLsb(payload[14], payload[15]) / 100,
12535
+ expected_packets: expected_packets
12536
+ }
12537
+ globalDevices[deviceAddr].packet_stream_timeout = setTimeout(() => {
12538
+ parsed.sensor_data = parent.sensor_types[114].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
12539
+ parsed.sensor_data.error = 'Time Series Data Stream Timeout - incomplete data received';
12540
+
12541
+ parent._emitter.emit('sensor_data', parsed);
12542
+ parent._emitter.emit('sensor_data-114', parsed);
12543
+ parent._emitter.emit('sensor_data'+'-'+deviceAddr, parsed);
12544
+ }, 60000);
12545
+ },
12546
+ 'concat_fft_data': (deviceAddr, mode, msg_type) => {
12547
+ var raw_data = new Array();
12548
+ for(const packet in globalDevices[deviceAddr].data){
12549
+ raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
12550
+ }
12551
+ var label = 0;
12552
+
12553
+ var fft_concat = {};
12554
+
12555
+ var en_axis_data = {};
12556
+ en_axis_data.x_offset = 0;
12557
+ en_axis_data.y_offset = 2;
12558
+ en_axis_data.z_offset = 4;
12559
+ en_axis_data.increment = 6;
12560
+ fft_concat = {x: [], y: [], z: []};
12561
+
12562
+ var fsr_mult = .00006;
12563
+ var fsr_text = "";
12564
+
12565
+ switch(globalDevices[deviceAddr].fsr){
12566
+ case 0:
12567
+ fsr_mult = 0.00006;
12568
+ break;
12569
+ case 1:
12570
+ fsr_mult = 0.00012;
12571
+ break;
12572
+ case 2:
12573
+ fsr_mult = 0.00024;
12574
+ break;
12575
+ case 3:
12576
+ fsr_mult = 0.00049;
12577
+ break;
12578
+ }
12579
+ switch(globalDevices[deviceAddr].fsr){
12580
+ case 0:
12581
+ fsr_text = "2g";
12582
+ break;
12583
+ case 1:
12584
+ fsr_text = "4g";
12585
+ break;
12586
+ case 2:
12587
+ fsr_text = "8g";
12588
+ break;
12589
+ case 3:
12590
+ fsr_text = "16g";
12591
+ break;
12592
+ }
12593
+
12594
+ for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
12595
+ label++;
12596
+
12597
+ if('x_offset' in en_axis_data){
12598
+ 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)));
12599
+ }
12600
+ if('y_offset' in en_axis_data){
12601
+ 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)));
12602
+ }
12603
+ if('z_offset' in en_axis_data){
12604
+ 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)));
12605
+ }
12606
+ }
12607
+ var fft_concat_obj = {
12608
+ mode: mode,
12609
+ msg_type: msg_type,
12610
+ time_id: [
12611
+ String(globalDevices[deviceAddr].hour).padStart(2, '0'),
12612
+ String(globalDevices[deviceAddr].minute).padStart(2, '0'),
12613
+ ].join(':'),
12614
+ mac_address: deviceAddr,
12615
+ fsr: fsr_text,
12616
+ odr: globalDevices[deviceAddr].odr,
12617
+ temperature: globalDevices[deviceAddr].temperature,
12618
+ total_samples: label,
12619
+ fft_confidence : ((Object.keys(globalDevices[deviceAddr].data).length / globalDevices[deviceAddr].expected_packets) * 100).toFixed(2) + '%',
12620
+ data: fft_concat
12621
+ };
12622
+ return fft_concat_obj;
12623
+ }
12624
+ },
12678
12625
  'parse_fly': (frame) => {
12679
12626
  let frame_data = {};
12680
12627
  switch(frame[16]){
@@ -13334,7 +13281,7 @@ function sensor_types(parent){
13334
13281
  parse: (payload, parsed, mac) => {
13335
13282
  let res = {};
13336
13283
  if(!(payload[7] & 2)){
13337
- res.pressure_s1 = signInt(payload.slice(8, 12).reduce(msbLsb),16)/100;
13284
+ res.pressure_s1 = signInt(payload.slice(8, 12).reduce(msbLsb),32)/100;
13338
13285
  res.temperature_s1 = signInt(payload.slice(12, 14).reduce(msbLsb),16)/100;
13339
13286
  }else{
13340
13287
  res.pressure_s1 = null;
@@ -13342,7 +13289,7 @@ function sensor_types(parent){
13342
13289
  res.error_s1 = 'Error: Sensor Probe 1 communication error';
13343
13290
  }
13344
13291
  if(!(payload[7] & 4)){
13345
- res.pressure_s2 = signInt(payload.slice(14, 18).reduce(msbLsb),16)/100;
13292
+ res.pressure_s2 = signInt(payload.slice(14, 18).reduce(msbLsb),32)/100;
13346
13293
  res.temperature_s2 = signInt(payload.slice(18, 20).reduce(msbLsb),16)/100;
13347
13294
  }else{
13348
13295
  res.pressure_s2 = null;
@@ -14559,12 +14506,85 @@ function sensor_types(parent){
14559
14506
  parsed.data = {error: 'Error found, Load cell comm error'};
14560
14507
  return parsed;
14561
14508
  }
14562
- return {
14563
- weight: signInt(d.slice(8, 12).reduce(msbLsb), 32) / 100
14564
- };
14509
+ let firmware = d[1];
14510
+ if(firmware > 4){
14511
+ let unit = 'Lb';
14512
+ switch(d[12]){
14513
+ case 1:
14514
+ unit = 'Lb';
14515
+ break;
14516
+ case 2:
14517
+ unit = 'Kg';
14518
+ break;
14519
+ }
14520
+ return{
14521
+ weight: signInt(d.slice(8, 12).reduce(msbLsb), 32) / 100,
14522
+ unit: unit,
14523
+ raw_adc: signInt(d.slice(13, 17).reduce(msbLsb), 32)
14524
+ }
14525
+ }
14526
+ else {
14527
+ return {
14528
+ weight: signInt(d.slice(8, 12).reduce(msbLsb), 32) / 100
14529
+ };
14530
+ }
14565
14531
  },
14566
14532
  'parse_fly': (frame) => {
14567
- if(frame[2] > 3){
14533
+ if(frame[2] > 4){
14534
+ let date = [
14535
+ String(frame.slice(20, 22).reduce(msbLsb)),
14536
+ String(frame[22]).padStart(2, '0'),
14537
+ String(frame[23]).padStart(2, '0')
14538
+ ].join('-');
14539
+ let time = [
14540
+ String(frame[24]).padStart(2, '0'),
14541
+ String(frame[25]).padStart(2, '0'),
14542
+ String(frame[26]).padStart(2, '0')
14543
+ ].join(':');
14544
+ let screen_on_time = "always_off";
14545
+ switch(frame[27]){
14546
+ case 0:
14547
+ screen_on_time = "always_off";
14548
+ break;
14549
+ case 255:
14550
+ screen_on_time = "always_on";
14551
+ break;
14552
+ default:
14553
+ screen_on_time = frame[27] + "Sec";
14554
+ break;
14555
+ }
14556
+ let unit = "Lb";
14557
+ switch(frame[28]){
14558
+ case 1:
14559
+ unit = "Lb";
14560
+ break;
14561
+ case 2:
14562
+ unit = "Kg";
14563
+ break;
14564
+ }
14565
+ return {
14566
+ 'firmware': frame[2],
14567
+ 'calibration_tare': frame.slice(12, 16).reduce(msbLsb),
14568
+ 'tare_counter': frame.slice(16, 20).reduce(msbLsb),
14569
+ 'timestamp': date + "T" + time,
14570
+ 'screen_on_time': screen_on_time,
14571
+ 'weight_unit': unit,
14572
+ 'hardware_id': frame.slice(29, 32),
14573
+ 'report_rate': frame.slice(32, 36).reduce(msbLsb) + "Sec",
14574
+ 'tx_life_counter': frame.slice(36, 40).reduce(msbLsb),
14575
+ 'machine_values': {
14576
+ 'firmware': frame[2],
14577
+ 'calibration_tare': frame.slice(12, 16).reduce(msbLsb),
14578
+ 'tare_counter': frame.slice(16, 20).reduce(msbLsb),
14579
+ 'timestamp': date + "T" + time,
14580
+ 'screen_on_time': screen_on_time,
14581
+ 'weight_unit': unit,
14582
+ 'hardware_id': frame.slice(29, 32),
14583
+ 'report_rate': frame.slice(32, 36).reduce(msbLsb),
14584
+ 'tx_life_counter': frame.slice(36, 40).reduce(msbLsb)
14585
+ }
14586
+ }
14587
+ }else if(frame[2] == 4){
14568
14588
  let date = [
14569
14589
  String(frame.slice(20, 22).reduce(msbLsb)),
14570
14590
  String(frame[22]).padStart(2, '0'),