114 lines
4.0 KiB
JavaScript
114 lines
4.0 KiB
JavaScript
|
// Decoder for device payload encoder "PLAIN"
|
||
|
// copy&paste to TTN Console V3 -> Applications -> Payload formatters -> Uplink -> Javascript
|
||
|
// modified for The Things Stack V3 by Caspar Armster, dasdigidings e.V.
|
||
|
|
||
|
function decodeUplink(input) {
|
||
|
var data = {};
|
||
|
|
||
|
if (input.fPort === 1) {
|
||
|
var i = 0;
|
||
|
|
||
|
if (input.bytes.length >= 2) {
|
||
|
data.wifi = (input.bytes[i++] << 8) | input.bytes[i++];
|
||
|
}
|
||
|
|
||
|
if (input.bytes.length === 4 || input.bytes.length > 15) {
|
||
|
data.ble = (input.bytes[i++] << 8) | input.bytes[i++];
|
||
|
}
|
||
|
|
||
|
if (input.bytes.length > 4) {
|
||
|
data.latitude = ((input.bytes[i++] << 24) | (input.bytes[i++] << 16) | (input.bytes[i++] << 8) | input.bytes[i++]);
|
||
|
data.longitude = ((input.bytes[i++] << 24) | (input.bytes[i++] << 16) | (input.bytes[i++] << 8) | input.bytes[i++]);
|
||
|
data.sats = input.bytes[i++];
|
||
|
data.hdop = (input.bytes[i++] << 8) | (input.bytes[i++]);
|
||
|
data.altitude = ((input.bytes[i++] << 8) | (input.bytes[i++]));
|
||
|
}
|
||
|
data.pax = 0;
|
||
|
if ('wifi' in data) {
|
||
|
data.pax += data.wifi;
|
||
|
}
|
||
|
if ('ble' in data) {
|
||
|
data.pax += data.ble;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (input.fPort === 2) {
|
||
|
var i = 0;
|
||
|
data.voltage = ((input.bytes[i++] << 8) | input.bytes[i++]);
|
||
|
data.uptime = ((input.bytes[i++] << 56) | (input.bytes[i++] << 48) | (input.bytes[i++] << 40) | (input.bytes[i++] << 32) | (input.bytes[i++] << 24) | (input.bytes[i++] << 16) | (input.bytes[i++] << 8) | input.bytes[i++]);
|
||
|
data.cputemp = input.bytes[i++];
|
||
|
data.memory = ((input.bytes[i++] << 24) | (input.bytes[i++] << 16) | (input.bytes[i++] << 8) | input.bytes[i++]);
|
||
|
data.reset0 = input.bytes[i++];
|
||
|
data.reset1 = input.bytes[i++];
|
||
|
}
|
||
|
|
||
|
if (input.fPort === 4) {
|
||
|
var i = 0;
|
||
|
data.latitude = ((input.bytes[i++] << 24) | (input.bytes[i++] << 16) | (input.bytes[i++] << 8) | input.bytes[i++]);
|
||
|
data.longitude = ((input.bytes[i++] << 24) | (input.bytes[i++] << 16) | (input.bytes[i++] << 8) | input.bytes[i++]);
|
||
|
data.sats = input.bytes[i++];
|
||
|
data.hdop = (input.bytes[i++] << 8) | (input.bytes[i++]);
|
||
|
data.altitude = ((input.bytes[i++] << 8) | (input.bytes[i++]));
|
||
|
}
|
||
|
|
||
|
if (input.fPort === 5) {
|
||
|
var i = 0;
|
||
|
data.button = input.bytes[i++];
|
||
|
}
|
||
|
|
||
|
if (input.fPort === 6) {
|
||
|
var i = 0;
|
||
|
data.rssi = input.bytes[i++];
|
||
|
data.beacon = input.bytes[i++];
|
||
|
}
|
||
|
|
||
|
if (input.fPort === 7) {
|
||
|
var i = 0;
|
||
|
data.temperature = ((input.bytes[i++] << 8) | input.bytes[i++]);
|
||
|
data.pressure = ((input.bytes[i++] << 8) | input.bytes[i++]);
|
||
|
data.humidity = ((input.bytes[i++] << 8) | input.bytes[i++]);
|
||
|
data.air = ((input.bytes[i++] << 8) | input.bytes[i++]);
|
||
|
}
|
||
|
|
||
|
if (input.fPort === 8) {
|
||
|
var i = 0;
|
||
|
if (input.bytes.length >= 2) {
|
||
|
data.voltage = (input.bytes[i++] << 8) | input.bytes[i++];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (input.fPort === 9) {
|
||
|
// timesync request
|
||
|
if (input.bytes.length === 1) {
|
||
|
data.timesync_seqno = input.bytes[0];
|
||
|
}
|
||
|
// epoch time answer
|
||
|
if (input.bytes.length === 5) {
|
||
|
var i = 0;
|
||
|
data.time = ((input.bytes[i++] << 24) | (input.bytes[i++] << 16) | (input.bytes[i++] << 8) | input.bytes[i++]);
|
||
|
data.timestatus = input.bytes[i++];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (input.fPort === 10) {
|
||
|
var i = 0;
|
||
|
if (input.bytes.length >= 2) {
|
||
|
data.ens = (input.bytes[i++] << 8) | input.bytes[i++];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (data.hdop) {
|
||
|
data.hdop /= 100;
|
||
|
data.latitude /= 1000000;
|
||
|
data.longitude /= 1000000;
|
||
|
}
|
||
|
|
||
|
data.bytes = input.bytes; // comment out if you do not want to include the original payload
|
||
|
data.port = input.fPort; // comment out if you do not want to inlude the port
|
||
|
|
||
|
return {
|
||
|
data: data,
|
||
|
warnings: [],
|
||
|
errors: []
|
||
|
};
|
||
|
}
|