@ncd-io/node-red-enterprise-sensors 1.0.5 → 1.0.7

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,33,39,45,48,52,58,74,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,33,39,45,48,52,58,74,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 == 33 || 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;
@@ -795,11 +795,26 @@ module.exports = class WirelessSensor{
795
795
  return this.config_send(sensor_mac, packet);
796
796
  }
797
797
  config_set_change_detection(sensor_mac, enabled, perc, interval){
798
+ console.log('config_set_change_detection_ch1');
798
799
  if(!perc) perc = 0;
799
800
  if(!interval) interval = 0;
800
801
  var packet = [247, 7, 0, 0, 0, enabled, perc, interval >> 16, (interval >> 8) & 255, interval & 255];
801
802
  return this.config_send(sensor_mac, packet);
802
803
  }
804
+ config_set_change_detection_ch2(sensor_mac, enabled, perc, interval){
805
+ console.log('config_set_change_detection_ch2');
806
+ if(!perc) perc = 0;
807
+ if(!interval) interval = 0;
808
+ var packet = [247, 8, 0, 0, 0, enabled, perc, interval >> 16, (interval >> 8) & 255, interval & 255];
809
+ return this.config_send(sensor_mac, packet);
810
+ }
811
+ config_set_change_detection_ch3(sensor_mac, enabled, perc, interval){
812
+ console.log('config_set_change_detection_ch3');
813
+ if(!perc) perc = 0;
814
+ if(!interval) interval = 0;
815
+ var packet = [247, 9, 0, 0, 0, enabled, perc, interval >> 16, (interval >> 8) & 255, interval & 255];
816
+ return this.config_send(sensor_mac, packet);
817
+ }
803
818
  config_set_bp_altitude(sensor_mac, alt){
804
819
  var packet = [244, 1, 0, 0, 0, alt >> 8, alt & 255];
805
820
  return this.config_send(sensor_mac, packet);
@@ -1219,6 +1234,12 @@ module.exports = class WirelessSensor{
1219
1234
  console.log(packet);
1220
1235
  return this.config_send(sensor_mac, packet);
1221
1236
  }
1237
+ config_set_push_notification_108(sensor_mac, value){
1238
+ console.log('config_set_push_notification_108');
1239
+ var packet = [244, 45, 0, 0, 0, value];
1240
+ console.log(packet);
1241
+ return this.config_send(sensor_mac, packet);
1242
+ }
1222
1243
  config_set_sensor_boot_time_420ma(sensor_mac, value){
1223
1244
  console.log('sensor_boot_time_420ma');
1224
1245
  var packet = [244, 68, 0, 0, 45, value];
@@ -1307,8 +1328,8 @@ module.exports = class WirelessSensor{
1307
1328
  console.log(packet);
1308
1329
  return this.config_send(sensor_mac, packet);
1309
1330
  }
1310
- config_enable_stay_on_mode_539(sensor_mac, value){
1311
- console.log('config_enable_stay_on_mode_539');
1331
+ config_set_stay_on_mode_539(sensor_mac, value){
1332
+ console.log('config_set_stay_on_mode_539');
1312
1333
  var packet = [247, 50, 0, 0, 0, value];
1313
1334
  console.log(packet);
1314
1335
  return this.config_send(sensor_mac, packet);
@@ -1371,6 +1392,18 @@ module.exports = class WirelessSensor{
1371
1392
  console.log(packet);
1372
1393
  return this.config_send(sensor_mac, packet);
1373
1394
  }
1395
+ config_set_number_of_read_retries_539(sensor_mac, value){
1396
+ console.log('config_set_number_of_read_retries_539');
1397
+ var packet = [244, 55, 0, 0, 23, value];
1398
+ console.log(packet);
1399
+ return this.config_send(sensor_mac, packet);
1400
+ }
1401
+ config_set_read_parameter_539(sensor_mac, value){
1402
+ console.log('config_set_read_parameter_539');
1403
+ var packet = [244, 57, 0, 0, 23, value];
1404
+ console.log(packet);
1405
+ return this.config_send(sensor_mac, packet);
1406
+ }
1374
1407
  config_set_auto_raw_interval_110(sensor_mac, value){
1375
1408
  console.log('config_set_raw_interval_110');
1376
1409
  var packet = [244, 79, 0, 0, 80, 76, value];
@@ -1407,7 +1440,6 @@ module.exports = class WirelessSensor{
1407
1440
  }
1408
1441
  config_set_current_calibration_13(sensor_mac, calib){
1409
1442
  console.log('config_set_current_calibration_13');
1410
- calib = calib * 100;
1411
1443
  var packet = [244, 1, 0, 0, 0];
1412
1444
  var cal_val = int2Bytes(calib, 4);
1413
1445
  packet.push(...cal_val);
@@ -1416,7 +1448,6 @@ module.exports = class WirelessSensor{
1416
1448
  }
1417
1449
  config_set_current_calibration_ch2_19(sensor_mac, calib){
1418
1450
  console.log('config_set_current_calibration_ch2_19');
1419
- calib = calib * 100;
1420
1451
  var packet = [244, 3, 0, 0, 0];
1421
1452
  var cal_val = int2Bytes(calib, 4);
1422
1453
  packet.push(...cal_val);
@@ -1425,13 +1456,36 @@ module.exports = class WirelessSensor{
1425
1456
  }
1426
1457
  config_set_current_calibration_ch3_28(sensor_mac, calib){
1427
1458
  console.log('cconfig_set_current_calibration_ch3_28');
1428
- calib = calib * 100;
1429
1459
  var packet = [244, 5, 0, 0, 0];
1430
1460
  var cal_val = int2Bytes(calib, 4);
1431
1461
  packet.push(...cal_val);
1432
1462
  console.log(packet);
1433
1463
  return this.config_send(sensor_mac, packet);
1434
1464
  }
1465
+ config_set_current_calibration_13_dep(sensor_mac, calib){
1466
+ console.log('config_set_current_calibration_13_dep');
1467
+ var packet = [244, 1, 0, 0, 0];
1468
+ var cal_val = int2Bytes(calib, 2);
1469
+ packet.push(...cal_val);
1470
+ console.log(packet);
1471
+ return this.config_send(sensor_mac, packet);
1472
+ }
1473
+ config_set_current_calibration_ch2_19_dep(sensor_mac, calib){
1474
+ console.log('config_set_current_calibration_ch2_19_dep');
1475
+ var packet = [244, 3, 0, 0, 0];
1476
+ var cal_val = int2Bytes(calib, 2);
1477
+ packet.push(...cal_val);
1478
+ console.log(packet);
1479
+ return this.config_send(sensor_mac, packet);
1480
+ }
1481
+ config_set_current_calibration_ch3_28_dep(sensor_mac, calib){
1482
+ console.log('cconfig_set_current_calibration_ch3_28_dep');
1483
+ var packet = [244, 5, 0, 0, 0];
1484
+ var cal_val = int2Bytes(calib, 2);
1485
+ packet.push(...cal_val);
1486
+ console.log(packet);
1487
+ return this.config_send(sensor_mac, packet);
1488
+ }
1435
1489
  config_set_rx485_timeout_1011(sensor_mac, value){
1436
1490
  console.log('config_set_Rx485_timeout_1011');
1437
1491
  var packet = [244, 48, 0, 0, 23, value];
@@ -1452,6 +1506,63 @@ module.exports = class WirelessSensor{
1452
1506
  console.log(packet);
1453
1507
  return this.config_send(sensor_mac, packet);
1454
1508
  }
1509
+ config_set_stop_bit_1011(sensor_mac, value){
1510
+ console.log('config_set_stop_bit_1011');
1511
+ var packet = [244, 34, 0, 0, 23, value];
1512
+ console.log(packet);
1513
+ return this.config_send(sensor_mac, packet);
1514
+ }
1515
+ config_set_parity_1011(sensor_mac, value){
1516
+ console.log('config_set_parity_1011');
1517
+ var packet = [244, 33, 0, 0, 23, value];
1518
+ console.log(packet);
1519
+ return this.config_send(sensor_mac, packet);
1520
+ }
1521
+ config_set_reboot_1011(sensor_mac){
1522
+ console.log('config_set_reboot_1011');
1523
+ var packet = [247, 64, 0, 0, 0, 5, 22, 23];
1524
+ console.log(packet);
1525
+ return this.config_send(sensor_mac, packet);
1526
+ }
1527
+ config_set_operation_mode_531(sensor_mac, mode){
1528
+ console.log('config_set_operation_mode_531');
1529
+ console.log(mode);
1530
+ var packet = [244, 32, 0, 0, 0, mode];
1531
+ console.log(packet);
1532
+ return this.config_send(sensor_mac, packet);
1533
+ }
1534
+ config_set_calibration_58(sensor_mac){
1535
+ console.log('config_set_calibration_58');
1536
+ var packet = [244, 32, 0, 0, 23];
1537
+ console.log(packet);
1538
+ return this.config_send(sensor_mac, packet);
1539
+ }
1540
+ config_set_factory_reset_tank_probe_58(sensor_mac){
1541
+ console.log('config_set_factory_reset_tank_probe_58');
1542
+ var packet = [244, 33, 0, 0, 23];
1543
+ console.log(packet);
1544
+ return this.config_send(sensor_mac, packet);
1545
+ }
1546
+ config_set_max_range_58(sensor_mac, value){
1547
+ console.log('config_set_max_range_58');
1548
+ var packet = [244, 34, 0, 0, 23, 39, 16];
1549
+ var max = int2Bytes(value, 2);
1550
+ packet.push(...max);
1551
+ console.log(packet);
1552
+ return this.config_send(sensor_mac, packet);
1553
+ }
1554
+ config_set_clear_counter_33(sensor_mac){
1555
+ console.log('config_clear_counter_33');
1556
+ var packet = [244, 36, 0, 0, 0, 31];
1557
+ console.log(packet);
1558
+ return this.config_send(sensor_mac, packet);
1559
+ }
1560
+ config_set_push_notification_33(sensor_mac, value){
1561
+ console.log('config_set_push_notification_33');
1562
+ var packet = [244, 45, 0, 0, 0, value];
1563
+ console.log(packet);
1564
+ return this.config_send(sensor_mac, packet);
1565
+ }
1455
1566
  config_get_delay(sensor_mac){
1456
1567
  return new Promise((fulfill, reject) => {
1457
1568
  this.config_send(sensor_mac, [247, 21, 0, 0, 0]).then((res) => {
@@ -2331,9 +2442,18 @@ function sensor_types(parent){
2331
2442
  },
2332
2443
  '33': {
2333
2444
  name: 'AC Current Detect Sensor',
2334
- parse: (d) => {
2335
- return {
2336
- input_1: d[0]
2445
+ parse: (payload, parsed, mac) => {
2446
+ if(parsed.firmware > 3){
2447
+ return {
2448
+ input_1: payload[8],
2449
+ current_detect: payload[9],
2450
+ total_uptime: payload.slice(10, 14).reduce(msbLsb),
2451
+ total_cycle_count: payload.slice(14, 18).reduce(msbLsb)
2452
+ };
2453
+ }else{
2454
+ return {
2455
+ input_1: payload[8]
2456
+ };
2337
2457
  };
2338
2458
  }
2339
2459
  },
@@ -2559,6 +2679,44 @@ function sensor_types(parent){
2559
2679
  byteThree: d[2],
2560
2680
  byteFour: d[3]
2561
2681
  };
2682
+ },
2683
+ 'parse_fly': (frame) => {
2684
+ let frame_data = {};
2685
+ switch(frame[16]){
2686
+ case 0:
2687
+ frame_data.fsr = "+-0.256 V";
2688
+ break;
2689
+ case 1:
2690
+ frame_data.fsr = "+-0.512 V";
2691
+ break;
2692
+ case 2:
2693
+ frame_data.fsr = "+-1.024 V";
2694
+ break;
2695
+ case 3:
2696
+ frame_data.fsr = "+-2.048 V";
2697
+ break;
2698
+ case 4:
2699
+ frame_data.fsr = "+-4.096 V";
2700
+ break;
2701
+ case 5:
2702
+ frame_data.fsr = "+-6.144 V";
2703
+ break;
2704
+ }
2705
+ return {
2706
+ 'firmware': frame[2],
2707
+ 'report_rate': frame.slice(12, 16).reduce(msbLsb),
2708
+ 'fsr':frame_data.fsr,
2709
+ 'boot_up_time': frame[17],
2710
+ 'adc_pin_reading': frame.slice(18, 20).reduce(msbLsb),
2711
+ 'machine_values': {
2712
+ 'firmware': frame[2],
2713
+ 'report_rate': frame.slice(12, 16),
2714
+ 'fsr':frame[16],
2715
+ 'boot_up_time': frame[17],
2716
+ 'adc_pin_reading': frame.slice(18, 20),
2717
+ 'frame': frame
2718
+ }
2719
+ }
2562
2720
  }
2563
2721
  },
2564
2722
  '53': {
@@ -2609,6 +2767,23 @@ function sensor_types(parent){
2609
2767
  };
2610
2768
  }
2611
2769
  },
2770
+ '58': {
2771
+ name: 'Tank Level v3',
2772
+ parse: (d) => {
2773
+ return {
2774
+ filtered_range: d.slice(0, 2).reduce(msbLsb),
2775
+ long_range_algorithm: d.slice(2, 4).reduce(msbLsb),
2776
+ second_chance: d.slice(4, 6).reduce(msbLsb),
2777
+ second_reading: d.slice(6, 8).reduce(msbLsb),
2778
+ compare_reading: d.slice(8, 10).reduce(msbLsb),
2779
+ short_range_algorithm: d.slice(10, 12).reduce(msbLsb),
2780
+ trusted_reading: d.slice(12, 14).reduce(msbLsb),
2781
+ final_filter: d.slice(14, 16).reduce(msbLsb),
2782
+ raw_final: d.slice(16, 18).reduce(msbLsb),
2783
+ final_index: d.slice(18, 20).reduce(msbLsb),
2784
+ };
2785
+ }
2786
+ },
2612
2787
  '60': {
2613
2788
  name: 'Air Velocity and Precision Pressure & Temperature Sensor',
2614
2789
  parse: (d) => {
@@ -2740,6 +2915,22 @@ function sensor_types(parent){
2740
2915
  };
2741
2916
  }
2742
2917
  },
2918
+ '74': {
2919
+ name: 'Wireless Temp Humidity Pressure Air quality Sensor',
2920
+ parse: (d) => {
2921
+ return {
2922
+ temperature: signInt(d.slice(0, 2).reduce(msbLsb), 16) *100,
2923
+ pressure: d.slice(2, 6).reduce(msbLsb) * 100,
2924
+ humidity: d.slice(6, 10).reduce(msbLsb) * 1000,
2925
+ resistance: d.slice(10, 14).reduce(msbLsb),
2926
+ iaq: d.slice(14, 16).reduce(msbLsb),
2927
+ co2_eqv: d.slice(16, 18).reduce(msbLsb),
2928
+ breath_voc: d.slice(18, 22).reduce(msbLsb)* 100,
2929
+ static_iaq: d.slice(22, 26).reduce(msbLsb)* 100,
2930
+ iaq_accuracy: d[27]
2931
+ };
2932
+ }
2933
+ },
2743
2934
  '75': {
2744
2935
  name: 'Siemens Air Velocity Probe',
2745
2936
  parse: (d) => {
@@ -4221,6 +4412,7 @@ function sensor_types(parent){
4221
4412
  'destination_address': toMac(frame.slice(12, 16)),
4222
4413
  'mode': frame_data.mode,
4223
4414
  'odr_1': frame_data.odr_1+'Hz',
4415
+ 'odr_2': frame_data.odr_2+'Hz',
4224
4416
  'sampling_duration_1': frame_data.sampling_duration_1,
4225
4417
  'sampling_duration_2': frame_data.sampling_duration_2,
4226
4418
  'filter_status': frame_data.filter_status,
@@ -4241,6 +4433,7 @@ function sensor_types(parent){
4241
4433
  'destination_address': toMac(frame.slice(12, 16), false),
4242
4434
  'mode': frame[16],
4243
4435
  'odr_1': frame[17],
4436
+ 'odr_2': frame[18],
4244
4437
  'sampling_duration_1': frame[19],
4245
4438
  'sampling_duration_2': frame[20],
4246
4439
  'filter_status': frame[21],
@@ -5631,7 +5824,8 @@ function sensor_types(parent){
5631
5824
  accelerometer_counter: d.slice(24, 28).reduce(msbLsb),
5632
5825
  accelerometer_uptime: d.slice(28, 32).reduce(msbLsb),
5633
5826
  magnetometer_counter: d.slice(32, 36).reduce(msbLsb),
5634
- magnetometer_uptime: d.slice(36, 40).reduce(msbLsb)
5827
+ magnetometer_uptime: d.slice(36, 40).reduce(msbLsb),
5828
+ io_states: d[40]
5635
5829
  };
5636
5830
  }
5637
5831
  },
@@ -9243,27 +9437,199 @@ function sensor_types(parent){
9243
9437
  },
9244
9438
  '531': {
9245
9439
  name: 'Custom Noise Sensor',
9246
- parse: (d, p) => {
9247
- let firmware = p[1];
9248
- if(firmware > 1){
9249
- return {
9250
- rms_dba: d[0],
9251
- c1_dba: d[1],
9252
- c1_freq: d.slice(2, 4).reduce(msbLsb),
9253
- c2_dba: d[4],
9254
- c2_freq: d.slice(5, 7).reduce(msbLsb),
9255
- c3_dba: d[7],
9256
- c3_freq: d.slice(8, 10).reduce(msbLsb),
9257
- };
9440
+ parse: (payload, parsed, mac) => {
9441
+ // TODO error byte is not supported at this time and the below code is utilizing a not yet implemented emitter.
9442
+ // if(payload[7] >> 1 != 0){
9443
+ // parsed.error = {
9444
+ // code: 2000080,
9445
+ // text: 'Sensor Probe may be unattached',
9446
+ // probe: 1
9447
+ // };
9448
+ // parsed.addr = mac;
9449
+ // parsed.data = {error: 'Error found, Sensor Probe may be unattached'};
9450
+ // parent._emitter.emit('ncd_error', parsed);
9451
+ // parent._emitter.emit('ncd_error-'+parsed.sensor_type, parsed);
9452
+ // parent._emitter.emit('ncd_error-'+mac, parsed);
9453
+ // // Delete the error so it matches older messages.
9454
+ // delete parsed.error;
9455
+ // return parsed;
9456
+ // }
9457
+
9458
+ // If time series data
9459
+ if(payload[8] === 1){
9460
+ var deviceAddr = mac;
9461
+ var firmware = payload[1];
9462
+ var expected_packets = payload[10];
9463
+ var current_packet = payload[11];
9464
+ var sdata_start = 12;
9465
+ var sample_rate = payload[9];
9466
+ // console.log('current_packet');
9467
+ // console.log(current_packet);
9468
+
9469
+ // Make sure its instantiated to simplify following if checks
9470
+ if(!Object.hasOwn(globalDevices, deviceAddr)){
9471
+ globalDevices[deviceAddr] = {};
9472
+ }
9473
+ // Check if new stream is from new message
9474
+ if(Object.hasOwn(globalDevices[deviceAddr], 'err_msg_counter_val') && globalDevices[deviceAddr].err_msg_counter_val != parsed.counter){
9475
+ delete globalDevices[deviceAddr].err_msg_counter_val;
9476
+ }
9477
+
9478
+ // USE THESE TO TEST ERRORS
9479
+ // if(current_packet == 1){
9480
+ // // Test missing first packet or not having a globalDevices[deviceAddr].data
9481
+ // return;
9482
+ // }
9483
+ // if(current_packet == 2){
9484
+ // // Test missing packet mid-stream
9485
+ // return;
9486
+ // }
9487
+ // if(current_packet == expected_packets){
9488
+ // // Test missing last section of stream
9489
+ // return;
9490
+ // }
9491
+ // data object exists and current packet already exists in that object or if data object exists and previous packet not in data
9492
+ // This section checks if for duplicate packets already in data
9493
+ // Object.hasOwn(globalDevices, deviceAddr) && Object.hasOwn(globalDevices[deviceAddr], 'data') && current_packet in globalDevices[deviceAddr].data
9494
+ // This section checks if the previous expected packet is in the data or note
9495
+ // Object.hasOwn(globalDevices, deviceAddr) && Object.hasOwn(globalDevices[deviceAddr], 'data') && !(((current_packet&127)-1) in globalDevices[deviceAddr].data
9496
+ // This section check if data does and if current_packet is not 1. This indicates the data started mid stream
9497
+ // !Object.hasOwn(globalDevices[deviceAddr], 'data') && current_packet != 1
9498
+ 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){
9499
+ // if(!Object.hasOwn(globalDevices[deviceAddr], 'err_msg_counter_val')){
9500
+ // globalDevices[deviceAddr].err_msg_counter_val = parsed.counter;
9501
+ // }
9502
+ // If Data exists that means we're mid packet and an error occured.
9503
+ if(Object.hasOwn(globalDevices[deviceAddr], 'data')){
9504
+ // console.log('-----');
9505
+ // console.log(deviceAddr+': bad packet breakdown deleting stream');
9506
+ // console.log(current_packet);
9507
+ // console.log(expected_packets);
9508
+ // console.log(current_packet in globalDevices[deviceAddr].data);
9509
+ // console.log(current_packet == 1);
9510
+ // console.log(!((current_packet-1) in globalDevices[deviceAddr].data));
9511
+ delete globalDevices[deviceAddr].data;
9512
+ }
9513
+ // If we have not already reported an error
9514
+ if(!Object.hasOwn(globalDevices[deviceAddr], 'err_msg_counter_val')){
9515
+ globalDevices[deviceAddr].err_msg_counter_val = parsed.counter;
9516
+ if(Object.hasOwn(globalDevices[deviceAddr], 'stream_timeout')){
9517
+ clearTimeout(globalDevices[deviceAddr].stream_timeout);
9518
+ delete globalDevices[deviceAddr].stream_timeout;
9519
+ }
9520
+ parsed.error = {
9521
+ code: 1000080,
9522
+ text: 'Faulty multi-packet stream detected',
9523
+ probe: 1
9524
+ }
9525
+ parsed.addr = mac;
9526
+ // TODO remove console with emitter
9527
+ console.log(parsed);
9528
+ // parent._emitter.emit('ncd_error', parsed);
9529
+ // parent._emitter.emit('ncd_error-'+parsed.sensor_type, parsed);
9530
+ // parent._emitter.emit('ncd_error-'+mac, parsed);
9531
+ }
9532
+ }
9533
+ // If first packet
9534
+ if(current_packet == 1){
9535
+ var mode = payload[8];
9536
+
9537
+ // First packet so errors should be invalidated commented out as may not be necessary because we're redefining globalDevices
9538
+ // if(!Object.hasOwn(globalDevices[deviceAddr], 'err_msg_counter_val')){
9539
+ // delete globalDevices[deviceAddr].err_msg_counter_val;
9540
+ // }
9541
+ if(Object.hasOwn(globalDevices[deviceAddr], 'stream_timeout')){
9542
+ clearTimeout(globalDevices[deviceAddr].stream_timeout);
9543
+ delete globalDevices[deviceAddr].stream_timeout;
9544
+ }
9545
+ globalDevices[deviceAddr] = {
9546
+ // stream_size: expected_packets,
9547
+ data: {},
9548
+ sample_rate: sample_rate,
9549
+ mo: mode,
9550
+ }
9551
+ // This timeout is useful for the reception of the first packet, but comms cut afterward
9552
+ if(expected_packets != 1){
9553
+ globalDevices[deviceAddr].stream_timeout = setTimeout(() => {
9554
+ if(Object.hasOwn(globalDevices[deviceAddr], 'data')){
9555
+ delete globalDevices[deviceAddr].data;
9556
+ }
9557
+ parsed.error = {
9558
+ code: 1100080,
9559
+ text: 'Multi-Packet Stream started, but timed out',
9560
+ probe: 1
9561
+ }
9562
+ parsed.addr = mac;
9563
+ // TODO remove console with emitter
9564
+ console.log(parsed);
9565
+ // parent._emitter.emit('ncd_error', parsed);
9566
+ // parent._emitter.emit('ncd_error-'+parsed.sensor_type, parsed);
9567
+ // parent._emitter.emit('ncd_error-'+mac, parsed);
9568
+ }, 30000);
9569
+ };
9570
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
9571
+ }else if(Object.hasOwn(globalDevices[deviceAddr], 'data')){
9572
+ // Not first packet and no error detected, append to data array
9573
+ globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
9574
+ }
9575
+
9576
+ if(Object.hasOwn(globalDevices[deviceAddr], 'data') && Object.keys(globalDevices[deviceAddr].data).length == expected_packets && !Object.hasOwn(globalDevices[deviceAddr], 'err_msg_counter_val')){
9577
+ var raw_data = new Array();
9578
+ for(const packet in globalDevices[deviceAddr].data){
9579
+ raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
9580
+ }
9581
+ var label = 0;
9582
+
9583
+ var data_concat = {};
9584
+
9585
+ for(var i = 0; i < raw_data.length; i+=2){
9586
+ label++;
9587
+
9588
+ data_concat[label] = (raw_data[i]<<8)+(raw_data[i+1]);
9589
+ // data_concat[label] = parseFloat((signInt(((raw_data[i]<<8)+(raw_data[i+1])), 16)).toFixed(3));
9590
+ }
9591
+ var data_concat_obj = {
9592
+ // mac_address: deviceAddr,
9593
+ sample_rate: globalDevices[deviceAddr].sample_rate,
9594
+ data: data_concat
9595
+ };
9596
+ sensor_data = data_concat_obj;
9597
+
9598
+ // Clear stream timeout to prevent timeout error message from triggering
9599
+ if(Object.hasOwn(globalDevices[deviceAddr], 'stream_timeout')){
9600
+ clearTimeout(globalDevices[deviceAddr].stream_timeout);
9601
+ }
9602
+ delete globalDevices[deviceAddr];
9603
+ return sensor_data;
9604
+ }
9605
+ else{
9606
+ return;
9607
+ }
9608
+
9258
9609
  }else{
9259
- return {
9260
- noise_db: d[0],
9261
- peak_freq_1: d.slice(1, 3).reduce(msbLsb),
9262
- peak_freq_2: d.slice(3, 5).reduce(msbLsb),
9263
- peak_freq_3: d.slice(5, 7).reduce(msbLsb)
9610
+ let firmware = payload[1];
9611
+ if(firmware > 1){
9612
+ return {
9613
+ mode: payload[8],
9614
+ sample_rate: payload[9],
9615
+ rms_dba: payload[10],
9616
+ c1_dba: payload[11],
9617
+ c1_freq: payload.slice(12, 14).reduce(msbLsb),
9618
+ c2_dba: payload[14],
9619
+ c2_freq: payload.slice(15, 17).reduce(msbLsb),
9620
+ c3_dba: payload[17],
9621
+ c3_freq: payload.slice(18, 20).reduce(msbLsb),
9622
+ };
9623
+ }else{
9624
+ return {
9625
+ noise_db: payload[8],
9626
+ peak_freq_1: payload.slice(9, 11).reduce(msbLsb),
9627
+ peak_freq_2: payload.slice(11, 13).reduce(msbLsb),
9628
+ peak_freq_3: payload.slice(13, 15).reduce(msbLsb)
9629
+ };
9264
9630
  };
9265
- }
9266
- }
9631
+ };
9632
+ },
9267
9633
  },
9268
9634
  '535': {
9269
9635
  name: 'Custom Wireless CO2 Gas Sensor',
@@ -10502,12 +10868,16 @@ function sensor_types(parent){
10502
10868
  return {
10503
10869
  subdevice_type: d[0],
10504
10870
  number_of_registers: d[1],
10871
+ status_24_31: d[2],
10872
+ status_16_23: d[3],
10873
+ status_8_15: d[4],
10874
+ status_0_7: d[5],
10505
10875
  // TODO we can automatically determine how many registers are here based on the number_of_registers and create data objects appropriately
10506
10876
  // r1: d.slice(2,4),
10507
10877
  // r2: d.slice(4,6),
10508
10878
  // r3: d.slice(6,8),
10509
10879
  // r4: d.slice(8,10),
10510
- data: d.slice(2)
10880
+ data: d.slice(6)
10511
10881
  };
10512
10882
  },
10513
10883
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ncd-io/node-red-enterprise-sensors",
3
- "version": "1.0.5",
3
+ "version": "1.0.7",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {