@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.
- package/lib/WirelessGateway.js +402 -32
- package/package.json +1 -1
- package/wireless.html +568 -48
- package/wireless.js +115 -2
package/lib/WirelessGateway.js
CHANGED
|
@@ -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
|
-
|
|
1311
|
-
console.log('
|
|
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: (
|
|
2335
|
-
|
|
2336
|
-
|
|
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: (
|
|
9247
|
-
|
|
9248
|
-
if(
|
|
9249
|
-
|
|
9250
|
-
|
|
9251
|
-
|
|
9252
|
-
|
|
9253
|
-
|
|
9254
|
-
|
|
9255
|
-
|
|
9256
|
-
|
|
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
|
-
|
|
9260
|
-
|
|
9261
|
-
|
|
9262
|
-
|
|
9263
|
-
|
|
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(
|
|
10880
|
+
data: d.slice(6)
|
|
10511
10881
|
};
|
|
10512
10882
|
},
|
|
10513
10883
|
},
|