@ncd-io/node-red-enterprise-sensors 1.4.4 → 1.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -160,7 +160,7 @@ module.exports = class WirelessSensor{
160
160
  }
161
161
  }
162
162
  // #OTF
163
- var otf_devices = [4,12,21,23,26,32,33,39,44,45,48,52,53,56,58,74,76,78,79,80,81,82,84,88,89,90,91,97,98,101,102,103,105,106,107,108,109,110,111,112,114,117,118,120,121,122,123,180,181,202,217,211,270,519,520,521,531,535,537,538,539,540,541,1010,1011];
163
+ var otf_devices = [4,12,21,23,26,32,33,39,44,45,48,52,53,56,58,74,76,78,79,80,81,82,84,88,89,90,91,97,98,101,102,103,105,106,107,108,109,110,111,112,114,117,118,119,120,121,122,123,124,180,181,202,217,211,270,519,520,521,531,535,536,537,538,539,540,541,542,543,1010,1011];
164
164
  var device_type = msbLsb(frame.data[6], frame.data[7]);
165
165
  // var device_type = frame.data[7];
166
166
 
@@ -235,6 +235,11 @@ module.exports = class WirelessSensor{
235
235
  }else if(mode === 'ACK'){
236
236
  this.sensor_pool[frame.mac].status = data.result;
237
237
  if(data.data.length){
238
+ if(data.sensor_type == 110 || data.sensor_type == 111 || data.sensor_type == 112 || data.sensor_type == 114 || data.sensor_type == 543){
239
+ if(data.data[0] == 77 && data.data[1] == 79 && data.data[2] == 70 && data.data[3] == 70 && data.data[4] == 0){
240
+ this.sensor_pool[frame.mac].mode = 'MOFF';
241
+ }
242
+ }
238
243
  this.sensor_pool[frame.mac].data = data.data;
239
244
  };
240
245
  }
@@ -287,6 +292,9 @@ module.exports = class WirelessSensor{
287
292
  };
288
293
  }
289
294
  config_ack(payload){
295
+ if((msbLsb(payload[2], payload[3])) == 28){
296
+ payload[5] = payload[6];
297
+ }
290
298
  return {
291
299
  nodeId: payload[0],
292
300
  counter: payload[1],
@@ -323,18 +331,37 @@ module.exports = class WirelessSensor{
323
331
  };
324
332
  }
325
333
  sensor_data(payload, frame){
334
+
335
+ let sensor_type = msbLsb(payload[5], payload[6]);
336
+ let battery_percent = ((msbLsb(payload[2], payload[3]) * 0.361) - 269.66).toFixed(2);
337
+ let voltage = (msbLsb(payload[2], payload[3]) * 0.00322).toFixed(2);
338
+
339
+ if(sensor_type == 110 || sensor_type == 111 || sensor_type == 112 || sensor_type == 114 || sensor_type == 543){
340
+ const vMin = 2.5;
341
+ const vMax = 3.3;
342
+
343
+ if (voltage >= vMax){
344
+ battery_percent = '100';
345
+ } else if (voltage <= vMin){
346
+ battery_percent = '0';
347
+ } else {
348
+ const scale = 5.0; // tuning factor for steepness
349
+ const percent = 100 * (1 - Math.exp(-scale * (voltage - vMin)));
350
+ battery_percent = (Math.min(100, Math.max(0, percent))).toFixed(2);
351
+ }
352
+ }
326
353
  var parsed = {
327
354
  nodeId: payload[0],
328
355
  firmware: payload[1],
329
- battery: (msbLsb(payload[2], payload[3]) * 0.00322).toFixed(2),
356
+ battery: voltage,
330
357
  // battery_percent: (msbLsb(payload[2], payload[3]) * 0.537 - 449.9).toFixed(2),
331
- battery_percent: ((msbLsb(payload[2], payload[3]) * 0.361) - 269.66).toFixed(2),
358
+ battery_percent: battery_percent,
332
359
  counter: payload[4],
333
- sensor_type: msbLsb(payload[5], payload[6]),
360
+ sensor_type: sensor_type
334
361
  };
335
362
 
336
363
  // #OTF
337
- var otf_devices = [4,12,21,23,26,32,33,39,44,45,48,52,53,56,58,74,76,78,79,80,81,82,84,88,89,90,91,97,98,101,102,103,105,106,107,108,109,110,111,112,114,117,118,120,121,122,123,180,181,202,211,217,270,519,520,521,531,535,537,538,539,540,541,1010,1011];
364
+ var otf_devices = [4,12,21,23,26,32,33,39,44,45,48,52,53,56,58,74,76,78,79,80,81,82,84,88,89,90,91,97,98,101,102,103,105,106,107,108,109,110,111,112,114,117,118,119,120,121,122,123,124,180,181,202,211,217,270,519,520,521,531,535,536,537,538,539,540,541,542,543,1010,1011];
338
365
  if(otf_devices.includes(parsed.sensor_type)){
339
366
  // If the message says FLY and there is not FLY timer in progress.
340
367
  if(payload[8] == 70 && payload[9] == 76 && payload[10] == 89) {
@@ -756,7 +783,7 @@ module.exports = class WirelessSensor{
756
783
  data: payload.slice(8)
757
784
  };
758
785
  // #OTF
759
- }else if(parsed.sensor_type == 21 || parsed.sensor_type == 33 || parsed.sensor_type == 80 || parsed.sensor_type == 81 || parsed.sensor_type == 82 || parsed.sensor_type == 84 || parsed.sensor_type == 97 || parsed.sensor_type == 98 || parsed.sensor_type == 103 || parsed.sensor_type == 110 || parsed.sensor_type == 111 || parsed.sensor_type == 112 || parsed.sensor_type == 114 || parsed.sensor_type == 117 || parsed.sensor_type == 180 || parsed.sensor_type == 181 || parsed.sensor_type == 202 || parsed.sensor_type == 515 || parsed.sensor_type == 519 || parsed.sensor_type == 531 || parsed.sensor_type == 537 || parsed.sensor_type == 538){
786
+ }else if(parsed.sensor_type == 21 || parsed.sensor_type == 33 || parsed.sensor_type == 80 || parsed.sensor_type == 81 || parsed.sensor_type == 82 || parsed.sensor_type == 84 || parsed.sensor_type == 97 || parsed.sensor_type == 98 || parsed.sensor_type == 103 || parsed.sensor_type == 110 || parsed.sensor_type == 111 || parsed.sensor_type == 112 || parsed.sensor_type == 114 || parsed.sensor_type == 117 || parsed.sensor_type == 180 || parsed.sensor_type == 181 || parsed.sensor_type == 202 || parsed.sensor_type == 515 || parsed.sensor_type == 519 || parsed.sensor_type == 531 || parsed.sensor_type == 537 || parsed.sensor_type == 538 || parsed.sensor_type == 543){
760
787
  parsed.sensor_data = this.sensor_types[parsed.sensor_type].parse(payload, parsed, frame.mac);
761
788
  if(!parsed.sensor_data){
762
789
  return;
@@ -1336,7 +1363,7 @@ module.exports = class WirelessSensor{
1336
1363
  }
1337
1364
  config_set_quality_of_service_108(sensor_mac, value){
1338
1365
  console.log('config_set_quality_of_service_108');
1339
- var packet = [244, 52, 0, 0, 0, value];
1366
+ var packet = [247, 52, 0, 0, 0, value];
1340
1367
  console.log(packet);
1341
1368
  return this.config_send(sensor_mac, packet);
1342
1369
  }
@@ -1711,6 +1738,18 @@ module.exports = class WirelessSensor{
1711
1738
  console.log(packet);
1712
1739
  return this.config_send(sensor_mac, packet);
1713
1740
  }
1741
+ config_set_led_accelerometer_threshold_114(sensor_mac, value){
1742
+ console.log('config_set_led_accelerometer_threshold_114');
1743
+ var packet = [244, 79, 0, 0, 0, 62, 1, value];
1744
+ console.log(packet);
1745
+ return this.config_send(sensor_mac, packet);
1746
+ }
1747
+ config_set_led_velocity_threshold_114(sensor_mac, value){
1748
+ console.log('config_set_led_velocity_threshold_114');
1749
+ var packet = [244, 79, 0, 0, 0, 64, 1, value];
1750
+ console.log(packet);
1751
+ return this.config_send(sensor_mac, packet);
1752
+ }
1714
1753
  config_set_acceleration_interrupt_threshold_84(sensor_mac, value){
1715
1754
  console.log('config_set_acceleration_interrupt_threshold_84');
1716
1755
  var packet = [244, 79, 0, 0, 0, 60, value];
@@ -2244,7 +2283,200 @@ module.exports = class WirelessSensor{
2244
2283
  console.log(packet);
2245
2284
  return this.config_send(sensor_mac, packet);
2246
2285
  }
2247
-
2286
+ config_set_volume_flow_unit_124(sensor_mac, value){
2287
+ console.log('config_set_volume_flow_unit_124');
2288
+ var packet = [244, 51, 0, 0, 124, value];
2289
+ console.log(packet);
2290
+ return this.config_send(sensor_mac, packet);
2291
+ }
2292
+ config_set_total_1_flow_unit_124(sensor_mac, value){
2293
+ console.log('config_set_total_1_flow_unit_124');
2294
+ var packet = [244, 52, 0, 0, 124, value];
2295
+ console.log(packet);
2296
+ return this.config_send(sensor_mac, packet);
2297
+ }
2298
+ config_set_total_2_flow_unit_124(sensor_mac, value){
2299
+ console.log('config_set_total_2_flow_unit_124');
2300
+ var packet = [244, 53, 0, 0, 124, value];
2301
+ console.log(packet);
2302
+ return this.config_send(sensor_mac, packet);
2303
+ }
2304
+ config_set_total_3_flow_unit_124(sensor_mac, value){
2305
+ console.log('config_set_total_3_flow_unit_124');
2306
+ var packet = [244, 54, 0, 0, 124, value];
2307
+ console.log(packet);
2308
+ return this.config_send(sensor_mac, packet);
2309
+ }
2310
+ config_set_pressure_unit_124(sensor_mac, value){
2311
+ console.log('config_set_pressure_unit_124');
2312
+ var packet = [244, 55, 0, 0, 124, value];
2313
+ console.log(packet);
2314
+ return this.config_send(sensor_mac, packet);
2315
+ }
2316
+ config_set_total_1_op_mode_124(sensor_mac, value){
2317
+ console.log('config_set_total_1_op_mode_124');
2318
+ var packet = [244, 48, 0, 0, 124, value];
2319
+ console.log(packet);
2320
+ return this.config_send(sensor_mac, packet);
2321
+ }
2322
+ config_set_total_2_op_mode_124(sensor_mac, value){
2323
+ console.log('config_set_total_2_op_mode_124');
2324
+ var packet = [244, 49, 0, 0, 124, value];
2325
+ console.log(packet);
2326
+ return this.config_send(sensor_mac, packet);
2327
+ }
2328
+ config_set_total_3_op_mode_124(sensor_mac, value){
2329
+ console.log('config_set_total_3_op_mode_124');
2330
+ var packet = [244, 50, 0, 0, 124, value];
2331
+ console.log(packet);
2332
+ return this.config_send(sensor_mac, packet);
2333
+ }
2334
+ config_set_conductivity_unit_124(sensor_mac, value){
2335
+ console.log('config_set_conductivity_unit_124');
2336
+ var packet = [244, 56, 0, 0, 124, value];
2337
+ console.log(packet);
2338
+ return this.config_send(sensor_mac, packet);
2339
+ }
2340
+ config_set_reset_all_totalizers_124(sensor_mac, value){
2341
+ console.log('config_set_reset_all_totalizers_124');
2342
+ var packet = [244, 64, 0, 0, 124, 1];
2343
+ console.log(packet);
2344
+ return this.config_send(sensor_mac, packet);
2345
+ }
2346
+ config_set_screen_control_108(sensor_mac, value){
2347
+ console.log('config_set_screen_control_108');
2348
+ var packet = [244, 69, 0, 0, 0, value];
2349
+ console.log(packet);
2350
+ return this.config_send(sensor_mac, packet);
2351
+ }
2352
+ config_set_screen_on_time_108(sensor_mac, value){
2353
+ console.log('config_set_screen_on_time_108');
2354
+ var packet = [244, 67, 0, 0, 0, value];
2355
+ console.log(packet);
2356
+ return this.config_send(sensor_mac, packet);
2357
+ }
2358
+ config_set_oxygen_boot_time_536(sensor_mac, value){
2359
+ console.log('config_set_oxygen_boot_time_536');
2360
+ var packet = [244, 41, 0, 0, 0, value];
2361
+ console.log(packet);
2362
+ return this.config_send(sensor_mac, packet);
2363
+ }
2364
+ config_set_flow_boot_time_536(sensor_mac, value){
2365
+ console.log('config_set_flow_boot_time_536');
2366
+ var packet = [244, 49, 0, 0, 0, value];
2367
+ console.log(packet);
2368
+ return this.config_send(sensor_mac, packet);
2369
+ }
2370
+ config_set_oxygen_dev_addr_536(sensor_mac, id_1, id_2, id_3, id_4){
2371
+ console.log('config_set_oxygen_dev_addr_536');
2372
+ var packet = [244, 51, 0, 0, 0, id_1, id_2, id_3, id_4];
2373
+ console.log(packet);
2374
+ return this.config_send(sensor_mac, packet);
2375
+ }
2376
+ config_set_flow_dev_addr_536(sensor_mac, id_1, id_2, id_3, id_4){
2377
+ console.log('config_set_flow_dev_addr_536');
2378
+ var packet = [244, 53, 0, 0, 0, id_1, id_2, id_3, id_4];
2379
+ console.log(packet);
2380
+ return this.config_send(sensor_mac, packet);
2381
+ }
2382
+ config_set_oxygen_rate_536(sensor_mac, value){
2383
+ console.log('config_set_oxygen_rate_536');
2384
+ var packet = [244, 32, 0, 0, 0, value];
2385
+ console.log(packet);
2386
+ return this.config_send(sensor_mac, packet);
2387
+ }
2388
+ config_set_oxygen_timeout_536(sensor_mac, value){
2389
+ console.log('config_set_oxygen_timeout_536');
2390
+ var packet = [244, 37, 0, 0, 0];
2391
+ let value_ = int2Bytes(value, 2);
2392
+ packet.push(...value_);
2393
+ console.log(packet);
2394
+ return this.config_send(sensor_mac, packet);
2395
+ }
2396
+ config_set_oxygen_max_threshold_s1_536(sensor_mac, value){
2397
+ console.log('config_set_oxygen_max_threshold_s1_536');
2398
+ value = value * 100;
2399
+ var packet = [244, 34, 0, 0, 0, 1];
2400
+ let value_ = int2Bytes(value, 2);
2401
+ packet.push(...value_);
2402
+ console.log(packet);
2403
+ return this.config_send(sensor_mac, packet);
2404
+ }
2405
+ config_set_oxygen_max_threshold_s2_536(sensor_mac, value){
2406
+ console.log('config_set_oxygen_max_threshold_s2_536');
2407
+ value = value * 100;
2408
+ var packet = [244, 34, 0, 0, 0, 2];
2409
+ let value_ = int2Bytes(value, 2);
2410
+ packet.push(...value_);
2411
+ console.log(packet);
2412
+ return this.config_send(sensor_mac, packet);
2413
+ }
2414
+ config_set_oxygen_max_threshold_s3_536(sensor_mac, value){
2415
+ value = value * 100;
2416
+ console.log('config_set_oxygen_max_threshold_s3_536');
2417
+ var packet = [244, 34, 0, 0, 0, 3];
2418
+ let value_ = int2Bytes(value, 2);
2419
+ packet.push(...value_);
2420
+ console.log(packet);
2421
+ return this.config_send(sensor_mac, packet);
2422
+ }
2423
+ config_set_oxygen_max_threshold_s4_536(sensor_mac, value){
2424
+ value = value * 100;
2425
+ console.log('config_set_oxygen_max_threshold_s4_536');
2426
+ var packet = [244, 34, 0, 0, 0, 4];
2427
+ let value_ = int2Bytes(value, 2);
2428
+ packet.push(...value_);
2429
+ console.log(packet);
2430
+ return this.config_send(sensor_mac, packet);
2431
+ }
2432
+ config_set_oxygen_min_threshold_s1_536(sensor_mac, value){
2433
+ console.log('config_set_oxygen_min_threshold_s1_536');
2434
+ value = value * 100;
2435
+ var packet = [244, 39, 0, 0, 0, 1];
2436
+ let value_ = int2Bytes(value, 2);
2437
+ packet.push(...value_);
2438
+ console.log(packet);
2439
+ return this.config_send(sensor_mac, packet);
2440
+ }
2441
+ config_set_oxygen_min_threshold_s2_536(sensor_mac, value){
2442
+ console.log('config_set_oxygen_min_threshold_s2_536');
2443
+ value = value * 100;
2444
+ var packet = [244, 39, 0, 0, 0, 2];
2445
+ let value_ = int2Bytes(value, 2);
2446
+ packet.push(...value_);
2447
+ console.log(packet);
2448
+ return this.config_send(sensor_mac, packet);
2449
+ }
2450
+ config_set_oxygen_min_threshold_s3_536(sensor_mac, value){
2451
+ value = value * 100;
2452
+ console.log('config_set_oxygen_min_threshold_s3_536');
2453
+ var packet = [244, 39, 0, 0, 0, 3];
2454
+ let value_ = int2Bytes(value, 2);
2455
+ packet.push(...value_);
2456
+ console.log(packet);
2457
+ return this.config_send(sensor_mac, packet);
2458
+ }
2459
+ config_set_oxygen_min_threshold_s4_536(sensor_mac, value){
2460
+ value = value * 100;
2461
+ console.log('config_set_oxygen_min_threshold_s4_536');
2462
+ var packet = [244, 39, 0, 0, 0, 4];
2463
+ let value_ = int2Bytes(value, 2);
2464
+ packet.push(...value_);
2465
+ console.log(packet);
2466
+ return this.config_send(sensor_mac, packet);
2467
+ }
2468
+ config_set_axis_enabled_119(sensor_mac, value){
2469
+ console.log('config_set_axis_enabled_119');
2470
+ var packet = [244, 73, 0, 0, 0, value];
2471
+ console.log(packet);
2472
+ return this.config_send(sensor_mac, packet);
2473
+ }
2474
+ config_set_raw_acc_data_119(sensor_mac, value){
2475
+ console.log('config_set_raw_acc_data_119');
2476
+ var packet = [244, 71, 0, 0, 0, value];
2477
+ console.log(packet);
2478
+ return this.config_send(sensor_mac, packet);
2479
+ }
2248
2480
  config_get_delay(sensor_mac){
2249
2481
  return new Promise((fulfill, reject) => {
2250
2482
  this.config_send(sensor_mac, [247, 21, 0, 0, 0]).then((res) => {
@@ -8665,7 +8897,7 @@ function sensor_types(parent){
8665
8897
  }
8666
8898
  },
8667
8899
  'parse_fly': (frame) => {
8668
- if(frame[2] > 9){ // firmware 10 and above
8900
+ if(frame[2] == 19){ // Screen version fw 19
8669
8901
  let reset_mode = "Disabled";
8670
8902
  switch(frame[38]){
8671
8903
  case 0:
@@ -8678,40 +8910,40 @@ function sensor_types(parent){
8678
8910
  reset_mode = "Timeout";
8679
8911
  break;
8680
8912
  }
8681
- let acc_odr = "10Hz";
8913
+ let acc_odr = "10 Hz";
8682
8914
  switch(frame[40]){
8683
8915
  case 0:
8684
- acc_odr = "10Hz";
8916
+ acc_odr = "10 Hz";
8685
8917
  break;
8686
8918
  case 1:
8687
- acc_odr = "20Hz";
8919
+ acc_odr = "20 Hz";
8688
8920
  break;
8689
8921
  case 2:
8690
- acc_odr = "50Hz";
8922
+ acc_odr = "50 Hz";
8691
8923
  break;
8692
8924
  case 3:
8693
- acc_odr = "100Hz";
8925
+ acc_odr = "100 Hz";
8694
8926
  break;
8695
8927
  case 4:
8696
- acc_odr = "200Hz";
8928
+ acc_odr = "200 Hz";
8697
8929
  break;
8698
8930
  case 5:
8699
- acc_odr = "400Hz";
8931
+ acc_odr = "400 Hz";
8700
8932
  break;
8701
8933
  }
8702
- let rtc_sampling_interval = "5 seconds";
8934
+ let rtc_sampling_interval = "5 sec";
8703
8935
  switch(frame[39]){
8704
8936
  case 0:
8705
- rtc_sampling_interval = "1 minute";
8937
+ rtc_sampling_interval = "1 min";
8706
8938
  break;
8707
8939
  case 1:
8708
- rtc_sampling_interval = "5 minutes";
8940
+ rtc_sampling_interval = "5 min";
8709
8941
  break;
8710
8942
  case 2:
8711
- rtc_sampling_interval = "15 minutes";
8943
+ rtc_sampling_interval = "15 min";
8712
8944
  break;
8713
8945
  case 3:
8714
- rtc_sampling_interval = "30 minutes";
8946
+ rtc_sampling_interval = "30 min";
8715
8947
  break;
8716
8948
  case 4:
8717
8949
  rtc_sampling_interval = "1 hour";
@@ -8729,22 +8961,40 @@ function sensor_types(parent){
8729
8961
  rtc_sampling_interval = "12 hours";
8730
8962
  break;
8731
8963
  case 9:
8732
- rtc_sampling_interval = "5 seconds";
8964
+ rtc_sampling_interval = "5 sec";
8733
8965
  break;
8734
8966
  case 10:
8735
- rtc_sampling_interval = "10 seconds";
8967
+ rtc_sampling_interval = "10 sec";
8736
8968
  break;
8737
8969
  case 11:
8738
- rtc_sampling_interval = "15 seconds";
8970
+ rtc_sampling_interval = "15 sec";
8739
8971
  break;
8740
8972
  case 12:
8741
- rtc_sampling_interval = "30 seconds";
8973
+ rtc_sampling_interval = "30 sec";
8974
+ break;
8975
+ }
8976
+ let screen_control = 0;
8977
+ switch(frame[41]){
8978
+ case 0:
8979
+ screen_control = "IO1";
8980
+ break;
8981
+ case 1:
8982
+ screen_control = "IO2";
8983
+ break;
8984
+ case 2:
8985
+ screen_control = "IO3";
8986
+ break;
8987
+ case 3:
8988
+ screen_control = "Accelero";
8989
+ break;
8990
+ case 4:
8991
+ screen_control = "Magneto";
8742
8992
  break;
8743
8993
  }
8744
8994
  return {
8745
8995
  'firmware': frame[2],
8746
- 'accelerometer_threshold': (frame[16]* 32) + "mg",
8747
- 'debouncing_timeout': frame.slice(17, 19).reduce(msbLsb) + "msec",
8996
+ 'accelerometer_threshold': (frame[16]* 32) + " mg",
8997
+ 'debouncing_timeout': frame.slice(17, 19).reduce(msbLsb) + " msec",
8748
8998
  'accelero_state': frame[19]? "Enabled": "Disabled",
8749
8999
  'input_1_active_edge': frame[20]? "Rising": "Falling",
8750
9000
  'input_2_active_edge': frame[21]? "Rising": "Falling",
@@ -8767,13 +9017,16 @@ function sensor_types(parent){
8767
9017
  String(frame[34]).padStart(2, '0'),
8768
9018
  String(frame[35]).padStart(2, '0')
8769
9019
  ].join(':'),
8770
- 'reset_timeout': frame.slice(36, 38).reduce(msbLsb) + "min",
9020
+ 'reset_timeout': frame.slice(36, 38).reduce(msbLsb) + " min",
8771
9021
  'counter_reset_mode': reset_mode,
8772
9022
  'sampling_interval': rtc_sampling_interval,
8773
9023
  'acc_odr': acc_odr,
8774
- 'hardware_id': frame.slice(41, 44),
8775
- 'report_rate': frame.slice(44, 48).reduce(msbLsb) + "sec",
8776
- 'tx_life_counter': frame.slice(48, 52).reduce(msbLsb),
9024
+ 'screen_control': screen_control,
9025
+ 'screen_on_time': frame[42] + ' sec',
9026
+ 'interrupt_timeout': frame[43] + ' msec',
9027
+ 'hardware_id': frame.slice(44, 47),
9028
+ 'report_rate': frame.slice(47, 51).reduce(msbLsb) + " sec",
9029
+ 'tx_life_counter': frame.slice(51, 55).reduce(msbLsb),
8777
9030
  'machine_values': {
8778
9031
  'firmware': frame[2],
8779
9032
  'accelerometer_threshold': frame[16],
@@ -8792,14 +9045,17 @@ function sensor_types(parent){
8792
9045
  'counter_reset_mode': frame[38],
8793
9046
  'sampling_interval': frame[39],
8794
9047
  'acc_odr': frame[40],
8795
- 'hardware_id': frame.slice(41, 44),
8796
- 'report_rate': frame.slice(44, 48),
8797
- 'tx_life_counter': frame.slice(48, 52)
9048
+ 'screen_control': frame[41],
9049
+ 'screen_on_time': frame[42],
9050
+ 'interrupt_timeout': frame[43],
9051
+ 'hardware_id': frame.slice(44, 47),
9052
+ 'report_rate': frame.slice(47, 51),
9053
+ 'tx_life_counter': frame.slice(51, 55)
8798
9054
  }
8799
9055
  }
8800
- } else if(frame[2] > 8){
9056
+ } else if(frame[2] == 16){ // Screen version
8801
9057
  let reset_mode = "Disabled";
8802
- switch(frame[37]){
9058
+ switch(frame[38]){
8803
9059
  case 0:
8804
9060
  reset_mode = "Disabled";
8805
9061
  break;
@@ -8811,7 +9067,7 @@ function sensor_types(parent){
8811
9067
  break;
8812
9068
  }
8813
9069
  let acc_odr = "10Hz";
8814
- switch(frame[39]){
9070
+ switch(frame[40]){
8815
9071
  case 0:
8816
9072
  acc_odr = "10Hz";
8817
9073
  break;
@@ -8832,7 +9088,7 @@ function sensor_types(parent){
8832
9088
  break;
8833
9089
  }
8834
9090
  let rtc_sampling_interval = "5 seconds";
8835
- switch(frame[38]){
9091
+ switch(frame[39]){
8836
9092
  case 0:
8837
9093
  rtc_sampling_interval = "1 minute";
8838
9094
  break;
@@ -8873,97 +9129,217 @@ function sensor_types(parent){
8873
9129
  rtc_sampling_interval = "30 seconds";
8874
9130
  break;
8875
9131
  }
9132
+ let screen_control = 0;
9133
+ switch(frame[41]){
9134
+ case 0:
9135
+ screen_control = "IO1";
9136
+ break;
9137
+ case 1:
9138
+ screen_control = "IO2";
9139
+ break;
9140
+ case 2:
9141
+ screen_control = "IO3";
9142
+ break;
9143
+ case 3:
9144
+ screen_control = "Accelero";
9145
+ break;
9146
+ case 4:
9147
+ screen_control = "Magneto";
9148
+ break;
9149
+ }
8876
9150
  return {
8877
9151
  'firmware': frame[2],
8878
9152
  'accelerometer_threshold': (frame[16]* 32) + "mg",
8879
- 'debouncing_timeout': frame[17] + "msec",
8880
- 'accelero_state': frame[18]? "Enabled": "Disabled",
8881
- 'input_1_active_edge': frame[19]? "Rising": "Falling",
8882
- 'input_2_active_edge': frame[20]? "Rising": "Falling",
8883
- 'input_3_active_edge': frame[21]? "Rising": "Falling",
8884
- 'counter_threshold': frame.slice(22, 26).reduce(msbLsb),
8885
- 'trasnmit_on_change_status': frame[26]? "Enabled": "Disabled",
9153
+ 'debouncing_timeout': frame.slice(17, 19).reduce(msbLsb) + "msec",
9154
+ 'accelero_state': frame[19]? "Enabled": "Disabled",
9155
+ 'input_1_active_edge': frame[20]? "Rising": "Falling",
9156
+ 'input_2_active_edge': frame[21]? "Rising": "Falling",
9157
+ 'input_3_active_edge': frame[22]? "Rising": "Falling",
9158
+ 'counter_threshold': frame.slice(23, 27).reduce(msbLsb),
9159
+ 'trasnmit_on_change_status': frame[27]? "Enabled": "Disabled",
8886
9160
  'Shift_end_1': [
8887
- String(frame[27]).padStart(2, '0'),
8888
- String(frame[28]).padStart(2, '0')
9161
+ String(frame[28]).padStart(2, '0'),
9162
+ String(frame[29]).padStart(2, '0')
8889
9163
  ].join(':'),
8890
9164
  'Shift_end_2': [
8891
- String(frame[29]).padStart(2, '0'),
8892
- String(frame[30]).padStart(2, '0')
9165
+ String(frame[30]).padStart(2, '0'),
9166
+ String(frame[31]).padStart(2, '0')
8893
9167
  ].join(':'),
8894
9168
  'Shift_end_3': [
8895
- String(frame[31]).padStart(2, '0'),
8896
- String(frame[32]).padStart(2, '0')
9169
+ String(frame[32]).padStart(2, '0'),
9170
+ String(frame[33]).padStart(2, '0')
8897
9171
  ].join(':'),
8898
9172
  'Shift_end_4': [
8899
- String(frame[33]).padStart(2, '0'),
8900
- String(frame[34]).padStart(2, '0')
9173
+ String(frame[34]).padStart(2, '0'),
9174
+ String(frame[35]).padStart(2, '0')
8901
9175
  ].join(':'),
8902
- 'reset_timeout': frame.slice(35, 37).reduce(msbLsb) + "min",
9176
+ 'reset_timeout': frame.slice(36, 38).reduce(msbLsb) + "min",
8903
9177
  'counter_reset_mode': reset_mode,
8904
9178
  'sampling_interval': rtc_sampling_interval,
8905
9179
  'acc_odr': acc_odr,
8906
- 'hardware_id': frame.slice(40, 43),
8907
- 'report_rate': frame.slice(43, 47).reduce(msbLsb) + "sec",
8908
- 'tx_life_counter': frame.slice(47, 51).reduce(msbLsb),
9180
+ 'screen_control': screen_control,
9181
+ 'screen_on_time': frame[42] + 'sec',
9182
+ 'hardware_id': frame.slice(43, 46),
9183
+ 'report_rate': frame.slice(46, 50).reduce(msbLsb) + "sec",
9184
+ 'tx_life_counter': frame.slice(50, 54).reduce(msbLsb),
8909
9185
  'machine_values': {
8910
9186
  'firmware': frame[2],
8911
9187
  'accelerometer_threshold': frame[16],
8912
- 'debouncing_timeout': frame[17],
8913
- 'accelero_state': frame[18],
8914
- 'input_1_active_edge': frame[19],
8915
- 'input_2_active_edge': frame[20],
8916
- 'input_3_active_edge': frame[21],
8917
- 'counter_threshold': frame.slice(22, 26),
8918
- 'trasnmit_on_change_status': frame[26],
8919
- 'Shift_end_1': frame.slice(27, 29),
8920
- 'Shift_end_2': frame.slice(29, 31),
8921
- 'Shift_end_3': frame.slice(31, 33),
8922
- 'Shift_end_4': frame.slice(33, 35),
8923
- 'reset_timeout': frame.slice(35, 37),
8924
- 'counter_reset_mode': frame[37],
8925
- 'sampling_interval': frame[38],
8926
- 'acc_odr': frame[39],
8927
- 'hardware_id': frame.slice(40, 43),
8928
- 'report_rate': frame.slice(43, 47),
8929
- 'tx_life_counter': frame.slice(47, 51)
9188
+ 'debouncing_timeout': frame.slice(17, 19),
9189
+ 'accelero_state': frame[19],
9190
+ 'input_1_active_edge': frame[20],
9191
+ 'input_2_active_edge': frame[21],
9192
+ 'input_3_active_edge': frame[22],
9193
+ 'counter_threshold': frame.slice(23, 27),
9194
+ 'trasnmit_on_change_status': frame[27],
9195
+ 'Shift_end_1': frame.slice(28, 30),
9196
+ 'Shift_end_2': frame.slice(30, 32),
9197
+ 'Shift_end_3': frame.slice(32, 34),
9198
+ 'Shift_end_4': frame.slice(34, 36),
9199
+ 'reset_timeout': frame.slice(36, 38),
9200
+ 'counter_reset_mode': frame[38],
9201
+ 'sampling_interval': frame[39],
9202
+ 'acc_odr': frame[40],
9203
+ 'screen_control': frame[41],
9204
+ 'screen_on_time': frame[42],
9205
+ 'hardware_id': frame.slice(43, 46),
9206
+ 'report_rate': frame.slice(46, 50),
9207
+ 'tx_life_counter': frame.slice(50, 54)
8930
9208
  }
8931
9209
  }
8932
- } else{
8933
- return {
8934
- 'firmware': frame[2],
8935
- 'report_rate': frame.slice(12, 16).reduce(msbLsb).toString() + "sec.",
8936
- 'accelerometer_threshold': (frame[16]* 32) + "mg.",
8937
- 'debouncing_timeout': frame[17].toString() + "msec.",
8938
- 'accelero_state': frame[18],
8939
- 'digital_inputs_active_edge': frame.slice(19, 22).reduce(msbLsb),
8940
- 'counter_threshold': frame.slice(22, 26).reduce(msbLsb),
8941
- 'trasnmit_on_change_status': frame[26],
9210
+ } else if(frame[2] > 9){ // firmware 10 11 12 13 14 15
9211
+ let reset_mode = "Disabled";
9212
+ switch(frame[38]){
9213
+ case 0:
9214
+ reset_mode = "Disabled";
9215
+ break;
9216
+ case 1:
9217
+ reset_mode = "Shift Ends";
9218
+ break;
9219
+ case 2:
9220
+ reset_mode = "Timeout";
9221
+ break;
9222
+ }
9223
+ let acc_odr = "10Hz";
9224
+ switch(frame[40]){
9225
+ case 0:
9226
+ acc_odr = "10Hz";
9227
+ break;
9228
+ case 1:
9229
+ acc_odr = "20Hz";
9230
+ break;
9231
+ case 2:
9232
+ acc_odr = "50Hz";
9233
+ break;
9234
+ case 3:
9235
+ acc_odr = "100Hz";
9236
+ break;
9237
+ case 4:
9238
+ acc_odr = "200Hz";
9239
+ break;
9240
+ case 5:
9241
+ acc_odr = "400Hz";
9242
+ break;
9243
+ }
9244
+ let rtc_sampling_interval = "5 seconds";
9245
+ switch(frame[39]){
9246
+ case 0:
9247
+ rtc_sampling_interval = "1 minute";
9248
+ break;
9249
+ case 1:
9250
+ rtc_sampling_interval = "5 minutes";
9251
+ break;
9252
+ case 2:
9253
+ rtc_sampling_interval = "15 minutes";
9254
+ break;
9255
+ case 3:
9256
+ rtc_sampling_interval = "30 minutes";
9257
+ break;
9258
+ case 4:
9259
+ rtc_sampling_interval = "1 hour";
9260
+ break;
9261
+ case 5:
9262
+ rtc_sampling_interval = "2 hours";
9263
+ break;
9264
+ case 6:
9265
+ rtc_sampling_interval = "3 hours";
9266
+ break;
9267
+ case 7:
9268
+ rtc_sampling_interval = "6 hours";
9269
+ break;
9270
+ case 8:
9271
+ rtc_sampling_interval = "12 hours";
9272
+ break;
9273
+ case 9:
9274
+ rtc_sampling_interval = "5 seconds";
9275
+ break;
9276
+ case 10:
9277
+ rtc_sampling_interval = "10 seconds";
9278
+ break;
9279
+ case 11:
9280
+ rtc_sampling_interval = "15 seconds";
9281
+ break;
9282
+ case 12:
9283
+ rtc_sampling_interval = "30 seconds";
9284
+ break;
9285
+ }
9286
+ return {
9287
+ 'firmware': frame[2],
9288
+ 'accelerometer_threshold': (frame[16]* 32) + "mg",
9289
+ 'debouncing_timeout': frame.slice(17, 19).reduce(msbLsb) + "msec",
9290
+ 'accelero_state': frame[19]? "Enabled": "Disabled",
9291
+ 'input_1_active_edge': frame[20]? "Rising": "Falling",
9292
+ 'input_2_active_edge': frame[21]? "Rising": "Falling",
9293
+ 'input_3_active_edge': frame[22]? "Rising": "Falling",
9294
+ 'counter_threshold': frame.slice(23, 27).reduce(msbLsb),
9295
+ 'trasnmit_on_change_status': frame[27]? "Enabled": "Disabled",
9296
+ 'Shift_end_1': [
9297
+ String(frame[28]).padStart(2, '0'),
9298
+ String(frame[29]).padStart(2, '0')
9299
+ ].join(':'),
9300
+ 'Shift_end_2': [
9301
+ String(frame[30]).padStart(2, '0'),
9302
+ String(frame[31]).padStart(2, '0')
9303
+ ].join(':'),
9304
+ 'Shift_end_3': [
9305
+ String(frame[32]).padStart(2, '0'),
9306
+ String(frame[33]).padStart(2, '0')
9307
+ ].join(':'),
9308
+ 'Shift_end_4': [
9309
+ String(frame[34]).padStart(2, '0'),
9310
+ String(frame[35]).padStart(2, '0')
9311
+ ].join(':'),
9312
+ 'reset_timeout': frame.slice(36, 38).reduce(msbLsb) + "min",
9313
+ 'counter_reset_mode': reset_mode,
9314
+ 'sampling_interval': rtc_sampling_interval,
9315
+ 'acc_odr': acc_odr,
9316
+ 'hardware_id': frame.slice(41, 44),
9317
+ 'report_rate': frame.slice(44, 48).reduce(msbLsb) + "sec",
9318
+ 'tx_life_counter': frame.slice(48, 52).reduce(msbLsb),
8942
9319
  'machine_values': {
8943
9320
  'firmware': frame[2],
8944
- 'report_rate': frame.slice(12, 16),
8945
9321
  'accelerometer_threshold': frame[16],
8946
- 'debouncing_timeout': frame[17],
8947
- 'accelero_active_state': frame[18],
8948
- 'digital_inputs_active_edge': frame.slice(19, 22),
8949
- 'counter_threshold': frame.slice(22, 26),
8950
- 'trasnmit_on_change_status': frame[26]
9322
+ 'debouncing_timeout': frame.slice(17, 19),
9323
+ 'accelero_state': frame[19],
9324
+ 'input_1_active_edge': frame[20],
9325
+ 'input_2_active_edge': frame[21],
9326
+ 'input_3_active_edge': frame[22],
9327
+ 'counter_threshold': frame.slice(23, 27),
9328
+ 'trasnmit_on_change_status': frame[27],
9329
+ 'Shift_end_1': frame.slice(28, 30),
9330
+ 'Shift_end_2': frame.slice(30, 32),
9331
+ 'Shift_end_3': frame.slice(32, 34),
9332
+ 'Shift_end_4': frame.slice(34, 36),
9333
+ 'reset_timeout': frame.slice(36, 38),
9334
+ 'counter_reset_mode': frame[38],
9335
+ 'sampling_interval': frame[39],
9336
+ 'acc_odr': frame[40],
9337
+ 'hardware_id': frame.slice(41, 44),
9338
+ 'report_rate': frame.slice(44, 48),
9339
+ 'tx_life_counter': frame.slice(48, 52)
8951
9340
  }
8952
9341
  }
8953
- }
8954
- }
8955
- },
8956
- '109': {
8957
- name: 'Wireless Custom Solar Sensor',
8958
- parse: (d) => {
8959
- return {
8960
- illuminance: d.slice(0, 4).reduce(msbLsb),
8961
- total_solar_radiation: d.slice(4, 6).reduce(msbLsb),
8962
- ultraviolet_radiation: d.slice(6, 8).reduce(msbLsb)
8963
- };
8964
- },
8965
- 'parse_fly': (frame) => {
8966
- if(frame[2] > 8){
9342
+ } else if(frame[2] > 8){
8967
9343
  let reset_mode = "Disabled";
8968
9344
  switch(frame[37]){
8969
9345
  case 0:
@@ -9042,12 +9418,12 @@ function sensor_types(parent){
9042
9418
  return {
9043
9419
  'firmware': frame[2],
9044
9420
  'accelerometer_threshold': (frame[16]* 32) + "mg",
9045
- 'debouncing_timeout': frame[17] + "sec",
9421
+ 'debouncing_timeout': frame[17] + "msec",
9046
9422
  'accelero_state': frame[18]? "Enabled": "Disabled",
9047
9423
  'input_1_active_edge': frame[19]? "Rising": "Falling",
9048
9424
  'input_2_active_edge': frame[20]? "Rising": "Falling",
9049
9425
  'input_3_active_edge': frame[21]? "Rising": "Falling",
9050
- 'counter_threshold': frame.slice(22, 26).reduce(msbLsb) + "sec",
9426
+ 'counter_threshold': frame.slice(22, 26).reduce(msbLsb),
9051
9427
  'trasnmit_on_change_status': frame[26]? "Enabled": "Disabled",
9052
9428
  'Shift_end_1': [
9053
9429
  String(frame[27]).padStart(2, '0'),
@@ -9099,11 +9475,11 @@ function sensor_types(parent){
9099
9475
  return {
9100
9476
  'firmware': frame[2],
9101
9477
  'report_rate': frame.slice(12, 16).reduce(msbLsb).toString() + "sec.",
9102
- 'accelerometer_threshold': (frame[16]* 32).toString() + "mg.",
9103
- 'debouncing_timeout': frame[17].toString() + "sec.",
9478
+ 'accelerometer_threshold': (frame[16]* 32) + "mg.",
9479
+ 'debouncing_timeout': frame[17].toString() + "msec.",
9104
9480
  'accelero_state': frame[18],
9105
9481
  'digital_inputs_active_edge': frame.slice(19, 22).reduce(msbLsb),
9106
- 'counter_threshold': frame.slice(22, 26).reduce(msbLsb).toString() + "sec.",
9482
+ 'counter_threshold': frame.slice(22, 26).reduce(msbLsb),
9107
9483
  'trasnmit_on_change_status': frame[26],
9108
9484
  'machine_values': {
9109
9485
  'firmware': frame[2],
@@ -9129,88 +9505,254 @@ function sensor_types(parent){
9129
9505
  };
9130
9506
  },
9131
9507
  'parse_fly': (frame) => {
9132
- return {
9133
- 'firmware': frame[2],
9134
- 'hardware_id': frame.slice(12, 15),
9135
- 'sample_rate': frame.slice(15, 19).reduce(msbLsb) + " Sec.",
9136
- 'tx_life_counter': frame.slice(19, 23).reduce(msbLsb),
9137
- 'machine_values': {
9138
- 'firmware': frame[2],
9139
- 'hardware_id': frame.slice(12, 15),
9140
- 'sample_rate': frame.slice(15, 19).reduce(msbLsb),
9141
- 'tx_life_counter': frame.slice(19, 23).reduce(msbLsb)
9508
+ if(frame[2] > 8){
9509
+ let reset_mode = "Disabled";
9510
+ switch(frame[37]){
9511
+ case 0:
9512
+ reset_mode = "Disabled";
9513
+ break;
9514
+ case 1:
9515
+ reset_mode = "Shift Ends";
9516
+ break;
9517
+ case 2:
9518
+ reset_mode = "Timeout";
9519
+ break;
9142
9520
  }
9143
- }
9144
- }
9145
- },
9146
- '110': {
9147
- name: 'One Channel Vibration Plus v4',
9148
- parse: (payload, parsed, mac) => {
9149
- if(payload[7] & 2){
9150
- console.log('Error found');
9151
- parsed.data = {error: 'Error found, Sensor Probe may be unattached'};
9152
- return parsed;
9153
- }
9154
- let msg_type = (payload[7] & 16)? 'motion' : 'regular';
9155
- if(payload[8] === 1){
9156
- var deviceAddr = mac;
9157
- var firmware = payload[1];
9158
- var hour = payload[12];
9159
- var minute = payload[13];
9160
- var expected_packets = msbLsb(payload[16], payload[17]);
9161
- var current_packet = msbLsb(payload[18], payload[19]);
9162
- var sdata_start = 20;
9163
-
9164
- if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
9165
- if(expected_packets != 1){
9166
- // if a packet is already stored with the same packet ID, or if packet ID is 1, or if current packet ID is not one more than last packet ID
9167
- if(current_packet in globalDevices[deviceAddr].data || current_packet == 1 || !(((current_packet)-1) in globalDevices[deviceAddr].data)) {
9168
- console.log('-----');
9169
- console.log('bad packet breakdown deleting stream');
9170
- console.log(current_packet);
9171
- console.log(expected_packets);
9172
- console.log(current_packet in globalDevices[deviceAddr].data);
9173
- console.log(current_packet == 1);
9174
- console.log(!((current_packet-1) in globalDevices[deviceAddr].data));
9175
- if(this.hasOwnProperty('failure_no')){
9176
- this.failure_no = this.failure_no + 1;
9177
- }
9178
- else{
9179
- this.failure_no = 1;
9180
- }
9181
- if(this.hasOwnProperty('failure_no')){
9182
- console.log('####falure no');
9183
- console.log(this.failure_no);
9184
- }
9185
- // console.log(globalDevices[deviceAddr].data);
9186
- delete globalDevices[deviceAddr];
9187
- if(current_packet != 1){
9188
- return;
9189
- } else{
9190
-
9191
- var mode = payload[8];
9192
- var odr = msbLsb(payload[9], payload[10]);
9193
- var fsr = payload[11] >> 5;
9194
- var temperature = msbLsb(payload[14], payload[15])/100;
9195
-
9196
- globalDevices[deviceAddr] = {
9197
- // stream_size: expected_packets,
9198
- data: {},
9199
- odr: odr,
9200
- mo: mode,
9201
- fsr: fsr,
9202
- hour: hour,
9203
- minute: minute,
9204
- temperature: temperature,
9205
- }
9206
- globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
9207
- return;
9208
- }
9209
- }
9210
- else{
9211
- globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
9212
- }
9213
- }
9521
+ let acc_odr = "10Hz";
9522
+ switch(frame[39]){
9523
+ case 0:
9524
+ acc_odr = "10Hz";
9525
+ break;
9526
+ case 1:
9527
+ acc_odr = "20Hz";
9528
+ break;
9529
+ case 2:
9530
+ acc_odr = "50Hz";
9531
+ break;
9532
+ case 3:
9533
+ acc_odr = "100Hz";
9534
+ break;
9535
+ case 4:
9536
+ acc_odr = "200Hz";
9537
+ break;
9538
+ case 5:
9539
+ acc_odr = "400Hz";
9540
+ break;
9541
+ }
9542
+ let rtc_sampling_interval = "5 seconds";
9543
+ switch(frame[38]){
9544
+ case 0:
9545
+ rtc_sampling_interval = "1 minute";
9546
+ break;
9547
+ case 1:
9548
+ rtc_sampling_interval = "5 minutes";
9549
+ break;
9550
+ case 2:
9551
+ rtc_sampling_interval = "15 minutes";
9552
+ break;
9553
+ case 3:
9554
+ rtc_sampling_interval = "30 minutes";
9555
+ break;
9556
+ case 4:
9557
+ rtc_sampling_interval = "1 hour";
9558
+ break;
9559
+ case 5:
9560
+ rtc_sampling_interval = "2 hours";
9561
+ break;
9562
+ case 6:
9563
+ rtc_sampling_interval = "3 hours";
9564
+ break;
9565
+ case 7:
9566
+ rtc_sampling_interval = "6 hours";
9567
+ break;
9568
+ case 8:
9569
+ rtc_sampling_interval = "12 hours";
9570
+ break;
9571
+ case 9:
9572
+ rtc_sampling_interval = "5 seconds";
9573
+ break;
9574
+ case 10:
9575
+ rtc_sampling_interval = "10 seconds";
9576
+ break;
9577
+ case 11:
9578
+ rtc_sampling_interval = "15 seconds";
9579
+ break;
9580
+ case 12:
9581
+ rtc_sampling_interval = "30 seconds";
9582
+ break;
9583
+ }
9584
+ return {
9585
+ 'firmware': frame[2],
9586
+ 'accelerometer_threshold': (frame[16]* 32) + "mg",
9587
+ 'debouncing_timeout': frame[17] + "sec",
9588
+ 'accelero_state': frame[18]? "Enabled": "Disabled",
9589
+ 'input_1_active_edge': frame[19]? "Rising": "Falling",
9590
+ 'input_2_active_edge': frame[20]? "Rising": "Falling",
9591
+ 'input_3_active_edge': frame[21]? "Rising": "Falling",
9592
+ 'counter_threshold': frame.slice(22, 26).reduce(msbLsb) + "sec",
9593
+ 'trasnmit_on_change_status': frame[26]? "Enabled": "Disabled",
9594
+ 'Shift_end_1': [
9595
+ String(frame[27]).padStart(2, '0'),
9596
+ String(frame[28]).padStart(2, '0')
9597
+ ].join(':'),
9598
+ 'Shift_end_2': [
9599
+ String(frame[29]).padStart(2, '0'),
9600
+ String(frame[30]).padStart(2, '0')
9601
+ ].join(':'),
9602
+ 'Shift_end_3': [
9603
+ String(frame[31]).padStart(2, '0'),
9604
+ String(frame[32]).padStart(2, '0')
9605
+ ].join(':'),
9606
+ 'Shift_end_4': [
9607
+ String(frame[33]).padStart(2, '0'),
9608
+ String(frame[34]).padStart(2, '0')
9609
+ ].join(':'),
9610
+ 'reset_timeout': frame.slice(35, 37).reduce(msbLsb) + "min",
9611
+ 'counter_reset_mode': reset_mode,
9612
+ 'sampling_interval': rtc_sampling_interval,
9613
+ 'acc_odr': acc_odr,
9614
+ 'hardware_id': frame.slice(40, 43),
9615
+ 'report_rate': frame.slice(43, 47).reduce(msbLsb) + "sec",
9616
+ 'tx_life_counter': frame.slice(47, 51).reduce(msbLsb),
9617
+ 'machine_values': {
9618
+ 'firmware': frame[2],
9619
+ 'accelerometer_threshold': frame[16],
9620
+ 'debouncing_timeout': frame[17],
9621
+ 'accelero_state': frame[18],
9622
+ 'input_1_active_edge': frame[19],
9623
+ 'input_2_active_edge': frame[20],
9624
+ 'input_3_active_edge': frame[21],
9625
+ 'counter_threshold': frame.slice(22, 26),
9626
+ 'trasnmit_on_change_status': frame[26],
9627
+ 'Shift_end_1': frame.slice(27, 29),
9628
+ 'Shift_end_2': frame.slice(29, 31),
9629
+ 'Shift_end_3': frame.slice(31, 33),
9630
+ 'Shift_end_4': frame.slice(33, 35),
9631
+ 'reset_timeout': frame.slice(35, 37),
9632
+ 'counter_reset_mode': frame[37],
9633
+ 'sampling_interval': frame[38],
9634
+ 'acc_odr': frame[39],
9635
+ 'hardware_id': frame.slice(40, 43),
9636
+ 'report_rate': frame.slice(43, 47),
9637
+ 'tx_life_counter': frame.slice(47, 51)
9638
+ }
9639
+ }
9640
+ } else{
9641
+ return {
9642
+ 'firmware': frame[2],
9643
+ 'report_rate': frame.slice(12, 16).reduce(msbLsb).toString() + "sec.",
9644
+ 'accelerometer_threshold': (frame[16]* 32).toString() + "mg.",
9645
+ 'debouncing_timeout': frame[17].toString() + "sec.",
9646
+ 'accelero_state': frame[18],
9647
+ 'digital_inputs_active_edge': frame.slice(19, 22).reduce(msbLsb),
9648
+ 'counter_threshold': frame.slice(22, 26).reduce(msbLsb).toString() + "sec.",
9649
+ 'trasnmit_on_change_status': frame[26],
9650
+ 'machine_values': {
9651
+ 'firmware': frame[2],
9652
+ 'report_rate': frame.slice(12, 16),
9653
+ 'accelerometer_threshold': frame[16],
9654
+ 'debouncing_timeout': frame[17],
9655
+ 'accelero_active_state': frame[18],
9656
+ 'digital_inputs_active_edge': frame.slice(19, 22),
9657
+ 'counter_threshold': frame.slice(22, 26),
9658
+ 'trasnmit_on_change_status': frame[26]
9659
+ }
9660
+ }
9661
+ }
9662
+ }
9663
+ },
9664
+ '109': {
9665
+ name: 'Wireless Custom Solar Sensor',
9666
+ parse: (d) => {
9667
+ return {
9668
+ illuminance: d.slice(0, 4).reduce(msbLsb),
9669
+ total_solar_radiation: d.slice(4, 6).reduce(msbLsb),
9670
+ ultraviolet_radiation: d.slice(6, 8).reduce(msbLsb)
9671
+ };
9672
+ },
9673
+ 'parse_fly': (frame) => {
9674
+ return {
9675
+ 'firmware': frame[2],
9676
+ 'hardware_id': frame.slice(12, 15),
9677
+ 'sample_rate': frame.slice(15, 19).reduce(msbLsb) + " Sec.",
9678
+ 'tx_life_counter': frame.slice(19, 23).reduce(msbLsb),
9679
+ 'machine_values': {
9680
+ 'firmware': frame[2],
9681
+ 'hardware_id': frame.slice(12, 15),
9682
+ 'sample_rate': frame.slice(15, 19).reduce(msbLsb),
9683
+ 'tx_life_counter': frame.slice(19, 23).reduce(msbLsb)
9684
+ }
9685
+ }
9686
+ }
9687
+ },
9688
+ '110': {
9689
+ name: 'One Channel Vibration Plus v4',
9690
+ parse: (payload, parsed, mac) => {
9691
+ if(payload[7] & 2){
9692
+ console.log('Error found');
9693
+ parsed.data = {error: 'Error found, Sensor Probe may be unattached'};
9694
+ return parsed;
9695
+ }
9696
+ let msg_type = (payload[7] & 16)? 'motion' : 'regular';
9697
+ if(payload[8] === 1){
9698
+ var deviceAddr = mac;
9699
+ var firmware = payload[1];
9700
+ var hour = payload[12];
9701
+ var minute = payload[13];
9702
+ var expected_packets = msbLsb(payload[16], payload[17]);
9703
+ var current_packet = msbLsb(payload[18], payload[19]);
9704
+ var sdata_start = 20;
9705
+
9706
+ if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
9707
+ if(expected_packets != 1){
9708
+ // if a packet is already stored with the same packet ID, or if packet ID is 1, or if current packet ID is not one more than last packet ID
9709
+ if(current_packet in globalDevices[deviceAddr].data || current_packet == 1 || !(((current_packet)-1) in globalDevices[deviceAddr].data)) {
9710
+ console.log('-----');
9711
+ console.log('bad packet breakdown deleting stream');
9712
+ console.log(current_packet);
9713
+ console.log(expected_packets);
9714
+ console.log(current_packet in globalDevices[deviceAddr].data);
9715
+ console.log(current_packet == 1);
9716
+ console.log(!((current_packet-1) in globalDevices[deviceAddr].data));
9717
+ if(this.hasOwnProperty('failure_no')){
9718
+ this.failure_no = this.failure_no + 1;
9719
+ }
9720
+ else{
9721
+ this.failure_no = 1;
9722
+ }
9723
+ if(this.hasOwnProperty('failure_no')){
9724
+ console.log('####falure no');
9725
+ console.log(this.failure_no);
9726
+ }
9727
+ // console.log(globalDevices[deviceAddr].data);
9728
+ delete globalDevices[deviceAddr];
9729
+ if(current_packet != 1){
9730
+ return;
9731
+ } else{
9732
+
9733
+ var mode = payload[8];
9734
+ var odr = msbLsb(payload[9], payload[10]);
9735
+ var fsr = payload[11] >> 5;
9736
+ var temperature = msbLsb(payload[14], payload[15])/100;
9737
+
9738
+ globalDevices[deviceAddr] = {
9739
+ // stream_size: expected_packets,
9740
+ data: {},
9741
+ odr: odr,
9742
+ mo: mode,
9743
+ fsr: fsr,
9744
+ hour: hour,
9745
+ minute: minute,
9746
+ temperature: temperature,
9747
+ }
9748
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
9749
+ return;
9750
+ }
9751
+ }
9752
+ else{
9753
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
9754
+ }
9755
+ }
9214
9756
  else{
9215
9757
  var mode = payload[8];
9216
9758
  var odr = msbLsb(payload[9], payload[10]);
@@ -12125,10 +12667,10 @@ function sensor_types(parent){
12125
12667
  name: 'Dual Pressure and Temperature Sensor',
12126
12668
  parse: (d) => {
12127
12669
  return{
12128
- pressure_s1: signInt(d.slice(0, 4).reduce(msbLsb)) / 100,
12129
- temperature_s1: signInt(d.slice(4, 6).reduce(msbLsb))/100,
12130
- pressure_s2: signInt(d.slice(6, 10).reduce(msbLsb)) / 100,
12131
- temperature_s2: signInt(d.slice(10, 12).reduce(msbLsb))/100
12670
+ pressure_s1: signInt(d.slice(0, 4).reduce(msbLsb),16)/100,
12671
+ temperature_s1: signInt(d.slice(4, 6).reduce(msbLsb),16)/100,
12672
+ pressure_s2: signInt(d.slice(6, 10).reduce(msbLsb),16)/100,
12673
+ temperature_s2: signInt(d.slice(10, 12).reduce(msbLsb),16)/100
12132
12674
  };
12133
12675
  },
12134
12676
  'parse_fly': (frame) => {
@@ -12204,27 +12746,300 @@ function sensor_types(parent){
12204
12746
  }
12205
12747
  }
12206
12748
  },
12207
- '120': {
12208
- name: 'Wireless H2S Sensor',
12209
- parse: (d) => {
12210
- return {
12211
- ppm: d.slice(0, 2).reduce(msbLsb),
12212
- temperature: signInt(d.slice(2, 4).reduce(msbLsb), 16) / 100,
12213
- humidity: signInt(d.slice(4, 6).reduce(msbLsb), 16) / 100
12214
- };
12215
- },
12216
- 'parse_fly': (frame) => {
12217
- return {
12218
- 'firmware': frame[2],
12219
- 'h2s_threshold': frame[12],
12220
- 'always_on_status': frame[13],
12221
- 'hardware_id': frame.slice(14, 17),
12222
- 'sample_rate': frame.slice(17, 21).reduce(msbLsb) + " Sec.",
12223
- 'tx_life_counter': frame.slice(21, 25).reduce(msbLsb),
12224
- 'machine_values': {
12225
- 'firmware': frame[2],
12226
- 'h2s threshold': frame[12],
12227
- 'always_on_status': frame[13],
12749
+ '119': {
12750
+ name: 'Wireless Machine Run Time Hour Meter',
12751
+ parse: (d, payload) => {
12752
+ let firmware = payload[1];
12753
+ if(payload[7] & 2 != 0){
12754
+ console.log('Error found');
12755
+ // parsed.data = {error: 'Error found, Acclerometer Probe may be unattached'};
12756
+ let error = {error: 'Error found, Acclerometer Probe may be unattached'};
12757
+ return error;
12758
+ }
12759
+ let report_type = "Regular";
12760
+ switch(d[17]){
12761
+ case 0:
12762
+ report_type = "Regular";
12763
+ break;
12764
+ case 1:
12765
+ report_type = "Shift end";
12766
+ break;
12767
+ case 2:
12768
+ report_type = "Interrupt";
12769
+ break;
12770
+ case 3:
12771
+ report_type = "Threshold";
12772
+ break;
12773
+ }
12774
+ if ((payload[7] & 4) != 0) {
12775
+ return {
12776
+ raw_data: "Enabled",
12777
+ accelerometer_counter: d.slice(0, 4).reduce(msbLsb),
12778
+ accelerometer_uptime: d.slice(4, 8).reduce(msbLsb),
12779
+ magnetometer_counter: d.slice(8, 12).reduce(msbLsb),
12780
+ magnetometer_uptime: d.slice(12, 16).reduce(msbLsb),
12781
+ input_acc: d[16] & 8 ? 1 : 0,
12782
+ input_mag: d[16] & 16 ? 1 : 0,
12783
+ report_type: report_type,
12784
+ rtc: [
12785
+ String(d[18]).padStart(2, '0'),
12786
+ String(d[19]).padStart(2, '0'),
12787
+ String(d[20]).padStart(2, '0')
12788
+ ].join(':'),
12789
+ 'temperature': d.slice(21, 23).reduce(msbLsb)/100,
12790
+ 'accelero_sample_1':{
12791
+ x:[signInt(d.slice(23, 25).reduce(msbLsb),16)/100],
12792
+ y:[signInt(d.slice(25, 27).reduce(msbLsb),16)/100],
12793
+ z:[signInt(d.slice(27, 29).reduce(msbLsb),16)/100]
12794
+ },
12795
+ 'accelero_sample_2':{
12796
+ x:[signInt(d.slice(29, 31).reduce(msbLsb),16)/100],
12797
+ y:[signInt(d.slice(31, 33).reduce(msbLsb),16)/100],
12798
+ z:[signInt(d.slice(33, 35).reduce(msbLsb),16)/100]
12799
+ },
12800
+ 'accelero_sample_3':{
12801
+ x:[signInt(d.slice(35, 37).reduce(msbLsb),16)/100],
12802
+ y:[signInt(d.slice(37, 39).reduce(msbLsb),16)/100],
12803
+ z:[signInt(d.slice(39, 41).reduce(msbLsb),16)/100]
12804
+ },
12805
+ 'accelero_sample_4':{
12806
+ x:[signInt(d.slice(41, 43).reduce(msbLsb),16)/100],
12807
+ y:[signInt(d.slice(43, 45).reduce(msbLsb),16)/100],
12808
+ z:[signInt(d.slice(45, 47).reduce(msbLsb),16)/100]
12809
+ },
12810
+ 'accelero_sample_5':{
12811
+ x:[signInt(d.slice(47, 49).reduce(msbLsb),16)/100],
12812
+ y:[signInt(d.slice(49, 51).reduce(msbLsb),16)/100],
12813
+ z:[signInt(d.slice(51, 53).reduce(msbLsb),16)/100]
12814
+ },
12815
+ 'accelero_sample_6':{
12816
+ x:[signInt(d.slice(53, 55).reduce(msbLsb),16)/100],
12817
+ y:[signInt(d.slice(55, 57).reduce(msbLsb),16)/100],
12818
+ z:[signInt(d.slice(57, 59).reduce(msbLsb),16)/100]
12819
+ },
12820
+ 'accelero_sample_7':{
12821
+ x:[signInt(d.slice(59, 61).reduce(msbLsb),16)/100],
12822
+ y:[signInt(d.slice(61, 63).reduce(msbLsb),16)/100],
12823
+ z:[signInt(d.slice(63, 65).reduce(msbLsb),16)/100]
12824
+ },
12825
+ 'accelero_sample_8':{
12826
+ x:[signInt(d.slice(65, 67).reduce(msbLsb),16)/100],
12827
+ y:[signInt(d.slice(67, 69).reduce(msbLsb),16)/100],
12828
+ z:[signInt(d.slice(69, 71).reduce(msbLsb),16)/100]
12829
+ },
12830
+ 'accelero_sample_9':{
12831
+ x:[signInt(d.slice(71, 73).reduce(msbLsb),16)/100],
12832
+ y:[signInt(d.slice(73, 75).reduce(msbLsb),16)/100],
12833
+ z:[signInt(d.slice(75, 77).reduce(msbLsb),16)/100]
12834
+ },
12835
+ 'accelero_sample_10':{
12836
+ x:[signInt(d.slice(77, 79).reduce(msbLsb),16)/100],
12837
+ y:[signInt(d.slice(79, 81).reduce(msbLsb),16)/100],
12838
+ z:[signInt(d.slice(81, 83).reduce(msbLsb),16)/100]
12839
+ }
12840
+ };
12841
+ }else{
12842
+ return {
12843
+ raw_data: "Disabled",
12844
+ accelerometer_counter: d.slice(0, 4).reduce(msbLsb),
12845
+ accelerometer_uptime: d.slice(4, 8).reduce(msbLsb),
12846
+ magnetometer_counter: d.slice(8, 12).reduce(msbLsb),
12847
+ magnetometer_uptime: d.slice(12, 16).reduce(msbLsb),
12848
+ input_acc: d[16] & 8 ? 1 : 0,
12849
+ input_mag: d[16] & 16 ? 1 : 0,
12850
+ report_type: report_type,
12851
+ rtc: [
12852
+ String(d[18]).padStart(2, '0'),
12853
+ String(d[19]).padStart(2, '0'),
12854
+ String(d[20]).padStart(2, '0')
12855
+ ].join(':'),
12856
+ 'temperature': d.slice(21, 23).reduce(msbLsb)/100
12857
+ };
12858
+ }
12859
+ },
12860
+ 'parse_fly': (frame) => {
12861
+ let reset_mode = "Disabled";
12862
+ switch(frame[35]){
12863
+ case 0:
12864
+ reset_mode = "Disabled";
12865
+ break;
12866
+ case 1:
12867
+ reset_mode = "Shift Ends";
12868
+ break;
12869
+ case 2:
12870
+ reset_mode = "Timeout";
12871
+ break;
12872
+ }
12873
+ let acc_odr = "10 Hz";
12874
+ switch(frame[37]){
12875
+ case 0:
12876
+ acc_odr = "10 Hz";
12877
+ break;
12878
+ case 1:
12879
+ acc_odr = "20 Hz";
12880
+ break;
12881
+ case 2:
12882
+ acc_odr = "50 Hz";
12883
+ break;
12884
+ case 3:
12885
+ acc_odr = "100 Hz";
12886
+ break;
12887
+ case 4:
12888
+ acc_odr = "200 Hz";
12889
+ break;
12890
+ case 5:
12891
+ acc_odr = "400 Hz";
12892
+ break;
12893
+ }
12894
+ let rtc_sampling_interval = "5 sec";
12895
+ switch(frame[36]){
12896
+ case 0:
12897
+ rtc_sampling_interval = "1 min";
12898
+ break;
12899
+ case 1:
12900
+ rtc_sampling_interval = "5 min";
12901
+ break;
12902
+ case 2:
12903
+ rtc_sampling_interval = "15 min";
12904
+ break;
12905
+ case 3:
12906
+ rtc_sampling_interval = "30 min";
12907
+ break;
12908
+ case 4:
12909
+ rtc_sampling_interval = "1 hour";
12910
+ break;
12911
+ case 5:
12912
+ rtc_sampling_interval = "2 hours";
12913
+ break;
12914
+ case 6:
12915
+ rtc_sampling_interval = "3 hours";
12916
+ break;
12917
+ case 7:
12918
+ rtc_sampling_interval = "6 hours";
12919
+ break;
12920
+ case 8:
12921
+ rtc_sampling_interval = "12 hours";
12922
+ break;
12923
+ case 9:
12924
+ rtc_sampling_interval = "5 sec";
12925
+ break;
12926
+ case 10:
12927
+ rtc_sampling_interval = "10 sec";
12928
+ break;
12929
+ case 11:
12930
+ rtc_sampling_interval = "15 sec";
12931
+ break;
12932
+ case 12:
12933
+ rtc_sampling_interval = "30 sec";
12934
+ break;
12935
+ }
12936
+ let acc_enabled_axis = 'Disabled All';
12937
+ switch(frame[40]){
12938
+ case 0:
12939
+ acc_enabled_axis = 'Disabled All';
12940
+ break;
12941
+ case 1:
12942
+ acc_enabled_axis = 'x axis';
12943
+ break;
12944
+ case 2:
12945
+ acc_enabled_axis = 'y axis';
12946
+ break;
12947
+ case 3:
12948
+ acc_enabled_axis = 'z axis';
12949
+ break;
12950
+ case 7:
12951
+ acc_enabled_axis = 'all axis';
12952
+ break;
12953
+ }
12954
+ return {
12955
+ 'firmware': frame[2],
12956
+ 'accelerometer_threshold': (frame[16]* 32) + " mg",
12957
+ 'debouncing_timeout': frame.slice(17, 19).reduce(msbLsb) + " msec",
12958
+ 'accelero_state': frame[19]? "Enabled": "Disabled",
12959
+ 'counter_threshold': frame.slice(20, 24).reduce(msbLsb),
12960
+ 'trasnmit_on_change_status': frame[24]? "Enabled": "Disabled",
12961
+ 'Shift_end_1': [
12962
+ String(frame[25]).padStart(2, '0'),
12963
+ String(frame[26]).padStart(2, '0')
12964
+ ].join(':'),
12965
+ 'Shift_end_2': [
12966
+ String(frame[27]).padStart(2, '0'),
12967
+ String(frame[28]).padStart(2, '0')
12968
+ ].join(':'),
12969
+ 'Shift_end_3': [
12970
+ String(frame[29]).padStart(2, '0'),
12971
+ String(frame[30]).padStart(2, '0')
12972
+ ].join(':'),
12973
+ 'Shift_end_4': [
12974
+ String(frame[31]).padStart(2, '0'),
12975
+ String(frame[32]).padStart(2, '0')
12976
+ ].join(':'),
12977
+ 'reset_timeout': frame.slice(33, 35).reduce(msbLsb) + " min",
12978
+ 'counter_reset_mode': reset_mode,
12979
+ 'sampling_interval': rtc_sampling_interval,
12980
+ 'acc_odr': acc_odr,
12981
+ 'interrupt_timeout': frame.slice(38, 40).reduce(msbLsb) + ' msec',
12982
+ 'acc_enabled_axis': acc_enabled_axis,
12983
+ 'hardware_id': frame.slice(41, 44),
12984
+ 'report_rate': frame.slice(44, 48).reduce(msbLsb) + " sec",
12985
+ 'tx_life_counter': frame.slice(48, 52).reduce(msbLsb),
12986
+ 'machine_values': {
12987
+ 'firmware': frame[2],
12988
+ 'accelerometer_threshold': (frame[16]* 32),
12989
+ 'debouncing_timeout': frame.slice(17, 19),
12990
+ 'accelero_state': frame[19],
12991
+ 'counter_threshold': frame.slice(20, 24),
12992
+ 'trasnmit_on_change_status': frame[24],
12993
+ 'Shift_end_1': [
12994
+ frame[25],
12995
+ frame[26]
12996
+ ],
12997
+ 'Shift_end_2': [
12998
+ frame[27],
12999
+ frame[28]
13000
+ ],
13001
+ 'Shift_end_3': [
13002
+ frame[29],
13003
+ frame[30]
13004
+ ],
13005
+ 'Shift_end_4': [
13006
+ frame[31],
13007
+ frame[32]
13008
+ ],
13009
+ 'reset_timeout': frame.slice(33, 35),
13010
+ 'counter_reset_mode': frame[35],
13011
+ 'sampling_interval': frame[36],
13012
+ 'acc_odr': frame[37],
13013
+ 'interrupt_timeout': frame.slice(38, 40),
13014
+ 'acc_enabled_axis': frame[40],
13015
+ 'hardware_id': frame.slice(41, 44),
13016
+ 'report_rate': frame.slice(44, 48),
13017
+ 'tx_life_counter': frame.slice(48, 52)
13018
+ }
13019
+ }
13020
+ }
13021
+ },
13022
+ '120': {
13023
+ name: 'Wireless H2S Sensor',
13024
+ parse: (d) => {
13025
+ return {
13026
+ ppm: d.slice(0, 2).reduce(msbLsb),
13027
+ temperature: signInt(d.slice(2, 4).reduce(msbLsb), 16) / 100,
13028
+ humidity: signInt(d.slice(4, 6).reduce(msbLsb), 16) / 100
13029
+ };
13030
+ },
13031
+ 'parse_fly': (frame) => {
13032
+ return {
13033
+ 'firmware': frame[2],
13034
+ 'h2s_threshold': frame[12],
13035
+ 'always_on_status': frame[13],
13036
+ 'hardware_id': frame.slice(14, 17),
13037
+ 'sample_rate': frame.slice(17, 21).reduce(msbLsb) + " Sec.",
13038
+ 'tx_life_counter': frame.slice(21, 25).reduce(msbLsb),
13039
+ 'machine_values': {
13040
+ 'firmware': frame[2],
13041
+ 'h2s threshold': frame[12],
13042
+ 'always_on_status': frame[13],
12228
13043
  'hardware_id': frame.slice(14, 17),
12229
13044
  'sample_rate': frame.slice(17, 21).reduce(msbLsb),
12230
13045
  'tx_life_counter': frame.slice(21, 25).reduce(msbLsb)
@@ -12302,7 +13117,7 @@ function sensor_types(parent){
12302
13117
  'firmware': frame[2],
12303
13118
  'fsr': frame_data.fsr,
12304
13119
  'boot_time': frame[17] + " sec",
12305
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
13120
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
12306
13121
  'auto_check_interval': frame_data.auto_check_interval,
12307
13122
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
12308
13123
  'always_on': frame_data[24] ? 'Enabled' : 'Disabled',
@@ -12316,7 +13131,7 @@ function sensor_types(parent){
12316
13131
  'firmware': frame[2],
12317
13132
  'fsr': frame[16],
12318
13133
  'boot_time': frame[17],
12319
- 'power_adc': frame.slice(18, 20),
13134
+ 'adc_pin_reading': frame.slice(18, 20),
12320
13135
  'auto_check_interval': frame.slice(20, 22),
12321
13136
  'auto_check_percentage': frame.slice(22, 24),
12322
13137
  'always_on': frame[24],
@@ -12485,9 +13300,10 @@ function sensor_types(parent){
12485
13300
  'reset_timeout': frame.slice(34, 36).reduce(msbLsb) + "min",
12486
13301
  'counter_reset_mode': reset_mode,
12487
13302
  'sampling_interval': rtc_sampling_interval,
12488
- 'hardware_id': frame.slice(38, 41),
12489
- 'report_rate': frame.slice(41, 45).reduce(msbLsb) + "sec",
12490
- 'tx_life_counter': frame.slice(45, 49).reduce(msbLsb),
13303
+ 'interrupt_timeout': frame.slice(38, 40).reduce(msbLsb) + "msec",
13304
+ 'hardware_id': frame.slice(40, 43),
13305
+ 'report_rate': frame.slice(43, 47).reduce(msbLsb) + "sec",
13306
+ 'tx_life_counter': frame.slice(47, 51).reduce(msbLsb),
12491
13307
  'machine_values': {
12492
13308
  'firmware': frame[2],
12493
13309
  'debouncing_timeout': frame.slice(16, 18),
@@ -12503,185 +13319,639 @@ function sensor_types(parent){
12503
13319
  'reset_timeout': frame.slice(34, 36),
12504
13320
  'counter_reset_mode': frame[36],
12505
13321
  'sampling_interval': frame[37],
12506
- 'hardware_id': frame.slice(38, 41),
12507
- 'report_rate': frame.slice(41, 45),
12508
- 'tx_life_counter': frame.slice(45, 49)
13322
+ 'interrupt_timeout': frame.slice(38, 40),
13323
+ 'hardware_id': frame.slice(40, 43),
13324
+ 'report_rate': frame.slice(43, 47),
13325
+ 'tx_life_counter': frame.slice(47, 51)
12509
13326
  }
12510
13327
  }
12511
13328
  }
12512
13329
  },
12513
- '180': {
12514
- name: 'C1D2 One Channel Vibration Plus',
12515
- parse: (payload, parsed, mac) => {
12516
- return parent.sensor_types[80].parse(payload, parsed, mac);
12517
- },
12518
- parse_fly: (payload, parsed, mac) => {
12519
- return parent.sensor_types[80].parse_fly(payload, parsed, mac);
12520
- },
12521
- },
12522
- '181': {
12523
- name: 'C1D2 Two Channel Vibration Plus',
12524
- parse: (payload, parsed, mac) => {
12525
- return parent.sensor_types[81].parse(payload, parsed, mac);
12526
- },
12527
- parse_fly: (payload, parsed, mac) => {
12528
- return parent.sensor_types[81].parse_fly(payload, parsed, mac);
12529
- },
12530
- },
12531
- '200': {
12532
- name: '4-20mA Pass Through',
13330
+ '124': {
13331
+ name: 'Wireless EH Flow Sensor',
12533
13332
  parse: (d) => {
12534
- var adc1 = signInt(d.slice(0, 2).reduce(msbLsb));
12535
- var adc2 = signInt(d.slice(2, 4).reduce(msbLsb));
12536
- var dac1 = signInt(d.slice(4, 6).reduce(msbLsb));
12537
- return {
12538
- adc1: adc1,
12539
- adc2: adc2,
12540
- dac1: dac1,
12541
- mA1: parseFloat((adc1/100.00).toFixed(2)),
12542
- raw_adc: adc2,
12543
- raw_dac: dac1
12544
- };
12545
- }
12546
- },
12547
- '202': {
12548
- name: 'Wireless Weather Station',
12549
- parse: (payload, parsed, mac) => {
12550
13333
  return {
12551
- Temp: signInt(payload.slice(8, 12).reduce(msbLsb), 32) / 100,
12552
- Humid: signInt(payload.slice(12, 16).reduce(msbLsb), 32) / 100,
12553
- Pressure: signInt(payload.slice(16, 20).reduce(msbLsb), 32) / 100,
12554
- WindSpd: signInt(payload.slice(20, 24).reduce(msbLsb),32) / 100,
12555
- WindDir: signInt(payload.slice(24, 28).reduce(msbLsb),32) / 100,
12556
- reserve: payload[7]
12557
- };
12558
- }
12559
- },
12560
- '211': {
12561
- name: 'D0 and Flow Sensor',
12562
- parse: (payload, parsed, mac) => {
12563
- if(payload[0] == 0){ // regular
12564
- return {
12565
- msg_type: 'regular',
12566
- temperature: signInt(payload.slice(1, 3).reduce(msbLsb), 16),
12567
- oxygen_saturation_percent: payload.slice(3, 7).reduce(msbLsb),
12568
- oxygen_ppm: payload.slice(7, 11).reduce(msbLsb),
12569
- oxygen_mg_l: payload.slice(11, 15).reduce(msbLsb)
12570
- };
12571
- }
12572
- else{ // theshold
12573
- let solenoid_status = payload[2];
12574
- if(solenoid_status == 1){ // Solenoid On
12575
- return {
12576
- msg_type: 'threshold',
12577
- solenoid_number: payload[1],
12578
- solenoid_status: 'on',
12579
- temperature: signInt(payload.slice(3, 5).reduce(msbLsb), 16),
12580
- oxygen_saturation_percent: payload.slice(5, 9).reduce(msbLsb),
12581
- oxygen_ppm: payload.slice(9, 13).reduce(msbLsb),
12582
- oxygen_mg_l: payload.slice(13, 17).reduce(msbLsb),
12583
- flow_rate: payload.slice(17, 21).reduce(msbLsb)
12584
- };
12585
- } else{ // Solenoid Off
12586
- return {
12587
- msg_type: 'threshold',
12588
- solenoid_number: payload[1],
12589
- solenoid_status: 'off',
12590
- temperature: signInt(payload.slice(3, 5).reduce(msbLsb), 16),
12591
- oxygen_saturation_percent: payload.slice(5, 9).reduce(msbLsb),
12592
- oxygen_ppm: payload.slice(9, 13).reduce(msbLsb),
12593
- oxygen_mg_l: payload.slice(13, 17).reduce(msbLsb)
12594
- };
12595
- }
12596
- }
12597
- },
12598
- 'parse_fly': (frame) => {
12599
- return {
12600
- 'firmware': frame[2],
12601
- 'hardware_id': frame.slice(12, 15),
12602
- 'report_rate': frame.slice(15, 19).reduce(msbLsb) + "Sec",
12603
- 'tx_life_counter': frame.slice(19, 23).reduce(msbLsb),
12604
- 'machine_values': {
12605
- 'firmware': frame[2],
12606
- 'hardware_id': frame.slice(12, 15),
12607
- 'report_rate': frame.slice(15, 19),
12608
- 'tx_life_counter': frame.slice(19, 23)
12609
- }
12610
- }
12611
- }
12612
- },
12613
- '217': {
12614
- name: 'Wireless Weight Scale',
12615
- parse: (d) => {
12616
- return {
12617
- weight: signInt(d.slice(0, 4).reduce(msbLsb)) / 100
12618
- };
12619
- }
12620
- },
12621
- '270': {
12622
- name: 'Custom Salinity DO sensor',
12623
- parse: (d) => {
12624
- return {
12625
- sensor_status: d[0],
12626
- do_temperature_1: d.slice(1, 3).reduce(msbLsb) / 100,
12627
- do_temperature_2: d.slice(3, 5).reduce(msbLsb) / 100,
12628
- do_temperature_3: d.slice(5, 7).reduce(msbLsb) / 100,
12629
- do_temperature_4: d.slice(7, 9).reduce(msbLsb) / 100,
12630
- ec_temperature_1: d.slice(9, 11).reduce(msbLsb) / 100,
12631
- ec_temperature_2: d.slice(11, 13).reduce(msbLsb) / 100,
12632
- ec_temperature_3: d.slice(13, 15).reduce(msbLsb) / 100,
12633
- ec_temperature_4: d.slice(15, 17).reduce(msbLsb) / 100,
12634
- do_saturation_perc_1: d.slice(17, 19).reduce(msbLsb) / 100,
12635
- do_saturation_perc_2: d.slice(19, 21).reduce(msbLsb) / 100,
12636
- do_saturation_perc_3: d.slice(21, 23).reduce(msbLsb) / 100,
12637
- do_saturation_perc_4: d.slice(23, 25).reduce(msbLsb) / 100,
12638
- do_ppm_1: d.slice(25, 27).reduce(msbLsb) / 100,
12639
- do_ppm_2: d.slice(27, 29).reduce(msbLsb) / 100,
12640
- do_ppm_3: d.slice(29, 31).reduce(msbLsb) / 100,
12641
- do_ppm_4: d.slice(31, 33).reduce(msbLsb) / 100,
12642
- do_mgl_1: d.slice(33, 35).reduce(msbLsb) / 100,
12643
- do_mgl_2: d.slice(35, 37).reduce(msbLsb) / 100,
12644
- do_mgl_3: d.slice(37, 39).reduce(msbLsb) / 100,
12645
- do_mgl_4: d.slice(39, 41).reduce(msbLsb) / 100,
12646
- ec_conductivity_1: d.slice(41, 43).reduce(msbLsb) / 100,
12647
- ec_conductivity_2: d.slice(43, 45).reduce(msbLsb) / 100,
12648
- ec_conductivity_3: d.slice(45, 47).reduce(msbLsb) / 100,
12649
- ec_conductivity_4: d.slice(47, 49).reduce(msbLsb) / 100,
12650
- ec_salinity_ppt_1: d.slice(49, 57).reduce(msbLsb) / 100,
12651
- ec_salinity_ppt_2: d.slice(57, 65).reduce(msbLsb) / 100,
12652
- ec_salinity_ppt_3: d.slice(65, 73).reduce(msbLsb) / 100,
12653
- ec_salinity_ppt_4: d.slice(73, 81).reduce(msbLsb) / 100,
12654
- ec_tds_1: d.slice(81, 85).reduce(msbLsb) / 100,
12655
- ec_tds_2: d.slice(85, 89).reduce(msbLsb) / 100,
12656
- ec_tds_3: d.slice(89, 93).reduce(msbLsb) / 100,
12657
- ec_tds_4: d.slice(93, 97).reduce(msbLsb) / 100
13334
+ volume_flow: signInt(d.slice(0, 4).reduce(msbLsb), 32) / 100,
13335
+ conductivity: d.slice(4, 8).reduce(msbLsb),
13336
+ flow_velocity: signInt(d.slice(8, 12).reduce(msbLsb), 32) / 100,
13337
+ pressure: signInt(d.slice(12, 16).reduce(msbLsb),32) / 100,
13338
+ // WARNING doesn't handle decimal values and will round to whole number.
13339
+ total_flow_1: d.slice(16, 24).reduce(msbLsb_to_SignedInt, 0n) / BigInt(100),
13340
+ total_flow_2: d.slice(24, 32).reduce(msbLsb_to_SignedInt, 0n) / BigInt(100),
13341
+ total_flow_3: d.slice(32, 40).reduce(msbLsb_to_SignedInt, 0n) / BigInt(100),
13342
+ battery_life: d.slice(40, 42).reduce(msbLsb),
13343
+ battery_state: d[42],
13344
+ total_flow_1_raw: d.slice(16, 24),
13345
+ total_flow_2_raw: d.slice(24, 32),
13346
+ total_flow_3_raw: d.slice(32, 40)
12658
13347
  };
12659
13348
  },
12660
13349
  'parse_fly': (frame) => {
13350
+ let frame_data = {};
13351
+ switch(frame[12]){
13352
+ case 0:
13353
+ frame_data.flow_unit = 'cm³/s';
13354
+ break;
13355
+ case 1:
13356
+ frame_data.flow_unit = 'cm³/min';
13357
+ break;
13358
+ case 2:
13359
+ frame_data.flow_unit = 'cm³/h';
13360
+ break;
13361
+ case 3:
13362
+ frame_data.flow_unit = 'cm³/d';
13363
+ break;
13364
+ case 4:
13365
+ frame_data.flow_unit = 'dm³/s';
13366
+ break;
13367
+ case 5:
13368
+ frame_data.flow_unit = 'dm³/min';
13369
+ break;
13370
+ case 6:
13371
+ frame_data.flow_unit = 'dm³/h';
13372
+ break;
13373
+ case 7:
13374
+ frame_data.flow_unit = 'dm³/d';
13375
+ break;
13376
+ case 8:
13377
+ frame_data.flow_unit = 'm³/s';
13378
+ break;
13379
+ case 9:
13380
+ frame_data.flow_unit = 'm³/min';
13381
+ break;
13382
+ case 10:
13383
+ frame_data.flow_unit = 'm³/h';
13384
+ break;
13385
+ case 11:
13386
+ frame_data.flow_unit = 'm³/d';
13387
+ break;
13388
+ case 12:
13389
+ frame_data.flow_unit = 'ml/s';
13390
+ break;
13391
+ case 13:
13392
+ frame_data.flow_unit = 'ml/min';
13393
+ break;
13394
+ case 14:
13395
+ frame_data.flow_unit = 'ml/h';
13396
+ break;
13397
+ case 15:
13398
+ frame_data.flow_unit = 'ml/d';
13399
+ break;
13400
+ case 16:
13401
+ unitStrframe_data.flow_uniting = 'l/s';
13402
+ break;
13403
+ case 17:
13404
+ frame_data.flow_unit = 'l/min';
13405
+ break;
13406
+ case 18:
13407
+ frame_data.flow_unit = 'l/h';
13408
+ break;
13409
+ case 19:
13410
+ frame_data.flow_unit = 'l/d';
13411
+ break;
13412
+ case 20:
13413
+ frame_data.flow_unit = 'hl/s';
13414
+ break;
13415
+ case 21:
13416
+ frame_data.flow_unit = 'hl/min';
13417
+ break;
13418
+ case 22:
13419
+ frame_data.flow_unit = 'hl/h';
13420
+ break;
13421
+ case 23:
13422
+ frame_data.flow_unit = 'hl/d';
13423
+ break;
13424
+ case 24:
13425
+ frame_data.flow_unit = 'Ml/s';
13426
+ break;
13427
+ case 25:
13428
+ frame_data.flow_unit = 'Ml/min';
13429
+ break;
13430
+ case 26:
13431
+ frame_data.flow_unit = 'Ml/h';
13432
+ break;
13433
+ case 27:
13434
+ frame_data.flow_unit = 'Ml/d';
13435
+ break;
13436
+
13437
+ // US Customary & Imperial Flow Rates
13438
+ case 32:
13439
+ frame_data.flow_unit = 'af/s';
13440
+ break;
13441
+ case 33:
13442
+ frame_data.flow_unit = 'af/min';
13443
+ break;
13444
+ case 34:
13445
+ frame_data.flow_unit = 'af/h';
13446
+ break;
13447
+ case 35:
13448
+ frame_data.flow_unit = 'af/d';
13449
+ break;
13450
+ case 36:
13451
+ frame_data.flow_unit = 'ft³/s';
13452
+ break;
13453
+ case 37:
13454
+ frame_data.flow_unit = 'ft³/min';
13455
+ break;
13456
+ case 38:
13457
+ frame_data.flow_unit = 'ft³/h';
13458
+ break;
13459
+ case 39:
13460
+ frame_data.flow_unit = 'ft³/d';
13461
+ break;
13462
+ case 40:
13463
+ frame_data.flow_unit = 'fl oz/s (us)';
13464
+ break;
13465
+ case 41:
13466
+ frame_data.flow_unit = 'fl oz/min (us)';
13467
+ break;
13468
+ case 42:
13469
+ frame_data.flow_unit = 'fl oz/h (us)';
13470
+ break;
13471
+ case 43:
13472
+ frame_data.flow_unit = 'fl oz/d (us)';
13473
+ break;
13474
+ case 44:
13475
+ frame_data.flow_unit = 'gal/s (us)';
13476
+ break;
13477
+ case 45:
13478
+ frame_data.flow_unit = 'gal/min (us)';
13479
+ break;
13480
+ case 46:
13481
+ frame_data.flow_unit = 'gal/h (us)';
13482
+ break;
13483
+ case 47:
13484
+ frame_data.flow_unit = 'gal/d (us)';
13485
+ break;
13486
+ case 48:
13487
+ frame_data.flow_unit = 'Mgal/s (us)';
13488
+ break;
13489
+ case 49:
13490
+ frame_data.flow_unit = 'Mgal/min (us)';
13491
+ break;
13492
+ case 50:
13493
+ frame_data.flow_unit = 'Mgal/h (us)';
13494
+ break;
13495
+ case 51:
13496
+ frame_data.flow_unit = 'Mgal/d (us)';
13497
+ break;
13498
+ case 52:
13499
+ frame_data.flow_unit = 'bbl/s (us;liq.)';
13500
+ break;
13501
+ case 53:
13502
+ frame_data.flow_unit = 'bbl/min (us;liq.)';
13503
+ break;
13504
+ case 54:
13505
+ frame_data.flow_unit = 'bbl/h (us;liq.)';
13506
+ break;
13507
+ case 55:
13508
+ frame_data.flow_unit = 'bbl/d (us;liq.)';
13509
+ break;
13510
+ case 56:
13511
+ frame_data.flow_unit = 'bbl/s (us;beer)';
13512
+ break;
13513
+ case 57:
13514
+ frame_data.flow_unit = 'bbl/min (us;beer)';
13515
+ break;
13516
+ case 58:
13517
+ frame_data.flow_unit = 'bbl/h (us;beer)';
13518
+ break;
13519
+ case 59:
13520
+ frame_data.flow_unit = 'bbl/d (us;beer)';
13521
+ break;
13522
+ case 60:
13523
+ frame_data.flow_unit = 'bbl/s (us;oil)';
13524
+ break;
13525
+ case 61:
13526
+ frame_data.flow_unit = 'bbl/min (us;oil)';
13527
+ break;
13528
+ case 62:
13529
+ frame_data.flow_unit = 'bbl/h (us;oil)';
13530
+ break;
13531
+ case 63:
13532
+ frame_data.flow_unit = 'bbl/d (us;oil)';
13533
+ break;
13534
+ case 64:
13535
+ frame_data.flow_unit = 'bbl/s (us;tank)';
13536
+ break;
13537
+ case 65:
13538
+ frame_data.flow_unit = 'bbl/min (us;tank)';
13539
+ break;
13540
+ case 66:
13541
+ frame_data.flow_unit = 'bbl/h (us;tank)';
13542
+ break;
13543
+ case 67:
13544
+ frame_data.flow_unit = 'bbl/d (us;tank)';
13545
+ break;
13546
+ case 68:
13547
+ frame_data.flow_unit = 'gal/s (imp)';
13548
+ break;
13549
+ case 69:
13550
+ frame_data.flow_unit = 'gal/min (imp)';
13551
+ break;
13552
+ case 70:
13553
+ frame_data.flow_unit = 'gal/h (imp)';
13554
+ break;
13555
+ case 71:
13556
+ frame_data.flow_unit = 'gal/d (imp)';
13557
+ break;
13558
+ case 72:
13559
+ frame_data.flow_unit = 'Mgal/s (imp)';
13560
+ break;
13561
+ case 73:
13562
+ frame_data.flow_unit = 'Mgal/min (imp)';
13563
+ break;
13564
+ case 74:
13565
+ frame_data.flow_unit = 'Mgal/h (imp)';
13566
+ break;
13567
+ case 75:
13568
+ frame_data.flow_unit = 'Mgal/d (imp)';
13569
+ break;
13570
+ case 76:
13571
+ frame_data.flow_unit = 'bbl/s (imp;beer)';
13572
+ break;
13573
+ case 77:
13574
+ frame_data.flow_unit = 'bbl/min (imp;beer)';
13575
+ break;
13576
+ case 78:
13577
+ frame_data.flow_unit = 'bbl/h (imp;beer)';
13578
+ break;
13579
+ case 79:
13580
+ frame_data.flow_unit = 'bbl/d (imp;beer)';
13581
+ break;
13582
+ case 80:
13583
+ frame_data.flow_unit = 'bbl/s (imp;oil)';
13584
+ break;
13585
+ case 81:
13586
+ frame_data.flow_unit = 'bbl/min (imp;oil)';
13587
+ break;
13588
+ case 82:
13589
+ frame_data.flow_unit = 'bbl/h (imp;oil)';
13590
+ break;
13591
+ case 83:
13592
+ frame_data.flow_unit = 'bbl/d (imp;oil)';
13593
+ break;
13594
+ case 88:
13595
+ frame_data.flow_unit = 'kgal/s (us)';
13596
+ break;
13597
+ case 89:
13598
+ frame_data.flow_unit = 'kgal/min (us)';
13599
+ break;
13600
+ case 90:
13601
+ frame_data.flow_unit = 'kgal/h (us)';
13602
+ break;
13603
+ case 91:
13604
+ frame_data.flow_unit = 'kgal/d (us)';
13605
+ break;
13606
+ case 92:
13607
+ frame_data.flow_unit = 'MMft³/s';
13608
+ break;
13609
+ case 93:
13610
+ frame_data.flow_unit = 'MMft³/min';
13611
+ break;
13612
+ case 94:
13613
+ frame_data.flow_unit = 'MMft³/h';
13614
+ break;
13615
+ case 96:
13616
+ frame_data.flow_unit = 'Mft³/d';
13617
+ break;
13618
+ }
13619
+ switch(frame[13]){
13620
+ case 0:
13621
+ frame_data.pressure_unit = 'bar';
13622
+ break;
13623
+ case 1:
13624
+ frame_data.pressure_unit = 'psi a';
13625
+ break;
13626
+ case 2:
13627
+ frame_data.pressure_unit = 'bar g';
13628
+ break;
13629
+ case 3:
13630
+ frame_data.pressure_unit = 'psi g';
13631
+ break;
13632
+ case 4:
13633
+ frame_data.pressure_unit = 'Pa a';
13634
+ break;
13635
+ case 5:
13636
+ frame_data.pressure_unit = 'kPa a';
13637
+ break;
13638
+ case 6:
13639
+ frame_data.pressure_unit = 'MPa a';
13640
+ break;
13641
+ case 7:
13642
+ frame_data.pressure_unit = 'Pa g';
13643
+ break;
13644
+ case 8:
13645
+ frame_data.pressure_unit = 'kPa g';
13646
+ break;
13647
+ case 9:
13648
+ frame_data.pressure_unit = 'MPa g';
13649
+ break;
13650
+ }
13651
+ switch(frame[14]){
13652
+ case 1:
13653
+ frame_data.conductivity_unit = 'MS/m';
13654
+ break;
13655
+ case 2:
13656
+ frame_data.conductivity_unit = 'kS/m';
13657
+ break;
13658
+ case 3:
13659
+ frame_data.conductivity_unit = 'S/m';
13660
+ break;
13661
+ case 4:
13662
+ frame_data.conductivity_unit = 'S/cm';
13663
+ break;
13664
+ case 5:
13665
+ frame_data.conductivity_unit = 'mS/m';
13666
+ break;
13667
+ case 6:
13668
+ frame_data.conductivity_unit = 'mS/cm';
13669
+ break;
13670
+ case 7:
13671
+ frame_data.conductivity_unit = 'μS/m';
13672
+ break;
13673
+ case 8:
13674
+ frame_data.conductivity_unit = 'μS/cm';
13675
+ break;
13676
+ case 9:
13677
+ frame_data.conductivity_unit = 'μS/mm';
13678
+ break;
13679
+ case 10:
13680
+ frame_data.conductivity_unit = 'nS/cm';
13681
+ break;
13682
+ }
13683
+
13684
+ frame_data.totalizer_unit = [];
13685
+
13686
+ for (let index = 0; index < 3; index++) {
13687
+ switch(frame[index + 15]){
13688
+ case 0:
13689
+ frame_data.totalizer_unit[index] = 'cm³';
13690
+ break;
13691
+ case 1:
13692
+ frame_data.totalizer_unit[index] = 'dm³';
13693
+ break;
13694
+ case 2:
13695
+ frame_data.totalizer_unit[index] = 'm³';
13696
+ break;
13697
+ case 3:
13698
+ frame_data.totalizer_unit[index] = 'ml';
13699
+ break;
13700
+ case 4:
13701
+ frame_data.totalizer_unit[index] = 'l';
13702
+ break;
13703
+ case 5:
13704
+ frame_data.totalizer_unit[index] = 'hl';
13705
+ break;
13706
+ case 6:
13707
+ frame_data.totalizer_unit[index] = 'Ml Mega';
13708
+ break;
13709
+ case 8:
13710
+ frame_data.totalizer_unit[index] = 'af';
13711
+ break;
13712
+ case 9:
13713
+ frame_data.totalizer_unit[index] = 'ft³';
13714
+ break;
13715
+ case 10:
13716
+ frame_data.totalizer_unit[index] = 'fl oz (us)';
13717
+ break;
13718
+ case 11:
13719
+ frame_data.totalizer_unit[index] = 'gal (us)';
13720
+ break;
13721
+ case 12:
13722
+ frame_data.totalizer_unit[index] = 'Mgal (us)';
13723
+ break;
13724
+ case 13:
13725
+ frame_data.totalizer_unit[index] = 'bbl (us;liq.)';
13726
+ break;
13727
+ case 14:
13728
+ frame_data.totalizer_unit[index] = 'bbl (us;beer)';
13729
+ break;
13730
+ case 15:
13731
+ frame_data.totalizer_unit[index] = 'bbl (us;oil)';
13732
+ break;
13733
+ case 16:
13734
+ frame_data.totalizer_unit[index] = 'bbl (us;tank)';
13735
+ break;
13736
+ case 17:
13737
+ frame_data.totalizer_unit[index] = 'gal (imp)';
13738
+ break;
13739
+ case 18:
13740
+ frame_data.totalizer_unit[index] = 'Mgal (imp)';
13741
+ break;
13742
+ case 19:
13743
+ frame_data.totalizer_unit[index] = 'bbl (imp;beer)';
13744
+ break;
13745
+ case 20:
13746
+ frame_data.totalizer_unit[index] = 'bbl (imp;oil)';
13747
+ break;
13748
+ case 22:
13749
+ frame_data.totalizer_unit[index] = 'kgal (us)';
13750
+ break;
13751
+ case 23:
13752
+ frame_data.totalizer_unit[index] = 'Mft³';
13753
+ break;
13754
+ }
13755
+
13756
+ }
12661
13757
  return {
12662
13758
  'firmware': frame[2],
12663
- 'do_bootup_time': frame[12] + "Sec",
12664
- 'ec_bootup_time': frame[13] + "Sec",
12665
- 'device_ids_do_sensors': frame.slice(14, 18),
12666
- 'device_ids_ec_sensors': frame.slice(18, 22),
12667
- 'hardware_id': frame.slice(22, 25),
12668
- 'report_rate': frame.slice(25, 29).reduce(msbLsb) + "Sec",
12669
- 'tx_life_counter': frame.slice(29, 33).reduce(msbLsb),
13759
+ 'flow_unit': frame_data.flow_unit,
13760
+ 'pressure_unit': frame_data.pressure_unit,
13761
+ 'conductivity_unit': frame_data.conductivity_unit,
13762
+ 'totalizer_1_unit': frame_data.totalizer_unit[0],
13763
+ 'totalizer_2_unit': frame_data.totalizer_unit[1],
13764
+ 'totalizer_3_unit': frame_data.totalizer_unit[2],
13765
+ 'hardware_id': frame.slice(18, 21),
13766
+ 'sample_rate': frame.slice(21, 25).reduce(msbLsb),
13767
+ 'tx_life_counter': frame.slice(25, 29).reduce(msbLsb),
12670
13768
  'machine_values': {
12671
13769
  'firmware': frame[2],
12672
- 'do_bootup_time': frame[12],
12673
- 'ec_bootup_time': frame[13],
12674
- 'device_ids_do_sensors': frame.slice(14, 18),
12675
- 'device_ids_ec_sensors': frame.slice(18, 22),
12676
- 'hardware_id': frame.slice(22, 25),
12677
- 'report_rate': frame.slice(25, 29),
12678
- 'tx_life_counter': frame.slice(29, 33)
13770
+ 'flow_unit': frame[12],
13771
+ 'pressure_unit': frame[13],
13772
+ 'conductivity_unit': frame[14],
13773
+ 'totalizer_1_unit': frame[15],
13774
+ 'totalizer_2_unit': frame[16],
13775
+ 'totalizer_3_unit': frame[17],
13776
+ 'hardware_id': frame.slice(18, 21),
13777
+ 'sample_rate': frame.slice(21, 25),
13778
+ 'tx_life_counter': frame.slice(25, 29)
12679
13779
  }
12680
13780
  }
12681
13781
  }
12682
13782
  },
12683
- '502': {
12684
- name: 'Custom Environmental Sensor',
13783
+ '180': {
13784
+ name: 'C1D2 One Channel Vibration Plus',
13785
+ parse: (payload, parsed, mac) => {
13786
+ return parent.sensor_types[80].parse(payload, parsed, mac);
13787
+ },
13788
+ parse_fly: (payload, parsed, mac) => {
13789
+ return parent.sensor_types[80].parse_fly(payload, parsed, mac);
13790
+ },
13791
+ },
13792
+ '181': {
13793
+ name: 'C1D2 Two Channel Vibration Plus',
13794
+ parse: (payload, parsed, mac) => {
13795
+ return parent.sensor_types[81].parse(payload, parsed, mac);
13796
+ },
13797
+ parse_fly: (payload, parsed, mac) => {
13798
+ return parent.sensor_types[81].parse_fly(payload, parsed, mac);
13799
+ },
13800
+ },
13801
+ '200': {
13802
+ name: '4-20mA Pass Through',
13803
+ parse: (d) => {
13804
+ var adc1 = signInt(d.slice(0, 2).reduce(msbLsb));
13805
+ var adc2 = signInt(d.slice(2, 4).reduce(msbLsb));
13806
+ var dac1 = signInt(d.slice(4, 6).reduce(msbLsb));
13807
+ return {
13808
+ adc1: adc1,
13809
+ adc2: adc2,
13810
+ dac1: dac1,
13811
+ mA1: parseFloat((adc1/100.00).toFixed(2)),
13812
+ raw_adc: adc2,
13813
+ raw_dac: dac1
13814
+ };
13815
+ }
13816
+ },
13817
+ '202': {
13818
+ name: 'Wireless Weather Station',
13819
+ parse: (payload, parsed, mac) => {
13820
+ return {
13821
+ Temp: signInt(payload.slice(8, 12).reduce(msbLsb), 32) / 100,
13822
+ Humid: signInt(payload.slice(12, 16).reduce(msbLsb), 32) / 100,
13823
+ Pressure: signInt(payload.slice(16, 20).reduce(msbLsb), 32) / 100,
13824
+ WindSpd: signInt(payload.slice(20, 24).reduce(msbLsb),32) / 100,
13825
+ WindDir: signInt(payload.slice(24, 28).reduce(msbLsb),32) / 100,
13826
+ reserve: payload[7]
13827
+ };
13828
+ }
13829
+ },
13830
+ '211': {
13831
+ name: 'DO and Flow Sensor',
13832
+ parse: (payload, parsed, mac) => {
13833
+ if(payload[0] == 0){ // regular
13834
+ return {
13835
+ msg_type: 'regular',
13836
+ temperature: signInt(payload.slice(1, 3).reduce(msbLsb), 16),
13837
+ oxygen_saturation_percent: payload.slice(3, 7).reduce(msbLsb),
13838
+ oxygen_ppm: payload.slice(7, 11).reduce(msbLsb),
13839
+ oxygen_mg_l: payload.slice(11, 15).reduce(msbLsb)
13840
+ };
13841
+ }
13842
+ else{ // theshold
13843
+ let solenoid_status = payload[2];
13844
+ if(solenoid_status == 1){ // Solenoid On
13845
+ return {
13846
+ msg_type: 'threshold',
13847
+ solenoid_number: payload[1],
13848
+ solenoid_status: 'on',
13849
+ temperature: signInt(payload.slice(3, 5).reduce(msbLsb), 16),
13850
+ oxygen_saturation_percent: payload.slice(5, 9).reduce(msbLsb),
13851
+ oxygen_ppm: payload.slice(9, 13).reduce(msbLsb),
13852
+ oxygen_mg_l: payload.slice(13, 17).reduce(msbLsb),
13853
+ flow_rate: payload.slice(17, 21).reduce(msbLsb)
13854
+ };
13855
+ } else{ // Solenoid Off
13856
+ return {
13857
+ msg_type: 'threshold',
13858
+ solenoid_number: payload[1],
13859
+ solenoid_status: 'off',
13860
+ temperature: signInt(payload.slice(3, 5).reduce(msbLsb), 16),
13861
+ oxygen_saturation_percent: payload.slice(5, 9).reduce(msbLsb),
13862
+ oxygen_ppm: payload.slice(9, 13).reduce(msbLsb),
13863
+ oxygen_mg_l: payload.slice(13, 17).reduce(msbLsb)
13864
+ };
13865
+ }
13866
+ }
13867
+ },
13868
+ 'parse_fly': (frame) => {
13869
+ return {
13870
+ 'firmware': frame[2],
13871
+ 'hardware_id': frame.slice(12, 15),
13872
+ 'report_rate': frame.slice(15, 19).reduce(msbLsb) + "Sec",
13873
+ 'tx_life_counter': frame.slice(19, 23).reduce(msbLsb),
13874
+ 'machine_values': {
13875
+ 'firmware': frame[2],
13876
+ 'hardware_id': frame.slice(12, 15),
13877
+ 'report_rate': frame.slice(15, 19),
13878
+ 'tx_life_counter': frame.slice(19, 23)
13879
+ }
13880
+ }
13881
+ }
13882
+ },
13883
+ '217': {
13884
+ name: 'Wireless Weight Scale',
13885
+ parse: (d) => {
13886
+ return {
13887
+ weight: signInt(d.slice(0, 4).reduce(msbLsb)) / 100
13888
+ };
13889
+ }
13890
+ },
13891
+ '270': {
13892
+ name: 'Custom Salinity DO sensor',
13893
+ parse: (d) => {
13894
+ return {
13895
+ sensor_status: d[0],
13896
+ do_temperature_1: d.slice(1, 3).reduce(msbLsb) / 100,
13897
+ do_temperature_2: d.slice(3, 5).reduce(msbLsb) / 100,
13898
+ do_temperature_3: d.slice(5, 7).reduce(msbLsb) / 100,
13899
+ do_temperature_4: d.slice(7, 9).reduce(msbLsb) / 100,
13900
+ ec_temperature_1: d.slice(9, 11).reduce(msbLsb) / 100,
13901
+ ec_temperature_2: d.slice(11, 13).reduce(msbLsb) / 100,
13902
+ ec_temperature_3: d.slice(13, 15).reduce(msbLsb) / 100,
13903
+ ec_temperature_4: d.slice(15, 17).reduce(msbLsb) / 100,
13904
+ do_saturation_perc_1: d.slice(17, 19).reduce(msbLsb) / 100,
13905
+ do_saturation_perc_2: d.slice(19, 21).reduce(msbLsb) / 100,
13906
+ do_saturation_perc_3: d.slice(21, 23).reduce(msbLsb) / 100,
13907
+ do_saturation_perc_4: d.slice(23, 25).reduce(msbLsb) / 100,
13908
+ do_ppm_1: d.slice(25, 27).reduce(msbLsb) / 100,
13909
+ do_ppm_2: d.slice(27, 29).reduce(msbLsb) / 100,
13910
+ do_ppm_3: d.slice(29, 31).reduce(msbLsb) / 100,
13911
+ do_ppm_4: d.slice(31, 33).reduce(msbLsb) / 100,
13912
+ do_mgl_1: d.slice(33, 35).reduce(msbLsb) / 100,
13913
+ do_mgl_2: d.slice(35, 37).reduce(msbLsb) / 100,
13914
+ do_mgl_3: d.slice(37, 39).reduce(msbLsb) / 100,
13915
+ do_mgl_4: d.slice(39, 41).reduce(msbLsb) / 100,
13916
+ ec_conductivity_1: d.slice(41, 43).reduce(msbLsb) / 100,
13917
+ ec_conductivity_2: d.slice(43, 45).reduce(msbLsb) / 100,
13918
+ ec_conductivity_3: d.slice(45, 47).reduce(msbLsb) / 100,
13919
+ ec_conductivity_4: d.slice(47, 49).reduce(msbLsb) / 100,
13920
+ ec_salinity_ppt_1: d.slice(49, 57).reduce(msbLsb) / 100,
13921
+ ec_salinity_ppt_2: d.slice(57, 65).reduce(msbLsb) / 100,
13922
+ ec_salinity_ppt_3: d.slice(65, 73).reduce(msbLsb) / 100,
13923
+ ec_salinity_ppt_4: d.slice(73, 81).reduce(msbLsb) / 100,
13924
+ ec_tds_1: d.slice(81, 85).reduce(msbLsb) / 100,
13925
+ ec_tds_2: d.slice(85, 89).reduce(msbLsb) / 100,
13926
+ ec_tds_3: d.slice(89, 93).reduce(msbLsb) / 100,
13927
+ ec_tds_4: d.slice(93, 97).reduce(msbLsb) / 100
13928
+ };
13929
+ },
13930
+ 'parse_fly': (frame) => {
13931
+ return {
13932
+ 'firmware': frame[2],
13933
+ 'do_bootup_time': frame[12] + "Sec",
13934
+ 'ec_bootup_time': frame[13] + "Sec",
13935
+ 'device_ids_do_sensors': frame.slice(14, 18),
13936
+ 'device_ids_ec_sensors': frame.slice(18, 22),
13937
+ 'hardware_id': frame.slice(22, 25),
13938
+ 'report_rate': frame.slice(25, 29).reduce(msbLsb) + "Sec",
13939
+ 'tx_life_counter': frame.slice(29, 33).reduce(msbLsb),
13940
+ 'machine_values': {
13941
+ 'firmware': frame[2],
13942
+ 'do_bootup_time': frame[12],
13943
+ 'ec_bootup_time': frame[13],
13944
+ 'device_ids_do_sensors': frame.slice(14, 18),
13945
+ 'device_ids_ec_sensors': frame.slice(18, 22),
13946
+ 'hardware_id': frame.slice(22, 25),
13947
+ 'report_rate': frame.slice(25, 29),
13948
+ 'tx_life_counter': frame.slice(29, 33)
13949
+ }
13950
+ }
13951
+ }
13952
+ },
13953
+ '502': {
13954
+ name: 'Custom Environmental Sensor',
12685
13955
  parse: (d, full) => {
12686
13956
  reserve = full[7];
12687
13957
  if (reserve == 0xAA){
@@ -13799,8 +15069,682 @@ function sensor_types(parent){
13799
15069
  };
13800
15070
  }
13801
15071
  },
13802
- '537': {
13803
- name: 'Type 537 - Custom Standalone Smart Vibration Sensor',
15072
+ '536': {
15073
+ name: 'Wireless Oxygen Flow Meter',
15074
+ parse: (payload, parsed) => {
15075
+ return {
15076
+ error_status: payload[0],
15077
+ s1_oxygen_temp: payload.slice(1, 3).reduce(msbLsb)/100,
15078
+ s2_oxygen_temp: payload.slice(3, 5).reduce(msbLsb)/100,
15079
+ s3_oxygen_temp: payload.slice(5, 7).reduce(msbLsb)/100,
15080
+ s4_oxygen_temp: payload.slice(7, 9).reduce(msbLsb)/100,
15081
+ s1_saturation_percent: payload.slice(9, 13).reduce(msbLsb)/100,
15082
+ s2_saturation_percent: payload.slice(13, 17).reduce(msbLsb)/100,
15083
+ s3_saturation_percent: payload.slice(17, 21).reduce(msbLsb)/100,
15084
+ s4_saturation_percent: payload.slice(21, 25).reduce(msbLsb)/100,
15085
+ s1_oxigen_ppm: payload.slice(25, 29).reduce(msbLsb)/100,
15086
+ s2_oxigen_ppm: payload.slice(29, 33).reduce(msbLsb)/100,
15087
+ s3_oxigen_ppm: payload.slice(33, 37).reduce(msbLsb)/100,
15088
+ s4_oxigen_ppm: payload.slice(37, 41).reduce(msbLsb)/100,
15089
+ s1_oxigen_mg_l: payload.slice(41, 45).reduce(msbLsb)/100,
15090
+ s2_oxigen_mg_l: payload.slice(45, 49).reduce(msbLsb)/100,
15091
+ s3_oxigen_mg_l: payload.slice(49, 53).reduce(msbLsb)/100,
15092
+ s4_oxigen_mg_l: payload.slice(53, 57).reduce(msbLsb)/100,
15093
+ s1_flow_rate: payload.slice(57, 61).reduce(msbLsb)/100,
15094
+ s2_flow_rate: payload.slice(61, 65).reduce(msbLsb)/100,
15095
+ s3_flow_rate: payload.slice(65, 69).reduce(msbLsb)/100,
15096
+ s4_flow_rate: payload.slice(69, 73).reduce(msbLsb)/100,
15097
+ s1_solenoid_status: payload[73],
15098
+ s2_solenoid_status: payload[74],
15099
+ s3_solenoid_status: payload[75],
15100
+ s4_solenoid_status: payload[76]
15101
+ }
15102
+ },
15103
+ 'parse_fly': (frame) => {
15104
+ return {
15105
+ 'firmware': frame[2],
15106
+ 'oxygen_bootup_time': frame[12] + 'sec',
15107
+ 'flow_bootup_time': frame[13]+ 'sec',
15108
+ 's1_oxygen_addr': frame[14],
15109
+ 's2_oxygen_addr': frame[15],
15110
+ 's3_oxygen_addr': frame[16],
15111
+ 's4_oxygen_addr': frame[17],
15112
+ 's1_flow_addr': frame[18],
15113
+ 's2_flow_addr': frame[19],
15114
+ 's3_flow_addr': frame[20],
15115
+ 's4_flow_addr': frame[21],
15116
+ 'hardware_id': frame.slice(22, 25),
15117
+ 'report_rate': frame.slice(25, 29).reduce(msbLsb) + 'sec',
15118
+ 'tx_life_counter': frame.slice(29, 33).reduce(msbLsb),
15119
+ 'machine_values': {
15120
+ 'firmware': frame[2],
15121
+ 'oxygen_bootup_time': frame[12],
15122
+ 'flow_bootup_time': frame[13],
15123
+ 's1_oxygen_addr': frame[14],
15124
+ 's2_oxygen_addr': frame[15],
15125
+ 's3_oxygen_addr': frame[16],
15126
+ 's4_oxygen_addr': frame[17],
15127
+ 's1_flow_addr': frame[18],
15128
+ 's2_flow_addr': frame[19],
15129
+ 's3_flow_addr': frame[20],
15130
+ 's4_flow_addr': frame[21],
15131
+ 'hardware_id': frame.slice(22, 25),
15132
+ 'report_rate': frame.slice(25, 29),
15133
+ 'tx_life_counter': frame.slice(29, 33)
15134
+ }
15135
+ }
15136
+ }
15137
+ },
15138
+ '537': {
15139
+ name: 'Type 537 - Custom Standalone Smart Vibration Sensor',
15140
+ parse: (payload, parsed, mac) => {
15141
+ if(payload[7] >> 1 != 0){
15142
+ console.log('Error found');
15143
+ parsed.data = {error: 'Error found, Sensor Probe may be unattached'};
15144
+ return parsed;
15145
+ }
15146
+
15147
+ if(payload[8] === 1){
15148
+ var deviceAddr = mac;
15149
+ var firmware = payload[1];
15150
+ var hour = payload[11];
15151
+ var minute = payload[12];
15152
+ var expected_packets = payload[15];
15153
+ var current_packet = payload[16];
15154
+ var sdata_start = 17;
15155
+
15156
+ if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
15157
+ if(expected_packets != 1){
15158
+ // if a packet is already stored with the same packet ID, or if packet ID is 1, or if current packet ID is not one more than last packet ID
15159
+ if(current_packet in globalDevices[deviceAddr].data || current_packet == 1 || !((current_packet-1) in globalDevices[deviceAddr].data)) {
15160
+ console.log('-----');
15161
+ console.log('bad packet breakdown deleting stream');
15162
+ console.log(current_packet);
15163
+ console.log(expected_packets);
15164
+ console.log(current_packet in globalDevices[deviceAddr].data);
15165
+ console.log(current_packet == 1);
15166
+ console.log(!((current_packet-1) in globalDevices[deviceAddr].data));
15167
+ if(this.hasOwnProperty('failure_no')){
15168
+ this.failure_no = this.failure_no + 1;
15169
+ }
15170
+ else{
15171
+ this.failure_no = 1;
15172
+ }
15173
+ if(this.hasOwnProperty('failure_no')){
15174
+ console.log('####falure no');
15175
+ console.log(this.failure_no);
15176
+ }
15177
+ // console.log(globalDevices[deviceAddr].data);
15178
+ delete globalDevices[deviceAddr];
15179
+ if(current_packet != 1){
15180
+ return;
15181
+ } else{
15182
+
15183
+ var mode = payload[8];
15184
+ var odr = payload[9];
15185
+ var en_axis = payload[10] & 7;
15186
+ var fsr = payload[10] >> 5;
15187
+ var device_temp = msbLsb(payload[13], payload[14])/100;
15188
+
15189
+
15190
+ switch(odr){
15191
+ case 6:
15192
+ odr = 50;
15193
+ break;
15194
+ case 7:
15195
+ odr = 100;
15196
+ break;
15197
+ case 8:
15198
+ odr = 200;
15199
+ break;
15200
+ case 9:
15201
+ odr = 400;
15202
+ break;
15203
+ case 10:
15204
+ odr = 800;
15205
+ break;
15206
+ case 11:
15207
+ odr = 1600;
15208
+ break;
15209
+ case 12:
15210
+ odr = 3200;
15211
+ break;
15212
+ case 13:
15213
+ odr = 6400;
15214
+ break;
15215
+ case 14:
15216
+ odr = 12800;
15217
+ break;
15218
+ case 15:
15219
+ odr = 25600;
15220
+ break;
15221
+ default:
15222
+ odr = 0;
15223
+ }
15224
+
15225
+ globalDevices[deviceAddr] = {
15226
+ // stream_size: expected_packets,
15227
+ data: {},
15228
+ odr: odr,
15229
+ mo: mode,
15230
+ en_axis: en_axis,
15231
+ fsr: fsr,
15232
+ hour: hour,
15233
+ minute: minute,
15234
+ device_temp: device_temp,
15235
+ }
15236
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
15237
+ return;
15238
+ }
15239
+ }
15240
+ else{
15241
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
15242
+ }
15243
+ }
15244
+ else{
15245
+ var mode = payload[8];
15246
+ var odr = payload[9];
15247
+ var en_axis = payload[10] & 7;
15248
+ var fsr = payload[10] >> 5;
15249
+ var device_temp = msbLsb(payload[13], payload[14])/100;
15250
+
15251
+
15252
+ switch(odr){
15253
+ case 6:
15254
+ odr = 50;
15255
+ break;
15256
+ case 7:
15257
+ odr = 100;
15258
+ break;
15259
+ case 8:
15260
+ odr = 200;
15261
+ break;
15262
+ case 9:
15263
+ odr = 400;
15264
+ break;
15265
+ case 10:
15266
+ odr = 800;
15267
+ break;
15268
+ case 11:
15269
+ odr = 1600;
15270
+ break;
15271
+ case 12:
15272
+ odr = 3200;
15273
+ break;
15274
+ case 13:
15275
+ odr = 6400;
15276
+ break;
15277
+ case 14:
15278
+ odr = 12800;
15279
+ break;
15280
+ case 15:
15281
+ odr = 25600;
15282
+ break;
15283
+ default:
15284
+ odr = 0;
15285
+ }
15286
+
15287
+ globalDevices[deviceAddr] = {
15288
+ // stream_size: expected_packets,
15289
+ data: {},
15290
+ odr: odr,
15291
+ mo: mode,
15292
+ en_axis: en_axis,
15293
+ fsr: fsr,
15294
+ hour: hour,
15295
+ minute: minute,
15296
+ device_temp: device_temp,
15297
+ }
15298
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
15299
+ }
15300
+ if(Object.keys(globalDevices[deviceAddr].data).length == expected_packets){
15301
+ var raw_data = new Array();
15302
+ for(const packet in globalDevices[deviceAddr].data){
15303
+ raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
15304
+ }
15305
+ var label = 0;
15306
+
15307
+ var fft = new Array();
15308
+ var fft_concat = {};
15309
+
15310
+ var en_axis_data = {};
15311
+ switch (globalDevices[deviceAddr].en_axis){
15312
+ case 1:
15313
+ en_axis_data.x_offset = 0;
15314
+ en_axis_data.increment = 2;
15315
+ break;
15316
+ case 2:
15317
+ en_axis_data.y_offset = 0;
15318
+ en_axis_data.increment = 2;
15319
+ break;
15320
+ case 3:
15321
+ en_axis_data.x_offset = 0;
15322
+ en_axis_data.y_offset = 2;
15323
+ en_axis_data.increment = 4;
15324
+ break;
15325
+ case 4:
15326
+ en_axis_data.z_offset = 0;
15327
+ en_axis_data.increment = 2;
15328
+ break;
15329
+ case 5:
15330
+ en_axis_data.x_offset = 0;
15331
+ en_axis_data.z_offset = 2;
15332
+ en_axis_data.increment = 4;
15333
+ break;
15334
+ case 6:
15335
+ en_axis_data.y_offset = 0;
15336
+ en_axis_data.z_offset = 2;
15337
+ en_axis_data.increment = 4;
15338
+ break;
15339
+ case 7:
15340
+ en_axis_data.x_offset = 0;
15341
+ en_axis_data.y_offset = 2;
15342
+ en_axis_data.z_offset = 4;
15343
+ en_axis_data.increment = 6;
15344
+ break;
15345
+ default:
15346
+ en_axis_data.increment = 0;
15347
+ }
15348
+
15349
+ var fsr_mult = .00006;
15350
+ var fsr_text = "";
15351
+ switch(globalDevices[deviceAddr].fsr){
15352
+ case 0:
15353
+ fsr_mult = 0.00006;
15354
+ break;
15355
+ case 1:
15356
+ fsr_mult = 0.00012;
15357
+ break;
15358
+ case 2:
15359
+ fsr_mult = 0.00024;
15360
+ break;
15361
+ case 3:
15362
+ fsr_mult = 0.00049;
15363
+ break;
15364
+ }
15365
+ switch(globalDevices[deviceAddr].fsr){
15366
+ case 0:
15367
+ fsr_text = "2g";
15368
+ break;
15369
+ case 1:
15370
+ fsr_text = "4g";
15371
+ break;
15372
+ case 2:
15373
+ fsr_text = "8g";
15374
+ break;
15375
+ case 3:
15376
+ fsr_text = "16g";
15377
+ break;
15378
+ }
15379
+
15380
+ for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
15381
+ label++;
15382
+
15383
+ fft_concat[label] = {};
15384
+
15385
+ if('x_offset' in en_axis_data){
15386
+ fft_concat[label].x = parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(2));
15387
+ }
15388
+ if('y_offset' in en_axis_data){
15389
+ fft_concat[label].y = parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(2));
15390
+ }
15391
+ if('z_offset' in en_axis_data){
15392
+ fft_concat[label].z = parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(2));
15393
+ }
15394
+ }
15395
+ var fft_concat_obj = {
15396
+ time_id: globalDevices[deviceAddr].hour +':'+ globalDevices[deviceAddr].minute,
15397
+ mac_address: deviceAddr,
15398
+ en_axis: globalDevices[deviceAddr].en_axis,
15399
+ fsr: fsr_text,
15400
+ odr: globalDevices[deviceAddr].odr,
15401
+ device_temp: globalDevices[deviceAddr].device_temp,
15402
+ data: fft_concat
15403
+ };
15404
+ sensor_data = fft_concat_obj;
15405
+ delete globalDevices[deviceAddr];
15406
+ if(this.hasOwnProperty('failure_no')){
15407
+ console.log('####falure no');
15408
+ console.log(this.failure_no);
15409
+ }
15410
+
15411
+ return sensor_data;
15412
+ }
15413
+ else{
15414
+ return;
15415
+ }
15416
+ }else{
15417
+
15418
+ var mode = payload[8];
15419
+ var odr = payload[9];
15420
+ var en_axis = payload[10] & 7;
15421
+ var fsr = payload[10] >> 5;
15422
+ var device_temp = msbLsb(payload[13], payload[14])/100;
15423
+
15424
+
15425
+ switch(odr){
15426
+ case 6:
15427
+ odr = 50;
15428
+ break;
15429
+ case 7:
15430
+ odr = 100;
15431
+ break;
15432
+ case 8:
15433
+ odr = 200;
15434
+ break;
15435
+ case 9:
15436
+ odr = 400;
15437
+ break;
15438
+ case 10:
15439
+ odr = 800;
15440
+ break;
15441
+ case 11:
15442
+ odr = 1600;
15443
+ break;
15444
+ case 12:
15445
+ odr = 3200;
15446
+ break;
15447
+ case 13:
15448
+ odr = 6400;
15449
+ break;
15450
+ case 14:
15451
+ odr = 12800;
15452
+ break;
15453
+ case 15:
15454
+ odr = 25600;
15455
+ break;
15456
+ default:
15457
+ odr = 0;
15458
+ }
15459
+
15460
+ globalDevices[deviceAddr] = {
15461
+ // stream_size: expected_packets,
15462
+ data: {},
15463
+ odr: odr,
15464
+ mo: mode,
15465
+ en_axis: en_axis,
15466
+ fsr: fsr,
15467
+ hour: hour,
15468
+ minute: minute,
15469
+ device_temp: device_temp,
15470
+ }
15471
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
15472
+ return;
15473
+ }
15474
+ }
15475
+ else if(payload[8] === 0 || payload[8] === 2){
15476
+ // mode byte most significant bit will indicate fft data.
15477
+ // console.log(d);
15478
+ var odr;
15479
+ switch(payload[9]){
15480
+ case 6:
15481
+ odr = "50Hz"
15482
+ break;
15483
+ case 7:
15484
+ odr = "100Hz";
15485
+ break;
15486
+ case 8:
15487
+ odr = "200Hz";
15488
+ break;
15489
+ case 9:
15490
+ odr = "400Hz";
15491
+ break;
15492
+ case 10:
15493
+ odr = "800Hz";
15494
+ break;
15495
+ case 11:
15496
+ odr = "1600Hz";
15497
+ break;
15498
+ case 12:
15499
+ odr = "3200Hz";
15500
+ break;
15501
+ case 13:
15502
+ odr = "6400Hz";
15503
+ break;
15504
+ case 14:
15505
+ odr = "12800Hz";
15506
+ break;
15507
+ case 15:
15508
+ odr = "25600Hz";
15509
+ break;
15510
+ }
15511
+ return {
15512
+ mode: payload[8],
15513
+
15514
+ odr: odr,
15515
+ temperature: signInt(payload.slice(10, 12).reduce(msbLsb), 16) / 100,
15516
+
15517
+ x_rms_ACC_G: payload.slice(12, 14).reduce(msbLsb)/1000,
15518
+ x_max_ACC_G: payload.slice(14, 16).reduce(msbLsb)/1000,
15519
+ x_velocity_mm_sec: payload.slice(16, 18).reduce(msbLsb) / 100,
15520
+ x_displacement_mm: payload.slice(18, 20).reduce(msbLsb) / 100,
15521
+ x_peak_one_Hz: payload.slice(20, 22).reduce(msbLsb),
15522
+ x_peak_two_Hz: payload.slice(22, 24).reduce(msbLsb),
15523
+ x_peak_three_Hz: payload.slice(24, 26).reduce(msbLsb),
15524
+
15525
+ y_rms_ACC_G: payload.slice(26, 28).reduce(msbLsb)/1000,
15526
+ y_max_ACC_G: payload.slice(28, 30).reduce(msbLsb)/1000,
15527
+ y_velocity_mm_sec: payload.slice(30, 32).reduce(msbLsb) / 100,
15528
+ y_displacement_mm: payload.slice(32, 34).reduce(msbLsb) / 100,
15529
+ y_peak_one_Hz: payload.slice(34, 36).reduce(msbLsb),
15530
+ y_peak_two_Hz: payload.slice(36, 38).reduce(msbLsb),
15531
+ y_peak_three_Hz: payload.slice(38, 40).reduce(msbLsb),
15532
+
15533
+ z_rms_ACC_G: payload.slice(40, 42).reduce(msbLsb)/1000,
15534
+ z_max_ACC_G: payload.slice(42, 44).reduce(msbLsb)/1000,
15535
+ z_velocity_mm_sec: payload.slice(44, 46).reduce(msbLsb) / 100,
15536
+ z_displacement_mm: payload.slice(46, 48).reduce(msbLsb) / 100,
15537
+ z_peak_one_Hz: payload.slice(48, 50).reduce(msbLsb),
15538
+ z_peak_two_Hz: payload.slice(50, 52).reduce(msbLsb),
15539
+ z_peak_three_Hz: payload.slice(52, 54).reduce(msbLsb),
15540
+ };
15541
+ }
15542
+ // else{
15543
+ // parsed.data = {'error': 'Vibration mode error'}
15544
+ // return parsed;
15545
+ // }
15546
+ },
15547
+ 'parse_fly': (frame) => {
15548
+ let frame_data = {};
15549
+ switch(frame[16]){
15550
+ case 0:
15551
+ frame_data.mode = "Processed";
15552
+ break;
15553
+ case 1:
15554
+ frame_data.mode = "Raw";
15555
+ break;
15556
+ case 2:
15557
+ frame_data.mode = "Processed + Raw on demand";
15558
+ break;
15559
+ }
15560
+ switch(frame[17]){
15561
+ case 6:
15562
+ frame_data.odr_1 = 50;
15563
+ break;
15564
+ case 7:
15565
+ frame_data.odr_1 = 100;
15566
+ break;
15567
+ case 8:
15568
+ frame_data.odr_1 = 200;
15569
+ break;
15570
+ case 9:
15571
+ frame_data.odr_1 = 400;
15572
+ break;
15573
+ case 10:
15574
+ frame_data.odr_1 = 800;
15575
+ break;
15576
+ case 11:
15577
+ frame_data.odr_1 = 1600;
15578
+ break;
15579
+ case 12:
15580
+ frame_data.odr_1 = 3200;
15581
+ break;
15582
+ case 13:
15583
+ frame_data.odr_1 = 6400;
15584
+ break;
15585
+ case 14:
15586
+ frame_data.odr_1 = 12800;
15587
+ break;
15588
+ case 15:
15589
+ frame_data.odr_1 = 25600;
15590
+ break;
15591
+ }
15592
+ frame_data.sampling_duration_1 = frame[19]*50 + "ms";
15593
+ switch(frame[21]){
15594
+ case 0:
15595
+ frame_data.filter_status = "Disabled";
15596
+ break;
15597
+ case 1:
15598
+ frame_data.filter_status = "Enabled";
15599
+ break;
15600
+ }
15601
+ switch(frame[22]){
15602
+ case 0:
15603
+ frame_data.lpf_coeff_1 = 4;
15604
+ break;
15605
+ case 1:
15606
+ frame_data.lpf_coeff_1 = 8;
15607
+ break;
15608
+ case 2:
15609
+ frame_data.lpf_coeff_1 = 16;
15610
+ break;
15611
+ case 2:
15612
+ frame_data.lpf_coeff_1 = 32;
15613
+ break;
15614
+ case 4:
15615
+ frame_data.lpf_coeff_1 = 64;
15616
+ break;
15617
+ case 5:
15618
+ frame_data.lpf_coeff_1 = 128;
15619
+ break;
15620
+ case 6:
15621
+ frame_data.lpf_coeff_1 = 256;
15622
+ break;
15623
+ case 7:
15624
+ frame_data.lpf_coeff_1 = 512;
15625
+ break;
15626
+ case 8:
15627
+ frame_data.lpf_coeff_1 = 1024;
15628
+ break;
15629
+ case 9:
15630
+ frame_data.lpf_coeff_1 = 2048;
15631
+ break;
15632
+ }
15633
+ frame_data.lpf_freq_1 = frame_data.odr_1 / frame_data.lpf_coeff_1;
15634
+ switch(frame[24]){
15635
+ case 0:
15636
+ frame_data.hpf_coeff_1 = 4;
15637
+ break;
15638
+ case 1:
15639
+ frame_data.hpf_coeff_1 = 8;
15640
+ break;
15641
+ case 2:
15642
+ frame_data.hpf_coeff_1 = 16;
15643
+ break;
15644
+ case 2:
15645
+ frame_data.hpf_coeff_1 = 32;
15646
+ break;
15647
+ case 4:
15648
+ frame_data.hpf_coeff_1 = 64;
15649
+ break;
15650
+ case 5:
15651
+ frame_data.hpf_coeff_1 = 128;
15652
+ break;
15653
+ case 6:
15654
+ frame_data.hpf_coeff_1 = 256;
15655
+ break;
15656
+ case 7:
15657
+ frame_data.hpf_coeff_1 = 512;
15658
+ break;
15659
+ case 8:
15660
+ frame_data.hpf_coeff_1 = 1024;
15661
+ break;
15662
+ case 9:
15663
+ frame_data.hpf_coeff_1 = 2048;
15664
+ break;
15665
+ }
15666
+ frame_data.hpf_freq_1 = frame_data.odr_1 / frame_data.hpf_coeff_1;
15667
+ switch(frame[26]){
15668
+ case 0:
15669
+ frame_data.sampling_interval = "5 Minutes";
15670
+ break;
15671
+ case 1:
15672
+ frame_data.sampling_interval = "10 Minutes";
15673
+ break;
15674
+ case 2:
15675
+ frame_data.sampling_interval = "15 Minutes";
15676
+ break;
15677
+ case 2:
15678
+ frame_data.sampling_interval = "20 Minutes";
15679
+ break;
15680
+ case 4:
15681
+ frame_data.sampling_interval = "30 Minutes";
15682
+ break;
15683
+ case 5:
15684
+ frame_data.sampling_interval = "60 Minutes";
15685
+ break;
15686
+ case 6:
15687
+ frame_data.sampling_interval = "120 Minutes";
15688
+ break;
15689
+ case 7:
15690
+ frame_data.sampling_interval = "180 Minutes";
15691
+ break;
15692
+ case 8:
15693
+ frame_data.sampling_interval = "1 Minute";
15694
+ break;
15695
+ }
15696
+ frame_data.on_request_timeout = frame[27] + " Seconds";
15697
+ frame_data.deadband = frame[28] + "mg";
15698
+
15699
+ switch(frame[29]){
15700
+ case 0:
15701
+ frame_data.payload_length = "50 Bytes";
15702
+ break;
15703
+ case 1:
15704
+ frame_data.payload_length = "100 Bytes";
15705
+ break;
15706
+ case 2:
15707
+ frame_data.payload_length = "150 Bytes";
15708
+ break;
15709
+ case 3:
15710
+ frame_data.payload_length = "180 Bytes";
15711
+ break;
15712
+ }
15713
+
15714
+ return {
15715
+ 'firmware': frame[2],
15716
+ 'destination_address': toMac(frame.slice(12, 16)),
15717
+ 'mode': frame_data.mode,
15718
+ 'odr_1': frame_data.odr_1+'Hz',
15719
+ 'sampling_duration_1': frame_data.sampling_duration_1,
15720
+ 'filter_status': frame_data.filter_status,
15721
+ 'lpf_coeff_1': frame_data.lpf_coeff_1,
15722
+ 'lpf_freq_1': frame_data.lpf_freq_1+'Hz',
15723
+ 'hpf_coeff_1': frame_data.hpf_coeff_1,
15724
+ 'hpf_freq_1': frame_data.hpf_freq_1+'Hz',
15725
+ 'sampling_interval': frame_data.sampling_interval,
15726
+ 'on_request_timeout': frame_data.on_request_timeout,
15727
+ 'deadband': frame_data.deadband,
15728
+ 'payload_length': frame_data.payload_length,
15729
+ 'machine_values': {
15730
+ 'firmware': frame[2],
15731
+ 'destination_address': toMac(frame.slice(12, 16), false),
15732
+ 'mode': frame[16],
15733
+ 'odr_1': frame[17],
15734
+ 'sampling_duration_1': frame[19],
15735
+ 'filter_status': frame[21],
15736
+ 'lpf_coeff_1': frame[22],
15737
+ 'hpf_coeff_1': frame[24],
15738
+ 'sampling_interval': frame[26],
15739
+ 'on_request_timeout': frame[27],
15740
+ 'deadband': frame[28],
15741
+ 'payload_length': frame[29]
15742
+ }
15743
+ }
15744
+ }
15745
+ },
15746
+ '538': {
15747
+ name: 'One Channel Vibration Plus',
13804
15748
  parse: (payload, parsed, mac) => {
13805
15749
  if(payload[7] >> 1 != 0){
13806
15750
  console.log('Error found');
@@ -13820,7 +15764,7 @@ function sensor_types(parent){
13820
15764
  if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
13821
15765
  if(expected_packets != 1){
13822
15766
  // if a packet is already stored with the same packet ID, or if packet ID is 1, or if current packet ID is not one more than last packet ID
13823
- if(current_packet in globalDevices[deviceAddr].data || current_packet == 1 || !((current_packet-1) in globalDevices[deviceAddr].data)) {
15767
+ if(current_packet in globalDevices[deviceAddr].data || current_packet == 1 || !(((current_packet&127)-1) in globalDevices[deviceAddr].data)) {
13824
15768
  console.log('-----');
13825
15769
  console.log('bad packet breakdown deleting stream');
13826
15770
  console.log(current_packet);
@@ -13961,6 +15905,7 @@ function sensor_types(parent){
13961
15905
  }
13962
15906
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
13963
15907
  }
15908
+
13964
15909
  if(Object.keys(globalDevices[deviceAddr].data).length == expected_packets){
13965
15910
  var raw_data = new Array();
13966
15911
  for(const packet in globalDevices[deviceAddr].data){
@@ -14407,28 +16352,223 @@ function sensor_types(parent){
14407
16352
  }
14408
16353
  }
14409
16354
  },
14410
- '538': {
14411
- name: 'One Channel Vibration Plus',
16355
+ '539': {
16356
+ name: 'RS485 Modbus Wireless Converter',
16357
+ parse: (d) => {
16358
+ return {
16359
+ subdevice_type: d[0],
16360
+ number_of_registers: d[1],
16361
+ status_24_31: d[2],
16362
+ status_16_23: d[3],
16363
+ status_8_15: d[4],
16364
+ status_0_7: d[5],
16365
+ // TODO we can automatically determine how many registers are here based on the number_of_registers and create data objects appropriately
16366
+ // r1: d.slice(2,4),
16367
+ // r2: d.slice(4,6),
16368
+ // r3: d.slice(6,8),
16369
+ // r4: d.slice(8,10),
16370
+ data: d.slice(6)
16371
+ };
16372
+ },
16373
+ },
16374
+ '540': {
16375
+ name: 'Wireless Ultrasonic Flow Meter FD-Q32C',
16376
+ parse: (d) => {
16377
+ return {
16378
+ raw_adc: d.slice(0, 2).reduce(msbLsb),
16379
+ ma: d.slice(2, 4).reduce(msbLsb) / 100,
16380
+ flow_ltr_min: d.slice(4, 8).reduce(msbLsb) / 100
16381
+ };
16382
+ },
16383
+ 'parse_fly': (frame) => {
16384
+ let firmware = frame[2];
16385
+ if(firmware > 13){ // firmware 14 and above
16386
+ let frame_data = {};
16387
+ let auto_check_interval = frame.slice(20, 22).reduce(msbLsb);
16388
+ if(!auto_check_interval){
16389
+ frame_data.auto_check_interval = 'Disabled';
16390
+ }else{
16391
+ frame_data.auto_check_interval = auto_check_interval + " sec";
16392
+ }
16393
+ frame_data.always_on = frame[24]?"Enabled":"Disabled";
16394
+ switch(frame[16]){
16395
+ case 0:
16396
+ frame_data.fsr = "+-6.114 V";
16397
+ break;
16398
+ case 1:
16399
+ frame_data.fsr = "+-4.096 V";
16400
+ break;
16401
+ case 2:
16402
+ frame_data.fsr = "+-2.048 V";
16403
+ break;
16404
+ case 3:
16405
+ frame_data.fsr = "+-1.024 V";
16406
+ break;
16407
+ case 4:
16408
+ frame_data.fsr = "+-0.512 V";
16409
+ break;
16410
+ case 5:
16411
+ frame_data.fsr = "+-0.256 V";
16412
+ break;
16413
+ }
16414
+ return {
16415
+ 'firmware': frame[2],
16416
+ 'fsr': frame_data.fsr,
16417
+ 'boot_time': frame[17] + " sec",
16418
+ 'power_adc': frame.slice(18, 20).reduce(msbLsb),
16419
+ 'auto_check_interval': frame_data.auto_check_interval,
16420
+ 'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
16421
+ 'always_on': frame_data.always_on,
16422
+ 'calibration_one': frame.slice(25, 29).reduce(msbLsb),
16423
+ 'calibration_two':frame.slice(29, 33).reduce(msbLsb),
16424
+ 'calibration_three':frame.slice(33, 37).reduce(msbLsb),
16425
+ 'hardware_id': frame.slice(37, 40),
16426
+ 'report_rate': frame.slice(40, 44).reduce(msbLsb) + " sec",
16427
+ 'tx_life_counter': frame.slice(44, 48).reduce(msbLsb),
16428
+ 'machine_values': {
16429
+ 'firmware': frame[2],
16430
+ 'fsr': frame[16],
16431
+ 'boot_time': frame[17],
16432
+ 'power_adc': frame.slice(18, 20),
16433
+ 'auto_check_interval': frame.slice(20, 22),
16434
+ 'auto_check_percentage': frame.slice(22, 24),
16435
+ 'always_on': frame[24],
16436
+ 'calibration_one': frame.slice(25, 29),
16437
+ 'calibration_two':frame.slice(29, 33),
16438
+ 'calibration_three':frame.slice(33, 37),
16439
+ 'hardware_id': frame.slice(37, 40),
16440
+ 'report_rate': frame.slice(40, 44),
16441
+ 'tx_life_counter': frame.slice(44, 48)
16442
+ }
16443
+ }
16444
+ }
16445
+ }
16446
+ },
16447
+ '541': {
16448
+ name: 'Custom Inline Flow Sensor',
16449
+ parse: (d) => {
16450
+ return {
16451
+ adc1: signInt(d.slice(0, 2).reduce(msbLsb)),
16452
+ adc2: signInt(d.slice(2, 4).reduce(msbLsb)),
16453
+ mA1: signInt(d.slice(4, 6).reduce(msbLsb))/100,
16454
+ mA2: signInt(d.slice(6, 8).reduce(msbLsb))/100,
16455
+ flow_1: signInt(d.slice(8, 12).reduce(msbLsb))/100,
16456
+ flow_2:signInt(d.slice(12, 16).reduce(msbLsb))/100
16457
+ };
16458
+ },
16459
+ 'parse_fly': (frame) => {
16460
+ let firmware = frame[2];
16461
+ if(firmware > 13){ // firmware 14 and above
16462
+ let frame_data = {};
16463
+ let auto_check_interval = frame.slice(20, 22).reduce(msbLsb);
16464
+ if(!auto_check_interval){
16465
+ frame_data.auto_check_interval = 'Disabled';
16466
+ }else{
16467
+ frame_data.auto_check_interval = auto_check_interval + " sec";
16468
+ }
16469
+ frame_data.always_on = frame[24]?"Enabled":"Disabled";
16470
+ switch(frame[16]){
16471
+ case 0:
16472
+ frame_data.fsr = "+-6.114 V";
16473
+ break;
16474
+ case 1:
16475
+ frame_data.fsr = "+-4.096 V";
16476
+ break;
16477
+ case 2:
16478
+ frame_data.fsr = "+-2.048 V";
16479
+ break;
16480
+ case 3:
16481
+ frame_data.fsr = "+-1.024 V";
16482
+ break;
16483
+ case 4:
16484
+ frame_data.fsr = "+-0.512 V";
16485
+ break;
16486
+ case 5:
16487
+ frame_data.fsr = "+-0.256 V";
16488
+ break;
16489
+ }
16490
+ return {
16491
+ 'firmware': frame[2],
16492
+ 'fsr': frame_data.fsr,
16493
+ 'boot_up_time': frame[17] + " sec",
16494
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
16495
+ 'auto_check_interval': frame_data.auto_check_interval,
16496
+ 'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
16497
+ 'always_on': frame_data.always_on,
16498
+ 'calibration_one': frame.slice(25, 29).reduce(msbLsb),
16499
+ 'calibration_two':frame.slice(29, 33).reduce(msbLsb),
16500
+ 'calibration_three':frame.slice(33, 37).reduce(msbLsb),
16501
+ 'min_flow_rate':frame.slice(37, 39).reduce(msbLsb),
16502
+ 'max_flow_rate':frame.slice(39, 41).reduce(msbLsb),
16503
+ 'hardware_id': frame.slice(41, 44),
16504
+ 'report_rate': frame.slice(44, 48).reduce(msbLsb) + " sec",
16505
+ 'tx_life_counter': frame.slice(48, 52).reduce(msbLsb),
16506
+ 'machine_values': {
16507
+ 'firmware': frame[2],
16508
+ 'fsr': frame[16],
16509
+ 'boot_up_time': frame[17],
16510
+ 'adc_pin_reading': frame.slice(18, 20),
16511
+ 'auto_check_interval': frame.slice(20, 22),
16512
+ 'auto_check_percentage': frame.slice(22, 24),
16513
+ 'always_on': frame[24],
16514
+ 'calibration_one': frame.slice(25, 29),
16515
+ 'calibration_two':frame.slice(29, 33),
16516
+ 'calibration_three':frame.slice(33, 37),
16517
+ 'min_flow_rate':frame.slice(37, 39),
16518
+ 'max_flow_rate':frame.slice(39, 41),
16519
+ 'hardware_id': frame.slice(41, 44),
16520
+ 'report_rate': frame.slice(44, 48),
16521
+ 'tx_life_counter': frame.slice(48, 52)
16522
+ }
16523
+ }
16524
+ }
16525
+ }
16526
+ },
16527
+ '542': {
16528
+ name: 'Custom LWGY Flow Sensor',
16529
+ parse: (d) => {
16530
+ return {
16531
+ frequency: d.slice(0, 2).reduce(msbLsb),
16532
+ vol_flow: d.slice(2, 4).reduce(msbLsb)/100
16533
+ };
16534
+ },
16535
+ 'parse_fly': (frame) => {
16536
+ return {
16537
+ 'firmware': frame[2],
16538
+ 'hardware_id': frame.slice(12, 15),
16539
+ 'report_rate': frame.slice(15, 19).reduce(msbLsb) + " sec",
16540
+ 'tx_life_counter': frame.slice(19, 23).reduce(msbLsb),
16541
+ 'machine_values': {
16542
+ 'firmware': frame[2],
16543
+ 'hardware_id': frame.slice(12, 15),
16544
+ 'report_rate': frame.slice(15, 19),
16545
+ 'tx_life_counter': frame.slice(19, 23)
16546
+ }
16547
+ }
16548
+ }
16549
+ },
16550
+ '543': {
16551
+ name: 'Custom Seismic Vibration Sensor',
14412
16552
  parse: (payload, parsed, mac) => {
14413
- if(payload[7] >> 1 != 0){
16553
+ if(payload[7] & 2){
14414
16554
  console.log('Error found');
14415
16555
  parsed.data = {error: 'Error found, Sensor Probe may be unattached'};
14416
16556
  return parsed;
14417
16557
  }
14418
-
16558
+ let msg_type = 'regular'; // (payload[7] & 16)? 'motion' : 'regular';
14419
16559
  if(payload[8] === 1){
14420
16560
  var deviceAddr = mac;
14421
16561
  var firmware = payload[1];
14422
- var hour = payload[11];
14423
- var minute = payload[12];
14424
- var expected_packets = payload[15];
14425
- var current_packet = payload[16];
14426
- var sdata_start = 17;
16562
+ var hour = payload[12];
16563
+ var minute = payload[13];
16564
+ var expected_packets = msbLsb(payload[16], payload[17]);
16565
+ var current_packet = msbLsb(payload[18], payload[19]);
16566
+ var sdata_start = 20;
14427
16567
 
14428
16568
  if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
14429
16569
  if(expected_packets != 1){
14430
16570
  // if a packet is already stored with the same packet ID, or if packet ID is 1, or if current packet ID is not one more than last packet ID
14431
- if(current_packet in globalDevices[deviceAddr].data || current_packet == 1 || !(((current_packet&127)-1) in globalDevices[deviceAddr].data)) {
16571
+ if(current_packet in globalDevices[deviceAddr].data || current_packet == 1 || !(((current_packet)-1) in globalDevices[deviceAddr].data)) {
14432
16572
  console.log('-----');
14433
16573
  console.log('bad packet breakdown deleting stream');
14434
16574
  console.log(current_packet);
@@ -14447,63 +16587,25 @@ function sensor_types(parent){
14447
16587
  console.log(this.failure_no);
14448
16588
  }
14449
16589
  // console.log(globalDevices[deviceAddr].data);
14450
- delete globalDevices[deviceAddr];
14451
- if(current_packet != 1){
14452
- return;
14453
- } else{
14454
-
14455
- var mode = payload[8];
14456
- var odr = payload[9];
14457
- var en_axis = payload[10] & 7;
14458
- var fsr = payload[10] >> 5;
14459
- var device_temp = msbLsb(payload[13], payload[14])/100;
14460
-
16590
+ delete globalDevices[deviceAddr];
16591
+ if(current_packet != 1){
16592
+ return;
16593
+ } else{
14461
16594
 
14462
- switch(odr){
14463
- case 6:
14464
- odr = 50;
14465
- break;
14466
- case 7:
14467
- odr = 100;
14468
- break;
14469
- case 8:
14470
- odr = 200;
14471
- break;
14472
- case 9:
14473
- odr = 400;
14474
- break;
14475
- case 10:
14476
- odr = 800;
14477
- break;
14478
- case 11:
14479
- odr = 1600;
14480
- break;
14481
- case 12:
14482
- odr = 3200;
14483
- break;
14484
- case 13:
14485
- odr = 6400;
14486
- break;
14487
- case 14:
14488
- odr = 12800;
14489
- break;
14490
- case 15:
14491
- odr = 25600;
14492
- break;
14493
- default:
14494
- odr = 0;
14495
- }
16595
+ var mode = payload[8];
16596
+ var odr = msbLsb(payload[9], payload[10]);
16597
+ var fsr = payload[11] >> 5;
16598
+ var temperature = msbLsb(payload[14], payload[15])/100;
14496
16599
 
14497
16600
  globalDevices[deviceAddr] = {
14498
16601
  // stream_size: expected_packets,
14499
16602
  data: {},
14500
16603
  odr: odr,
14501
16604
  mo: mode,
14502
- en_axis: en_axis,
14503
16605
  fsr: fsr,
14504
16606
  hour: hour,
14505
16607
  minute: minute,
14506
- device_temp: device_temp,
16608
+ temperature: temperature,
14507
16609
  }
14508
16610
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
14509
16611
  return;
@@ -14515,57 +16617,19 @@ function sensor_types(parent){
14515
16617
  }
14516
16618
  else{
14517
16619
  var mode = payload[8];
14518
- var odr = payload[9];
14519
- var en_axis = payload[10] & 7;
14520
- var fsr = payload[10] >> 5;
14521
- var device_temp = msbLsb(payload[13], payload[14])/100;
14522
-
14523
-
14524
- switch(odr){
14525
- case 6:
14526
- odr = 50;
14527
- break;
14528
- case 7:
14529
- odr = 100;
14530
- break;
14531
- case 8:
14532
- odr = 200;
14533
- break;
14534
- case 9:
14535
- odr = 400;
14536
- break;
14537
- case 10:
14538
- odr = 800;
14539
- break;
14540
- case 11:
14541
- odr = 1600;
14542
- break;
14543
- case 12:
14544
- odr = 3200;
14545
- break;
14546
- case 13:
14547
- odr = 6400;
14548
- break;
14549
- case 14:
14550
- odr = 12800;
14551
- break;
14552
- case 15:
14553
- odr = 25600;
14554
- break;
14555
- default:
14556
- odr = 0;
14557
- }
16620
+ var odr = msbLsb(payload[9], payload[10]);
16621
+ var fsr = payload[11] >> 5;
16622
+ var temperature = msbLsb(payload[14], payload[15])/100;
14558
16623
 
14559
16624
  globalDevices[deviceAddr] = {
14560
16625
  // stream_size: expected_packets,
14561
16626
  data: {},
14562
16627
  odr: odr,
14563
16628
  mo: mode,
14564
- en_axis: en_axis,
14565
16629
  fsr: fsr,
14566
16630
  hour: hour,
14567
16631
  minute: minute,
14568
- device_temp: device_temp,
16632
+ temperature: temperature,
14569
16633
  }
14570
16634
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
14571
16635
  }
@@ -14581,58 +16645,23 @@ function sensor_types(parent){
14581
16645
  var fft_concat = {};
14582
16646
 
14583
16647
  var en_axis_data = {};
14584
- switch (globalDevices[deviceAddr].en_axis){
14585
- case 1:
14586
- en_axis_data.x_offset = 0;
14587
- en_axis_data.increment = 2;
14588
- break;
14589
- case 2:
14590
- en_axis_data.y_offset = 0;
14591
- en_axis_data.increment = 2;
14592
- break;
14593
- case 3:
14594
- en_axis_data.x_offset = 0;
14595
- en_axis_data.y_offset = 2;
14596
- en_axis_data.increment = 4;
14597
- break;
14598
- case 4:
14599
- en_axis_data.z_offset = 0;
14600
- en_axis_data.increment = 2;
14601
- break;
14602
- case 5:
14603
- en_axis_data.x_offset = 0;
14604
- en_axis_data.z_offset = 2;
14605
- en_axis_data.increment = 4;
14606
- break;
14607
- case 6:
14608
- en_axis_data.y_offset = 0;
14609
- en_axis_data.z_offset = 2;
14610
- en_axis_data.increment = 4;
14611
- break;
14612
- case 7:
14613
- en_axis_data.x_offset = 0;
14614
- en_axis_data.y_offset = 2;
14615
- en_axis_data.z_offset = 4;
14616
- en_axis_data.increment = 6;
14617
- break;
14618
- default:
14619
- en_axis_data.increment = 0;
14620
- }
16648
+ en_axis_data.x_offset = 0;
16649
+ en_axis_data.y_offset = 2;
16650
+ en_axis_data.z_offset = 4;
16651
+ en_axis_data.increment = 6;
16652
+ fft_concat = {x: [], y: [], z: []};
14621
16653
 
14622
16654
  var fsr_mult = .00006;
14623
16655
  var fsr_text = "";
14624
16656
  switch(globalDevices[deviceAddr].fsr){
14625
16657
  case 0:
14626
- fsr_mult = 0.00006;
16658
+ fsr_mult = 0.0000608;
14627
16659
  break;
14628
16660
  case 1:
14629
- fsr_mult = 0.00012;
16661
+ fsr_mult = 0.0001216;
14630
16662
  break;
14631
16663
  case 2:
14632
- fsr_mult = 0.00024;
14633
- break;
14634
- case 3:
14635
- fsr_mult = 0.00049;
16664
+ fsr_mult = 0.0002448;
14636
16665
  break;
14637
16666
  }
14638
16667
  switch(globalDevices[deviceAddr].fsr){
@@ -14645,33 +16674,34 @@ function sensor_types(parent){
14645
16674
  case 2:
14646
16675
  fsr_text = "8g";
14647
16676
  break;
14648
- case 3:
14649
- fsr_text = "16g";
14650
- break;
14651
16677
  }
14652
16678
 
16679
+
14653
16680
  for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
14654
16681
  label++;
14655
16682
 
14656
- fft_concat[label] = {};
14657
-
14658
16683
  if('x_offset' in en_axis_data){
14659
- fft_concat[label].x = parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(2));
16684
+ fft_concat.x.push(parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(2)));
14660
16685
  }
14661
16686
  if('y_offset' in en_axis_data){
14662
- fft_concat[label].y = parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(2));
16687
+ fft_concat.y.push(parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(2)));
14663
16688
  }
14664
16689
  if('z_offset' in en_axis_data){
14665
- fft_concat[label].z = parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(2));
16690
+ fft_concat.z.push(parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(2)));
14666
16691
  }
14667
16692
  }
14668
16693
  var fft_concat_obj = {
14669
- time_id: globalDevices[deviceAddr].hour +':'+ globalDevices[deviceAddr].minute,
16694
+ mode: payload[8],
16695
+ msg_type: msg_type,
16696
+ time_id: [
16697
+ String(globalDevices[deviceAddr].hour).padStart(2, '0'),
16698
+ String(globalDevices[deviceAddr].minute).padStart(2, '0'),
16699
+ ].join(':'),
14670
16700
  mac_address: deviceAddr,
14671
- en_axis: globalDevices[deviceAddr].en_axis,
14672
16701
  fsr: fsr_text,
14673
16702
  odr: globalDevices[deviceAddr].odr,
14674
- device_temp: globalDevices[deviceAddr].device_temp,
16703
+ temperature: globalDevices[deviceAddr].temperature,
16704
+ total_samples: label,
14675
16705
  data: fft_concat
14676
16706
  };
14677
16707
  sensor_data = fft_concat_obj;
@@ -14689,100 +16719,48 @@ function sensor_types(parent){
14689
16719
  }else{
14690
16720
 
14691
16721
  var mode = payload[8];
14692
- var odr = payload[9];
14693
- var en_axis = payload[10] & 7;
14694
- var fsr = payload[10] >> 5;
14695
- var device_temp = msbLsb(payload[13], payload[14])/100;
14696
-
14697
-
14698
- switch(odr){
14699
- case 6:
14700
- odr = 50;
14701
- break;
14702
- case 7:
14703
- odr = 100;
14704
- break;
14705
- case 8:
14706
- odr = 200;
14707
- break;
14708
- case 9:
14709
- odr = 400;
14710
- break;
14711
- case 10:
14712
- odr = 800;
14713
- break;
14714
- case 11:
14715
- odr = 1600;
14716
- break;
14717
- case 12:
14718
- odr = 3200;
14719
- break;
14720
- case 13:
14721
- odr = 6400;
14722
- break;
14723
- case 14:
14724
- odr = 12800;
14725
- break;
14726
- case 15:
14727
- odr = 25600;
14728
- break;
14729
- default:
14730
- odr = 0;
14731
- }
16722
+ var odr = msbLsb(payload[9], payload[10]);
16723
+ var fsr = payload[11] >> 5;
16724
+ var temperature = msbLsb(payload[14], payload[15])/100;
14732
16725
 
14733
16726
  globalDevices[deviceAddr] = {
14734
16727
  // stream_size: expected_packets,
14735
16728
  data: {},
14736
16729
  odr: odr,
14737
16730
  mo: mode,
14738
- en_axis: en_axis,
14739
16731
  fsr: fsr,
14740
16732
  hour: hour,
14741
16733
  minute: minute,
14742
- device_temp: device_temp,
16734
+ temperature: temperature,
14743
16735
  }
14744
16736
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
14745
16737
  return;
14746
16738
  }
14747
16739
  }
14748
- else if(payload[8] === 0 || payload[8] === 2){
16740
+ else if(payload[8] === 0 || payload[8] === 2 || payload[8] === 3){
14749
16741
  // mode byte most significant bit will indicate fft data.
14750
16742
  // console.log(d);
14751
16743
  var odr;
14752
16744
  switch(payload[9]){
14753
- case 6:
14754
- odr = "50Hz"
14755
- break;
14756
- case 7:
14757
- odr = "100Hz";
14758
- break;
14759
- case 8:
14760
- odr = "200Hz";
14761
- break;
14762
- case 9:
14763
- odr = "400Hz";
14764
- break;
14765
- case 10:
14766
- odr = "800Hz";
14767
- break;
14768
- case 11:
14769
- odr = "1600Hz";
16745
+ case 3:
16746
+ odr = "32.25Hz"
14770
16747
  break;
14771
- case 12:
14772
- odr = "3200Hz";
16748
+ case 4:
16749
+ odr = "62.5Hz";
14773
16750
  break;
14774
- case 13:
14775
- odr = "6400Hz";
16751
+ case 5:
16752
+ odr = "125Hz";
14776
16753
  break;
14777
- case 14:
14778
- odr = "12800Hz";
16754
+ case 6:
16755
+ odr = "250Hz";
14779
16756
  break;
14780
- case 15:
14781
- odr = "25600Hz";
16757
+ case 7:
16758
+ odr = "500Hz";
14782
16759
  break;
14783
16760
  }
14784
16761
  return {
14785
16762
  mode: payload[8],
16763
+ msg_type: msg_type,
14786
16764
 
14787
16765
  odr: odr,
14788
16766
  temperature: signInt(payload.slice(10, 12).reduce(msbLsb), 16) / 100,
@@ -14809,7 +16787,7 @@ function sensor_types(parent){
14809
16787
  z_displacement_mm: payload.slice(46, 48).reduce(msbLsb) / 100,
14810
16788
  z_peak_one_Hz: payload.slice(48, 50).reduce(msbLsb),
14811
16789
  z_peak_two_Hz: payload.slice(50, 52).reduce(msbLsb),
14812
- z_peak_three_Hz: payload.slice(52, 54).reduce(msbLsb),
16790
+ z_peak_three_Hz: payload.slice(52, 54).reduce(msbLsb)
14813
16791
  };
14814
16792
  }
14815
16793
  // else{
@@ -14826,44 +16804,32 @@ function sensor_types(parent){
14826
16804
  case 1:
14827
16805
  frame_data.mode = "Raw";
14828
16806
  break;
14829
- case 2:
14830
- frame_data.mode = "Processed + Raw on demand";
14831
- break;
14832
- }
14833
- switch(frame[17]){
14834
- case 6:
14835
- frame_data.odr_1 = 50;
14836
- break;
14837
- case 7:
14838
- frame_data.odr_1 = 100;
14839
- break;
14840
- case 8:
14841
- frame_data.odr_1 = 200;
14842
- break;
14843
- case 9:
14844
- frame_data.odr_1 = 400;
16807
+ case 2:
16808
+ frame_data.mode = "Processed + Raw on demand";
14845
16809
  break;
14846
- case 10:
14847
- frame_data.odr_1 = 800;
16810
+ case 3:
16811
+ frame_data.mode = "Smart";
14848
16812
  break;
14849
- case 11:
14850
- frame_data.odr_1 = 1600;
16813
+ }
16814
+ switch(frame[17]){
16815
+ case 3:
16816
+ frame_data.odr_1 = 31.25;
14851
16817
  break;
14852
- case 12:
14853
- frame_data.odr_1 = 3200;
16818
+ case 4:
16819
+ frame_data.odr_1 = 62.5;
14854
16820
  break;
14855
- case 13:
14856
- frame_data.odr_1 = 6400;
16821
+ case 5:
16822
+ frame_data.odr_1 = 125;
14857
16823
  break;
14858
- case 14:
14859
- frame_data.odr_1 = 12800;
16824
+ case 6:
16825
+ frame_data.odr_1 = 250;
14860
16826
  break;
14861
- case 15:
14862
- frame_data.odr_1 = 25600;
16827
+ case 7:
16828
+ frame_data.odr_1 = 500;
14863
16829
  break;
14864
16830
  }
14865
- frame_data.sampling_duration_1 = frame[19]*50 + "ms";
14866
- switch(frame[21]){
16831
+ frame_data.sampling_duration_1 = frame[18]*50 + "ms";
16832
+ switch(frame[19]){
14867
16833
  case 0:
14868
16834
  frame_data.filter_status = "Disabled";
14869
16835
  break;
@@ -14871,7 +16837,7 @@ function sensor_types(parent){
14871
16837
  frame_data.filter_status = "Enabled";
14872
16838
  break;
14873
16839
  }
14874
- switch(frame[22]){
16840
+ switch(frame[20]){
14875
16841
  case 0:
14876
16842
  frame_data.lpf_coeff_1 = 4;
14877
16843
  break;
@@ -14904,7 +16870,7 @@ function sensor_types(parent){
14904
16870
  break;
14905
16871
  }
14906
16872
  frame_data.lpf_freq_1 = frame_data.odr_1 / frame_data.lpf_coeff_1;
14907
- switch(frame[24]){
16873
+ switch(frame[21]){
14908
16874
  case 0:
14909
16875
  frame_data.hpf_coeff_1 = 4;
14910
16876
  break;
@@ -14936,40 +16902,49 @@ function sensor_types(parent){
14936
16902
  frame_data.hpf_coeff_1 = 2048;
14937
16903
  break;
14938
16904
  }
14939
- frame_data.hpf_freq_1 = frame_data.odr_1 / frame_data.hpf_coeff_1;
14940
- switch(frame[26]){
16905
+ frame_data.hpf_freq_1 = (frame_data.odr_1 / frame_data.hpf_coeff_1).toFixed(4);
16906
+ switch(frame[22]){
14941
16907
  case 0:
14942
16908
  frame_data.sampling_interval = "5 Minutes";
16909
+ frame_data.sampling_interval_number = 5;
14943
16910
  break;
14944
16911
  case 1:
14945
16912
  frame_data.sampling_interval = "10 Minutes";
16913
+ frame_data.sampling_interval_number = 10;
14946
16914
  break;
14947
16915
  case 2:
14948
16916
  frame_data.sampling_interval = "15 Minutes";
16917
+ frame_data.sampling_interval_number = 15;
14949
16918
  break;
14950
16919
  case 2:
14951
16920
  frame_data.sampling_interval = "20 Minutes";
16921
+ frame_data.sampling_interval_number = 20;
14952
16922
  break;
14953
16923
  case 4:
14954
16924
  frame_data.sampling_interval = "30 Minutes";
16925
+ frame_data.sampling_interval_number = 30;
14955
16926
  break;
14956
16927
  case 5:
14957
16928
  frame_data.sampling_interval = "60 Minutes";
16929
+ frame_data.sampling_interval_number = 60;
14958
16930
  break;
14959
16931
  case 6:
14960
16932
  frame_data.sampling_interval = "120 Minutes";
16933
+ frame_data.sampling_interval_number = 120;
14961
16934
  break;
14962
16935
  case 7:
14963
16936
  frame_data.sampling_interval = "180 Minutes";
16937
+ frame_data.sampling_interval_number = 180;
14964
16938
  break;
14965
16939
  case 8:
14966
16940
  frame_data.sampling_interval = "1 Minute";
16941
+ frame_data.sampling_interval_number = 1;
14967
16942
  break;
14968
16943
  }
14969
- frame_data.on_request_timeout = frame[27] + " Seconds";
14970
- frame_data.deadband = frame[28] + "mg";
16944
+ frame_data.on_request_timeout = frame[23] + " Seconds";
16945
+ frame_data.deadband = frame[24] + "mg";
14971
16946
 
14972
- switch(frame[29]){
16947
+ switch(frame[25]){
14973
16948
  case 0:
14974
16949
  frame_data.payload_length = "50 Bytes";
14975
16950
  break;
@@ -14983,207 +16958,69 @@ function sensor_types(parent){
14983
16958
  frame_data.payload_length = "180 Bytes";
14984
16959
  break;
14985
16960
  }
16961
+ switch(frame[26]){
16962
+ case 0:
16963
+ frame_data.fsr_text = "2g";
16964
+ break;
16965
+ case 1:
16966
+ frame_data.fsr_text = "4g";
16967
+ break;
16968
+ case 2:
16969
+ frame_data.fsr_text = "8g";
16970
+ break;
16971
+ }
16972
+
16973
+ frame_data.auto_raw_interval = frame[31] * frame_data.sampling_interval_number || 'disabled';
16974
+ frame_data.auto_raw_interval = typeof frame_data.auto_raw_interval === 'number' ? frame_data.auto_raw_interval+'min' : frame_data.auto_raw_interval;
16975
+ frame_data.smart_mode_threshold = frame[33] * 50;
16976
+ frame_data.motion_to_delay = frame[41] * 50;
14986
16977
 
14987
16978
  return {
14988
16979
  'firmware': frame[2],
14989
16980
  'destination_address': toMac(frame.slice(12, 16)),
14990
16981
  'mode': frame_data.mode,
14991
- 'odr_1': frame_data.odr_1+'Hz',
14992
- 'sampling_duration_1': frame_data.sampling_duration_1,
16982
+ 'odr': frame_data.odr_1+'Hz',
16983
+ 'sampling_duration': frame_data.sampling_duration_1,
14993
16984
  'filter_status': frame_data.filter_status,
14994
- 'lpf_coeff_1': frame_data.lpf_coeff_1,
14995
- 'lpf_freq_1': frame_data.lpf_freq_1+'Hz',
14996
- 'hpf_coeff_1': frame_data.hpf_coeff_1,
14997
- 'hpf_freq_1': frame_data.hpf_freq_1+'Hz',
16985
+ 'lpf_coeff': frame_data.lpf_coeff_1,
16986
+ 'lpf_freq': frame_data.lpf_freq_1+'Hz',
16987
+ 'hpf_coeff': frame_data.hpf_coeff_1,
16988
+ 'hpf_freq': frame_data.hpf_freq_1+'Hz',
14998
16989
  'sampling_interval': frame_data.sampling_interval,
14999
16990
  'on_request_timeout': frame_data.on_request_timeout,
15000
16991
  'deadband': frame_data.deadband,
15001
16992
  'payload_length': frame_data.payload_length,
16993
+ 'fsr': frame_data.fsr_text,
16994
+ 'auto_raw_destination_address': toMac(frame.slice(27 , 31)),
16995
+ 'auto_raw_interval': frame_data.auto_raw_interval,
16996
+ 'smart_mode_skip_count': frame[32],
16997
+ 'smart_mode_acc_threshold':frame_data.smart_mode_threshold+'mg',
16998
+ 'max_tx_raw_samples': frame.slice(34, 36).reduce(msbLsb),
16999
+ 'hardware_id': frame.slice(36, 39),
17000
+ 'reserved': frame.slice(39, 43),
17001
+ 'tx_lifetime_counter': frame.slice(43, 46).reduce(msbLsb),
15002
17002
  'machine_values': {
15003
17003
  'firmware': frame[2],
15004
17004
  'destination_address': toMac(frame.slice(12, 16), false),
15005
17005
  'mode': frame[16],
15006
- 'odr_1': frame[17],
15007
- 'sampling_duration_1': frame[19],
15008
- 'filter_status': frame[21],
15009
- 'lpf_coeff_1': frame[22],
15010
- 'hpf_coeff_1': frame[24],
15011
- 'sampling_interval': frame[26],
15012
- 'on_request_timeout': frame[27],
15013
- 'deadband': frame[28],
15014
- 'payload_length': frame[29]
15015
- }
15016
- }
15017
- }
15018
- },
15019
- '539': {
15020
- name: 'RS485 Modbus Wireless Converter',
15021
- parse: (d) => {
15022
- return {
15023
- subdevice_type: d[0],
15024
- number_of_registers: d[1],
15025
- status_24_31: d[2],
15026
- status_16_23: d[3],
15027
- status_8_15: d[4],
15028
- status_0_7: d[5],
15029
- // TODO we can automatically determine how many registers are here based on the number_of_registers and create data objects appropriately
15030
- // r1: d.slice(2,4),
15031
- // r2: d.slice(4,6),
15032
- // r3: d.slice(6,8),
15033
- // r4: d.slice(8,10),
15034
- data: d.slice(6)
15035
- };
15036
- },
15037
- },
15038
- '540': {
15039
- name: 'Wireless Ultrasonic Flow Meter FD-Q32C',
15040
- parse: (d) => {
15041
- return {
15042
- raw_adc: d.slice(0, 2).reduce(msbLsb),
15043
- ma: d.slice(2, 4).reduce(msbLsb) / 100,
15044
- flow_ltr_min: d.slice(4, 8).reduce(msbLsb) / 100
15045
- };
15046
- },
15047
- 'parse_fly': (frame) => {
15048
- let firmware = frame[2];
15049
- if(firmware > 13){ // firmware 14 and above
15050
- let frame_data = {};
15051
- let auto_check_interval = frame.slice(20, 22).reduce(msbLsb);
15052
- if(!auto_check_interval){
15053
- frame_data.auto_check_interval = 'Disabled';
15054
- }else{
15055
- frame_data.auto_check_interval = auto_check_interval + " sec";
15056
- }
15057
- frame_data.always_on = frame[24]?"Enabled":"Disabled";
15058
- switch(frame[16]){
15059
- case 0:
15060
- frame_data.fsr = "+-6.114 V";
15061
- break;
15062
- case 1:
15063
- frame_data.fsr = "+-4.096 V";
15064
- break;
15065
- case 2:
15066
- frame_data.fsr = "+-2.048 V";
15067
- break;
15068
- case 3:
15069
- frame_data.fsr = "+-1.024 V";
15070
- break;
15071
- case 4:
15072
- frame_data.fsr = "+-0.512 V";
15073
- break;
15074
- case 5:
15075
- frame_data.fsr = "+-0.256 V";
15076
- break;
15077
- }
15078
- return {
15079
- 'firmware': frame[2],
15080
- 'fsr': frame_data.fsr,
15081
- 'boot_time': frame[17] + " sec",
15082
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
15083
- 'auto_check_interval': frame_data.auto_check_interval,
15084
- 'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
15085
- 'always_on': frame_data.always_on,
15086
- 'calibration_one': frame.slice(25, 29).reduce(msbLsb),
15087
- 'calibration_two':frame.slice(29, 33).reduce(msbLsb),
15088
- 'calibration_three':frame.slice(33, 37).reduce(msbLsb),
15089
- 'hardware_id': frame.slice(37, 40),
15090
- 'report_rate': frame.slice(40, 44).reduce(msbLsb) + " sec",
15091
- 'tx_life_counter': frame.slice(44, 48).reduce(msbLsb),
15092
- 'machine_values': {
15093
- 'firmware': frame[2],
15094
- 'fsr': frame[16],
15095
- 'boot_time': frame[17],
15096
- 'power_adc': frame.slice(18, 20),
15097
- 'auto_check_interval': frame.slice(20, 22),
15098
- 'auto_check_percentage': frame.slice(22, 24),
15099
- 'always_on': frame[24],
15100
- 'calibration_one': frame.slice(25, 29),
15101
- 'calibration_two':frame.slice(29, 33),
15102
- 'calibration_three':frame.slice(33, 37),
15103
- 'hardware_id': frame.slice(37, 40),
15104
- 'report_rate': frame.slice(40, 44),
15105
- 'tx_life_counter': frame.slice(44, 48)
15106
- }
15107
- }
15108
- }
15109
- }
15110
- },
15111
- '541': {
15112
- name: 'Custom Inline Flow Sensor',
15113
- parse: (d) => {
15114
- return {
15115
- adc1: signInt(d.slice(0, 2).reduce(msbLsb)),
15116
- adc2: signInt(d.slice(2, 4).reduce(msbLsb)),
15117
- mA1: signInt(d.slice(4, 6).reduce(msbLsb))/100,
15118
- mA2: signInt(d.slice(6, 8).reduce(msbLsb))/100,
15119
- flow_1: signInt(d.slice(8, 12).reduce(msbLsb))/100,
15120
- flow_2:signInt(d.slice(12, 16).reduce(msbLsb))/100
15121
- };
15122
- },
15123
- 'parse_fly': (frame) => {
15124
- let firmware = frame[2];
15125
- if(firmware > 13){ // firmware 14 and above
15126
- let frame_data = {};
15127
- let auto_check_interval = frame.slice(20, 22).reduce(msbLsb);
15128
- if(!auto_check_interval){
15129
- frame_data.auto_check_interval = 'Disabled';
15130
- }else{
15131
- frame_data.auto_check_interval = auto_check_interval + " sec";
15132
- }
15133
- frame_data.always_on = frame[24]?"Enabled":"Disabled";
15134
- switch(frame[16]){
15135
- case 0:
15136
- frame_data.fsr = "+-6.114 V";
15137
- break;
15138
- case 1:
15139
- frame_data.fsr = "+-4.096 V";
15140
- break;
15141
- case 2:
15142
- frame_data.fsr = "+-2.048 V";
15143
- break;
15144
- case 3:
15145
- frame_data.fsr = "+-1.024 V";
15146
- break;
15147
- case 4:
15148
- frame_data.fsr = "+-0.512 V";
15149
- break;
15150
- case 5:
15151
- frame_data.fsr = "+-0.256 V";
15152
- break;
15153
- }
15154
- return {
15155
- 'firmware': frame[2],
15156
- 'fsr': frame_data.fsr,
15157
- 'boot_up_time': frame[17] + " sec",
15158
- 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
15159
- 'auto_check_interval': frame_data.auto_check_interval,
15160
- 'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
15161
- 'always_on': frame_data.always_on,
15162
- 'calibration_one': frame.slice(25, 29).reduce(msbLsb),
15163
- 'calibration_two':frame.slice(29, 33).reduce(msbLsb),
15164
- 'calibration_three':frame.slice(33, 37).reduce(msbLsb),
15165
- 'min_flow_rate':frame.slice(37, 39).reduce(msbLsb),
15166
- 'max_flow_rate':frame.slice(39, 41).reduce(msbLsb),
15167
- 'hardware_id': frame.slice(41, 44),
15168
- 'report_rate': frame.slice(44, 48).reduce(msbLsb) + " sec",
15169
- 'tx_life_counter': frame.slice(48, 52).reduce(msbLsb),
15170
- 'machine_values': {
15171
- 'firmware': frame[2],
15172
- 'fsr': frame[16],
15173
- 'boot_up_time': frame[17],
15174
- 'adc_pin_reading': frame.slice(18, 20),
15175
- 'auto_check_interval': frame.slice(20, 22),
15176
- 'auto_check_percentage': frame.slice(22, 24),
15177
- 'always_on': frame[24],
15178
- 'calibration_one': frame.slice(25, 29),
15179
- 'calibration_two':frame.slice(29, 33),
15180
- 'calibration_three':frame.slice(33, 37),
15181
- 'min_flow_rate':frame.slice(37, 39),
15182
- 'max_flow_rate':frame.slice(39, 41),
15183
- 'hardware_id': frame.slice(41, 44),
15184
- 'report_rate': frame.slice(44, 48),
15185
- 'tx_life_counter': frame.slice(48, 52),
15186
- }
17006
+ 'odr': frame[17],
17007
+ 'sampling_duration': frame[18],
17008
+ 'filter_status': frame[19],
17009
+ 'lpf_coeff': frame[20],
17010
+ 'hpf_coeff': frame[21],
17011
+ 'sampling_interval': frame[22],
17012
+ 'on_request_timeout': frame[23],
17013
+ 'deadband': frame[24],
17014
+ 'payload_length': frame[25],
17015
+ 'fsr': frame[26],
17016
+ 'auto_raw_destination_address': toMac(frame.slice(27 , 31), false),
17017
+ 'auto_raw_interval': frame[31],
17018
+ 'smart_mode_skip_count': frame[32],
17019
+ 'smart_mode_acc_threshold':frame[33],
17020
+ 'max_tx_raw_samples': frame.slice(34, 36),
17021
+ 'hardware_id': frame.slice(36, 39),
17022
+ 'reserved': frame.slice(39, 43),
17023
+ 'tx_lifetime_counter': frame.slice(43, 46)
15187
17024
  }
15188
17025
  }
15189
17026
  }
@@ -15300,6 +17137,38 @@ function int2Bytes(i, l){
15300
17137
  }
15301
17138
  return bytes;
15302
17139
  }
17140
+ function msbLsb_to_SignedInt(value, addition) {
17141
+ const bigValue = BigInt(value);
17142
+ const bigAddition = BigInt(addition);
17143
+
17144
+ let result = (bigValue << 8n) + bigAddition;
17145
+
17146
+ // Always return the result as an unsigned 64-bit BigInt.
17147
+ return BigInt.asIntN(64, result);
17148
+ };
17149
+ function msbLsb_to_UnsignedInt(value, addition) {
17150
+ const bigValue = BigInt(value);
17151
+ const bigAddition = BigInt(addition);
17152
+
17153
+ let result = (bigValue << 8n) + bigAddition;
17154
+
17155
+ // Always return the result as a signed 64-bit BigInt.
17156
+ return BigInt.asUintN(64, result);
17157
+ };
17158
+ // TODO implement this function in future for decimal formatting on BigInt values
17159
+ // Untested. Requires multiplication by scale factor to account for decimal value loss before passing in. Might handle that in this function as well.
17160
+ // function formatFixedPoint(bigIntValue, decimalPlaces) {
17161
+ // let sign = bigIntValue < 0n ? "-" : "";
17162
+ // let absValue = bigIntValue < 0n ? -bigIntValue : bigIntValue;
17163
+
17164
+ // let s = absValue.toString();
17165
+ // if (s.length <= decimalPlaces) {
17166
+ // s = '0'.repeat(decimalPlaces - s.length + 1) + s;
17167
+ // }
17168
+
17169
+ // let decimalIndex = s.length - decimalPlaces;
17170
+ // return sign + s.substring(0, decimalIndex) + '.' + s.substring(decimalIndex);
17171
+ // }
15303
17172
  function signInt(i, b){
15304
17173
  if(i.toString(2).length != b) return i;
15305
17174
  return -(((~i) & ((1 << (b-1))-1))+1);