@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.
- package/examples/Type 108 - Machine Uptime Monitoring Sensor/Quick Start Dashboard.json +653 -783
- package/lib/WirelessGateway.js +306 -34
- package/package.json +1 -1
- package/wireless.html +172 -20
- package/wireless.js +19 -2
- package/examples/Type 108 - Machine Uptime Monitoring Sensor/Dashboard.json +0 -1146
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,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
|
-
|
|
1311
|
-
console.log('
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
-
|
|
5603
|
-
|
|
5604
|
-
|
|
5605
|
-
|
|
5606
|
-
|
|
5607
|
-
|
|
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: (
|
|
9224
|
-
|
|
9225
|
-
if(
|
|
9226
|
-
|
|
9227
|
-
|
|
9228
|
-
|
|
9229
|
-
|
|
9230
|
-
|
|
9231
|
-
|
|
9232
|
-
|
|
9233
|
-
|
|
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
|
-
|
|
9237
|
-
|
|
9238
|
-
|
|
9239
|
-
|
|
9240
|
-
|
|
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(
|
|
10759
|
+
data: d.slice(6)
|
|
10488
10760
|
};
|
|
10489
10761
|
},
|
|
10490
10762
|
},
|