@ncd-io/node-red-enterprise-sensors 1.4.3 → 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) => {
@@ -4183,12 +4415,9 @@ function sensor_types(parent){
4183
4415
  'auto_check_interval': frame_data.auto_check_interval,
4184
4416
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
4185
4417
  'always_on': frame_data.always_on,
4186
- 'calibration_one': frame.slice(25, 29).reduce(msbLsb),
4187
- 'calibration_two':frame.slice(29, 33).reduce(msbLsb),
4188
- 'calibration_three':frame.slice(33, 37).reduce(msbLsb),
4189
- 'hardware_id': frame.slice(37, 40),
4190
- 'report_rate': frame.slice(40, 44).reduce(msbLsb) + " sec",
4191
- 'tx_life_counter': frame.slice(44, 48).reduce(msbLsb),
4418
+ 'hardware_id': frame.slice(25, 28),
4419
+ 'report_rate': frame.slice(28, 32).reduce(msbLsb) + " sec",
4420
+ 'tx_life_counter': frame.slice(32, 36).reduce(msbLsb),
4192
4421
  'machine_values': {
4193
4422
  'firmware': frame[2],
4194
4423
  'fsr': frame[16],
@@ -8668,7 +8897,7 @@ function sensor_types(parent){
8668
8897
  }
8669
8898
  },
8670
8899
  'parse_fly': (frame) => {
8671
- if(frame[2] > 9){ // firmware 10 and above
8900
+ if(frame[2] == 19){ // Screen version fw 19
8672
8901
  let reset_mode = "Disabled";
8673
8902
  switch(frame[38]){
8674
8903
  case 0:
@@ -8681,40 +8910,40 @@ function sensor_types(parent){
8681
8910
  reset_mode = "Timeout";
8682
8911
  break;
8683
8912
  }
8684
- let acc_odr = "10Hz";
8913
+ let acc_odr = "10 Hz";
8685
8914
  switch(frame[40]){
8686
8915
  case 0:
8687
- acc_odr = "10Hz";
8916
+ acc_odr = "10 Hz";
8688
8917
  break;
8689
8918
  case 1:
8690
- acc_odr = "20Hz";
8919
+ acc_odr = "20 Hz";
8691
8920
  break;
8692
8921
  case 2:
8693
- acc_odr = "50Hz";
8922
+ acc_odr = "50 Hz";
8694
8923
  break;
8695
8924
  case 3:
8696
- acc_odr = "100Hz";
8925
+ acc_odr = "100 Hz";
8697
8926
  break;
8698
8927
  case 4:
8699
- acc_odr = "200Hz";
8928
+ acc_odr = "200 Hz";
8700
8929
  break;
8701
8930
  case 5:
8702
- acc_odr = "400Hz";
8931
+ acc_odr = "400 Hz";
8703
8932
  break;
8704
8933
  }
8705
- let rtc_sampling_interval = "5 seconds";
8934
+ let rtc_sampling_interval = "5 sec";
8706
8935
  switch(frame[39]){
8707
8936
  case 0:
8708
- rtc_sampling_interval = "1 minute";
8937
+ rtc_sampling_interval = "1 min";
8709
8938
  break;
8710
8939
  case 1:
8711
- rtc_sampling_interval = "5 minutes";
8940
+ rtc_sampling_interval = "5 min";
8712
8941
  break;
8713
8942
  case 2:
8714
- rtc_sampling_interval = "15 minutes";
8943
+ rtc_sampling_interval = "15 min";
8715
8944
  break;
8716
8945
  case 3:
8717
- rtc_sampling_interval = "30 minutes";
8946
+ rtc_sampling_interval = "30 min";
8718
8947
  break;
8719
8948
  case 4:
8720
8949
  rtc_sampling_interval = "1 hour";
@@ -8732,22 +8961,40 @@ function sensor_types(parent){
8732
8961
  rtc_sampling_interval = "12 hours";
8733
8962
  break;
8734
8963
  case 9:
8735
- rtc_sampling_interval = "5 seconds";
8964
+ rtc_sampling_interval = "5 sec";
8736
8965
  break;
8737
8966
  case 10:
8738
- rtc_sampling_interval = "10 seconds";
8967
+ rtc_sampling_interval = "10 sec";
8739
8968
  break;
8740
8969
  case 11:
8741
- rtc_sampling_interval = "15 seconds";
8970
+ rtc_sampling_interval = "15 sec";
8742
8971
  break;
8743
8972
  case 12:
8744
- 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";
8745
8992
  break;
8746
8993
  }
8747
8994
  return {
8748
8995
  'firmware': frame[2],
8749
- 'accelerometer_threshold': (frame[16]* 32) + "mg",
8750
- '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",
8751
8998
  'accelero_state': frame[19]? "Enabled": "Disabled",
8752
8999
  'input_1_active_edge': frame[20]? "Rising": "Falling",
8753
9000
  'input_2_active_edge': frame[21]? "Rising": "Falling",
@@ -8770,13 +9017,16 @@ function sensor_types(parent){
8770
9017
  String(frame[34]).padStart(2, '0'),
8771
9018
  String(frame[35]).padStart(2, '0')
8772
9019
  ].join(':'),
8773
- 'reset_timeout': frame.slice(36, 38).reduce(msbLsb) + "min",
9020
+ 'reset_timeout': frame.slice(36, 38).reduce(msbLsb) + " min",
8774
9021
  'counter_reset_mode': reset_mode,
8775
9022
  'sampling_interval': rtc_sampling_interval,
8776
9023
  'acc_odr': acc_odr,
8777
- 'hardware_id': frame.slice(41, 44),
8778
- 'report_rate': frame.slice(44, 48).reduce(msbLsb) + "sec",
8779
- '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),
8780
9030
  'machine_values': {
8781
9031
  'firmware': frame[2],
8782
9032
  'accelerometer_threshold': frame[16],
@@ -8795,14 +9045,17 @@ function sensor_types(parent){
8795
9045
  'counter_reset_mode': frame[38],
8796
9046
  'sampling_interval': frame[39],
8797
9047
  'acc_odr': frame[40],
8798
- 'hardware_id': frame.slice(41, 44),
8799
- 'report_rate': frame.slice(44, 48),
8800
- '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)
8801
9054
  }
8802
9055
  }
8803
- } else if(frame[2] > 8){
9056
+ } else if(frame[2] == 16){ // Screen version
8804
9057
  let reset_mode = "Disabled";
8805
- switch(frame[37]){
9058
+ switch(frame[38]){
8806
9059
  case 0:
8807
9060
  reset_mode = "Disabled";
8808
9061
  break;
@@ -8814,7 +9067,7 @@ function sensor_types(parent){
8814
9067
  break;
8815
9068
  }
8816
9069
  let acc_odr = "10Hz";
8817
- switch(frame[39]){
9070
+ switch(frame[40]){
8818
9071
  case 0:
8819
9072
  acc_odr = "10Hz";
8820
9073
  break;
@@ -8835,7 +9088,7 @@ function sensor_types(parent){
8835
9088
  break;
8836
9089
  }
8837
9090
  let rtc_sampling_interval = "5 seconds";
8838
- switch(frame[38]){
9091
+ switch(frame[39]){
8839
9092
  case 0:
8840
9093
  rtc_sampling_interval = "1 minute";
8841
9094
  break;
@@ -8876,97 +9129,217 @@ function sensor_types(parent){
8876
9129
  rtc_sampling_interval = "30 seconds";
8877
9130
  break;
8878
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
+ }
8879
9150
  return {
8880
9151
  'firmware': frame[2],
8881
9152
  'accelerometer_threshold': (frame[16]* 32) + "mg",
8882
- 'debouncing_timeout': frame[17] + "msec",
8883
- 'accelero_state': frame[18]? "Enabled": "Disabled",
8884
- 'input_1_active_edge': frame[19]? "Rising": "Falling",
8885
- 'input_2_active_edge': frame[20]? "Rising": "Falling",
8886
- 'input_3_active_edge': frame[21]? "Rising": "Falling",
8887
- 'counter_threshold': frame.slice(22, 26).reduce(msbLsb),
8888
- '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",
8889
9160
  'Shift_end_1': [
8890
- String(frame[27]).padStart(2, '0'),
8891
- String(frame[28]).padStart(2, '0')
9161
+ String(frame[28]).padStart(2, '0'),
9162
+ String(frame[29]).padStart(2, '0')
8892
9163
  ].join(':'),
8893
9164
  'Shift_end_2': [
8894
- String(frame[29]).padStart(2, '0'),
8895
- String(frame[30]).padStart(2, '0')
9165
+ String(frame[30]).padStart(2, '0'),
9166
+ String(frame[31]).padStart(2, '0')
8896
9167
  ].join(':'),
8897
9168
  'Shift_end_3': [
8898
- String(frame[31]).padStart(2, '0'),
8899
- String(frame[32]).padStart(2, '0')
9169
+ String(frame[32]).padStart(2, '0'),
9170
+ String(frame[33]).padStart(2, '0')
8900
9171
  ].join(':'),
8901
9172
  'Shift_end_4': [
8902
- String(frame[33]).padStart(2, '0'),
8903
- String(frame[34]).padStart(2, '0')
9173
+ String(frame[34]).padStart(2, '0'),
9174
+ String(frame[35]).padStart(2, '0')
8904
9175
  ].join(':'),
8905
- 'reset_timeout': frame.slice(35, 37).reduce(msbLsb) + "min",
9176
+ 'reset_timeout': frame.slice(36, 38).reduce(msbLsb) + "min",
8906
9177
  'counter_reset_mode': reset_mode,
8907
9178
  'sampling_interval': rtc_sampling_interval,
8908
9179
  'acc_odr': acc_odr,
8909
- 'hardware_id': frame.slice(40, 43),
8910
- 'report_rate': frame.slice(43, 47).reduce(msbLsb) + "sec",
8911
- '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),
8912
9185
  'machine_values': {
8913
9186
  'firmware': frame[2],
8914
9187
  'accelerometer_threshold': frame[16],
8915
- 'debouncing_timeout': frame[17],
8916
- 'accelero_state': frame[18],
8917
- 'input_1_active_edge': frame[19],
8918
- 'input_2_active_edge': frame[20],
8919
- 'input_3_active_edge': frame[21],
8920
- 'counter_threshold': frame.slice(22, 26),
8921
- 'trasnmit_on_change_status': frame[26],
8922
- 'Shift_end_1': frame.slice(27, 29),
8923
- 'Shift_end_2': frame.slice(29, 31),
8924
- 'Shift_end_3': frame.slice(31, 33),
8925
- 'Shift_end_4': frame.slice(33, 35),
8926
- 'reset_timeout': frame.slice(35, 37),
8927
- 'counter_reset_mode': frame[37],
8928
- 'sampling_interval': frame[38],
8929
- 'acc_odr': frame[39],
8930
- 'hardware_id': frame.slice(40, 43),
8931
- 'report_rate': frame.slice(43, 47),
8932
- 'tx_life_counter': frame.slice(47, 51)
8933
- }
8934
- }
8935
- } else{
8936
- return {
8937
- 'firmware': frame[2],
8938
- 'report_rate': frame.slice(12, 16).reduce(msbLsb).toString() + "sec.",
8939
- 'accelerometer_threshold': (frame[16]* 32) + "mg.",
8940
- 'debouncing_timeout': frame[17].toString() + "msec.",
8941
- 'accelero_state': frame[18],
8942
- 'digital_inputs_active_edge': frame.slice(19, 22).reduce(msbLsb),
8943
- 'counter_threshold': frame.slice(22, 26).reduce(msbLsb),
8944
- 'trasnmit_on_change_status': frame[26],
8945
- 'machine_values': {
8946
- 'firmware': frame[2],
8947
- 'report_rate': frame.slice(12, 16),
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)
9208
+ }
9209
+ }
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),
9319
+ 'machine_values': {
9320
+ 'firmware': frame[2],
8948
9321
  'accelerometer_threshold': frame[16],
8949
- 'debouncing_timeout': frame[17],
8950
- 'accelero_active_state': frame[18],
8951
- 'digital_inputs_active_edge': frame.slice(19, 22),
8952
- 'counter_threshold': frame.slice(22, 26),
8953
- '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)
8954
9340
  }
8955
9341
  }
8956
- }
8957
- }
8958
- },
8959
- '109': {
8960
- name: 'Wireless Custom Solar Sensor',
8961
- parse: (d) => {
8962
- return {
8963
- illuminance: d.slice(0, 4).reduce(msbLsb),
8964
- total_solar_radiation: d.slice(4, 6).reduce(msbLsb),
8965
- ultraviolet_radiation: d.slice(6, 8).reduce(msbLsb)
8966
- };
8967
- },
8968
- 'parse_fly': (frame) => {
8969
- if(frame[2] > 8){
9342
+ } else if(frame[2] > 8){
8970
9343
  let reset_mode = "Disabled";
8971
9344
  switch(frame[37]){
8972
9345
  case 0:
@@ -9045,12 +9418,12 @@ function sensor_types(parent){
9045
9418
  return {
9046
9419
  'firmware': frame[2],
9047
9420
  'accelerometer_threshold': (frame[16]* 32) + "mg",
9048
- 'debouncing_timeout': frame[17] + "sec",
9421
+ 'debouncing_timeout': frame[17] + "msec",
9049
9422
  'accelero_state': frame[18]? "Enabled": "Disabled",
9050
9423
  'input_1_active_edge': frame[19]? "Rising": "Falling",
9051
9424
  'input_2_active_edge': frame[20]? "Rising": "Falling",
9052
9425
  'input_3_active_edge': frame[21]? "Rising": "Falling",
9053
- 'counter_threshold': frame.slice(22, 26).reduce(msbLsb) + "sec",
9426
+ 'counter_threshold': frame.slice(22, 26).reduce(msbLsb),
9054
9427
  'trasnmit_on_change_status': frame[26]? "Enabled": "Disabled",
9055
9428
  'Shift_end_1': [
9056
9429
  String(frame[27]).padStart(2, '0'),
@@ -9102,11 +9475,11 @@ function sensor_types(parent){
9102
9475
  return {
9103
9476
  'firmware': frame[2],
9104
9477
  'report_rate': frame.slice(12, 16).reduce(msbLsb).toString() + "sec.",
9105
- 'accelerometer_threshold': (frame[16]* 32).toString() + "mg.",
9106
- 'debouncing_timeout': frame[17].toString() + "sec.",
9478
+ 'accelerometer_threshold': (frame[16]* 32) + "mg.",
9479
+ 'debouncing_timeout': frame[17].toString() + "msec.",
9107
9480
  'accelero_state': frame[18],
9108
9481
  'digital_inputs_active_edge': frame.slice(19, 22).reduce(msbLsb),
9109
- 'counter_threshold': frame.slice(22, 26).reduce(msbLsb).toString() + "sec.",
9482
+ 'counter_threshold': frame.slice(22, 26).reduce(msbLsb),
9110
9483
  'trasnmit_on_change_status': frame[26],
9111
9484
  'machine_values': {
9112
9485
  'firmware': frame[2],
@@ -9132,74 +9505,240 @@ function sensor_types(parent){
9132
9505
  };
9133
9506
  },
9134
9507
  'parse_fly': (frame) => {
9135
- return {
9136
- 'firmware': frame[2],
9137
- 'hardware_id': frame.slice(12, 15),
9138
- 'sample_rate': frame.slice(15, 19).reduce(msbLsb) + " Sec.",
9139
- 'tx_life_counter': frame.slice(19, 23).reduce(msbLsb),
9140
- 'machine_values': {
9141
- 'firmware': frame[2],
9142
- 'hardware_id': frame.slice(12, 15),
9143
- 'sample_rate': frame.slice(15, 19).reduce(msbLsb),
9144
- '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;
9145
9520
  }
9146
- }
9147
- }
9148
- },
9149
- '110': {
9150
- name: 'One Channel Vibration Plus v4',
9151
- parse: (payload, parsed, mac) => {
9152
- if(payload[7] & 2){
9153
- console.log('Error found');
9154
- parsed.data = {error: 'Error found, Sensor Probe may be unattached'};
9155
- return parsed;
9156
- }
9157
- let msg_type = (payload[7] & 16)? 'motion' : 'regular';
9158
- if(payload[8] === 1){
9159
- var deviceAddr = mac;
9160
- var firmware = payload[1];
9161
- var hour = payload[12];
9162
- var minute = payload[13];
9163
- var expected_packets = msbLsb(payload[16], payload[17]);
9164
- var current_packet = msbLsb(payload[18], payload[19]);
9165
- var sdata_start = 20;
9166
-
9167
- if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
9168
- if(expected_packets != 1){
9169
- // 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
9170
- if(current_packet in globalDevices[deviceAddr].data || current_packet == 1 || !(((current_packet)-1) in globalDevices[deviceAddr].data)) {
9171
- console.log('-----');
9172
- console.log('bad packet breakdown deleting stream');
9173
- console.log(current_packet);
9174
- console.log(expected_packets);
9175
- console.log(current_packet in globalDevices[deviceAddr].data);
9176
- console.log(current_packet == 1);
9177
- console.log(!((current_packet-1) in globalDevices[deviceAddr].data));
9178
- if(this.hasOwnProperty('failure_no')){
9179
- this.failure_no = this.failure_no + 1;
9180
- }
9181
- else{
9182
- this.failure_no = 1;
9183
- }
9184
- if(this.hasOwnProperty('failure_no')){
9185
- console.log('####falure no');
9186
- console.log(this.failure_no);
9187
- }
9188
- // console.log(globalDevices[deviceAddr].data);
9189
- delete globalDevices[deviceAddr];
9190
- if(current_packet != 1){
9191
- return;
9192
- } else{
9193
-
9194
- var mode = payload[8];
9195
- var odr = msbLsb(payload[9], payload[10]);
9196
- var fsr = payload[11] >> 5;
9197
- var temperature = msbLsb(payload[14], payload[15])/100;
9198
-
9199
- globalDevices[deviceAddr] = {
9200
- // stream_size: expected_packets,
9201
- data: {},
9202
- odr: odr,
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,
9203
9742
  mo: mode,
9204
9743
  fsr: fsr,
9205
9744
  hour: hour,
@@ -12128,10 +12667,10 @@ function sensor_types(parent){
12128
12667
  name: 'Dual Pressure and Temperature Sensor',
12129
12668
  parse: (d) => {
12130
12669
  return{
12131
- pressure_s1: signInt(d.slice(0, 4).reduce(msbLsb)) / 100,
12132
- temperature_s1: signInt(d.slice(4, 6).reduce(msbLsb))/100,
12133
- pressure_s2: signInt(d.slice(6, 10).reduce(msbLsb)) / 100,
12134
- 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
12135
12674
  };
12136
12675
  },
12137
12676
  'parse_fly': (frame) => {
@@ -12207,35 +12746,308 @@ function sensor_types(parent){
12207
12746
  }
12208
12747
  }
12209
12748
  },
12210
- '120': {
12211
- name: 'Wireless H2S Sensor',
12212
- parse: (d) => {
12213
- return {
12214
- ppm: d.slice(0, 2).reduce(msbLsb),
12215
- temperature: signInt(d.slice(2, 4).reduce(msbLsb), 16) / 100,
12216
- humidity: signInt(d.slice(4, 6).reduce(msbLsb), 16) / 100
12217
- };
12218
- },
12219
- 'parse_fly': (frame) => {
12220
- return {
12221
- 'firmware': frame[2],
12222
- 'h2s_threshold': frame[12],
12223
- 'always_on_status': frame[13],
12224
- 'hardware_id': frame.slice(14, 17),
12225
- 'sample_rate': frame.slice(17, 21).reduce(msbLsb) + " Sec.",
12226
- 'tx_life_counter': frame.slice(21, 25).reduce(msbLsb),
12227
- 'machine_values': {
12228
- 'firmware': frame[2],
12229
- 'h2s threshold': frame[12],
12230
- 'always_on_status': frame[13],
12231
- 'hardware_id': frame.slice(14, 17),
12232
- 'sample_rate': frame.slice(17, 21).reduce(msbLsb),
12233
- 'tx_life_counter': frame.slice(21, 25).reduce(msbLsb)
12234
- }
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;
12235
12758
  }
12236
- }
12237
- },
12238
- '121':{
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],
13043
+ 'hardware_id': frame.slice(14, 17),
13044
+ 'sample_rate': frame.slice(17, 21).reduce(msbLsb),
13045
+ 'tx_life_counter': frame.slice(21, 25).reduce(msbLsb)
13046
+ }
13047
+ }
13048
+ }
13049
+ },
13050
+ '121':{
12239
13051
  name: 'Wireless Wood Moisture Sensor',
12240
13052
  parse: (d) => {
12241
13053
  return {
@@ -12305,7 +13117,7 @@ function sensor_types(parent){
12305
13117
  'firmware': frame[2],
12306
13118
  'fsr': frame_data.fsr,
12307
13119
  'boot_time': frame[17] + " sec",
12308
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
13120
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
12309
13121
  'auto_check_interval': frame_data.auto_check_interval,
12310
13122
  'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
12311
13123
  'always_on': frame_data[24] ? 'Enabled' : 'Disabled',
@@ -12319,7 +13131,7 @@ function sensor_types(parent){
12319
13131
  'firmware': frame[2],
12320
13132
  'fsr': frame[16],
12321
13133
  'boot_time': frame[17],
12322
- 'power_adc': frame.slice(18, 20),
13134
+ 'adc_pin_reading': frame.slice(18, 20),
12323
13135
  'auto_check_interval': frame.slice(20, 22),
12324
13136
  'auto_check_percentage': frame.slice(22, 24),
12325
13137
  'always_on': frame[24],
@@ -12488,9 +13300,10 @@ function sensor_types(parent){
12488
13300
  'reset_timeout': frame.slice(34, 36).reduce(msbLsb) + "min",
12489
13301
  'counter_reset_mode': reset_mode,
12490
13302
  'sampling_interval': rtc_sampling_interval,
12491
- 'hardware_id': frame.slice(38, 41),
12492
- 'report_rate': frame.slice(41, 45).reduce(msbLsb) + "sec",
12493
- '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),
12494
13307
  'machine_values': {
12495
13308
  'firmware': frame[2],
12496
13309
  'debouncing_timeout': frame.slice(16, 18),
@@ -12506,185 +13319,639 @@ function sensor_types(parent){
12506
13319
  'reset_timeout': frame.slice(34, 36),
12507
13320
  'counter_reset_mode': frame[36],
12508
13321
  'sampling_interval': frame[37],
12509
- 'hardware_id': frame.slice(38, 41),
12510
- 'report_rate': frame.slice(41, 45),
12511
- '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)
12512
13326
  }
12513
13327
  }
12514
13328
  }
12515
13329
  },
12516
- '180': {
12517
- name: 'C1D2 One Channel Vibration Plus',
12518
- parse: (payload, parsed, mac) => {
12519
- return parent.sensor_types[80].parse(payload, parsed, mac);
12520
- },
12521
- parse_fly: (payload, parsed, mac) => {
12522
- return parent.sensor_types[80].parse_fly(payload, parsed, mac);
12523
- },
12524
- },
12525
- '181': {
12526
- name: 'C1D2 Two Channel Vibration Plus',
12527
- parse: (payload, parsed, mac) => {
12528
- return parent.sensor_types[81].parse(payload, parsed, mac);
12529
- },
12530
- parse_fly: (payload, parsed, mac) => {
12531
- return parent.sensor_types[81].parse_fly(payload, parsed, mac);
12532
- },
12533
- },
12534
- '200': {
12535
- name: '4-20mA Pass Through',
13330
+ '124': {
13331
+ name: 'Wireless EH Flow Sensor',
12536
13332
  parse: (d) => {
12537
- var adc1 = signInt(d.slice(0, 2).reduce(msbLsb));
12538
- var adc2 = signInt(d.slice(2, 4).reduce(msbLsb));
12539
- var dac1 = signInt(d.slice(4, 6).reduce(msbLsb));
12540
- return {
12541
- adc1: adc1,
12542
- adc2: adc2,
12543
- dac1: dac1,
12544
- mA1: parseFloat((adc1/100.00).toFixed(2)),
12545
- raw_adc: adc2,
12546
- raw_dac: dac1
12547
- };
12548
- }
12549
- },
12550
- '202': {
12551
- name: 'Wireless Weather Station',
12552
- parse: (payload, parsed, mac) => {
12553
13333
  return {
12554
- Temp: signInt(payload.slice(8, 12).reduce(msbLsb), 32) / 100,
12555
- Humid: signInt(payload.slice(12, 16).reduce(msbLsb), 32) / 100,
12556
- Pressure: signInt(payload.slice(16, 20).reduce(msbLsb), 32) / 100,
12557
- WindSpd: signInt(payload.slice(20, 24).reduce(msbLsb),32) / 100,
12558
- WindDir: signInt(payload.slice(24, 28).reduce(msbLsb),32) / 100,
12559
- reserve: payload[7]
12560
- };
12561
- }
12562
- },
12563
- '211': {
12564
- name: 'D0 and Flow Sensor',
12565
- parse: (payload, parsed, mac) => {
12566
- if(payload[0] == 0){ // regular
12567
- return {
12568
- msg_type: 'regular',
12569
- temperature: signInt(payload.slice(1, 3).reduce(msbLsb), 16),
12570
- oxygen_saturation_percent: payload.slice(3, 7).reduce(msbLsb),
12571
- oxygen_ppm: payload.slice(7, 11).reduce(msbLsb),
12572
- oxygen_mg_l: payload.slice(11, 15).reduce(msbLsb)
12573
- };
12574
- }
12575
- else{ // theshold
12576
- let solenoid_status = payload[2];
12577
- if(solenoid_status == 1){ // Solenoid On
12578
- return {
12579
- msg_type: 'threshold',
12580
- solenoid_number: payload[1],
12581
- solenoid_status: 'on',
12582
- temperature: signInt(payload.slice(3, 5).reduce(msbLsb), 16),
12583
- oxygen_saturation_percent: payload.slice(5, 9).reduce(msbLsb),
12584
- oxygen_ppm: payload.slice(9, 13).reduce(msbLsb),
12585
- oxygen_mg_l: payload.slice(13, 17).reduce(msbLsb),
12586
- flow_rate: payload.slice(17, 21).reduce(msbLsb)
12587
- };
12588
- } else{ // Solenoid Off
12589
- return {
12590
- msg_type: 'threshold',
12591
- solenoid_number: payload[1],
12592
- solenoid_status: 'off',
12593
- temperature: signInt(payload.slice(3, 5).reduce(msbLsb), 16),
12594
- oxygen_saturation_percent: payload.slice(5, 9).reduce(msbLsb),
12595
- oxygen_ppm: payload.slice(9, 13).reduce(msbLsb),
12596
- oxygen_mg_l: payload.slice(13, 17).reduce(msbLsb)
12597
- };
12598
- }
12599
- }
12600
- },
12601
- 'parse_fly': (frame) => {
12602
- return {
12603
- 'firmware': frame[2],
12604
- 'hardware_id': frame.slice(12, 15),
12605
- 'report_rate': frame.slice(15, 19).reduce(msbLsb) + "Sec",
12606
- 'tx_life_counter': frame.slice(19, 23).reduce(msbLsb),
12607
- 'machine_values': {
12608
- 'firmware': frame[2],
12609
- 'hardware_id': frame.slice(12, 15),
12610
- 'report_rate': frame.slice(15, 19),
12611
- 'tx_life_counter': frame.slice(19, 23)
12612
- }
12613
- }
12614
- }
12615
- },
12616
- '217': {
12617
- name: 'Wireless Weight Scale',
12618
- parse: (d) => {
12619
- return {
12620
- weight: signInt(d.slice(0, 4).reduce(msbLsb)) / 100
12621
- };
12622
- }
12623
- },
12624
- '270': {
12625
- name: 'Custom Salinity DO sensor',
12626
- parse: (d) => {
12627
- return {
12628
- sensor_status: d[0],
12629
- do_temperature_1: d.slice(1, 3).reduce(msbLsb) / 100,
12630
- do_temperature_2: d.slice(3, 5).reduce(msbLsb) / 100,
12631
- do_temperature_3: d.slice(5, 7).reduce(msbLsb) / 100,
12632
- do_temperature_4: d.slice(7, 9).reduce(msbLsb) / 100,
12633
- ec_temperature_1: d.slice(9, 11).reduce(msbLsb) / 100,
12634
- ec_temperature_2: d.slice(11, 13).reduce(msbLsb) / 100,
12635
- ec_temperature_3: d.slice(13, 15).reduce(msbLsb) / 100,
12636
- ec_temperature_4: d.slice(15, 17).reduce(msbLsb) / 100,
12637
- do_saturation_perc_1: d.slice(17, 19).reduce(msbLsb) / 100,
12638
- do_saturation_perc_2: d.slice(19, 21).reduce(msbLsb) / 100,
12639
- do_saturation_perc_3: d.slice(21, 23).reduce(msbLsb) / 100,
12640
- do_saturation_perc_4: d.slice(23, 25).reduce(msbLsb) / 100,
12641
- do_ppm_1: d.slice(25, 27).reduce(msbLsb) / 100,
12642
- do_ppm_2: d.slice(27, 29).reduce(msbLsb) / 100,
12643
- do_ppm_3: d.slice(29, 31).reduce(msbLsb) / 100,
12644
- do_ppm_4: d.slice(31, 33).reduce(msbLsb) / 100,
12645
- do_mgl_1: d.slice(33, 35).reduce(msbLsb) / 100,
12646
- do_mgl_2: d.slice(35, 37).reduce(msbLsb) / 100,
12647
- do_mgl_3: d.slice(37, 39).reduce(msbLsb) / 100,
12648
- do_mgl_4: d.slice(39, 41).reduce(msbLsb) / 100,
12649
- ec_conductivity_1: d.slice(41, 43).reduce(msbLsb) / 100,
12650
- ec_conductivity_2: d.slice(43, 45).reduce(msbLsb) / 100,
12651
- ec_conductivity_3: d.slice(45, 47).reduce(msbLsb) / 100,
12652
- ec_conductivity_4: d.slice(47, 49).reduce(msbLsb) / 100,
12653
- ec_salinity_ppt_1: d.slice(49, 57).reduce(msbLsb) / 100,
12654
- ec_salinity_ppt_2: d.slice(57, 65).reduce(msbLsb) / 100,
12655
- ec_salinity_ppt_3: d.slice(65, 73).reduce(msbLsb) / 100,
12656
- ec_salinity_ppt_4: d.slice(73, 81).reduce(msbLsb) / 100,
12657
- ec_tds_1: d.slice(81, 85).reduce(msbLsb) / 100,
12658
- ec_tds_2: d.slice(85, 89).reduce(msbLsb) / 100,
12659
- ec_tds_3: d.slice(89, 93).reduce(msbLsb) / 100,
12660
- 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)
12661
13347
  };
12662
13348
  },
12663
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
+ }
12664
13757
  return {
12665
13758
  'firmware': frame[2],
12666
- 'do_bootup_time': frame[12] + "Sec",
12667
- 'ec_bootup_time': frame[13] + "Sec",
12668
- 'device_ids_do_sensors': frame.slice(14, 18),
12669
- 'device_ids_ec_sensors': frame.slice(18, 22),
12670
- 'hardware_id': frame.slice(22, 25),
12671
- 'report_rate': frame.slice(25, 29).reduce(msbLsb) + "Sec",
12672
- '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),
12673
13768
  'machine_values': {
12674
13769
  'firmware': frame[2],
12675
- 'do_bootup_time': frame[12],
12676
- 'ec_bootup_time': frame[13],
12677
- 'device_ids_do_sensors': frame.slice(14, 18),
12678
- 'device_ids_ec_sensors': frame.slice(18, 22),
12679
- 'hardware_id': frame.slice(22, 25),
12680
- 'report_rate': frame.slice(25, 29),
12681
- '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)
12682
13779
  }
12683
13780
  }
12684
13781
  }
12685
13782
  },
12686
- '502': {
12687
- 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',
12688
13955
  parse: (d, full) => {
12689
13956
  reserve = full[7];
12690
13957
  if (reserve == 0xAA){
@@ -13802,8 +15069,682 @@ function sensor_types(parent){
13802
15069
  };
13803
15070
  }
13804
15071
  },
13805
- '537': {
13806
- 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',
13807
15748
  parse: (payload, parsed, mac) => {
13808
15749
  if(payload[7] >> 1 != 0){
13809
15750
  console.log('Error found');
@@ -13823,7 +15764,7 @@ function sensor_types(parent){
13823
15764
  if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
13824
15765
  if(expected_packets != 1){
13825
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
13826
- 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)) {
13827
15768
  console.log('-----');
13828
15769
  console.log('bad packet breakdown deleting stream');
13829
15770
  console.log(current_packet);
@@ -13964,6 +15905,7 @@ function sensor_types(parent){
13964
15905
  }
13965
15906
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
13966
15907
  }
15908
+
13967
15909
  if(Object.keys(globalDevices[deviceAddr].data).length == expected_packets){
13968
15910
  var raw_data = new Array();
13969
15911
  for(const packet in globalDevices[deviceAddr].data){
@@ -14410,28 +16352,223 @@ function sensor_types(parent){
14410
16352
  }
14411
16353
  }
14412
16354
  },
14413
- '538': {
14414
- 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',
14415
16552
  parse: (payload, parsed, mac) => {
14416
- if(payload[7] >> 1 != 0){
16553
+ if(payload[7] & 2){
14417
16554
  console.log('Error found');
14418
16555
  parsed.data = {error: 'Error found, Sensor Probe may be unattached'};
14419
16556
  return parsed;
14420
16557
  }
14421
-
16558
+ let msg_type = 'regular'; // (payload[7] & 16)? 'motion' : 'regular';
14422
16559
  if(payload[8] === 1){
14423
16560
  var deviceAddr = mac;
14424
16561
  var firmware = payload[1];
14425
- var hour = payload[11];
14426
- var minute = payload[12];
14427
- var expected_packets = payload[15];
14428
- var current_packet = payload[16];
14429
- 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;
14430
16567
 
14431
16568
  if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
14432
16569
  if(expected_packets != 1){
14433
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
14434
- 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)) {
14435
16572
  console.log('-----');
14436
16573
  console.log('bad packet breakdown deleting stream');
14437
16574
  console.log(current_packet);
@@ -14450,63 +16587,25 @@ function sensor_types(parent){
14450
16587
  console.log(this.failure_no);
14451
16588
  }
14452
16589
  // console.log(globalDevices[deviceAddr].data);
14453
- delete globalDevices[deviceAddr];
14454
- if(current_packet != 1){
14455
- return;
14456
- } else{
14457
-
14458
- var mode = payload[8];
14459
- var odr = payload[9];
14460
- var en_axis = payload[10] & 7;
14461
- var fsr = payload[10] >> 5;
14462
- var device_temp = msbLsb(payload[13], payload[14])/100;
14463
-
16590
+ delete globalDevices[deviceAddr];
16591
+ if(current_packet != 1){
16592
+ return;
16593
+ } else{
14464
16594
 
14465
- switch(odr){
14466
- case 6:
14467
- odr = 50;
14468
- break;
14469
- case 7:
14470
- odr = 100;
14471
- break;
14472
- case 8:
14473
- odr = 200;
14474
- break;
14475
- case 9:
14476
- odr = 400;
14477
- break;
14478
- case 10:
14479
- odr = 800;
14480
- break;
14481
- case 11:
14482
- odr = 1600;
14483
- break;
14484
- case 12:
14485
- odr = 3200;
14486
- break;
14487
- case 13:
14488
- odr = 6400;
14489
- break;
14490
- case 14:
14491
- odr = 12800;
14492
- break;
14493
- case 15:
14494
- odr = 25600;
14495
- break;
14496
- default:
14497
- odr = 0;
14498
- }
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;
14499
16599
 
14500
16600
  globalDevices[deviceAddr] = {
14501
16601
  // stream_size: expected_packets,
14502
16602
  data: {},
14503
16603
  odr: odr,
14504
16604
  mo: mode,
14505
- en_axis: en_axis,
14506
16605
  fsr: fsr,
14507
16606
  hour: hour,
14508
16607
  minute: minute,
14509
- device_temp: device_temp,
16608
+ temperature: temperature,
14510
16609
  }
14511
16610
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
14512
16611
  return;
@@ -14518,57 +16617,19 @@ function sensor_types(parent){
14518
16617
  }
14519
16618
  else{
14520
16619
  var mode = payload[8];
14521
- var odr = payload[9];
14522
- var en_axis = payload[10] & 7;
14523
- var fsr = payload[10] >> 5;
14524
- var device_temp = msbLsb(payload[13], payload[14])/100;
14525
-
14526
-
14527
- switch(odr){
14528
- case 6:
14529
- odr = 50;
14530
- break;
14531
- case 7:
14532
- odr = 100;
14533
- break;
14534
- case 8:
14535
- odr = 200;
14536
- break;
14537
- case 9:
14538
- odr = 400;
14539
- break;
14540
- case 10:
14541
- odr = 800;
14542
- break;
14543
- case 11:
14544
- odr = 1600;
14545
- break;
14546
- case 12:
14547
- odr = 3200;
14548
- break;
14549
- case 13:
14550
- odr = 6400;
14551
- break;
14552
- case 14:
14553
- odr = 12800;
14554
- break;
14555
- case 15:
14556
- odr = 25600;
14557
- break;
14558
- default:
14559
- odr = 0;
14560
- }
16620
+ var odr = msbLsb(payload[9], payload[10]);
16621
+ var fsr = payload[11] >> 5;
16622
+ var temperature = msbLsb(payload[14], payload[15])/100;
14561
16623
 
14562
16624
  globalDevices[deviceAddr] = {
14563
16625
  // stream_size: expected_packets,
14564
16626
  data: {},
14565
16627
  odr: odr,
14566
16628
  mo: mode,
14567
- en_axis: en_axis,
14568
16629
  fsr: fsr,
14569
16630
  hour: hour,
14570
16631
  minute: minute,
14571
- device_temp: device_temp,
16632
+ temperature: temperature,
14572
16633
  }
14573
16634
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
14574
16635
  }
@@ -14584,58 +16645,23 @@ function sensor_types(parent){
14584
16645
  var fft_concat = {};
14585
16646
 
14586
16647
  var en_axis_data = {};
14587
- switch (globalDevices[deviceAddr].en_axis){
14588
- case 1:
14589
- en_axis_data.x_offset = 0;
14590
- en_axis_data.increment = 2;
14591
- break;
14592
- case 2:
14593
- en_axis_data.y_offset = 0;
14594
- en_axis_data.increment = 2;
14595
- break;
14596
- case 3:
14597
- en_axis_data.x_offset = 0;
14598
- en_axis_data.y_offset = 2;
14599
- en_axis_data.increment = 4;
14600
- break;
14601
- case 4:
14602
- en_axis_data.z_offset = 0;
14603
- en_axis_data.increment = 2;
14604
- break;
14605
- case 5:
14606
- en_axis_data.x_offset = 0;
14607
- en_axis_data.z_offset = 2;
14608
- en_axis_data.increment = 4;
14609
- break;
14610
- case 6:
14611
- en_axis_data.y_offset = 0;
14612
- en_axis_data.z_offset = 2;
14613
- en_axis_data.increment = 4;
14614
- break;
14615
- case 7:
14616
- en_axis_data.x_offset = 0;
14617
- en_axis_data.y_offset = 2;
14618
- en_axis_data.z_offset = 4;
14619
- en_axis_data.increment = 6;
14620
- break;
14621
- default:
14622
- en_axis_data.increment = 0;
14623
- }
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: []};
14624
16653
 
14625
16654
  var fsr_mult = .00006;
14626
16655
  var fsr_text = "";
14627
16656
  switch(globalDevices[deviceAddr].fsr){
14628
16657
  case 0:
14629
- fsr_mult = 0.00006;
16658
+ fsr_mult = 0.0000608;
14630
16659
  break;
14631
16660
  case 1:
14632
- fsr_mult = 0.00012;
16661
+ fsr_mult = 0.0001216;
14633
16662
  break;
14634
16663
  case 2:
14635
- fsr_mult = 0.00024;
14636
- break;
14637
- case 3:
14638
- fsr_mult = 0.00049;
16664
+ fsr_mult = 0.0002448;
14639
16665
  break;
14640
16666
  }
14641
16667
  switch(globalDevices[deviceAddr].fsr){
@@ -14648,33 +16674,34 @@ function sensor_types(parent){
14648
16674
  case 2:
14649
16675
  fsr_text = "8g";
14650
16676
  break;
14651
- case 3:
14652
- fsr_text = "16g";
14653
- break;
14654
16677
  }
14655
16678
 
16679
+
14656
16680
  for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
14657
16681
  label++;
14658
16682
 
14659
- fft_concat[label] = {};
14660
-
14661
16683
  if('x_offset' in en_axis_data){
14662
- 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)));
14663
16685
  }
14664
16686
  if('y_offset' in en_axis_data){
14665
- 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)));
14666
16688
  }
14667
16689
  if('z_offset' in en_axis_data){
14668
- 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)));
14669
16691
  }
14670
16692
  }
14671
16693
  var fft_concat_obj = {
14672
- 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(':'),
14673
16700
  mac_address: deviceAddr,
14674
- en_axis: globalDevices[deviceAddr].en_axis,
14675
16701
  fsr: fsr_text,
14676
16702
  odr: globalDevices[deviceAddr].odr,
14677
- device_temp: globalDevices[deviceAddr].device_temp,
16703
+ temperature: globalDevices[deviceAddr].temperature,
16704
+ total_samples: label,
14678
16705
  data: fft_concat
14679
16706
  };
14680
16707
  sensor_data = fft_concat_obj;
@@ -14692,100 +16719,48 @@ function sensor_types(parent){
14692
16719
  }else{
14693
16720
 
14694
16721
  var mode = payload[8];
14695
- var odr = payload[9];
14696
- var en_axis = payload[10] & 7;
14697
- var fsr = payload[10] >> 5;
14698
- var device_temp = msbLsb(payload[13], payload[14])/100;
14699
-
14700
-
14701
- switch(odr){
14702
- case 6:
14703
- odr = 50;
14704
- break;
14705
- case 7:
14706
- odr = 100;
14707
- break;
14708
- case 8:
14709
- odr = 200;
14710
- break;
14711
- case 9:
14712
- odr = 400;
14713
- break;
14714
- case 10:
14715
- odr = 800;
14716
- break;
14717
- case 11:
14718
- odr = 1600;
14719
- break;
14720
- case 12:
14721
- odr = 3200;
14722
- break;
14723
- case 13:
14724
- odr = 6400;
14725
- break;
14726
- case 14:
14727
- odr = 12800;
14728
- break;
14729
- case 15:
14730
- odr = 25600;
14731
- break;
14732
- default:
14733
- odr = 0;
14734
- }
16722
+ var odr = msbLsb(payload[9], payload[10]);
16723
+ var fsr = payload[11] >> 5;
16724
+ var temperature = msbLsb(payload[14], payload[15])/100;
14735
16725
 
14736
16726
  globalDevices[deviceAddr] = {
14737
16727
  // stream_size: expected_packets,
14738
16728
  data: {},
14739
16729
  odr: odr,
14740
16730
  mo: mode,
14741
- en_axis: en_axis,
14742
16731
  fsr: fsr,
14743
16732
  hour: hour,
14744
16733
  minute: minute,
14745
- device_temp: device_temp,
16734
+ temperature: temperature,
14746
16735
  }
14747
16736
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
14748
16737
  return;
14749
16738
  }
14750
16739
  }
14751
- else if(payload[8] === 0 || payload[8] === 2){
16740
+ else if(payload[8] === 0 || payload[8] === 2 || payload[8] === 3){
14752
16741
  // mode byte most significant bit will indicate fft data.
14753
16742
  // console.log(d);
14754
16743
  var odr;
14755
16744
  switch(payload[9]){
14756
- case 6:
14757
- odr = "50Hz"
14758
- break;
14759
- case 7:
14760
- odr = "100Hz";
14761
- break;
14762
- case 8:
14763
- odr = "200Hz";
14764
- break;
14765
- case 9:
14766
- odr = "400Hz";
14767
- break;
14768
- case 10:
14769
- odr = "800Hz";
14770
- break;
14771
- case 11:
14772
- odr = "1600Hz";
16745
+ case 3:
16746
+ odr = "32.25Hz"
14773
16747
  break;
14774
- case 12:
14775
- odr = "3200Hz";
16748
+ case 4:
16749
+ odr = "62.5Hz";
14776
16750
  break;
14777
- case 13:
14778
- odr = "6400Hz";
16751
+ case 5:
16752
+ odr = "125Hz";
14779
16753
  break;
14780
- case 14:
14781
- odr = "12800Hz";
16754
+ case 6:
16755
+ odr = "250Hz";
14782
16756
  break;
14783
- case 15:
14784
- odr = "25600Hz";
16757
+ case 7:
16758
+ odr = "500Hz";
14785
16759
  break;
14786
16760
  }
14787
16761
  return {
14788
16762
  mode: payload[8],
16763
+ msg_type: msg_type,
14789
16764
 
14790
16765
  odr: odr,
14791
16766
  temperature: signInt(payload.slice(10, 12).reduce(msbLsb), 16) / 100,
@@ -14812,7 +16787,7 @@ function sensor_types(parent){
14812
16787
  z_displacement_mm: payload.slice(46, 48).reduce(msbLsb) / 100,
14813
16788
  z_peak_one_Hz: payload.slice(48, 50).reduce(msbLsb),
14814
16789
  z_peak_two_Hz: payload.slice(50, 52).reduce(msbLsb),
14815
- z_peak_three_Hz: payload.slice(52, 54).reduce(msbLsb),
16790
+ z_peak_three_Hz: payload.slice(52, 54).reduce(msbLsb)
14816
16791
  };
14817
16792
  }
14818
16793
  // else{
@@ -14829,44 +16804,32 @@ function sensor_types(parent){
14829
16804
  case 1:
14830
16805
  frame_data.mode = "Raw";
14831
16806
  break;
14832
- case 2:
14833
- frame_data.mode = "Processed + Raw on demand";
14834
- break;
14835
- }
14836
- switch(frame[17]){
14837
- case 6:
14838
- frame_data.odr_1 = 50;
14839
- break;
14840
- case 7:
14841
- frame_data.odr_1 = 100;
14842
- break;
14843
- case 8:
14844
- frame_data.odr_1 = 200;
14845
- break;
14846
- case 9:
14847
- frame_data.odr_1 = 400;
16807
+ case 2:
16808
+ frame_data.mode = "Processed + Raw on demand";
14848
16809
  break;
14849
- case 10:
14850
- frame_data.odr_1 = 800;
16810
+ case 3:
16811
+ frame_data.mode = "Smart";
14851
16812
  break;
14852
- case 11:
14853
- frame_data.odr_1 = 1600;
16813
+ }
16814
+ switch(frame[17]){
16815
+ case 3:
16816
+ frame_data.odr_1 = 31.25;
14854
16817
  break;
14855
- case 12:
14856
- frame_data.odr_1 = 3200;
16818
+ case 4:
16819
+ frame_data.odr_1 = 62.5;
14857
16820
  break;
14858
- case 13:
14859
- frame_data.odr_1 = 6400;
16821
+ case 5:
16822
+ frame_data.odr_1 = 125;
14860
16823
  break;
14861
- case 14:
14862
- frame_data.odr_1 = 12800;
16824
+ case 6:
16825
+ frame_data.odr_1 = 250;
14863
16826
  break;
14864
- case 15:
14865
- frame_data.odr_1 = 25600;
16827
+ case 7:
16828
+ frame_data.odr_1 = 500;
14866
16829
  break;
14867
16830
  }
14868
- frame_data.sampling_duration_1 = frame[19]*50 + "ms";
14869
- switch(frame[21]){
16831
+ frame_data.sampling_duration_1 = frame[18]*50 + "ms";
16832
+ switch(frame[19]){
14870
16833
  case 0:
14871
16834
  frame_data.filter_status = "Disabled";
14872
16835
  break;
@@ -14874,7 +16837,7 @@ function sensor_types(parent){
14874
16837
  frame_data.filter_status = "Enabled";
14875
16838
  break;
14876
16839
  }
14877
- switch(frame[22]){
16840
+ switch(frame[20]){
14878
16841
  case 0:
14879
16842
  frame_data.lpf_coeff_1 = 4;
14880
16843
  break;
@@ -14907,7 +16870,7 @@ function sensor_types(parent){
14907
16870
  break;
14908
16871
  }
14909
16872
  frame_data.lpf_freq_1 = frame_data.odr_1 / frame_data.lpf_coeff_1;
14910
- switch(frame[24]){
16873
+ switch(frame[21]){
14911
16874
  case 0:
14912
16875
  frame_data.hpf_coeff_1 = 4;
14913
16876
  break;
@@ -14939,40 +16902,49 @@ function sensor_types(parent){
14939
16902
  frame_data.hpf_coeff_1 = 2048;
14940
16903
  break;
14941
16904
  }
14942
- frame_data.hpf_freq_1 = frame_data.odr_1 / frame_data.hpf_coeff_1;
14943
- switch(frame[26]){
16905
+ frame_data.hpf_freq_1 = (frame_data.odr_1 / frame_data.hpf_coeff_1).toFixed(4);
16906
+ switch(frame[22]){
14944
16907
  case 0:
14945
16908
  frame_data.sampling_interval = "5 Minutes";
16909
+ frame_data.sampling_interval_number = 5;
14946
16910
  break;
14947
16911
  case 1:
14948
16912
  frame_data.sampling_interval = "10 Minutes";
16913
+ frame_data.sampling_interval_number = 10;
14949
16914
  break;
14950
16915
  case 2:
14951
16916
  frame_data.sampling_interval = "15 Minutes";
16917
+ frame_data.sampling_interval_number = 15;
14952
16918
  break;
14953
16919
  case 2:
14954
16920
  frame_data.sampling_interval = "20 Minutes";
16921
+ frame_data.sampling_interval_number = 20;
14955
16922
  break;
14956
16923
  case 4:
14957
16924
  frame_data.sampling_interval = "30 Minutes";
16925
+ frame_data.sampling_interval_number = 30;
14958
16926
  break;
14959
16927
  case 5:
14960
16928
  frame_data.sampling_interval = "60 Minutes";
16929
+ frame_data.sampling_interval_number = 60;
14961
16930
  break;
14962
16931
  case 6:
14963
16932
  frame_data.sampling_interval = "120 Minutes";
16933
+ frame_data.sampling_interval_number = 120;
14964
16934
  break;
14965
16935
  case 7:
14966
16936
  frame_data.sampling_interval = "180 Minutes";
16937
+ frame_data.sampling_interval_number = 180;
14967
16938
  break;
14968
16939
  case 8:
14969
16940
  frame_data.sampling_interval = "1 Minute";
16941
+ frame_data.sampling_interval_number = 1;
14970
16942
  break;
14971
16943
  }
14972
- frame_data.on_request_timeout = frame[27] + " Seconds";
14973
- frame_data.deadband = frame[28] + "mg";
16944
+ frame_data.on_request_timeout = frame[23] + " Seconds";
16945
+ frame_data.deadband = frame[24] + "mg";
14974
16946
 
14975
- switch(frame[29]){
16947
+ switch(frame[25]){
14976
16948
  case 0:
14977
16949
  frame_data.payload_length = "50 Bytes";
14978
16950
  break;
@@ -14986,207 +16958,69 @@ function sensor_types(parent){
14986
16958
  frame_data.payload_length = "180 Bytes";
14987
16959
  break;
14988
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;
14989
16977
 
14990
16978
  return {
14991
16979
  'firmware': frame[2],
14992
16980
  'destination_address': toMac(frame.slice(12, 16)),
14993
16981
  'mode': frame_data.mode,
14994
- 'odr_1': frame_data.odr_1+'Hz',
14995
- 'sampling_duration_1': frame_data.sampling_duration_1,
16982
+ 'odr': frame_data.odr_1+'Hz',
16983
+ 'sampling_duration': frame_data.sampling_duration_1,
14996
16984
  'filter_status': frame_data.filter_status,
14997
- 'lpf_coeff_1': frame_data.lpf_coeff_1,
14998
- 'lpf_freq_1': frame_data.lpf_freq_1+'Hz',
14999
- 'hpf_coeff_1': frame_data.hpf_coeff_1,
15000
- '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',
15001
16989
  'sampling_interval': frame_data.sampling_interval,
15002
16990
  'on_request_timeout': frame_data.on_request_timeout,
15003
16991
  'deadband': frame_data.deadband,
15004
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),
15005
17002
  'machine_values': {
15006
17003
  'firmware': frame[2],
15007
17004
  'destination_address': toMac(frame.slice(12, 16), false),
15008
17005
  'mode': frame[16],
15009
- 'odr_1': frame[17],
15010
- 'sampling_duration_1': frame[19],
15011
- 'filter_status': frame[21],
15012
- 'lpf_coeff_1': frame[22],
15013
- 'hpf_coeff_1': frame[24],
15014
- 'sampling_interval': frame[26],
15015
- 'on_request_timeout': frame[27],
15016
- 'deadband': frame[28],
15017
- 'payload_length': frame[29]
15018
- }
15019
- }
15020
- }
15021
- },
15022
- '539': {
15023
- name: 'RS485 Modbus Wireless Converter',
15024
- parse: (d) => {
15025
- return {
15026
- subdevice_type: d[0],
15027
- number_of_registers: d[1],
15028
- status_24_31: d[2],
15029
- status_16_23: d[3],
15030
- status_8_15: d[4],
15031
- status_0_7: d[5],
15032
- // TODO we can automatically determine how many registers are here based on the number_of_registers and create data objects appropriately
15033
- // r1: d.slice(2,4),
15034
- // r2: d.slice(4,6),
15035
- // r3: d.slice(6,8),
15036
- // r4: d.slice(8,10),
15037
- data: d.slice(6)
15038
- };
15039
- },
15040
- },
15041
- '540': {
15042
- name: 'Wireless Ultrasonic Flow Meter FD-Q32C',
15043
- parse: (d) => {
15044
- return {
15045
- raw_adc: d.slice(0, 2).reduce(msbLsb),
15046
- ma: d.slice(2, 4).reduce(msbLsb) / 100,
15047
- flow_ltr_min: d.slice(4, 8).reduce(msbLsb) / 100
15048
- };
15049
- },
15050
- 'parse_fly': (frame) => {
15051
- let firmware = frame[2];
15052
- if(firmware > 13){ // firmware 14 and above
15053
- let frame_data = {};
15054
- let auto_check_interval = frame.slice(20, 22).reduce(msbLsb);
15055
- if(!auto_check_interval){
15056
- frame_data.auto_check_interval = 'Disabled';
15057
- }else{
15058
- frame_data.auto_check_interval = auto_check_interval + " sec";
15059
- }
15060
- frame_data.always_on = frame[24]?"Enabled":"Disabled";
15061
- switch(frame[16]){
15062
- case 0:
15063
- frame_data.fsr = "+-6.114 V";
15064
- break;
15065
- case 1:
15066
- frame_data.fsr = "+-4.096 V";
15067
- break;
15068
- case 2:
15069
- frame_data.fsr = "+-2.048 V";
15070
- break;
15071
- case 3:
15072
- frame_data.fsr = "+-1.024 V";
15073
- break;
15074
- case 4:
15075
- frame_data.fsr = "+-0.512 V";
15076
- break;
15077
- case 5:
15078
- frame_data.fsr = "+-0.256 V";
15079
- break;
15080
- }
15081
- return {
15082
- 'firmware': frame[2],
15083
- 'fsr': frame_data.fsr,
15084
- 'boot_time': frame[17] + " sec",
15085
- 'power_adc': frame.slice(18, 20).reduce(msbLsb),
15086
- 'auto_check_interval': frame_data.auto_check_interval,
15087
- 'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
15088
- 'always_on': frame_data.always_on,
15089
- 'calibration_one': frame.slice(25, 29).reduce(msbLsb),
15090
- 'calibration_two':frame.slice(29, 33).reduce(msbLsb),
15091
- 'calibration_three':frame.slice(33, 37).reduce(msbLsb),
15092
- 'hardware_id': frame.slice(37, 40),
15093
- 'report_rate': frame.slice(40, 44).reduce(msbLsb) + " sec",
15094
- 'tx_life_counter': frame.slice(44, 48).reduce(msbLsb),
15095
- 'machine_values': {
15096
- 'firmware': frame[2],
15097
- 'fsr': frame[16],
15098
- 'boot_time': frame[17],
15099
- 'power_adc': frame.slice(18, 20),
15100
- 'auto_check_interval': frame.slice(20, 22),
15101
- 'auto_check_percentage': frame.slice(22, 24),
15102
- 'always_on': frame[24],
15103
- 'calibration_one': frame.slice(25, 29),
15104
- 'calibration_two':frame.slice(29, 33),
15105
- 'calibration_three':frame.slice(33, 37),
15106
- 'hardware_id': frame.slice(37, 40),
15107
- 'report_rate': frame.slice(40, 44),
15108
- 'tx_life_counter': frame.slice(44, 48)
15109
- }
15110
- }
15111
- }
15112
- }
15113
- },
15114
- '541': {
15115
- name: 'Custom Inline Flow Sensor',
15116
- parse: (d) => {
15117
- return {
15118
- adc1: signInt(d.slice(0, 2).reduce(msbLsb)),
15119
- adc2: signInt(d.slice(2, 4).reduce(msbLsb)),
15120
- mA1: signInt(d.slice(4, 6).reduce(msbLsb))/100,
15121
- mA2: signInt(d.slice(6, 8).reduce(msbLsb))/100,
15122
- flow_1: signInt(d.slice(8, 12).reduce(msbLsb))/100,
15123
- flow_2:signInt(d.slice(12, 16).reduce(msbLsb))/100
15124
- };
15125
- },
15126
- 'parse_fly': (frame) => {
15127
- let firmware = frame[2];
15128
- if(firmware > 13){ // firmware 14 and above
15129
- let frame_data = {};
15130
- let auto_check_interval = frame.slice(20, 22).reduce(msbLsb);
15131
- if(!auto_check_interval){
15132
- frame_data.auto_check_interval = 'Disabled';
15133
- }else{
15134
- frame_data.auto_check_interval = auto_check_interval + " sec";
15135
- }
15136
- frame_data.always_on = frame[24]?"Enabled":"Disabled";
15137
- switch(frame[16]){
15138
- case 0:
15139
- frame_data.fsr = "+-6.114 V";
15140
- break;
15141
- case 1:
15142
- frame_data.fsr = "+-4.096 V";
15143
- break;
15144
- case 2:
15145
- frame_data.fsr = "+-2.048 V";
15146
- break;
15147
- case 3:
15148
- frame_data.fsr = "+-1.024 V";
15149
- break;
15150
- case 4:
15151
- frame_data.fsr = "+-0.512 V";
15152
- break;
15153
- case 5:
15154
- frame_data.fsr = "+-0.256 V";
15155
- break;
15156
- }
15157
- return {
15158
- 'firmware': frame[2],
15159
- 'fsr': frame_data.fsr,
15160
- 'boot_up_time': frame[17] + " sec",
15161
- 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
15162
- 'auto_check_interval': frame_data.auto_check_interval,
15163
- 'auto_check_threshold': frame.slice(22, 24).reduce(msbLsb),
15164
- 'always_on': frame_data.always_on,
15165
- 'calibration_one': frame.slice(25, 29).reduce(msbLsb),
15166
- 'calibration_two':frame.slice(29, 33).reduce(msbLsb),
15167
- 'calibration_three':frame.slice(33, 37).reduce(msbLsb),
15168
- 'min_flow_rate':frame.slice(37, 39).reduce(msbLsb),
15169
- 'max_flow_rate':frame.slice(39, 41).reduce(msbLsb),
15170
- 'hardware_id': frame.slice(41, 44),
15171
- 'report_rate': frame.slice(44, 48).reduce(msbLsb) + " sec",
15172
- 'tx_life_counter': frame.slice(48, 52).reduce(msbLsb),
15173
- 'machine_values': {
15174
- 'firmware': frame[2],
15175
- 'fsr': frame[16],
15176
- 'boot_up_time': frame[17],
15177
- 'adc_pin_reading': frame.slice(18, 20),
15178
- 'auto_check_interval': frame.slice(20, 22),
15179
- 'auto_check_percentage': frame.slice(22, 24),
15180
- 'always_on': frame[24],
15181
- 'calibration_one': frame.slice(25, 29),
15182
- 'calibration_two':frame.slice(29, 33),
15183
- 'calibration_three':frame.slice(33, 37),
15184
- 'min_flow_rate':frame.slice(37, 39),
15185
- 'max_flow_rate':frame.slice(39, 41),
15186
- 'hardware_id': frame.slice(41, 44),
15187
- 'report_rate': frame.slice(44, 48),
15188
- 'tx_life_counter': frame.slice(48, 52),
15189
- }
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)
15190
17024
  }
15191
17025
  }
15192
17026
  }
@@ -15303,6 +17137,38 @@ function int2Bytes(i, l){
15303
17137
  }
15304
17138
  return bytes;
15305
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
+ // }
15306
17172
  function signInt(i, b){
15307
17173
  if(i.toString(2).length != b) return i;
15308
17174
  return -(((~i) & ((1 << (b-1))-1))+1);