@ncd-io/node-red-enterprise-sensors 1.6.1 → 1.6.2
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 +768 -751
- package/package.json +1 -1
- package/wireless.html +138 -7
- package/wireless.js +26 -0
package/lib/WirelessGateway.js
CHANGED
|
@@ -160,7 +160,7 @@ module.exports = class WirelessSensor{
|
|
|
160
160
|
}
|
|
161
161
|
}
|
|
162
162
|
// #OTF
|
|
163
|
-
var otf_devices = [4,12,21,23,26,29,32,33,39,44,45,48,52,53,54,55,56,58,74,76,78,79,80,81,82,84,88,89,90,91,97,98,101,102,103,105,106,107,108,109,110,111,112,114,117,118,119,120,121,122,123,124,180,181,202,217,211,270,519,520,521,531,535,536,537,538,539,540,541,542,543,545,1010,1011];
|
|
163
|
+
var otf_devices = [4,12,21,23,26,29,32,33,39,44,45,48,52,53,54,55,56,58,74,76,78,79,80,81,82,84,88,89,90,91,97,98,99,101,102,103,105,106,107,108,109,110,111,112,114,117,118,119,120,121,122,123,124,180,181,202,217,211,270,519,520,521,531,535,536,537,538,539,540,541,542,543,545,1010,1011];
|
|
164
164
|
var device_type = msbLsb(frame.data[6], frame.data[7]);
|
|
165
165
|
// var device_type = frame.data[7];
|
|
166
166
|
|
|
@@ -361,7 +361,7 @@ module.exports = class WirelessSensor{
|
|
|
361
361
|
};
|
|
362
362
|
|
|
363
363
|
// #OTF
|
|
364
|
-
var otf_devices = [4,12,21,23,26,29,32,33,39,44,45,48,52,53,54,55,56,58,74,76,78,79,80,81,82,84,88,89,90,91,97,98,101,102,103,105,106,107,108,109,110,111,112,114,117,118,119,120,121,122,123,124,180,181,202,211,217,270,519,520,521,531,535,536,537,538,539,540,541,542,543,545,1010,1011];
|
|
364
|
+
var otf_devices = [4,12,21,23,26,29,32,33,39,44,45,48,52,53,54,55,56,58,74,76,78,79,80,81,82,84,88,89,90,91,97,98,99,101,102,103,105,106,107,108,109,110,111,112,114,117,118,119,120,121,122,123,124,180,181,202,211,217,270,519,520,521,531,535,536,537,538,539,540,541,542,543,545,1010,1011];
|
|
365
365
|
if(otf_devices.includes(parsed.sensor_type)){
|
|
366
366
|
// If the message says FLY and there is not FLY timer in progress.
|
|
367
367
|
if(payload[8] == 70 && payload[9] == 76 && payload[10] == 89) {
|
|
@@ -2570,6 +2570,58 @@ module.exports = class WirelessSensor{
|
|
|
2570
2570
|
console.log(packet);
|
|
2571
2571
|
return this.config_send(sensor_mac, packet);
|
|
2572
2572
|
}
|
|
2573
|
+
config_set_screen_on_time_217(sensor_mac, value){
|
|
2574
|
+
console.log('config_set_screen_on_time_217');
|
|
2575
|
+
let packet = [244, 40, 0, 0, 26, value];
|
|
2576
|
+
console.log(packet);
|
|
2577
|
+
return this.config_send(sensor_mac, packet);
|
|
2578
|
+
}
|
|
2579
|
+
config_set_weight_unit_217(sensor_mac, value){
|
|
2580
|
+
console.log('config_set_weight_unit_217');
|
|
2581
|
+
let packet = [244, 38, 0, 0, 26, value];
|
|
2582
|
+
console.log(packet);
|
|
2583
|
+
return this.config_send(sensor_mac, packet);
|
|
2584
|
+
}
|
|
2585
|
+
config_set_clean_cycle_99(sensor_mac, value){
|
|
2586
|
+
console.log('config_set_clean_cycle_99');
|
|
2587
|
+
let packet = [244, 34, 0, 0, 0, value];
|
|
2588
|
+
console.log(packet);
|
|
2589
|
+
return this.config_send(sensor_mac, packet);
|
|
2590
|
+
}
|
|
2591
|
+
config_set_wiper_rounds_number_99(sensor_mac, value){
|
|
2592
|
+
console.log('config_set_wiper_rounds_number_99');
|
|
2593
|
+
let packet = [244, 36, 0, 0, 0, value];
|
|
2594
|
+
console.log(packet);
|
|
2595
|
+
return this.config_send(sensor_mac, packet);
|
|
2596
|
+
}
|
|
2597
|
+
config_set_distance_under_strength_threshold_99(sensor_mac, distance, threshold){
|
|
2598
|
+
console.log('config_set_distance_under_strength_threshold_99');
|
|
2599
|
+
let packet = [244, 25, 0, 0, 0];
|
|
2600
|
+
let distance_ = int2Bytes(distance, 2);
|
|
2601
|
+
packet.push(...distance_);
|
|
2602
|
+
let threshold_ = int2Bytes(threshold, 2);
|
|
2603
|
+
packet.push(...threshold_);
|
|
2604
|
+
console.log(packet);
|
|
2605
|
+
return this.config_send(sensor_mac, packet);
|
|
2606
|
+
}
|
|
2607
|
+
config_set_clean_sensor_99(sensor_mac, value){
|
|
2608
|
+
console.log('config_set_clean_sensor_99');
|
|
2609
|
+
let packet = [244, 40, 0, 0, 0];
|
|
2610
|
+
console.log(packet);
|
|
2611
|
+
return this.config_send(sensor_mac, packet);
|
|
2612
|
+
}
|
|
2613
|
+
config_set_reset_sensor_99(sensor_mac, value){
|
|
2614
|
+
console.log('config_set_reset_sensor_99');
|
|
2615
|
+
let packet = [244, 38, 0, 0, 0];
|
|
2616
|
+
console.log(packet);
|
|
2617
|
+
return this.config_send(sensor_mac, packet);
|
|
2618
|
+
}
|
|
2619
|
+
config_set_factory_reset_sensor_99(sensor_mac, value){
|
|
2620
|
+
console.log('config_set_factory_reset_sensor_99');
|
|
2621
|
+
let packet = [244, 39, 0, 0, 0];
|
|
2622
|
+
console.log(packet);
|
|
2623
|
+
return this.config_send(sensor_mac, packet);
|
|
2624
|
+
}
|
|
2573
2625
|
config_get_delay(sensor_mac){
|
|
2574
2626
|
return new Promise((fulfill, reject) => {
|
|
2575
2627
|
this.config_send(sensor_mac, [247, 21, 0, 0, 0]).then((res) => {
|
|
@@ -8524,6 +8576,28 @@ function sensor_types(parent){
|
|
|
8524
8576
|
}
|
|
8525
8577
|
}
|
|
8526
8578
|
},
|
|
8579
|
+
'99': {
|
|
8580
|
+
name: 'Laser Sensor',
|
|
8581
|
+
parse: (d) => {
|
|
8582
|
+
return {
|
|
8583
|
+
distance: d.slice(0, 2).reduce(msbLsb)
|
|
8584
|
+
};
|
|
8585
|
+
},
|
|
8586
|
+
'parse_fly': (frame) => {
|
|
8587
|
+
return {
|
|
8588
|
+
'firmware': frame[2],
|
|
8589
|
+
'hardware_id': frame.slice(12, 15),
|
|
8590
|
+
'report_rate': frame.slice(15, 19).reduce(msbLsb) + " sec",
|
|
8591
|
+
'tx_life_counter': frame.slice(19, 23).reduce(msbLsb),
|
|
8592
|
+
'machine_values': {
|
|
8593
|
+
'firmware': frame[2],
|
|
8594
|
+
'hardware_id': frame.slice(12, 15),
|
|
8595
|
+
'report_rate': frame.slice(15, 19),
|
|
8596
|
+
'tx_life_counter': frame.slice(19, 23)
|
|
8597
|
+
}
|
|
8598
|
+
}
|
|
8599
|
+
}
|
|
8600
|
+
},
|
|
8527
8601
|
'101':{
|
|
8528
8602
|
name: 'Pro Vibration',
|
|
8529
8603
|
parse: (d, full)=>{
|
|
@@ -9425,7 +9499,7 @@ function sensor_types(parent){
|
|
|
9425
9499
|
}
|
|
9426
9500
|
},
|
|
9427
9501
|
'parse_fly': (frame) => {
|
|
9428
|
-
if(frame[2]
|
|
9502
|
+
if(frame[2] > 18){
|
|
9429
9503
|
let reset_mode = "Disabled";
|
|
9430
9504
|
switch(frame[38]){
|
|
9431
9505
|
case 0:
|
|
@@ -9551,165 +9625,10 @@ function sensor_types(parent){
|
|
|
9551
9625
|
'acc_odr': acc_odr,
|
|
9552
9626
|
'screen_control': screen_control,
|
|
9553
9627
|
'screen_on_time': frame[42] + ' sec',
|
|
9554
|
-
'interrupt_timeout': frame
|
|
9555
|
-
'hardware_id': frame.slice(
|
|
9556
|
-
'report_rate': frame.slice(
|
|
9557
|
-
'tx_life_counter': frame.slice(
|
|
9558
|
-
'machine_values': {
|
|
9559
|
-
'firmware': frame[2],
|
|
9560
|
-
'accelerometer_threshold': frame[16],
|
|
9561
|
-
'debouncing_timeout': frame.slice(17, 19),
|
|
9562
|
-
'accelero_state': frame[19],
|
|
9563
|
-
'input_1_active_edge': frame[20],
|
|
9564
|
-
'input_2_active_edge': frame[21],
|
|
9565
|
-
'input_3_active_edge': frame[22],
|
|
9566
|
-
'counter_threshold': frame.slice(23, 27),
|
|
9567
|
-
'trasnmit_on_change_status': frame[27],
|
|
9568
|
-
'Shift_end_1': frame.slice(28, 30),
|
|
9569
|
-
'Shift_end_2': frame.slice(30, 32),
|
|
9570
|
-
'Shift_end_3': frame.slice(32, 34),
|
|
9571
|
-
'Shift_end_4': frame.slice(34, 36),
|
|
9572
|
-
'reset_timeout': frame.slice(36, 38),
|
|
9573
|
-
'counter_reset_mode': frame[38],
|
|
9574
|
-
'sampling_interval': frame[39],
|
|
9575
|
-
'acc_odr': frame[40],
|
|
9576
|
-
'screen_control': frame[41],
|
|
9577
|
-
'screen_on_time': frame[42],
|
|
9578
|
-
'interrupt_timeout': frame[43],
|
|
9579
|
-
'hardware_id': frame.slice(44, 47),
|
|
9580
|
-
'report_rate': frame.slice(47, 51),
|
|
9581
|
-
'tx_life_counter': frame.slice(51, 55)
|
|
9582
|
-
}
|
|
9583
|
-
}
|
|
9584
|
-
} else if(frame[2] == 16){ // Screen version
|
|
9585
|
-
let reset_mode = "Disabled";
|
|
9586
|
-
switch(frame[38]){
|
|
9587
|
-
case 0:
|
|
9588
|
-
reset_mode = "Disabled";
|
|
9589
|
-
break;
|
|
9590
|
-
case 1:
|
|
9591
|
-
reset_mode = "Shift Ends";
|
|
9592
|
-
break;
|
|
9593
|
-
case 2:
|
|
9594
|
-
reset_mode = "Timeout";
|
|
9595
|
-
break;
|
|
9596
|
-
}
|
|
9597
|
-
let acc_odr = "10Hz";
|
|
9598
|
-
switch(frame[40]){
|
|
9599
|
-
case 0:
|
|
9600
|
-
acc_odr = "10Hz";
|
|
9601
|
-
break;
|
|
9602
|
-
case 1:
|
|
9603
|
-
acc_odr = "20Hz";
|
|
9604
|
-
break;
|
|
9605
|
-
case 2:
|
|
9606
|
-
acc_odr = "50Hz";
|
|
9607
|
-
break;
|
|
9608
|
-
case 3:
|
|
9609
|
-
acc_odr = "100Hz";
|
|
9610
|
-
break;
|
|
9611
|
-
case 4:
|
|
9612
|
-
acc_odr = "200Hz";
|
|
9613
|
-
break;
|
|
9614
|
-
case 5:
|
|
9615
|
-
acc_odr = "400Hz";
|
|
9616
|
-
break;
|
|
9617
|
-
}
|
|
9618
|
-
let rtc_sampling_interval = "5 seconds";
|
|
9619
|
-
switch(frame[39]){
|
|
9620
|
-
case 0:
|
|
9621
|
-
rtc_sampling_interval = "1 minute";
|
|
9622
|
-
break;
|
|
9623
|
-
case 1:
|
|
9624
|
-
rtc_sampling_interval = "5 minutes";
|
|
9625
|
-
break;
|
|
9626
|
-
case 2:
|
|
9627
|
-
rtc_sampling_interval = "15 minutes";
|
|
9628
|
-
break;
|
|
9629
|
-
case 3:
|
|
9630
|
-
rtc_sampling_interval = "30 minutes";
|
|
9631
|
-
break;
|
|
9632
|
-
case 4:
|
|
9633
|
-
rtc_sampling_interval = "1 hour";
|
|
9634
|
-
break;
|
|
9635
|
-
case 5:
|
|
9636
|
-
rtc_sampling_interval = "2 hours";
|
|
9637
|
-
break;
|
|
9638
|
-
case 6:
|
|
9639
|
-
rtc_sampling_interval = "3 hours";
|
|
9640
|
-
break;
|
|
9641
|
-
case 7:
|
|
9642
|
-
rtc_sampling_interval = "6 hours";
|
|
9643
|
-
break;
|
|
9644
|
-
case 8:
|
|
9645
|
-
rtc_sampling_interval = "12 hours";
|
|
9646
|
-
break;
|
|
9647
|
-
case 9:
|
|
9648
|
-
rtc_sampling_interval = "5 seconds";
|
|
9649
|
-
break;
|
|
9650
|
-
case 10:
|
|
9651
|
-
rtc_sampling_interval = "10 seconds";
|
|
9652
|
-
break;
|
|
9653
|
-
case 11:
|
|
9654
|
-
rtc_sampling_interval = "15 seconds";
|
|
9655
|
-
break;
|
|
9656
|
-
case 12:
|
|
9657
|
-
rtc_sampling_interval = "30 seconds";
|
|
9658
|
-
break;
|
|
9659
|
-
}
|
|
9660
|
-
let screen_control = 0;
|
|
9661
|
-
switch(frame[41]){
|
|
9662
|
-
case 0:
|
|
9663
|
-
screen_control = "IO1";
|
|
9664
|
-
break;
|
|
9665
|
-
case 1:
|
|
9666
|
-
screen_control = "IO2";
|
|
9667
|
-
break;
|
|
9668
|
-
case 2:
|
|
9669
|
-
screen_control = "IO3";
|
|
9670
|
-
break;
|
|
9671
|
-
case 3:
|
|
9672
|
-
screen_control = "Accelero";
|
|
9673
|
-
break;
|
|
9674
|
-
case 4:
|
|
9675
|
-
screen_control = "Magneto";
|
|
9676
|
-
break;
|
|
9677
|
-
}
|
|
9678
|
-
return {
|
|
9679
|
-
'firmware': frame[2],
|
|
9680
|
-
'accelerometer_threshold': (frame[16]* 32) + "mg",
|
|
9681
|
-
'debouncing_timeout': frame.slice(17, 19).reduce(msbLsb) + "msec",
|
|
9682
|
-
'accelero_state': frame[19]? "Enabled": "Disabled",
|
|
9683
|
-
'input_1_active_edge': frame[20]? "Rising": "Falling",
|
|
9684
|
-
'input_2_active_edge': frame[21]? "Rising": "Falling",
|
|
9685
|
-
'input_3_active_edge': frame[22]? "Rising": "Falling",
|
|
9686
|
-
'counter_threshold': frame.slice(23, 27).reduce(msbLsb),
|
|
9687
|
-
'trasnmit_on_change_status': frame[27]? "Enabled": "Disabled",
|
|
9688
|
-
'Shift_end_1': [
|
|
9689
|
-
String(frame[28]).padStart(2, '0'),
|
|
9690
|
-
String(frame[29]).padStart(2, '0')
|
|
9691
|
-
].join(':'),
|
|
9692
|
-
'Shift_end_2': [
|
|
9693
|
-
String(frame[30]).padStart(2, '0'),
|
|
9694
|
-
String(frame[31]).padStart(2, '0')
|
|
9695
|
-
].join(':'),
|
|
9696
|
-
'Shift_end_3': [
|
|
9697
|
-
String(frame[32]).padStart(2, '0'),
|
|
9698
|
-
String(frame[33]).padStart(2, '0')
|
|
9699
|
-
].join(':'),
|
|
9700
|
-
'Shift_end_4': [
|
|
9701
|
-
String(frame[34]).padStart(2, '0'),
|
|
9702
|
-
String(frame[35]).padStart(2, '0')
|
|
9703
|
-
].join(':'),
|
|
9704
|
-
'reset_timeout': frame.slice(36, 38).reduce(msbLsb) + "min",
|
|
9705
|
-
'counter_reset_mode': reset_mode,
|
|
9706
|
-
'sampling_interval': rtc_sampling_interval,
|
|
9707
|
-
'acc_odr': acc_odr,
|
|
9708
|
-
'screen_control': screen_control,
|
|
9709
|
-
'screen_on_time': frame[42] + 'sec',
|
|
9710
|
-
'hardware_id': frame.slice(43, 46),
|
|
9711
|
-
'report_rate': frame.slice(46, 50).reduce(msbLsb) + "sec",
|
|
9712
|
-
'tx_life_counter': frame.slice(50, 54).reduce(msbLsb),
|
|
9628
|
+
'interrupt_timeout': frame.slice(43, 45).reduce(msbLsb) + ' msec',
|
|
9629
|
+
'hardware_id': frame.slice(45, 48),
|
|
9630
|
+
'report_rate': frame.slice(48, 52).reduce(msbLsb) + " sec",
|
|
9631
|
+
'tx_life_counter': frame.slice(52, 56).reduce(msbLsb),
|
|
9713
9632
|
'machine_values': {
|
|
9714
9633
|
'firmware': frame[2],
|
|
9715
9634
|
'accelerometer_threshold': frame[16],
|
|
@@ -9730,12 +9649,13 @@ function sensor_types(parent){
|
|
|
9730
9649
|
'acc_odr': frame[40],
|
|
9731
9650
|
'screen_control': frame[41],
|
|
9732
9651
|
'screen_on_time': frame[42],
|
|
9733
|
-
'
|
|
9734
|
-
'
|
|
9735
|
-
'
|
|
9652
|
+
'interrupt_timeout': frame.slice(43, 45),
|
|
9653
|
+
'hardware_id': frame.slice(45, 48),
|
|
9654
|
+
'report_rate': frame.slice(48, 52),
|
|
9655
|
+
'tx_life_counter': frame.slice(52, 56)
|
|
9736
9656
|
}
|
|
9737
9657
|
}
|
|
9738
|
-
}
|
|
9658
|
+
}else if(frame[2] > 13){
|
|
9739
9659
|
let reset_mode = "Disabled";
|
|
9740
9660
|
switch(frame[38]){
|
|
9741
9661
|
case 0:
|
|
@@ -9869,7 +9789,7 @@ function sensor_types(parent){
|
|
|
9869
9789
|
'tx_life_counter': frame.slice(50, 54)
|
|
9870
9790
|
}
|
|
9871
9791
|
}
|
|
9872
|
-
} else if(frame[2] > 9){
|
|
9792
|
+
} else if(frame[2] > 9){
|
|
9873
9793
|
let reset_mode = "Disabled";
|
|
9874
9794
|
switch(frame[38]){
|
|
9875
9795
|
case 0:
|
|
@@ -10358,164 +10278,63 @@ function sensor_types(parent){
|
|
|
10358
10278
|
let msg_type = (payload[7] & 16)? 'motion' : 'regular';
|
|
10359
10279
|
if(payload[8] === 1){
|
|
10360
10280
|
var deviceAddr = mac;
|
|
10361
|
-
var firmware = payload[1];
|
|
10362
|
-
var hour = payload[12];
|
|
10363
|
-
var minute = payload[13];
|
|
10281
|
+
// var firmware = payload[1];
|
|
10282
|
+
// var hour = payload[12];
|
|
10283
|
+
// var minute = payload[13];
|
|
10364
10284
|
var expected_packets = msbLsb(payload[16], payload[17]);
|
|
10365
10285
|
var current_packet = msbLsb(payload[18], payload[19]);
|
|
10366
10286
|
var sdata_start = 20;
|
|
10367
10287
|
|
|
10368
10288
|
if(globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1){
|
|
10369
|
-
if(expected_packets != 1){
|
|
10289
|
+
if (expected_packets != 1) {
|
|
10370
10290
|
// if current packet is equal to last one (duplicated data). This does not apply to the last package
|
|
10371
|
-
if (globalDevices[deviceAddr].last_packet_counter == current_packet){
|
|
10291
|
+
if (globalDevices[deviceAddr].last_packet_counter == current_packet) {
|
|
10372
10292
|
console.log('Duplicated message')
|
|
10373
10293
|
return;
|
|
10374
10294
|
}
|
|
10375
10295
|
// if current packet is equal to 1 or last packet counter is higher thant current packet
|
|
10376
|
-
if(current_packet == 1 || (globalDevices[deviceAddr].last_packet_counter > current_packet)){
|
|
10377
|
-
|
|
10378
|
-
|
|
10379
|
-
|
|
10380
|
-
|
|
10381
|
-
|
|
10382
|
-
|
|
10383
|
-
|
|
10384
|
-
|
|
10385
|
-
globalDevices[deviceAddr] = {
|
|
10386
|
-
data: {},
|
|
10387
|
-
odr: odr,
|
|
10388
|
-
mo: mode,
|
|
10389
|
-
fsr: fsr,
|
|
10390
|
-
hour: hour,
|
|
10391
|
-
minute: minute,
|
|
10392
|
-
temperature: temperature,
|
|
10393
|
-
}
|
|
10296
|
+
if (current_packet == 1 || (globalDevices[deviceAddr].last_packet_counter > current_packet)) {
|
|
10297
|
+
console.log('Recovering bad packet');
|
|
10298
|
+
// clear stream object & timeout
|
|
10299
|
+
parent.sensor_types[110].utils.clear_globalDevices_stream(deviceAddr);
|
|
10300
|
+
|
|
10301
|
+
// init new stream
|
|
10302
|
+
parent.sensor_types[110].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
|
|
10303
|
+
|
|
10394
10304
|
globalDevices[deviceAddr].last_packet_counter = current_packet;
|
|
10395
10305
|
globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
|
|
10396
10306
|
return;
|
|
10397
|
-
}
|
|
10398
|
-
else{
|
|
10307
|
+
} else {
|
|
10399
10308
|
globalDevices[deviceAddr].last_packet_counter = current_packet;
|
|
10400
10309
|
globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
|
|
10401
10310
|
}
|
|
10402
10311
|
}
|
|
10403
10312
|
else{
|
|
10404
|
-
|
|
10405
|
-
|
|
10406
|
-
var fsr = payload[11] >> 5;
|
|
10407
|
-
var temperature = msbLsb(payload[14], payload[15])/100;
|
|
10313
|
+
// clear stream object & timeout
|
|
10314
|
+
parent.sensor_types[110].utils.clear_globalDevices_stream(deviceAddr);
|
|
10408
10315
|
|
|
10409
|
-
|
|
10410
|
-
|
|
10411
|
-
|
|
10412
|
-
|
|
10413
|
-
|
|
10414
|
-
hour: hour,
|
|
10415
|
-
minute: minute,
|
|
10416
|
-
temperature: temperature,
|
|
10417
|
-
}
|
|
10418
|
-
globalDevices[deviceAddr].last_packet_counter = current_packet;
|
|
10419
|
-
globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
|
|
10316
|
+
// init new stream
|
|
10317
|
+
parent.sensor_types[110].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
|
|
10318
|
+
|
|
10319
|
+
globalDevices[deviceAddr].last_packet_counter = current_packet;
|
|
10320
|
+
globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
|
|
10420
10321
|
}
|
|
10421
10322
|
}
|
|
10422
10323
|
else{
|
|
10423
|
-
|
|
10424
|
-
|
|
10425
|
-
|
|
10426
|
-
|
|
10324
|
+
// clear stream object & timeout
|
|
10325
|
+
parent.sensor_types[110].utils.clear_globalDevices_stream(deviceAddr);
|
|
10326
|
+
|
|
10327
|
+
// init new stream
|
|
10328
|
+
parent.sensor_types[110].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
|
|
10427
10329
|
|
|
10428
|
-
globalDevices[deviceAddr] = {
|
|
10429
|
-
data: {},
|
|
10430
|
-
odr: odr,
|
|
10431
|
-
mo: mode,
|
|
10432
|
-
fsr: fsr,
|
|
10433
|
-
hour: hour,
|
|
10434
|
-
minute: minute,
|
|
10435
|
-
temperature: temperature,
|
|
10436
|
-
}
|
|
10437
10330
|
globalDevices[deviceAddr].last_packet_counter = current_packet;
|
|
10438
10331
|
globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
|
|
10439
10332
|
}
|
|
10440
10333
|
if(current_packet == expected_packets){
|
|
10441
|
-
|
|
10442
|
-
|
|
10443
|
-
|
|
10444
|
-
|
|
10445
|
-
var label = 0;
|
|
10446
|
-
|
|
10447
|
-
var fft = new Array();
|
|
10448
|
-
var fft_concat = {};
|
|
10449
|
-
|
|
10450
|
-
var en_axis_data = {};
|
|
10451
|
-
en_axis_data.x_offset = 0;
|
|
10452
|
-
en_axis_data.y_offset = 2;
|
|
10453
|
-
en_axis_data.z_offset = 4;
|
|
10454
|
-
en_axis_data.increment = 6;
|
|
10455
|
-
fft_concat = {x: [], y: [], z: []};
|
|
10456
|
-
|
|
10457
|
-
var fsr_mult = .00006;
|
|
10458
|
-
var fsr_text = "";
|
|
10459
|
-
|
|
10460
|
-
switch(globalDevices[deviceAddr].fsr){
|
|
10461
|
-
case 0:
|
|
10462
|
-
fsr_mult = 0.00006;
|
|
10463
|
-
break;
|
|
10464
|
-
case 1:
|
|
10465
|
-
fsr_mult = 0.00012;
|
|
10466
|
-
break;
|
|
10467
|
-
case 2:
|
|
10468
|
-
fsr_mult = 0.00024;
|
|
10469
|
-
break;
|
|
10470
|
-
case 3:
|
|
10471
|
-
fsr_mult = 0.00049;
|
|
10472
|
-
break;
|
|
10473
|
-
}
|
|
10474
|
-
switch(globalDevices[deviceAddr].fsr){
|
|
10475
|
-
case 0:
|
|
10476
|
-
fsr_text = "2g";
|
|
10477
|
-
break;
|
|
10478
|
-
case 1:
|
|
10479
|
-
fsr_text = "4g";
|
|
10480
|
-
break;
|
|
10481
|
-
case 2:
|
|
10482
|
-
fsr_text = "8g";
|
|
10483
|
-
break;
|
|
10484
|
-
case 3:
|
|
10485
|
-
fsr_text = "16g";
|
|
10486
|
-
break;
|
|
10487
|
-
}
|
|
10488
|
-
|
|
10489
|
-
for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
|
|
10490
|
-
label++;
|
|
10491
|
-
|
|
10492
|
-
if('x_offset' in en_axis_data){
|
|
10493
|
-
fft_concat.x.push(parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(2)));
|
|
10494
|
-
}
|
|
10495
|
-
if('y_offset' in en_axis_data){
|
|
10496
|
-
fft_concat.y.push(parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(2)));
|
|
10497
|
-
}
|
|
10498
|
-
if('z_offset' in en_axis_data){
|
|
10499
|
-
fft_concat.z.push(parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(2)));
|
|
10500
|
-
}
|
|
10501
|
-
}
|
|
10502
|
-
var fft_concat_obj = {
|
|
10503
|
-
mode: payload[8],
|
|
10504
|
-
msg_type: msg_type,
|
|
10505
|
-
time_id: [
|
|
10506
|
-
String(globalDevices[deviceAddr].hour).padStart(2, '0'),
|
|
10507
|
-
String(globalDevices[deviceAddr].minute).padStart(2, '0'),
|
|
10508
|
-
].join(':'),
|
|
10509
|
-
mac_address: deviceAddr,
|
|
10510
|
-
fsr: fsr_text,
|
|
10511
|
-
odr: globalDevices[deviceAddr].odr,
|
|
10512
|
-
temperature: globalDevices[deviceAddr].temperature,
|
|
10513
|
-
total_samples: label,
|
|
10514
|
-
fft_confidence : ((Object.keys(globalDevices[deviceAddr].data).length / expected_packets) * 100).toFixed(2) + '%',
|
|
10515
|
-
data: fft_concat
|
|
10516
|
-
};
|
|
10517
|
-
sensor_data = fft_concat_obj;
|
|
10518
|
-
delete globalDevices[deviceAddr];
|
|
10334
|
+
// concatenate stream
|
|
10335
|
+
sensor_data = parent.sensor_types[114].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
|
|
10336
|
+
// clear stream object & timeout
|
|
10337
|
+
parent.sensor_types[114].utils.clear_globalDevices_stream(deviceAddr);
|
|
10519
10338
|
return sensor_data;
|
|
10520
10339
|
}
|
|
10521
10340
|
else{
|
|
@@ -10596,6 +10415,119 @@ function sensor_types(parent){
|
|
|
10596
10415
|
// return parsed;
|
|
10597
10416
|
// }
|
|
10598
10417
|
},
|
|
10418
|
+
'utils': {
|
|
10419
|
+
'clear_globalDevices_stream': (deviceAddr) => {
|
|
10420
|
+
if(Object.hasOwn(globalDevices, deviceAddr)){
|
|
10421
|
+
if(Object.hasOwn(globalDevices[deviceAddr], 'packet_stream_timeout')){
|
|
10422
|
+
clearTimeout(globalDevices[deviceAddr].packet_stream_timeout);
|
|
10423
|
+
}
|
|
10424
|
+
delete globalDevices[deviceAddr];
|
|
10425
|
+
}
|
|
10426
|
+
},
|
|
10427
|
+
'init_globalDevices_stream'(deviceAddr, payload, expected_packets, parsed, msg_type){
|
|
10428
|
+
globalDevices[deviceAddr] = {
|
|
10429
|
+
data: {},
|
|
10430
|
+
odr: msbLsb(payload[9], payload[10]),
|
|
10431
|
+
mo: payload[8],
|
|
10432
|
+
fsr: payload[11] >> 5,
|
|
10433
|
+
hour: payload[12],
|
|
10434
|
+
minute: payload[13],
|
|
10435
|
+
temperature: msbLsb(payload[14], payload[15]) / 100,
|
|
10436
|
+
expected_packets: expected_packets
|
|
10437
|
+
}
|
|
10438
|
+
globalDevices[deviceAddr].packet_stream_timeout = setTimeout(() => {
|
|
10439
|
+
parsed.sensor_data = parent.sensor_types[110].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
|
|
10440
|
+
parsed.sensor_data.error = 'Time Series Data Stream Timeout - incomplete data received';
|
|
10441
|
+
|
|
10442
|
+
parsed.sensor_name = parent.sensor_types[110].name;
|
|
10443
|
+
parsed.type = 'sensor_data';
|
|
10444
|
+
parsed.addr = deviceAddr;
|
|
10445
|
+
parsed.received = Date.now();
|
|
10446
|
+
|
|
10447
|
+
parent._emitter.emit('sensor_data', parsed);
|
|
10448
|
+
parent._emitter.emit('sensor_data-110', parsed);
|
|
10449
|
+
parent._emitter.emit('sensor_data'+'-'+deviceAddr, parsed);
|
|
10450
|
+
}, 60000);
|
|
10451
|
+
},
|
|
10452
|
+
'concat_fft_data': (deviceAddr, mode, msg_type) => {
|
|
10453
|
+
var raw_data = new Array();
|
|
10454
|
+
for(const packet in globalDevices[deviceAddr].data){
|
|
10455
|
+
raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
|
|
10456
|
+
}
|
|
10457
|
+
var label = 0;
|
|
10458
|
+
|
|
10459
|
+
var fft_concat = {};
|
|
10460
|
+
|
|
10461
|
+
var en_axis_data = {};
|
|
10462
|
+
en_axis_data.x_offset = 0;
|
|
10463
|
+
en_axis_data.y_offset = 2;
|
|
10464
|
+
en_axis_data.z_offset = 4;
|
|
10465
|
+
en_axis_data.increment = 6;
|
|
10466
|
+
fft_concat = {x: [], y: [], z: []};
|
|
10467
|
+
|
|
10468
|
+
var fsr_mult = .00006;
|
|
10469
|
+
var fsr_text = "";
|
|
10470
|
+
|
|
10471
|
+
switch(globalDevices[deviceAddr].fsr){
|
|
10472
|
+
case 0:
|
|
10473
|
+
fsr_mult = 0.00006;
|
|
10474
|
+
break;
|
|
10475
|
+
case 1:
|
|
10476
|
+
fsr_mult = 0.00012;
|
|
10477
|
+
break;
|
|
10478
|
+
case 2:
|
|
10479
|
+
fsr_mult = 0.00024;
|
|
10480
|
+
break;
|
|
10481
|
+
case 3:
|
|
10482
|
+
fsr_mult = 0.00049;
|
|
10483
|
+
break;
|
|
10484
|
+
}
|
|
10485
|
+
switch(globalDevices[deviceAddr].fsr){
|
|
10486
|
+
case 0:
|
|
10487
|
+
fsr_text = "2g";
|
|
10488
|
+
break;
|
|
10489
|
+
case 1:
|
|
10490
|
+
fsr_text = "4g";
|
|
10491
|
+
break;
|
|
10492
|
+
case 2:
|
|
10493
|
+
fsr_text = "8g";
|
|
10494
|
+
break;
|
|
10495
|
+
case 3:
|
|
10496
|
+
fsr_text = "16g";
|
|
10497
|
+
break;
|
|
10498
|
+
}
|
|
10499
|
+
|
|
10500
|
+
for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
|
|
10501
|
+
label++;
|
|
10502
|
+
|
|
10503
|
+
if('x_offset' in en_axis_data){
|
|
10504
|
+
fft_concat.x.push(parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(2)));
|
|
10505
|
+
}
|
|
10506
|
+
if('y_offset' in en_axis_data){
|
|
10507
|
+
fft_concat.y.push(parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(2)));
|
|
10508
|
+
}
|
|
10509
|
+
if('z_offset' in en_axis_data){
|
|
10510
|
+
fft_concat.z.push(parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(2)));
|
|
10511
|
+
}
|
|
10512
|
+
}
|
|
10513
|
+
var fft_concat_obj = {
|
|
10514
|
+
mode: mode,
|
|
10515
|
+
msg_type: msg_type,
|
|
10516
|
+
time_id: [
|
|
10517
|
+
String(globalDevices[deviceAddr].hour).padStart(2, '0'),
|
|
10518
|
+
String(globalDevices[deviceAddr].minute).padStart(2, '0'),
|
|
10519
|
+
].join(':'),
|
|
10520
|
+
mac_address: deviceAddr,
|
|
10521
|
+
fsr: fsr_text,
|
|
10522
|
+
odr: globalDevices[deviceAddr].odr,
|
|
10523
|
+
temperature: globalDevices[deviceAddr].temperature,
|
|
10524
|
+
total_samples: label,
|
|
10525
|
+
fft_confidence : ((Object.keys(globalDevices[deviceAddr].data).length / globalDevices[deviceAddr].expected_packets) * 100).toFixed(2) + '%',
|
|
10526
|
+
data: fft_concat
|
|
10527
|
+
};
|
|
10528
|
+
return fft_concat_obj;
|
|
10529
|
+
}
|
|
10530
|
+
},
|
|
10599
10531
|
'parse_fly': (frame) => {
|
|
10600
10532
|
let frame_data = {};
|
|
10601
10533
|
switch(frame[16]){
|
|
@@ -10960,7 +10892,7 @@ function sensor_types(parent){
|
|
|
10960
10892
|
'111': {
|
|
10961
10893
|
name: 'Two Channel Vibration Plus v4',
|
|
10962
10894
|
parse: (payload, parsed, mac) => {
|
|
10963
|
-
parsed.data = {};
|
|
10895
|
+
// parsed.data = {};
|
|
10964
10896
|
if(payload[7] & 2){
|
|
10965
10897
|
parsed.data['probe_1_error'] = true;
|
|
10966
10898
|
}
|
|
@@ -10973,174 +10905,77 @@ function sensor_types(parent){
|
|
|
10973
10905
|
let msg_type = (payload[7] & 16)? 'motion' : 'regular';
|
|
10974
10906
|
if(payload[8] === 1){
|
|
10975
10907
|
var deviceAddr = mac;
|
|
10976
|
-
var firmware = payload[1];
|
|
10977
|
-
var hour = payload[12];
|
|
10978
|
-
var minute = payload[13];
|
|
10908
|
+
// var firmware = payload[1];
|
|
10909
|
+
// var hour = payload[12];
|
|
10910
|
+
// var minute = payload[13];
|
|
10979
10911
|
var expected_packets = msbLsb(payload[16], payload[17]);
|
|
10980
10912
|
var current_packet = msbLsb(payload[18], payload[19]);
|
|
10981
10913
|
var sdata_start = 20;
|
|
10914
|
+
// If 4th bit is 1 the packet is from the second probe, if 0 from the first
|
|
10915
|
+
var probe;
|
|
10916
|
+
if (payload[7] & 8) {
|
|
10917
|
+
probe = 2;
|
|
10918
|
+
} else {
|
|
10919
|
+
probe = 1;
|
|
10920
|
+
}
|
|
10982
10921
|
|
|
10983
|
-
|
|
10984
|
-
|
|
10922
|
+
// initialize globalDevices for this sensor if it doesn't exist
|
|
10923
|
+
// exlusively for multi-probe sensors
|
|
10924
|
+
if(!Object.hasOwn(globalDevices, deviceAddr)){
|
|
10925
|
+
globalDevices[deviceAddr] = {};
|
|
10926
|
+
}
|
|
10927
|
+
if(globalDevices[deviceAddr].hasOwnProperty(probe) || expected_packets == 1){
|
|
10928
|
+
console.log('Continuing existing probe stream');
|
|
10929
|
+
if (expected_packets != 1) {
|
|
10930
|
+
console.log('Expected packets more than 1');
|
|
10985
10931
|
// if current packet is equal to last one (duplicated data). This does not apply to the last package
|
|
10986
|
-
if (globalDevices[deviceAddr].last_packet_counter == current_packet){
|
|
10932
|
+
if (globalDevices[deviceAddr][probe].last_packet_counter == current_packet) {
|
|
10987
10933
|
console.log('Duplicated message')
|
|
10988
10934
|
return;
|
|
10989
10935
|
}
|
|
10990
10936
|
// if current packet is equal to 1 or last packet counter is higher thant current packet
|
|
10991
|
-
if(current_packet == 1 || (globalDevices[deviceAddr].last_packet_counter > current_packet)){
|
|
10992
|
-
|
|
10993
|
-
|
|
10994
|
-
|
|
10995
|
-
var mode = payload[8];
|
|
10996
|
-
var odr = msbLsb(payload[9], payload[10]);
|
|
10997
|
-
var fsr = payload[11] >> 5;
|
|
10998
|
-
var temperature = msbLsb(payload[14], payload[15])/100;
|
|
10937
|
+
if (current_packet == 1 || (globalDevices[deviceAddr][probe].last_packet_counter > current_packet)) {
|
|
10938
|
+
console.log('Recovering bad packet');
|
|
10939
|
+
// clear stream object & timeout
|
|
10940
|
+
parent.sensor_types[111].utils.clear_globalDevices_stream(deviceAddr, probe);
|
|
10999
10941
|
|
|
11000
|
-
|
|
11001
|
-
|
|
11002
|
-
odr: odr,
|
|
11003
|
-
mo: mode,
|
|
11004
|
-
fsr: fsr,
|
|
11005
|
-
hour: hour,
|
|
11006
|
-
minute: minute,
|
|
11007
|
-
temperature: temperature,
|
|
11008
|
-
}
|
|
11009
|
-
globalDevices[deviceAddr].last_packet_counter = current_packet;
|
|
11010
|
-
globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
|
|
11011
|
-
return;
|
|
11012
|
-
}
|
|
11013
|
-
else{
|
|
11014
|
-
globalDevices[deviceAddr].last_packet_counter = current_packet;
|
|
11015
|
-
globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
|
|
11016
|
-
}
|
|
11017
|
-
}
|
|
11018
|
-
else{
|
|
11019
|
-
var mode = payload[8];
|
|
11020
|
-
var odr = msbLsb(payload[9], payload[10]);
|
|
11021
|
-
var fsr = payload[11] >> 5;
|
|
11022
|
-
var temperature = msbLsb(payload[14], payload[15])/100;
|
|
10942
|
+
// init new stream
|
|
10943
|
+
parent.sensor_types[111].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type, probe);
|
|
11023
10944
|
|
|
11024
|
-
|
|
11025
|
-
data
|
|
11026
|
-
|
|
11027
|
-
|
|
11028
|
-
|
|
11029
|
-
|
|
11030
|
-
minute: minute,
|
|
11031
|
-
temperature: temperature,
|
|
10945
|
+
globalDevices[deviceAddr][probe].last_packet_counter = current_packet;
|
|
10946
|
+
globalDevices[deviceAddr][probe].data[current_packet] = payload.slice(sdata_start);
|
|
10947
|
+
return;
|
|
10948
|
+
} else {
|
|
10949
|
+
globalDevices[deviceAddr][probe].last_packet_counter = current_packet;
|
|
10950
|
+
globalDevices[deviceAddr][probe].data[current_packet] = payload.slice(sdata_start);
|
|
11032
10951
|
}
|
|
11033
|
-
|
|
11034
|
-
|
|
10952
|
+
} else {
|
|
10953
|
+
// clear stream object & timeout
|
|
10954
|
+
parent.sensor_types[111].utils.clear_globalDevices_stream(deviceAddr, probe);
|
|
10955
|
+
|
|
10956
|
+
// init new stream
|
|
10957
|
+
parent.sensor_types[111].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type, probe);
|
|
10958
|
+
|
|
10959
|
+
globalDevices[deviceAddr][probe].last_packet_counter = current_packet;
|
|
10960
|
+
globalDevices[deviceAddr][probe].data[current_packet] = payload.slice(sdata_start);
|
|
11035
10961
|
}
|
|
11036
10962
|
}
|
|
11037
10963
|
else{
|
|
11038
|
-
|
|
11039
|
-
|
|
11040
|
-
var fsr = payload[11] >> 5;
|
|
11041
|
-
var temperature = msbLsb(payload[14], payload[15])/100;
|
|
10964
|
+
// clear stream object & timeout
|
|
10965
|
+
parent.sensor_types[111].utils.clear_globalDevices_stream(deviceAddr, probe);
|
|
11042
10966
|
|
|
11043
|
-
|
|
11044
|
-
|
|
11045
|
-
|
|
11046
|
-
|
|
11047
|
-
|
|
11048
|
-
hour: hour,
|
|
11049
|
-
minute: minute,
|
|
11050
|
-
temperature: temperature,
|
|
11051
|
-
}
|
|
11052
|
-
globalDevices[deviceAddr].last_packet_counter = current_packet;
|
|
11053
|
-
globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
|
|
10967
|
+
// init new stream
|
|
10968
|
+
parent.sensor_types[111].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type, probe);
|
|
10969
|
+
|
|
10970
|
+
globalDevices[deviceAddr][probe].last_packet_counter = current_packet;
|
|
10971
|
+
globalDevices[deviceAddr][probe].data[current_packet] = payload.slice(sdata_start);
|
|
11054
10972
|
}
|
|
11055
10973
|
if(current_packet == expected_packets){
|
|
11056
|
-
|
|
11057
|
-
|
|
11058
|
-
raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
|
|
11059
|
-
}
|
|
11060
|
-
var label = 0;
|
|
11061
|
-
|
|
11062
|
-
var fft = new Array();
|
|
11063
|
-
var fft_concat = {};
|
|
10974
|
+
// concatenate stream
|
|
10975
|
+
sensor_data = parent.sensor_types[111].utils.concat_fft_data(deviceAddr, payload[8], msg_type, probe);
|
|
11064
10976
|
|
|
11065
|
-
|
|
11066
|
-
|
|
11067
|
-
en_axis_data.y_offset = 2;
|
|
11068
|
-
en_axis_data.z_offset = 4;
|
|
11069
|
-
en_axis_data.increment = 6;
|
|
11070
|
-
fft_concat = {x: [], y: [], z: []};
|
|
11071
|
-
|
|
11072
|
-
var fsr_mult = .00006;
|
|
11073
|
-
var fsr_text = "";
|
|
11074
|
-
|
|
11075
|
-
switch(globalDevices[deviceAddr].fsr){
|
|
11076
|
-
case 0:
|
|
11077
|
-
fsr_mult = 0.00006;
|
|
11078
|
-
break;
|
|
11079
|
-
case 1:
|
|
11080
|
-
fsr_mult = 0.00012;
|
|
11081
|
-
break;
|
|
11082
|
-
case 2:
|
|
11083
|
-
fsr_mult = 0.00024;
|
|
11084
|
-
break;
|
|
11085
|
-
case 3:
|
|
11086
|
-
fsr_mult = 0.00049;
|
|
11087
|
-
break;
|
|
11088
|
-
}
|
|
11089
|
-
switch(globalDevices[deviceAddr].fsr){
|
|
11090
|
-
case 0:
|
|
11091
|
-
fsr_text = "2g";
|
|
11092
|
-
break;
|
|
11093
|
-
case 1:
|
|
11094
|
-
fsr_text = "4g";
|
|
11095
|
-
break;
|
|
11096
|
-
case 2:
|
|
11097
|
-
fsr_text = "8g";
|
|
11098
|
-
break;
|
|
11099
|
-
case 3:
|
|
11100
|
-
fsr_text = "16g";
|
|
11101
|
-
break;
|
|
11102
|
-
}
|
|
11103
|
-
|
|
11104
|
-
for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
|
|
11105
|
-
label++;
|
|
11106
|
-
|
|
11107
|
-
if('x_offset' in en_axis_data){
|
|
11108
|
-
fft_concat.x.push(parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(2)));
|
|
11109
|
-
}
|
|
11110
|
-
if('y_offset' in en_axis_data){
|
|
11111
|
-
fft_concat.y.push(parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(2)));
|
|
11112
|
-
}
|
|
11113
|
-
if('z_offset' in en_axis_data){
|
|
11114
|
-
fft_concat.z.push(parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(2)));
|
|
11115
|
-
}
|
|
11116
|
-
}
|
|
11117
|
-
// If 4th bit is 1 the packet is from the second probe, if 0 from the first
|
|
11118
|
-
var probe = '';
|
|
11119
|
-
if(payload[7] & 8){
|
|
11120
|
-
probe = '2';
|
|
11121
|
-
}
|
|
11122
|
-
else{
|
|
11123
|
-
probe = '1';
|
|
11124
|
-
}
|
|
11125
|
-
|
|
11126
|
-
var fft_concat_obj = {
|
|
11127
|
-
mode: payload[8],
|
|
11128
|
-
msg_type: msg_type,
|
|
11129
|
-
probe: probe,
|
|
11130
|
-
time_id: [
|
|
11131
|
-
String(globalDevices[deviceAddr].hour).padStart(2, '0'),
|
|
11132
|
-
String(globalDevices[deviceAddr].minute).padStart(2, '0'),
|
|
11133
|
-
].join(':'),
|
|
11134
|
-
mac_address: deviceAddr,
|
|
11135
|
-
fsr: fsr_text,
|
|
11136
|
-
odr: globalDevices[deviceAddr].odr,
|
|
11137
|
-
temperature: globalDevices[deviceAddr].temperature,
|
|
11138
|
-
total_samples: label,
|
|
11139
|
-
fft_confidence : ((Object.keys(globalDevices[deviceAddr].data).length / expected_packets) * 100).toFixed(2) + '%',
|
|
11140
|
-
data: fft_concat
|
|
11141
|
-
};
|
|
11142
|
-
sensor_data = fft_concat_obj;
|
|
11143
|
-
delete globalDevices[deviceAddr];
|
|
10977
|
+
// clear stream object & timeout
|
|
10978
|
+
parent.sensor_types[111].utils.clear_globalDevices_stream(deviceAddr, probe);
|
|
11144
10979
|
return sensor_data;
|
|
11145
10980
|
}
|
|
11146
10981
|
else{
|
|
@@ -11291,6 +11126,120 @@ function sensor_types(parent){
|
|
|
11291
11126
|
// return parsed;
|
|
11292
11127
|
// }
|
|
11293
11128
|
},
|
|
11129
|
+
'utils': {
|
|
11130
|
+
'clear_globalDevices_stream': (deviceAddr, probe) => {
|
|
11131
|
+
if(Object.hasOwn(globalDevices, deviceAddr) && Object.hasOwn(globalDevices[deviceAddr], probe)){
|
|
11132
|
+
if(Object.hasOwn(globalDevices[deviceAddr][probe], 'packet_stream_timeout')){
|
|
11133
|
+
clearTimeout(globalDevices[deviceAddr][probe].packet_stream_timeout);
|
|
11134
|
+
}
|
|
11135
|
+
delete globalDevices[deviceAddr][probe];
|
|
11136
|
+
}
|
|
11137
|
+
},
|
|
11138
|
+
'init_globalDevices_stream'(deviceAddr, payload, expected_packets, parsed, msg_type, probe){
|
|
11139
|
+
globalDevices[deviceAddr][probe] = {
|
|
11140
|
+
data: {},
|
|
11141
|
+
odr: msbLsb(payload[9], payload[10]),
|
|
11142
|
+
mo: payload[8],
|
|
11143
|
+
fsr: payload[11] >> 5,
|
|
11144
|
+
hour: payload[12],
|
|
11145
|
+
minute: payload[13],
|
|
11146
|
+
temperature: msbLsb(payload[14], payload[15]) / 100,
|
|
11147
|
+
expected_packets: expected_packets
|
|
11148
|
+
}
|
|
11149
|
+
globalDevices[deviceAddr][probe].packet_stream_timeout = setTimeout(() => {
|
|
11150
|
+
parsed.sensor_data = parent.sensor_types[111].utils.concat_fft_data(deviceAddr, payload[8], msg_type, probe);
|
|
11151
|
+
parsed.sensor_data.error = 'Time Series Data Stream Timeout - incomplete data received';
|
|
11152
|
+
|
|
11153
|
+
parsed.sensor_name = parent.sensor_types[111].name;
|
|
11154
|
+
parsed.type = 'sensor_data';
|
|
11155
|
+
parsed.addr = deviceAddr;
|
|
11156
|
+
parsed.received = Date.now();
|
|
11157
|
+
|
|
11158
|
+
parent._emitter.emit('sensor_data', parsed);
|
|
11159
|
+
parent._emitter.emit('sensor_data-111', parsed);
|
|
11160
|
+
parent._emitter.emit('sensor_data'+'-'+deviceAddr, parsed);
|
|
11161
|
+
}, 60000);
|
|
11162
|
+
},
|
|
11163
|
+
'concat_fft_data': (deviceAddr, mode, msg_type, probe) => {
|
|
11164
|
+
var raw_data = new Array();
|
|
11165
|
+
for(const packet in globalDevices[deviceAddr][probe].data){
|
|
11166
|
+
raw_data = raw_data.concat(globalDevices[deviceAddr][probe].data[packet]);
|
|
11167
|
+
}
|
|
11168
|
+
var label = 0;
|
|
11169
|
+
|
|
11170
|
+
var fft_concat = {};
|
|
11171
|
+
|
|
11172
|
+
var en_axis_data = {};
|
|
11173
|
+
en_axis_data.x_offset = 0;
|
|
11174
|
+
en_axis_data.y_offset = 2;
|
|
11175
|
+
en_axis_data.z_offset = 4;
|
|
11176
|
+
en_axis_data.increment = 6;
|
|
11177
|
+
fft_concat = {x: [], y: [], z: []};
|
|
11178
|
+
|
|
11179
|
+
var fsr_mult = .00006;
|
|
11180
|
+
var fsr_text = "";
|
|
11181
|
+
|
|
11182
|
+
switch(globalDevices[deviceAddr][probe].fsr){
|
|
11183
|
+
case 0:
|
|
11184
|
+
fsr_mult = 0.00006;
|
|
11185
|
+
break;
|
|
11186
|
+
case 1:
|
|
11187
|
+
fsr_mult = 0.00012;
|
|
11188
|
+
break;
|
|
11189
|
+
case 2:
|
|
11190
|
+
fsr_mult = 0.00024;
|
|
11191
|
+
break;
|
|
11192
|
+
case 3:
|
|
11193
|
+
fsr_mult = 0.00049;
|
|
11194
|
+
break;
|
|
11195
|
+
}
|
|
11196
|
+
switch(globalDevices[deviceAddr][probe].fsr){
|
|
11197
|
+
case 0:
|
|
11198
|
+
fsr_text = "2g";
|
|
11199
|
+
break;
|
|
11200
|
+
case 1:
|
|
11201
|
+
fsr_text = "4g";
|
|
11202
|
+
break;
|
|
11203
|
+
case 2:
|
|
11204
|
+
fsr_text = "8g";
|
|
11205
|
+
break;
|
|
11206
|
+
case 3:
|
|
11207
|
+
fsr_text = "16g";
|
|
11208
|
+
break;
|
|
11209
|
+
}
|
|
11210
|
+
|
|
11211
|
+
for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
|
|
11212
|
+
label++;
|
|
11213
|
+
|
|
11214
|
+
if('x_offset' in en_axis_data){
|
|
11215
|
+
fft_concat.x.push(parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(2)));
|
|
11216
|
+
}
|
|
11217
|
+
if('y_offset' in en_axis_data){
|
|
11218
|
+
fft_concat.y.push(parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(2)));
|
|
11219
|
+
}
|
|
11220
|
+
if('z_offset' in en_axis_data){
|
|
11221
|
+
fft_concat.z.push(parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(2)));
|
|
11222
|
+
}
|
|
11223
|
+
}
|
|
11224
|
+
var fft_concat_obj = {
|
|
11225
|
+
mode: mode,
|
|
11226
|
+
msg_type: msg_type,
|
|
11227
|
+
probe: probe,
|
|
11228
|
+
time_id: [
|
|
11229
|
+
String(globalDevices[deviceAddr][probe].hour).padStart(2, '0'),
|
|
11230
|
+
String(globalDevices[deviceAddr][probe].minute).padStart(2, '0'),
|
|
11231
|
+
].join(':'),
|
|
11232
|
+
mac_address: deviceAddr,
|
|
11233
|
+
fsr: fsr_text,
|
|
11234
|
+
odr: globalDevices[deviceAddr][probe].odr,
|
|
11235
|
+
temperature: globalDevices[deviceAddr][probe].temperature,
|
|
11236
|
+
total_samples: label,
|
|
11237
|
+
fft_confidence : ((Object.keys(globalDevices[deviceAddr][probe].data).length / globalDevices[deviceAddr][probe].expected_packets) * 100).toFixed(2) + '%',
|
|
11238
|
+
data: fft_concat
|
|
11239
|
+
};
|
|
11240
|
+
return fft_concat_obj;
|
|
11241
|
+
}
|
|
11242
|
+
},
|
|
11294
11243
|
'parse_fly': (frame) => {
|
|
11295
11244
|
let frame_data = {};
|
|
11296
11245
|
switch(frame[16]){
|
|
@@ -11804,192 +11753,66 @@ function sensor_types(parent){
|
|
|
11804
11753
|
return parsed;
|
|
11805
11754
|
}
|
|
11806
11755
|
let msg_type = (payload[7] & 16)? 'motion' : 'regular';
|
|
11807
|
-
if(payload[8] === 1){
|
|
11756
|
+
if (payload[8] === 1) {
|
|
11808
11757
|
var deviceAddr = mac;
|
|
11809
|
-
var firmware = payload[1];
|
|
11810
|
-
var hour = payload[12];
|
|
11811
|
-
var minute = payload[13];
|
|
11758
|
+
// var firmware = payload[1];
|
|
11759
|
+
// var hour = payload[12];
|
|
11760
|
+
// var minute = payload[13];
|
|
11812
11761
|
var expected_packets = msbLsb(payload[16], payload[17]);
|
|
11813
11762
|
var current_packet = msbLsb(payload[18], payload[19]);
|
|
11814
11763
|
var sdata_start = 20;
|
|
11815
|
-
|
|
11816
|
-
|
|
11817
|
-
|
|
11818
|
-
|
|
11819
|
-
if
|
|
11820
|
-
|
|
11821
|
-
console.log('
|
|
11822
|
-
|
|
11823
|
-
console.log(expected_packets);
|
|
11824
|
-
console.log(current_packet in globalDevices[deviceAddr].data);
|
|
11825
|
-
console.log(current_packet == 1);
|
|
11826
|
-
console.log(!((current_packet-1) in globalDevices[deviceAddr].data));
|
|
11827
|
-
if(this.hasOwnProperty('failure_no')){
|
|
11828
|
-
this.failure_no = this.failure_no + 1;
|
|
11829
|
-
}
|
|
11830
|
-
else{
|
|
11831
|
-
this.failure_no = 1;
|
|
11832
|
-
}
|
|
11833
|
-
if(this.hasOwnProperty('failure_no')){
|
|
11834
|
-
console.log('####falure no');
|
|
11835
|
-
console.log(this.failure_no);
|
|
11836
|
-
}
|
|
11837
|
-
// console.log(globalDevices[deviceAddr].data);
|
|
11838
|
-
delete globalDevices[deviceAddr];
|
|
11839
|
-
if(current_packet != 1){
|
|
11840
|
-
return;
|
|
11841
|
-
} else{
|
|
11842
|
-
|
|
11843
|
-
var mode = payload[8];
|
|
11844
|
-
var odr = msbLsb(payload[9], payload[10]);
|
|
11845
|
-
var fsr = payload[11] >> 5;
|
|
11846
|
-
var temperature = msbLsb(payload[14], payload[15])/100;
|
|
11847
|
-
|
|
11848
|
-
globalDevices[deviceAddr] = {
|
|
11849
|
-
// stream_size: expected_packets,
|
|
11850
|
-
data: {},
|
|
11851
|
-
odr: odr,
|
|
11852
|
-
mo: mode,
|
|
11853
|
-
fsr: fsr,
|
|
11854
|
-
hour: hour,
|
|
11855
|
-
minute: minute,
|
|
11856
|
-
temperature: temperature,
|
|
11857
|
-
}
|
|
11858
|
-
globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
|
|
11859
|
-
return;
|
|
11860
|
-
}
|
|
11764
|
+
|
|
11765
|
+
|
|
11766
|
+
if (globalDevices.hasOwnProperty(deviceAddr) || expected_packets == 1) {
|
|
11767
|
+
if (expected_packets != 1) {
|
|
11768
|
+
// if current packet is equal to last one (duplicated data). This does not apply to the last package
|
|
11769
|
+
if (globalDevices[deviceAddr].last_packet_counter == current_packet) {
|
|
11770
|
+
console.log('Duplicated message')
|
|
11771
|
+
return;
|
|
11861
11772
|
}
|
|
11862
|
-
|
|
11773
|
+
// if current packet is equal to 1 or last packet counter is higher thant current packet
|
|
11774
|
+
if (current_packet == 1 || (globalDevices[deviceAddr].last_packet_counter > current_packet)) {
|
|
11775
|
+
console.log('Recovering bad packet');
|
|
11776
|
+
// clear stream object & timeout
|
|
11777
|
+
parent.sensor_types[112].utils.clear_globalDevices_stream(deviceAddr);
|
|
11778
|
+
|
|
11779
|
+
// init new stream
|
|
11780
|
+
parent.sensor_types[112].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
|
|
11781
|
+
|
|
11782
|
+
globalDevices[deviceAddr].last_packet_counter = current_packet;
|
|
11783
|
+
globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
|
|
11784
|
+
return;
|
|
11785
|
+
} else {
|
|
11786
|
+
globalDevices[deviceAddr].last_packet_counter = current_packet;
|
|
11863
11787
|
globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
|
|
11864
11788
|
}
|
|
11865
|
-
}
|
|
11866
|
-
|
|
11867
|
-
|
|
11868
|
-
|
|
11869
|
-
|
|
11870
|
-
|
|
11871
|
-
|
|
11872
|
-
globalDevices[deviceAddr] =
|
|
11873
|
-
// stream_size: expected_packets,
|
|
11874
|
-
data: {},
|
|
11875
|
-
odr: odr,
|
|
11876
|
-
mo: mode,
|
|
11877
|
-
fsr: fsr,
|
|
11878
|
-
hour: hour,
|
|
11879
|
-
minute: minute,
|
|
11880
|
-
temperature: temperature,
|
|
11881
|
-
}
|
|
11789
|
+
} else {
|
|
11790
|
+
// clear stream object & timeout
|
|
11791
|
+
parent.sensor_types[112].utils.clear_globalDevices_stream(deviceAddr);
|
|
11792
|
+
|
|
11793
|
+
// init new stream
|
|
11794
|
+
parent.sensor_types[112].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
|
|
11795
|
+
|
|
11796
|
+
globalDevices[deviceAddr].last_packet_counter = current_packet;
|
|
11882
11797
|
globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
|
|
11883
11798
|
}
|
|
11884
|
-
|
|
11885
|
-
|
|
11886
|
-
|
|
11887
|
-
|
|
11888
|
-
|
|
11889
|
-
|
|
11890
|
-
|
|
11891
|
-
|
|
11892
|
-
var fft_concat = {};
|
|
11893
|
-
|
|
11894
|
-
var en_axis_data = {};
|
|
11895
|
-
en_axis_data.x_offset = 0;
|
|
11896
|
-
en_axis_data.y_offset = 2;
|
|
11897
|
-
en_axis_data.z_offset = 4;
|
|
11898
|
-
en_axis_data.increment = 6;
|
|
11899
|
-
fft_concat = {x: [], y: [], z: []};
|
|
11900
|
-
|
|
11901
|
-
var fsr_mult = .00006;
|
|
11902
|
-
var fsr_text = "";
|
|
11903
|
-
switch(globalDevices[deviceAddr].fsr){
|
|
11904
|
-
case 0:
|
|
11905
|
-
fsr_mult = 0.00006;
|
|
11906
|
-
break;
|
|
11907
|
-
case 1:
|
|
11908
|
-
fsr_mult = 0.00012;
|
|
11909
|
-
break;
|
|
11910
|
-
case 2:
|
|
11911
|
-
fsr_mult = 0.00024;
|
|
11912
|
-
break;
|
|
11913
|
-
case 3:
|
|
11914
|
-
fsr_mult = 0.00049;
|
|
11915
|
-
break;
|
|
11916
|
-
}
|
|
11917
|
-
switch(globalDevices[deviceAddr].fsr){
|
|
11918
|
-
case 0:
|
|
11919
|
-
fsr_text = "2g";
|
|
11920
|
-
break;
|
|
11921
|
-
case 1:
|
|
11922
|
-
fsr_text = "4g";
|
|
11923
|
-
break;
|
|
11924
|
-
case 2:
|
|
11925
|
-
fsr_text = "8g";
|
|
11926
|
-
break;
|
|
11927
|
-
case 3:
|
|
11928
|
-
fsr_text = "16g";
|
|
11929
|
-
break;
|
|
11930
|
-
}
|
|
11931
|
-
|
|
11932
|
-
for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
|
|
11933
|
-
label++;
|
|
11934
|
-
|
|
11935
|
-
if('x_offset' in en_axis_data){
|
|
11936
|
-
fft_concat.x.push(parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(2)));
|
|
11937
|
-
}
|
|
11938
|
-
if('y_offset' in en_axis_data){
|
|
11939
|
-
fft_concat.y.push(parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(2)));
|
|
11940
|
-
}
|
|
11941
|
-
if('z_offset' in en_axis_data){
|
|
11942
|
-
fft_concat.z.push(parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(2)));
|
|
11943
|
-
}
|
|
11944
|
-
}
|
|
11945
|
-
var fft_concat_obj = {
|
|
11946
|
-
mode: payload[8],
|
|
11947
|
-
msg_type: msg_type,
|
|
11948
|
-
time_id: [
|
|
11949
|
-
String(globalDevices[deviceAddr].hour).padStart(2, '0'),
|
|
11950
|
-
String(globalDevices[deviceAddr].minute).padStart(2, '0'),
|
|
11951
|
-
].join(':'),
|
|
11952
|
-
mac_address: deviceAddr,
|
|
11953
|
-
fsr: fsr_text,
|
|
11954
|
-
odr: globalDevices[deviceAddr].odr,
|
|
11955
|
-
temperature: globalDevices[deviceAddr].temperature,
|
|
11956
|
-
total_samples: label,
|
|
11957
|
-
data: fft_concat
|
|
11958
|
-
};
|
|
11959
|
-
// console.log(globalDevices[deviceAddr].data);
|
|
11960
|
-
// console.log(raw_data);
|
|
11961
|
-
sensor_data = fft_concat_obj;
|
|
11962
|
-
// parsed.raw_packets = globalDevices[deviceAddr].data;
|
|
11963
|
-
// parsed.raw_data = raw_data;
|
|
11964
|
-
delete globalDevices[deviceAddr];
|
|
11965
|
-
if(this.hasOwnProperty('failure_no')){
|
|
11966
|
-
console.log('####falure no');
|
|
11967
|
-
console.log(this.failure_no);
|
|
11968
|
-
}
|
|
11969
|
-
|
|
11970
|
-
return sensor_data;
|
|
11971
|
-
}
|
|
11972
|
-
else{
|
|
11973
|
-
return;
|
|
11974
|
-
}
|
|
11975
|
-
}else{
|
|
11976
|
-
|
|
11977
|
-
var mode = payload[8];
|
|
11978
|
-
var odr = msbLsb(payload[9], payload[10]);
|
|
11979
|
-
var fsr = payload[11] >> 5;
|
|
11980
|
-
var temperature = msbLsb(payload[14], payload[15])/100;
|
|
11981
|
-
|
|
11982
|
-
globalDevices[deviceAddr] = {
|
|
11983
|
-
// stream_size: expected_packets,
|
|
11984
|
-
data: {},
|
|
11985
|
-
odr: odr,
|
|
11986
|
-
mo: mode,
|
|
11987
|
-
fsr: fsr,
|
|
11988
|
-
hour: hour,
|
|
11989
|
-
minute: minute,
|
|
11990
|
-
temperature: temperature,
|
|
11991
|
-
}
|
|
11799
|
+
} else {
|
|
11800
|
+
// clear stream object & timeout
|
|
11801
|
+
parent.sensor_types[112].utils.clear_globalDevices_stream(deviceAddr);
|
|
11802
|
+
|
|
11803
|
+
// init new stream
|
|
11804
|
+
parent.sensor_types[112].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
|
|
11805
|
+
|
|
11806
|
+
globalDevices[deviceAddr].last_packet_counter = current_packet;
|
|
11992
11807
|
globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
|
|
11808
|
+
}
|
|
11809
|
+
if (current_packet == expected_packets) {
|
|
11810
|
+
// concatenate stream
|
|
11811
|
+
sensor_data = parent.sensor_types[112].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
|
|
11812
|
+
// clear stream object & timeout
|
|
11813
|
+
parent.sensor_types[112].utils.clear_globalDevices_stream(deviceAddr);
|
|
11814
|
+
return sensor_data;
|
|
11815
|
+
} else {
|
|
11993
11816
|
return;
|
|
11994
11817
|
}
|
|
11995
11818
|
}
|
|
@@ -12068,6 +11891,119 @@ function sensor_types(parent){
|
|
|
12068
11891
|
// return parsed;
|
|
12069
11892
|
// }
|
|
12070
11893
|
},
|
|
11894
|
+
'utils': {
|
|
11895
|
+
'clear_globalDevices_stream': (deviceAddr) => {
|
|
11896
|
+
if(Object.hasOwn(globalDevices, deviceAddr)){
|
|
11897
|
+
if(Object.hasOwn(globalDevices[deviceAddr], 'packet_stream_timeout')){
|
|
11898
|
+
clearTimeout(globalDevices[deviceAddr].packet_stream_timeout);
|
|
11899
|
+
}
|
|
11900
|
+
delete globalDevices[deviceAddr];
|
|
11901
|
+
}
|
|
11902
|
+
},
|
|
11903
|
+
'init_globalDevices_stream'(deviceAddr, payload, expected_packets, parsed, msg_type){
|
|
11904
|
+
globalDevices[deviceAddr] = {
|
|
11905
|
+
data: {},
|
|
11906
|
+
odr: msbLsb(payload[9], payload[10]),
|
|
11907
|
+
mo: payload[8],
|
|
11908
|
+
fsr: payload[11] >> 5,
|
|
11909
|
+
hour: payload[12],
|
|
11910
|
+
minute: payload[13],
|
|
11911
|
+
temperature: msbLsb(payload[14], payload[15]) / 100,
|
|
11912
|
+
expected_packets: expected_packets
|
|
11913
|
+
}
|
|
11914
|
+
globalDevices[deviceAddr].packet_stream_timeout = setTimeout(() => {
|
|
11915
|
+
parsed.sensor_data = parent.sensor_types[112].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
|
|
11916
|
+
parsed.sensor_data.error = 'Time Series Data Stream Timeout - incomplete data received';
|
|
11917
|
+
|
|
11918
|
+
parsed.sensor_name = parent.sensor_types[112].name;
|
|
11919
|
+
parsed.type = 'sensor_data';
|
|
11920
|
+
parsed.addr = deviceAddr;
|
|
11921
|
+
parsed.received = Date.now();
|
|
11922
|
+
|
|
11923
|
+
parent._emitter.emit('sensor_data', parsed);
|
|
11924
|
+
parent._emitter.emit('sensor_data-112', parsed);
|
|
11925
|
+
parent._emitter.emit('sensor_data'+'-'+deviceAddr, parsed);
|
|
11926
|
+
}, 60000);
|
|
11927
|
+
},
|
|
11928
|
+
'concat_fft_data': (deviceAddr, mode, msg_type) => {
|
|
11929
|
+
var raw_data = new Array();
|
|
11930
|
+
for(const packet in globalDevices[deviceAddr].data){
|
|
11931
|
+
raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
|
|
11932
|
+
}
|
|
11933
|
+
var label = 0;
|
|
11934
|
+
|
|
11935
|
+
var fft_concat = {};
|
|
11936
|
+
|
|
11937
|
+
var en_axis_data = {};
|
|
11938
|
+
en_axis_data.x_offset = 0;
|
|
11939
|
+
en_axis_data.y_offset = 2;
|
|
11940
|
+
en_axis_data.z_offset = 4;
|
|
11941
|
+
en_axis_data.increment = 6;
|
|
11942
|
+
fft_concat = {x: [], y: [], z: []};
|
|
11943
|
+
|
|
11944
|
+
var fsr_mult = .00006;
|
|
11945
|
+
var fsr_text = "";
|
|
11946
|
+
|
|
11947
|
+
switch(globalDevices[deviceAddr].fsr){
|
|
11948
|
+
case 0:
|
|
11949
|
+
fsr_mult = 0.00006;
|
|
11950
|
+
break;
|
|
11951
|
+
case 1:
|
|
11952
|
+
fsr_mult = 0.00012;
|
|
11953
|
+
break;
|
|
11954
|
+
case 2:
|
|
11955
|
+
fsr_mult = 0.00024;
|
|
11956
|
+
break;
|
|
11957
|
+
case 3:
|
|
11958
|
+
fsr_mult = 0.00049;
|
|
11959
|
+
break;
|
|
11960
|
+
}
|
|
11961
|
+
switch(globalDevices[deviceAddr].fsr){
|
|
11962
|
+
case 0:
|
|
11963
|
+
fsr_text = "2g";
|
|
11964
|
+
break;
|
|
11965
|
+
case 1:
|
|
11966
|
+
fsr_text = "4g";
|
|
11967
|
+
break;
|
|
11968
|
+
case 2:
|
|
11969
|
+
fsr_text = "8g";
|
|
11970
|
+
break;
|
|
11971
|
+
case 3:
|
|
11972
|
+
fsr_text = "16g";
|
|
11973
|
+
break;
|
|
11974
|
+
}
|
|
11975
|
+
|
|
11976
|
+
for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
|
|
11977
|
+
label++;
|
|
11978
|
+
|
|
11979
|
+
if('x_offset' in en_axis_data){
|
|
11980
|
+
fft_concat.x.push(parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(2)));
|
|
11981
|
+
}
|
|
11982
|
+
if('y_offset' in en_axis_data){
|
|
11983
|
+
fft_concat.y.push(parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(2)));
|
|
11984
|
+
}
|
|
11985
|
+
if('z_offset' in en_axis_data){
|
|
11986
|
+
fft_concat.z.push(parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(2)));
|
|
11987
|
+
}
|
|
11988
|
+
}
|
|
11989
|
+
var fft_concat_obj = {
|
|
11990
|
+
mode: mode,
|
|
11991
|
+
msg_type: msg_type,
|
|
11992
|
+
time_id: [
|
|
11993
|
+
String(globalDevices[deviceAddr].hour).padStart(2, '0'),
|
|
11994
|
+
String(globalDevices[deviceAddr].minute).padStart(2, '0'),
|
|
11995
|
+
].join(':'),
|
|
11996
|
+
mac_address: deviceAddr,
|
|
11997
|
+
fsr: fsr_text,
|
|
11998
|
+
odr: globalDevices[deviceAddr].odr,
|
|
11999
|
+
temperature: globalDevices[deviceAddr].temperature,
|
|
12000
|
+
total_samples: label,
|
|
12001
|
+
fft_confidence : ((Object.keys(globalDevices[deviceAddr].data).length / globalDevices[deviceAddr].expected_packets) * 100).toFixed(2) + '%',
|
|
12002
|
+
data: fft_concat
|
|
12003
|
+
};
|
|
12004
|
+
return fft_concat_obj;
|
|
12005
|
+
}
|
|
12006
|
+
},
|
|
12071
12007
|
'parse_fly': (frame) => {
|
|
12072
12008
|
let frame_data = {};
|
|
12073
12009
|
switch(frame[16]){
|
|
@@ -12440,9 +12376,9 @@ function sensor_types(parent){
|
|
|
12440
12376
|
let msg_type = (payload[7] & 16)? 'motion' : 'regular';
|
|
12441
12377
|
if(payload[8] === 1){
|
|
12442
12378
|
var deviceAddr = mac;
|
|
12443
|
-
var firmware = payload[1];
|
|
12444
|
-
var hour = payload[12];
|
|
12445
|
-
var minute = payload[13];
|
|
12379
|
+
// var firmware = payload[1];
|
|
12380
|
+
// var hour = payload[12];
|
|
12381
|
+
// var minute = payload[13];
|
|
12446
12382
|
var expected_packets = msbLsb(payload[16], payload[17]);
|
|
12447
12383
|
var current_packet = msbLsb(payload[18], payload[19]);
|
|
12448
12384
|
var sdata_start = 20;
|
|
@@ -12456,23 +12392,13 @@ function sensor_types(parent){
|
|
|
12456
12392
|
}
|
|
12457
12393
|
// if current packet is equal to 1 or last packet counter is higher thant current packet
|
|
12458
12394
|
if(current_packet == 1 || (globalDevices[deviceAddr].last_packet_counter > current_packet)){
|
|
12459
|
-
|
|
12460
|
-
|
|
12461
|
-
|
|
12462
|
-
|
|
12463
|
-
|
|
12464
|
-
|
|
12465
|
-
var temperature = msbLsb(payload[14], payload[15])/100;
|
|
12395
|
+
console.log('Recovering bad packet');
|
|
12396
|
+
// clear stream object & timeout
|
|
12397
|
+
parent.sensor_types[114].utils.clear_globalDevices_stream(deviceAddr);
|
|
12398
|
+
|
|
12399
|
+
// init new stream
|
|
12400
|
+
parent.sensor_types[114].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
|
|
12466
12401
|
|
|
12467
|
-
globalDevices[deviceAddr] = {
|
|
12468
|
-
data: {},
|
|
12469
|
-
odr: odr,
|
|
12470
|
-
mo: mode,
|
|
12471
|
-
fsr: fsr,
|
|
12472
|
-
hour: hour,
|
|
12473
|
-
minute: minute,
|
|
12474
|
-
temperature: temperature,
|
|
12475
|
-
}
|
|
12476
12402
|
globalDevices[deviceAddr].last_packet_counter = current_packet;
|
|
12477
12403
|
globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
|
|
12478
12404
|
return;
|
|
@@ -12483,121 +12409,31 @@ function sensor_types(parent){
|
|
|
12483
12409
|
}
|
|
12484
12410
|
}
|
|
12485
12411
|
else{
|
|
12486
|
-
|
|
12487
|
-
|
|
12488
|
-
|
|
12489
|
-
|
|
12412
|
+
// clear stream object & timeout
|
|
12413
|
+
parent.sensor_types[114].utils.clear_globalDevices_stream(deviceAddr);
|
|
12414
|
+
|
|
12415
|
+
// init new stream
|
|
12416
|
+
parent.sensor_types[114].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
|
|
12490
12417
|
|
|
12491
|
-
globalDevices[deviceAddr] = {
|
|
12492
|
-
data: {},
|
|
12493
|
-
odr: odr,
|
|
12494
|
-
mo: mode,
|
|
12495
|
-
fsr: fsr,
|
|
12496
|
-
hour: hour,
|
|
12497
|
-
minute: minute,
|
|
12498
|
-
temperature: temperature,
|
|
12499
|
-
}
|
|
12500
12418
|
globalDevices[deviceAddr].last_packet_counter = current_packet;
|
|
12501
12419
|
globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
|
|
12502
12420
|
}
|
|
12503
12421
|
}
|
|
12504
12422
|
else{
|
|
12505
|
-
|
|
12506
|
-
|
|
12507
|
-
|
|
12508
|
-
|
|
12423
|
+
// clear stream object & timeout
|
|
12424
|
+
parent.sensor_types[114].utils.clear_globalDevices_stream(deviceAddr);
|
|
12425
|
+
|
|
12426
|
+
// init new stream
|
|
12427
|
+
parent.sensor_types[114].utils.init_globalDevices_stream(deviceAddr, payload, expected_packets, parsed, msg_type);
|
|
12509
12428
|
|
|
12510
|
-
globalDevices[deviceAddr] = {
|
|
12511
|
-
data: {},
|
|
12512
|
-
odr: odr,
|
|
12513
|
-
mo: mode,
|
|
12514
|
-
fsr: fsr,
|
|
12515
|
-
hour: hour,
|
|
12516
|
-
minute: minute,
|
|
12517
|
-
temperature: temperature,
|
|
12518
|
-
}
|
|
12519
12429
|
globalDevices[deviceAddr].last_packet_counter = current_packet;
|
|
12520
12430
|
globalDevices[deviceAddr].data[current_packet] = payload.slice(sdata_start);
|
|
12521
12431
|
}
|
|
12522
12432
|
if(current_packet == expected_packets){
|
|
12523
|
-
|
|
12524
|
-
|
|
12525
|
-
|
|
12526
|
-
|
|
12527
|
-
var label = 0;
|
|
12528
|
-
|
|
12529
|
-
var fft = new Array();
|
|
12530
|
-
var fft_concat = {};
|
|
12531
|
-
|
|
12532
|
-
var en_axis_data = {};
|
|
12533
|
-
en_axis_data.x_offset = 0;
|
|
12534
|
-
en_axis_data.y_offset = 2;
|
|
12535
|
-
en_axis_data.z_offset = 4;
|
|
12536
|
-
en_axis_data.increment = 6;
|
|
12537
|
-
fft_concat = {x: [], y: [], z: []};
|
|
12538
|
-
|
|
12539
|
-
var fsr_mult = .00006;
|
|
12540
|
-
var fsr_text = "";
|
|
12541
|
-
|
|
12542
|
-
switch(globalDevices[deviceAddr].fsr){
|
|
12543
|
-
case 0:
|
|
12544
|
-
fsr_mult = 0.00006;
|
|
12545
|
-
break;
|
|
12546
|
-
case 1:
|
|
12547
|
-
fsr_mult = 0.00012;
|
|
12548
|
-
break;
|
|
12549
|
-
case 2:
|
|
12550
|
-
fsr_mult = 0.00024;
|
|
12551
|
-
break;
|
|
12552
|
-
case 3:
|
|
12553
|
-
fsr_mult = 0.00049;
|
|
12554
|
-
break;
|
|
12555
|
-
}
|
|
12556
|
-
switch(globalDevices[deviceAddr].fsr){
|
|
12557
|
-
case 0:
|
|
12558
|
-
fsr_text = "2g";
|
|
12559
|
-
break;
|
|
12560
|
-
case 1:
|
|
12561
|
-
fsr_text = "4g";
|
|
12562
|
-
break;
|
|
12563
|
-
case 2:
|
|
12564
|
-
fsr_text = "8g";
|
|
12565
|
-
break;
|
|
12566
|
-
case 3:
|
|
12567
|
-
fsr_text = "16g";
|
|
12568
|
-
break;
|
|
12569
|
-
}
|
|
12570
|
-
|
|
12571
|
-
for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
|
|
12572
|
-
label++;
|
|
12573
|
-
|
|
12574
|
-
if('x_offset' in en_axis_data){
|
|
12575
|
-
fft_concat.x.push(parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(2)));
|
|
12576
|
-
}
|
|
12577
|
-
if('y_offset' in en_axis_data){
|
|
12578
|
-
fft_concat.y.push(parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(2)));
|
|
12579
|
-
}
|
|
12580
|
-
if('z_offset' in en_axis_data){
|
|
12581
|
-
fft_concat.z.push(parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(2)));
|
|
12582
|
-
}
|
|
12583
|
-
}
|
|
12584
|
-
var fft_concat_obj = {
|
|
12585
|
-
mode: payload[8],
|
|
12586
|
-
msg_type: msg_type,
|
|
12587
|
-
time_id: [
|
|
12588
|
-
String(globalDevices[deviceAddr].hour).padStart(2, '0'),
|
|
12589
|
-
String(globalDevices[deviceAddr].minute).padStart(2, '0'),
|
|
12590
|
-
].join(':'),
|
|
12591
|
-
mac_address: deviceAddr,
|
|
12592
|
-
fsr: fsr_text,
|
|
12593
|
-
odr: globalDevices[deviceAddr].odr,
|
|
12594
|
-
temperature: globalDevices[deviceAddr].temperature,
|
|
12595
|
-
total_samples: label,
|
|
12596
|
-
fft_confidence : ((Object.keys(globalDevices[deviceAddr].data).length / expected_packets) * 100).toFixed(2) + '%',
|
|
12597
|
-
data: fft_concat
|
|
12598
|
-
};
|
|
12599
|
-
sensor_data = fft_concat_obj;
|
|
12600
|
-
delete globalDevices[deviceAddr];
|
|
12433
|
+
// concatenate stream
|
|
12434
|
+
sensor_data = parent.sensor_types[114].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
|
|
12435
|
+
// clear stream object & timeout
|
|
12436
|
+
parent.sensor_types[114].utils.clear_globalDevices_stream(deviceAddr);
|
|
12601
12437
|
return sensor_data;
|
|
12602
12438
|
}
|
|
12603
12439
|
else{
|
|
@@ -12678,6 +12514,114 @@ function sensor_types(parent){
|
|
|
12678
12514
|
// return parsed;
|
|
12679
12515
|
// }
|
|
12680
12516
|
},
|
|
12517
|
+
'utils': {
|
|
12518
|
+
'clear_globalDevices_stream': (deviceAddr) => {
|
|
12519
|
+
if(Object.hasOwn(globalDevices, deviceAddr)){
|
|
12520
|
+
if(Object.hasOwn(globalDevices[deviceAddr], 'packet_stream_timeout')){
|
|
12521
|
+
clearTimeout(globalDevices[deviceAddr].packet_stream_timeout);
|
|
12522
|
+
}
|
|
12523
|
+
delete globalDevices[deviceAddr];
|
|
12524
|
+
}
|
|
12525
|
+
},
|
|
12526
|
+
'init_globalDevices_stream'(deviceAddr, payload, expected_packets, parsed, msg_type){
|
|
12527
|
+
globalDevices[deviceAddr] = {
|
|
12528
|
+
data: {},
|
|
12529
|
+
odr: msbLsb(payload[9], payload[10]),
|
|
12530
|
+
mo: payload[8],
|
|
12531
|
+
fsr: payload[11] >> 5,
|
|
12532
|
+
hour: payload[12],
|
|
12533
|
+
minute: payload[13],
|
|
12534
|
+
temperature: msbLsb(payload[14], payload[15]) / 100,
|
|
12535
|
+
expected_packets: expected_packets
|
|
12536
|
+
}
|
|
12537
|
+
globalDevices[deviceAddr].packet_stream_timeout = setTimeout(() => {
|
|
12538
|
+
parsed.sensor_data = parent.sensor_types[114].utils.concat_fft_data(deviceAddr, payload[8], msg_type);
|
|
12539
|
+
parsed.sensor_data.error = 'Time Series Data Stream Timeout - incomplete data received';
|
|
12540
|
+
|
|
12541
|
+
parent._emitter.emit('sensor_data', parsed);
|
|
12542
|
+
parent._emitter.emit('sensor_data-114', parsed);
|
|
12543
|
+
parent._emitter.emit('sensor_data'+'-'+deviceAddr, parsed);
|
|
12544
|
+
}, 60000);
|
|
12545
|
+
},
|
|
12546
|
+
'concat_fft_data': (deviceAddr, mode, msg_type) => {
|
|
12547
|
+
var raw_data = new Array();
|
|
12548
|
+
for(const packet in globalDevices[deviceAddr].data){
|
|
12549
|
+
raw_data = raw_data.concat(globalDevices[deviceAddr].data[packet]);
|
|
12550
|
+
}
|
|
12551
|
+
var label = 0;
|
|
12552
|
+
|
|
12553
|
+
var fft_concat = {};
|
|
12554
|
+
|
|
12555
|
+
var en_axis_data = {};
|
|
12556
|
+
en_axis_data.x_offset = 0;
|
|
12557
|
+
en_axis_data.y_offset = 2;
|
|
12558
|
+
en_axis_data.z_offset = 4;
|
|
12559
|
+
en_axis_data.increment = 6;
|
|
12560
|
+
fft_concat = {x: [], y: [], z: []};
|
|
12561
|
+
|
|
12562
|
+
var fsr_mult = .00006;
|
|
12563
|
+
var fsr_text = "";
|
|
12564
|
+
|
|
12565
|
+
switch(globalDevices[deviceAddr].fsr){
|
|
12566
|
+
case 0:
|
|
12567
|
+
fsr_mult = 0.00006;
|
|
12568
|
+
break;
|
|
12569
|
+
case 1:
|
|
12570
|
+
fsr_mult = 0.00012;
|
|
12571
|
+
break;
|
|
12572
|
+
case 2:
|
|
12573
|
+
fsr_mult = 0.00024;
|
|
12574
|
+
break;
|
|
12575
|
+
case 3:
|
|
12576
|
+
fsr_mult = 0.00049;
|
|
12577
|
+
break;
|
|
12578
|
+
}
|
|
12579
|
+
switch(globalDevices[deviceAddr].fsr){
|
|
12580
|
+
case 0:
|
|
12581
|
+
fsr_text = "2g";
|
|
12582
|
+
break;
|
|
12583
|
+
case 1:
|
|
12584
|
+
fsr_text = "4g";
|
|
12585
|
+
break;
|
|
12586
|
+
case 2:
|
|
12587
|
+
fsr_text = "8g";
|
|
12588
|
+
break;
|
|
12589
|
+
case 3:
|
|
12590
|
+
fsr_text = "16g";
|
|
12591
|
+
break;
|
|
12592
|
+
}
|
|
12593
|
+
|
|
12594
|
+
for(var i = 0; i < raw_data.length; i+=en_axis_data.increment){
|
|
12595
|
+
label++;
|
|
12596
|
+
|
|
12597
|
+
if('x_offset' in en_axis_data){
|
|
12598
|
+
fft_concat.x.push(parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(2)));
|
|
12599
|
+
}
|
|
12600
|
+
if('y_offset' in en_axis_data){
|
|
12601
|
+
fft_concat.y.push(parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(2)));
|
|
12602
|
+
}
|
|
12603
|
+
if('z_offset' in en_axis_data){
|
|
12604
|
+
fft_concat.z.push(parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(2)));
|
|
12605
|
+
}
|
|
12606
|
+
}
|
|
12607
|
+
var fft_concat_obj = {
|
|
12608
|
+
mode: mode,
|
|
12609
|
+
msg_type: msg_type,
|
|
12610
|
+
time_id: [
|
|
12611
|
+
String(globalDevices[deviceAddr].hour).padStart(2, '0'),
|
|
12612
|
+
String(globalDevices[deviceAddr].minute).padStart(2, '0'),
|
|
12613
|
+
].join(':'),
|
|
12614
|
+
mac_address: deviceAddr,
|
|
12615
|
+
fsr: fsr_text,
|
|
12616
|
+
odr: globalDevices[deviceAddr].odr,
|
|
12617
|
+
temperature: globalDevices[deviceAddr].temperature,
|
|
12618
|
+
total_samples: label,
|
|
12619
|
+
fft_confidence : ((Object.keys(globalDevices[deviceAddr].data).length / globalDevices[deviceAddr].expected_packets) * 100).toFixed(2) + '%',
|
|
12620
|
+
data: fft_concat
|
|
12621
|
+
};
|
|
12622
|
+
return fft_concat_obj;
|
|
12623
|
+
}
|
|
12624
|
+
},
|
|
12681
12625
|
'parse_fly': (frame) => {
|
|
12682
12626
|
let frame_data = {};
|
|
12683
12627
|
switch(frame[16]){
|
|
@@ -14562,12 +14506,85 @@ function sensor_types(parent){
|
|
|
14562
14506
|
parsed.data = {error: 'Error found, Load cell comm error'};
|
|
14563
14507
|
return parsed;
|
|
14564
14508
|
}
|
|
14565
|
-
|
|
14566
|
-
|
|
14567
|
-
|
|
14509
|
+
let firmware = d[1];
|
|
14510
|
+
if(firmware > 4){
|
|
14511
|
+
let unit = 'Lb';
|
|
14512
|
+
switch(d[12]){
|
|
14513
|
+
case 1:
|
|
14514
|
+
unit = 'Lb';
|
|
14515
|
+
break;
|
|
14516
|
+
case 2:
|
|
14517
|
+
unit = 'Kg';
|
|
14518
|
+
break;
|
|
14519
|
+
}
|
|
14520
|
+
return{
|
|
14521
|
+
weight: signInt(d.slice(8, 12).reduce(msbLsb), 32) / 100,
|
|
14522
|
+
unit: unit,
|
|
14523
|
+
raw_adc: signInt(d.slice(13, 17).reduce(msbLsb), 32)
|
|
14524
|
+
}
|
|
14525
|
+
}
|
|
14526
|
+
else {
|
|
14527
|
+
return {
|
|
14528
|
+
weight: signInt(d.slice(8, 12).reduce(msbLsb), 32) / 100
|
|
14529
|
+
};
|
|
14530
|
+
}
|
|
14568
14531
|
},
|
|
14569
14532
|
'parse_fly': (frame) => {
|
|
14570
|
-
if(frame[2] >
|
|
14533
|
+
if(frame[2] > 4){
|
|
14534
|
+
let date = [
|
|
14535
|
+
String(frame.slice(20, 22).reduce(msbLsb)),
|
|
14536
|
+
String(frame[22]).padStart(2, '0'),
|
|
14537
|
+
String(frame[23]).padStart(2, '0')
|
|
14538
|
+
].join('-');
|
|
14539
|
+
let time = [
|
|
14540
|
+
String(frame[24]).padStart(2, '0'),
|
|
14541
|
+
String(frame[25]).padStart(2, '0'),
|
|
14542
|
+
String(frame[26]).padStart(2, '0')
|
|
14543
|
+
].join(':');
|
|
14544
|
+
let screen_on_time = "always_off";
|
|
14545
|
+
switch(frame[27]){
|
|
14546
|
+
case 0:
|
|
14547
|
+
screen_on_time = "always_off";
|
|
14548
|
+
break;
|
|
14549
|
+
case 255:
|
|
14550
|
+
screen_on_time = "always_on";
|
|
14551
|
+
break;
|
|
14552
|
+
default:
|
|
14553
|
+
screen_on_time = frame[27] + "Sec";
|
|
14554
|
+
break;
|
|
14555
|
+
}
|
|
14556
|
+
let unit = "Lb";
|
|
14557
|
+
switch(frame[28]){
|
|
14558
|
+
case 1:
|
|
14559
|
+
unit = "Lb";
|
|
14560
|
+
break;
|
|
14561
|
+
case 2:
|
|
14562
|
+
unit = "Kg";
|
|
14563
|
+
break;
|
|
14564
|
+
}
|
|
14565
|
+
return {
|
|
14566
|
+
'firmware': frame[2],
|
|
14567
|
+
'calibration_tare': frame.slice(12, 16).reduce(msbLsb),
|
|
14568
|
+
'tare_counter': frame.slice(16, 20).reduce(msbLsb),
|
|
14569
|
+
'timestamp': date + "T" + time,
|
|
14570
|
+
'screen_on_time': screen_on_time,
|
|
14571
|
+
'weight_unit': unit,
|
|
14572
|
+
'hardware_id': frame.slice(29, 32),
|
|
14573
|
+
'report_rate': frame.slice(32, 36).reduce(msbLsb) + "Sec",
|
|
14574
|
+
'tx_life_counter': frame.slice(36, 40).reduce(msbLsb),
|
|
14575
|
+
'machine_values': {
|
|
14576
|
+
'firmware': frame[2],
|
|
14577
|
+
'calibration_tare': frame.slice(12, 16).reduce(msbLsb),
|
|
14578
|
+
'tare_counter': frame.slice(16, 20).reduce(msbLsb),
|
|
14579
|
+
'timestamp': date + "T" + time,
|
|
14580
|
+
'screen_on_time': screen_on_time,
|
|
14581
|
+
'weight_unit': unit,
|
|
14582
|
+
'hardware_id': frame.slice(29, 32),
|
|
14583
|
+
'report_rate': frame.slice(32, 36).reduce(msbLsb),
|
|
14584
|
+
'tx_life_counter': frame.slice(36, 40).reduce(msbLsb)
|
|
14585
|
+
}
|
|
14586
|
+
}
|
|
14587
|
+
}else if(frame[2] == 4){
|
|
14571
14588
|
let date = [
|
|
14572
14589
|
String(frame.slice(20, 22).reduce(msbLsb)),
|
|
14573
14590
|
String(frame[22]).padStart(2, '0'),
|