@ncd-io/node-red-enterprise-sensors 1.1.5 → 1.2.0

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.
@@ -122,6 +122,25 @@ module.exports = class WirelessSensor{
122
122
  this._emitter.emit("link_info",msg_obj);
123
123
  }
124
124
  parse(frame){
125
+ // NOTE this must be above the type selection to prevent rs-485 data from triggering other functionality.
126
+ if(globalDevices.hasOwnProperty(frame.mac) && globalDevices[frame.mac].hasOwnProperty('bridge') && globalDevices[frame.mac].bridge){
127
+ // if(type === undefined && globalDevices.hasOwnProperty(frame.mac) && globalDevices[frame.mac].hasOwnProperty('bridge') && globalDevices[frame.mac].bridge){
128
+ let query_data = {
129
+ addr: frame.mac,
130
+ payload: frame.data,
131
+ }
132
+ if(globalDevices[frame.mac].hasOwnProperty('command_queue') && globalDevices[frame.mac].command_queue.length != 0){
133
+ if(globalDevices[frame.mac].command_queue[0].hasOwnProperty('command')){
134
+ query_data.command = globalDevices[frame.mac].command_queue[0].command;
135
+ }
136
+ if(globalDevices[frame.mac].command_queue[0].hasOwnProperty('meta')){
137
+ query_data.meta = globalDevices[frame.mac].command_queue[0].meta;
138
+ }
139
+ };
140
+ this._emitter.emit('converter_ack-'+frame.mac, query_data);
141
+ return;
142
+ // }
143
+ }
125
144
  var type = this.payloadType[frame.data[0]];
126
145
  if(typeof this[type] == 'function'){
127
146
  var data = this[type](frame.data.slice(1), frame);
@@ -141,7 +160,7 @@ module.exports = class WirelessSensor{
141
160
  }
142
161
  }
143
162
  // #OTF
144
- var otf_devices = [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,105,106,107,108,110,111,112,114,118,180,181,202,519,520,521,531,535,537,538,539,540,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,105,106,107,108,110,111,112,114,118,120,180,181,202,217,519,520,521,531,535,537,538,539,540,1010,1011];
145
164
  var device_type = msbLsb(frame.data[6], frame.data[7]);
146
165
  // var device_type = frame.data[7];
147
166
 
@@ -303,7 +322,7 @@ module.exports = class WirelessSensor{
303
322
  };
304
323
 
305
324
  // #OTF
306
- var otf_devices = [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,105,106,107,108,110,111,112,114,118,180,181,202,519,520,521,531,535,537,538,539,540,1010,1011];
325
+ 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,105,106,107,108,110,111,112,114,118,120,180,181,202,217,519,520,521,531,535,537,538,539,540,1010,1011];
307
326
  if(otf_devices.includes(parsed.sensor_type)){
308
327
  // If the message says FLY and there is not FLY timer in progress.
309
328
  if(payload[8] == 70 && payload[9] == 76 && payload[10] == 89) {
@@ -1288,6 +1307,12 @@ module.exports = class WirelessSensor{
1288
1307
  console.log(packet);
1289
1308
  return this.config_send(sensor_mac, packet);
1290
1309
  }
1310
+ config_set_quality_of_service_108(sensor_mac, value){
1311
+ console.log('config_set_quality_of_service_108');
1312
+ var packet = [244, 52, 0, 0, 0, value]
1313
+ console.log(packet);
1314
+ return this.config_send(sensor_mac, packet);
1315
+ }
1291
1316
  config_set_rtc_108(sensor_mac){
1292
1317
  console.log('config_set_rtc_108');
1293
1318
  var date = new Date();
@@ -1295,8 +1320,8 @@ module.exports = class WirelessSensor{
1295
1320
  console.log(packet);
1296
1321
  return this.config_send(sensor_mac, packet);
1297
1322
  }
1298
- config_set_rtc_interval_108(sensor_mac, value){
1299
- console.log('config_set_rtc_interval_108');
1323
+ config_set_transmission_interval_108(sensor_mac, value){
1324
+ console.log('config_set_transmission_interval_108');
1300
1325
  var packet = [244, 55, 0, 0, 0, value];
1301
1326
  console.log(packet);
1302
1327
  return this.config_send(sensor_mac, packet);
@@ -1631,6 +1656,14 @@ module.exports = class WirelessSensor{
1631
1656
  console.log(packet);
1632
1657
  return this.config_send(sensor_mac, packet);
1633
1658
  }
1659
+ config_set_max_raw_sample_110(sensor_mac, value){
1660
+ console.log('config_set_max_raw_sample_110');
1661
+ var packet = [244, 79, 0, 0, 101, 87];
1662
+ var val = int2Bytes(value, 2);
1663
+ packet.push(...val);
1664
+ console.log(packet);
1665
+ return this.config_send(sensor_mac, packet);
1666
+ }
1634
1667
  config_set_acceleration_interrupt_threshold_84(sensor_mac, value){
1635
1668
  console.log('config_set_acceleration_interrupt_threshold_84');
1636
1669
  var packet = [244, 79, 0, 0, 0, 60, value];
@@ -1928,6 +1961,30 @@ module.exports = class WirelessSensor{
1928
1961
  console.log(packet);
1929
1962
  return this.config_send(sensor_mac, packet);
1930
1963
  }
1964
+ config_set_to_always_on_120(sensor_mac){
1965
+ console.log('config_set_to_always_on_120');
1966
+ let packet = [244, 10, 0, 0, 0, 1];
1967
+ console.log(packet);
1968
+ return this.config_send(sensor_mac, packet);
1969
+ }
1970
+ config_set_sensor_reset_120(sensor_mac){
1971
+ console.log('config_set_sensor_reset_120');
1972
+ let packet = [244, 12, 0, 0, 26];
1973
+ console.log(packet);
1974
+ return this.config_send(sensor_mac, packet);
1975
+ }
1976
+ config_set_sensor_calib_120(sensor_mac){
1977
+ console.log('config_set_sensor_calib_120');
1978
+ let packet = [244, 13, 0, 0, 74];
1979
+ console.log(packet);
1980
+ return this.config_send(sensor_mac, packet);
1981
+ }
1982
+ config_set_alert_threshold_120(sensor_mac, value){
1983
+ console.log('config_set_alert_threshold_120');
1984
+ let packet = [244, 14, 0, 0, value];
1985
+ console.log(packet);
1986
+ return this.config_send(sensor_mac, packet);
1987
+ }
1931
1988
  config_get_delay(sensor_mac){
1932
1989
  return new Promise((fulfill, reject) => {
1933
1990
  this.config_send(sensor_mac, [247, 21, 0, 0, 0]).then((res) => {
@@ -2193,6 +2250,101 @@ module.exports = class WirelessSensor{
2193
2250
  });
2194
2251
  });
2195
2252
  }
2253
+ queue_bridge_query(sensor_mac, data, meta = null, opts){
2254
+ var that = this;
2255
+ if(!globalDevices.hasOwnProperty(sensor_mac)){
2256
+ globalDevices[sensor_mac] = {bridge: true, command_queue: []};
2257
+ }
2258
+ // if(!Object.hasOwn(node._gateway_node.sensor_list[msg.payload.address], 'command_queue')){
2259
+ // if(!globalDevices[sensor_mac].hasOwnProperty('command_queue')){
2260
+ // globalDevices[sensor_mac].command_queue = [{'command': data, 'meta': meta}];
2261
+ // }else{
2262
+ globalDevices[sensor_mac].command_queue.push({'command': data, 'meta': meta});
2263
+ // }
2264
+
2265
+ return new Promise((fulfill, reject) => {
2266
+ that.queue.add(() => {
2267
+ return new Promise((f, r) => {
2268
+ var tout;
2269
+ function fail(response){
2270
+ that._emitter.removeListener('converter_ack-'+sensor_mac, pass);
2271
+ clearTimeout(tout);
2272
+
2273
+ if(globalDevices[sensor_mac].hasOwnProperty('command_queue')){
2274
+ globalDevices[sensor_mac].command_queue.shift();
2275
+ }
2276
+ reject({
2277
+ err: response,
2278
+ sent: [mac2bytes(sensor_mac), data, opts]
2279
+ });
2280
+ f();
2281
+ }
2282
+ function pass(response){
2283
+ clearTimeout(tout);
2284
+
2285
+ that._emitter.emit('converter_response', response);
2286
+ that._emitter.emit('converter_response-'+sensor_mac, response);
2287
+
2288
+
2289
+ if(globalDevices[sensor_mac].hasOwnProperty('command_queue')){
2290
+ globalDevices[sensor_mac].command_queue.shift();
2291
+ }
2292
+ that._emitter.removeListener('converter_error-'+sensor_mac, fail);
2293
+ fulfill(response);
2294
+ f();
2295
+ // that._emitter.
2296
+ };
2297
+
2298
+ that._emitter.once('converter_ack-'+sensor_mac, pass);
2299
+ that._emitter.once('converter_error-'+sensor_mac, fail);
2300
+ tout = setTimeout(() => {
2301
+ that._emitter.removeListener('converter_error-'+sensor_mac, fail);
2302
+ that._emitter.removeListener('converter_ack-'+sensor_mac, pass);
2303
+
2304
+ if(globalDevices[sensor_mac].hasOwnProperty('command_queue')){
2305
+ globalDevices[sensor_mac].command_queue.shift();
2306
+ };
2307
+ if(sensor_mac == '00:00:00:00:00:00:FF:FF'){
2308
+ reject({
2309
+ res: 'Broadcast mode, no target device',
2310
+ sent: [mac2bytes(sensor_mac), data, opts]
2311
+ });
2312
+ }else{
2313
+ reject({
2314
+ err: 'Wireless Converter did not respond',
2315
+ sent: [mac2bytes(sensor_mac), data, opts]
2316
+ });
2317
+ };
2318
+
2319
+ f();
2320
+ }, 1500);
2321
+ that.send.transmit_request(mac2bytes(sensor_mac), data, opts).then().catch((err) => {
2322
+ that._emitter.removeListener('converter_error-'+sensor_mac, fail);
2323
+ that._emitter.removeListener('converter_ack-'+sensor_mac, pass);
2324
+ reject({
2325
+ err: err,
2326
+ sent: [mac2bytes(sensor_mac), data, opts]
2327
+ });
2328
+ f();
2329
+ }).then();
2330
+ });
2331
+ });
2332
+ this.queue.add(() => {
2333
+ return new Promise((f, r) => {
2334
+ setTimeout(f, 500);
2335
+ });
2336
+ });
2337
+ });
2338
+ };
2339
+ prepare_bridge_query(sensor_mac, commands){
2340
+ commands.forEach((command) => {
2341
+ if(command.hasOwnProperty('meta')){
2342
+ this.queue_bridge_query(sensor_mac, command.command, command.meta);
2343
+ }else{
2344
+ this.queue_bridge_query(sensor_mac, command.command);
2345
+ }
2346
+ });
2347
+ }
2196
2348
  build_102_data(payload, deviceAddr, hour, minute, sdata_start, current_packet, firmware){
2197
2349
  if(current_packet != 1){
2198
2350
  console.log('bad packet cleanup');
@@ -2400,7 +2552,54 @@ module.exports = class WirelessSensor{
2400
2552
  });
2401
2553
  });
2402
2554
  });
2403
- }
2555
+ };
2556
+ local_at_send(parameter, value, ctrl_timeout = 1000){
2557
+ var that = this;
2558
+ return new Promise((fulfill, reject) => {
2559
+ that.queue.add(() => {
2560
+ return new Promise((f, r) => {
2561
+ var failed = false;
2562
+ var retries = 0;
2563
+ var tO;
2564
+ function fail(packet){
2565
+ failed = true;
2566
+ clearTimeout(tO);
2567
+ // that._emitter.removeListener('receive_packet-'+sensor_mac, pass);
2568
+ // that._emitter.removeListener('transmit_status-'+sensor_mac, pass);
2569
+ reject({
2570
+ err: packet,
2571
+ sent: ['Local Module', parameter, value]
2572
+ });
2573
+ r();
2574
+ }
2575
+ function pass(packet){
2576
+ if(failed) return;
2577
+ clearTimeout(tO);
2578
+ fulfill(packet);
2579
+ f();
2580
+ };
2581
+
2582
+ function send(){
2583
+ that.send.at_command(parameter, value).then(function(frame){
2584
+ if(frame.status == 'OK'){
2585
+ pass(frame);
2586
+ }else{
2587
+ tO = setTimeout(() => {
2588
+ if(retries < 0){
2589
+ retries++;
2590
+ send();
2591
+ }else{
2592
+ fail('AT response timeout');
2593
+ }
2594
+ }, ctrl_timeout);
2595
+ }
2596
+ }).catch(fail);
2597
+ };
2598
+ send();
2599
+ });
2600
+ });
2601
+ });
2602
+ };
2404
2603
  route_discover(sensor_mac, opts){
2405
2604
  var data = [85];
2406
2605
  var that = this;
@@ -2725,7 +2924,7 @@ function sensor_types(parent){
2725
2924
  }
2726
2925
  },
2727
2926
  '21': {
2728
- name: 'AMS Pressure & Temperature',
2927
+ name: 'Differential Bidirectional Pressure Sensor',
2729
2928
  parse: (d) => {
2730
2929
  return {
2731
2930
  pressure: signInt(d.slice(0, 2).reduce(msbLsb), 16) / 100,
@@ -6442,7 +6641,7 @@ function sensor_types(parent){
6442
6641
  return {
6443
6642
  mode: payload[8],
6444
6643
  sampling_frequency: payload.slice(9, 13).reduce(msbLsb),
6445
- rms_mv: payload.slice(13, 17).reduce(msbLsb) / 1000,
6644
+ rms_mv: signInt(payload.slice(13, 17).reduce(msbLsb), 32) / 1000,
6446
6645
  freq_1: payload.slice(17, 19).reduce(msbLsb),
6447
6646
  freq_2: payload.slice(19, 21).reduce(msbLsb),
6448
6647
  freq_3: payload.slice(21, 23).reduce(msbLsb),
@@ -6475,10 +6674,10 @@ function sensor_types(parent){
6475
6674
  'fly_rate': frame.slice(15, 17).reduce(msbLsb) + " min",
6476
6675
  'sensor_gain_db': frame[17] + " dB",
6477
6676
  'sensor_boot_time': frame[18] + " sec",
6478
- 'sampling_frequency': (frame.slice(19, 23).reverse()).reduce(msbLsb) + " Hz",
6479
- 'hardware_id': frame.slice(23, 26),
6480
- 'report_rate': frame.slice(26, 30).reduce(msbLsb),
6481
- 'tx_life_count': frame.slice(30, 34).reduce(msbLsb),
6677
+ 'sampling_frequency': frame.slice(19, 23).reduce(msbLsb) + " Hz",
6678
+ // 'hardware_id': frame.slice(23, 26),
6679
+ // 'report_rate': frame.slice(26, 30).reduce(msbLsb),
6680
+ // 'tx_life_count': frame.slice(30, 34).reduce(msbLsb),
6482
6681
  'machine_values': {
6483
6682
  'firmware': frame[2],
6484
6683
  'mode':frame[12],
@@ -6487,10 +6686,10 @@ function sensor_types(parent){
6487
6686
  'fly_rate': frame.slice(15, 17),
6488
6687
  'sensor_gain_db': frame[17],
6489
6688
  'sensor_boot_time': frame[18],
6490
- 'sampling_frequency': frame.slice(19, 23),
6491
- 'hardware_id': frame.slice(23, 26),
6492
- 'report_rate': frame.slice(26, 30),
6493
- 'tx_life_count': frame.slice(30, 34)
6689
+ 'sampling_frequency': frame.slice(19, 23)
6690
+ // 'hardware_id': frame.slice(23, 26),
6691
+ // 'report_rate': frame.slice(26, 30),
6692
+ // 'tx_life_count': frame.slice(30, 34)
6494
6693
  }
6495
6694
  }
6496
6695
  }
@@ -6619,14 +6818,14 @@ function sensor_types(parent){
6619
6818
  return {
6620
6819
  mode: payload[8],
6621
6820
  sampling_frequency: payload.slice(9, 13).reduce(msbLsb),
6622
- c1_rms_mv: payload.slice(13, 15).reduce(msbLsb) / 1000,
6623
- c1_freq_1: payload.slice(15, 17).reduce(msbLsb),
6624
- c1_freq_2: payload.slice(17, 19).reduce(msbLsb),
6625
- c1_freq_3: payload.slice(19, 23).reduce(msbLsb),
6626
- c2_rms_mv: payload.slice(23, 25).reduce(msbLsb) / 1000,
6627
- c2_freq_1: payload.slice(25, 27).reduce(msbLsb),
6628
- c2_freq_2: payload.slice(27, 30).reduce(msbLsb),
6629
- c2_freq_3: payload.slice(30, 34).reduce(msbLsb)
6821
+ c1_rms_mv: signInt(payload.slice(13, 17).reduce(msbLsb), 32) / 1000,
6822
+ c1_freq_1: payload.slice(17, 19).reduce(msbLsb),
6823
+ c1_freq_2: payload.slice(19, 21).reduce(msbLsb),
6824
+ c1_freq_3: payload.slice(21, 23).reduce(msbLsb),
6825
+ c2_rms_mv: signInt(payload.slice(23, 27).reduce(msbLsb), 32) / 1000,
6826
+ c2_freq_1: payload.slice(27, 29).reduce(msbLsb),
6827
+ c2_freq_2: payload.slice(29, 31).reduce(msbLsb),
6828
+ c2_freq_3: payload.slice(31, 33).reduce(msbLsb)
6630
6829
  };
6631
6830
  }
6632
6831
  },
@@ -6657,10 +6856,10 @@ function sensor_types(parent){
6657
6856
  'c1_sensor_boot_time': frame[18] + " sec",
6658
6857
  'c2_sensor_gain_db': frame[19] + " dB",
6659
6858
  'c2_sensor_boot_time': frame[20] + " sec",
6660
- 'sampling_frequency': (frame.slice(21, 25).reverse()).reduce(msbLsb) + " Hz",
6661
- 'hardware_id': frame.slice(25, 28),
6662
- 'report_rate': frame.slice(28, 32).reduce(msbLsb),
6663
- 'tx_life_count': frame.slice(32, 36).reduce(msbLsb),
6859
+ 'sampling_frequency': frame.slice(21, 25).reduce(msbLsb) + " Hz",
6860
+ // 'hardware_id': frame.slice(25, 28),
6861
+ // 'report_rate': frame.slice(28, 32).reduce(msbLsb),
6862
+ // 'tx_life_count': frame.slice(32, 36).reduce(msbLsb),
6664
6863
  'machine_values': {
6665
6864
  'firmware': frame[2],
6666
6865
  'mode': frame[12],
@@ -6671,10 +6870,10 @@ function sensor_types(parent){
6671
6870
  'c1_sensor_boot_time': frame[18],
6672
6871
  'c2_sensor_gain_db': frame[19],
6673
6872
  'c2_sensor_boot_time': frame[20],
6674
- 'sampling_frequency': frame.slice(21, 25),
6675
- 'hardware_id': frame.slice(25, 28),
6676
- 'report_rate': frame.slice(28, 32),
6677
- 'tx_life_count': frame.slice(32, 36)
6873
+ 'sampling_frequency': frame.slice(21, 25)
6874
+ // 'hardware_id': frame.slice(25, 28),
6875
+ // 'report_rate': frame.slice(28, 32),
6876
+ // 'tx_life_count': frame.slice(32, 36)
6678
6877
  }
6679
6878
  }
6680
6879
  }
@@ -6811,23 +7010,47 @@ function sensor_types(parent){
6811
7010
  }
6812
7011
  }
6813
7012
  },
7013
+ '109': {
7014
+ name: 'Wireless Custom Solar Sensor',
7015
+ parse: (d) => {
7016
+ return {
7017
+ illuminance: d.slice(0, 4).reduce(msbLsb),
7018
+ total_solar_radiation: d.slice(4, 6).reduce(msbLsb),
7019
+ ultraviolet_radiation: d.slice(6, 8).reduce(msbLsb)
7020
+ };
7021
+ },
7022
+ 'parse_fly': (frame) => {
7023
+ return {
7024
+ 'firmware': frame[2],
7025
+ 'hardware_id': frame.slice(12, 15),
7026
+ 'sample_rate': frame.slice(15, 19).reduce(msbLsb) + " Sec.",
7027
+ 'tx_life_counter': frame.slice(19, 23).reduce(msbLsb),
7028
+ 'machine_values': {
7029
+ 'firmware': frame[2],
7030
+ 'hardware_id': frame.slice(12, 15),
7031
+ 'sample_rate': frame.slice(15, 19).reduce(msbLsb),
7032
+ 'tx_life_counter': frame.slice(19, 23).reduce(msbLsb)
7033
+ }
7034
+ }
7035
+ }
7036
+ },
6814
7037
  '110': {
6815
7038
  name: 'One Channel Vibration Plus v4',
6816
7039
  parse: (payload, parsed, mac) => {
6817
- if(payload[7] >> 1 != 0){
7040
+ if(payload[7] & 2){
6818
7041
  console.log('Error found');
6819
7042
  parsed.data = {error: 'Error found, Sensor Probe may be unattached'};
6820
7043
  return parsed;
6821
7044
  }
6822
-
7045
+ let msg_type = (payload[7] & 16)? 'motion' : 'regular';
6823
7046
  if(payload[8] === 1){
6824
7047
  var deviceAddr = mac;
6825
7048
  var firmware = payload[1];
6826
7049
  var hour = payload[12];
6827
7050
  var minute = payload[13];
6828
- var expected_packets = payload[16];
6829
- var current_packet = payload[17];
6830
- var sdata_start = 18;
7051
+ var expected_packets = msbLsb(payload[16], payload[17]);
7052
+ var current_packet = msbLsb(payload[18], payload[19]);
7053
+ var sdata_start = 20;
6831
7054
 
6832
7055
  if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
6833
7056
  if(expected_packets != 1){
@@ -6998,12 +7221,15 @@ function sensor_types(parent){
6998
7221
  }
6999
7222
  }
7000
7223
  var fft_concat_obj = {
7224
+ mode: payload[8],
7225
+ msg_type: msg_type,
7001
7226
  time_id: globalDevices[deviceAddr].hour +':'+ globalDevices[deviceAddr].minute,
7002
7227
  mac_address: deviceAddr,
7003
7228
  en_axis: globalDevices[deviceAddr].en_axis,
7004
7229
  fsr: fsr_text,
7005
7230
  odr: globalDevices[deviceAddr].odr,
7006
7231
  device_temp: globalDevices[deviceAddr].device_temp,
7232
+ total_samples: label,
7007
7233
  data: fft_concat
7008
7234
  };
7009
7235
  sensor_data = fft_concat_obj;
@@ -7079,6 +7305,7 @@ function sensor_types(parent){
7079
7305
  }
7080
7306
  return {
7081
7307
  mode: payload[8],
7308
+ msg_type: msg_type,
7082
7309
 
7083
7310
  odr: odr,
7084
7311
  temperature: signInt(payload.slice(10, 12).reduce(msbLsb), 16) / 100,
@@ -7126,6 +7353,9 @@ function sensor_types(parent){
7126
7353
  case 2:
7127
7354
  frame_data.mode = "Processed + Raw on demand";
7128
7355
  break;
7356
+ case 3:
7357
+ frame_data.mode = "Smart";
7358
+ break;
7129
7359
  }
7130
7360
  switch(frame[17]){
7131
7361
  case 6:
@@ -7237,30 +7467,39 @@ function sensor_types(parent){
7237
7467
  switch(frame[22]){
7238
7468
  case 0:
7239
7469
  frame_data.sampling_interval = "5 Minutes";
7470
+ frame_data.sampling_interval_number = 5;
7240
7471
  break;
7241
7472
  case 1:
7242
7473
  frame_data.sampling_interval = "10 Minutes";
7474
+ frame_data.sampling_interval_number = 10;
7243
7475
  break;
7244
7476
  case 2:
7245
7477
  frame_data.sampling_interval = "15 Minutes";
7478
+ frame_data.sampling_interval_number = 15;
7246
7479
  break;
7247
7480
  case 2:
7248
7481
  frame_data.sampling_interval = "20 Minutes";
7482
+ frame_data.sampling_interval_number = 20;
7249
7483
  break;
7250
7484
  case 4:
7251
7485
  frame_data.sampling_interval = "30 Minutes";
7486
+ frame_data.sampling_interval_number = 30;
7252
7487
  break;
7253
7488
  case 5:
7254
7489
  frame_data.sampling_interval = "60 Minutes";
7490
+ frame_data.sampling_interval_number = 60;
7255
7491
  break;
7256
7492
  case 6:
7257
7493
  frame_data.sampling_interval = "120 Minutes";
7494
+ frame_data.sampling_interval_number = 120;
7258
7495
  break;
7259
7496
  case 7:
7260
7497
  frame_data.sampling_interval = "180 Minutes";
7498
+ frame_data.sampling_interval_number = 180;
7261
7499
  break;
7262
7500
  case 8:
7263
7501
  frame_data.sampling_interval = "1 Minute";
7502
+ frame_data.sampling_interval_number = 1;
7264
7503
  break;
7265
7504
  }
7266
7505
  frame_data.on_request_timeout = frame[23] + " Seconds";
@@ -7295,6 +7534,9 @@ function sensor_types(parent){
7295
7534
  break;
7296
7535
  }
7297
7536
  frame_data.rpm_status = frame[27]? 'Enabled': 'Disabled';
7537
+ frame_data.auto_raw_interval = frame[32] * frame_data.sampling_interval_number || 'disabled';
7538
+ frame_data.auto_raw_interval = typeof frame_data.auto_raw_interval === 'number' ? frame_data.auto_raw_interval+'min' : frame_data.auto_raw_interval;
7539
+ frame_data.smart_mode_threshold = frame[34] * 50;
7298
7540
  return {
7299
7541
  'firmware': frame[2],
7300
7542
  'destination_address': toMac(frame.slice(12, 16)),
@@ -7312,6 +7554,14 @@ function sensor_types(parent){
7312
7554
  'payload_length': frame_data.payload_length,
7313
7555
  'fsr': frame_data.fsr_text,
7314
7556
  'rpm_compute_status': frame_data.rpm_status,
7557
+ 'auto_raw_destination_address': toMac(frame.slice(28 , 32)),
7558
+ 'auto_raw_interval': frame_data.auto_raw_interval,
7559
+ 'smart_mode_skip_count': frame[33],
7560
+ 'smart_mode_acc_threshold':frame_data.smart_mode_threshold+'mg',
7561
+ 'uptime_counter': frame.slice(35, 39).reduce(msbLsb),
7562
+ 'hardware_id': frame.slice(39, 42),
7563
+ 'reserved': frame.slice(42, 46),
7564
+ 'tx_lifetime_counter': frame.slice(46, 50).reduce(msbLsb),
7315
7565
  'machine_values': {
7316
7566
  'firmware': frame[2],
7317
7567
  'destination_address': toMac(frame.slice(12, 16), false),
@@ -7326,7 +7576,15 @@ function sensor_types(parent){
7326
7576
  'deadband': frame[24],
7327
7577
  'payload_length': frame[25],
7328
7578
  'fsr': frame[26],
7329
- 'rpm_compute_status': frame[27]
7579
+ 'rpm_compute_status': frame[27],
7580
+ 'auto_raw_destination_address': toMac(frame.slice(28 , 32)),
7581
+ 'auto_raw_interval': frame[32],
7582
+ 'smart_mode_skip_count': frame[33],
7583
+ 'smart_mode_acc_threshold':frame[34],
7584
+ 'uptime_counter': frame.slice(35, 39),
7585
+ 'hardware_id': frame.slice(39, 42),
7586
+ 'reserved': frame.slice(42, 46),
7587
+ 'tx_lifetime_counter': frame.slice(46, 50)
7330
7588
  }
7331
7589
  }
7332
7590
  }
@@ -7344,15 +7602,15 @@ function sensor_types(parent){
7344
7602
  if(payload[7] & 2 && payload[7] & 4){
7345
7603
  return parsed;
7346
7604
  }
7347
-
7605
+ let msg_type = (payload[7] & 16)? 'motion' : 'regular';
7348
7606
  if(payload[8] === 1){
7349
7607
  var deviceAddr = mac;
7350
7608
  var firmware = payload[1];
7351
7609
  var hour = payload[12];
7352
7610
  var minute = payload[13];
7353
- var expected_packets = payload[16];
7354
- var current_packet = payload[17];
7355
- var sdata_start = 18;
7611
+ var expected_packets = msbLsb(payload[16], payload[17]);
7612
+ var current_packet = msbLsb(payload[18], payload[19]);
7613
+ var sdata_start = 20;
7356
7614
 
7357
7615
  if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
7358
7616
  if(expected_packets != 1){
@@ -7532,6 +7790,8 @@ function sensor_types(parent){
7532
7790
  }
7533
7791
 
7534
7792
  var fft_concat_obj = {
7793
+ mode: payload[8],
7794
+ msg_type: msg_type,
7535
7795
  probe: probe,
7536
7796
  time_id: globalDevices[deviceAddr].hour +':'+ globalDevices[deviceAddr].minute,
7537
7797
  probe: probe,
@@ -7540,6 +7800,7 @@ function sensor_types(parent){
7540
7800
  fsr: fsr_text,
7541
7801
  odr: globalDevices[deviceAddr].odr,
7542
7802
  device_temp: globalDevices[deviceAddr].device_temp,
7803
+ total_samples: label,
7543
7804
  data: fft_concat
7544
7805
  };
7545
7806
  sensor_data = fft_concat_obj;
@@ -7654,9 +7915,9 @@ function sensor_types(parent){
7654
7915
  // else{
7655
7916
  // probe = '1';
7656
7917
  // }
7657
-
7658
7918
  return {
7659
7919
  mode: payload[8],
7920
+ msg_type: msg_type,
7660
7921
 
7661
7922
  s1_odr: odr1,
7662
7923
  s1_temperature: signInt(payload.slice(10, 12).reduce(msbLsb), 16) / 100,
@@ -7732,6 +7993,9 @@ function sensor_types(parent){
7732
7993
  case 2:
7733
7994
  frame_data.mode = "Processed + Raw on demand";
7734
7995
  break;
7996
+ case 3:
7997
+ frame_data.mode = "Smart";
7998
+ break;
7735
7999
  }
7736
8000
  switch(frame[17]){
7737
8001
  case 6:
@@ -7942,30 +8206,39 @@ function sensor_types(parent){
7942
8206
  switch(frame[26]){
7943
8207
  case 0:
7944
8208
  frame_data.sampling_interval = "5 Minutes";
8209
+ frame_data.sampling_interval_number = 5;
7945
8210
  break;
7946
8211
  case 1:
7947
8212
  frame_data.sampling_interval = "10 Minutes";
8213
+ frame_data.sampling_interval_number = 10;
7948
8214
  break;
7949
8215
  case 2:
7950
8216
  frame_data.sampling_interval = "15 Minutes";
8217
+ frame_data.sampling_interval_number = 15;
7951
8218
  break;
7952
8219
  case 2:
7953
8220
  frame_data.sampling_interval = "20 Minutes";
8221
+ frame_data.sampling_interval_number = 20;
7954
8222
  break;
7955
8223
  case 4:
7956
8224
  frame_data.sampling_interval = "30 Minutes";
8225
+ frame_data.sampling_interval_number = 30;
7957
8226
  break;
7958
8227
  case 5:
7959
8228
  frame_data.sampling_interval = "60 Minutes";
8229
+ frame_data.sampling_interval_number = 60;
7960
8230
  break;
7961
8231
  case 6:
7962
8232
  frame_data.sampling_interval = "120 Minutes";
8233
+ frame_data.sampling_interval_number = 120;
7963
8234
  break;
7964
8235
  case 7:
7965
8236
  frame_data.sampling_interval = "180 Minutes";
8237
+ frame_data.sampling_interval_number = 180;
7966
8238
  break;
7967
8239
  case 8:
7968
8240
  frame_data.sampling_interval = "1 Minute";
8241
+ frame_data.sampling_interval_number = 1;
7969
8242
  break;
7970
8243
  }
7971
8244
  frame_data.on_request_timeout = frame[27] + " Seconds";
@@ -7985,7 +8258,7 @@ function sensor_types(parent){
7985
8258
  frame_data.payload_length = "180 Bytes";
7986
8259
  break;
7987
8260
  }
7988
- switch(frame[20]){
8261
+ switch(frame[30]){
7989
8262
  case 0:
7990
8263
  frame_data.fsr_text = "2g";
7991
8264
  break;
@@ -8000,6 +8273,10 @@ function sensor_types(parent){
8000
8273
  break;
8001
8274
  }
8002
8275
  frame_data.rpm_status = frame[31]? 'Enabled': 'Disabled';
8276
+ frame_data.auto_raw_interval = frame[36] * frame_data.sampling_interval_number || 'disabled';
8277
+ frame_data.auto_raw_interval = typeof frame_data.auto_raw_interval === 'number' ? frame_data.auto_raw_interval+'min' : frame_data.auto_raw_interval;
8278
+ frame_data.p1_smart_mode_threshold = frame[38] * 50;
8279
+ frame_data.p2_smart_mode_threshold = frame[39] * 50;
8003
8280
  return {
8004
8281
  'firmware': frame[2],
8005
8282
  'destination_address': toMac(frame.slice(12, 16)),
@@ -8021,8 +8298,18 @@ function sensor_types(parent){
8021
8298
  'on_request_timeout': frame_data.on_request_timeout,
8022
8299
  'deadband': frame_data.deadband,
8023
8300
  'payload_length': frame_data.payload_length,
8024
- 'fsm': frame_data.fsr_text,
8301
+ 'fsr': frame_data.fsr_text,
8025
8302
  'rpm_compute_status': frame_data.rpm_status,
8303
+ 'auto_raw_destination_address': toMac(frame.slice(32 , 36)),
8304
+ 'auto_raw_interval': frame_data.auto_raw_interval,
8305
+ 'smart_mode_skip_count': frame[37],
8306
+ 'smart_mode_acc_threshold_probe_1': frame_data.p1_smart_mode_threshold+'mg',
8307
+ 'smart_mode_acc_threshold_probe_2': frame_data.p2_smart_mode_threshold+'mg',
8308
+ 'uptime_counter_probe_1': frame.slice(40, 44).reduce(msbLsb),
8309
+ 'uptime_counter_probe_2': frame.slice(44, 48).reduce(msbLsb),
8310
+ 'hardware_id': frame.slice(48, 51),
8311
+ 'reserved': frame.slice(51, 55),
8312
+ 'tx_lifetime_counter': frame.slice(55, 59).reduce(msbLsb),
8026
8313
  'machine_values': {
8027
8314
  'firmware': frame[2],
8028
8315
  'destination_address': toMac(frame.slice(12, 16), false),
@@ -8042,6 +8329,16 @@ function sensor_types(parent){
8042
8329
  'payload_length': frame[29],
8043
8330
  'fsm': frame[30],
8044
8331
  'rpm_compute_status': frame[31],
8332
+ 'auto_raw_destination_address': toMac(frame.slice(32 , 36)),
8333
+ 'auto_raw_interval': frame[36],
8334
+ 'smart_mode_skip_count': frame[37],
8335
+ 'smart_mode_acc_threshold_probe_1':frame[38],
8336
+ 'smart_mode_acc_threshold_probe_2':frame[39],
8337
+ 'uptime_counter_probe_1': frame.slice(40, 44),
8338
+ 'uptime_counter_probe_2': frame.slice(44, 48),
8339
+ 'hardware_id': frame.slice(48, 51),
8340
+ 'reserved': frame.slice(51, 55),
8341
+ 'tx_lifetime_counter': frame.slice(55, 59).reduce(msbLsb)
8045
8342
  }
8046
8343
  }
8047
8344
  }
@@ -8049,21 +8346,21 @@ function sensor_types(parent){
8049
8346
  '112': {
8050
8347
  name: 'Condition Based/Predictive Maintenance Sensor v4',
8051
8348
  parse: (payload, parsed, mac) => {
8052
- if(payload[7] >> 1 != 0){
8349
+ if(payload[7] & 2){
8053
8350
  console.log('Error found');
8054
8351
  console.log(payload[7]);
8055
8352
  parsed.data = {error: 'Error found, Sensor Probe may be unattached'};
8056
8353
  return parsed;
8057
8354
  }
8058
-
8355
+ let msg_type = (payload[7] & 16)? 'motion' : 'regular';
8059
8356
  if(payload[8] === 1){
8060
8357
  var deviceAddr = mac;
8061
8358
  var firmware = payload[1];
8062
8359
  var hour = payload[12];
8063
8360
  var minute = payload[13];
8064
- var expected_packets = payload[16];
8065
- var current_packet = payload[17];
8066
- var sdata_start = 18;
8361
+ var expected_packets = msbLsb(payload[16], payload[17]);
8362
+ var current_packet = msbLsb(payload[18], payload[19]);
8363
+ var sdata_start = 20;
8067
8364
 
8068
8365
  if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
8069
8366
  if(expected_packets != 1){
@@ -8233,12 +8530,15 @@ function sensor_types(parent){
8233
8530
  }
8234
8531
  }
8235
8532
  var fft_concat_obj = {
8533
+ mode: payload[8],
8534
+ msg_type: msg_type,
8236
8535
  time_id: globalDevices[deviceAddr].hour +':'+ globalDevices[deviceAddr].minute,
8237
8536
  mac_address: deviceAddr,
8238
8537
  en_axis: globalDevices[deviceAddr].en_axis,
8239
8538
  fsr: fsr_text,
8240
8539
  odr: globalDevices[deviceAddr].odr,
8241
8540
  device_temp: globalDevices[deviceAddr].device_temp,
8541
+ total_samples: label,
8242
8542
  data: fft_concat
8243
8543
  };
8244
8544
  // console.log(globalDevices[deviceAddr].data);
@@ -8318,6 +8618,7 @@ function sensor_types(parent){
8318
8618
  }
8319
8619
  return {
8320
8620
  mode: payload[8],
8621
+ msg_type: msg_type,
8321
8622
 
8322
8623
  odr: odr,
8323
8624
  temperature: signInt(payload.slice(10, 12).reduce(msbLsb), 16) / 100,
@@ -8366,6 +8667,9 @@ function sensor_types(parent){
8366
8667
  case 2:
8367
8668
  frame_data.mode = "Processed + Raw on demand";
8368
8669
  break;
8670
+ case 3:
8671
+ frame_data.mode = "Smart";
8672
+ break;
8369
8673
  }
8370
8674
  switch(frame[17]){
8371
8675
  case 6:
@@ -8477,30 +8781,39 @@ function sensor_types(parent){
8477
8781
  switch(frame[22]){
8478
8782
  case 0:
8479
8783
  frame_data.sampling_interval = "5 Minutes";
8784
+ frame_data.sampling_interval_number = 5;
8480
8785
  break;
8481
8786
  case 1:
8482
8787
  frame_data.sampling_interval = "10 Minutes";
8788
+ frame_data.sampling_interval_number = 10;
8483
8789
  break;
8484
8790
  case 2:
8485
8791
  frame_data.sampling_interval = "15 Minutes";
8792
+ frame_data.sampling_interval_number = 15;
8486
8793
  break;
8487
8794
  case 2:
8488
8795
  frame_data.sampling_interval = "20 Minutes";
8796
+ frame_data.sampling_interval_number = 20;
8489
8797
  break;
8490
8798
  case 4:
8491
8799
  frame_data.sampling_interval = "30 Minutes";
8800
+ frame_data.sampling_interval_number = 30;
8492
8801
  break;
8493
8802
  case 5:
8494
8803
  frame_data.sampling_interval = "60 Minutes";
8804
+ frame_data.sampling_interval_number = 60;
8495
8805
  break;
8496
8806
  case 6:
8497
8807
  frame_data.sampling_interval = "120 Minutes";
8808
+ frame_data.sampling_interval_number = 120;
8498
8809
  break;
8499
8810
  case 7:
8500
8811
  frame_data.sampling_interval = "180 Minutes";
8812
+ frame_data.sampling_interval_number = 180;
8501
8813
  break;
8502
8814
  case 8:
8503
8815
  frame_data.sampling_interval = "1 Minute";
8816
+ frame_data.sampling_interval_number = 1;
8504
8817
  break;
8505
8818
  }
8506
8819
  frame_data.on_request_timeout = frame[23] + " Seconds";
@@ -8535,6 +8848,9 @@ function sensor_types(parent){
8535
8848
  break;
8536
8849
  }
8537
8850
  frame_data.rpm_status = frame[27]? 'Enabled': 'Disabled';
8851
+ frame_data.auto_raw_interval = frame[32] * frame_data.sampling_interval_number || 'disabled';
8852
+ frame_data.auto_raw_interval = typeof frame_data.auto_raw_interval === 'number' ? frame_data.auto_raw_interval+'min' : frame_data.auto_raw_interval;
8853
+ frame_data.smart_mode_threshold = frame[34] * 50;
8538
8854
  return {
8539
8855
  'firmware': frame[2],
8540
8856
  'destination_address': toMac(frame.slice(12, 16)),
@@ -8550,8 +8866,16 @@ function sensor_types(parent){
8550
8866
  'on_request_timeout': frame_data.on_request_timeout,
8551
8867
  'deadband': frame_data.deadband,
8552
8868
  'payload_length': frame_data.payload_length,
8553
- 'fsm': frame_data.fsr_text,
8869
+ 'fsr': frame_data.fsr_text,
8554
8870
  'rpm_compute_status': frame_data.rpm_status,
8871
+ 'auto_raw_destination_address': toMac(frame.slice(28 , 32)),
8872
+ 'auto_raw_interval': frame_data.auto_raw_interval,
8873
+ 'smart_mode_skip_count': frame[33],
8874
+ 'smart_mode_acc_threshold': frame_data.smart_mode_threshold+'mg',
8875
+ 'uptime_counter': frame.slice(35, 39).reduce(msbLsb),
8876
+ 'hardware_id': frame.slice(39, 42),
8877
+ 'reserved': frame.slice(42, 46),
8878
+ 'tx_lifetime_counter': frame.slice(46, 50).reduce(msbLsb),
8555
8879
  'machine_values': {
8556
8880
  'firmware': frame[2],
8557
8881
  'destination_address': toMac(frame.slice(12, 16), false),
@@ -8566,7 +8890,15 @@ function sensor_types(parent){
8566
8890
  'deadband': frame[24],
8567
8891
  'payload_length': frame[25],
8568
8892
  'fsm': frame[26],
8569
- 'rpm_compute_status': frame[27],
8893
+ 'rpm_compute_status': frame[27],
8894
+ 'auto_raw_destination_address': toMac(frame.slice(28 , 32)),
8895
+ 'auto_raw_interval': frame[32],
8896
+ 'smart_mode_skip_count': frame[33],
8897
+ 'smart_mode_acc_threshold':frame[34],
8898
+ 'uptime_counter': frame.slice(35, 39),
8899
+ 'hardware_id': frame.slice(39, 42),
8900
+ 'reserved': frame.slice(42, 46),
8901
+ 'tx_lifetime_counter': frame.slice(46, 50)
8570
8902
  }
8571
8903
  }
8572
8904
  }
@@ -8574,72 +8906,57 @@ function sensor_types(parent){
8574
8906
  '114': {
8575
8907
  name: 'Standalone Smart Vibration Sensor v4',
8576
8908
  parse: (payload, parsed, mac) => {
8577
- if(payload[7] >> 1 != 0){
8909
+ if(payload[7] & 2){
8578
8910
  console.log('Error found');
8579
8911
  parsed.data = {error: 'Error found, Sensor Probe may be unattached'};
8580
8912
  return parsed;
8581
8913
  }
8582
-
8914
+ let msg_type = (payload[7] & 16)? 'motion' : 'regular';
8583
8915
  if(payload[8] === 1){
8584
8916
  var deviceAddr = mac;
8585
8917
  var firmware = payload[1];
8586
8918
  var hour = payload[12];
8587
8919
  var minute = payload[13];
8588
- var expected_packets = payload[16];
8589
- var current_packet = payload[17];
8590
- var sdata_start = 18;
8920
+ var expected_packets = msbLsb(payload[16], payload[17]);
8921
+ var current_packet = msbLsb(payload[18], payload[19]);
8922
+ var sdata_start = 20;
8591
8923
 
8592
8924
  if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
8593
8925
  if(expected_packets != 1){
8594
- // 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
8595
- if(current_packet in globalDevices[deviceAddr].data || current_packet == 1 || !((current_packet-1) in globalDevices[deviceAddr].data)) {
8596
- console.log('-----');
8597
- console.log('bad packet breakdown deleting stream');
8598
- console.log(current_packet);
8599
- console.log(expected_packets);
8600
- console.log(current_packet in globalDevices[deviceAddr].data);
8601
- console.log(current_packet == 1);
8602
- console.log(!((current_packet-1) in globalDevices[deviceAddr].data));
8603
- if(this.hasOwnProperty('failure_no')){
8604
- this.failure_no = this.failure_no + 1;
8605
- }
8606
- else{
8607
- this.failure_no = 1;
8608
- }
8609
- if(this.hasOwnProperty('failure_no')){
8610
- console.log('####falure no');
8611
- console.log(this.failure_no);
8612
- }
8613
- // console.log(globalDevices[deviceAddr].data);
8926
+ // if current packet is equal to last one (duplicated data). This does not apply to the last package
8927
+ if (globalDevices[deviceAddr].last_packet_counter == current_packet){
8928
+ console.log('Duplicated message')
8929
+ return;
8930
+ }
8931
+ // if current packet is equal to 1 or last packet counter is higher thant current packet
8932
+ if(current_packet == 1 || (globalDevices[deviceAddr].last_packet_counter > current_packet)){
8933
+ // clear stream
8614
8934
  delete globalDevices[deviceAddr];
8615
- if(current_packet != 1){
8616
- return;
8617
- } else{
8618
-
8619
- var mode = payload[8];
8620
- var odr = msbLsb(payload[9], payload[10])
8621
- var en_axis = payload[11] & 7;
8622
- var fsr = payload[11] >> 5;
8623
- var device_temp = msbLsb(payload[14], payload[15])/100;
8624
-
8625
- globalDevices[deviceAddr] = {
8626
- // stream_size: expected_packets,
8627
- data: {},
8628
- odr: odr,
8629
- mo: mode,
8630
- en_axis: en_axis,
8631
- fsr: fsr,
8632
- hour: hour,
8633
- minute: minute,
8634
- device_temp: device_temp,
8635
- }
8636
- globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
8637
- return;
8935
+ // create new stream
8936
+ var mode = payload[8];
8937
+ var odr = msbLsb(payload[9], payload[10])
8938
+ var en_axis = payload[11] & 7;
8939
+ var fsr = payload[11] >> 5;
8940
+ var device_temp = msbLsb(payload[14], payload[15])/100;
8941
+
8942
+ globalDevices[deviceAddr] = {
8943
+ data: {},
8944
+ odr: odr,
8945
+ mo: mode,
8946
+ en_axis: en_axis,
8947
+ fsr: fsr,
8948
+ hour: hour,
8949
+ minute: minute,
8950
+ device_temp: device_temp,
8638
8951
  }
8639
- }
8640
- else{
8952
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
8641
8953
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
8954
+ return;
8642
8955
  }
8956
+ else{
8957
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
8958
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
8959
+ }
8643
8960
  }
8644
8961
  else{
8645
8962
  var mode = payload[8];
@@ -8649,7 +8966,6 @@ function sensor_types(parent){
8649
8966
  var device_temp = msbLsb(payload[14], payload[15])/100;
8650
8967
 
8651
8968
  globalDevices[deviceAddr] = {
8652
- // stream_size: expected_packets,
8653
8969
  data: {},
8654
8970
  odr: odr,
8655
8971
  mo: mode,
@@ -8659,126 +8975,11 @@ function sensor_types(parent){
8659
8975
  minute: minute,
8660
8976
  device_temp: device_temp,
8661
8977
  }
8978
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
8662
8979
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
8663
8980
  }
8664
- if(Object.keys(globalDevices[deviceAddr].data).length == expected_packets){
8665
- var raw_data = new Array();
8666
- for(const packet in globalDevices[deviceAddr].data){
8667
- raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
8668
- }
8669
- var label = 0;
8670
-
8671
- var fft = new Array();
8672
- var fft_concat = {};
8673
-
8674
- var en_axis_data = {};
8675
- switch (globalDevices[deviceAddr].en_axis){
8676
- case 1:
8677
- en_axis_data.x_offset = 0;
8678
- en_axis_data.increment = 2;
8679
- break;
8680
- case 2:
8681
- en_axis_data.y_offset = 0;
8682
- en_axis_data.increment = 2;
8683
- break;
8684
- case 3:
8685
- en_axis_data.x_offset = 0;
8686
- en_axis_data.y_offset = 2;
8687
- en_axis_data.increment = 4;
8688
- break;
8689
- case 4:
8690
- en_axis_data.z_offset = 0;
8691
- en_axis_data.increment = 2;
8692
- break;
8693
- case 5:
8694
- en_axis_data.x_offset = 0;
8695
- en_axis_data.z_offset = 2;
8696
- en_axis_data.increment = 4;
8697
- break;
8698
- case 6:
8699
- en_axis_data.y_offset = 0;
8700
- en_axis_data.z_offset = 2;
8701
- en_axis_data.increment = 4;
8702
- break;
8703
- case 7:
8704
- en_axis_data.x_offset = 0;
8705
- en_axis_data.y_offset = 2;
8706
- en_axis_data.z_offset = 4;
8707
- en_axis_data.increment = 6;
8708
- break;
8709
- default:
8710
- en_axis_data.increment = 0;
8711
- }
8712
-
8713
- var fsr_mult = .00006;
8714
- var fsr_text = "";
8715
- switch(globalDevices[deviceAddr].fsr){
8716
- case 0:
8717
- fsr_mult = 0.00006;
8718
- break;
8719
- case 1:
8720
- fsr_mult = 0.00012;
8721
- break;
8722
- case 2:
8723
- fsr_mult = 0.00024;
8724
- break;
8725
- case 3:
8726
- fsr_mult = 0.00049;
8727
- break;
8728
- }
8729
- switch(globalDevices[deviceAddr].fsr){
8730
- case 0:
8731
- fsr_text = "2g";
8732
- break;
8733
- case 1:
8734
- fsr_text = "4g";
8735
- break;
8736
- case 2:
8737
- fsr_text = "8g";
8738
- break;
8739
- case 3:
8740
- fsr_text = "16g";
8741
- break;
8742
- }
8743
-
8744
- for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
8745
- label++;
8746
-
8747
- fft_concat[label] = {};
8748
-
8749
- if('x_offset' in en_axis_data){
8750
- 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));
8751
- }
8752
- if('y_offset' in en_axis_data){
8753
- 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));
8754
- }
8755
- if('z_offset' in en_axis_data){
8756
- 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));
8757
- }
8758
- }
8759
- var fft_concat_obj = {
8760
- time_id: globalDevices[deviceAddr].hour +':'+ globalDevices[deviceAddr].minute,
8761
- mac_address: deviceAddr,
8762
- en_axis: globalDevices[deviceAddr].en_axis,
8763
- fsr: fsr_text,
8764
- odr: globalDevices[deviceAddr].odr,
8765
- device_temp: globalDevices[deviceAddr].device_temp,
8766
- data: fft_concat
8767
- };
8768
- sensor_data = fft_concat_obj;
8769
- delete globalDevices[deviceAddr];
8770
- if(this.hasOwnProperty('failure_no')){
8771
- console.log('####falure no');
8772
- console.log(this.failure_no);
8773
- }
8774
-
8775
- return sensor_data;
8776
- }
8777
- else{
8778
- return;
8779
- }
8780
- }else{
8781
-
8981
+ }
8982
+ else{
8782
8983
  var mode = payload[8];
8783
8984
  var odr = msbLsb(payload[9], payload[10])
8784
8985
  var en_axis = payload[11] & 7;
@@ -8786,7 +8987,6 @@ function sensor_types(parent){
8786
8987
  var device_temp = msbLsb(payload[14], payload[15])/100;
8787
8988
 
8788
8989
  globalDevices[deviceAddr] = {
8789
- // stream_size: expected_packets,
8790
8990
  data: {},
8791
8991
  odr: odr,
8792
8992
  mo: mode,
@@ -8796,7 +8996,123 @@ function sensor_types(parent){
8796
8996
  minute: minute,
8797
8997
  device_temp: device_temp,
8798
8998
  }
8999
+ globalDevices[deviceAddr].last_packet_counter = current_packet;
8799
9000
  globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
9001
+ }
9002
+ if(current_packet == expected_packets){
9003
+ var raw_data = new Array();
9004
+ for(const packet in globalDevices[deviceAddr].data){
9005
+ raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
9006
+ }
9007
+ var label = 0;
9008
+
9009
+ var fft = new Array();
9010
+ var fft_concat = {};
9011
+
9012
+ var en_axis_data = {};
9013
+ switch (globalDevices[deviceAddr].en_axis){
9014
+ case 1:
9015
+ en_axis_data.x_offset = 0;
9016
+ en_axis_data.increment = 2;
9017
+ break;
9018
+ case 2:
9019
+ en_axis_data.y_offset = 0;
9020
+ en_axis_data.increment = 2;
9021
+ break;
9022
+ case 3:
9023
+ en_axis_data.x_offset = 0;
9024
+ en_axis_data.y_offset = 2;
9025
+ en_axis_data.increment = 4;
9026
+ break;
9027
+ case 4:
9028
+ en_axis_data.z_offset = 0;
9029
+ en_axis_data.increment = 2;
9030
+ break;
9031
+ case 5:
9032
+ en_axis_data.x_offset = 0;
9033
+ en_axis_data.z_offset = 2;
9034
+ en_axis_data.increment = 4;
9035
+ break;
9036
+ case 6:
9037
+ en_axis_data.y_offset = 0;
9038
+ en_axis_data.z_offset = 2;
9039
+ en_axis_data.increment = 4;
9040
+ break;
9041
+ case 7:
9042
+ en_axis_data.x_offset = 0;
9043
+ en_axis_data.y_offset = 2;
9044
+ en_axis_data.z_offset = 4;
9045
+ en_axis_data.increment = 6;
9046
+ break;
9047
+ default:
9048
+ en_axis_data.increment = 0;
9049
+ }
9050
+
9051
+ var fsr_mult = .00006;
9052
+ var fsr_text = "";
9053
+
9054
+ switch(globalDevices[deviceAddr].fsr){
9055
+ case 0:
9056
+ fsr_mult = 0.00006;
9057
+ break;
9058
+ case 1:
9059
+ fsr_mult = 0.00012;
9060
+ break;
9061
+ case 2:
9062
+ fsr_mult = 0.00024;
9063
+ break;
9064
+ case 3:
9065
+ fsr_mult = 0.00049;
9066
+ break;
9067
+ }
9068
+ switch(globalDevices[deviceAddr].fsr){
9069
+ case 0:
9070
+ fsr_text = "2g";
9071
+ break;
9072
+ case 1:
9073
+ fsr_text = "4g";
9074
+ break;
9075
+ case 2:
9076
+ fsr_text = "8g";
9077
+ break;
9078
+ case 3:
9079
+ fsr_text = "16g";
9080
+ break;
9081
+ }
9082
+
9083
+ for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
9084
+ label++;
9085
+
9086
+ fft_concat[label] = {};
9087
+
9088
+ if('x_offset' in en_axis_data){
9089
+ 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));
9090
+ }
9091
+ if('y_offset' in en_axis_data){
9092
+ 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));
9093
+ }
9094
+ if('z_offset' in en_axis_data){
9095
+ 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));
9096
+ }
9097
+ }
9098
+ var fft_concat_obj = {
9099
+ mode: payload[8],
9100
+ msg_type: msg_type,
9101
+ time_id: globalDevices[deviceAddr].hour +':'+ globalDevices[deviceAddr].minute,
9102
+ mac_address: deviceAddr,
9103
+ en_axis: globalDevices[deviceAddr].en_axis,
9104
+ fsr: fsr_text,
9105
+ odr: globalDevices[deviceAddr].odr,
9106
+ device_temp: globalDevices[deviceAddr].device_temp,
9107
+ total_samples: label,
9108
+ ft_confidence : ((globalDevices[deviceAddr].counter / expected_packets) * 100).toFixed(2) + '%',
9109
+ data: fft_concat
9110
+ };
9111
+ sensor_data = fft_concat_obj;
9112
+ delete globalDevices[deviceAddr];
9113
+ return sensor_data;
9114
+ }
9115
+ else{
8800
9116
  return;
8801
9117
  }
8802
9118
  }
@@ -8838,6 +9154,7 @@ function sensor_types(parent){
8838
9154
  }
8839
9155
  return {
8840
9156
  mode: payload[8],
9157
+ msg_type: msg_type,
8841
9158
 
8842
9159
  odr: odr,
8843
9160
  temperature: signInt(payload.slice(10, 12).reduce(msbLsb), 16) / 100,
@@ -8885,6 +9202,9 @@ function sensor_types(parent){
8885
9202
  case 2:
8886
9203
  frame_data.mode = "Processed + Raw on demand";
8887
9204
  break;
9205
+ case 3:
9206
+ frame_data.mode = "Smart";
9207
+ break;
8888
9208
  }
8889
9209
  switch(frame[17]){
8890
9210
  case 6:
@@ -8996,30 +9316,39 @@ function sensor_types(parent){
8996
9316
  switch(frame[22]){
8997
9317
  case 0:
8998
9318
  frame_data.sampling_interval = "5 Minutes";
9319
+ frame_data.sampling_interval_number = 5;
8999
9320
  break;
9000
9321
  case 1:
9001
9322
  frame_data.sampling_interval = "10 Minutes";
9323
+ frame_data.sampling_interval_number = 10;
9002
9324
  break;
9003
9325
  case 2:
9004
9326
  frame_data.sampling_interval = "15 Minutes";
9327
+ frame_data.sampling_interval_number = 15;
9005
9328
  break;
9006
9329
  case 2:
9007
9330
  frame_data.sampling_interval = "20 Minutes";
9331
+ frame_data.sampling_interval_number = 20;
9008
9332
  break;
9009
9333
  case 4:
9010
9334
  frame_data.sampling_interval = "30 Minutes";
9335
+ frame_data.sampling_interval_number = 30;
9011
9336
  break;
9012
9337
  case 5:
9013
9338
  frame_data.sampling_interval = "60 Minutes";
9339
+ frame_data.sampling_interval_number = 60;
9014
9340
  break;
9015
9341
  case 6:
9016
9342
  frame_data.sampling_interval = "120 Minutes";
9343
+ frame_data.sampling_interval_number = 120;
9017
9344
  break;
9018
9345
  case 7:
9019
9346
  frame_data.sampling_interval = "180 Minutes";
9347
+ frame_data.sampling_interval_number = 180;
9020
9348
  break;
9021
9349
  case 8:
9022
9350
  frame_data.sampling_interval = "1 Minute";
9351
+ frame_data.sampling_interval_number = 1;
9023
9352
  break;
9024
9353
  }
9025
9354
  frame_data.on_request_timeout = frame[23] + " Seconds";
@@ -9054,6 +9383,9 @@ function sensor_types(parent){
9054
9383
  break;
9055
9384
  }
9056
9385
  frame_data.rpm_status = frame[27]? 'Enabled': 'Disabled';
9386
+ frame_data.auto_raw_interval = frame[32] * frame_data.sampling_interval_number || 'disabled';
9387
+ frame_data.auto_raw_interval = typeof frame_data.auto_raw_interval === 'number' ? frame_data.auto_raw_interval+'min' : frame_data.auto_raw_interval;
9388
+ frame_data.smart_mode_threshold = frame[34] * 50;
9057
9389
  return {
9058
9390
  'firmware': frame[2],
9059
9391
  'destination_address': toMac(frame.slice(12, 16)),
@@ -9071,6 +9403,14 @@ function sensor_types(parent){
9071
9403
  'payload_length': frame_data.payload_length,
9072
9404
  'fsr': frame_data.fsr_text,
9073
9405
  'rpm_compute_status': frame_data.rpm_status,
9406
+ 'auto_raw_destination_address': toMac(frame.slice(28 , 32)),
9407
+ 'auto_raw_interval': frame_data.auto_raw_interval,
9408
+ 'smart_mode_skip_count': frame[33],
9409
+ 'smart_mode_acc_threshold':frame_data.smart_mode_threshold+'mg',
9410
+ 'uptime_counter': frame.slice(35, 39).reduce(msbLsb),
9411
+ 'hardware_id': frame.slice(39, 42),
9412
+ 'reserved': frame.slice(42, 46),
9413
+ 'tx_lifetime_counter': frame.slice(46, 50).reduce(msbLsb),
9074
9414
  'machine_values': {
9075
9415
  'firmware': frame[2],
9076
9416
  'destination_address': toMac(frame.slice(12, 16), false),
@@ -9085,7 +9425,15 @@ function sensor_types(parent){
9085
9425
  'deadband': frame[24],
9086
9426
  'payload_length': frame[25],
9087
9427
  'fsr': frame[26],
9088
- 'rpm_compute_status': frame[27],
9428
+ 'rpm_compute_status': frame[27],
9429
+ 'auto_raw_destination_address': toMac(frame.slice(28 , 32)),
9430
+ 'auto_raw_interval': frame[32],
9431
+ 'smart_mode_skip_count': frame[33],
9432
+ 'smart_mode_acc_threshold':frame[34],
9433
+ 'uptime_counter': frame.slice(35, 39),
9434
+ 'hardware_id': frame.slice(39, 42),
9435
+ 'reserved': frame.slice(42, 46),
9436
+ 'tx_lifetime_counter': frame.slice(46, 50)
9089
9437
  }
9090
9438
  }
9091
9439
  }
@@ -9173,6 +9521,34 @@ function sensor_types(parent){
9173
9521
  }
9174
9522
  }
9175
9523
  },
9524
+ '120': {
9525
+ name: 'Wireless H2S Sensor',
9526
+ parse: (d) => {
9527
+ return {
9528
+ ppm: d.slice(0, 2).reduce(msbLsb),
9529
+ temperature: signInt(d.slice(2, 4).reduce(msbLsb), 16) / 100,
9530
+ humidity: signInt(d.slice(4, 6).reduce(msbLsb), 16) / 100
9531
+ };
9532
+ },
9533
+ 'parse_fly': (frame) => {
9534
+ return {
9535
+ 'firmware': frame[2],
9536
+ 'h2s_threshold': frame[12],
9537
+ 'always_on_status': frame[13],
9538
+ 'hardware_id': frame.slice(14, 17),
9539
+ 'sample_rate': frame.slice(17, 21).reduce(msbLsb) + " Sec.",
9540
+ 'tx_life_counter': frame.slice(21, 25).reduce(msbLsb),
9541
+ 'machine_values': {
9542
+ 'firmware': frame[2],
9543
+ 'h2s threshold': frame[12],
9544
+ 'always_on_status': frame[13],
9545
+ 'hardware_id': frame.slice(14, 17),
9546
+ 'sample_rate': frame.slice(17, 21).reduce(msbLsb),
9547
+ 'tx_life_counter': frame.slice(21, 25).reduce(msbLsb)
9548
+ }
9549
+ }
9550
+ }
9551
+ },
9176
9552
  '180': {
9177
9553
  name: 'C1D2 One Channel Vibration Plus',
9178
9554
  parse: (payload, parsed, mac) => {
@@ -9223,11 +9599,8 @@ function sensor_types(parent){
9223
9599
  '217': {
9224
9600
  name: 'Wireless Weight Scale',
9225
9601
  parse: (d) => {
9226
- let units;
9227
- d[0] ? units = "Kg" : units = "Lbs"
9228
9602
  return {
9229
- unit: units,
9230
- weight: signInt(d.slice(1, 4).reduce(msbLsb)) * 100
9603
+ weight: signInt(d.slice(0, 4).reduce(msbLsb)) / 100
9231
9604
  };
9232
9605
  }
9233
9606
  },
@@ -9444,6 +9817,16 @@ function sensor_types(parent){
9444
9817
  }
9445
9818
  }
9446
9819
  },
9820
+ '518': {
9821
+ name: 'Custom Air Velocity',
9822
+ parse: (d) => {
9823
+ return {
9824
+ pressure: signInt(d.slice(0, 4).reduce(msbLsb), 16) / 100,
9825
+ temperature: signInt(d.slice(4, 6).reduce(msbLsb), 16) / 100,
9826
+ velocity: signInt(d.slice(6, 8).reduce(msbLsb), 16) / 1000
9827
+ };
9828
+ }
9829
+ },
9447
9830
  '519': {
9448
9831
  name: 'Type 519 - Vibration',
9449
9832
  parse: (payload, parsed, mac) => {