Skip to end of metadata
Go to start of metadata
Chirpstack Uplink Decoder
// Decode uplink function.
//
// Input is an object with the following fields:
// - bytes = Byte array containing the uplink payload, e.g. [255, 230, 255, 0]
// - fPort = Uplink fPort.
// - variables = Object containing the configured device variables.
//
// Output must be an object with the following fields:
// - output = Object representing the decoded payload.
function decodeUplink(input)
{
return {
data: Decode(input.fPort, input.bytes, input.variables)
};
}
function Decode(fPort, bytes)
{
var output = {};
switch (fPort)
{
case 1:
{
output.NTC1_Raw_Value = bytes[0] * 0.5;
output.NTC1_Temperature = bytes[1] * 0.5;
output.NTC2_Raw_Value = bytes[2] * 0.5;
output.NTC2_Temperature = bytes[3] * 0.5;
output.Battery_Low = bytes[4] >> 4 & 0x01;
output.Radio_Communication_Error = bytes[4] >> 3 & 0x01;
output.Received_Signal_Strength = bytes[4] >> 2 & 0x01;
output.NTC2_Sensor_Error = bytes[4] >> 1 & 0x01;
output.NTC1_Sensor_Error = bytes[4] >> 0 & 0x01;
output.Storage_Voltage = Number((bytes[5] * 0.02).toFixed(2));
break;
}
case 2:
{
{
var REV_Major = (bytes[0] & 0xF).toString();
var REV_Minor = ((bytes[0] >> 4) & 0xF).toString(16);
output.REV = REV_Major + "." + REV_Minor;
}
{
var HW_Major = (bytes[1] & 0xF).toString();
var HW_Minor = ((bytes[1] >> 4) & 0xF).toString();
output.HW = HW_Major + "." + HW_Minor;
}
{
var FW_Year = bytes[2].toString();
var FW_Month = bytes[3].toString();
var FW_Day = bytes[4].toString();
var FW_Minor = bytes[5].toString();
output.FW = "20" + FW_Year + "." + FW_Month + "." + FW_Day + "." + FW_Minor;
break;
}
}
default:
return {
errors: ['unknown FPort'], };
}
return output;
}
Chirpstack Downlink Encoder
// Encode downlink function.
//
// Input is an object with the following fields:
// - output = Object representing the payload that must be encoded.
// - variables = Object containing the configured device variables.
//
// Output must be an object with the following fields:
// - bytes = Byte array containing the downlink payload.
// Possible Options:
// radioInterval : 5 or 10 or 15 or 20 or 30 or 60 or 120 or 480 (minutes)
function encodeDownlink(input)
{
let radioInterval = input.data.radioInterval;
let bytes = [0];
switch (radioInterval)
{
case 5:
bytes[0] = 0; // Radio interval 5 minutes
break;
case 10:
bytes[0] = 1; // Radio interval 10 minutes
break;
case 15:
bytes[0] = 2; // Radio interval 15 minutes
break;
case 20:
bytes[0] = 3; // Radio interval 20 minutes
break;
case 30:
bytes[0] = 4; // Radio interval 30 minutes
break;
case 60:
bytes[0] = 5; // Radio interval 60 minutes
break;
case 120:
bytes[0] = 6; // Radio interval 120 minutes
break;
case 480:
bytes[0] = 7; // Radio interval 480 minutes
break;
default:
throw new Error("Invalid radio interval");
}
return { "bytes": bytes };
}
Downlink Encoder Example