@ncd-io/node-red-enterprise-sensors 0.1.14 → 0.1.16
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/DigiParser.js +2 -1
- package/lib/WirelessGateway.js +286 -42
- package/package.json +1 -1
- package/wireless.html +5 -3
- package/wireless.js +57 -1
package/lib/DigiParser.js
CHANGED
|
@@ -172,7 +172,8 @@ class outgoingFrame{
|
|
|
172
172
|
var config = this.transmissionOptions(opts);
|
|
173
173
|
var frame = [17, this.master.getId()];
|
|
174
174
|
frame.push(...mac);
|
|
175
|
-
|
|
175
|
+
var stuff = [255, 254, source, destination, cluster[0], cluster[1], profile[0], profile[1], (config >> 8), (config & 255)];
|
|
176
|
+
frame.push(...stuff);
|
|
176
177
|
if(data.constructor != Array) data = [data];
|
|
177
178
|
frame.push(...data);
|
|
178
179
|
return this.master._send(frame);
|
package/lib/WirelessGateway.js
CHANGED
|
@@ -10,6 +10,12 @@ module.exports = class WirelessSensor{
|
|
|
10
10
|
this.sensor_pool = {};
|
|
11
11
|
this.sensor_types = sensor_types(this);
|
|
12
12
|
this.queue = new Queue(1);
|
|
13
|
+
|
|
14
|
+
//route info and link quality objects
|
|
15
|
+
this.mesh_map = {};
|
|
16
|
+
this.link_quality = {};
|
|
17
|
+
this.query_pool = {};
|
|
18
|
+
|
|
13
19
|
this.payloadType = {
|
|
14
20
|
'122': 'power_up',
|
|
15
21
|
'124': 'config_ack',
|
|
@@ -27,10 +33,21 @@ module.exports = class WirelessSensor{
|
|
|
27
33
|
console.log(e);
|
|
28
34
|
}
|
|
29
35
|
}
|
|
36
|
+
function routeReceiver(frame){
|
|
37
|
+
that.parse_route_information_packet(frame);
|
|
38
|
+
}
|
|
39
|
+
function linkQualtiyReceiver(frame){
|
|
40
|
+
that.parse_link_quality_packet(frame);
|
|
41
|
+
}
|
|
42
|
+
|
|
30
43
|
this.digi.on('receive_packet', receiver);
|
|
44
|
+
this.digi.on('explicit_rx_indicator', linkQualtiyReceiver);
|
|
45
|
+
this.digi.on('route_information_packet', routeReceiver);
|
|
31
46
|
this.on('close', () => {
|
|
32
47
|
//console.log('removing listener');
|
|
33
48
|
this.digi._emitter.removeListener('receive_packet', receiver);
|
|
49
|
+
this.digi._emitter.removeListener('explicit_rx_indicator',linkQualtiyReceiver);
|
|
50
|
+
this.digi._emitter.removeListener('route_information_packet',routeReceiver);
|
|
34
51
|
});
|
|
35
52
|
}
|
|
36
53
|
send_control(type, mac, msg){
|
|
@@ -47,6 +64,64 @@ module.exports = class WirelessSensor{
|
|
|
47
64
|
this._emitter.emit('close');
|
|
48
65
|
this.digi.close();
|
|
49
66
|
}
|
|
67
|
+
|
|
68
|
+
parse_route_information_packet(frame){
|
|
69
|
+
var destination = frame.destination_mac;
|
|
70
|
+
var route_array = this.mesh_map[destination];
|
|
71
|
+
var index = this.query_pool[destination];
|
|
72
|
+
//This is the route packet from the modem
|
|
73
|
+
if(frame.source_mac == frame.responder_mac){
|
|
74
|
+
//Add Gateway MAC as first element of array.
|
|
75
|
+
route_array[0] = frame.source_mac;
|
|
76
|
+
//Add Receiver MAC as second item in array
|
|
77
|
+
route_array[1] = frame.receiver_mac;
|
|
78
|
+
if(frame.receiver_mac == frame.destination_mac){
|
|
79
|
+
//if receiver is the sensor then connection is direct from gateway to receiver so emit route info
|
|
80
|
+
var msg_obj = {};
|
|
81
|
+
msg_obj.route = route_array;
|
|
82
|
+
msg_obj.timestamp = Date.now();
|
|
83
|
+
this._emitter.emit("route_info",msg_obj);
|
|
84
|
+
}
|
|
85
|
+
}else{
|
|
86
|
+
//This is the final route packet
|
|
87
|
+
if(frame.receiver_mac == destination){
|
|
88
|
+
route_array.push(frame.receiver_mac);
|
|
89
|
+
var msg_obj = {};
|
|
90
|
+
msg_obj.route = route_array;
|
|
91
|
+
msg_obj.timestamp = Date.now();
|
|
92
|
+
this._emitter.emit("route_info",msg_obj);
|
|
93
|
+
delete this.query_pool[frame.destination_mac];
|
|
94
|
+
}else{
|
|
95
|
+
// This is an intermediate packet
|
|
96
|
+
if(frame.responder_mac == route_array[this.query_pool[destination]]){
|
|
97
|
+
route_array.push(frame.receiver_mac);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
}
|
|
102
|
+
//increment mesh hops index
|
|
103
|
+
this.query_pool[destination]++;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
parse_link_quality_packet(frame){
|
|
107
|
+
console.log("parse_link_quality_packet: "+frame);
|
|
108
|
+
var msg_obj = {};
|
|
109
|
+
msg_obj.source_address = frame.source_mac;
|
|
110
|
+
msg_obj.destination = toMac(frame.data.slice(0,8));
|
|
111
|
+
msg_obj.payload_size = msbLsb(frame.data[8],frame.data[9]);
|
|
112
|
+
msg_obj.iterations = msbLsb(frame.data[10], frame.data[11]);
|
|
113
|
+
msg_obj.successful_iterations = msbLsb(frame.data[12],frame.data[13]);
|
|
114
|
+
msg_obj.retries = msbLsb(frame.data[14],frame.data[15]);
|
|
115
|
+
msg_obj.result = frame.data[16] == 0 ? "success":"failed"
|
|
116
|
+
msg_obj.max_allowed_retries = frame.data[17];
|
|
117
|
+
msg_obj.max_rssi = 0 - frame.data[18];
|
|
118
|
+
msg_obj.min_rssi = 0 - frame.data[19];
|
|
119
|
+
msg_obj.avg_rssi = 0 - frame.data[20];
|
|
120
|
+
msg_obj.timestamp = Date.now();
|
|
121
|
+
|
|
122
|
+
this._emitter.emit("link_info",msg_obj);
|
|
123
|
+
}
|
|
124
|
+
|
|
50
125
|
parse(frame){
|
|
51
126
|
var type = this.payloadType[frame.data[0]];
|
|
52
127
|
if(typeof this[type] == 'function'){
|
|
@@ -62,7 +137,7 @@ module.exports = class WirelessSensor{
|
|
|
62
137
|
var new_mode = is_new;
|
|
63
138
|
var mode = (type == 'power_up') ? data.mode : ((type == 'sensor_data') ? 'RUN' : ((type == 'config_ack') ? 'ACK' : 'PGM'));
|
|
64
139
|
// #OTF
|
|
65
|
-
var otf_devices = [23,26,45,48,78,79,80,81,82,84,88,89,91,101,102,519,520,521,531,537];
|
|
140
|
+
var otf_devices = [23,26,39,45,48,52,78,79,80,81,82,84,88,89,91,101,102,107,519,520,521,531,537];
|
|
66
141
|
var device_type = msbLsb(frame.data[6], frame.data[7]);
|
|
67
142
|
// var device_type = frame.data[7];
|
|
68
143
|
|
|
@@ -214,7 +289,7 @@ module.exports = class WirelessSensor{
|
|
|
214
289
|
};
|
|
215
290
|
|
|
216
291
|
// #OTF
|
|
217
|
-
var otf_devices = [23,26,45,48,78,79,80,81,82,84,88,89,91,101,102,519,520,521,531,537];
|
|
292
|
+
var otf_devices = [23,26,39,45,48,52,78,79,80,81,82,84,88,89,91,101,102,107,519,520,521,531,537];
|
|
218
293
|
if(otf_devices.includes(parsed.sensor_type)){
|
|
219
294
|
// If the message says FLY and there is not FLY timer in progress.
|
|
220
295
|
if(payload[8] == 70 && payload[9] == 76 && payload[10] == 89) {
|
|
@@ -1515,6 +1590,123 @@ module.exports = class WirelessSensor{
|
|
|
1515
1590
|
});
|
|
1516
1591
|
});
|
|
1517
1592
|
}
|
|
1593
|
+
route_discover(sensor_mac, opts){
|
|
1594
|
+
var data = [85];
|
|
1595
|
+
var that = this;
|
|
1596
|
+
return new Promise((fulfill, reject) => {
|
|
1597
|
+
that.queue.add(() => {
|
|
1598
|
+
return new Promise((f, r) => {
|
|
1599
|
+
var failed = false;
|
|
1600
|
+
var retries = 0;
|
|
1601
|
+
var tO;
|
|
1602
|
+
function fail(packet){
|
|
1603
|
+
failed = true;
|
|
1604
|
+
clearTimeout(tO);
|
|
1605
|
+
that._emitter.removeListener('receive_packet-'+sensor_mac, pass);
|
|
1606
|
+
that._emitter.removeListener('transmit_status-'+sensor_mac, pass);
|
|
1607
|
+
reject({
|
|
1608
|
+
err: packet,
|
|
1609
|
+
sent: [sensor_mac, data]
|
|
1610
|
+
});
|
|
1611
|
+
r();
|
|
1612
|
+
}
|
|
1613
|
+
function pass(packet){
|
|
1614
|
+
if(failed) return;
|
|
1615
|
+
clearTimeout(tO);
|
|
1616
|
+
fulfill(packet);
|
|
1617
|
+
f();
|
|
1618
|
+
};
|
|
1619
|
+
|
|
1620
|
+
function send(){
|
|
1621
|
+
that.send.transmit_request(mac2bytes(sensor_mac), data, opts).then(function(frame){
|
|
1622
|
+
if(frame.delivery_status == 'Success'){
|
|
1623
|
+
pass(frame);
|
|
1624
|
+
}else{
|
|
1625
|
+
tO = setTimeout(() => {
|
|
1626
|
+
if(retries < 1){
|
|
1627
|
+
retries++;
|
|
1628
|
+
send();
|
|
1629
|
+
}else{
|
|
1630
|
+
fail('Control response timeout');
|
|
1631
|
+
}
|
|
1632
|
+
}, 1000);
|
|
1633
|
+
}
|
|
1634
|
+
}).catch(fail);
|
|
1635
|
+
}
|
|
1636
|
+
that.query_pool[sensor_mac] = 0;
|
|
1637
|
+
if(that.mesh_map.hasOwnProperty(sensor_mac)){
|
|
1638
|
+
delete that.mesh_map[sensor_mac];
|
|
1639
|
+
}
|
|
1640
|
+
that.mesh_map[sensor_mac] = [];
|
|
1641
|
+
if(that.link_quality.hasOwnProperty(sensor_mac)){
|
|
1642
|
+
delete that.link_quality[sensor_mac];
|
|
1643
|
+
}
|
|
1644
|
+
that.link_quality = {};
|
|
1645
|
+
send();
|
|
1646
|
+
});
|
|
1647
|
+
});
|
|
1648
|
+
});
|
|
1649
|
+
}
|
|
1650
|
+
link_test(source_mac,destination_mac,opts){
|
|
1651
|
+
var that = this;
|
|
1652
|
+
return new Promise((fulfill, reject) => {
|
|
1653
|
+
that.queue.add(() => {
|
|
1654
|
+
return new Promise((f, r) => {
|
|
1655
|
+
var failed = false;
|
|
1656
|
+
var retries = 0;
|
|
1657
|
+
var tO;
|
|
1658
|
+
function fail(packet){
|
|
1659
|
+
failed = true;
|
|
1660
|
+
clearTimeout(tO);
|
|
1661
|
+
that._emitter.removeListener('receive_packet-'+source_mac, pass);
|
|
1662
|
+
that._emitter.removeListener('transmit_status-'+source_mac, pass);
|
|
1663
|
+
reject({
|
|
1664
|
+
err: packet,
|
|
1665
|
+
sent: [source_mac]
|
|
1666
|
+
});
|
|
1667
|
+
r();
|
|
1668
|
+
}
|
|
1669
|
+
function pass(packet){
|
|
1670
|
+
if(failed) return;
|
|
1671
|
+
clearTimeout(tO);
|
|
1672
|
+
fulfill(packet);
|
|
1673
|
+
f();
|
|
1674
|
+
};
|
|
1675
|
+
|
|
1676
|
+
function send(){
|
|
1677
|
+
var cluster = [0,20];
|
|
1678
|
+
var profile = [193, 5];
|
|
1679
|
+
var data = [];
|
|
1680
|
+
data.push(...mac2bytes(destination_mac));
|
|
1681
|
+
var payload_size = [0,200];
|
|
1682
|
+
var iterations = [0,200];
|
|
1683
|
+
data.push(...payload_size);
|
|
1684
|
+
data.push(...iterations);
|
|
1685
|
+
|
|
1686
|
+
var hexArray = [];
|
|
1687
|
+
data.forEach((b) => hexArray.push(toHex(b)));
|
|
1688
|
+
|
|
1689
|
+
var opts = {"method":3};
|
|
1690
|
+
that.send.explicit_addressing_command(mac2bytes(source_mac), 230, 230, cluster, profile, data, opts).then(function(frame){
|
|
1691
|
+
if(frame.delivery_status == 'Success'){
|
|
1692
|
+
pass(frame);
|
|
1693
|
+
}else{
|
|
1694
|
+
tO = setTimeout(() => {
|
|
1695
|
+
if(retries < 1){
|
|
1696
|
+
retries++;
|
|
1697
|
+
send();
|
|
1698
|
+
}else{
|
|
1699
|
+
fail('Control response timeout');
|
|
1700
|
+
}
|
|
1701
|
+
}, 1000);
|
|
1702
|
+
}
|
|
1703
|
+
}).catch(fail);
|
|
1704
|
+
}
|
|
1705
|
+
send();
|
|
1706
|
+
});
|
|
1707
|
+
});
|
|
1708
|
+
});
|
|
1709
|
+
}
|
|
1518
1710
|
on(e,cb){this._emitter.on(e,cb);}
|
|
1519
1711
|
};
|
|
1520
1712
|
|
|
@@ -2038,18 +2230,37 @@ function sensor_types(parent){
|
|
|
2038
2230
|
'name': '24-Bit 6-Channel Current Monitor',
|
|
2039
2231
|
parse: (d) => {
|
|
2040
2232
|
return {
|
|
2041
|
-
|
|
2042
|
-
|
|
2043
|
-
|
|
2044
|
-
|
|
2045
|
-
|
|
2046
|
-
|
|
2233
|
+
ct1_rms: d.slice(0, 4).reduce(msbLsb),
|
|
2234
|
+
ct1_peak_1: d.slice(4, 6).reduce(msbLsb),
|
|
2235
|
+
ct1_peak_2: d.slice(6, 8).reduce(msbLsb),
|
|
2236
|
+
ct1_peak_3: d.slice(8, 10).reduce(msbLsb),
|
|
2237
|
+
ct2_rms: d.slice(10, 14).reduce(msbLsb),
|
|
2238
|
+
ct2_peak_1: d.slice(14, 16).reduce(msbLsb),
|
|
2239
|
+
ct2_peak_2: d.slice(16, 18).reduce(msbLsb),
|
|
2240
|
+
ct2_peak_3: d.slice(18, 20).reduce(msbLsb),
|
|
2241
|
+
ct3_rms: d.slice(20, 24).reduce(msbLsb),
|
|
2242
|
+
ct3_peak_1: d.slice(24, 26).reduce(msbLsb),
|
|
2243
|
+
ct3_peak_2: d.slice(26, 28).reduce(msbLsb),
|
|
2244
|
+
ct3_peak_3: d.slice(28, 30).reduce(msbLsb),
|
|
2245
|
+
ct4_rms: d.slice(30, 34).reduce(msbLsb),
|
|
2246
|
+
ct4_peak_1: d.slice(34, 36).reduce(msbLsb),
|
|
2247
|
+
ct4_peak_2: d.slice(36, 38).reduce(msbLsb),
|
|
2248
|
+
ct4_peak_3: d.slice(38, 40).reduce(msbLsb),
|
|
2249
|
+
ct5_rms: d.slice(40, 44).reduce(msbLsb),
|
|
2250
|
+
ct5_peak_1: d.slice(44, 46).reduce(msbLsb),
|
|
2251
|
+
ct5_peak_2: d.slice(46, 48).reduce(msbLsb),
|
|
2252
|
+
ct5_peak_3: d.slice(48, 50).reduce(msbLsb),
|
|
2253
|
+
ct6_rms: d.slice(50, 54).reduce(msbLsb),
|
|
2254
|
+
ct6_peak_1: d.slice(54, 56).reduce(msbLsb),
|
|
2255
|
+
ct6_peak_2: d.slice(56, 58).reduce(msbLsb),
|
|
2256
|
+
ct6_peak_3: d.slice(58, 60).reduce(msbLsb)
|
|
2047
2257
|
};
|
|
2048
2258
|
}
|
|
2049
2259
|
},
|
|
2050
2260
|
'52': {
|
|
2051
2261
|
name: '16-Bit 2-Channel 4-20mA',
|
|
2052
2262
|
parse: (d) => {
|
|
2263
|
+
// This parser may be outdated if a customer has an issue check with Engineering
|
|
2053
2264
|
var adc1 = signInt(d.slice(0, 2).reduce(msbLsb));
|
|
2054
2265
|
var adc2 = signInt(d.slice(2, 4).reduce(msbLsb));
|
|
2055
2266
|
return {
|
|
@@ -2589,13 +2800,13 @@ function sensor_types(parent){
|
|
|
2589
2800
|
fft_concat[label] = {};
|
|
2590
2801
|
|
|
2591
2802
|
if('x_offset' in en_axis_data){
|
|
2592
|
-
fft_concat[label].x = parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(
|
|
2803
|
+
fft_concat[label].x = 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));
|
|
2593
2804
|
}
|
|
2594
2805
|
if('y_offset' in en_axis_data){
|
|
2595
|
-
fft_concat[label].y = parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(
|
|
2806
|
+
fft_concat[label].y = 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));
|
|
2596
2807
|
}
|
|
2597
2808
|
if('z_offset' in en_axis_data){
|
|
2598
|
-
fft_concat[label].z = parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(
|
|
2809
|
+
fft_concat[label].z = 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));
|
|
2599
2810
|
}
|
|
2600
2811
|
}
|
|
2601
2812
|
var fft_concat_obj = {
|
|
@@ -3203,13 +3414,13 @@ function sensor_types(parent){
|
|
|
3203
3414
|
fft_concat[label] = {};
|
|
3204
3415
|
|
|
3205
3416
|
if('x_offset' in en_axis_data){
|
|
3206
|
-
fft_concat[label].x = parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(
|
|
3417
|
+
fft_concat[label].x = 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));
|
|
3207
3418
|
}
|
|
3208
3419
|
if('y_offset' in en_axis_data){
|
|
3209
|
-
fft_concat[label].y = parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(
|
|
3420
|
+
fft_concat[label].y = 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));
|
|
3210
3421
|
}
|
|
3211
3422
|
if('z_offset' in en_axis_data){
|
|
3212
|
-
fft_concat[label].z = parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(
|
|
3423
|
+
fft_concat[label].z = 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));
|
|
3213
3424
|
}
|
|
3214
3425
|
}
|
|
3215
3426
|
|
|
@@ -4003,13 +4214,13 @@ function sensor_types(parent){
|
|
|
4003
4214
|
fft_concat[label] = {};
|
|
4004
4215
|
|
|
4005
4216
|
if('x_offset' in en_axis_data){
|
|
4006
|
-
fft_concat[label].x = parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(
|
|
4217
|
+
fft_concat[label].x = 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));
|
|
4007
4218
|
}
|
|
4008
4219
|
if('y_offset' in en_axis_data){
|
|
4009
|
-
fft_concat[label].y = parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(
|
|
4220
|
+
fft_concat[label].y = 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));
|
|
4010
4221
|
}
|
|
4011
4222
|
if('z_offset' in en_axis_data){
|
|
4012
|
-
fft_concat[label].z = parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(
|
|
4223
|
+
fft_concat[label].z = 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));
|
|
4013
4224
|
}
|
|
4014
4225
|
}
|
|
4015
4226
|
var fft_concat_obj = {
|
|
@@ -4619,13 +4830,13 @@ function sensor_types(parent){
|
|
|
4619
4830
|
fft_concat[label] = {};
|
|
4620
4831
|
|
|
4621
4832
|
if('x_offset' in en_axis_data){
|
|
4622
|
-
fft_concat[label].x = parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(
|
|
4833
|
+
fft_concat[label].x = 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));
|
|
4623
4834
|
}
|
|
4624
4835
|
if('y_offset' in en_axis_data){
|
|
4625
|
-
fft_concat[label].y = parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(
|
|
4836
|
+
fft_concat[label].y = 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));
|
|
4626
4837
|
}
|
|
4627
4838
|
if('z_offset' in en_axis_data){
|
|
4628
|
-
fft_concat[label].z = parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(
|
|
4839
|
+
fft_concat[label].z = 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));
|
|
4629
4840
|
}
|
|
4630
4841
|
}
|
|
4631
4842
|
var fft_concat_obj = {
|
|
@@ -5046,6 +5257,29 @@ function sensor_types(parent){
|
|
|
5046
5257
|
};
|
|
5047
5258
|
}
|
|
5048
5259
|
},
|
|
5260
|
+
'107': {
|
|
5261
|
+
name: '16-Bit 4-Channel 4-20mA',
|
|
5262
|
+
parse: (d) => {
|
|
5263
|
+
var adc1 = signInt(d.slice(0, 2).reduce(msbLsb));
|
|
5264
|
+
var adc2 = signInt(d.slice(2, 4).reduce(msbLsb));
|
|
5265
|
+
var adc3 = signInt(d.slice(4, 6).reduce(msbLsb));
|
|
5266
|
+
var adc4 = signInt(d.slice(6, 8).reduce(msbLsb));
|
|
5267
|
+
var ma1 = (signInt(d.slice(8, 10).reduce(msbLsb)))/100.0;
|
|
5268
|
+
var ma2 = (signInt(d.slice(10, 12).reduce(msbLsb)))/100.0;
|
|
5269
|
+
var ma3 = (signInt(d.slice(12, 14).reduce(msbLsb)))/100.0;
|
|
5270
|
+
var ma4 = (signInt(d.slice(14, 16).reduce(msbLsb)))/100.0;
|
|
5271
|
+
return {
|
|
5272
|
+
adc1: adc1,
|
|
5273
|
+
adc2: adc2,
|
|
5274
|
+
adc3: adc3,
|
|
5275
|
+
adc4: adc4,
|
|
5276
|
+
ma1: ma1,
|
|
5277
|
+
ma2: ma2,
|
|
5278
|
+
ma3: ma3,
|
|
5279
|
+
ma4: ma4
|
|
5280
|
+
};
|
|
5281
|
+
}
|
|
5282
|
+
},
|
|
5049
5283
|
'200': {
|
|
5050
5284
|
name: '4-20mA Pass Through',
|
|
5051
5285
|
parse: (d) => {
|
|
@@ -5551,13 +5785,13 @@ function sensor_types(parent){
|
|
|
5551
5785
|
fft_concat[label] = {};
|
|
5552
5786
|
|
|
5553
5787
|
if('x_offset' in en_axis_data){
|
|
5554
|
-
fft_concat[label].x = parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(
|
|
5788
|
+
fft_concat[label].x = 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));
|
|
5555
5789
|
}
|
|
5556
5790
|
if('y_offset' in en_axis_data){
|
|
5557
|
-
fft_concat[label].y = parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(
|
|
5791
|
+
fft_concat[label].y = 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));
|
|
5558
5792
|
}
|
|
5559
5793
|
if('z_offset' in en_axis_data){
|
|
5560
|
-
fft_concat[label].z = parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(
|
|
5794
|
+
fft_concat[label].z = 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));
|
|
5561
5795
|
}
|
|
5562
5796
|
}
|
|
5563
5797
|
var fft_concat_obj = {
|
|
@@ -5974,32 +6208,42 @@ function sensor_types(parent){
|
|
|
5974
6208
|
parse: (payload, parsed) => {
|
|
5975
6209
|
return {
|
|
5976
6210
|
moisture_1: payload.slice(0, 2).reduce(msbLsb)/100,
|
|
5977
|
-
temp_1: payload.slice(2, 4).reduce(msbLsb)/100,
|
|
6211
|
+
temp_1: signInt(payload.slice(2, 4).reduce(msbLsb))/100,
|
|
5978
6212
|
moisture_2: payload.slice(4, 6).reduce(msbLsb)/100,
|
|
5979
|
-
temp_2: payload.slice(6, 8).reduce(msbLsb)/100,
|
|
6213
|
+
temp_2: signInt(payload.slice(6, 8).reduce(msbLsb))/100,
|
|
5980
6214
|
moisture_3: payload.slice(8, 10).reduce(msbLsb)/100,
|
|
5981
|
-
temp_3: payload.slice(10, 12).reduce(msbLsb)/100,
|
|
6215
|
+
temp_3: signInt(payload.slice(10, 12).reduce(msbLsb))/100,
|
|
5982
6216
|
moisture_4: payload.slice(12, 14).reduce(msbLsb)/100,
|
|
5983
|
-
temp_4: payload.slice(14, 16).reduce(msbLsb)/100,
|
|
6217
|
+
temp_4: signInt(payload.slice(14, 16).reduce(msbLsb))/100,
|
|
5984
6218
|
moisture_5: payload.slice(16, 18).reduce(msbLsb)/100,
|
|
5985
|
-
temp_5: payload.slice(18, 20).reduce(msbLsb)/100,
|
|
6219
|
+
temp_5: signInt(payload.slice(18, 20).reduce(msbLsb))/100,
|
|
5986
6220
|
moisture_6: payload.slice(20, 22).reduce(msbLsb)/100,
|
|
5987
|
-
temp_6: payload.slice(22, 24).reduce(msbLsb)/100
|
|
6221
|
+
temp_6: signInt(payload.slice(22, 24).reduce(msbLsb))/100
|
|
5988
6222
|
}
|
|
5989
6223
|
}
|
|
5990
6224
|
},
|
|
5991
6225
|
'531': {
|
|
5992
6226
|
name: 'Custom Noise Sensor',
|
|
5993
|
-
parse: (d) => {
|
|
5994
|
-
|
|
5995
|
-
|
|
5996
|
-
|
|
5997
|
-
|
|
5998
|
-
|
|
5999
|
-
|
|
6000
|
-
|
|
6001
|
-
|
|
6002
|
-
|
|
6227
|
+
parse: (d, p) => {
|
|
6228
|
+
let firmware = p[1];
|
|
6229
|
+
if(firmware > 1){
|
|
6230
|
+
return {
|
|
6231
|
+
rms_dba: d[0],
|
|
6232
|
+
c1_dba: d[1],
|
|
6233
|
+
c1_freq: d.slice(2, 4).reduce(msbLsb),
|
|
6234
|
+
c2_dba: d[4],
|
|
6235
|
+
c2_freq: d.slice(5, 7).reduce(msbLsb),
|
|
6236
|
+
c3_dba: d[7],
|
|
6237
|
+
c3_freq: d.slice(8, 10).reduce(msbLsb),
|
|
6238
|
+
};
|
|
6239
|
+
}else{
|
|
6240
|
+
return {
|
|
6241
|
+
noise_db: d[0],
|
|
6242
|
+
peak_freq_1: d.slice(1, 3).reduce(msbLsb),
|
|
6243
|
+
peak_freq_2: d.slice(3, 5).reduce(msbLsb),
|
|
6244
|
+
peak_freq_3: d.slice(5, 7).reduce(msbLsb)
|
|
6245
|
+
};
|
|
6246
|
+
}
|
|
6003
6247
|
}
|
|
6004
6248
|
},
|
|
6005
6249
|
'537': {
|
|
@@ -6250,13 +6494,13 @@ function sensor_types(parent){
|
|
|
6250
6494
|
fft_concat[label] = {};
|
|
6251
6495
|
|
|
6252
6496
|
if('x_offset' in en_axis_data){
|
|
6253
|
-
fft_concat[label].x = parseFloat((signInt(((raw_data[i+en_axis_data.x_offset]<<8)+(raw_data[i+en_axis_data.x_offset+1])), 16)*fsr_mult).toFixed(
|
|
6497
|
+
fft_concat[label].x = 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));
|
|
6254
6498
|
}
|
|
6255
6499
|
if('y_offset' in en_axis_data){
|
|
6256
|
-
fft_concat[label].y = parseFloat((signInt(((raw_data[i+en_axis_data.y_offset]<<8)+(raw_data[i+en_axis_data.y_offset+1])), 16)*fsr_mult).toFixed(
|
|
6500
|
+
fft_concat[label].y = 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));
|
|
6257
6501
|
}
|
|
6258
6502
|
if('z_offset' in en_axis_data){
|
|
6259
|
-
fft_concat[label].z = parseFloat((signInt(((raw_data[i+en_axis_data.z_offset]<<8)+(raw_data[i+en_axis_data.z_offset+1])), 16)*fsr_mult).toFixed(
|
|
6503
|
+
fft_concat[label].z = 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));
|
|
6260
6504
|
}
|
|
6261
6505
|
}
|
|
6262
6506
|
var fft_concat_obj = {
|
package/package.json
CHANGED
package/wireless.html
CHANGED
|
@@ -430,6 +430,7 @@
|
|
|
430
430
|
"96": "96 - 16-Bit 1-Channel 0-48VDC Receiver",
|
|
431
431
|
"101": "101 - Pro Vibration",
|
|
432
432
|
"102": "102 - Strain Gauge",
|
|
433
|
+
"107": "107 - 4 Channel 4-20mA Receiver",
|
|
433
434
|
"200": "200 - 4-20mA Pass Through",
|
|
434
435
|
"202": "202 - Weather Station",
|
|
435
436
|
"502": "502 - C_50-27",
|
|
@@ -680,6 +681,7 @@
|
|
|
680
681
|
<option value="96">96 - 16-Bit 1-Channel 0-48VDC Receiver</option>
|
|
681
682
|
<option value="101">101 - Pro Vibration</option>
|
|
682
683
|
<option value="102">102 - Strain Gauge</option>
|
|
684
|
+
<option value="107">107 - 4 Channel 4-20mA Receiver</option>
|
|
683
685
|
<option value="200">200 - 4-20mA Pass Through</option>
|
|
684
686
|
<option value="202">202 - Weather Station</option>
|
|
685
687
|
<option value="502">502 - C_50-27</option>
|
|
@@ -707,7 +709,7 @@
|
|
|
707
709
|
<label for="node-input-auto_config"><i class="icon-tag"></i> Auto Config</label>
|
|
708
710
|
<input class="section-control" type="checkbox" id="node-input-auto_config" value="1">
|
|
709
711
|
</div>
|
|
710
|
-
<div class="form-row ncd-dependent" data-sensor-23 data-sensor-26 data-sensor-45 data-sensor-48 data-sensor-78 data-sensor-79 data-sensor-80 data-sensor-81 data-sensor-82 data-sensor-84 data-sensor-88 data-sensor-89 data-sensor-91 data-sensor-101 data-sensor-102 data-sensor-519 data-sensor-520 data-sensor-521 data-sensor-531 data-sensor-537>
|
|
712
|
+
<div class="form-row ncd-dependent" data-sensor-23 data-sensor-26 data-sensor-39 data-sensor-45 data-sensor-48 data-sensor-52 data-sensor-78 data-sensor-79 data-sensor-80 data-sensor-81 data-sensor-82 data-sensor-84 data-sensor-88 data-sensor-89 data-sensor-91 data-sensor-101 data-sensor-102 data-sensor-107 data-sensor-519 data-sensor-520 data-sensor-521 data-sensor-531 data-sensor-537>
|
|
711
713
|
<hr>
|
|
712
714
|
<label for="node-input-on_the_fly_enable"><i class="icon-tag"></i> OTF Config*</label>
|
|
713
715
|
<input type="checkbox" id="node-input-on_the_fly_enable" value="1">
|
|
@@ -1517,7 +1519,7 @@
|
|
|
1517
1519
|
</div>
|
|
1518
1520
|
</div>
|
|
1519
1521
|
|
|
1520
|
-
<div class="ncd-dependent" data-sensor-14 data-sensor-45 data-sensor-48 data-sensor-52 data-sensor-88 data-sensor-89>
|
|
1522
|
+
<div class="ncd-dependent" data-sensor-14 data-sensor-45 data-sensor-48 data-sensor-52 data-sensor-88 data-sensor-89 data-sensor-107>
|
|
1521
1523
|
<div class="form-row ncd-active-check">
|
|
1522
1524
|
<strong>Sensor Boot Time</strong>
|
|
1523
1525
|
<p class="caption">
|
|
@@ -1552,7 +1554,7 @@
|
|
|
1552
1554
|
</div>
|
|
1553
1555
|
</div>
|
|
1554
1556
|
|
|
1555
|
-
<div class="ncd-dependent" data-sensor-3 data-sensor-14 data-sensor-45 data-sensor-48 data-sensor-52 data-sensor-88 data-sensor-89 data-sensor-200>
|
|
1557
|
+
<div class="ncd-dependent" data-sensor-3 data-sensor-14 data-sensor-45 data-sensor-48 data-sensor-52 data-sensor-88 data-sensor-89 data-sensor-107 data-sensor-200>
|
|
1556
1558
|
<div class="form-row ncd-active-check">
|
|
1557
1559
|
<strong>Low Calibration Point</strong>
|
|
1558
1560
|
<div>
|
package/wireless.js
CHANGED
|
@@ -151,7 +151,41 @@ module.exports = function(RED) {
|
|
|
151
151
|
};
|
|
152
152
|
|
|
153
153
|
node.on('input', function(msg){
|
|
154
|
-
|
|
154
|
+
switch(msg.topic){
|
|
155
|
+
case "route_trace":
|
|
156
|
+
var opts = {trace:1};
|
|
157
|
+
node.gateway.route_discover(msg.payload.address,opts).then().catch(console.log);
|
|
158
|
+
break;
|
|
159
|
+
case "link_test":
|
|
160
|
+
node.gateway.link_test(msg.payload.source_address,msg.payload.destination_address,msg.payload.options);
|
|
161
|
+
break;
|
|
162
|
+
case "fft_request":
|
|
163
|
+
break;
|
|
164
|
+
case "fidelity_test":
|
|
165
|
+
break;
|
|
166
|
+
default:
|
|
167
|
+
const byteArrayToHexString = byteArray => Array.from(msg.payload.address, byte => ('0' + (byte & 0xFF).toString(16)).slice(-2)).join('');
|
|
168
|
+
node.gateway.control_send(msg.payload.address, msg.payload.data, msg.payload.options).then().catch(console.log);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
// console.log("input triggered, topic:"+msg.topic);
|
|
173
|
+
// if(msg.topic == "transmit"){
|
|
174
|
+
// const byteArrayToHexString = byteArray => Array.from(msg.payload.address, byte => ('0' + (byte & 0xFF).toString(16)).slice(-2)).join('');
|
|
175
|
+
// node.gateway.control_send(msg.payload.address, msg.payload.data, msg.payload.options).then().catch(console.log);
|
|
176
|
+
// }
|
|
177
|
+
// if(msg.topic == "route_trace"){
|
|
178
|
+
// var opts = {trace:1};
|
|
179
|
+
// node.gateway.route_discover(msg.payload.address,opts).then().catch(console.log);
|
|
180
|
+
// }
|
|
181
|
+
// if(msg.topic == "link_test"){
|
|
182
|
+
// node.gateway.link_test(msg.payload.source_address,msg.payload.destination_address,msg.payload.options);
|
|
183
|
+
// }
|
|
184
|
+
// if(msg.topic == "fft_request"){
|
|
185
|
+
|
|
186
|
+
// }
|
|
187
|
+
// if(msg.topic == "fidelity_test"){
|
|
188
|
+
// }
|
|
155
189
|
});
|
|
156
190
|
|
|
157
191
|
node.gateway.on('sensor_data', (d) => {
|
|
@@ -167,6 +201,14 @@ module.exports = function(RED) {
|
|
|
167
201
|
msg1 = {topic:'somethingTopic',payload:"something"};
|
|
168
202
|
node.send([null,{topic: 'unknown_data', payload:d, time: Date.now()}]);
|
|
169
203
|
});
|
|
204
|
+
node.gateway.on("route_info",(d)=>{
|
|
205
|
+
msg1 = {topic:"route_info",payload:d};
|
|
206
|
+
node.send(msg1);
|
|
207
|
+
});
|
|
208
|
+
node.gateway.on("link_info",(d)=>{
|
|
209
|
+
msg1 = {topic:"link_info",payload:d};
|
|
210
|
+
node.send(msg1);
|
|
211
|
+
});
|
|
170
212
|
|
|
171
213
|
node.set_status();
|
|
172
214
|
node._gateway_node.on('mode_change', (mode) => {
|
|
@@ -815,6 +857,20 @@ module.exports = function(RED) {
|
|
|
815
857
|
// }
|
|
816
858
|
// promises.set_rtc_101 = node.config_gateway.config_set_rtc_101(mac);
|
|
817
859
|
break;
|
|
860
|
+
case 107:
|
|
861
|
+
if(config.sensor_boot_time_420ma_active){
|
|
862
|
+
promises.sensor_boot_time_420ma = node.config_gateway.config_set_sensor_boot_time_420ma(mac, parseInt(config.sensor_boot_time_420ma));
|
|
863
|
+
}
|
|
864
|
+
if(config.low_calibration_420ma_active){
|
|
865
|
+
promises.low_calibration_420ma = node.config_gateway.config_set_low_calibration_420ma(mac, parseInt(config.low_calibration_420ma));
|
|
866
|
+
}
|
|
867
|
+
if(config.mid_calibration_420ma_active){
|
|
868
|
+
promises.mid_calibration_420ma = node.config_gateway.config_set_mid_calibration_420ma(mac, parseInt(config.mid_calibration_420ma));
|
|
869
|
+
}
|
|
870
|
+
if(config.high_calibration_420ma_active){
|
|
871
|
+
promises.high_calibration_420ma = node.config_gateway.config_set_high_calibration_420ma(mac, parseInt(config.high_calibration_420ma));
|
|
872
|
+
}
|
|
873
|
+
break;
|
|
818
874
|
case 200:
|
|
819
875
|
if(config.low_calibration_420ma_active){
|
|
820
876
|
promises.low_calibration_420ma = node.config_gateway.config_set_low_calibration_420ma(mac, parseInt(config.low_calibration_420ma));
|