Skip to main content

ChirpStack v3 — Legacy Decoder v1.0.0

Legacy

This decoder is no longer maintained. It supports port 6 (v0.6 payload), port 10 (v1.0), and port 99 only. For Harvy2 devices with firmware v1.0.0 or newer, use the current ChirpStack v3 decoder in Supported.

It is kept here for existing deployments that still run firmware older than v1.0.0.

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);
}