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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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) => {
@@ -4595,49 +4633,6 @@ function sensor_types(parent){
4595
4633
  };
4596
4634
  }
4597
4635
  },
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
4636
  '34': {
4642
4637
  name: 'Tank Level Sensor',
4643
4638
  parse: (d) => {
@@ -8503,29 +8498,6 @@ function sensor_types(parent){
8503
8498
  };
8504
8499
  }
8505
8500
  },
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
8501
  '95': {
8530
8502
  name: '16-Bit 1-Channel 0-24VDC Receiver',
8531
8503
  parse: (d) => {
@@ -10216,16 +10188,17 @@ function sensor_types(parent){
10216
10188
  }
10217
10189
  }
10218
10190
  },
10219
- '110': {
10220
- name: 'One Channel Vibration Plus v4',
10191
+ '112': {
10192
+ name: 'Condition Based/Predictive Maintenance Sensor v4',
10221
10193
  parse: (payload, parsed, mac) => {
10222
10194
  if(payload[7] & 2){
10223
10195
  console.log('Error found');
10196
+ console.log(payload[7]);
10224
10197
  parsed.data = {error: 'Error found, Sensor Probe may be unattached'};
10225
10198
  return parsed;
10226
10199
  }
10227
10200
  let msg_type = (payload[7] & 16)? 'motion' : 'regular';
10228
- if(payload[8] === 1){
10201
+ if (payload[8] === 1) {
10229
10202
  var deviceAddr = mac;
10230
10203
  // var firmware = payload[1];
10231
10204
  // var hour = payload[12];
@@ -10233,8 +10206,9 @@ function sensor_types(parent){
10233
10206
  var expected_packets = msbLsb(payload[16], payload[17]);
10234
10207
  var current_packet = msbLsb(payload[18], payload[19]);
10235
10208
  var sdata_start = 20;
10236
-
10237
- if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
10209
+
10210
+
10211
+ if (globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1) {
10238
10212
  if (expected_packets != 1) {
10239
10213
  // if current packet is equal to last one (duplicated data). This does not apply to the last package
10240
10214
  if (globalDevices[deviceAddr].last_packet_counter == current_packet) {
@@ -10245,10 +10219,10 @@ function sensor_types(parent){
10245
10219
  if (current_packet == 1 || (globalDevices[deviceAddr].last_packet_counter > current_packet)) {
10246
10220
  console.log('Recovering bad packet');
10247
10221
  // clear stream object & timeout
10248
- parent.sensor_types[110].utils.clear_globalDevices_stream(deviceAddr);
10222
+ parent.sensor_types[112].utils.clear_globalDevices_stream(deviceAddr);
10249
10223
 
10250
10224
  // init new stream
10251
- parent.sensor_types[110].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
10225
+ parent.sensor_types[112].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
10252
10226
 
10253
10227
  globalDevices[deviceAddr].last_packet_counter = current_packet;
10254
10228
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
@@ -10257,36 +10231,33 @@ function sensor_types(parent){
10257
10231
  globalDevices[deviceAddr].last_packet_counter = current_packet;
10258
10232
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10259
10233
  }
10234
+ } else {
10235
+ // clear stream object & timeout
10236
+ parent.sensor_types[112].utils.clear_globalDevices_stream(deviceAddr);
10237
+
10238
+ // init new stream
10239
+ parent.sensor_types[112].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
10240
+
10241
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
10242
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10260
10243
  }
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{
10244
+ } else {
10273
10245
  // clear stream object & timeout
10274
- parent.sensor_types[110].utils.clear_globalDevices_stream(deviceAddr);
10275
-
10246
+ parent.sensor_types[112].utils.clear_globalDevices_stream(deviceAddr);
10247
+
10276
10248
  // init new stream
10277
- parent.sensor_types[110].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
10278
-
10249
+ parent.sensor_types[112].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
10250
+
10279
10251
  globalDevices[deviceAddr].last_packet_counter = current_packet;
10280
10252
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
10281
10253
  }
10282
- if(current_packet == expected_packets){
10254
+ if (current_packet == expected_packets) {
10283
10255
  // concatenate stream
10284
- sensor_data = parent.sensor_types[114].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
10256
+ sensor_data = parent.sensor_types[112].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
10285
10257
  // clear stream object & timeout
10286
- parent.sensor_types[114].utils.clear_globalDevices_stream(deviceAddr);
10258
+ parent.sensor_types[112].utils.clear_globalDevices_stream(deviceAddr);
10287
10259
  return sensor_data;
10288
- }
10289
- else{
10260
+ } else {
10290
10261
  return;
10291
10262
  }
10292
10263
  }
@@ -10332,31 +10303,32 @@ function sensor_types(parent){
10332
10303
 
10333
10304
  odr: odr,
10334
10305
  temperature: signInt(payload.slice(10, 12).reduce(msbLsb), 16) / 100,
10306
+ ext_temperature: signInt(payload.slice(12, 16).reduce(msbLsb), 32) / 100,
10307
+ current: signInt(payload.slice(16, 20).reduce(msbLsb), 32) / 1000,
10308
+ x_rms_ACC_G: payload.slice(20, 22).reduce(msbLsb)/1000,
10309
+ x_max_ACC_G: payload.slice(22, 24).reduce(msbLsb)/1000,
10310
+ x_velocity_mm_sec: payload.slice(24, 26).reduce(msbLsb) / 100,
10311
+ x_displacement_mm: payload.slice(26, 28).reduce(msbLsb) / 100,
10312
+ x_peak_one_Hz: payload.slice(28, 30).reduce(msbLsb),
10313
+ x_peak_two_Hz: payload.slice(30, 32).reduce(msbLsb),
10314
+ x_peak_three_Hz: payload.slice(32, 34).reduce(msbLsb),
10335
10315
 
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),
10316
+ y_rms_ACC_G: payload.slice(34, 36).reduce(msbLsb)/1000,
10317
+ y_max_ACC_G: payload.slice(36, 38).reduce(msbLsb)/1000,
10318
+ y_velocity_mm_sec: payload.slice(38, 40).reduce(msbLsb) / 100,
10319
+ y_displacement_mm: payload.slice(40, 42).reduce(msbLsb) / 100,
10320
+ y_peak_one_Hz: payload.slice(42, 44).reduce(msbLsb),
10321
+ y_peak_two_Hz: payload.slice(44, 46).reduce(msbLsb),
10322
+ y_peak_three_Hz: payload.slice(46, 48).reduce(msbLsb),
10351
10323
 
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)
10324
+ z_rms_ACC_G: payload.slice(48, 50).reduce(msbLsb)/1000,
10325
+ z_max_ACC_G: payload.slice(50, 52).reduce(msbLsb)/1000,
10326
+ z_velocity_mm_sec: payload.slice(52, 54).reduce(msbLsb) / 100,
10327
+ z_displacement_mm: payload.slice(54, 56).reduce(msbLsb) / 100,
10328
+ z_peak_one_Hz: payload.slice(56, 58).reduce(msbLsb),
10329
+ z_peak_two_Hz: payload.slice(58, 60).reduce(msbLsb),
10330
+ z_peak_three_Hz: payload.slice(60, 62).reduce(msbLsb),
10331
+ rpm: payload.slice(62, 64).reduce(msbLsb)
10360
10332
  };
10361
10333
  }
10362
10334
  // else{
@@ -10385,16 +10357,16 @@ function sensor_types(parent){
10385
10357
  expected_packets: expected_packets
10386
10358
  }
10387
10359
  globalDevices[deviceAddr].packet_stream_timeout = setTimeout(() => {
10388
- parsed.sensor_data = parent.sensor_types[110].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
10360
+ parsed.sensor_data = parent.sensor_types[112].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
10389
10361
  parsed.sensor_data.error = 'Time Series Data Stream Timeout - incomplete data received';
10390
10362
 
10391
- parsed.sensor_name = parent.sensor_types[110].name;
10363
+ parsed.sensor_name = parent.sensor_types[112].name;
10392
10364
  parsed.type = 'sensor_data';
10393
10365
  parsed.addr = deviceAddr;
10394
10366
  parsed.received = Date.now();
10395
10367
 
10396
10368
  parent._emitter.emit('sensor_data', parsed);
10397
- parent._emitter.emit('sensor_data-110', parsed);
10369
+ parent._emitter.emit('sensor_data-112', parsed);
10398
10370
  parent._emitter.emit('sensor_data'+'-'+deviceAddr, parsed);
10399
10371
  }, 60000);
10400
10372
  },
@@ -10838,1505 +10810,29 @@ function sensor_types(parent){
10838
10810
  }
10839
10811
  }
10840
10812
  },
10841
- '111': {
10842
- name: 'Two Channel Vibration Plus v4',
10813
+ '117': {
10814
+ name: 'Custom Vibration Sensor PPV',
10843
10815
  parse: (payload, parsed, mac) => {
10844
- parsed.data = {};
10845
10816
  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){
10817
+ console.log('Error found');
10818
+ parsed.data = {error: 'Error found, Sensor Probe may be unattached'};
10852
10819
  return parsed;
10853
10820
  }
10854
- let msg_type = (payload[7] & 16)? 'motion' : 'regular';
10855
10821
  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;
10822
+ let mode = payload[8];
10823
+ let msg_type = '';
10938
10824
  switch(payload[9]){
10939
- case 6:
10940
- odr1 = "50Hz"
10941
- break;
10942
- case 7:
10943
- odr1 = "100Hz";
10944
- break;
10945
- case 8:
10946
- odr1 = "200Hz";
10947
- break;
10948
- case 9:
10949
- odr1 = "400Hz";
10825
+ case 0:
10826
+ msg_type = 'Regular';
10950
10827
  break;
10951
- case 10:
10952
- odr1 = "800Hz";
10828
+ case 1:
10829
+ msg_type = 'Cautionay';
10953
10830
  break;
10954
- case 11:
10955
- odr1 = "1600Hz";
10831
+ case 2:
10832
+ msg_type = 'Artwork';
10956
10833
  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';
10834
+ case 3:
10835
+ msg_type = 'Transient';
12340
10836
  break;
12341
10837
  }
12342
10838
  var deviceAddr = mac;
@@ -13677,15 +12173,6 @@ function sensor_types(parent){
13677
12173
  }
13678
12174
  }
13679
12175
  },
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
12176
  '180': {
13690
12177
  name: 'C1D2 One Channel Vibration Plus',
13691
12178
  parse: (payload, parsed, mac) => {
@@ -17276,40 +15763,6 @@ function sensor_types(parent){
17276
15763
  }
17277
15764
  }
17278
15765
  },
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
15766
  '1010': {
17314
15767
  name: 'RS232 Wireless Converter',
17315
15768
  parse: (d) => {