Skip to main content

ChirpStack v3

Version: 1.0.0 (2024-01-04)

"use strict";

// ############################################################
// _ wWw _oo wWw \\\ ///
// /||_ (O)_ >-(_ \ (O)_ ((O) (O))
// /o_) / __) / _/ / __) | \ / |
// / |(\ / ( / / / ( ||\\//||
// | | )) ( _) / ( ( _) || \/ ||
// | |// \ \_ ( `-. \ \_ || ||
// \__/ \__) `--.._) \__) (_/ \_)
// deZem GmbH
// ############################################################
// #################### IMPORTANT INFO #######################
// ############################################################
// Platform: ChirpStack v3
// ############################################################
// Version : 1.0.0 (2024-01-04)
// Decoder : port 6 (v0.6 payload)
// port 10 (v1.0 payload)
// port 99 (reboot message)
//
// ############################################################
// ######################### PARSER ##########################
// ############################################################
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i["return"] && (_r = _i["return"](), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

var CONF_LE = true;
var TYPE_U8 = 0;
var TYPE_U16 = 1;
var TYPE_U32 = 2;
var TYPE_U64 = 3;
var TYPE_I8 = 4;
var TYPE_I16 = 5;
var TYPE_I32 = 6;
var TYPE_I64 = 7;
var TYPE_F16 = 8;
var TYPE_F32 = 9;
var TYPE_F64 = 10;
var TYPE_Q8 = 11;
var TYPE_Q16 = 12;
var TYPE_Q32 = 13;
var SIZE_OF_TYPE = [1, 2, 4, 8, 1, 2, 4, 8, 2, 4, 8, 1, 2, 4];
function num_to_fixed(x, digits) {
return Number(x.toFixed(digits));
}
function uint16_BE(bytes, idx) {
bytes = bytes.slice(idx || 0);
return bytes[0] << 8 | bytes[1] << 0;
}
function uint16_LE(bytes, idx) {
bytes = bytes.slice(idx || 0);
return bytes[1] << 8 | bytes[0] << 0;
}
function uint32_LE(bytes, idx) {
bytes = bytes.slice(idx || 0);
return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0] << 0;
}
function signed(val, bits) {
if ((val & 1 << bits - 1) > 0) {
var mask = Math.pow(2, bits) - 1;
val = (~val & mask) + 1;
val = val * -1;
}
return val;
}
function int16_BE(bytes, idx) {
bytes = bytes.slice(idx || 0);
return signed(bytes[0] << 8 | bytes[1] << 0, 16);
}
function int16_LE(bytes, idx) {
bytes = bytes.slice(idx || 0);
return signed(bytes[1] << 8 | bytes[0] << 0, 16);
}
function int8(bytes, idx) {
bytes = bytes.slice(idx || 0);
return signed(bytes[0], 8);
}
function float16_LE(bytes) {
var h = bytes[1] << 8 | bytes[0];
var s = (h & 0x8000) >> 15;
var e = (h & 0x7c00) >> 10;
var f = h & 0x03ff;
if (e === 0) {
return (s ? -1 : 1) * 0.00006103515625 * (f / 1024.0);
}
if (e === 0x1f) {
return f ? NaN : (s ? -1 : 1) * Infinity;
}
return (s ? -1 : 1) * Math.pow(2, e - 15) * (1 + f / 1024.0);
}
function decodeType(bytes, type) {
switch (type) {
case TYPE_U8:
return bytes[0];
case TYPE_U16:
return uint16_LE(bytes, 0);
case TYPE_U32:
return uint32_LE(bytes, 0);
case TYPE_I8:
return int8(bytes, 0);
case TYPE_I16:
return int16_LE(bytes, 0);
case TYPE_I32:
return undefined;
case TYPE_F16:
return float16_LE(bytes);
case TYPE_F32:
return undefined;
case TYPE_F64:
return undefined;
}
return undefined;
}
function createBitSetMap(uint8array, confMap) {
var map = {};
for (var i = 0; i < uint8array.length; i++) {
for (var n = 0; n < 8; n++) {
var idx = i * 8 + n;
var isSet = (uint8array[i] & 1 << n) !== 0;
if (Boolean(confMap[idx])) {
map[confMap[idx]] = isSet;
}
}
}
return map;
}
function parseChannels(bytes, confMap, chanMask, chanName, chanType, chanScale, chanOffset) {
var map = {};
var idx = 0;
for (var i = 0; i < chanMask.length; i++) {
if (Boolean(confMap[chanMask[i]])) {
var val = decodeType(bytes.slice(idx), chanType[i]) * chanScale[i] + chanOffset[i];
map[chanName[i]] = val;
idx += SIZE_OF_TYPE[chanType[i]];
}
}
return map;
}
function decodePort6(bytes) {
var c0_mA = uint16_LE(bytes, 6) / 40;
var c1_mA = uint16_LE(bytes, 8) / 40;
var c2_mA = uint16_LE(bytes, 10) / 40;
var c3_mA = uint16_LE(bytes, 12) / 40;
var voltage_ac = uint16_LE(bytes, 30) / 10.0;
var power_s_1 = c0_mA * 2 * voltage_ac || 0;
var power_s_2 = c1_mA * 2 * voltage_ac || 0;
var power_s_3 = c2_mA * 2 * voltage_ac || 0;
var cosphi_3_0 = int8(bytes, 32) / 100.0;
var cosphi_3_1 = int8(bytes, 33) / 100.0;
var cosphi_3_2 = int8(bytes, 34) / 100.0;
var power_p_1 = power_s_1 * cosphi_3_0;
var power_p_2 = power_s_2 * cosphi_3_1;
var power_p_3 = power_s_3 * cosphi_3_2;
var power_q_1 = Math.sqrt(power_s_1 * power_s_1 - power_p_1 * power_p_1) || 0;
var power_q_2 = Math.sqrt(power_s_2 * power_s_2 - power_p_2 * power_p_2) || 0;
var power_q_3 = Math.sqrt(power_s_3 * power_s_3 - power_p_3 * power_p_3) || 0;
return {
"vbat": uint16_LE(bytes, 2) / 1000,
"vsys_V": uint16_LE(bytes, 2) / 1000,
"temp": int16_LE(bytes, 4) / 10,
"temp_C": int16_LE(bytes, 4) / 10,
"c0_rms": uint16_LE(bytes, 6) / 100,
"c1_rms": uint16_LE(bytes, 8) / 100,
"c2_rms": uint16_LE(bytes, 10) / 100,
"c3_rms": uint16_LE(bytes, 12) / 100,
"c0_mA": c0_mA,
"c1_mA": c1_mA,
"c2_mA": c2_mA,
"c3_mA": c3_mA,
"in1_ac_curr_A": num_to_fixed(c0_mA * 2, 5),
"in2_ac_curr_A": num_to_fixed(c1_mA * 2, 5),
"in3_ac_curr_A": num_to_fixed(c2_mA * 2, 5),
"in4_ac_curr_A": num_to_fixed(c3_mA * 2, 5),
"c0_avg": int16_LE(bytes, 14) / 100,
"c1_avg": int16_LE(bytes, 16) / 100,
"c2_avg": int16_LE(bytes, 18) / 100,
"c3_avg": int16_LE(bytes, 20) / 100,
"in1_dc_curr_A": int16_LE(bytes, 14) / 100000,
"in2_dc_curr_A": int16_LE(bytes, 16) / 100000,
"in3_dc_curr_A": int16_LE(bytes, 18) / 100000,
"in4_dc_curr_A": int16_LE(bytes, 20) / 100000,
"c0_freq": uint16_LE(bytes, 22) / 100.0,
"c1_freq": uint16_LE(bytes, 24) / 100.0,
"c2_freq": uint16_LE(bytes, 26) / 100.0,
"c3_freq": uint16_LE(bytes, 28) / 100.0,
"in1_grid_freq_Hz": uint16_LE(bytes, 22) / 100.0,
"in2_grid_freq_Hz": uint16_LE(bytes, 24) / 100.0,
"in3_grid_freq_Hz": uint16_LE(bytes, 26) / 100.0,
"in4_grid_freq_Hz": uint16_LE(bytes, 28) / 100.0,
"cosphi_3_0": cosphi_3_0,
"cosphi_3_1": cosphi_3_1,
"cosphi_3_2": cosphi_3_2,
voltage_ac: voltage_ac,
"in4_grid_voltage_VAC": voltage_ac,
"in1_cos": cosphi_3_0,
"in2_cos": cosphi_3_1,
"in3_cos": cosphi_3_2,
power_p_1: power_p_1,
power_p_2: power_p_2,
power_p_3: power_p_3,
"in1_pow_W": power_p_1,
"in2_pow_W": power_p_2,
"in3_pow_W": power_p_3,
power_s_1: power_s_1,
power_s_2: power_s_2,
power_s_3: power_s_3,
"in1_a_pow_VA": power_s_1,
"in2_a_pow_VA": power_s_2,
"in3_a_pow_VA": power_s_3,
power_q_1: power_q_1,
power_q_2: power_q_2,
power_q_3: power_q_3,
"in1_r_pow_VAR": num_to_fixed(power_q_1, 2),
"in2_r_pow_VAR": num_to_fixed(power_q_2, 2),
"in3_r_pow_VAR": num_to_fixed(power_q_3, 2)
};
}
function decodePort10(bytes) {
var BITSET_BYTE_0 = ["usb_powered", "ch_vsys_en", "ch_temp_en", null, null, null, null, null];
var BITSET_BYTE_1 = ["ct_plus_mode", null, null, null, null, null, null, null];
var BITSET_BYTE_2 = ["in1_ac_en", "in1_dc_en", "in1_freq_en", "in1_scaled_mode", "in1_voltage_mode", null, null, null];
var BITSET_BYTE_3 = ["in2_ac_en", "in2_dc_en", "in2_freq_en", "in2_scaled_mode", "in2_voltage_mode", null, null, null];
var BITSET_BYTE_4 = ["in3_ac_en", "in3_dc_en", "in3_freq_en", "in3_scaled_mode", "in3_voltage_mode", null, null, null];
var BITSET_BYTE_5 = ["in4_ac_en", "in4_dc_en", "in4_freq_en", "in4_scaled_mode", "in4_voltage_mode", null, null, null];
var BITSET = [].concat(BITSET_BYTE_0, BITSET_BYTE_1, BITSET_BYTE_2, BITSET_BYTE_3, BITSET_BYTE_4, BITSET_BYTE_5);
var CHAN_NAME_SYSTEM = ["vsys_V", "temp_C"];
var CHAN_MASK_SYSTEM = ["ch_vsys_en", "ch_temp_en"];
var CHAN_TYPE_SYSTEM = [TYPE_U8, TYPE_U8];
var CHAN_SCAL_SYSTEM = [0.0075, 0.4];
var CHAN_OFFS_SYSTEM = [1.8, -22.0];
var CHAN_FIXD_SYSTEM = [3, 1];
var CHAN_NAME_IN1 = ["in1_ac_raw_A", "in1_dc_raw_A", "in1_freq", "in1_coeff"];
var CHAN_MASK_IN1 = ["in1_ac_en", "in1_dc_en", "in1_freq_en", "in1_scaled_mode"];
var CHAN_TYPE_IN1 = [TYPE_F16, TYPE_F16, TYPE_U16, TYPE_F16];
var CHAN_SCAL_IN1 = [1.0, 1.0, 0.01, 1.0];
var CHAN_OFFS_IN1 = [0, 0, 0, 0];
var CHAN_FIXD_IN1 = [6, 6, 2, 3];
var CHAN_NAME_IN2 = ["in2_ac_raw_A", "in2_dc_raw_A", "in2_freq", "in2_coeff"];
var CHAN_MASK_IN2 = ["in2_ac_en", "in2_dc_en", "in2_freq_en", "in2_scaled_mode"];
var CHAN_TYPE_IN2 = [TYPE_F16, TYPE_F16, TYPE_U16, TYPE_F16];
var CHAN_SCAL_IN2 = [1.0, 1.0, 0.01, 1.0];
var CHAN_OFFS_IN2 = [0, 0, 0, 0];
var CHAN_FIXD_IN2 = [6, 6, 2, 3];
var CHAN_NAME_IN3 = ["in3_ac_raw_A", "in3_dc_raw_A", "in3_freq", "in3_coeff"];
var CHAN_MASK_IN3 = ["in3_ac_en", "in3_dc_en", "in3_freq_en", "in3_scaled_mode"];
var CHAN_TYPE_IN3 = [TYPE_F16, TYPE_F16, TYPE_U16, TYPE_F16];
var CHAN_SCAL_IN3 = [1.0, 1.0, 0.01, 1.0];
var CHAN_OFFS_IN3 = [0, 0, 0, 0];
var CHAN_FIXD_IN3 = [6, 6, 2, 3];
var CHAN_NAME_IN4 = ["in4_ac_raw_A", "in4_dc_raw_A", "in4_freq", "in4_coeff"];
var CHAN_MASK_IN4 = ["in4_ac_en", "in4_dc_en", "in4_freq_en", "in4_scaled_mode"];
var CHAN_TYPE_IN4 = [TYPE_F16, TYPE_F16, TYPE_U16, TYPE_F16];
var CHAN_SCAL_IN4 = [1.0, 1.0, 0.01, 1.0];
var CHAN_OFFS_IN4 = [0, 0, 0, 0];
var CHAN_FIXD_IN4 = [6, 6, 2, 3];
var CHAN_NAME_PLUS = ["in1_pow_factor", "in2_pow_factor", "in3_pow_factor"];
var CHAN_MASK_PLUS = ["ct_plus_mode", "ct_plus_mode", "ct_plus_mode"];
var CHAN_TYPE_PLUS = [TYPE_F16, TYPE_F16, TYPE_F16];
var CHAN_SCAL_PLUS = [1.0, 1.0, 1.0];
var CHAN_OFFS_PLUS = [0, 0, 0];
var CHAN_FIXD_PLUS = [4, 4, 4];
var CHAN_NAME = [].concat(CHAN_NAME_SYSTEM, CHAN_NAME_IN1, CHAN_NAME_IN2, CHAN_NAME_IN3, CHAN_NAME_IN4, CHAN_NAME_PLUS);
var CHAN_MASK = [].concat(CHAN_MASK_SYSTEM, CHAN_MASK_IN1, CHAN_MASK_IN2, CHAN_MASK_IN3, CHAN_MASK_IN4, CHAN_MASK_PLUS);
var CHAN_TYPE = [].concat(CHAN_TYPE_SYSTEM, CHAN_TYPE_IN1, CHAN_TYPE_IN2, CHAN_TYPE_IN3, CHAN_TYPE_IN4, CHAN_TYPE_PLUS);
var CHAN_SCAL = [].concat(CHAN_SCAL_SYSTEM, CHAN_SCAL_IN1, CHAN_SCAL_IN2, CHAN_SCAL_IN3, CHAN_SCAL_IN4, CHAN_SCAL_PLUS);
var CHAN_OFFS = [].concat(CHAN_OFFS_SYSTEM, CHAN_OFFS_IN1, CHAN_OFFS_IN2, CHAN_OFFS_IN3, CHAN_OFFS_IN4, CHAN_OFFS_PLUS);
var CHAN_FIXD = [].concat(CHAN_FIXD_SYSTEM, CHAN_FIXD_IN1, CHAN_FIXD_IN2, CHAN_FIXD_IN3, CHAN_FIXD_IN4, CHAN_FIXD_PLUS);
var bitsetMap = createBitSetMap(bytes.slice(0, 6), BITSET);
var flags = bitsetMap;
var channels = parseChannels(bytes.slice(10), bitsetMap, CHAN_MASK, CHAN_NAME, CHAN_TYPE, CHAN_SCAL, CHAN_OFFS, CHAN_FIXD);
var toFixed = function toFixed(res, chanNames, chanFixed) {
var entries = res;
for (var k in entries) {
if (entries.hasOwnProperty(k)) {
var v = entries[k];
var ix = chanNames.indexOf(k);
if (ix >= 0) {
res[k] = num_to_fixed(v, chanFixed[ix]);
}
}
}
return res;
}
var ct_plus_mode = flags.ct_plus_mode;
var addScaledChannel = function addScaledChannel(ix) {
if (flags["in".concat(ix, "_scaled_mode")]) {
var voltage_mode = flags["in".concat(ix, "_voltage_mode")];
var coeff = (channels["in".concat(ix, "_coeff")] || 1.0) * (voltage_mode ? 1000.0 : 1.0);
var ac_raw_A = channels["in".concat(ix, "_ac_raw_A")];
if (ac_raw_A != undefined) {
channels[voltage_mode ? "in".concat(ix, "_voltage_VAC") : "in".concat(ix, "_ac_A")] = ac_raw_A * coeff;
}
var dc_raw_A = channels["in".concat(ix, "_dc_raw_A")];
if (dc_raw_A != undefined) {
channels[voltage_mode ? "in".concat(ix, "_voltage_VDC") : "in".concat(ix, "_dc_A")] = dc_raw_A * coeff;
}
}
};
addScaledChannel(1);
addScaledChannel(2);
addScaledChannel(3);
addScaledChannel(4);
var sumIfDefined = function sumIfDefined(channels, channelKeys, sumKey) {
var sum = channelKeys.reduce(function (acc, key) {
var value = channels[key];
return acc + (value !== undefined ? value : 0);
}, 0);
if (channelKeys.some(function (key) {
return channels[key] !== undefined;
})) {
channels[sumKey] = sum;
}
};
var acKeys = ['in1_ac_A', 'in2_ac_A', 'in3_ac_A', 'in4_ac_A'];
var dcKeys = ['in1_dc_A', 'in2_dc_A', 'in3_dc_A', 'in4_dc_A'];
sumIfDefined(channels, acKeys, 'sum_in1234_ac_A');
sumIfDefined(channels, dcKeys, 'sum_in1234_dc_A');
var CHAN_NAME_POST = ["in1_ac_A", "in2_ac_A", "in3_ac_A", "in4_ac_A", "in1_voltage_VAC", "in2_voltage_VAC", "in3_voltage_VAC", "in4_voltage_VAC", "sum_in1234_ac_A", "sum_in1234_dc_A"];
var CHAN_FIXD_POST = [3, 3, 3, 3, 2, 2, 2, 2, 3, 3];
if (ct_plus_mode) {
var _channels = channels,
in4_voltage_VAC = _channels.in4_voltage_VAC;
var _channels2 = channels,
in1_ac_A = _channels2.in1_ac_A,
in2_ac_A = _channels2.in2_ac_A,
in3_ac_A = _channels2.in3_ac_A;
channels["in1_pow_app_VA"] = in4_voltage_VAC * in1_ac_A;
channels["in2_pow_app_VA"] = in4_voltage_VAC * in2_ac_A;
channels["in3_pow_app_VA"] = in4_voltage_VAC * in3_ac_A;
var _channels3 = channels,
in1_pow_app_VA = _channels3.in1_pow_app_VA,
in2_pow_app_VA = _channels3.in2_pow_app_VA,
in3_pow_app_VA = _channels3.in3_pow_app_VA;
var _channels4 = channels,
in1_pow_factor = _channels4.in1_pow_factor,
in2_pow_factor = _channels4.in2_pow_factor,
in3_pow_factor = _channels4.in3_pow_factor;
channels["in1_pow_act_W"] = in1_pow_app_VA * in1_pow_factor;
channels["in2_pow_act_W"] = in2_pow_app_VA * in2_pow_factor;
channels["in3_pow_act_W"] = in3_pow_app_VA * in3_pow_factor;
var _channels5 = channels,
in1_pow_act_W = _channels5.in1_pow_act_W,
in2_pow_act_W = _channels5.in2_pow_act_W,
in3_pow_act_W = _channels5.in3_pow_act_W;
channels["in1_pow_react_VAR"] = Math.sqrt(in1_pow_app_VA * in1_pow_app_VA - in1_pow_act_W * in1_pow_act_W);
channels["in2_pow_react_VAR"] = Math.sqrt(in2_pow_app_VA * in2_pow_app_VA - in2_pow_act_W * in2_pow_act_W);
channels["in3_pow_react_VAR"] = Math.sqrt(in3_pow_app_VA * in3_pow_app_VA - in3_pow_act_W * in3_pow_act_W);
var _channels6 = channels,
in1_pow_react_VAR = _channels6.in1_pow_react_VAR,
in2_pow_react_VAR = _channels6.in2_pow_react_VAR,
in3_pow_react_VAR = _channels6.in3_pow_react_VAR;
channels["sum_in123_pow_app_VA"] = in1_pow_app_VA + in2_pow_app_VA + in3_pow_app_VA;
channels["sum_in123_pow_act_W"] = in1_pow_act_W + in2_pow_act_W + in3_pow_act_W;
channels["sum_in123_pow_react_VAR"] = in1_pow_react_VAR + in2_pow_react_VAR + in3_pow_react_VAR;
}
var CHAN_NAME_POST2 = ["in1_pow_app_VA", "in2_pow_app_VA", "in3_pow_app_VA", "in1_pow_act_W", "in2_pow_act_W", "in3_pow_act_W", "in1_pow_react_VAR", "in2_pow_react_VAR", "in3_pow_react_VAR", "sum_in123_pow_app_VA", "sum_in123_pow_act_W", "sum_in123_pow_react_VAR"];
var CHAN_FIXD_POST2 = [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2];
var CHAN_NAME_FINAL = [].concat(_toConsumableArray(CHAN_NAME), CHAN_NAME_POST, CHAN_NAME_POST2);
var CHAN_FIXD_FINAL = [].concat(_toConsumableArray(CHAN_FIXD), CHAN_FIXD_POST, CHAN_FIXD_POST2);
channels = toFixed(channels, CHAN_NAME_FINAL, CHAN_FIXD_FINAL);
return _objectSpread({
flags: flags
}, channels);
}
function decodePort99(bytes) {
if (bytes.length < 4) {
return;
}
return {
"reboot_counter": uint32_LE(bytes, 0),
"app_version_major": bytes[4] || 0,
"app_version_minor": bytes[5] || 0,
"app_version_patch": bytes[6] || 0
};
}
function decodePortX(bytes, port) {
switch (port) {
case 6:
return decodePort6(bytes);
case 10:
return decodePort10(bytes);
case 99:
return decodePort99(bytes);
}
throw new Error("No decoder for port: " + port);
}

// Decode decodes an array of bytes into an object.
// - fPort contains the LoRaWAN fPort number
// - bytes is an array of bytes, e.g. [225, 230, 255, 0]
// - variables contains the device variables e.g. {"calibration": "3.5"} (both the key / value are of type string)
// The function must return an object, e.g. {"temperature": 22.5}
function Decode(fPort, bytes, variables) {
return decodePortX(bytes, fPort);
}