@ncd-io/node-red-enterprise-sensors 2.0.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -428,16 +428,19 @@ module.exports = class WirelessSensor{
428
428
  const sensor_type = rep_buffer.readUInt16BE(5);
429
429
  let report = {};
430
430
  if(rep_buffer[2] === 0xff ){
431
+ const values = this.sensor_libs[sensor_type].sync_parse(rep_buffer);
431
432
  try{
432
433
  report = {
433
434
  type: 'sync_acknowledgment',
434
435
  address: frame.mac,
436
+ sensor_type: sensor_type,
435
437
  payload: {
436
438
  type: 'sync_acknowledgment',
437
439
  address: frame.mac,
440
+ sensor_type: sensor_type,
438
441
  sync_success: true,
439
442
  response_bytes: rep_buffer,
440
- ...this.sensor_libs[sensor_type].sync_parse(rep_buffer),
443
+ ...values,
441
444
  },
442
445
  description: 'Acknowledgment received from sensor in response to sync command. This report includes the current sensor information or errors.',
443
446
  };
@@ -450,12 +453,14 @@ module.exports = class WirelessSensor{
450
453
  report = {
451
454
  type: 'sync_acknowledgment',
452
455
  address: frame.mac,
456
+ sensor_type: sensor_type,
453
457
  payload: {
454
458
  type: 'sync_acknowledgment',
455
459
  address: frame.mac,
460
+ sensor_type: sensor_type,
456
461
  sync_success: false,
457
462
  response_bytes: rep_buffer,
458
- ...this.sensor_libs[sensor_type].sync_parse(rep_buffer),
463
+ // ...this.sensor_libs[sensor_type].sync_parse(rep_buffer),
459
464
  },
460
465
  description: 'Acknowledgment received from sensor in response to sync command. This report includes the current sensor information or errors.',
461
466
  };
@@ -478,15 +483,19 @@ module.exports = class WirelessSensor{
478
483
 
479
484
  // this._emitter.emit('sensor_mode', temp_fly_message);
480
485
  // this._emitter.emit('sensor_mode-'+frame.mac, temp_fly_message);
486
+
487
+ const values = this.sensor_libs[sensor_type].sync_parse(rep_buffer);
481
488
 
482
489
  try{
483
490
  const report = {
484
491
  type: 'manual_sync_check_in',
485
492
  address: frame.mac,
493
+ sensor_type: sensor_type,
486
494
  payload: {
487
495
  type: 'manual_sync_check_in',
488
496
  address: frame.mac,
489
- ...this.sensor_libs[sensor_type].sync_parse(rep_buffer),
497
+ sensor_type: sensor_type,
498
+ ...values,
490
499
  },
491
500
  description: 'Manual Sync Check-in received from sensor. This check-in reports sensor information and allows for sync initialization if configuration changes are necessary.',
492
501
  'packet_info': frame.receive_options
@@ -512,14 +521,18 @@ module.exports = class WirelessSensor{
512
521
  // this._emitter.emit('sensor_mode', temp_fly_message);
513
522
  // this._emitter.emit('sensor_mode-'+frame.mac, temp_fly_message);
514
523
 
524
+ const values = this.sensor_libs[sensor_type].sync_parse(rep_buffer);
525
+
515
526
  try{
516
527
  const report = {
517
528
  type: 'sync_check_in',
518
529
  address: frame.mac,
530
+ sensor_type: sensor_type,
519
531
  payload: {
520
532
  type: 'sync_check_in',
521
533
  address: frame.mac,
522
- ...this.sensor_libs[sensor_type].sync_parse(rep_buffer),
534
+ sensor_type: sensor_type,
535
+ ...values,
523
536
  },
524
537
  description: 'Check-in received from sensor. This check-in reports sensor information and allows for sync initialization if configuration changes are necessary.',
525
538
  'packet_info': frame.receive_options
@@ -535,14 +548,19 @@ module.exports = class WirelessSensor{
535
548
  sync_end(payload, frame){
536
549
  const rep_buffer = Buffer.from(frame.data);
537
550
  const sensor_type = rep_buffer.readUInt16BE(5);
551
+
552
+ const values = this.sensor_libs[sensor_type].sync_parse(rep_buffer);
553
+
538
554
  try{
539
555
  const report = {
540
556
  type: 'sync_end',
541
557
  address: frame.mac,
558
+ sensor_type: sensor_type,
542
559
  payload: {
543
560
  type: 'sync_end',
544
561
  address: frame.mac,
545
- ...this.sensor_libs[sensor_type].sync_parse(rep_buffer),
562
+ sensor_type: sensor_type,
563
+ ...values,
546
564
  },
547
565
  description: 'Sync process finished. Sensor is reporting its new values after Syn and resuming normal operations.',
548
566
  'packet_info': frame.receive_options
@@ -1039,7 +1057,7 @@ module.exports = class WirelessSensor{
1039
1057
  return this.config_send_sync(addr, packet);
1040
1058
  };
1041
1059
  get_intended_wireless_node_configs(data, configs){
1042
- const config_map = this.sensor_libs[data.payload.sensor_type].get_config_map(data.payload.firmware_version);
1060
+ const config_map = this.sensor_libs[data.payload.machine_values.sensor_type].get_config_map(data.payload.machine_values.firmware_version);
1043
1061
  const html_map = {};
1044
1062
  for(const [key, value] of Object.entries(config_map)){
1045
1063
  if(value.html_id){
@@ -3001,7 +3019,27 @@ module.exports = class WirelessSensor{
3001
3019
  var packet = [244, 79, 0, 0, 101, 35, value];
3002
3020
  console.log(packet);
3003
3021
  return this.config_send(sensor_mac, packet);
3004
- };
3022
+ }
3023
+ config_set_adc_threshold_128(sensor_mac, value){
3024
+ console.log('config_set_adc_threshold_128');
3025
+ var packet = [244, 32, 0, 0, 21];
3026
+ let value_ = int2Bytes(value, 2);
3027
+ packet.push(...value_);
3028
+ console.log(packet);
3029
+ return this.config_send(sensor_mac, packet);
3030
+ }
3031
+ config_set_auto_check_interval_128(sensor_mac, value){
3032
+ console.log('config_set_auto_check_interval_128');
3033
+ var packet = [244, 34, 0, 0, 0, value];
3034
+ console.log(packet);
3035
+ return this.config_send(sensor_mac, packet);
3036
+ }
3037
+ config_set_auto_calibration_128(sensor_mac){
3038
+ console.log('config_set_auto_calibration_128');
3039
+ var packet = [244, 33, 0, 0, 0, 1];
3040
+ console.log(packet);
3041
+ return this.config_send(sensor_mac, packet);
3042
+ }
3005
3043
  config_get_delay(sensor_mac){
3006
3044
  return new Promise((fulfill, reject) => {
3007
3045
  this.config_send(sensor_mac, [247, 21, 0, 0, 0]).then((res) => {
@@ -3971,7 +4009,21 @@ function sensor_types(parent){
3971
4009
  var types = {
3972
4010
  '2': {
3973
4011
  name: '2 Channel Push Notification',
3974
- parse: (d) => {
4012
+ parse: (d, payload) => {
4013
+ let firmware = payload[1];
4014
+ if(firmware > 5){
4015
+ let report_type_byte = (payload[7] >> 5) & 1;
4016
+ let report_type = "";
4017
+ switch(report_type_byte){
4018
+ case 0: report_type = 'Regular'; break;
4019
+ case 1: report_type = 'Interrupt'; break;
4020
+ }
4021
+ return{
4022
+ report_type: report_type,
4023
+ input_1: d[0],
4024
+ input_2: d[1]
4025
+ }
4026
+ }
3975
4027
  return {
3976
4028
  input_1: d[0],
3977
4029
  input_2: d[1]
@@ -4595,49 +4647,6 @@ function sensor_types(parent){
4595
4647
  };
4596
4648
  }
4597
4649
  },
4598
- '33': {
4599
- name: 'AC Current Detect Sensor',
4600
- parse: (payload, parsed, mac) => {
4601
- if(parsed.firmware > 4){ // 5 and above
4602
- let report_type = "Regular";
4603
- switch(payload[17]){
4604
- case 0:
4605
- report_type = "Regular";
4606
- break;
4607
- case 1:
4608
- report_type = "Shift end";
4609
- break;
4610
- case 2:
4611
- report_type = "Interrupt";
4612
- break;
4613
- case 3:
4614
- report_type = "Threshold";
4615
- break;
4616
- }
4617
- return {
4618
- input_counter: payload.slice(8, 12).reduce(msbLsb),
4619
- input_uptime: payload.slice(12, 16).reduce(msbLsb),
4620
- input: payload[16] & 1 ? 1 : 0,
4621
- report_type: report_type,
4622
- rtc: [
4623
- String(payload[18]).padStart(2, '0'),
4624
- String(payload[19]).padStart(2, '0'),
4625
- String(payload[20]).padStart(2, '0')
4626
- ].join(':')
4627
- };
4628
- } else if(parsed.firmware > 3){ // 4
4629
- return {
4630
- current_detect: payload[8],
4631
- total_uptime: payload.slice(9, 13).reduce(msbLsb),
4632
- total_cycle_count: payload.slice(13, 17).reduce(msbLsb)
4633
- };
4634
- }else{
4635
- return {
4636
- input_1: payload[8]
4637
- };
4638
- };
4639
- }
4640
- },
4641
4650
  '34': {
4642
4651
  name: 'Tank Level Sensor',
4643
4652
  parse: (d) => {
@@ -8503,29 +8512,6 @@ function sensor_types(parent){
8503
8512
  };
8504
8513
  }
8505
8514
  },
8506
- '93': {
8507
- name: 'Oil Temperature and Moisture Sensor',
8508
- parse: (payload, parsed, mac) => {
8509
- let status = payload[7] >> 1; // status (1-bit left shifted)
8510
- let res = {
8511
- temperature: signInt(payload.slice(8, 10).reduce(msbLsb), 16)/100,
8512
- dielectic_const: payload.slice(10, 12).reduce(msbLsb)/100
8513
- };
8514
- if(status == 0){
8515
- res.error = {
8516
- temperature: "read_failed",
8517
- dielectic_const: "read_failed"
8518
- }
8519
- }
8520
- if(status == 1){
8521
- res.error = {
8522
- temperature: "addr_failed",
8523
- dielectic_const: "addr_failed"
8524
- }
8525
- }
8526
- return res;
8527
- }
8528
- },
8529
8515
  '95': {
8530
8516
  name: '16-Bit 1-Channel 0-24VDC Receiver',
8531
8517
  parse: (d) => {
@@ -10216,16 +10202,17 @@ function sensor_types(parent){
10216
10202
  }
10217
10203
  }
10218
10204
  },
10219
- '110': {
10220
- name: 'One Channel Vibration Plus v4',
10205
+ '112': {
10206
+ name: 'Condition Based/Predictive Maintenance Sensor v4',
10221
10207
  parse: (payload, parsed, mac) => {
10222
10208
  if(payload[7] & 2){
10223
10209
  console.log('Error found');
10210
+ console.log(payload[7]);
10224
10211
  parsed.data = {error: 'Error found, Sensor Probe may be unattached'};
10225
10212
  return parsed;
10226
10213
  }
10227
10214
  let msg_type = (payload[7] & 16)? 'motion' : 'regular';
10228
- if(payload[8] === 1){
10215
+ if (payload[8] === 1) {
10229
10216
  var deviceAddr = mac;
10230
10217
  // var firmware = payload[1];
10231
10218
  // var hour = payload[12];
@@ -10233,8 +10220,9 @@ function sensor_types(parent){
10233
10220
  var expected_packets = msbLsb(payload[16], payload[17]);
10234
10221
  var current_packet = msbLsb(payload[18], payload[19]);
10235
10222
  var sdata_start = 20;
10236
-
10237
- if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
10223
+
10224
+
10225
+ if (globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1) {
10238
10226
  if (expected_packets != 1) {
10239
10227
  // if current packet is equal to last one (duplicated data). This does not apply to the last package
10240
10228
  if (globalDevices[deviceAddr].last_packet_counter == current_packet) {
@@ -10245,10 +10233,10 @@ function sensor_types(parent){
10245
10233
  if (current_packet == 1 || (globalDevices[deviceAddr].last_packet_counter > current_packet)) {
10246
10234
  console.log('Recovering bad packet');
10247
10235
  // clear stream object & timeout
10248
- parent.sensor_types[110].utils.clear_globalDevices_stream(deviceAddr);
10236
+ parent.sensor_types[112].utils.clear_globalDevices_stream(deviceAddr);
10249
10237
 
10250
10238
  // init new stream
10251
- parent.sensor_types[110].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
10239
+ parent.sensor_types[112].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
10252
10240
 
10253
10241
  globalDevices[deviceAddr].last_packet_counter = current_packet;
10254
10242
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
@@ -10257,36 +10245,33 @@ function sensor_types(parent){
10257
10245
  globalDevices[deviceAddr].last_packet_counter = current_packet;
10258
10246
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10259
10247
  }
10248
+ } else {
10249
+ // clear stream object & timeout
10250
+ parent.sensor_types[112].utils.clear_globalDevices_stream(deviceAddr);
10251
+
10252
+ // init new stream
10253
+ parent.sensor_types[112].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
10254
+
10255
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
10256
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10260
10257
  }
10261
- else{
10262
- // clear stream object & timeout
10263
- parent.sensor_types[110].utils.clear_globalDevices_stream(deviceAddr);
10264
-
10265
- // init new stream
10266
- parent.sensor_types[110].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
10267
-
10268
- globalDevices[deviceAddr].last_packet_counter = current_packet;
10269
- globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10270
- }
10271
- }
10272
- else{
10258
+ } else {
10273
10259
  // clear stream object & timeout
10274
- parent.sensor_types[110].utils.clear_globalDevices_stream(deviceAddr);
10275
-
10260
+ parent.sensor_types[112].utils.clear_globalDevices_stream(deviceAddr);
10261
+
10276
10262
  // init new stream
10277
- parent.sensor_types[110].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
10278
-
10263
+ parent.sensor_types[112].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
10264
+
10279
10265
  globalDevices[deviceAddr].last_packet_counter = current_packet;
10280
10266
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10281
10267
  }
10282
- if(current_packet == expected_packets){
10268
+ if (current_packet == expected_packets) {
10283
10269
  // concatenate stream
10284
- sensor_data = parent.sensor_types[114].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
10270
+ sensor_data = parent.sensor_types[112].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
10285
10271
  // clear stream object & timeout
10286
- parent.sensor_types[114].utils.clear_globalDevices_stream(deviceAddr);
10272
+ parent.sensor_types[112].utils.clear_globalDevices_stream(deviceAddr);
10287
10273
  return sensor_data;
10288
- }
10289
- else{
10274
+ } else {
10290
10275
  return;
10291
10276
  }
10292
10277
  }
@@ -10332,31 +10317,32 @@ function sensor_types(parent){
10332
10317
 
10333
10318
  odr: odr,
10334
10319
  temperature: signInt(payload.slice(10, 12).reduce(msbLsb), 16) / 100,
10320
+ ext_temperature: signInt(payload.slice(12, 16).reduce(msbLsb), 32) / 100,
10321
+ current: signInt(payload.slice(16, 20).reduce(msbLsb), 32) / 1000,
10322
+ x_rms_ACC_G: payload.slice(20, 22).reduce(msbLsb)/1000,
10323
+ x_max_ACC_G: payload.slice(22, 24).reduce(msbLsb)/1000,
10324
+ x_velocity_mm_sec: payload.slice(24, 26).reduce(msbLsb) / 100,
10325
+ x_displacement_mm: payload.slice(26, 28).reduce(msbLsb) / 100,
10326
+ x_peak_one_Hz: payload.slice(28, 30).reduce(msbLsb),
10327
+ x_peak_two_Hz: payload.slice(30, 32).reduce(msbLsb),
10328
+ x_peak_three_Hz: payload.slice(32, 34).reduce(msbLsb),
10335
10329
 
10336
- x_rms_ACC_G: payload.slice(12, 14).reduce(msbLsb)/1000,
10337
- x_max_ACC_G: payload.slice(14, 16).reduce(msbLsb)/1000,
10338
- x_velocity_mm_sec: payload.slice(16, 18).reduce(msbLsb) / 100,
10339
- x_displacement_mm: payload.slice(18, 20).reduce(msbLsb) / 100,
10340
- x_peak_one_Hz: payload.slice(20, 22).reduce(msbLsb),
10341
- x_peak_two_Hz: payload.slice(22, 24).reduce(msbLsb),
10342
- x_peak_three_Hz: payload.slice(24, 26).reduce(msbLsb),
10343
-
10344
- y_rms_ACC_G: payload.slice(26, 28).reduce(msbLsb)/1000,
10345
- y_max_ACC_G: payload.slice(28, 30).reduce(msbLsb)/1000,
10346
- y_velocity_mm_sec: payload.slice(30, 32).reduce(msbLsb) / 100,
10347
- y_displacement_mm: payload.slice(32, 34).reduce(msbLsb) / 100,
10348
- y_peak_one_Hz: payload.slice(34, 36).reduce(msbLsb),
10349
- y_peak_two_Hz: payload.slice(36, 38).reduce(msbLsb),
10350
- y_peak_three_Hz: payload.slice(38, 40).reduce(msbLsb),
10330
+ y_rms_ACC_G: payload.slice(34, 36).reduce(msbLsb)/1000,
10331
+ y_max_ACC_G: payload.slice(36, 38).reduce(msbLsb)/1000,
10332
+ y_velocity_mm_sec: payload.slice(38, 40).reduce(msbLsb) / 100,
10333
+ y_displacement_mm: payload.slice(40, 42).reduce(msbLsb) / 100,
10334
+ y_peak_one_Hz: payload.slice(42, 44).reduce(msbLsb),
10335
+ y_peak_two_Hz: payload.slice(44, 46).reduce(msbLsb),
10336
+ y_peak_three_Hz: payload.slice(46, 48).reduce(msbLsb),
10351
10337
 
10352
- z_rms_ACC_G: payload.slice(40, 42).reduce(msbLsb)/1000,
10353
- z_max_ACC_G: payload.slice(42, 44).reduce(msbLsb)/1000,
10354
- z_velocity_mm_sec: payload.slice(44, 46).reduce(msbLsb) / 100,
10355
- z_displacement_mm: payload.slice(46, 48).reduce(msbLsb) / 100,
10356
- z_peak_one_Hz: payload.slice(48, 50).reduce(msbLsb),
10357
- z_peak_two_Hz: payload.slice(50, 52).reduce(msbLsb),
10358
- z_peak_three_Hz: payload.slice(52, 54).reduce(msbLsb),
10359
- rpm: payload.slice(54, 56).reduce(msbLsb)
10338
+ z_rms_ACC_G: payload.slice(48, 50).reduce(msbLsb)/1000,
10339
+ z_max_ACC_G: payload.slice(50, 52).reduce(msbLsb)/1000,
10340
+ z_velocity_mm_sec: payload.slice(52, 54).reduce(msbLsb) / 100,
10341
+ z_displacement_mm: payload.slice(54, 56).reduce(msbLsb) / 100,
10342
+ z_peak_one_Hz: payload.slice(56, 58).reduce(msbLsb),
10343
+ z_peak_two_Hz: payload.slice(58, 60).reduce(msbLsb),
10344
+ z_peak_three_Hz: payload.slice(60, 62).reduce(msbLsb),
10345
+ rpm: payload.slice(62, 64).reduce(msbLsb)
10360
10346
  };
10361
10347
  }
10362
10348
  // else{
@@ -10385,16 +10371,16 @@ function sensor_types(parent){
10385
10371
  expected_packets: expected_packets
10386
10372
  }
10387
10373
  globalDevices[deviceAddr].packet_stream_timeout = setTimeout(() => {
10388
- parsed.sensor_data = parent.sensor_types[110].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
10374
+ parsed.sensor_data = parent.sensor_types[112].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
10389
10375
  parsed.sensor_data.error = 'Time Series Data Stream Timeout - incomplete data received';
10390
10376
 
10391
- parsed.sensor_name = parent.sensor_types[110].name;
10377
+ parsed.sensor_name = parent.sensor_types[112].name;
10392
10378
  parsed.type = 'sensor_data';
10393
10379
  parsed.addr = deviceAddr;
10394
10380
  parsed.received = Date.now();
10395
10381
 
10396
10382
  parent._emitter.emit('sensor_data', parsed);
10397
- parent._emitter.emit('sensor_data-110', parsed);
10383
+ parent._emitter.emit('sensor_data-112', parsed);
10398
10384
  parent._emitter.emit('sensor_data'+'-'+deviceAddr, parsed);
10399
10385
  }, 60000);
10400
10386
  },
@@ -10838,1505 +10824,29 @@ function sensor_types(parent){
10838
10824
  }
10839
10825
  }
10840
10826
  },
10841
- '111': {
10842
- name: 'Two Channel Vibration Plus v4',
10827
+ '117': {
10828
+ name: 'Custom Vibration Sensor PPV',
10843
10829
  parse: (payload, parsed, mac) => {
10844
- parsed.data = {};
10845
10830
  if(payload[7] & 2){
10846
- parsed.data['probe_1_error'] = true;
10847
- }
10848
- if(payload[7] & 4){
10849
- parsed.data['probe_2_error'] = true;
10850
- }
10851
- if(payload[7] & 2 && payload[7] & 4){
10831
+ console.log('Error found');
10832
+ parsed.data = {error: 'Error found, Sensor Probe may be unattached'};
10852
10833
  return parsed;
10853
10834
  }
10854
- let msg_type = (payload[7] & 16)? 'motion' : 'regular';
10855
10835
  if(payload[8] === 1){
10856
- var deviceAddr = mac;
10857
- // var firmware = payload[1];
10858
- // var hour = payload[12];
10859
- // var minute = payload[13];
10860
- var expected_packets = msbLsb(payload[16], payload[17]);
10861
- var current_packet = msbLsb(payload[18], payload[19]);
10862
- var sdata_start = 20;
10863
- // If 4th bit is 1 the packet is from the second probe, if 0 from the first
10864
- var probe;
10865
- if (payload[7] & 8) {
10866
- probe = 2;
10867
- } else {
10868
- probe = 1;
10869
- }
10870
-
10871
- // initialize globalDevices for this sensor if it doesn't exist
10872
- // exlusively for multi-probe sensors
10873
- if(!Object.hasOwn(globalDevices, deviceAddr)){
10874
- globalDevices[deviceAddr] = {};
10875
- }
10876
- if(globalDevices[deviceAddr].hasOwnProperty(probe) || expected_packets == 1){
10877
- console.log('Continuing existing probe stream');
10878
- if (expected_packets != 1) {
10879
- console.log('Expected packets more than 1');
10880
- // if current packet is equal to last one (duplicated data). This does not apply to the last package
10881
- if (globalDevices[deviceAddr][probe].last_packet_counter == current_packet) {
10882
- console.log('Duplicated message')
10883
- return;
10884
- }
10885
- // if current packet is equal to 1 or last packet counter is higher thant current packet
10886
- if (current_packet == 1 || (globalDevices[deviceAddr][probe].last_packet_counter > current_packet)) {
10887
- console.log('Recovering bad packet');
10888
- // clear stream object & timeout
10889
- parent.sensor_types[111].utils.clear_globalDevices_stream(deviceAddr, probe);
10890
-
10891
- // init new stream
10892
- parent.sensor_types[111].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type, probe);
10893
-
10894
- globalDevices[deviceAddr][probe].last_packet_counter = current_packet;
10895
- globalDevices[deviceAddr][probe].data[current_packet] = payload.slice(sdata_start);
10896
- return;
10897
- } else {
10898
- globalDevices[deviceAddr][probe].last_packet_counter = current_packet;
10899
- globalDevices[deviceAddr][probe].data[current_packet] = payload.slice(sdata_start);
10900
- }
10901
- } else {
10902
- // clear stream object & timeout
10903
- parent.sensor_types[111].utils.clear_globalDevices_stream(deviceAddr, probe);
10904
-
10905
- // init new stream
10906
- parent.sensor_types[111].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type, probe);
10907
-
10908
- globalDevices[deviceAddr][probe].last_packet_counter = current_packet;
10909
- globalDevices[deviceAddr][probe].data[current_packet] = payload.slice(sdata_start);
10910
- }
10911
- }
10912
- else{
10913
- // clear stream object & timeout
10914
- parent.sensor_types[111].utils.clear_globalDevices_stream(deviceAddr, probe);
10915
-
10916
- // init new stream
10917
- parent.sensor_types[111].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type, probe);
10918
-
10919
- globalDevices[deviceAddr][probe].last_packet_counter = current_packet;
10920
- globalDevices[deviceAddr][probe].data[current_packet] = payload.slice(sdata_start);
10921
- }
10922
- if(current_packet == expected_packets){
10923
- // concatenate stream
10924
- sensor_data = parent.sensor_types[111].utils.concat_fft_data(deviceAddr, payload[8], msg_type, probe);
10925
-
10926
- // clear stream object & timeout
10927
- parent.sensor_types[111].utils.clear_globalDevices_stream(deviceAddr, probe);
10928
- return sensor_data;
10929
- }
10930
- else{
10931
- return;
10932
- }
10933
- }
10934
- else if(payload[8] === 0 || payload[8] === 2 || payload[8] === 3){
10935
- // mode byte most significant bit will indicate fft data.
10936
- // console.log(d);
10937
- var odr1;
10836
+ let mode = payload[8];
10837
+ let msg_type = '';
10938
10838
  switch(payload[9]){
10939
- case 6:
10940
- odr1 = "50Hz"
10839
+ case 0:
10840
+ msg_type = 'Regular';
10941
10841
  break;
10942
- case 7:
10943
- odr1 = "100Hz";
10842
+ case 1:
10843
+ msg_type = 'Cautionay';
10944
10844
  break;
10945
- case 8:
10946
- odr1 = "200Hz";
10845
+ case 2:
10846
+ msg_type = 'Artwork';
10947
10847
  break;
10948
- case 9:
10949
- odr1 = "400Hz";
10950
- break;
10951
- case 10:
10952
- odr1 = "800Hz";
10953
- break;
10954
- case 11:
10955
- odr1 = "1600Hz";
10956
- break;
10957
- case 12:
10958
- odr1 = "3200Hz";
10959
- break;
10960
- case 13:
10961
- odr1 = "6400Hz";
10962
- break;
10963
- case 14:
10964
- odr1 = "12800Hz";
10965
- break;
10966
- case 15:
10967
- odr1 = "25600Hz";
10968
- break;
10969
- }
10970
- var odr2;
10971
- switch(payload[56]){
10972
- case 6:
10973
- odr2 = "50Hz"
10974
- break;
10975
- case 7:
10976
- odr2 = "100Hz";
10977
- break;
10978
- case 8:
10979
- odr2 = "200Hz";
10980
- break;
10981
- case 9:
10982
- odr2 = "400Hz";
10983
- break;
10984
- case 10:
10985
- odr2 = "800Hz";
10986
- break;
10987
- case 11:
10988
- odr2 = "1600Hz";
10989
- break;
10990
- case 12:
10991
- odr2 = "3200Hz";
10992
- break;
10993
- case 13:
10994
- odr2 = "6400Hz";
10995
- break;
10996
- case 14:
10997
- odr2 = "12800Hz";
10998
- break;
10999
- case 15:
11000
- odr2 = "25600Hz";
11001
- break;
11002
- }
11003
-
11004
- // If 4th bit is 1 the packet is from the second probe, if 0 from the first
11005
- // var probe = '';
11006
- // if(payload[7] & 8){
11007
- // probe = '2';
11008
- // }
11009
- // else{
11010
- // probe = '1';
11011
- // }
11012
- return {
11013
- mode: payload[8],
11014
- msg_type: msg_type,
11015
-
11016
- s1_odr: odr1,
11017
- s1_temperature: signInt(payload.slice(10, 12).reduce(msbLsb), 16) / 100,
11018
-
11019
- x1_rms_ACC_G: payload.slice(12, 14).reduce(msbLsb)/1000,
11020
- x1_max_ACC_G: payload.slice(14, 16).reduce(msbLsb)/1000,
11021
- x1_velocity_mm_sec: payload.slice(16, 18).reduce(msbLsb) / 100,
11022
- x1_displacement_mm: payload.slice(18, 20).reduce(msbLsb) / 100,
11023
- x1_peak_one_Hz: payload.slice(20, 22).reduce(msbLsb),
11024
- x1_peak_two_Hz: payload.slice(22, 24).reduce(msbLsb),
11025
- x1_peak_three_Hz: payload.slice(24, 26).reduce(msbLsb),
11026
-
11027
- y1_rms_ACC_G: payload.slice(26, 28).reduce(msbLsb)/1000,
11028
- y1_max_ACC_G: payload.slice(28, 30).reduce(msbLsb)/1000,
11029
- y1_velocity_mm_sec: payload.slice(30, 32).reduce(msbLsb) / 100,
11030
- y1_displacement_mm: payload.slice(32, 34).reduce(msbLsb) / 100,
11031
- y1_peak_one_Hz: payload.slice(34, 36).reduce(msbLsb),
11032
- y1_peak_two_Hz: payload.slice(36, 38).reduce(msbLsb),
11033
- y1_peak_three_Hz: payload.slice(38, 40).reduce(msbLsb),
11034
-
11035
- z1_rms_ACC_G: payload.slice(40, 42).reduce(msbLsb)/1000,
11036
- z1_max_ACC_G: payload.slice(42, 44).reduce(msbLsb)/1000,
11037
- z1_velocity_mm_sec: payload.slice(44, 46).reduce(msbLsb) / 100,
11038
- z1_displacement_mm: payload.slice(46, 48).reduce(msbLsb) / 100,
11039
- z1_peak_one_Hz: payload.slice(48, 50).reduce(msbLsb),
11040
- z1_peak_two_Hz: payload.slice(50, 52).reduce(msbLsb),
11041
- z1_peak_three_Hz: payload.slice(52, 54).reduce(msbLsb),
11042
- rpm_1: payload.slice(54, 56).reduce(msbLsb),
11043
-
11044
- s2_odr: odr2,
11045
- s2_temperature: signInt(payload.slice(57, 59).reduce(msbLsb), 16) / 100,
11046
-
11047
- x2_rms_ACC_G: payload.slice(59, 61).reduce(msbLsb)/1000,
11048
- x2_max_ACC_G: payload.slice(61, 63).reduce(msbLsb)/1000,
11049
- x2_velocity_mm_sec: payload.slice(63, 65).reduce(msbLsb) / 100,
11050
- x2_displacement_mm: payload.slice(65, 67).reduce(msbLsb) / 100,
11051
- x2_peak_one_Hz: payload.slice(67, 69).reduce(msbLsb),
11052
- x2_peak_two_Hz: payload.slice(69, 71).reduce(msbLsb),
11053
- x2_peak_three_Hz: payload.slice(71, 73).reduce(msbLsb),
11054
-
11055
- y2_rms_ACC_G: payload.slice(73, 75).reduce(msbLsb)/1000,
11056
- y2_max_ACC_G: payload.slice(75, 77).reduce(msbLsb)/1000,
11057
- y2_velocity_mm_sec: payload.slice(77, 79).reduce(msbLsb) / 100,
11058
- y2_displacement_mm: payload.slice(79, 81).reduce(msbLsb) / 100,
11059
- y2_peak_one_Hz: payload.slice(81, 83).reduce(msbLsb),
11060
- y2_peak_two_Hz: payload.slice(83, 85).reduce(msbLsb),
11061
- y2_peak_three_Hz: payload.slice(85, 87).reduce(msbLsb),
11062
-
11063
- z2_rms_ACC_G: payload.slice(87, 89).reduce(msbLsb)/1000,
11064
- z2_max_ACC_G: payload.slice(89, 91).reduce(msbLsb)/1000,
11065
- z2_velocity_mm_sec: payload.slice(91, 93).reduce(msbLsb) / 100,
11066
- z2_displacement_mm: payload.slice(93, 95).reduce(msbLsb) / 100,
11067
- z2_peak_one_Hz: payload.slice(95, 97).reduce(msbLsb),
11068
- z2_peak_two_Hz: payload.slice(97, 99).reduce(msbLsb),
11069
- z2_peak_three_Hz: payload.slice(99, 101).reduce(msbLsb),
11070
- rpm_2: payload.slice(101, 103).reduce(msbLsb)
11071
- };
11072
- }
11073
- // else{
11074
- // parsed.data = {'error': 'Vibration mode error'}
11075
- // return parsed;
11076
- // }
11077
- },
11078
- 'utils': {
11079
- 'clear_globalDevices_stream': (deviceAddr, probe) => {
11080
- if(Object.hasOwn(globalDevices, deviceAddr) && Object.hasOwn(globalDevices[deviceAddr], probe)){
11081
- if(Object.hasOwn(globalDevices[deviceAddr][probe], 'packet_stream_timeout')){
11082
- clearTimeout(globalDevices[deviceAddr][probe].packet_stream_timeout);
11083
- }
11084
- delete globalDevices[deviceAddr][probe];
11085
- }
11086
- },
11087
- 'init_globalDevices_stream'(deviceAddr, payload, expected_packets, parsed, msg_type, probe){
11088
- globalDevices[deviceAddr][probe] = {
11089
- data: {},
11090
- odr: msbLsb(payload[9], payload[10]),
11091
- mo: payload[8],
11092
- fsr: payload[11] >> 5,
11093
- hour: payload[12],
11094
- minute: payload[13],
11095
- temperature: msbLsb(payload[14], payload[15]) / 100,
11096
- expected_packets: expected_packets
11097
- }
11098
- globalDevices[deviceAddr][probe].packet_stream_timeout = setTimeout(() => {
11099
- parsed.sensor_data = parent.sensor_types[111].utils.concat_fft_data(deviceAddr, payload[8], msg_type, probe);
11100
- parsed.sensor_data.error = 'Time Series Data Stream Timeout - incomplete data received';
11101
-
11102
- parsed.sensor_name = parent.sensor_types[111].name;
11103
- parsed.type = 'sensor_data';
11104
- parsed.addr = deviceAddr;
11105
- parsed.received = Date.now();
11106
-
11107
- parent._emitter.emit('sensor_data', parsed);
11108
- parent._emitter.emit('sensor_data-111', parsed);
11109
- parent._emitter.emit('sensor_data'+'-'+deviceAddr, parsed);
11110
- }, 60000);
11111
- },
11112
- 'concat_fft_data': (deviceAddr, mode, msg_type, probe) => {
11113
- var raw_data = new Array();
11114
- for(const packet in globalDevices[deviceAddr][probe].data){
11115
- raw_data = raw_data.concat(globalDevices[deviceAddr][probe].data[packet]);
11116
- }
11117
- var label = 0;
11118
-
11119
- var fft_concat = {};
11120
-
11121
- var en_axis_data = {};
11122
- en_axis_data.x_offset = 0;
11123
- en_axis_data.y_offset = 2;
11124
- en_axis_data.z_offset = 4;
11125
- en_axis_data.increment = 6;
11126
- fft_concat = {x: [], y: [], z: []};
11127
-
11128
- var fsr_mult = .00006;
11129
- var fsr_text = "";
11130
-
11131
- switch(globalDevices[deviceAddr][probe].fsr){
11132
- case 0:
11133
- fsr_mult = 0.00006;
11134
- break;
11135
- case 1:
11136
- fsr_mult = 0.00012;
11137
- break;
11138
- case 2:
11139
- fsr_mult = 0.00024;
11140
- break;
11141
- case 3:
11142
- fsr_mult = 0.00049;
11143
- break;
11144
- }
11145
- switch(globalDevices[deviceAddr][probe].fsr){
11146
- case 0:
11147
- fsr_text = "2g";
11148
- break;
11149
- case 1:
11150
- fsr_text = "4g";
11151
- break;
11152
- case 2:
11153
- fsr_text = "8g";
11154
- break;
11155
- case 3:
11156
- fsr_text = "16g";
11157
- break;
11158
- }
11159
-
11160
- for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
11161
- label++;
11162
-
11163
- if('x_offset' in en_axis_data){
11164
- 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(3)));
11165
- }
11166
- if('y_offset' in en_axis_data){
11167
- 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(3)));
11168
- }
11169
- if('z_offset' in en_axis_data){
11170
- 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(3)));
11171
- }
11172
- }
11173
- var fft_concat_obj = {
11174
- mode: mode,
11175
- msg_type: msg_type,
11176
- probe: probe,
11177
- time_id: [
11178
- String(globalDevices[deviceAddr][probe].hour).padStart(2, '0'),
11179
- String(globalDevices[deviceAddr][probe].minute).padStart(2, '0'),
11180
- ].join(':'),
11181
- mac_address: deviceAddr,
11182
- fsr: fsr_text,
11183
- odr: globalDevices[deviceAddr][probe].odr,
11184
- temperature: globalDevices[deviceAddr][probe].temperature,
11185
- total_samples: label,
11186
- fft_confidence : ((Object.keys(globalDevices[deviceAddr][probe].data).length / globalDevices[deviceAddr][probe].expected_packets) * 100).toFixed(2) + '%',
11187
- data: fft_concat
11188
- };
11189
- return fft_concat_obj;
11190
- }
11191
- },
11192
- 'parse_fly': (frame) => {
11193
- let frame_data = {};
11194
- switch(frame[16]){
11195
- case 0:
11196
- frame_data.mode = "Processed";
11197
- break;
11198
- case 1:
11199
- frame_data.mode = "Raw";
11200
- break;
11201
- case 2:
11202
- frame_data.mode = "Processed + Raw on demand";
11203
- break;
11204
- case 3:
11205
- frame_data.mode = "Smart";
11206
- break;
11207
- }
11208
- switch(frame[17]){
11209
- case 6:
11210
- frame_data.odr_1 = 50;
11211
- break;
11212
- case 7:
11213
- frame_data.odr_1 = 100;
11214
- break;
11215
- case 8:
11216
- frame_data.odr_1 = 200;
11217
- break;
11218
- case 9:
11219
- frame_data.odr_1 = 400;
11220
- break;
11221
- case 10:
11222
- frame_data.odr_1 = 800;
11223
- break;
11224
- case 11:
11225
- frame_data.odr_1 = 1600;
11226
- break;
11227
- case 12:
11228
- frame_data.odr_1 = 3200;
11229
- break;
11230
- case 13:
11231
- frame_data.odr_1 = 6400;
11232
- break;
11233
- case 14:
11234
- frame_data.odr_1 = 12800;
11235
- break;
11236
- case 15:
11237
- frame_data.odr_1 = 25600;
11238
- break;
11239
- }
11240
- switch(frame[18]){
11241
- case 6:
11242
- frame_data.odr_2 = 50;
11243
- break;
11244
- case 7:
11245
- frame_data.odr_2 = 100;
11246
- break;
11247
- case 8:
11248
- frame_data.odr_2 = 200;
11249
- break;
11250
- case 9:
11251
- frame_data.odr_2 = 400;
11252
- break;
11253
- case 10:
11254
- frame_data.odr_2 = 800;
11255
- break;
11256
- case 11:
11257
- frame_data.odr_2 = 1600;
11258
- break;
11259
- case 12:
11260
- frame_data.odr_2 = 3200;
11261
- break;
11262
- case 13:
11263
- frame_data.odr_2 = 6400;
11264
- break;
11265
- case 14:
11266
- frame_data.odr_2 = 12800;
11267
- break;
11268
- case 15:
11269
- frame_data.odr_2 = 25600;
11270
- break;
11271
- }
11272
- frame_data.sampling_duration_1 = frame[19]*50 + "ms";
11273
- frame_data.sampling_duration_2 = frame[20]*50 + "ms";
11274
- switch(frame[21]){
11275
- case 0:
11276
- frame_data.filter_status = "Disabled";
11277
- break;
11278
- case 1:
11279
- frame_data.filter_status = "Enabled";
11280
- break;
11281
- }
11282
- switch(frame[22]){
11283
- case 0:
11284
- frame_data.lpf_coeff_1 = 4;
11285
- break;
11286
- case 1:
11287
- frame_data.lpf_coeff_1 = 8;
11288
- break;
11289
- case 2:
11290
- frame_data.lpf_coeff_1 = 16;
11291
- break;
11292
- case 2:
11293
- frame_data.lpf_coeff_1 = 32;
11294
- break;
11295
- case 4:
11296
- frame_data.lpf_coeff_1 = 64;
11297
- break;
11298
- case 5:
11299
- frame_data.lpf_coeff_1 = 128;
11300
- break;
11301
- case 6:
11302
- frame_data.lpf_coeff_1 = 256;
11303
- break;
11304
- case 7:
11305
- frame_data.lpf_coeff_1 = 512;
11306
- break;
11307
- case 8:
11308
- frame_data.lpf_coeff_1 = 1024;
11309
- break;
11310
- case 9:
11311
- frame_data.lpf_coeff_1 = 2048;
11312
- break;
11313
- }
11314
- frame_data.lpf_freq_1 = frame_data.odr_1 / frame_data.lpf_coeff_1;
11315
- switch(frame[23]){
11316
- case 0:
11317
- frame_data.lpf_coeff_2 = 4;
11318
- break;
11319
- case 1:
11320
- frame_data.lpf_coeff_2 = 8;
11321
- break;
11322
- case 2:
11323
- frame_data.lpf_coeff_2 = 16;
11324
- break;
11325
- case 2:
11326
- frame_data.lpf_coeff_2 = 32;
11327
- break;
11328
- case 4:
11329
- frame_data.lpf_coeff_2 = 64;
11330
- break;
11331
- case 5:
11332
- frame_data.lpf_coeff_2 = 128;
11333
- break;
11334
- case 6:
11335
- frame_data.lpf_coeff_2 = 256;
11336
- break;
11337
- case 7:
11338
- frame_data.lpf_coeff_2 = 512;
11339
- break;
11340
- case 8:
11341
- frame_data.lpf_coeff_2 = 1024;
11342
- break;
11343
- case 9:
11344
- frame_data.lpf_coeff_2 = 2048;
11345
- break;
11346
- }
11347
- frame_data.lpf_freq_2 = frame_data.odr_2 / frame_data.lpf_coeff_2;
11348
- switch(frame[24]){
11349
- case 0:
11350
- frame_data.hpf_coeff_1 = 4;
11351
- break;
11352
- case 1:
11353
- frame_data.hpf_coeff_1 = 8;
11354
- break;
11355
- case 2:
11356
- frame_data.hpf_coeff_1 = 16;
11357
- break;
11358
- case 2:
11359
- frame_data.hpf_coeff_1 = 32;
11360
- break;
11361
- case 4:
11362
- frame_data.hpf_coeff_1 = 64;
11363
- break;
11364
- case 5:
11365
- frame_data.hpf_coeff_1 = 128;
11366
- break;
11367
- case 6:
11368
- frame_data.hpf_coeff_1 = 256;
11369
- break;
11370
- case 7:
11371
- frame_data.hpf_coeff_1 = 512;
11372
- break;
11373
- case 8:
11374
- frame_data.hpf_coeff_1 = 1024;
11375
- break;
11376
- case 9:
11377
- frame_data.hpf_coeff_1 = 2048;
11378
- break;
11379
- }
11380
- frame_data.hpf_freq_1 = frame_data.odr_1 / frame_data.hpf_coeff_1;
11381
- switch(frame[25]){
11382
- case 0:
11383
- frame_data.hpf_coeff_2 = 4;
11384
- break;
11385
- case 1:
11386
- frame_data.hpf_coeff_2 = 8;
11387
- break;
11388
- case 2:
11389
- frame_data.hpf_coeff_2 = 16;
11390
- break;
11391
- case 2:
11392
- frame_data.hpf_coeff_2 = 32;
11393
- break;
11394
- case 4:
11395
- frame_data.hpf_coeff_2 = 64;
11396
- break;
11397
- case 5:
11398
- frame_data.hpf_coeff_2 = 128;
11399
- break;
11400
- case 6:
11401
- frame_data.hpf_coeff_2 = 256;
11402
- break;
11403
- case 7:
11404
- frame_data.hpf_coeff_2 = 512;
11405
- break;
11406
- case 8:
11407
- frame_data.hpf_coeff_2 = 1024;
11408
- break;
11409
- case 9:
11410
- frame_data.hpf_coeff_2 = 2048;
11411
- break;
11412
- }
11413
- frame_data.hpf_freq_2 = frame_data.odr_2 / frame_data.hpf_coeff_2;
11414
- switch(frame[26]){
11415
- case 0:
11416
- frame_data.sampling_interval = "5 Minutes";
11417
- frame_data.sampling_interval_number = 5;
11418
- break;
11419
- case 1:
11420
- frame_data.sampling_interval = "10 Minutes";
11421
- frame_data.sampling_interval_number = 10;
11422
- break;
11423
- case 2:
11424
- frame_data.sampling_interval = "15 Minutes";
11425
- frame_data.sampling_interval_number = 15;
11426
- break;
11427
- case 2:
11428
- frame_data.sampling_interval = "20 Minutes";
11429
- frame_data.sampling_interval_number = 20;
11430
- break;
11431
- case 4:
11432
- frame_data.sampling_interval = "30 Minutes";
11433
- frame_data.sampling_interval_number = 30;
11434
- break;
11435
- case 5:
11436
- frame_data.sampling_interval = "60 Minutes";
11437
- frame_data.sampling_interval_number = 60;
11438
- break;
11439
- case 6:
11440
- frame_data.sampling_interval = "120 Minutes";
11441
- frame_data.sampling_interval_number = 120;
11442
- break;
11443
- case 7:
11444
- frame_data.sampling_interval = "180 Minutes";
11445
- frame_data.sampling_interval_number = 180;
11446
- break;
11447
- case 8:
11448
- frame_data.sampling_interval = "1 Minute";
11449
- frame_data.sampling_interval_number = 1;
11450
- break;
11451
- }
11452
- frame_data.on_request_timeout = frame[27] + " Seconds";
11453
- frame_data.deadband = frame[28] + "mg";
11454
-
11455
- switch(frame[29]){
11456
- case 0:
11457
- frame_data.payload_length = "50 Bytes";
11458
- break;
11459
- case 1:
11460
- frame_data.payload_length = "100 Bytes";
11461
- break;
11462
- case 2:
11463
- frame_data.payload_length = "150 Bytes";
11464
- break;
11465
- case 3:
11466
- frame_data.payload_length = "180 Bytes";
11467
- break;
11468
- }
11469
- switch(frame[30]){
11470
- case 0:
11471
- frame_data.fsr_text = "2g";
11472
- break;
11473
- case 1:
11474
- frame_data.fsr_text = "4g";
11475
- break;
11476
- case 2:
11477
- frame_data.fsr_text = "8g";
11478
- break;
11479
- case 3:
11480
- frame_data.fsr_text = "16g";
11481
- break;
11482
- }
11483
- frame_data.rpm_status = frame[31]? 'Enabled': 'Disabled';
11484
- frame_data.auto_raw_interval = frame[36] * frame_data.sampling_interval_number || 'disabled';
11485
- frame_data.auto_raw_interval = typeof frame_data.auto_raw_interval === 'number' ? frame_data.auto_raw_interval+'min' : frame_data.auto_raw_interval;
11486
- frame_data.p1_smart_mode_threshold = frame[38] * 50;
11487
- frame_data.p2_smart_mode_threshold = frame[39] * 50;
11488
- if(frame[2] > 5){ // for Firmware v6 and above
11489
- frame_data.motion_to_delay = frame[50] * 50;
11490
- return {
11491
- 'firmware': frame[2],
11492
- 'destination_address': toMac(frame.slice(12, 16)),
11493
- 'mode': frame_data.mode,
11494
- 'odr_1': frame_data.odr_1+'Hz',
11495
- 'odr_2': frame_data.odr_2+'Hz',
11496
- 'sampling_duration_1': frame_data.sampling_duration_1,
11497
- 'sampling_duration_2': frame_data.sampling_duration_2,
11498
- 'filter_status': frame_data.filter_status,
11499
- 'lpf_coeff_1': frame_data.lpf_coeff_1,
11500
- 'lpf_freq_1': frame_data.lpf_freq_1+'Hz',
11501
- 'lpf_coeff_2': frame_data.lpf_coeff_2,
11502
- 'lpf_freq_2': frame_data.lpf_freq_2+'Hz',
11503
- 'hpf_coeff_1': frame_data.hpf_coeff_1,
11504
- 'hpf_freq_1': frame_data.hpf_freq_1+'Hz',
11505
- 'hpf_coeff_2': frame_data.hpf_coeff_2,
11506
- 'hpf_freq_2': frame_data.hpf_freq_2+'Hz',
11507
- 'sampling_interval': frame_data.sampling_interval,
11508
- 'on_request_timeout': frame_data.on_request_timeout,
11509
- 'deadband': frame_data.deadband,
11510
- 'payload_length': frame_data.payload_length,
11511
- 'fsr': frame_data.fsr_text,
11512
- 'rpm_compute_status': frame_data.rpm_status,
11513
- 'auto_raw_destination_address': toMac(frame.slice(32 , 36)),
11514
- 'auto_raw_interval': frame_data.auto_raw_interval,
11515
- 'smart_mode_skip_count': frame[37],
11516
- 'smart_mode_acc_threshold_probe_1': frame_data.p1_smart_mode_threshold+'mg',
11517
- 'smart_mode_acc_threshold_probe_2': frame_data.p2_smart_mode_threshold+'mg',
11518
- 'uptime_counter_probe_1': frame.slice(40, 44).reduce(msbLsb)+'sec',
11519
- 'uptime_counter_probe_2': frame.slice(44, 48).reduce(msbLsb)+'sec',
11520
- 'max_tx_raw_samples': frame.slice(48, 50).reduce(msbLsb),
11521
- 'motion_to_sampling_delay': frame_data.motion_to_delay +'msec',
11522
- 'max_num_of_motion_tx_per_interval': frame[51],
11523
- 'hardware_id': frame.slice(52, 55),
11524
- 'reserved': frame.slice(55, 59),
11525
- 'tx_lifetime_counter': frame.slice(59, 63).reduce(msbLsb),
11526
- 'machine_values': {
11527
- 'firmware': frame[2],
11528
- 'destination_address': toMac(frame.slice(12, 16), false),
11529
- 'mode': frame[16],
11530
- 'odr_1': frame[17],
11531
- 'odr_2': frame[18],
11532
- 'sampling_duration_1': frame[19],
11533
- 'sampling_duration_2': frame[20],
11534
- 'filter_status': frame[21],
11535
- 'lpf_coeff_1': frame[22],
11536
- 'lpf_coeff_2': frame[23],
11537
- 'hpf_coeff_1': frame[24],
11538
- 'hpf_coeff_2': frame[25],
11539
- 'sampling_interval': frame[26],
11540
- 'on_request_timeout': frame[27],
11541
- 'deadband': frame[28],
11542
- 'payload_length': frame[29],
11543
- 'fsm': frame[30],
11544
- 'rpm_compute_status': frame[31],
11545
- 'auto_raw_destination_address': toMac(frame.slice(32 , 36), false),
11546
- 'auto_raw_interval': frame[36],
11547
- 'smart_mode_skip_count': frame[37],
11548
- 'smart_mode_acc_threshold_probe_1':frame[38],
11549
- 'smart_mode_acc_threshold_probe_2':frame[39],
11550
- 'uptime_counter_probe_1': frame.slice(40, 44),
11551
- 'uptime_counter_probe_2': frame.slice(44, 48),
11552
- 'max_tx_raw_samples': frame.slice(48, 50),
11553
- 'motion_to_sampling_delay': frame[50],
11554
- 'max_num_of_motion_tx_per_interval': frame[51],
11555
- 'hardware_id': frame.slice(52, 55),
11556
- 'reserved': frame.slice(55, 59),
11557
- 'tx_lifetime_counter': frame.slice(59, 63)
11558
- }
11559
- }
11560
- } else if (frame[2] > 4){ // for Firmware v5 and above
11561
- return {
11562
- 'firmware': frame[2],
11563
- 'destination_address': toMac(frame.slice(12, 16)),
11564
- 'mode': frame_data.mode,
11565
- 'odr_1': frame_data.odr_1+'Hz',
11566
- 'odr_2': frame_data.odr_2+'Hz',
11567
- 'sampling_duration_1': frame_data.sampling_duration_1,
11568
- 'sampling_duration_2': frame_data.sampling_duration_2,
11569
- 'filter_status': frame_data.filter_status,
11570
- 'lpf_coeff_1': frame_data.lpf_coeff_1,
11571
- 'lpf_freq_1': frame_data.lpf_freq_1+'Hz',
11572
- 'lpf_coeff_2': frame_data.lpf_coeff_2,
11573
- 'lpf_freq_2': frame_data.lpf_freq_2+'Hz',
11574
- 'hpf_coeff_1': frame_data.hpf_coeff_1,
11575
- 'hpf_freq_1': frame_data.hpf_freq_1+'Hz',
11576
- 'hpf_coeff_2': frame_data.hpf_coeff_2,
11577
- 'hpf_freq_2': frame_data.hpf_freq_2+'Hz',
11578
- 'sampling_interval': frame_data.sampling_interval,
11579
- 'on_request_timeout': frame_data.on_request_timeout,
11580
- 'deadband': frame_data.deadband,
11581
- 'payload_length': frame_data.payload_length,
11582
- 'fsr': frame_data.fsr_text,
11583
- 'rpm_compute_status': frame_data.rpm_status,
11584
- 'auto_raw_destination_address': toMac(frame.slice(32 , 36)),
11585
- 'auto_raw_interval': frame_data.auto_raw_interval,
11586
- 'smart_mode_skip_count': frame[37],
11587
- 'smart_mode_acc_threshold_probe_1': frame_data.p1_smart_mode_threshold+'mg',
11588
- 'smart_mode_acc_threshold_probe_2': frame_data.p2_smart_mode_threshold+'mg',
11589
- 'uptime_counter_probe_1': frame.slice(40, 44).reduce(msbLsb)+'sec',
11590
- 'uptime_counter_probe_2': frame.slice(44, 48).reduce(msbLsb)+'sec',
11591
- 'max_tx_raw_samples': frame.slice(48, 50).reduce(msbLsb),
11592
- 'hardware_id': frame.slice(50, 53),
11593
- 'reserved': frame.slice(53, 57),
11594
- 'tx_lifetime_counter': frame.slice(57, 61).reduce(msbLsb),
11595
- 'machine_values': {
11596
- 'firmware': frame[2],
11597
- 'destination_address': toMac(frame.slice(12, 16), false),
11598
- 'mode': frame[16],
11599
- 'odr_1': frame[17],
11600
- 'odr_2': frame[18],
11601
- 'sampling_duration_1': frame[19],
11602
- 'sampling_duration_2': frame[20],
11603
- 'filter_status': frame[21],
11604
- 'lpf_coeff_1': frame[22],
11605
- 'lpf_coeff_2': frame[23],
11606
- 'hpf_coeff_1': frame[24],
11607
- 'hpf_coeff_2': frame[25],
11608
- 'sampling_interval': frame[26],
11609
- 'on_request_timeout': frame[27],
11610
- 'deadband': frame[28],
11611
- 'payload_length': frame[29],
11612
- 'fsm': frame[30],
11613
- 'rpm_compute_status': frame[31],
11614
- 'auto_raw_destination_address': toMac(frame.slice(32 , 36), false),
11615
- 'auto_raw_interval': frame[36],
11616
- 'smart_mode_skip_count': frame[37],
11617
- 'smart_mode_acc_threshold_probe_1':frame[38],
11618
- 'smart_mode_acc_threshold_probe_2':frame[39],
11619
- 'uptime_counter_probe_1': frame.slice(40, 44),
11620
- 'uptime_counter_probe_2': frame.slice(44, 48),
11621
- 'max_tx_raw_samples': frame.slice(48, 50),
11622
- 'hardware_id': frame.slice(50, 53),
11623
- 'reserved': frame.slice(53, 57),
11624
- 'tx_lifetime_counter': frame.slice(57, 61)
11625
- }
11626
- }
11627
- }else{
11628
- return {
11629
- 'firmware': frame[2],
11630
- 'destination_address': toMac(frame.slice(12, 16)),
11631
- 'mode': frame_data.mode,
11632
- 'odr_1': frame_data.odr_1+'Hz',
11633
- 'odr_2': frame_data.odr_2+'Hz',
11634
- 'sampling_duration_1': frame_data.sampling_duration_1,
11635
- 'sampling_duration_2': frame_data.sampling_duration_2,
11636
- 'filter_status': frame_data.filter_status,
11637
- 'lpf_coeff_1': frame_data.lpf_coeff_1,
11638
- 'lpf_freq_1': frame_data.lpf_freq_1+'Hz',
11639
- 'lpf_coeff_2': frame_data.lpf_coeff_2,
11640
- 'lpf_freq_2': frame_data.lpf_freq_2+'Hz',
11641
- 'hpf_coeff_1': frame_data.hpf_coeff_1,
11642
- 'hpf_freq_1': frame_data.hpf_freq_1+'Hz',
11643
- 'hpf_coeff_2': frame_data.hpf_coeff_2,
11644
- 'hpf_freq_2': frame_data.hpf_freq_2+'Hz',
11645
- 'sampling_interval': frame_data.sampling_interval,
11646
- 'on_request_timeout': frame_data.on_request_timeout,
11647
- 'deadband': frame_data.deadband,
11648
- 'payload_length': frame_data.payload_length,
11649
- 'fsr': frame_data.fsr_text,
11650
- 'rpm_compute_status': frame_data.rpm_status,
11651
- 'auto_raw_destination_address': toMac(frame.slice(32 , 36)),
11652
- 'auto_raw_interval': frame_data.auto_raw_interval,
11653
- 'smart_mode_skip_count': frame[37],
11654
- 'smart_mode_acc_threshold_probe_1': frame_data.p1_smart_mode_threshold+'mg',
11655
- 'smart_mode_acc_threshold_probe_2': frame_data.p2_smart_mode_threshold+'mg',
11656
- 'uptime_counter_probe_1': frame.slice(40, 44).reduce(msbLsb)+'sec',
11657
- 'uptime_counter_probe_2': frame.slice(44, 48).reduce(msbLsb)+'sec',
11658
- 'hardware_id': frame.slice(48, 51),
11659
- 'reserved': frame.slice(51, 55),
11660
- 'tx_lifetime_counter': frame.slice(55, 59).reduce(msbLsb),
11661
- 'machine_values': {
11662
- 'firmware': frame[2],
11663
- 'destination_address': toMac(frame.slice(12, 16), false),
11664
- 'mode': frame[16],
11665
- 'odr_1': frame[17],
11666
- 'odr_2': frame[18],
11667
- 'sampling_duration_1': frame[19],
11668
- 'sampling_duration_2': frame[20],
11669
- 'filter_status': frame[21],
11670
- 'lpf_coeff_1': frame[22],
11671
- 'lpf_coeff_2': frame[23],
11672
- 'hpf_coeff_1': frame[24],
11673
- 'hpf_coeff_2': frame[25],
11674
- 'sampling_interval': frame[26],
11675
- 'on_request_timeout': frame[27],
11676
- 'deadband': frame[28],
11677
- 'payload_length': frame[29],
11678
- 'fsm': frame[30],
11679
- 'rpm_compute_status': frame[31],
11680
- 'auto_raw_destination_address': toMac(frame.slice(32 , 36), false),
11681
- 'auto_raw_interval': frame[36],
11682
- 'smart_mode_skip_count': frame[37],
11683
- 'smart_mode_acc_threshold_probe_1':frame[38],
11684
- 'smart_mode_acc_threshold_probe_2':frame[39],
11685
- 'uptime_counter_probe_1': frame.slice(40, 44),
11686
- 'uptime_counter_probe_2': frame.slice(44, 48),
11687
- 'hardware_id': frame.slice(48, 51),
11688
- 'reserved': frame.slice(51, 55),
11689
- 'tx_lifetime_counter': frame.slice(55, 59)
11690
- }
11691
- }
11692
- }
11693
- }
11694
- },
11695
- '112': {
11696
- name: 'Condition Based/Predictive Maintenance Sensor v4',
11697
- parse: (payload, parsed, mac) => {
11698
- if(payload[7] & 2){
11699
- console.log('Error found');
11700
- console.log(payload[7]);
11701
- parsed.data = {error: 'Error found, Sensor Probe may be unattached'};
11702
- return parsed;
11703
- }
11704
- let msg_type = (payload[7] & 16)? 'motion' : 'regular';
11705
- if (payload[8] === 1) {
11706
- var deviceAddr = mac;
11707
- // var firmware = payload[1];
11708
- // var hour = payload[12];
11709
- // var minute = payload[13];
11710
- var expected_packets = msbLsb(payload[16], payload[17]);
11711
- var current_packet = msbLsb(payload[18], payload[19]);
11712
- var sdata_start = 20;
11713
-
11714
-
11715
- if (globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1) {
11716
- if (expected_packets != 1) {
11717
- // if current packet is equal to last one (duplicated data). This does not apply to the last package
11718
- if (globalDevices[deviceAddr].last_packet_counter == current_packet) {
11719
- console.log('Duplicated message')
11720
- return;
11721
- }
11722
- // if current packet is equal to 1 or last packet counter is higher thant current packet
11723
- if (current_packet == 1 || (globalDevices[deviceAddr].last_packet_counter > current_packet)) {
11724
- console.log('Recovering bad packet');
11725
- // clear stream object & timeout
11726
- parent.sensor_types[112].utils.clear_globalDevices_stream(deviceAddr);
11727
-
11728
- // init new stream
11729
- parent.sensor_types[112].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
11730
-
11731
- globalDevices[deviceAddr].last_packet_counter = current_packet;
11732
- globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
11733
- return;
11734
- } else {
11735
- globalDevices[deviceAddr].last_packet_counter = current_packet;
11736
- globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
11737
- }
11738
- } else {
11739
- // clear stream object & timeout
11740
- parent.sensor_types[112].utils.clear_globalDevices_stream(deviceAddr);
11741
-
11742
- // init new stream
11743
- parent.sensor_types[112].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
11744
-
11745
- globalDevices[deviceAddr].last_packet_counter = current_packet;
11746
- globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
11747
- }
11748
- } else {
11749
- // clear stream object & timeout
11750
- parent.sensor_types[112].utils.clear_globalDevices_stream(deviceAddr);
11751
-
11752
- // init new stream
11753
- parent.sensor_types[112].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
11754
-
11755
- globalDevices[deviceAddr].last_packet_counter = current_packet;
11756
- globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
11757
- }
11758
- if (current_packet == expected_packets) {
11759
- // concatenate stream
11760
- sensor_data = parent.sensor_types[112].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
11761
- // clear stream object & timeout
11762
- parent.sensor_types[112].utils.clear_globalDevices_stream(deviceAddr);
11763
- return sensor_data;
11764
- } else {
11765
- return;
11766
- }
11767
- }
11768
- else if(payload[8] === 0 || payload[8] === 2 || payload[8] === 3){
11769
- // mode byte most significant bit will indicate fft data.
11770
- // console.log(d);
11771
- var odr;
11772
- switch(payload[9]){
11773
- case 6:
11774
- odr = "50Hz"
11775
- break;
11776
- case 7:
11777
- odr = "100Hz";
11778
- break;
11779
- case 8:
11780
- odr = "200Hz";
11781
- break;
11782
- case 9:
11783
- odr = "400Hz";
11784
- break;
11785
- case 10:
11786
- odr = "800Hz";
11787
- break;
11788
- case 11:
11789
- odr = "1600Hz";
11790
- break;
11791
- case 12:
11792
- odr = "3200Hz";
11793
- break;
11794
- case 13:
11795
- odr = "6400Hz";
11796
- break;
11797
- case 14:
11798
- odr = "12800Hz";
11799
- break;
11800
- case 15:
11801
- odr = "25600Hz";
11802
- break;
11803
- }
11804
- return {
11805
- mode: payload[8],
11806
- msg_type: msg_type,
11807
-
11808
- odr: odr,
11809
- temperature: signInt(payload.slice(10, 12).reduce(msbLsb), 16) / 100,
11810
- ext_temperature: signInt(payload.slice(12, 16).reduce(msbLsb), 32) / 100,
11811
- current: signInt(payload.slice(16, 20).reduce(msbLsb), 32) / 1000,
11812
- x_rms_ACC_G: payload.slice(20, 22).reduce(msbLsb)/1000,
11813
- x_max_ACC_G: payload.slice(22, 24).reduce(msbLsb)/1000,
11814
- x_velocity_mm_sec: payload.slice(24, 26).reduce(msbLsb) / 100,
11815
- x_displacement_mm: payload.slice(26, 28).reduce(msbLsb) / 100,
11816
- x_peak_one_Hz: payload.slice(28, 30).reduce(msbLsb),
11817
- x_peak_two_Hz: payload.slice(30, 32).reduce(msbLsb),
11818
- x_peak_three_Hz: payload.slice(32, 34).reduce(msbLsb),
11819
-
11820
- y_rms_ACC_G: payload.slice(34, 36).reduce(msbLsb)/1000,
11821
- y_max_ACC_G: payload.slice(36, 38).reduce(msbLsb)/1000,
11822
- y_velocity_mm_sec: payload.slice(38, 40).reduce(msbLsb) / 100,
11823
- y_displacement_mm: payload.slice(40, 42).reduce(msbLsb) / 100,
11824
- y_peak_one_Hz: payload.slice(42, 44).reduce(msbLsb),
11825
- y_peak_two_Hz: payload.slice(44, 46).reduce(msbLsb),
11826
- y_peak_three_Hz: payload.slice(46, 48).reduce(msbLsb),
11827
-
11828
- z_rms_ACC_G: payload.slice(48, 50).reduce(msbLsb)/1000,
11829
- z_max_ACC_G: payload.slice(50, 52).reduce(msbLsb)/1000,
11830
- z_velocity_mm_sec: payload.slice(52, 54).reduce(msbLsb) / 100,
11831
- z_displacement_mm: payload.slice(54, 56).reduce(msbLsb) / 100,
11832
- z_peak_one_Hz: payload.slice(56, 58).reduce(msbLsb),
11833
- z_peak_two_Hz: payload.slice(58, 60).reduce(msbLsb),
11834
- z_peak_three_Hz: payload.slice(60, 62).reduce(msbLsb),
11835
- rpm: payload.slice(62, 64).reduce(msbLsb)
11836
- };
11837
- }
11838
- // else{
11839
- // parsed.data = {'error': 'Vibration mode error'}
11840
- // return parsed;
11841
- // }
11842
- },
11843
- 'utils': {
11844
- 'clear_globalDevices_stream': (deviceAddr) => {
11845
- if(Object.hasOwn(globalDevices, deviceAddr)){
11846
- if(Object.hasOwn(globalDevices[deviceAddr], 'packet_stream_timeout')){
11847
- clearTimeout(globalDevices[deviceAddr].packet_stream_timeout);
11848
- }
11849
- delete globalDevices[deviceAddr];
11850
- }
11851
- },
11852
- 'init_globalDevices_stream'(deviceAddr, payload, expected_packets, parsed, msg_type){
11853
- globalDevices[deviceAddr] = {
11854
- data: {},
11855
- odr: msbLsb(payload[9], payload[10]),
11856
- mo: payload[8],
11857
- fsr: payload[11] >> 5,
11858
- hour: payload[12],
11859
- minute: payload[13],
11860
- temperature: msbLsb(payload[14], payload[15]) / 100,
11861
- expected_packets: expected_packets
11862
- }
11863
- globalDevices[deviceAddr].packet_stream_timeout = setTimeout(() => {
11864
- parsed.sensor_data = parent.sensor_types[112].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
11865
- parsed.sensor_data.error = 'Time Series Data Stream Timeout - incomplete data received';
11866
-
11867
- parsed.sensor_name = parent.sensor_types[112].name;
11868
- parsed.type = 'sensor_data';
11869
- parsed.addr = deviceAddr;
11870
- parsed.received = Date.now();
11871
-
11872
- parent._emitter.emit('sensor_data', parsed);
11873
- parent._emitter.emit('sensor_data-112', parsed);
11874
- parent._emitter.emit('sensor_data'+'-'+deviceAddr, parsed);
11875
- }, 60000);
11876
- },
11877
- 'concat_fft_data': (deviceAddr, mode, msg_type) => {
11878
- var raw_data = new Array();
11879
- for(const packet in globalDevices[deviceAddr].data){
11880
- raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
11881
- }
11882
- var label = 0;
11883
-
11884
- var fft_concat = {};
11885
-
11886
- var en_axis_data = {};
11887
- en_axis_data.x_offset = 0;
11888
- en_axis_data.y_offset = 2;
11889
- en_axis_data.z_offset = 4;
11890
- en_axis_data.increment = 6;
11891
- fft_concat = {x: [], y: [], z: []};
11892
-
11893
- var fsr_mult = .00006;
11894
- var fsr_text = "";
11895
-
11896
- switch(globalDevices[deviceAddr].fsr){
11897
- case 0:
11898
- fsr_mult = 0.00006;
11899
- break;
11900
- case 1:
11901
- fsr_mult = 0.00012;
11902
- break;
11903
- case 2:
11904
- fsr_mult = 0.00024;
11905
- break;
11906
- case 3:
11907
- fsr_mult = 0.00049;
11908
- break;
11909
- }
11910
- switch(globalDevices[deviceAddr].fsr){
11911
- case 0:
11912
- fsr_text = "2g";
11913
- break;
11914
- case 1:
11915
- fsr_text = "4g";
11916
- break;
11917
- case 2:
11918
- fsr_text = "8g";
11919
- break;
11920
- case 3:
11921
- fsr_text = "16g";
11922
- break;
11923
- }
11924
-
11925
- for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
11926
- label++;
11927
-
11928
- if('x_offset' in en_axis_data){
11929
- 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(3)));
11930
- }
11931
- if('y_offset' in en_axis_data){
11932
- 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(3)));
11933
- }
11934
- if('z_offset' in en_axis_data){
11935
- 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(3)));
11936
- }
11937
- }
11938
- var fft_concat_obj = {
11939
- mode: mode,
11940
- msg_type: msg_type,
11941
- time_id: [
11942
- String(globalDevices[deviceAddr].hour).padStart(2, '0'),
11943
- String(globalDevices[deviceAddr].minute).padStart(2, '0'),
11944
- ].join(':'),
11945
- mac_address: deviceAddr,
11946
- fsr: fsr_text,
11947
- odr: globalDevices[deviceAddr].odr,
11948
- temperature: globalDevices[deviceAddr].temperature,
11949
- total_samples: label,
11950
- fft_confidence : ((Object.keys(globalDevices[deviceAddr].data).length / globalDevices[deviceAddr].expected_packets) * 100).toFixed(2) + '%',
11951
- data: fft_concat
11952
- };
11953
- return fft_concat_obj;
11954
- }
11955
- },
11956
- 'parse_fly': (frame) => {
11957
- let frame_data = {};
11958
- switch(frame[16]){
11959
- case 0:
11960
- frame_data.mode = "Processed";
11961
- break;
11962
- case 1:
11963
- frame_data.mode = "Raw";
11964
- break;
11965
- case 2:
11966
- frame_data.mode = "Processed + Raw on demand";
11967
- break;
11968
- case 3:
11969
- frame_data.mode = "Smart";
11970
- break;
11971
- }
11972
- switch(frame[17]){
11973
- case 6:
11974
- frame_data.odr_1 = 50;
11975
- break;
11976
- case 7:
11977
- frame_data.odr_1 = 100;
11978
- break;
11979
- case 8:
11980
- frame_data.odr_1 = 200;
11981
- break;
11982
- case 9:
11983
- frame_data.odr_1 = 400;
11984
- break;
11985
- case 10:
11986
- frame_data.odr_1 = 800;
11987
- break;
11988
- case 11:
11989
- frame_data.odr_1 = 1600;
11990
- break;
11991
- case 12:
11992
- frame_data.odr_1 = 3200;
11993
- break;
11994
- case 13:
11995
- frame_data.odr_1 = 6400;
11996
- break;
11997
- case 14:
11998
- frame_data.odr_1 = 12800;
11999
- break;
12000
- case 15:
12001
- frame_data.odr_1 = 25600;
12002
- break;
12003
- }
12004
- frame_data.sampling_duration_1 = frame[18]*50 + "ms";
12005
- switch(frame[19]){
12006
- case 0:
12007
- frame_data.filter_status = "Disabled";
12008
- break;
12009
- case 1:
12010
- frame_data.filter_status = "Enabled";
12011
- break;
12012
- }
12013
- switch(frame[20]){
12014
- case 0:
12015
- frame_data.lpf_coeff_1 = 4;
12016
- break;
12017
- case 1:
12018
- frame_data.lpf_coeff_1 = 8;
12019
- break;
12020
- case 2:
12021
- frame_data.lpf_coeff_1 = 16;
12022
- break;
12023
- case 2:
12024
- frame_data.lpf_coeff_1 = 32;
12025
- break;
12026
- case 4:
12027
- frame_data.lpf_coeff_1 = 64;
12028
- break;
12029
- case 5:
12030
- frame_data.lpf_coeff_1 = 128;
12031
- break;
12032
- case 6:
12033
- frame_data.lpf_coeff_1 = 256;
12034
- break;
12035
- case 7:
12036
- frame_data.lpf_coeff_1 = 512;
12037
- break;
12038
- case 8:
12039
- frame_data.lpf_coeff_1 = 1024;
12040
- break;
12041
- case 9:
12042
- frame_data.lpf_coeff_1 = 2048;
12043
- break;
12044
- }
12045
- frame_data.lpf_freq_1 = frame_data.odr_1 / frame_data.lpf_coeff_1;
12046
- switch(frame[21]){
12047
- case 0:
12048
- frame_data.hpf_coeff_1 = 4;
12049
- break;
12050
- case 1:
12051
- frame_data.hpf_coeff_1 = 8;
12052
- break;
12053
- case 2:
12054
- frame_data.hpf_coeff_1 = 16;
12055
- break;
12056
- case 2:
12057
- frame_data.hpf_coeff_1 = 32;
12058
- break;
12059
- case 4:
12060
- frame_data.hpf_coeff_1 = 64;
12061
- break;
12062
- case 5:
12063
- frame_data.hpf_coeff_1 = 128;
12064
- break;
12065
- case 6:
12066
- frame_data.hpf_coeff_1 = 256;
12067
- break;
12068
- case 7:
12069
- frame_data.hpf_coeff_1 = 512;
12070
- break;
12071
- case 8:
12072
- frame_data.hpf_coeff_1 = 1024;
12073
- break;
12074
- case 9:
12075
- frame_data.hpf_coeff_1 = 2048;
12076
- break;
12077
- }
12078
- frame_data.hpf_freq_1 = frame_data.odr_1 / frame_data.hpf_coeff_1;
12079
- switch(frame[22]){
12080
- case 0:
12081
- frame_data.sampling_interval = "5 Minutes";
12082
- frame_data.sampling_interval_number = 5;
12083
- break;
12084
- case 1:
12085
- frame_data.sampling_interval = "10 Minutes";
12086
- frame_data.sampling_interval_number = 10;
12087
- break;
12088
- case 2:
12089
- frame_data.sampling_interval = "15 Minutes";
12090
- frame_data.sampling_interval_number = 15;
12091
- break;
12092
- case 2:
12093
- frame_data.sampling_interval = "20 Minutes";
12094
- frame_data.sampling_interval_number = 20;
12095
- break;
12096
- case 4:
12097
- frame_data.sampling_interval = "30 Minutes";
12098
- frame_data.sampling_interval_number = 30;
12099
- break;
12100
- case 5:
12101
- frame_data.sampling_interval = "60 Minutes";
12102
- frame_data.sampling_interval_number = 60;
12103
- break;
12104
- case 6:
12105
- frame_data.sampling_interval = "120 Minutes";
12106
- frame_data.sampling_interval_number = 120;
12107
- break;
12108
- case 7:
12109
- frame_data.sampling_interval = "180 Minutes";
12110
- frame_data.sampling_interval_number = 180;
12111
- break;
12112
- case 8:
12113
- frame_data.sampling_interval = "1 Minute";
12114
- frame_data.sampling_interval_number = 1;
12115
- break;
12116
- }
12117
- frame_data.on_request_timeout = frame[23] + " Seconds";
12118
- frame_data.deadband = frame[24] + "mg";
12119
-
12120
- switch(frame[25]){
12121
- case 0:
12122
- frame_data.payload_length = "50 Bytes";
12123
- break;
12124
- case 1:
12125
- frame_data.payload_length = "100 Bytes";
12126
- break;
12127
- case 2:
12128
- frame_data.payload_length = "150 Bytes";
12129
- break;
12130
- case 3:
12131
- frame_data.payload_length = "180 Bytes";
12132
- break;
12133
- }
12134
- switch(frame[26]){
12135
- case 0:
12136
- frame_data.fsr_text = "2g";
12137
- break;
12138
- case 1:
12139
- frame_data.fsr_text = "4g";
12140
- break;
12141
- case 2:
12142
- frame_data.fsr_text = "8g";
12143
- break;
12144
- case 3:
12145
- frame_data.fsr_text = "16g";
12146
- break;
12147
- }
12148
- frame_data.rpm_status = frame[27]? 'Enabled': 'Disabled';
12149
- frame_data.auto_raw_interval = frame[32] * frame_data.sampling_interval_number || 'disabled';
12150
- frame_data.auto_raw_interval = typeof frame_data.auto_raw_interval === 'number' ? frame_data.auto_raw_interval+'min' : frame_data.auto_raw_interval;
12151
- frame_data.smart_mode_threshold = frame[34] * 50;
12152
- if(frame[2] > 5){ // for Firmware v6 and above
12153
- frame_data.motion_to_delay = frame[41] * 50;
12154
- return {
12155
- 'firmware': frame[2],
12156
- 'destination_address': toMac(frame.slice(12, 16)),
12157
- 'mode': frame_data.mode,
12158
- 'odr': frame_data.odr_1+'Hz',
12159
- 'sampling_duration': frame_data.sampling_duration_1,
12160
- 'filter_status': frame_data.filter_status,
12161
- 'lpf_coeff': frame_data.lpf_coeff_1,
12162
- 'lpf_freq': frame_data.lpf_freq_1+'Hz',
12163
- 'hpf_coeff': frame_data.hpf_coeff_1,
12164
- 'hpf_freq': frame_data.hpf_freq_1+'Hz',
12165
- 'sampling_interval': frame_data.sampling_interval,
12166
- 'on_request_timeout': frame_data.on_request_timeout,
12167
- 'deadband': frame_data.deadband,
12168
- 'payload_length': frame_data.payload_length,
12169
- 'fsr': frame_data.fsr_text,
12170
- 'rpm_compute_status': frame_data.rpm_status,
12171
- 'auto_raw_destination_address': toMac(frame.slice(28 , 32)),
12172
- 'auto_raw_interval': frame_data.auto_raw_interval,
12173
- 'smart_mode_skip_count': frame[33],
12174
- 'smart_mode_acc_threshold':frame_data.smart_mode_threshold+'mg',
12175
- 'uptime_counter': frame.slice(35, 39).reduce(msbLsb)+'sec',
12176
- 'max_tx_raw_samples': frame.slice(39, 41).reduce(msbLsb),
12177
- 'motion_to_sampling_delay': frame_data.motion_to_delay +'msec',
12178
- 'max_num_of_motion_tx_per_interval': frame[42],
12179
- 'hardware_id': frame.slice(43, 46),
12180
- 'reserved': frame.slice(46, 50),
12181
- 'tx_lifetime_counter': frame.slice(50, 54).reduce(msbLsb),
12182
- 'machine_values': {
12183
- 'firmware': frame[2],
12184
- 'destination_address': toMac(frame.slice(12, 16), false),
12185
- 'mode': frame[16],
12186
- 'odr': frame[17],
12187
- 'sampling_duration': frame[18],
12188
- 'filter_status': frame[19],
12189
- 'lpf_coeff': frame[20],
12190
- 'hpf_coeff': frame[21],
12191
- 'sampling_interval': frame[22],
12192
- 'on_request_timeout': frame[23],
12193
- 'deadband': frame[24],
12194
- 'payload_length': frame[25],
12195
- 'fsr': frame[26],
12196
- 'rpm_compute_status': frame[27],
12197
- 'auto_raw_destination_address': toMac(frame.slice(28 , 32), false),
12198
- 'auto_raw_interval': frame[32],
12199
- 'smart_mode_skip_count': frame[33],
12200
- 'smart_mode_acc_threshold':frame[34],
12201
- 'uptime_counter': frame.slice(35, 39),
12202
- 'max_tx_raw_samples': frame.slice(39, 41),
12203
- 'motion_to_sampling_delay': frame[41],
12204
- 'max_num_of_motion_tx_per_interval': frame[42],
12205
- 'hardware_id': frame.slice(43, 46),
12206
- 'reserved': frame.slice(46, 50),
12207
- 'tx_lifetime_counter': frame.slice(50, 54)
12208
- }
12209
- }
12210
- } else if(frame[2] > 4){ // for Firmware v5 and above
12211
- return {
12212
- 'firmware': frame[2],
12213
- 'destination_address': toMac(frame.slice(12, 16)),
12214
- 'mode': frame_data.mode,
12215
- 'odr': frame_data.odr_1+'Hz',
12216
- 'sampling_duration': frame_data.sampling_duration_1,
12217
- 'filter_status': frame_data.filter_status,
12218
- 'lpf_coeff': frame_data.lpf_coeff_1,
12219
- 'lpf_freq': frame_data.lpf_freq_1+'Hz',
12220
- 'hpf_coeff': frame_data.hpf_coeff_1,
12221
- 'hpf_freq': frame_data.hpf_freq_1+'Hz',
12222
- 'sampling_interval': frame_data.sampling_interval,
12223
- 'on_request_timeout': frame_data.on_request_timeout,
12224
- 'deadband': frame_data.deadband,
12225
- 'payload_length': frame_data.payload_length,
12226
- 'fsr': frame_data.fsr_text,
12227
- 'rpm_compute_status': frame_data.rpm_status,
12228
- 'auto_raw_destination_address': toMac(frame.slice(28 , 32)),
12229
- 'auto_raw_interval': frame_data.auto_raw_interval,
12230
- 'smart_mode_skip_count': frame[33],
12231
- 'smart_mode_acc_threshold':frame_data.smart_mode_threshold+'mg',
12232
- 'uptime_counter': frame.slice(35, 39).reduce(msbLsb)+'sec',
12233
- 'max_tx_raw_samples': frame.slice(39, 41).reduce(msbLsb),
12234
- 'hardware_id': frame.slice(41, 44),
12235
- 'reserved': frame.slice(44, 48),
12236
- 'tx_lifetime_counter': frame.slice(48, 52).reduce(msbLsb),
12237
- 'machine_values': {
12238
- 'firmware': frame[2],
12239
- 'destination_address': toMac(frame.slice(12, 16), false),
12240
- 'mode': frame[16],
12241
- 'odr': frame[17],
12242
- 'sampling_duration': frame[18],
12243
- 'filter_status': frame[19],
12244
- 'lpf_coeff': frame[20],
12245
- 'hpf_coeff': frame[21],
12246
- 'sampling_interval': frame[22],
12247
- 'on_request_timeout': frame[23],
12248
- 'deadband': frame[24],
12249
- 'payload_length': frame[25],
12250
- 'fsr': frame[26],
12251
- 'rpm_compute_status': frame[27],
12252
- 'auto_raw_destination_address': toMac(frame.slice(28 , 32), false),
12253
- 'auto_raw_interval': frame[32],
12254
- 'smart_mode_skip_count': frame[33],
12255
- 'smart_mode_acc_threshold':frame[34],
12256
- 'uptime_counter': frame.slice(35, 39),
12257
- 'max_tx_raw_samples': frame.slice(39, 41),
12258
- 'hardware_id': frame.slice(41, 44),
12259
- 'reserved': frame.slice(44, 48),
12260
- 'tx_lifetime_counter': frame.slice(48, 52)
12261
- }
12262
- }
12263
- }else{
12264
- return {
12265
- 'firmware': frame[2],
12266
- 'destination_address': toMac(frame.slice(12, 16)),
12267
- 'mode': frame_data.mode,
12268
- 'odr': frame_data.odr_1+'Hz',
12269
- 'sampling_duration': frame_data.sampling_duration_1,
12270
- 'filter_status': frame_data.filter_status,
12271
- 'lpf_coeff': frame_data.lpf_coeff_1,
12272
- 'lpf_freq': frame_data.lpf_freq_1+'Hz',
12273
- 'hpf_coeff': frame_data.hpf_coeff_1,
12274
- 'hpf_freq': frame_data.hpf_freq_1+'Hz',
12275
- 'sampling_interval': frame_data.sampling_interval,
12276
- 'on_request_timeout': frame_data.on_request_timeout,
12277
- 'deadband': frame_data.deadband,
12278
- 'payload_length': frame_data.payload_length,
12279
- 'fsr': frame_data.fsr_text,
12280
- 'rpm_compute_status': frame_data.rpm_status,
12281
- 'auto_raw_destination_address': toMac(frame.slice(28 , 32)),
12282
- 'auto_raw_interval': frame_data.auto_raw_interval,
12283
- 'smart_mode_skip_count': frame[33],
12284
- 'smart_mode_acc_threshold':frame_data.smart_mode_threshold+'mg',
12285
- 'uptime_counter': frame.slice(35, 39).reduce(msbLsb)+'sec',
12286
- 'hardware_id': frame.slice(39, 42),
12287
- 'reserved': frame.slice(42, 46),
12288
- 'tx_lifetime_counter': frame.slice(46, 50).reduce(msbLsb),
12289
- 'machine_values': {
12290
- 'firmware': frame[2],
12291
- 'destination_address': toMac(frame.slice(12, 16), false),
12292
- 'mode': frame[16],
12293
- 'odr': frame[17],
12294
- 'sampling_duration': frame[18],
12295
- 'filter_status': frame[19],
12296
- 'lpf_coeff': frame[20],
12297
- 'hpf_coeff': frame[21],
12298
- 'sampling_interval': frame[22],
12299
- 'on_request_timeout': frame[23],
12300
- 'deadband': frame[24],
12301
- 'payload_length': frame[25],
12302
- 'fsr': frame[26],
12303
- 'rpm_compute_status': frame[27],
12304
- 'auto_raw_destination_address': toMac(frame.slice(28 , 32), false),
12305
- 'auto_raw_interval': frame[32],
12306
- 'smart_mode_skip_count': frame[33],
12307
- 'smart_mode_acc_threshold':frame[34],
12308
- 'uptime_counter': frame.slice(35, 39),
12309
- 'hardware_id': frame.slice(39, 42),
12310
- 'reserved': frame.slice(42, 46),
12311
- 'tx_lifetime_counter': frame.slice(46, 50)
12312
- }
12313
- }
12314
- }
12315
- }
12316
- },
12317
- '117': {
12318
- name: 'Custom Vibration Sensor PPV',
12319
- parse: (payload, parsed, mac) => {
12320
- if(payload[7] & 2){
12321
- console.log('Error found');
12322
- parsed.data = {error: 'Error found, Sensor Probe may be unattached'};
12323
- return parsed;
12324
- }
12325
- if(payload[8] === 1){
12326
- let mode = payload[8];
12327
- let msg_type = '';
12328
- switch(payload[9]){
12329
- case 0:
12330
- msg_type = 'Regular';
12331
- break;
12332
- case 1:
12333
- msg_type = 'Cautionay';
12334
- break;
12335
- case 2:
12336
- msg_type = 'Artwork';
12337
- break;
12338
- case 3:
12339
- msg_type = 'Transient';
10848
+ case 3:
10849
+ msg_type = 'Transient';
12340
10850
  break;
12341
10851
  }
12342
10852
  var deviceAddr = mac;
@@ -13677,15 +12187,6 @@ function sensor_types(parent){
13677
12187
  }
13678
12188
  }
13679
12189
  },
13680
- '128': {
13681
- name: 'Wireless Water Detect Sensor',
13682
- parse: (payload, parsed, mac) => {
13683
- return {
13684
- water_detect: payload[8],
13685
- raw_value: payload.slice(9, 11).reduce(msbLsb)
13686
- };
13687
- }
13688
- },
13689
12190
  '180': {
13690
12191
  name: 'C1D2 One Channel Vibration Plus',
13691
12192
  parse: (payload, parsed, mac) => {
@@ -17276,40 +15777,6 @@ function sensor_types(parent){
17276
15777
  }
17277
15778
  }
17278
15779
  },
17279
- '554': {
17280
- name: 'Custom 400-50,000 PPM CO2 Sensor',
17281
- parse: (payload, parsed, mac) => {
17282
- let status = [];
17283
- if(payload[8] & 1) status.push('fatal');
17284
- if(payload[8] & 2) status.push('offset_reg');
17285
- if(payload[8] & 4) status.push('algorithm');
17286
- if(payload[8] & 8) status.push('output');
17287
- if(payload[8] & 16) status.push('self_diagnostic');
17288
- if(payload[8] & 32) status.push('out_of_range');
17289
- if(payload[8] & 64) status.push('memory');
17290
- if(payload[8] == 0) status = 'valid_data'
17291
- let res = {
17292
- status: status,
17293
- co2_ppm: signInt(payload.slice(9, 13).reduce(msbLsb), 32)
17294
- };
17295
- if(payload[7] == 1) res.co2_ppm = 'invalid_data';
17296
- return res;
17297
- },
17298
- 'parse_fly': (frame) => {
17299
- return {
17300
- 'firmware': frame[2],
17301
- 'hardware_id': frame.slice(12, 15),
17302
- 'report_rate': frame.slice(15, 19).reduce(msbLsb) + " sec",
17303
- 'tx_life_counter': frame.slice(19, 23).reduce(msbLsb),
17304
- 'machine_values': {
17305
- 'firmware': frame[2],
17306
- 'hardware_id': frame.slice(12, 15),
17307
- 'report_rate': frame.slice(15, 19),
17308
- 'tx_life_counter': frame.slice(19, 23)
17309
- }
17310
- }
17311
- }
17312
- },
17313
15780
  '1010': {
17314
15781
  name: 'RS232 Wireless Converter',
17315
15782
  parse: (d) => {