@ncd-io/node-red-enterprise-sensors 1.0.4 → 1.0.6

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.
@@ -142,7 +142,7 @@ module.exports = class WirelessSensor{
142
142
  }
143
143
  }
144
144
  // #OTF
145
- var otf_devices = [23,26,39,45,48,52,76,78,79,80,81,82,84,88,89,90,91,101,102,105,106,107,108,110,111,112,114,180,181,519,520,521,531,535,537,538,539,540,1010,1011];
145
+ var otf_devices = [23,26,39,45,48,52,58,76,78,79,80,81,82,84,88,89,90,91,101,102,105,106,107,108,110,111,112,114,180,181,519,520,521,531,535,537,538,539,540,1010,1011];
146
146
  var device_type = msbLsb(frame.data[6], frame.data[7]);
147
147
  // var device_type = frame.data[7];
148
148
 
@@ -294,7 +294,7 @@ module.exports = class WirelessSensor{
294
294
  };
295
295
 
296
296
  // #OTF
297
- var otf_devices = [23,26,39,45,48,52,76,78,79,80,81,82,84,88,89,90,91,101,102,105,106,107,108,110,111,112,114,180,181,519,520,521,531,535,537,538,539,540,1010,1011];
297
+ var otf_devices = [23,26,39,45,48,52,58,76,78,79,80,81,82,84,88,89,90,91,101,102,105,106,107,108,110,111,112,114,180,181,519,520,521,531,535,537,538,539,540,1010,1011];
298
298
  if(otf_devices.includes(parsed.sensor_type)){
299
299
  // If the message says FLY and there is not FLY timer in progress.
300
300
  if(payload[8] == 70 && payload[9] == 76 && payload[10] == 89) {
@@ -712,7 +712,7 @@ module.exports = class WirelessSensor{
712
712
  data: payload.slice(8)
713
713
  };
714
714
  // #OTF
715
- }else if(parsed.sensor_type == 80 || parsed.sensor_type == 81 || parsed.sensor_type == 82 || parsed.sensor_type == 84 || parsed.sensor_type == 180 || parsed.sensor_type == 181 || parsed.sensor_type == 515 || parsed.sensor_type == 519 || parsed.sensor_type == 537 || parsed.sensor_type == 538){
715
+ }else if(parsed.sensor_type == 80 || parsed.sensor_type == 81 || parsed.sensor_type == 82 || parsed.sensor_type == 84 || parsed.sensor_type == 180 || parsed.sensor_type == 181 || parsed.sensor_type == 515 || parsed.sensor_type == 519 || parsed.sensor_type == 531 || parsed.sensor_type == 537 || parsed.sensor_type == 538){
716
716
  parsed.sensor_data = this.sensor_types[parsed.sensor_type].parse(payload, parsed, frame.mac);
717
717
  if(!parsed.sensor_data){
718
718
  return;
@@ -1307,8 +1307,8 @@ module.exports = class WirelessSensor{
1307
1307
  console.log(packet);
1308
1308
  return this.config_send(sensor_mac, packet);
1309
1309
  }
1310
- config_enable_stay_on_mode_539(sensor_mac, value){
1311
- console.log('config_enable_stay_on_mode_539');
1310
+ config_set_stay_on_mode_539(sensor_mac, value){
1311
+ console.log('config_set_stay_on_mode_539');
1312
1312
  var packet = [247, 50, 0, 0, 0, value];
1313
1313
  console.log(packet);
1314
1314
  return this.config_send(sensor_mac, packet);
@@ -1371,6 +1371,18 @@ module.exports = class WirelessSensor{
1371
1371
  console.log(packet);
1372
1372
  return this.config_send(sensor_mac, packet);
1373
1373
  }
1374
+ config_set_number_of_read_retries_539(sensor_mac, value){
1375
+ console.log('config_set_number_of_read_retries_539');
1376
+ var packet = [244, 55, 0, 0, 23, value];
1377
+ console.log(packet);
1378
+ return this.config_send(sensor_mac, packet);
1379
+ }
1380
+ config_set_read_parameter_539(sensor_mac, value){
1381
+ console.log('config_set_read_parameter_539');
1382
+ var packet = [244, 57, 0, 0, 23, value];
1383
+ console.log(packet);
1384
+ return this.config_send(sensor_mac, packet);
1385
+ }
1374
1386
  config_set_auto_raw_interval_110(sensor_mac, value){
1375
1387
  console.log('config_set_raw_interval_110');
1376
1388
  var packet = [244, 79, 0, 0, 80, 76, value];
@@ -1407,28 +1419,58 @@ module.exports = class WirelessSensor{
1407
1419
  }
1408
1420
  config_set_current_calibration_13(sensor_mac, calib){
1409
1421
  console.log('config_set_current_calibration_13');
1422
+ calib = calib * 100;
1410
1423
  var packet = [244, 1, 0, 0, 0];
1411
- var cal_val = int2Bytes(calib, 2);
1424
+ var cal_val = int2Bytes(calib, 4);
1412
1425
  packet.push(...cal_val);
1413
1426
  console.log(packet);
1414
1427
  return this.config_send(sensor_mac, packet);
1415
1428
  }
1416
1429
  config_set_current_calibration_ch2_19(sensor_mac, calib){
1417
1430
  console.log('config_set_current_calibration_ch2_19');
1431
+ calib = calib * 100;
1418
1432
  var packet = [244, 3, 0, 0, 0];
1419
- var cal_val = int2Bytes(calib, 2);
1433
+ var cal_val = int2Bytes(calib, 4);
1420
1434
  packet.push(...cal_val);
1421
1435
  console.log(packet);
1422
1436
  return this.config_send(sensor_mac, packet);
1423
1437
  }
1424
1438
  config_set_current_calibration_ch3_28(sensor_mac, calib){
1425
1439
  console.log('cconfig_set_current_calibration_ch3_28');
1440
+ calib = calib * 100;
1426
1441
  var packet = [244, 5, 0, 0, 0];
1427
- var cal_val = int2Bytes(calib, 2);
1442
+ var cal_val = int2Bytes(calib, 4);
1428
1443
  packet.push(...cal_val);
1429
1444
  console.log(packet);
1430
1445
  return this.config_send(sensor_mac, packet);
1431
1446
  }
1447
+ config_set_rx485_timeout_1011(sensor_mac, value){
1448
+ console.log('config_set_Rx485_timeout_1011');
1449
+ var packet = [244, 48, 0, 0, 23, value];
1450
+ console.log(packet);
1451
+ return this.config_send(sensor_mac, packet);
1452
+ }
1453
+ config_set_mode_1011(sensor_mac, value){
1454
+ console.log('config_set_mode_1011');
1455
+ var packet = [244, 38, 0, 0, 23, value];
1456
+ console.log(packet);
1457
+ return this.config_send(sensor_mac, packet);
1458
+ }
1459
+ config_set_auto_address_timeout_1011(sensor_mac, value){
1460
+ console.log('config_set_auto_address_timeout_1011');
1461
+ var packet = [244, 40, 0, 0, 23];
1462
+ var time_val = int2Bytes(value, 2);
1463
+ packet.push(...time_val);
1464
+ console.log(packet);
1465
+ return this.config_send(sensor_mac, packet);
1466
+ }
1467
+ config_set_operation_mode_531(sensor_mac, mode){
1468
+ console.log('config_set_operation_mode_531');
1469
+ console.log(mode);
1470
+ var packet = [244, 32, 0, 0, 0, mode];
1471
+ console.log(packet);
1472
+ return this.config_send(sensor_mac, packet);
1473
+ }
1432
1474
  config_get_delay(sensor_mac){
1433
1475
  return new Promise((fulfill, reject) => {
1434
1476
  this.config_send(sensor_mac, [247, 21, 0, 0, 0]).then((res) => {
@@ -2536,6 +2578,44 @@ function sensor_types(parent){
2536
2578
  byteThree: d[2],
2537
2579
  byteFour: d[3]
2538
2580
  };
2581
+ },
2582
+ 'parse_fly': (frame) => {
2583
+ let frame_data = {};
2584
+ switch(frame[16]){
2585
+ case 0:
2586
+ frame_data.fsr = "+-0.256 V";
2587
+ break;
2588
+ case 1:
2589
+ frame_data.fsr = "+-0.512 V";
2590
+ break;
2591
+ case 2:
2592
+ frame_data.fsr = "+-1.024 V";
2593
+ break;
2594
+ case 3:
2595
+ frame_data.fsr = "+-2.048 V";
2596
+ break;
2597
+ case 4:
2598
+ frame_data.fsr = "+-4.096 V";
2599
+ break;
2600
+ case 5:
2601
+ frame_data.fsr = "+-6.144 V";
2602
+ break;
2603
+ }
2604
+ return {
2605
+ 'firmware': frame[2],
2606
+ 'report_rate': frame.slice(12, 16).reduce(msbLsb),
2607
+ 'fsr':frame_data.fsr,
2608
+ 'boot_up_time': frame[17],
2609
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
2610
+ 'machine_values': {
2611
+ 'firmware': frame[2],
2612
+ 'report_rate': frame.slice(12, 16),
2613
+ 'fsr':frame[16],
2614
+ 'boot_up_time': frame[17],
2615
+ 'adc_pin_reading': frame.slice(18, 20),
2616
+ 'frame': frame
2617
+ }
2618
+ }
2539
2619
  }
2540
2620
  },
2541
2621
  '53': {
@@ -2586,6 +2666,22 @@ function sensor_types(parent){
2586
2666
  };
2587
2667
  }
2588
2668
  },
2669
+ '58': {
2670
+ name: 'Tank Level v3',
2671
+ parse: (d) => {
2672
+ return {
2673
+ filtered_range: d.slice(0, 2).reduce(msbLsb),
2674
+ long_range_algorithm: d.slice(2, 4).reduce(msbLsb),
2675
+ second_chance: d.slice(4, 6).reduce(msbLsb),
2676
+ copare_reading: d.slice(6, 8).reduce(msbLsb),
2677
+ short_range_algorithm: d.slice(8, 10).reduce(msbLsb),
2678
+ trusted_reading: d.slice(10, 12).reduce(msbLsb),
2679
+ final_filter: d.slice(12, 14).reduce(msbLsb),
2680
+ raw_final: d.slice(14, 16).reduce(msbLsb),
2681
+ final_index: d.slice(16, 18).reduce(msbLsb),
2682
+ };
2683
+ }
2684
+ },
2589
2685
  '60': {
2590
2686
  name: 'Air Velocity and Precision Pressure & Temperature Sensor',
2591
2687
  parse: (d) => {
@@ -5599,12 +5695,12 @@ function sensor_types(parent){
5599
5695
  return error;
5600
5696
  }
5601
5697
  return {
5602
- digital_input_1_counter: d.slice(0, 4).reduce(msbLsb),
5603
- digital_input_1_uptime: d.slice(4, 8).reduce(msbLsb),
5604
- digital_input_2_counter: d.slice(8, 12).reduce(msbLsb),
5605
- digital_input_2_uptime: d.slice(12, 16).reduce(msbLsb),
5606
- digital_input_3_counter: d.slice(16, 20).reduce(msbLsb),
5607
- digital_input_3_uptime: d.slice(20, 24).reduce(msbLsb),
5698
+ digital_input_counter: d.slice(0, 4).reduce(msbLsb),
5699
+ digital_input_uptime: d.slice(4, 8).reduce(msbLsb),
5700
+ ct_input_counter: d.slice(8, 12).reduce(msbLsb),
5701
+ ct_input_uptime: d.slice(12, 16).reduce(msbLsb),
5702
+ opto_input_counter: d.slice(16, 20).reduce(msbLsb),
5703
+ opto_input_uptime: d.slice(20, 24).reduce(msbLsb),
5608
5704
  accelerometer_counter: d.slice(24, 28).reduce(msbLsb),
5609
5705
  accelerometer_uptime: d.slice(28, 32).reduce(msbLsb),
5610
5706
  magnetometer_counter: d.slice(32, 36).reduce(msbLsb),
@@ -9220,27 +9316,199 @@ function sensor_types(parent){
9220
9316
  },
9221
9317
  '531': {
9222
9318
  name: 'Custom Noise Sensor',
9223
- parse: (d, p) => {
9224
- let firmware = p[1];
9225
- if(firmware > 1){
9226
- return {
9227
- rms_dba: d[0],
9228
- c1_dba: d[1],
9229
- c1_freq: d.slice(2, 4).reduce(msbLsb),
9230
- c2_dba: d[4],
9231
- c2_freq: d.slice(5, 7).reduce(msbLsb),
9232
- c3_dba: d[7],
9233
- c3_freq: d.slice(8, 10).reduce(msbLsb),
9234
- };
9319
+ parse: (payload, parsed, mac) => {
9320
+ // TODO error byte is not supported at this time and the below code is utilizing a not yet implemented emitter.
9321
+ // if(payload[7] >> 1 != 0){
9322
+ // parsed.error = {
9323
+ // code: 2000080,
9324
+ // text: 'Sensor Probe may be unattached',
9325
+ // probe: 1
9326
+ // };
9327
+ // parsed.addr = mac;
9328
+ // parsed.data = {error: 'Error found, Sensor Probe may be unattached'};
9329
+ // parent._emitter.emit('ncd_error', parsed);
9330
+ // parent._emitter.emit('ncd_error-'+parsed.sensor_type, parsed);
9331
+ // parent._emitter.emit('ncd_error-'+mac, parsed);
9332
+ // // Delete the error so it matches older messages.
9333
+ // delete parsed.error;
9334
+ // return parsed;
9335
+ // }
9336
+
9337
+ // If time series data
9338
+ if(payload[8] === 1){
9339
+ var deviceAddr = mac;
9340
+ var firmware = payload[1];
9341
+ var expected_packets = payload[10];
9342
+ var current_packet = payload[11];
9343
+ var sdata_start = 12;
9344
+ var sample_rate = payload[9];
9345
+ // console.log('current_packet');
9346
+ // console.log(current_packet);
9347
+
9348
+ // Make sure its instantiated to simplify following if checks
9349
+ if(!Object.hasOwn(globalDevices, deviceAddr)){
9350
+ globalDevices[deviceAddr] = {};
9351
+ }
9352
+ // Check if new stream is from new message
9353
+ if(Object.hasOwn(globalDevices[deviceAddr], 'err_msg_counter_val') && globalDevices[deviceAddr].err_msg_counter_val != parsed.counter){
9354
+ delete globalDevices[deviceAddr].err_msg_counter_val;
9355
+ }
9356
+
9357
+ // USE THESE TO TEST ERRORS
9358
+ // if(current_packet == 1){
9359
+ // // Test missing first packet or not having a globalDevices[deviceAddr].data
9360
+ // return;
9361
+ // }
9362
+ // if(current_packet == 2){
9363
+ // // Test missing packet mid-stream
9364
+ // return;
9365
+ // }
9366
+ // if(current_packet == expected_packets){
9367
+ // // Test missing last section of stream
9368
+ // return;
9369
+ // }
9370
+ // data object exists and current packet already exists in that object or if data object exists and previous packet not in data
9371
+ // This section checks if for duplicate packets already in data
9372
+ // Object.hasOwn(globalDevices, deviceAddr) && Object.hasOwn(globalDevices[deviceAddr], 'data') && current_packet in globalDevices[deviceAddr].data
9373
+ // This section checks if the previous expected packet is in the data or note
9374
+ // Object.hasOwn(globalDevices, deviceAddr) && Object.hasOwn(globalDevices[deviceAddr], 'data') && !(((current_packet&127)-1) in globalDevices[deviceAddr].data
9375
+ // This section check if data does and if current_packet is not 1. This indicates the data started mid stream
9376
+ // !Object.hasOwn(globalDevices[deviceAddr], 'data') && current_packet != 1
9377
+ if(Object.hasOwn(globalDevices[deviceAddr], 'data') && current_packet in globalDevices[deviceAddr].data || Object.hasOwn(globalDevices[deviceAddr], 'data') && !(((current_packet&127)-1) in globalDevices[deviceAddr].data) || !Object.hasOwn(globalDevices[deviceAddr], 'data') && current_packet != 1){
9378
+ // if(!Object.hasOwn(globalDevices[deviceAddr], 'err_msg_counter_val')){
9379
+ // globalDevices[deviceAddr].err_msg_counter_val = parsed.counter;
9380
+ // }
9381
+ // If Data exists that means we're mid packet and an error occured.
9382
+ if(Object.hasOwn(globalDevices[deviceAddr], 'data')){
9383
+ // console.log('-----');
9384
+ // console.log(deviceAddr+': bad packet breakdown deleting stream');
9385
+ // console.log(current_packet);
9386
+ // console.log(expected_packets);
9387
+ // console.log(current_packet in globalDevices[deviceAddr].data);
9388
+ // console.log(current_packet == 1);
9389
+ // console.log(!((current_packet-1) in globalDevices[deviceAddr].data));
9390
+ delete globalDevices[deviceAddr].data;
9391
+ }
9392
+ // If we have not already reported an error
9393
+ if(!Object.hasOwn(globalDevices[deviceAddr], 'err_msg_counter_val')){
9394
+ globalDevices[deviceAddr].err_msg_counter_val = parsed.counter;
9395
+ if(Object.hasOwn(globalDevices[deviceAddr], 'stream_timeout')){
9396
+ clearTimeout(globalDevices[deviceAddr].stream_timeout);
9397
+ delete globalDevices[deviceAddr].stream_timeout;
9398
+ }
9399
+ parsed.error = {
9400
+ code: 1000080,
9401
+ text: 'Faulty multi-packet stream detected',
9402
+ probe: 1
9403
+ }
9404
+ parsed.addr = mac;
9405
+ // TODO remove console with emitter
9406
+ console.log(parsed);
9407
+ // parent._emitter.emit('ncd_error', parsed);
9408
+ // parent._emitter.emit('ncd_error-'+parsed.sensor_type, parsed);
9409
+ // parent._emitter.emit('ncd_error-'+mac, parsed);
9410
+ }
9411
+ }
9412
+ // If first packet
9413
+ if(current_packet == 1){
9414
+ var mode = payload[8];
9415
+
9416
+ // First packet so errors should be invalidated commented out as may not be necessary because we're redefining globalDevices
9417
+ // if(!Object.hasOwn(globalDevices[deviceAddr], 'err_msg_counter_val')){
9418
+ // delete globalDevices[deviceAddr].err_msg_counter_val;
9419
+ // }
9420
+ if(Object.hasOwn(globalDevices[deviceAddr], 'stream_timeout')){
9421
+ clearTimeout(globalDevices[deviceAddr].stream_timeout);
9422
+ delete globalDevices[deviceAddr].stream_timeout;
9423
+ }
9424
+ globalDevices[deviceAddr] = {
9425
+ // stream_size: expected_packets,
9426
+ data: {},
9427
+ sample_rate: sample_rate,
9428
+ mo: mode,
9429
+ }
9430
+ // This timeout is useful for the reception of the first packet, but comms cut afterward
9431
+ if(expected_packets != 1){
9432
+ globalDevices[deviceAddr].stream_timeout = setTimeout(() => {
9433
+ if(Object.hasOwn(globalDevices[deviceAddr], 'data')){
9434
+ delete globalDevices[deviceAddr].data;
9435
+ }
9436
+ parsed.error = {
9437
+ code: 1100080,
9438
+ text: 'Multi-Packet Stream started, but timed out',
9439
+ probe: 1
9440
+ }
9441
+ parsed.addr = mac;
9442
+ // TODO remove console with emitter
9443
+ console.log(parsed);
9444
+ // parent._emitter.emit('ncd_error', parsed);
9445
+ // parent._emitter.emit('ncd_error-'+parsed.sensor_type, parsed);
9446
+ // parent._emitter.emit('ncd_error-'+mac, parsed);
9447
+ }, 30000);
9448
+ };
9449
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
9450
+ }else if(Object.hasOwn(globalDevices[deviceAddr], 'data')){
9451
+ // Not first packet and no error detected, append to data array
9452
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
9453
+ }
9454
+
9455
+ if(Object.hasOwn(globalDevices[deviceAddr], 'data') && Object.keys(globalDevices[deviceAddr].data).length == expected_packets && !Object.hasOwn(globalDevices[deviceAddr], 'err_msg_counter_val')){
9456
+ var raw_data = new Array();
9457
+ for(const packet in globalDevices[deviceAddr].data){
9458
+ raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
9459
+ }
9460
+ var label = 0;
9461
+
9462
+ var data_concat = {};
9463
+
9464
+ for(var i = 0; i < raw_data.length; i+=2){
9465
+ label++;
9466
+
9467
+ data_concat[label] = (raw_data[i]<<8)+(raw_data[i+1]);
9468
+ // data_concat[label] = parseFloat((signInt(((raw_data[i]<<8)+(raw_data[i+1])), 16)).toFixed(3));
9469
+ }
9470
+ var data_concat_obj = {
9471
+ // mac_address: deviceAddr,
9472
+ sample_rate: globalDevices[deviceAddr].sample_rate,
9473
+ data: data_concat
9474
+ };
9475
+ sensor_data = data_concat_obj;
9476
+
9477
+ // Clear stream timeout to prevent timeout error message from triggering
9478
+ if(Object.hasOwn(globalDevices[deviceAddr], 'stream_timeout')){
9479
+ clearTimeout(globalDevices[deviceAddr].stream_timeout);
9480
+ }
9481
+ delete globalDevices[deviceAddr];
9482
+ return sensor_data;
9483
+ }
9484
+ else{
9485
+ return;
9486
+ }
9487
+
9235
9488
  }else{
9236
- return {
9237
- noise_db: d[0],
9238
- peak_freq_1: d.slice(1, 3).reduce(msbLsb),
9239
- peak_freq_2: d.slice(3, 5).reduce(msbLsb),
9240
- peak_freq_3: d.slice(5, 7).reduce(msbLsb)
9489
+ let firmware = payload[1];
9490
+ if(firmware > 1){
9491
+ return {
9492
+ mode: payload[8],
9493
+ sample_rate: payload[9],
9494
+ rms_dba: payload[10],
9495
+ c1_dba: payload[11],
9496
+ c1_freq: payload.slice(12, 14).reduce(msbLsb),
9497
+ c2_dba: payload[14],
9498
+ c2_freq: payload.slice(15, 17).reduce(msbLsb),
9499
+ c3_dba: payload[17],
9500
+ c3_freq: payload.slice(18, 20).reduce(msbLsb),
9501
+ };
9502
+ }else{
9503
+ return {
9504
+ noise_db: payload[8],
9505
+ peak_freq_1: payload.slice(9, 11).reduce(msbLsb),
9506
+ peak_freq_2: payload.slice(11, 13).reduce(msbLsb),
9507
+ peak_freq_3: payload.slice(13, 15).reduce(msbLsb)
9508
+ };
9241
9509
  };
9242
- }
9243
- }
9510
+ };
9511
+ },
9244
9512
  },
9245
9513
  '535': {
9246
9514
  name: 'Custom Wireless CO2 Gas Sensor',
@@ -10479,12 +10747,16 @@ function sensor_types(parent){
10479
10747
  return {
10480
10748
  subdevice_type: d[0],
10481
10749
  number_of_registers: d[1],
10750
+ status_24_31: d[2],
10751
+ status_16_23: d[3],
10752
+ status_8_15: d[4],
10753
+ status_0_7: d[5],
10482
10754
  // TODO we can automatically determine how many registers are here based on the number_of_registers and create data objects appropriately
10483
10755
  // r1: d.slice(2,4),
10484
10756
  // r2: d.slice(4,6),
10485
10757
  // r3: d.slice(6,8),
10486
10758
  // r4: d.slice(8,10),
10487
- data: d.slice(2)
10759
+ data: d.slice(6)
10488
10760
  };
10489
10761
  },
10490
10762
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ncd-io/node-red-enterprise-sensors",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {