TTN Smart Sensor (Jooby)

Sensor

Codec Description

Codec for Jooby

Codec Preview

// encoded message should be less than this size // to be able to send to a device const MAX_DATA_SEGMENT_SIZE = 50; // will have encoder/decoder after init let message; // helpers for data segments let getDataSegment; let setDataSegment; // helper const decode = ( fromBytes, input ) => { const data = {bytes: input.bytes, message: null}; const segment = getDataSegment(input.bytes); const warnings = []; const errors = []; // just a single data segment if ( segment ) { const decodeResult = fromBytes(segment); if ( decodeResult.error ) { errors.push(decodeResult.error); // there may be some partially decoded result data.message = decodeResult.message; } else { data.message = decodeResult; } } else { warnings.push('should be present one data segment'); } return {data, warnings, errors}; }; /* Get bytes from message. Input is an object with the following fields: * data - object with data to encode * data.commands - array of commands * data.config - object with messageId, accessLevel and aesKey * fPort - downlink fPort Output must be an object with the following fields: * bytes - byte array containing the downlink payload */ function encodeDownlink ( input ) { const bytes = message.downlink.toBytes(input.data.commands, input.data.config || {}); const result = {fPort: 1}; // send nothing if not fit in a single data segment if ( bytes.length > MAX_DATA_SEGMENT_SIZE ) { result.bytes = []; result.warnings = ['payload is too big for a single data segment']; } else { result.bytes = setDataSegment(bytes); } return result; } /* Get message from bytes. Input is an object with the following fields: * bytes - byte array containing the uplink payload, e.g. [255, 230, 255, 0] * fPort - uplink fPort Output must be an object with the following fields: * data - object representing the decoded payload */ function decodeUplink ( input ) { return decode(message.uplink.fromBytes, input); } /* Get message from bytes. Input is an object with the following fields: * bytes - byte array containing the downlink payload, e.g. [255, 230, 255, 0] * fPort - downlink fPort Output must be an object with the following fields: * data - object representing the decoded payload */ function decodeDownlink ( input ) { return decode(message.downlink.fromBytes, input); } //#region [autogenerated jooby-codec bundle from index.js] (function () { 'use strict'; const hexFormatOptions = { separator: ' ', prefix: '' }; const INT8_SIZE = 1; const INT16_SIZE = 2; const INT24_SIZE = 3; const INT32_SIZE = 4; const { log, pow, LN2 } = Math; const readFloat = (buffer, offset, isLittleEndian, mLen, bytes) => { var e, m, eLen = bytes * 8 - mLen - 1, eMax = (1 << eLen) - 1, eBias = eMax >> 1, nBits = -7, i = isLittleEndian ? bytes - 1 : 0, d = isLittleEndian ? -1 : 1, s = buffer[offset + i]; i += d; e = s & (1 << -nBits) - 1; s >>= -nBits; nBits += eLen; for (; nBits > 0; e = e * 0x100 + buffer[offset + i], i += d, nBits -= 8); m = e & (1 << -nBits) - 1; e >>= -nBits; nBits += mLen; for (; nBits > 0; m = m * 0x100 + buffer[offset + i], i += d, nBits -= 8); if (e === 0) { e = 1 - eBias; } else if (e === eMax) { return m ? NaN : s ? -Infinity : Infinity; } else { m = m + pow(2, mLen); e = e - eBias; } return (s ? -1 : 1) * m * pow(2, e - mLen); }; const writeFloat = (buffer, offset, value, isLittleEndian, mLen, bytes) => { var e, m, c, eLen = bytes * 8 - mLen - 1, eMax = (1 << eLen) - 1, eBias = eMax >> 1, rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0, i = isLittleEndian ? 0 : bytes - 1, d = isLittleEndian ? 1 : -1, s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0; value < 0 && (value = -value); if (value !== value || value === Infinity) { m = value !== value ? 1 : 0; e = eMax; } else { e = log(value) / LN2 | 0; if (value * (c = pow(2, -e)) < 1) { e--; c *= 2; } if (e + eBias >= 1) { value += rt / c; } else { value += rt * pow(2, 1 - eBias); } if (value * c >= 2) { e++; c /= 2; } if (e + eBias >= eMax) { m = 0; e = eMax; } else if (e + eBias >= 1) { m = (value * c - 1) * pow(2, mLen); e = e + eBias; } else { m = value * pow(2, eBias - 1) * pow(2, mLen); e = 0; } } for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 0x100, mLen -= 8); e = e << mLen | m; eLen += mLen; for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 0x100, eLen -= 8); buffer[offset + i - d] |= s * 0x80; }; const be2 = [1, 0]; const be3 = [2, 1, 0]; const be4 = [3, 2, 1, 0]; const le2 = [0, 1]; const le3 = [0, 1, 2]; const le4 = [0, 1, 2, 3]; const readUint8 = (buffer, offset) => buffer[offset]; const readUint16 = (buffer, offset, isLittleEndian) => { const order = isLittleEndian ? le2 : be2; const b0 = buffer[offset + order[0]]; const b1 = buffer[offset + order[1]] << 8; return b0 | b1; }; const readUint24 = (buffer, offset, isLittleEndian) => { const order = isLittleEndian ? le3 : be3; const b0 = buffer[offset + order[0]]; const b1 = buffer[offset + order[1]] << 8; const b2 = buffer[offset + order[2]] << 16; return b0 | b1 | b2; }; const readUint32 = (buffer, offset, isLittleEndian) => { const order = isLittleEndian ? le4 : be4; const b0 = buffer[offset + order[3]] * 0x1000000; const b1 = buffer[offset + order[2]] * 0x10000; const b2 = buffer[offset + order[1]] * 0x100; const b3 = buffer[offset + order[0]]; return b0 + b1 + b2 + b3; }; const writeUint8 = (buffer, offset, value) => { buffer[offset] = value & 0xff; }; const writeUint16 = (buffer, offset, value, isLittleEndian) => { const order = isLittleEndian ? le2 : be2; buffer[offset + order[0]] = value & 0xff; buffer[offset + order[1]] = value >>> 8 & 0xff; }; const writeUint24 = (buffer, offset, value, isLittleEndian) => { const order = isLittleEndian ? le3 : be3; buffer[offset + order[0]] = value & 0xff; buffer[offset + order[1]] = value >>> 8 & 0xff; buffer[offset + order[2]] = value >>> 16 & 0xff; }; const writeUint32 = (buffer, offset, value, isLittleEndian) => { const order = isLittleEndian ? le4 : be4; buffer[offset + order[0]] = value & 0xff; buffer[offset + order[1]] = value >>> 8 & 0xff; buffer[offset + order[2]] = value >>> 16 & 0xff; buffer[offset + order[3]] = value >>> 24 & 0xff; }; function BinaryBuffer(dataOrLength, isLittleEndian = true) { if (typeof dataOrLength === 'number') { const bytes = new Array(dataOrLength).fill(0); this.data = bytes; } else { this.data = dataOrLength; } this.offset = 0; this.isLittleEndian = isLittleEndian; } BinaryBuffer.prototype = { toUint8Array() { return this.data; }, seek(position) { if (position < 0 || position >= this.data.length) { throw new Error('Invalid position.'); } this.offset = position; }, setInt8(value) { writeUint8(this.data, this.offset, value < 0 ? value | 0x100 : value); this.offset += INT8_SIZE; }, getInt8() { const result = readUint8(this.data, this.offset); this.offset += INT8_SIZE; return result & 0x80 ? result ^ -256 : result; }, setUint8(value) { writeUint8(this.data, this.offset, value); this.offset += INT8_SIZE; }, getUint8() { const result = readUint8(this.data, this.offset); this.offset += INT8_SIZE; return result; }, setInt16(value, isLittleEndian = this.isLittleEndian) { writeUint16(this.data, this.offset, value < 0 ? value | 0x10000 : value, isLittleEndian); this.offset += INT16_SIZE; }, getInt16(isLittleEndian = this.isLittleEndian) { const result = readUint16(this.data, this.offset, isLittleEndian); this.offset += INT16_SIZE; return result & 0x8000 ? result ^ -65536 : result; }, setUint16(value, isLittleEndian = this.isLittleEndian) { writeUint16(this.data, this.offset, value, isLittleEndian); this.offset += INT16_SIZE; }, getUint16(isLittleEndian = this.isLittleEndian) { const result = readUint16(this.data, this.offset, isLittleEndian); this.offset += INT16_SIZE; return result; }, setInt24(value, isLittleEndian = this.isLittleEndian) { writeUint24(this.data, this.offset, value < 0 ? value | 0x1000000 : value, isLittleEndian); this.offset += INT24_SIZE; }, getInt24(isLittleEndian = this.isLittleEndian) { const result = readUint24(this.data, this.offset, isLittleEndian); this.offset += INT24_SIZE; return result & 0x800000 ? result ^ -16777216 : result; }, setUint24(value, isLittleEndian = this.isLittleEndian) { writeUint24(this.data, this.offset, value, isLittleEndian); this.offset += INT24_SIZE; }, getUint24(isLittleEndian = this.isLittleEndian) { const result = readUint24(this.data, this.offset, isLittleEndian); this.offset += INT24_SIZE; return result; }, setInt32(value, isLittleEndian = this.isLittleEndian) { writeUint32(this.data, this.offset, value < 0 ? value | 0x100000000 : value, isLittleEndian); this.offset += INT32_SIZE; }, getInt32(isLittleEndian = this.isLittleEndian) { const result = readUint32(this.data, this.offset, isLittleEndian); this.offset += INT32_SIZE; return result & 0x80000000 ? result ^ -4294967296 : result; }, setUint32(value, isLittleEndian = this.isLittleEndian) { writeUint32(this.data, this.offset, value, isLittleEndian); this.offset += INT32_SIZE; }, getUint32(isLittleEndian = this.isLittleEndian) { const result = readUint32(this.data, this.offset, isLittleEndian); this.offset += INT32_SIZE; return result; }, setFloat32(value, isLittleEndian = this.isLittleEndian) { writeFloat(this.data, this.offset, value, isLittleEndian, 23, 4); this.offset += INT32_SIZE; }, getFloat32(isLittleEndian = this.isLittleEndian) { const result = readFloat(this.data, this.offset, isLittleEndian, 23, 4); this.offset += INT32_SIZE; return result; }, setString(value) { this.setUint8(value.length); for (let index = 0; index < value.length; ++index) { this.setUint8(value.charCodeAt(index)); } }, getString() { const size = this.getUint8(); const endIndex = this.offset + size; const chars = []; while (this.offset < endIndex) { chars.push(String.fromCharCode(this.getUint8())); } return chars.join(''); }, getBytesToOffset(offset = this.offset) { return this.data.slice(0, offset); }, getBytesLeft() { return this.getBytes(this.bytesLeft); }, getBytes(length, offset = this.offset) { this.offset = offset + length; return this.data.slice(offset, this.offset); }, setBytes(data, offset = this.offset) { const bytes = this.data; bytes.splice(offset, data.length, ...data); this.data = bytes; this.offset = offset + data.length; } }; Object.defineProperties(BinaryBuffer.prototype, { size: { get() { return this.data.length; } }, isEmpty: { get() { if (this.offset > this.data.length) { throw new Error(`current offset ${this.offset} is outside the bounds of the buffer`); } return this.data.length - this.offset === 0; } }, bytesLeft: { get() { return this.data.length - this.offset; } }, position: { get() { return this.offset; } } }); const fromObject = (bitMask = {}, booleanObject = {}) => { let result = 0; for (const name in booleanObject) { if (name in bitMask && booleanObject[name]) { result |= bitMask[name]; } } return result; }; const toObject = (bitMask = {}, value = 0) => { const result = {}; for (const name in bitMask) { result[name] = (value & bitMask[name]) !== 0; } return result; }; const extractBits = (value, bitsNumber, startIndex) => (1 << bitsNumber) - 1 & value >> startIndex - 1; const fillBits = (value, bitsNumber, startIndex, valueToSet) => { const mask = (1 << bitsNumber) - 1 << startIndex - 1; let newValueToSet = valueToSet; let result = value; result &= ~mask; newValueToSet <<= startIndex - 1; result |= newValueToSet; return result; }; var getBytesFromHex = hex => { let cleanHex = hex.trim(); if (!cleanHex) { return []; } cleanHex = cleanHex.replace(/0x/g, '').split(/\s+/).map(byte => byte.padStart(2, '0')).join(''); if (cleanHex.length % 2 !== 0) { cleanHex = `0${cleanHex}`; } const resultLength = cleanHex.length / 2; const bytes = new Array(resultLength); for (let index = 0; index < resultLength; index++) { bytes[index] = parseInt(cleanHex.substring(index * 2, index * 2 + 2), 16); } return bytes; }; const DEVICE_TYPE_INVALID_CHAR = 'x'; const nibbles1 = ['.', '1', '3', 'R', 'M']; const nibbles2 = ['.', 'A', 'G', 'R', 'T', 'D']; const nibbles3 = ['.', '0', '1', '2', '3', '4', '5']; const nibbles4 = ['.', 'A', 'B', 'C', 'D', 'E', 'F']; const nibbles5 = ['.', 'A', 'B', 'C', 'D', 'E', 'F', 'H', 'K', 'G']; const nibbles6 = ['.', '1', '2', '3', '4']; const nibbles7 = ['.', 'L', 'M', 'Z', 'K']; const nibbles8 = ['.', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; const nibbles9 = ['.', 'D', 'B', 'C', 'E', 'P', 'R', 'O', 'L', 'F', 'S', 'M', 'Y', 'G', 'N', 'U']; const nibbles10 = ['.', '0', '1', '2', '3', '4', '5', '6', 'P', 'R', 'L', 'E', 'G', '-', '/']; const nibbles11 = ['.', 'H', 'A', 'T', '0', '0', '0', '0', '0', '1', '2', '3', '4', '0', '0', '0']; const nibbles12 = ['.', '0', '1', '2', '3', '4', '5', '6', '7', '8', 'I', 'X', 'G', 'W', 'M', '-']; const mtx1DeviceTypeDescriptorMask = { typeMeterG: 1 << 0, downgradedToA: 1 << 4, supportMeterInfo: 1 << 6 }; const mtx3DeviceTypeDescriptorMask = { typeMeterTransformer: 1 << 0, downgradedToR: 1 << 3, typeMeterG: 1 << 4, supportMeterInfo: 1 << 6, reactiveByQuadrants: 1 << 7 }; const mtx3DeviceTypeDescriptorFromByte = byte => { const descriptor = toObject(mtx3DeviceTypeDescriptorMask, byte); return { meterType: 'mtx3', ...descriptor, typeMeterG: !descriptor.typeMeterG }; }; const mtx3DeviceTypeDescriptorToByte = descriptor => fromObject(mtx3DeviceTypeDescriptorMask, { ...descriptor, typeMeterG: !descriptor.typeMeterG }); const splitByte = byte => [byte >> 4, byte & 0x0F]; const splitToNibbles = data => { const result = new Array(data.length * 2).fill(0); data.forEach((byte, index) => { const [high, low] = splitByte(byte); result[index * 2] = high; result[index * 2 + 1] = low; }); return result; }; const joinNibbles = nibbles => { const hex = []; nibbles.forEach(nibble => hex.push(nibble.toString(16))); if (nibbles.length & 1) { hex.push('0'); } return getBytesFromHex(hex.join('')); }; const fromBytesMtx = nibbles => { if (nibbles.length !== 14 && nibbles.length !== 16) { throw new Error('Device type bytes wrong size'); } const type = ['MTX ']; type.push(nibbles1[nibbles[0]] ?? DEVICE_TYPE_INVALID_CHAR); type.push(nibbles2[nibbles[1]] ?? DEVICE_TYPE_INVALID_CHAR); type.push(nibbles3[nibbles[2]] ?? DEVICE_TYPE_INVALID_CHAR); type.push(nibbles3[nibbles[3]] ?? DEVICE_TYPE_INVALID_CHAR); type.push('.'); type.push(nibbles4[nibbles[4]] ?? DEVICE_TYPE_INVALID_CHAR); type.push(nibbles5[nibbles[5]] ?? DEVICE_TYPE_INVALID_CHAR); type.push('.'); type.push(nibbles6[nibbles[6]] ?? DEVICE_TYPE_INVALID_CHAR); type.push(nibbles7[nibbles[7]] ?? DEVICE_TYPE_INVALID_CHAR); const revision = nibbles[8]; type.push(nibbles8[nibbles[9]] ?? DEVICE_TYPE_INVALID_CHAR); type.push('-'); let deviceProtocolIndex; if (nibbles.length < 14 || nibbles[12] === 0 && nibbles[13] === 0) { type.push(nibbles9[nibbles[10]] ?? DEVICE_TYPE_INVALID_CHAR); deviceProtocolIndex = 11; } else if (nibbles[13] === 0) { type.push(nibbles9[nibbles[10]] ?? DEVICE_TYPE_INVALID_CHAR); type.push(nibbles9[nibbles[11]] ?? DEVICE_TYPE_INVALID_CHAR); deviceProtocolIndex = 12; } else { type.push(nibbles9[nibbles[10]] ?? DEVICE_TYPE_INVALID_CHAR); type.push(nibbles9[nibbles[11]] ?? DEVICE_TYPE_INVALID_CHAR); type.push(nibbles9[nibbles[12]] ?? DEVICE_TYPE_INVALID_CHAR); deviceProtocolIndex = 13; } const deviceProtocolNibble = nibbles[deviceProtocolIndex]; if (deviceProtocolNibble && deviceProtocolNibble !== 0) { type.push(nibbles11[deviceProtocolNibble] ?? DEVICE_TYPE_INVALID_CHAR); } return { type: type.join(''), revision }; }; const toBytesMtx = (type, prefix, revision) => { const nibbles = []; if (type.length < 11) { throw new Error('Wrong format'); } nibbles.push(nibbles1.indexOf(type[0])); nibbles.push(nibbles2.indexOf(type[1])); nibbles.push(nibbles3.indexOf(type[2])); nibbles.push(nibbles3.indexOf(type[3])); if (type[4] !== '.') { throw new Error('Wrong format'); } nibbles.push(nibbles4.indexOf(type[5])); nibbles.push(nibbles5.indexOf(type[6])); if (type[7] !== '.') { throw new Error('Wrong format'); } nibbles.push(nibbles6.indexOf(type[8])); nibbles.push(nibbles7.indexOf(type[9])); nibbles.push(revision ?? 0); nibbles.push(nibbles8.indexOf(type[10])); if (type[11] !== '-') { throw new Error('Wrong format'); } const deviceProtocolIndex = type.length > 13 ? type.length - 1 : type.length; for (let index = 12; index < deviceProtocolIndex; index++) { nibbles.push(nibbles9.indexOf(type[index])); } if (deviceProtocolIndex < type.length) { nibbles.push(nibbles11.indexOf(type[deviceProtocolIndex])); } const bytes = joinNibbles(nibbles); const result = new Array(9).fill(0); result[0] = 0; for (let index = 0; index < bytes.length; index++) { result[index + (bytes.length < 8 ? 1 : 0)] = bytes[index]; } return result; }; const fromBytesMtx2 = nibbles => { if (nibbles.length < 14) { throw new Error('The buffer is too small'); } const type = ['MTX ']; const separator = nibbles[1] === 5 ? '-' : ' '; type.push(nibbles1[nibbles[0]] ?? DEVICE_TYPE_INVALID_CHAR); type.push(nibbles2[nibbles[1]] ?? DEVICE_TYPE_INVALID_CHAR); type.push(separator); for (let index = 2; index < nibbles.length; index++) { if (nibbles[index] !== 0) { type.push(nibbles10[nibbles[index]] ?? DEVICE_TYPE_INVALID_CHAR); } } return { type: type.join('') }; }; const toBytesMtx2 = type => { if (type.length < 3) { throw new Error('Wrong format'); } const nibbles = []; nibbles.push(nibbles1.indexOf(type[0])); nibbles.push(nibbles2.indexOf(type[1])); for (let index = 3; index < type.length; index++) { nibbles.push(nibbles10.indexOf(type[index])); } const bytes = joinNibbles(nibbles); if (bytes.length === 8) { return bytes; } if (bytes.length > 8) { throw new Error('Wrong format'); } const result = new Array(8).fill(0); for (let index = 0; index < bytes.length; index++) { result[index] = bytes[index]; } return result; }; const fromBytesM = nibbles => { if (nibbles.length < 14) { throw new Error('The buffer is too small'); } const type = []; type.push(nibbles1[nibbles[0]] ?? DEVICE_TYPE_INVALID_CHAR); for (let index = 1; index < nibbles.length; index++) { if (nibbles[index] !== 0) { type.push(nibbles12[nibbles[index]] ?? DEVICE_TYPE_INVALID_CHAR); } } return { type: type.join('') }; }; const toBytesM = type => { if (type.length < 1) { throw new Error('Wrong format'); } const nibbles = []; nibbles.push(nibbles1.indexOf(type[0])); for (let index = 1; index < type.length; index++) { nibbles.push(nibbles12.indexOf(type[index])); } const bytes = joinNibbles(nibbles); const result = new Array(8).fill(0); for (let index = 0; index < bytes.length && index < 8; index++) { result[index] = bytes[index]; } return result; }; const fromBytes$27 = bytes => { if (bytes.length !== 9) { throw new Error('The buffer is too small'); } let result; const reserve = [0x00, 0x05, 0x06, 0x07, 0x09, 0x7f, 0xef]; const position = reserve.indexOf(bytes[0]) !== -1 ? 2 : 0; const nibbles = splitToNibbles(bytes.slice(0, 8)); const deviceTypeNibble = nibbles[position]; const deviceType = nibbles1[deviceTypeNibble]; if (deviceType === '1' || deviceType === '3') { result = { ...fromBytesMtx(nibbles.slice(position)), descriptor: deviceType === '3' ? mtx3DeviceTypeDescriptorFromByte(bytes[8]) : { meterType: 'mtx1', ...toObject(mtx1DeviceTypeDescriptorMask, bytes[8]) } }; } else { result = deviceType === 'M' ? fromBytesM(nibbles) : fromBytesMtx2(nibbles); } return result; }; const toBytes$28 = ({ type, revision, descriptor }, prefix) => { if (!type.startsWith('MTX ')) { throw new Error('Wrong format'); } let result; const content = type.substring(4); const deviceTypeSymbol = type[4]; if (deviceTypeSymbol === '1' || deviceTypeSymbol === '3') { result = toBytesMtx(content, prefix, revision); } else { result = deviceTypeSymbol === 'M' ? toBytesM(content) : toBytesMtx2(content); } if (descriptor?.meterType) { result[8] = descriptor.meterType === 'mtx1' ? fromObject(mtx1DeviceTypeDescriptorMask, descriptor) : mtx3DeviceTypeDescriptorToByte(descriptor); } else { result[8] = 0; } return result; }; var getHexFromBytes = (bytes, options = {}) => { const { separator, prefix } = Object.assign({}, hexFormatOptions, options); return bytes.map(byte => `${prefix}${byte.toString(16).padStart(2, '0')}`).join(separator); }; const DATA_REQUEST = 0x50; const DATA_RESPONSE = 0x51; const IDENT_REQUEST = 0x52; const IDENT_RESPONSE = 0x53; const L2_SET_ADDRESS_REQUEST = 0x54; const L2_SET_ADDRESS_RESPONSE = 0x55; const L2_CHECK_ADDRESS_REQUEST = 0x56; const L2_CHECK_ADDRESS_RESPONSE = 0x57; const L2_RM_ADDRESS_REQUEST = 0x58; const L2_RM_ADDRESS_RESPONSE = 0x59; const FRAGMENT_REQUEST = 0x5A; const FRAGMENT_RESPONSE = 0x5B; const INVALID = 0xFF; var frameTypes = /*#__PURE__*/Object.freeze({ __proto__: null, DATA_REQUEST: DATA_REQUEST, DATA_RESPONSE: DATA_RESPONSE, FRAGMENT_REQUEST: FRAGMENT_REQUEST, FRAGMENT_RESPONSE: FRAGMENT_RESPONSE, IDENT_REQUEST: IDENT_REQUEST, IDENT_RESPONSE: IDENT_RESPONSE, INVALID: INVALID, L2_CHECK_ADDRESS_REQUEST: L2_CHECK_ADDRESS_REQUEST, L2_CHECK_ADDRESS_RESPONSE: L2_CHECK_ADDRESS_RESPONSE, L2_RM_ADDRESS_REQUEST: L2_RM_ADDRESS_REQUEST, L2_RM_ADDRESS_RESPONSE: L2_RM_ADDRESS_RESPONSE, L2_SET_ADDRESS_REQUEST: L2_SET_ADDRESS_REQUEST, L2_SET_ADDRESS_RESPONSE: L2_SET_ADDRESS_RESPONSE }); var invertObject = source => { const target = {}; for (const property in source) { const value = source[property]; target[value] = property; } return target; }; invertObject(frameTypes); const ENERGY_REGISTER_FAULT = 0x01; const VENDOR_PAR_FAULT = 0x02; const OP_PAR_FAULT = 0x03; const ACCESS_LOCKED = 0x10; const ERR_ACCESS = 0x11; const CASE_OPEN$1 = 0x12; const CASE_CLOSE = 0x13; const MAGNETIC_ON$1 = 0x14; const MAGNETIC_OFF = 0x15; const CHANGE_ACCESS_KEY0 = 0x20; const CHANGE_ACCESS_KEY1 = 0x21; const CHANGE_ACCESS_KEY2 = 0x22; const CHANGE_ACCESS_KEY3 = 0x23; const CHANGE_PAR_LOCAL = 0x24; const CHANGE_PAR_REMOTE = 0x25; const CMD_CHANGE_TIME = 0x26; const CMD_RELAY_ON = 0x27; const CMD_RELAY_OFF = 0x28; const CHANGE_COR_TIME = 0x29; const ENERGY_REGISTER_OVERFLOW = 0x31; const CHANGE_TARIFF_TABLE = 0x32; const SET_TARIFF_TABLE = 0x33; const SUMMER_TIME = 0x34; const WINTER_TIME = 0x35; const RELAY_ON = 0x36; const RELAY_OFF = 0x37; const RESTART$1 = 0x38; const WD_RESTART = 0x39; const POWER_B_ON = 0x3c; const POWER_B_OFF = 0x3d; const POWER_C_ON = 0x3e; const POWER_C_OFF = 0x3f; const V_MAX_OK = 0x40; const V_MAX_OVER = 0x41; const V_MIN_OK = 0x42; const V_MIN_OVER = 0x43; const T_MAX_OK = 0x44; const T_MAX_OVER = 0x45; const T_MIN_OK = 0x46; const T_MIN_OVER = 0x47; const F_MAX_OK = 0x48; const F_MAX_OVER = 0x49; const F_MIN_OK = 0x4a; const F_MIN_OVER = 0x4b; const I_MAX_OK = 0x4c; const I_MAX_OVER = 0x4d; const P_MAX_OK = 0x4e; const P_MAX_OVER = 0x4f; const POWER_SALDO_OK = 0x50; const POWER_SALDO_OVER = 0x51; const BATTERY_OK = 0x52; const BATTERY_FAULT = 0x53; const CALIBRATION_OK = 0x54; const CALIBRATION_FAULT = 0x55; const CLOCK_OK = 0x56; const CLOCK_FAULT = 0x57; const POWER_A_OFF = 0x58; const POWER_A_ON = 0x59; const CMD_RELAY_2_ON = 0x60; const CMD_RELAY_2_OFF = 0x61; const CROSS_ZERO_ENT0 = 0x62; const CROSS_ZERO_ENT1 = 0x63; const CROSS_ZERO_ENT2 = 0x64; const CROSS_ZERO_ENT3 = 0x65; const CALIBRATION_FLAG_SET = 0x66; const CALIBRATION_FLAG_RESET = 0x67; const BAD_TEST_EEPROM = 0x68; const BAD_TEST_FRAM = 0x69; const SET_NEW_SALDO = 0x70; const SALDO_PARAM_BAD = 0x71; const ACC_PARAM_BAD = 0x72; const ACC_PARAM_EXT_BAD = 0x73; const CALC_PERIOD_BAD = 0x74; const BLOCK_TARIFF_BAD = 0x75; const CALIBRATION_PARAM_BAD = 0x76; const WINTER_SUMMER_BAD = 0x77; const SALDO_EN_BAD = 0x78; const TIME_CORRECT$1 = 0x79; const CASE_KLEMA_OPEN = 0x7a; const CASE_KLEMA_CLOSE = 0x7b; const CASE_MODULE_OPEN$1 = 0x7c; const CASE_MODULE_CLOSE = 0x7d; const POWER_GOOD_DIO = 0x7e; const RELAY_HARD_BAD_OFF = 0x90; const RELAY_HARD_ON = 0x91; const RELAY_HARD_BAD_ON = 0x93; const RELAY_HARD_OFF = 0x94; const CHANGE_TARIFF_TBL_2 = 0x98; const SET_SALDO_PARAM = 0x9c; const POWER_OVER_RELAY_OFF = 0x9d; const CROSS_ZERO_EXPORT_ENT0 = 0x9e; const CROSS_ZERO_EXPORT_ENT1 = 0x9f; const CROSS_ZERO_EXPORT_ENT2 = 0xa0; const CROSS_ZERO_EXPORT_ENT3 = 0xa1; const TIME_CORRECT_NEW = 0xa2; const EM_MAGNETIC_ON = 0xb0; const EM_MAGNETIC_OFF = 0xb1; const CURRENT_UNEQUAL_FAULT = 0xb2; const CURRENT_UNEQUAL_OK = 0xb3; const BIPOLAR_POWER_FAULT = 0xb4; const BIPOLAR_POWER_OK = 0xb5; const RESET_EM_FLAG = 0xB6; const RESET_MAGNET_FLAG = 0xB7; const CHANGE_PARAM_CANAL = 0xB9; const RELAY_OFF_BAD_SALDO = 0xBA; const SET_DEMAND_EN_1MIN = 0xE0; const SET_DEMAND_EN_3MIN = 0xE1; const SET_DEMAND_EN_5MIN = 0xE2; const SET_DEMAND_EN_10MIN = 0xE3; const SET_DEMAND_EN_15MIN = 0xE4; const SET_DEMAND_EN_30MIN = 0xE5; const SET_DEMAND_EN_60MIN = 0xE6; const P_MAX_A_MINUS_OK = 0xE7; const P_MAX_A_MINUS_OVER = 0xE8; var events = /*#__PURE__*/Object.freeze({ __proto__: null, ACCESS_LOCKED: ACCESS_LOCKED, ACC_PARAM_BAD: ACC_PARAM_BAD, ACC_PARAM_EXT_BAD: ACC_PARAM_EXT_BAD, BAD_TEST_EEPROM: BAD_TEST_EEPROM, BAD_TEST_FRAM: BAD_TEST_FRAM, BATTERY_FAULT: BATTERY_FAULT, BATTERY_OK: BATTERY_OK, BIPOLAR_POWER_FAULT: BIPOLAR_POWER_FAULT, BIPOLAR_POWER_OK: BIPOLAR_POWER_OK, BLOCK_TARIFF_BAD: BLOCK_TARIFF_BAD, CALC_PERIOD_BAD: CALC_PERIOD_BAD, CALIBRATION_FAULT: CALIBRATION_FAULT, CALIBRATION_FLAG_RESET: CALIBRATION_FLAG_RESET, CALIBRATION_FLAG_SET: CALIBRATION_FLAG_SET, CALIBRATION_OK: CALIBRATION_OK, CALIBRATION_PARAM_BAD: CALIBRATION_PARAM_BAD, CASE_CLOSE: CASE_CLOSE, CASE_KLEMA_CLOSE: CASE_KLEMA_CLOSE, CASE_KLEMA_OPEN: CASE_KLEMA_OPEN, CASE_MODULE_CLOSE: CASE_MODULE_CLOSE, CASE_MODULE_OPEN: CASE_MODULE_OPEN$1, CASE_OPEN: CASE_OPEN$1, CHANGE_ACCESS_KEY0: CHANGE_ACCESS_KEY0, CHANGE_ACCESS_KEY1: CHANGE_ACCESS_KEY1, CHANGE_ACCESS_KEY2: CHANGE_ACCESS_KEY2, CHANGE_ACCESS_KEY3: CHANGE_ACCESS_KEY3, CHANGE_COR_TIME: CHANGE_COR_TIME, CHANGE_PARAM_CANAL: CHANGE_PARAM_CANAL, CHANGE_PAR_LOCAL: CHANGE_PAR_LOCAL, CHANGE_PAR_REMOTE: CHANGE_PAR_REMOTE, CHANGE_TARIFF_TABLE: CHANGE_TARIFF_TABLE, CHANGE_TARIFF_TBL_2: CHANGE_TARIFF_TBL_2, CLOCK_FAULT: CLOCK_FAULT, CLOCK_OK: CLOCK_OK, CMD_CHANGE_TIME: CMD_CHANGE_TIME, CMD_RELAY_2_OFF: CMD_RELAY_2_OFF, CMD_RELAY_2_ON: CMD_RELAY_2_ON, CMD_RELAY_OFF: CMD_RELAY_OFF, CMD_RELAY_ON: CMD_RELAY_ON, CROSS_ZERO_ENT0: CROSS_ZERO_ENT0, CROSS_ZERO_ENT1: CROSS_ZERO_ENT1, CROSS_ZERO_ENT2: CROSS_ZERO_ENT2, CROSS_ZERO_ENT3: CROSS_ZERO_ENT3, CROSS_ZERO_EXPORT_ENT0: CROSS_ZERO_EXPORT_ENT0, CROSS_ZERO_EXPORT_ENT1: CROSS_ZERO_EXPORT_ENT1, CROSS_ZERO_EXPORT_ENT2: CROSS_ZERO_EXPORT_ENT2, CROSS_ZERO_EXPORT_ENT3: CROSS_ZERO_EXPORT_ENT3, CURRENT_UNEQUAL_FAULT: CURRENT_UNEQUAL_FAULT, CURRENT_UNEQUAL_OK: CURRENT_UNEQUAL_OK, EM_MAGNETIC_OFF: EM_MAGNETIC_OFF, EM_MAGNETIC_ON: EM_MAGNETIC_ON, ENERGY_REGISTER_FAULT: ENERGY_REGISTER_FAULT, ENERGY_REGISTER_OVERFLOW: ENERGY_REGISTER_OVERFLOW, ERR_ACCESS: ERR_ACCESS, F_MAX_OK: F_MAX_OK, F_MAX_OVER: F_MAX_OVER, F_MIN_OK: F_MIN_OK, F_MIN_OVER: F_MIN_OVER, I_MAX_OK: I_MAX_OK, I_MAX_OVER: I_MAX_OVER, MAGNETIC_OFF: MAGNETIC_OFF, MAGNETIC_ON: MAGNETIC_ON$1, OP_PAR_FAULT: OP_PAR_FAULT, POWER_A_OFF: POWER_A_OFF, POWER_A_ON: POWER_A_ON, POWER_B_OFF: POWER_B_OFF, POWER_B_ON: POWER_B_ON, POWER_C_OFF: POWER_C_OFF, POWER_C_ON: POWER_C_ON, POWER_GOOD_DIO: POWER_GOOD_DIO, POWER_OVER_RELAY_OFF: POWER_OVER_RELAY_OFF, POWER_SALDO_OK: POWER_SALDO_OK, POWER_SALDO_OVER: POWER_SALDO_OVER, P_MAX_A_MINUS_OK: P_MAX_A_MINUS_OK, P_MAX_A_MINUS_OVER: P_MAX_A_MINUS_OVER, P_MAX_OK: P_MAX_OK, P_MAX_OVER: P_MAX_OVER, RELAY_HARD_BAD_OFF: RELAY_HARD_BAD_OFF, RELAY_HARD_BAD_ON: RELAY_HARD_BAD_ON, RELAY_HARD_OFF: RELAY_HARD_OFF, RELAY_HARD_ON: RELAY_HARD_ON, RELAY_OFF: RELAY_OFF, RELAY_OFF_BAD_SALDO: RELAY_OFF_BAD_SALDO, RELAY_ON: RELAY_ON, RESET_EM_FLAG: RESET_EM_FLAG, RESET_MAGNET_FLAG: RESET_MAGNET_FLAG, RESTART: RESTART$1, SALDO_EN_BAD: SALDO_EN_BAD, SALDO_PARAM_BAD: SALDO_PARAM_BAD, SET_DEMAND_EN_10MIN: SET_DEMAND_EN_10MIN, SET_DEMAND_EN_15MIN: SET_DEMAND_EN_15MIN, SET_DEMAND_EN_1MIN: SET_DEMAND_EN_1MIN, SET_DEMAND_EN_30MIN: SET_DEMAND_EN_30MIN, SET_DEMAND_EN_3MIN: SET_DEMAND_EN_3MIN, SET_DEMAND_EN_5MIN: SET_DEMAND_EN_5MIN, SET_DEMAND_EN_60MIN: SET_DEMAND_EN_60MIN, SET_NEW_SALDO: SET_NEW_SALDO, SET_SALDO_PARAM: SET_SALDO_PARAM, SET_TARIFF_TABLE: SET_TARIFF_TABLE, SUMMER_TIME: SUMMER_TIME, TIME_CORRECT: TIME_CORRECT$1, TIME_CORRECT_NEW: TIME_CORRECT_NEW, T_MAX_OK: T_MAX_OK, T_MAX_OVER: T_MAX_OVER, T_MIN_OK: T_MIN_OK, T_MIN_OVER: T_MIN_OVER, VENDOR_PAR_FAULT: VENDOR_PAR_FAULT, V_MAX_OK: V_MAX_OK, V_MAX_OVER: V_MAX_OVER, V_MIN_OK: V_MIN_OK, V_MIN_OVER: V_MIN_OVER, WD_RESTART: WD_RESTART, WINTER_SUMMER_BAD: WINTER_SUMMER_BAD, WINTER_TIME: WINTER_TIME }); var eventNames = invertObject(events); const TARIFF_PLAN_SIZE = 11; const OPERATOR_PARAMETERS_SIZE = 74; const SEASON_PROFILE_DAYS_NUMBER = 7; const SEASON_PROFILE_SIZE = 2 + SEASON_PROFILE_DAYS_NUMBER; const TARIFF_NUMBER$1 = 4; const PACKED_ENERGY_TYPE_SIZE = 1; const ENERGY_SIZE = 4; const DATE_SIZE$3 = 3; const MIN_HALF_HOUR_PERIODS = 48; const MAX_HALF_HOUR_PERIODS = 50; const MIN_HALF_HOUR_COMMAND_SIZE = 3 + MIN_HALF_HOUR_PERIODS * 2; const MAX_HALF_HOUR_COMMAND_SIZE = 4 + MAX_HALF_HOUR_PERIODS * 2; const baseDisplaySetMask = { SET_ALL_SEGMENT_DISPLAY: 0x0001, SOFTWARE_VERSION: 0x0002, TOTAL_ACTIVE_ENERGY: 0x0004, ACTIVE_ENERGY_T1: 0x0008, ACTIVE_ENERGY_T2: 0x0010, ACTIVE_ENERGY_T3: 0x0020, ACTIVE_ENERGY_T4: 0x0040, ACTIVE_POWER_PER_PHASE: 0x0080, ACTIVE_POWER_IN_NEUTRAL: 0x0100, CURRENT_IN_PHASE: 0x0200, CURRENT_IN_NEUTRAL: 0x0400, VOLTAGE: 0x0800, HOUR_MINUTE_SECOND: 0x1000, DATE_MONTH_YEAR: 0x2000, TOTAL_EXPORTED_ACTIVE_ENERGY: 0x4000, EXPORTED_ACTIVE_ENERGY_T1: 0x8000, EXPORTED_ACTIVE_ENERGY_T2: 0x00010000, EXPORTED_ACTIVE_ENERGY_T3: 0x00020000, EXPORTED_ACTIVE_ENERGY_T4: 0x00040000, POWER_FACTOR_PHASE_A: 0x00080000, POWER_FACTOR_PHASE_B: 0x00100000, BATTERY_VOLTAGE: 0x00200000, POWER_THRESHOLD_T1: 0x00400000, POWER_THRESHOLD_T2: 0x00800000, POWER_THRESHOLD_T3: 0x01000000, POWER_THRESHOLD_T4: 0x02000000, CURRENT_BALANCE: 0x20000000 }; const displaySetMask = { ...baseDisplaySetMask, AUTO_SCREEN_SCROLLING: 0x80000000 }; const displaySetExtMask = { ...baseDisplaySetMask, MAGNET_INDUCTION: 0x08000000, OPTOPORT_SPEED: 0x40000000, SORT_DISPLAY_SCREENS: 0x80000000 }; const relaySet1Mask = { RELAY_ON_Y: 0x01, RELAY_ON_CENTER: 0x02, RELAY_ON_PB: 0x04, RELAY_ON_TARIFF_1: 0x08, RELAY_ON_TARIFF_2: 0x10, RELAY_ON_TARIFF_3: 0x20, RELAY_ON_TARIFF_4: 0x40, RELAY_ON_V_GOOD: 0x80 }; const relaySet2Mask = { RELAY_OFF_Y: 0x01, RELAY_OFF_CENTER: 0x02, RELAY_OFF_TARIFF_1: 0x04, RELAY_OFF_TARIFF_2: 0x08, RELAY_OFF_TARIFF_3: 0x10, RELAY_OFF_TARIFF_4: 0x20, RELAY_OFF_I_LIMIT: 0x40, RELAY_OFF_V_BAD: 0x80 }; const relaySet3Mask = { RELAY_OFF_LIM_TARIFF_1: 0x02, RELAY_OFF_LIM_TARIFF_2: 0x04, RELAY_OFF_LIM_TARIFF_3: 0x08, RELAY_OFF_LIM_TARIFF_4: 0x10, RELAY_OFF_PF_MIN: 0x20 }; const relaySet4Mask = { RELAY_ON_TIMEOUT: 0x01, RELAY_ON_SALDO: 0x02, RELAY_OFF_SALDO: 0x04, RELAY_OFF_SALDO_SOFT: 0x08, RELAY_OFF_MAGNET: 0x10, RELAY_ON_MAGNET_TIMEOUT: 0x20, RELAY_ON_MAGNET_AUTO: 0x40 }; const relaySet5Mask = { RELAY_OFF_UNEQUAL_CURRENT: 0x01, RELAY_ON_UNEQUAL_CURRENT: 0x02, RELAY_OFF_BIPOLAR_POWER: 0x04, RELAY_ON_BIPOLAR_POWER: 0x08 }; const define1Mask = { BLOCK_KEY_OPTOPORT: 0x02, MAGNET_SCREEN_CONST: 0x20 }; const eventStatusMask = { CASE_OPEN: 2 ** 0, MAGNETIC_ON: 2 ** 1, PARAMETERS_UPDATE_REMOTE: 2 ** 2, PARAMETERS_UPDATE_LOCAL: 2 ** 3, RESTART: 2 ** 4, ERROR_ACCESS: 2 ** 5, TIME_SET: 2 ** 6, TIME_CORRECT: 2 ** 7, DEVICE_FAILURE: 2 ** 8, CASE_TERMINAL_OPEN: 2 ** 9, CASE_MODULE_OPEN: 2 ** 10, TARIFF_TABLE_SET: 2 ** 11, TARIFF_TABLE_GET: 2 ** 12, PROTECTION_RESET_EM: 2 ** 13, PROTECTION_RESET_MAGNETIC: 2 ** 14 }; const extendedCurrentValues2RelayStatusMask = { RELAY_STATE: 2 ** 0, RELAY_UBAD: 2 ** 1, RELAY_UNEQ_CURRENT: 2 ** 4, RELAY_OFF_CENTER: 2 ** 5, RELAY_IMAX: 2 ** 6, RELAY_PMAX: 2 ** 7 }; const extendedCurrentValues2RelayStatus2Mask = { RELAY_COSFI: 2 ** 0, RELAY_SALDO_OFF_FLAG: 2 ** 1, RELAY_UNEQUAL_CURRENT_OFF: 2 ** 2, RELAY_BIPOLAR_POWER_OFF: 2 ** 3, RELAY_SALDO_OFF_ON_MAX_POWER: 2 ** 4, RELAY_HARD_ST1: 2 ** 5, RELAY_MAGNET_OFF: 2 ** 6, RELAY_P_MINUS_MAX_OFF: 2 ** 7 }; const extendedCurrentValues2Status1Mask = { MAXVA: 2 ** 0, MINVA: 2 ** 1, MAXT: 2 ** 2, MINT: 2 ** 3, MAXF: 2 ** 4, MINF: 2 ** 5, MAXIA: 2 ** 6, MAXP: 2 ** 7 }; const extendedCurrentValues2Status2Mask = { MAX_POWER_SALDO: 2 ** 0, BATTERY_VBAT_BAD: 2 ** 1, CLOCK_UNSET: 2 ** 3, MIN_COS_FI: 2 ** 5 }; const extendedCurrentValues2Status3Mask = { UNEQUAL_CURRENT: 2 ** 0, BIPOLAR_POWER: 2 ** 1, POWER_A_NEGATIVE: 2 ** 6, POWER_B_NEGATIVE: 2 ** 7 }; const operatorParametersExtended3RelaySetMask = { RELAY_OFF_LIMIT_P_MINUS_T1: 0x08, RELAY_OFF_LIMIT_P_MINUS_T2: 0x10, RELAY_OFF_LIMIT_P_MINUS_T3: 0x20, RELAY_OFF_LIMIT_P_MINUS_T4: 0x40 }; function getPackedEnergies(buffer, energyType, tariffMapByte) { const byte = tariffMapByte >> TARIFF_NUMBER$1; const energies = new Array(TARIFF_NUMBER$1).fill(0); energies.forEach((energy, index) => { const isTariffExists = !!extractBits(byte, 1, index + 1); if (isTariffExists) { energies[index] = buffer.getInt32(); } else { energies[index] = null; } }); return energies; } function setPackedEnergyType(buffer, energyType, energies) { const indexShift = 1 + TARIFF_NUMBER$1; let tariffsByte = energyType; energies.forEach((energy, index) => { tariffsByte = fillBits(tariffsByte, 1, index + indexShift, Number(!!energy)); }); buffer.setUint8(tariffsByte); } function getEnergyPeriod(period) { if (period === 0xffff) { return { tariff: undefined, energy: undefined }; } return { tariff: period >> 14 & 0x03, energy: period & 0x3fff }; } function setEnergyPeriod(buffer, { tariff, energy }) { if (tariff !== undefined && energy !== undefined) { buffer.setUint16(tariff << 14 | energy & 0x3fff); } else { buffer.setUint16(0xffff); } } const getDayProfileFromByte = value => ({ tariff: extractBits(value, 2, 1), isFirstHalfHour: !extractBits(value, 1, 3), hour: extractBits(value, 5, 4) }); const getByteFromDayProfile = dayProfile => { let value = 0; value = fillBits(value, 2, 1, dayProfile.tariff); value = fillBits(value, 1, 3, +!dayProfile.isFirstHalfHour); value = fillBits(value, 5, 4, dayProfile.hour); return value; }; const getDeviceId$1 = function (buffer) { const manufacturer = getHexFromBytes(buffer.getBytes(3), { separator: '' }); const type = buffer.getUint8(); const year = buffer.getUint8(); const serial = getHexFromBytes(buffer.getBytes(3), { separator: '' }); return { manufacturer, type, year, serial }; }; const setDeviceId = function (buffer, { manufacturer, type, year, serial }) { buffer.setBytes(getBytesFromHex(manufacturer)); buffer.setUint8(type); buffer.setUint8(year); buffer.setBytes(getBytesFromHex(serial)); }; const getDateTime$1 = function (buffer) { return { isSummerTime: !!buffer.getUint8(), seconds: buffer.getUint8(), minutes: buffer.getUint8(), hours: buffer.getUint8(), day: buffer.getUint8(), date: buffer.getUint8(), month: buffer.getUint8(), year: buffer.getUint8() }; }; const setDateTime$1 = function (buffer, dateTime) { buffer.setUint8(dateTime.isSummerTime ? 1 : 0); buffer.setUint8(dateTime.seconds); buffer.setUint8(dateTime.minutes); buffer.setUint8(dateTime.hours); buffer.setUint8(dateTime.day || 0); buffer.setUint8(dateTime.date); buffer.setUint8(dateTime.month); buffer.setUint8(dateTime.year); }; const getTariffPlan = function (buffer) { return { id: buffer.getUint32(), tariffSet: buffer.getUint8(), activateYear: buffer.getUint8(), activateMonth: buffer.getUint8(), activateDay: buffer.getUint8(), specialProfilesArraySize: buffer.getUint8(), seasonProfilesArraySize: buffer.getUint8(), dayProfilesArraySize: buffer.getUint8() }; }; const setTariffPlan = function (buffer, tariffPlan) { buffer.setUint32(tariffPlan.id); buffer.setUint8(tariffPlan.tariffSet); buffer.setUint8(tariffPlan.activateYear); buffer.setUint8(tariffPlan.activateMonth); buffer.setUint8(tariffPlan.activateDay); buffer.setUint8(tariffPlan.specialProfilesArraySize); buffer.setUint8(tariffPlan.seasonProfilesArraySize); buffer.setUint8(tariffPlan.dayProfilesArraySize); }; const getTimeCorrectionParameters = function (buffer) { return { monthTransitionSummer: buffer.getUint8(), dateTransitionSummer: buffer.getUint8(), hoursTransitionSummer: buffer.getUint8(), hoursCorrectSummer: buffer.getUint8(), monthTransitionWinter: buffer.getUint8(), dateTransitionWinter: buffer.getUint8(), hoursTransitionWinter: buffer.getUint8(), hoursCorrectWinter: buffer.getUint8(), isCorrectionNeeded: buffer.getUint8() === 1 }; }; const setTimeCorrectionParameters = function (buffer, parameters) { buffer.setUint8(parameters.monthTransitionSummer); buffer.setUint8(parameters.dateTransitionSummer); buffer.setUint8(parameters.hoursTransitionSummer); buffer.setUint8(parameters.hoursCorrectSummer); buffer.setUint8(parameters.monthTransitionWinter); buffer.setUint8(parameters.dateTransitionWinter); buffer.setUint8(parameters.hoursTransitionWinter); buffer.setUint8(parameters.hoursCorrectWinter); buffer.setUint8(+parameters.isCorrectionNeeded); }; const setDayProfile$1 = function (buffer, dayProfile) { buffer.setUint8(getByteFromDayProfile(dayProfile)); }; const getSeasonProfile$1 = function (buffer) { return { month: buffer.getUint8(), date: buffer.getUint8(), dayIndexes: new Array(SEASON_PROFILE_DAYS_NUMBER).fill(0).map(() => buffer.getUint8()) }; }; const setSeasonProfile$1 = function (buffer, seasonProfile) { buffer.setUint8(seasonProfile.month); buffer.setUint8(seasonProfile.date); seasonProfile.dayIndexes.forEach(value => buffer.setUint8(value)); }; const getSpecialDay$1 = function (buffer) { return { month: buffer.getUint8(), date: buffer.getUint8(), dayIndex: buffer.getUint8(), isPeriodic: buffer.getUint8() === 0 }; }; const setSpecialDay$1 = function (buffer, specialDay) { buffer.setUint8(specialDay.month); buffer.setUint8(specialDay.date); buffer.setUint8(specialDay.dayIndex); buffer.setUint8(+!specialDay.isPeriodic); }; const getDeviceType$1 = function (buffer) { return fromBytes$27(buffer.getBytes(9)); }; const setDeviceType = function (buffer, deviceType) { buffer.setBytes(toBytes$28(deviceType)); }; const getOperatorParameters$1 = function (buffer) { const operatorParameters = { vpThreshold: buffer.getUint32(), vThreshold: buffer.getUint32(), ipThreshold: buffer.getUint32(), pmaxThreshold0: buffer.getUint32(), pmaxThreshold1: buffer.getUint32(), pmaxThreshold2: buffer.getUint32(), pmaxThreshold3: buffer.getUint32(), speedOptoPort: buffer.getUint8(), tint: buffer.getUint8(), calcPeriodDate: buffer.getUint8(), timeoutDisplay: buffer.getUint8(), timeoutScreen: buffer.getUint8(), displaySet: toObject(displaySetMask, buffer.getUint32()), relaySet4: toObject(relaySet4Mask, buffer.getUint8()), relaySet3: toObject(relaySet3Mask, buffer.getUint8()), relaySet2: toObject(relaySet2Mask, buffer.getUint8()), relaySet1: toObject(relaySet1Mask, buffer.getUint8()), displayType: buffer.getUint8(), ten: buffer.getUint8(), timeoutRefresh: buffer.getUint16(), deltaCorMin: buffer.getUint8(), timeoutMagnetOff: buffer.getUint8(), timeoutMagnetOn: buffer.getUint8(), define1: toObject(define1Mask, buffer.getUint8()), timeoutRelayOn: buffer.getUint8(), timeoutRelayKey: buffer.getUint8(), timeoutRelayAuto: buffer.getUint8(), timeoutBadVAVB: buffer.getUint8(), freqMax: buffer.getUint8(), freqMin: buffer.getUint8(), phMin: buffer.getUint16(), year: buffer.getUint8(), month: buffer.getUint8(), date: buffer.getUint8(), energyDecimalPoint: buffer.getUint8(), typeMeter: buffer.getUint8(), timeoutIMax: buffer.getUint8(), timeoutPMax: buffer.getUint8(), timeoutCos: buffer.getUint8(), pMaxDef: buffer.getUint8(), displaySetExt: toObject(displaySetExtMask, buffer.getUint32()), timeoutUneqCurrent: buffer.getUint8(), timeoutBipolarPower: buffer.getUint8(), relaySet5: toObject(relaySet5Mask, buffer.getUint8()), timeCorrectPeriod: 0, timeCorrectPassHalfhour: false }; const timeCorrectPeriod = buffer.getUint8(); operatorParameters.timeCorrectPeriod = timeCorrectPeriod & 0x7f; operatorParameters.timeCorrectPassHalfhour = !!(timeCorrectPeriod & 0x80); return operatorParameters; }; const setOperatorParameters$1 = function (buffer, operatorParameters) { const timeCorrectPeriod = operatorParameters.timeCorrectPeriod | (operatorParameters.timeCorrectPassHalfhour ? 0x80 : 0); buffer.setUint32(operatorParameters.vpThreshold); buffer.setUint32(operatorParameters.vThreshold); buffer.setUint32(operatorParameters.ipThreshold); buffer.setUint32(operatorParameters.pmaxThreshold0); buffer.setUint32(operatorParameters.pmaxThreshold1); buffer.setUint32(operatorParameters.pmaxThreshold2); buffer.setUint32(operatorParameters.pmaxThreshold3); buffer.setUint8(operatorParameters.speedOptoPort); buffer.setUint8(operatorParameters.tint); buffer.setUint8(operatorParameters.calcPeriodDate); buffer.setUint8(operatorParameters.timeoutDisplay); buffer.setUint8(operatorParameters.timeoutScreen); buffer.setUint32(fromObject(displaySetMask, operatorParameters.displaySet)); buffer.setUint8(fromObject(relaySet4Mask, operatorParameters.relaySet4)); buffer.setUint8(fromObject(relaySet3Mask, operatorParameters.relaySet3)); buffer.setUint8(fromObject(relaySet2Mask, operatorParameters.relaySet2)); buffer.setUint8(fromObject(relaySet1Mask, operatorParameters.relaySet1)); buffer.setUint8(operatorParameters.displayType); buffer.setUint8(operatorParameters.ten); buffer.setUint16(operatorParameters.timeoutRefresh); buffer.setUint8(operatorParameters.deltaCorMin); buffer.setUint8(operatorParameters.timeoutMagnetOff); buffer.setUint8(operatorParameters.timeoutMagnetOn); buffer.setUint8(fromObject(define1Mask, operatorParameters.define1)); buffer.setUint8(operatorParameters.timeoutRelayOn); buffer.setUint8(operatorParameters.timeoutRelayKey); buffer.setUint8(operatorParameters.timeoutRelayAuto); buffer.setUint8(operatorParameters.timeoutBadVAVB); buffer.setUint8(operatorParameters.freqMax); buffer.setUint8(operatorParameters.freqMin); buffer.setUint16(operatorParameters.phMin); buffer.setUint8(operatorParameters.year); buffer.setUint8(operatorParameters.month); buffer.setUint8(operatorParameters.date); buffer.setUint8(operatorParameters.energyDecimalPoint); buffer.setUint8(operatorParameters.typeMeter); buffer.setUint8(operatorParameters.timeoutIMax); buffer.setUint8(operatorParameters.timeoutPMax); buffer.setUint8(operatorParameters.timeoutCos); buffer.setUint8(operatorParameters.pMaxDef); buffer.setUint32(fromObject(displaySetExtMask, operatorParameters.displaySetExt)); buffer.setUint8(operatorParameters.timeoutUneqCurrent); buffer.setUint8(operatorParameters.timeoutBipolarPower); buffer.setUint8(fromObject(relaySet5Mask, operatorParameters.relaySet5)); buffer.setUint8(timeCorrectPeriod); }; const getPackedEnergyWithType = function (buffer) { const byte = buffer.getUint8(); const energyType = extractBits(byte, TARIFF_NUMBER$1, 1); const energies = getPackedEnergies(buffer, energyType, byte); return { energyType, energies }; }; const setPackedEnergyWithType = function (buffer, { energyType, energies }) { if (energyType) { setPackedEnergyType(buffer, energyType, energies); } energies.forEach(energy => { if (energy !== null) { buffer.setInt32(energy); } }); }; const getEnergies = function (buffer) { return new Array(TARIFF_NUMBER$1).fill(0).map(() => buffer.getInt32()); }; const setEnergies = function (buffer, energies) { energies.forEach(value => buffer.setInt32(value)); }; const getDate$1 = function (buffer) { return { year: buffer.getUint8(), month: buffer.getUint8(), date: buffer.getUint8() }; }; const setDate$1 = function (buffer, date) { buffer.setUint8(date.year); buffer.setUint8(date.month); buffer.setUint8(date.date); }; const getSaldoParameters$1 = function (buffer) { return { coefficients: new Array(4).fill(0).map(() => buffer.getUint32()), decimalPointTariff: buffer.getUint8(), indicationThreshold: buffer.getInt32(), relayThreshold: buffer.getInt32(), mode: buffer.getUint8(), saldoOffTimeBegin: buffer.getUint8(), saldoOffTimeEnd: buffer.getUint8(), decimalPointIndication: buffer.getUint8(), powerThreshold: buffer.getUint32(), creditThreshold: buffer.getInt32() }; }; const setSaldoParameters$1 = function (buffer, saldoParameters) { saldoParameters.coefficients.forEach(value => buffer.setUint32(value)); buffer.setUint8(saldoParameters.decimalPointTariff); buffer.setInt32(saldoParameters.indicationThreshold); buffer.setInt32(saldoParameters.relayThreshold); buffer.setUint8(saldoParameters.mode); buffer.setUint8(saldoParameters.saldoOffTimeBegin); buffer.setUint8(saldoParameters.saldoOffTimeEnd); buffer.setUint8(saldoParameters.decimalPointIndication); buffer.setUint32(saldoParameters.powerThreshold); buffer.setInt32(saldoParameters.creditThreshold); }; const getEnergyPeriods = function (buffer, periodsNumber) { const periods = new Array(periodsNumber).fill(0).map(() => buffer.getUint16()); return periods.map(period => getEnergyPeriod(period)); }; const setEnergyPeriods = function (buffer, periods) { periods.forEach(period => setEnergyPeriod(buffer, period)); }; const getEventStatus$1 = function (buffer) { const eventStatus = buffer.getUint16(); return toObject(eventStatusMask, eventStatus); }; const setEventStatus = function (buffer, parameters) { buffer.setUint16(fromObject(eventStatusMask, parameters)); }; const getExtendedCurrentValues2$1 = function (buffer) { const uBattery = buffer.getUint16(); const relayStatus = toObject(extendedCurrentValues2RelayStatusMask, buffer.getUint8()); const relayStatus2 = toObject(extendedCurrentValues2RelayStatus2Mask, buffer.getUint8()); const status1 = toObject(extendedCurrentValues2Status1Mask, buffer.getUint8()); const status2 = toObject(extendedCurrentValues2Status2Mask, buffer.getUint8()); const status3 = toObject(extendedCurrentValues2Status3Mask, buffer.getUint8()); return { uBattery, relayStatus, relayStatus2, status1, status2, status3 }; }; const setExtendedCurrentValues2 = function (buffer, parameters) { const { uBattery, relayStatus, relayStatus2, status1, status2, status3 } = parameters; buffer.setUint16(uBattery); buffer.setUint8(fromObject(extendedCurrentValues2RelayStatusMask, relayStatus)); buffer.setUint8(fromObject(extendedCurrentValues2RelayStatus2Mask, relayStatus2)); buffer.setUint8(fromObject(extendedCurrentValues2Status1Mask, status1)); buffer.setUint8(fromObject(extendedCurrentValues2Status2Mask, status2)); buffer.setUint8(fromObject(extendedCurrentValues2Status3Mask, status3)); }; const getEvent = function (buffer) { const data = { hours: buffer.getUint8(), minutes: buffer.getUint8(), seconds: buffer.getUint8(), event: buffer.getUint8() }; const { event } = data; const { bytesLeft } = buffer; data.eventName = eventNames[event]; switch (event) { case POWER_OVER_RELAY_OFF: if (bytesLeft < 4) { return data; } data.power = [buffer.getUint8(), buffer.getUint8(), buffer.getUint8(), buffer.getUint8()]; break; case CMD_CHANGE_TIME: case TIME_CORRECT$1: if (bytesLeft < 8) { return data; } data.newDate = getDateTime$1(buffer); break; } return data; }; const setEvent = function (buffer, event) { buffer.setUint8(event.hours); buffer.setUint8(event.minutes); buffer.setUint8(event.seconds); buffer.setUint8(event.event); switch (event.event) { case POWER_OVER_RELAY_OFF: for (const item of event.power) { buffer.setUint8(item); } break; case CMD_CHANGE_TIME: case TIME_CORRECT$1: setDateTime$1(buffer, event.newDate); break; } }; const getDemand$1 = function (buffer) { const date0 = buffer.getUint8(); const date1 = buffer.getUint8(); return { date: { year: date0 >> 1, month: date0 << 3 & 0x0f | date1 >> 5, date: date1 & 0x1f }, energyType: buffer.getUint8(), firstIndex: buffer.getUint16(), count: buffer.getUint8(), period: buffer.getUint8() }; }; const setDemand = function (buffer, parameters) { const date0 = parameters.date.year << 1 | parameters.date.month >> 3 & 0x01; const date1 = parameters.date.month << 5 & 0xe0 | parameters.date.date & 0x1f; buffer.setUint8(date0); buffer.setUint8(date1); buffer.setUint8(parameters.energyType); buffer.setUint16(parameters.firstIndex); buffer.setUint8(parameters.count); buffer.setUint8(parameters.period); }; const getDemandParameters$1 = function (buffer) { const channelParam1 = buffer.getUint8(); const counterInterval = buffer.getUint8(); const channelParam2 = buffer.getUint8(); return { channelParam1, counterInterval, channelParam2 }; }; const setDemandParameters$1 = function (buffer, parameters) { buffer.setUint8(parameters.channelParam1); buffer.setUint8(parameters.counterInterval); buffer.setUint8(parameters.channelParam2); buffer.setUint8(0); }; const getDayMaxDemandResponse = function (buffer) { const date = getDate$1(buffer); const power = new Array(TARIFF_NUMBER$1).fill(0).map(() => ({ hours: buffer.getUint8(), minutes: buffer.getUint8(), power: buffer.getUint32() })); return { date, power }; }; const setDayMaxDemandResponse = function (buffer, parameters) { setDate$1(buffer, parameters.date); parameters.power.forEach(value => { buffer.setUint8(value.hours); buffer.setUint8(value.minutes); buffer.setUint32(value.power); }); }; const getOperatorParametersExtended3$1 = function (buffer) { return { pmaxMinusThreshold0: buffer.getUint32(), pmaxMinusThreshold1: buffer.getUint32(), pmaxMinusThreshold2: buffer.getUint32(), pmaxMinusThreshold3: buffer.getUint32(), relaySet: toObject(operatorParametersExtended3RelaySetMask, buffer.getUint8()) }; }; const setOperatorParametersExtended3$1 = function (buffer, parameters) { const { pmaxMinusThreshold0, pmaxMinusThreshold1, pmaxMinusThreshold2, pmaxMinusThreshold3, relaySet } = parameters; buffer.setUint32(pmaxMinusThreshold0); buffer.setUint32(pmaxMinusThreshold1); buffer.setUint32(pmaxMinusThreshold2); buffer.setUint32(pmaxMinusThreshold3); buffer.setUint8(fromObject(operatorParametersExtended3RelaySetMask, relaySet)); }; const getMonthMaxPowerByTariffs = function (buffer) { return new Array(TARIFF_NUMBER$1).fill(0).map(() => ({ date: buffer.getUint8(), hours: buffer.getUint8(), minutes: buffer.getUint8(), power: buffer.getUint32() })); }; const setMonthMaxPowerByTariffs = function (buffer, tariffs) { tariffs.forEach(tariff => { buffer.setUint8(tariff.date); buffer.setUint8(tariff.hours); buffer.setUint8(tariff.minutes); buffer.setUint32(tariff.power); }); }; const getPackedEnergiesWithDateSize = parameters => { if (parameters?.energyType) { const energiesNumber = parameters.energies.filter(energy => energy !== null).length; return DATE_SIZE$3 + PACKED_ENERGY_TYPE_SIZE + energiesNumber * ENERGY_SIZE; } return DATE_SIZE$3 + ENERGY_SIZE * TARIFF_NUMBER$1; }; const toBytes$27 = (commandId, commandBytes = []) => [commandId, commandBytes.length, ...commandBytes]; const UNENCRYPTED = 0x00; const READ_ONLY = 0x03; const getEventStatus = 0x01; const getEnergyDayPrevious = 0x03; const getDeviceType = 0x04; const getDeviceId = 0x05; const getDateTime = 0x07; const setDateTime = 0x08; const setAccessKey = 0x09; const getCurrentValues = 0x0d; const getEnergy = 0x0f; const setDayProfile = 0x10; const setSeasonProfile = 0x11; const setSpecialDay = 0x12; const activateRatePlan = 0x13; const prepareRatePlan = 0x14; const getHalfHourDemand = 0x15; const getDayDemand = 0x16; const getMonthDemand = 0x17; const turnRelayOn = 0x18; const turnRelayOff = 0x19; const setCorrectTime = 0x1c; const getOperatorParameters = 0x1e; const setOperatorParameters = 0x1f; const getVersion = 0x28; const getSaldo = 0x29; const setSaldo = 0x2a; const getRatePlanInfo = 0x2c; const getExtendedCurrentValues2 = 0x2d; const getSaldoParameters = 0x2e; const setSaldoParameters = 0x2f; const getDayMaxDemand = 0x31; const getMonthMaxDemand = 0x32; const getEvents = 0x33; const getEventsCounters = 0x34; const resetPowerMaxDay = 0x35; const resetPowerMaxMonth = 0x36; const getCurrentStatusMeter = 0x39; const getExtendedCurrentValues = 0x3a; const getDayProfile = 0x3b; const getSeasonProfile = 0x3c; const getSpecialDay = 0x3d; const getCorrectTime = 0x3e; const getCriticalEvent = 0x41; const runTariffPlan = 0x46; const getDayMaxDemandPrevious = 0x4a; const getHalfHourDemandPrevious = 0x4b; const getDayDemandExport = 0x4f; const getEnergyExportDayPrevious = 0x50; const getMonthDemandExport = 0x52; const getHalfHourDemandExport = 0x53; const getDayMaxDemandExport = 0x58; const getMonthMaxDemandExport = 0x59; const getEnergyExport = 0x5b; const setCorrectDateTime = 0x5c; const setDisplayParam = 0x5d; const getDisplayParam = 0x5e; const setSpecialOperation = 0x64; const getMagneticFieldThreshold = 0x6d; const getHalfHourEnergies = 0x6f; const getBuildVersion = 0x70; const getOperatorParametersExtended3 = 0x71; const setOperatorParametersExtended3 = 0x72; const setDemandParameters = 0x74; const getDemandParameters = 0x75; const getDemand = 0x76; const getMeterInfo = 0x7a; var downlinkIds = /*#__PURE__*/Object.freeze({ __proto__: null, activateRatePlan: activateRatePlan, getBuildVersion: getBuildVersion, getCorrectTime: getCorrectTime, getCriticalEvent: getCriticalEvent, getCurrentStatusMeter: getCurrentStatusMeter, getCurrentValues: getCurrentValues, getDateTime: getDateTime, getDayDemand: getDayDemand, getDayDemandExport: getDayDemandExport, getDayMaxDemand: getDayMaxDemand, getDayMaxDemandExport: getDayMaxDemandExport, getDayMaxDemandPrevious: getDayMaxDemandPrevious, getDayProfile: getDayProfile, getDemand: getDemand, getDemandParameters: getDemandParameters, getDeviceId: getDeviceId, getDeviceType: getDeviceType, getDisplayParam: getDisplayParam, getEnergy: getEnergy, getEnergyDayPrevious: getEnergyDayPrevious, getEnergyExport: getEnergyExport, getEnergyExportDayPrevious: getEnergyExportDayPrevious, getEventStatus: getEventStatus, getEvents: getEvents, getEventsCounters: getEventsCounters, getExtendedCurrentValues: getExtendedCurrentValues, getExtendedCurrentValues2: getExtendedCurrentValues2, getHalfHourDemand: getHalfHourDemand, getHalfHourDemandExport: getHalfHourDemandExport, getHalfHourDemandPrevious: getHalfHourDemandPrevious, getHalfHourEnergies: getHalfHourEnergies, getMagneticFieldThreshold: getMagneticFieldThreshold, getMeterInfo: getMeterInfo, getMonthDemand: getMonthDemand, getMonthDemandExport: getMonthDemandExport, getMonthMaxDemand: getMonthMaxDemand, getMonthMaxDemandExport: getMonthMaxDemandExport, getOperatorParameters: getOperatorParameters, getOperatorParametersExtended3: getOperatorParametersExtended3, getRatePlanInfo: getRatePlanInfo, getSaldo: getSaldo, getSaldoParameters: getSaldoParameters, getSeasonProfile: getSeasonProfile, getSpecialDay: getSpecialDay, getVersion: getVersion, prepareRatePlan: prepareRatePlan, resetPowerMaxDay: resetPowerMaxDay, resetPowerMaxMonth: resetPowerMaxMonth, runTariffPlan: runTariffPlan, setAccessKey: setAccessKey, setCorrectDateTime: setCorrectDateTime, setCorrectTime: setCorrectTime, setDateTime: setDateTime, setDayProfile: setDayProfile, setDemandParameters: setDemandParameters, setDisplayParam: setDisplayParam, setOperatorParameters: setOperatorParameters, setOperatorParametersExtended3: setOperatorParametersExtended3, setSaldo: setSaldo, setSaldoParameters: setSaldoParameters, setSeasonProfile: setSeasonProfile, setSpecialDay: setSpecialDay, setSpecialOperation: setSpecialOperation, turnRelayOff: turnRelayOff, turnRelayOn: turnRelayOn }); var downlinkNames = invertObject(downlinkIds); const id$24 = activateRatePlan; downlinkNames[activateRatePlan]; const maxSize$1G = 1 + TARIFF_PLAN_SIZE; const fromBytes$26 = bytes => { const buffer = new BinaryBuffer(bytes, false); return { tariffTable: buffer.getUint8(), tariffPlan: getTariffPlan(buffer) }; }; const toBytes$26 = parameters => { const buffer = new BinaryBuffer(maxSize$1G, false); buffer.setUint8(parameters.tariffTable); setTariffPlan(buffer, parameters.tariffPlan); return toBytes$27(id$24, buffer.data); }; const id$23 = getBuildVersion; downlinkNames[getBuildVersion]; const maxSize$1F = 0; const fromBytes$25 = bytes => { if (bytes.length !== maxSize$1F) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$25 = () => toBytes$27(id$23); const id$22 = getCorrectTime; downlinkNames[getCorrectTime]; const maxSize$1E = 0; const fromBytes$24 = bytes => { if (bytes.length !== maxSize$1E) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$24 = () => toBytes$27(id$22); const CASE_OPEN = 0; const MAGNETIC_ON = 1; const PARAMETERS_UPDATE_REMOTE = 2; const PARAMETERS_UPDATE_LOCAL = 3; const RESTART = 4; const ERROR_ACCESS = 5; const TIME_SET = 6; const TIME_CORRECT = 7; const DEVICE_FAILURE = 8; const CASE_TERMINAL_OPEN = 9; const CASE_MODULE_OPEN = 10; const TARIFF_TABLE_SET = 11; const TARIFF_TABLE_GET = 12; const PROTECTION_RESET_EM = 13; const PROTECTION_RESET_MAGNETIC = 14; var criticalEvents = /*#__PURE__*/Object.freeze({ __proto__: null, CASE_MODULE_OPEN: CASE_MODULE_OPEN, CASE_OPEN: CASE_OPEN, CASE_TERMINAL_OPEN: CASE_TERMINAL_OPEN, DEVICE_FAILURE: DEVICE_FAILURE, ERROR_ACCESS: ERROR_ACCESS, MAGNETIC_ON: MAGNETIC_ON, PARAMETERS_UPDATE_LOCAL: PARAMETERS_UPDATE_LOCAL, PARAMETERS_UPDATE_REMOTE: PARAMETERS_UPDATE_REMOTE, PROTECTION_RESET_EM: PROTECTION_RESET_EM, PROTECTION_RESET_MAGNETIC: PROTECTION_RESET_MAGNETIC, RESTART: RESTART, TARIFF_TABLE_GET: TARIFF_TABLE_GET, TARIFF_TABLE_SET: TARIFF_TABLE_SET, TIME_CORRECT: TIME_CORRECT, TIME_SET: TIME_SET }); var criticalEventNames = invertObject(criticalEvents); const id$21 = getCriticalEvent; downlinkNames[getCriticalEvent]; const maxSize$1D = 2; const fromBytes$23 = bytes => { if (bytes.length !== maxSize$1D) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } const [event, index] = bytes; return { event, name: criticalEventNames[event], index }; }; const toBytes$23 = parameters => toBytes$27(id$21, [parameters.event, parameters.index]); const id$20 = getCurrentStatusMeter; downlinkNames[getCurrentStatusMeter]; const maxSize$1C = 0; const fromBytes$22 = bytes => { if (bytes.length !== maxSize$1C) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$22 = () => toBytes$27(id$20); const id$1$ = getCurrentValues; downlinkNames[getCurrentValues]; const maxSize$1B = 0; const fromBytes$21 = bytes => { if (bytes.length !== maxSize$1B) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$21 = () => toBytes$27(id$1$); const id$1_ = getDateTime; downlinkNames[getDateTime]; const maxSize$1A = 0; const fromBytes$20 = bytes => { if (bytes.length !== maxSize$1A) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$20 = () => toBytes$27(id$1_); const MIN_COMMAND_SIZE$5 = 3; const MAX_COMMAND_SIZE$5 = 4; const id$1Z = getDayDemand; downlinkNames[getDayDemand]; const fromBytes$1$ = bytes => { const buffer = new BinaryBuffer(bytes); if (bytes.length === MAX_COMMAND_SIZE$5) { return { date: getDate$1(buffer), energyType: buffer.getUint8() }; } return { date: getDate$1(buffer) }; }; const toBytes$1$ = parameters => { const buffer = new BinaryBuffer(parameters?.energyType ? MAX_COMMAND_SIZE$5 : MIN_COMMAND_SIZE$5); setDate$1(buffer, parameters?.date); if (parameters?.energyType) { buffer.setUint8(parameters.energyType); } return toBytes$27(id$1Z, buffer.data); }; const MIN_COMMAND_SIZE$4 = 3; const MAX_COMMAND_SIZE$4 = 4; const id$1Y = getDayDemandExport; downlinkNames[getDayDemandExport]; const fromBytes$1_ = bytes => { const buffer = new BinaryBuffer(bytes, false); if (bytes.length === MAX_COMMAND_SIZE$4) { return { date: getDate$1(buffer), energyType: buffer.getUint8() }; } return { date: getDate$1(buffer) }; }; const toBytes$1_ = parameters => { const buffer = new BinaryBuffer(parameters?.energyType ? MAX_COMMAND_SIZE$4 : MIN_COMMAND_SIZE$4, false); setDate$1(buffer, parameters?.date); if (parameters?.energyType) { buffer.setUint8(parameters.energyType); } return toBytes$27(id$1Y, buffer.data); }; const id$1X = getDayMaxDemand; downlinkNames[getDayMaxDemand]; const maxSize$1z = 3; const fromBytes$1Z = bytes => { const buffer = new BinaryBuffer(bytes, false); return { date: getDate$1(buffer) }; }; const toBytes$1Z = parameters => { const buffer = new BinaryBuffer(maxSize$1z, false); setDate$1(buffer, parameters.date); return toBytes$27(id$1X, buffer.data); }; const id$1W = getDayMaxDemandExport; downlinkNames[getDayMaxDemandExport]; const maxSize$1y = 3; const fromBytes$1Y = bytes => { const buffer = new BinaryBuffer(bytes, false); return { date: getDate$1(buffer) }; }; const toBytes$1Y = parameters => { const buffer = new BinaryBuffer(maxSize$1y, false); setDate$1(buffer, parameters.date); return toBytes$27(id$1W, buffer.data); }; const id$1V = getDayMaxDemandPrevious; downlinkNames[getDayMaxDemandPrevious]; const maxSize$1x = 0; const fromBytes$1X = bytes => { if (bytes.length !== maxSize$1x) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$1X = () => toBytes$27(id$1V); const id$1U = getDayProfile; downlinkNames[getDayProfile]; const maxSize$1w = 3; const fromBytes$1W = ([tariffTable, index, isActive]) => ({ tariffTable, index, isActive: isActive === 0 }); const toBytes$1W = parameters => { const buffer = new BinaryBuffer(maxSize$1w, false); buffer.setUint8(parameters.tariffTable); buffer.setUint8(parameters.index); buffer.setUint8(parameters.isActive ? 0 : 1); return toBytes$27(id$1U, buffer.data); }; const A_PLUS = 0x01; const A_MINUS = 0x02; const id$1T = getDemand; downlinkNames[getDemand]; const maxSize$1v = 7; const fromBytes$1V = bytes => { const buffer = new BinaryBuffer(bytes, false); return getDemand$1(buffer); }; const toBytes$1V = parameters => { const buffer = new BinaryBuffer(maxSize$1v, false); setDemand(buffer, parameters); return toBytes$27(id$1T, buffer.data); }; var validateCommandPayload = (commandName, bytes, expectedLength) => { if (!commandName) { throw new Error('Command name is required.'); } if (bytes && !Array.isArray(bytes)) { throw new Error(`Invalid payload for ${commandName}. Expected array, got: ${typeof bytes}.`); } if (bytes.length !== expectedLength) { const hex = getHexFromBytes(bytes, { separator: '' }); throw new Error(`Wrong buffer size for ${commandName}: ${bytes.length}. Expected: ${expectedLength}. Payload: 0x${hex}.`); } }; const id$1S = getDemandParameters; const name$3 = downlinkNames[getDemandParameters]; const maxSize$1u = 0; const fromBytes$1U = bytes => { validateCommandPayload(name$3, bytes, maxSize$1u); return {}; }; const toBytes$1U = () => toBytes$27(id$1S); const id$1R = getDeviceId; downlinkNames[getDeviceId]; const maxSize$1t = 0; const fromBytes$1T = bytes => { if (bytes.length !== maxSize$1t) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$1T = () => toBytes$27(id$1R); const id$1Q = getDeviceType; downlinkNames[getDeviceType]; const maxSize$1s = 0; const fromBytes$1S = bytes => { if (bytes.length !== maxSize$1s) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$1S = () => toBytes$27(id$1Q); const OK = 0; const UNKNOWN_COMMAND = 0x80; const NOT_ALIGNED_DATA = 0x81; const DECRYPTION_FAILURE = 0x82; const UNKNOWN_PROTOCOL = 0x83; const BAD_MESSAGE = 0x84; const BAD_DATA_LENGTH = 0x85; const BAD_ARRAY_INDEX = 0x86; const NOT_PREPARED_RATE_PLAN = 0x87; const BAD_RATE_PLAN_ID = 0x88; const BAD_RATE_PLAN_SIZE = 0x89; const BAD_RESPONSE_LENGTH = 0x90; const NO_DATA_FOR_DATE = 0x91; const CALIBRATION_DISABLED = 0x92; const ACCESS_DENIED = 0x93; const BAD_SALDO_WRITE = 0x95; const BLOCKED_METER = 0x97; const UNENCRYPTED_COMMAND_DISABLED = 0x98; const TIME_CORRECTION_FAILURE = 0x99; const INVALID_CORRECTION_INTERVAL = 0x9a; const TIME_CORRECTION_OUT_HALF_HOUR_DISABLED = 0x9b; const BAD_BLOCK_NUMBER = 0x9c; const OUT_OFF_RANGE = 0x9f; const SET_METER_TYPE_FAILURE = 0xa0; const INTERNAL = 0xf0; var resultCodes = /*#__PURE__*/Object.freeze({ __proto__: null, ACCESS_DENIED: ACCESS_DENIED, BAD_ARRAY_INDEX: BAD_ARRAY_INDEX, BAD_BLOCK_NUMBER: BAD_BLOCK_NUMBER, BAD_DATA_LENGTH: BAD_DATA_LENGTH, BAD_MESSAGE: BAD_MESSAGE, BAD_RATE_PLAN_ID: BAD_RATE_PLAN_ID, BAD_RATE_PLAN_SIZE: BAD_RATE_PLAN_SIZE, BAD_RESPONSE_LENGTH: BAD_RESPONSE_LENGTH, BAD_SALDO_WRITE: BAD_SALDO_WRITE, BLOCKED_METER: BLOCKED_METER, CALIBRATION_DISABLED: CALIBRATION_DISABLED, DECRYPTION_FAILURE: DECRYPTION_FAILURE, INTERNAL: INTERNAL, INVALID_CORRECTION_INTERVAL: INVALID_CORRECTION_INTERVAL, NOT_ALIGNED_DATA: NOT_ALIGNED_DATA, NOT_PREPARED_RATE_PLAN: NOT_PREPARED_RATE_PLAN, NO_DATA_FOR_DATE: NO_DATA_FOR_DATE, OK: OK, OUT_OFF_RANGE: OUT_OFF_RANGE, SET_METER_TYPE_FAILURE: SET_METER_TYPE_FAILURE, TIME_CORRECTION_FAILURE: TIME_CORRECTION_FAILURE, TIME_CORRECTION_OUT_HALF_HOUR_DISABLED: TIME_CORRECTION_OUT_HALF_HOUR_DISABLED, UNENCRYPTED_COMMAND_DISABLED: UNENCRYPTED_COMMAND_DISABLED, UNKNOWN_COMMAND: UNKNOWN_COMMAND, UNKNOWN_PROTOCOL: UNKNOWN_PROTOCOL }); var resultNames = invertObject(resultCodes); const SET_ALL_SEGMENT_DISPLAY = 1; const SOFTWARE_VERSION = 2; const TOTAL_ACTIVE_ENERGY = 3; const ACTIVE_ENERGY_T1 = 4; const ACTIVE_ENERGY_T2 = 5; const ACTIVE_ENERGY_T3 = 6; const ACTIVE_ENERGY_T4 = 7; const ACTIVE_POWER_PER_PHASE = 8; const ACTIVE_POWER_IN_NEUTRAL = 9; const CURRENT_IN_PHASE = 10; const CURRENT_IN_NEUTRAL = 11; const VOLTAGE = 12; const HOUR_MINUTE_SECOND = 13; const DATE_MONTH_YEAR = 14; const TOTAL_EXPORTED_ACTIVE_ENERGY = 15; const EXPORTED_ACTIVE_ENERGY_T1 = 16; const EXPORTED_ACTIVE_ENERGY_T2 = 17; const EXPORTED_ACTIVE_ENERGY_T3 = 18; const EXPORTED_ACTIVE_ENERGY_T4 = 19; const POWER_FACTOR_PHASE_A = 20; const POWER_FACTOR_PHASE_B = 21; const BATTERY_VOLTAGE = 22; const POWER_THRESHOLD_T1 = 23; const POWER_THRESHOLD_T2 = 24; const POWER_THRESHOLD_T3 = 25; const POWER_THRESHOLD_T4 = 26; const MAGNET_INDUCTION = 28; const CURRENT_BALANCE = 30; const OPTOPORT_SPEED = 31; var screenIds = /*#__PURE__*/Object.freeze({ __proto__: null, ACTIVE_ENERGY_T1: ACTIVE_ENERGY_T1, ACTIVE_ENERGY_T2: ACTIVE_ENERGY_T2, ACTIVE_ENERGY_T3: ACTIVE_ENERGY_T3, ACTIVE_ENERGY_T4: ACTIVE_ENERGY_T4, ACTIVE_POWER_IN_NEUTRAL: ACTIVE_POWER_IN_NEUTRAL, ACTIVE_POWER_PER_PHASE: ACTIVE_POWER_PER_PHASE, BATTERY_VOLTAGE: BATTERY_VOLTAGE, CURRENT_BALANCE: CURRENT_BALANCE, CURRENT_IN_NEUTRAL: CURRENT_IN_NEUTRAL, CURRENT_IN_PHASE: CURRENT_IN_PHASE, DATE_MONTH_YEAR: DATE_MONTH_YEAR, EXPORTED_ACTIVE_ENERGY_T1: EXPORTED_ACTIVE_ENERGY_T1, EXPORTED_ACTIVE_ENERGY_T2: EXPORTED_ACTIVE_ENERGY_T2, EXPORTED_ACTIVE_ENERGY_T3: EXPORTED_ACTIVE_ENERGY_T3, EXPORTED_ACTIVE_ENERGY_T4: EXPORTED_ACTIVE_ENERGY_T4, HOUR_MINUTE_SECOND: HOUR_MINUTE_SECOND, MAGNET_INDUCTION: MAGNET_INDUCTION, OPTOPORT_SPEED: OPTOPORT_SPEED, POWER_FACTOR_PHASE_A: POWER_FACTOR_PHASE_A, POWER_FACTOR_PHASE_B: POWER_FACTOR_PHASE_B, POWER_THRESHOLD_T1: POWER_THRESHOLD_T1, POWER_THRESHOLD_T2: POWER_THRESHOLD_T2, POWER_THRESHOLD_T3: POWER_THRESHOLD_T3, POWER_THRESHOLD_T4: POWER_THRESHOLD_T4, SET_ALL_SEGMENT_DISPLAY: SET_ALL_SEGMENT_DISPLAY, SOFTWARE_VERSION: SOFTWARE_VERSION, TOTAL_ACTIVE_ENERGY: TOTAL_ACTIVE_ENERGY, TOTAL_EXPORTED_ACTIVE_ENERGY: TOTAL_EXPORTED_ACTIVE_ENERGY, VOLTAGE: VOLTAGE }); invertObject(screenIds); const getDayEnergies = 0x78; const getDayMaxPower = 0x79; const errorResponse = 0xfe; var uplinkIds = /*#__PURE__*/Object.freeze({ __proto__: null, activateRatePlan: activateRatePlan, errorResponse: errorResponse, getBuildVersion: getBuildVersion, getCorrectTime: getCorrectTime, getCriticalEvent: getCriticalEvent, getCurrentStatusMeter: getCurrentStatusMeter, getCurrentValues: getCurrentValues, getDateTime: getDateTime, getDayDemand: getDayDemand, getDayDemandExport: getDayDemandExport, getDayEnergies: getDayEnergies, getDayMaxDemand: getDayMaxDemand, getDayMaxDemandExport: getDayMaxDemandExport, getDayMaxDemandPrevious: getDayMaxDemandPrevious, getDayMaxPower: getDayMaxPower, getDayProfile: getDayProfile, getDemand: getDemand, getDemandParameters: getDemandParameters, getDeviceId: getDeviceId, getDeviceType: getDeviceType, getDisplayParam: getDisplayParam, getEnergy: getEnergy, getEnergyDayPrevious: getEnergyDayPrevious, getEnergyExport: getEnergyExport, getEnergyExportDayPrevious: getEnergyExportDayPrevious, getEventStatus: getEventStatus, getEvents: getEvents, getEventsCounters: getEventsCounters, getExtendedCurrentValues: getExtendedCurrentValues, getExtendedCurrentValues2: getExtendedCurrentValues2, getHalfHourDemand: getHalfHourDemand, getHalfHourDemandExport: getHalfHourDemandExport, getHalfHourDemandPrevious: getHalfHourDemandPrevious, getHalfHourEnergies: getHalfHourEnergies, getMagneticFieldThreshold: getMagneticFieldThreshold, getMeterInfo: getMeterInfo, getMonthDemand: getMonthDemand, getMonthDemandExport: getMonthDemandExport, getMonthMaxDemand: getMonthMaxDemand, getMonthMaxDemandExport: getMonthMaxDemandExport, getOperatorParameters: getOperatorParameters, getOperatorParametersExtended3: getOperatorParametersExtended3, getRatePlanInfo: getRatePlanInfo, getSaldo: getSaldo, getSaldoParameters: getSaldoParameters, getSeasonProfile: getSeasonProfile, getSpecialDay: getSpecialDay, getVersion: getVersion, prepareRatePlan: prepareRatePlan, resetPowerMaxDay: resetPowerMaxDay, resetPowerMaxMonth: resetPowerMaxMonth, runTariffPlan: runTariffPlan, setAccessKey: setAccessKey, setCorrectDateTime: setCorrectDateTime, setCorrectTime: setCorrectTime, setDateTime: setDateTime, setDayProfile: setDayProfile, setDemandParameters: setDemandParameters, setDisplayParam: setDisplayParam, setOperatorParameters: setOperatorParameters, setOperatorParametersExtended3: setOperatorParametersExtended3, setSaldo: setSaldo, setSaldoParameters: setSaldoParameters, setSeasonProfile: setSeasonProfile, setSpecialDay: setSpecialDay, setSpecialOperation: setSpecialOperation, turnRelayOff: turnRelayOff, turnRelayOn: turnRelayOn }); var uplinkNames = invertObject(uplinkIds); const id$1P = getDisplayParam; downlinkNames[getDisplayParam]; const maxSize$1r = 1; const fromBytes$1R = ([displayMode]) => ({ displayMode }); const toBytes$1R = parameters => { const buffer = new BinaryBuffer(maxSize$1r, false); buffer.setUint8(parameters.displayMode); return toBytes$27(id$1P, buffer.data); }; const MIN_COMMAND_SIZE$3 = 0; const MAX_COMMAND_SIZE$3 = 1; const id$1O = getEnergy; downlinkNames[getEnergy]; const fromBytes$1Q = bytes => { if (bytes.length === MAX_COMMAND_SIZE$3) { return { energyType: bytes[0] }; } return {}; }; const toBytes$1Q = (parameters = {}) => { const buffer = new BinaryBuffer(parameters?.energyType ? MAX_COMMAND_SIZE$3 : MIN_COMMAND_SIZE$3, false); if (parameters?.energyType) { buffer.setUint8(parameters.energyType); } return toBytes$27(id$1O, buffer.data); }; const MIN_COMMAND_SIZE$2 = 0; const MAX_COMMAND_SIZE$2 = 1; const id$1N = getEnergyDayPrevious; downlinkNames[getEnergyDayPrevious]; const fromBytes$1P = bytes => { const { length } = bytes; if (length !== MAX_COMMAND_SIZE$2 && length !== MIN_COMMAND_SIZE$2) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } if (length === MAX_COMMAND_SIZE$2) { return { energyType: bytes[0] }; } return {}; }; const toBytes$1P = parameters => { if (parameters.energyType) { return toBytes$27(id$1N, [parameters.energyType]); } return toBytes$27(id$1N); }; const MIN_COMMAND_SIZE$1 = 0; const MAX_COMMAND_SIZE$1 = 1; const id$1M = getEnergyExport; downlinkNames[getEnergyExport]; const fromBytes$1O = bytes => { if (bytes.length === MAX_COMMAND_SIZE$1) { return { energyType: bytes[0] }; } return {}; }; const toBytes$1O = (parameters = {}) => { const buffer = new BinaryBuffer(parameters?.energyType ? MAX_COMMAND_SIZE$1 : MIN_COMMAND_SIZE$1, false); if (parameters?.energyType) { buffer.setUint8(parameters.energyType); } return toBytes$27(id$1M, buffer.data); }; const MIN_COMMAND_SIZE = 0; const MAX_COMMAND_SIZE = 1; const id$1L = getEnergyExportDayPrevious; downlinkNames[getEnergyExportDayPrevious]; const fromBytes$1N = bytes => { const { length } = bytes; if (length !== MAX_COMMAND_SIZE && length !== MIN_COMMAND_SIZE) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } if (length === MAX_COMMAND_SIZE) { return { energyType: bytes[0] }; } return {}; }; const toBytes$1N = parameters => { if (parameters.energyType) { return toBytes$27(id$1L, [parameters.energyType]); } return toBytes$27(id$1L); }; const id$1K = getEvents; downlinkNames[getEvents]; const maxSize$1q = 4; const fromBytes$1M = bytes => { if (bytes.length !== maxSize$1q) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } const buffer = new BinaryBuffer(bytes, false); const date = getDate$1(buffer); const offset = buffer.getUint8(); return { date, offset }; }; const toBytes$1M = parameters => { const buffer = new BinaryBuffer(maxSize$1q, false); setDate$1(buffer, parameters.date); buffer.setUint8(parameters.offset); return toBytes$27(id$1K, buffer.data); }; const id$1J = getEventsCounters; downlinkNames[getEventsCounters]; const maxSize$1p = 0; const fromBytes$1L = bytes => { if (bytes.length !== maxSize$1p) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$1L = () => toBytes$27(id$1J); const id$1I = getEventStatus; downlinkNames[getEventStatus]; const maxSize$1o = 0; const fromBytes$1K = bytes => { if (bytes.length !== maxSize$1o) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$1K = () => toBytes$27(id$1I); const id$1H = getExtendedCurrentValues; downlinkNames[getExtendedCurrentValues]; const maxSize$1n = 0; const fromBytes$1J = bytes => { if (bytes.length !== maxSize$1n) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$1J = () => toBytes$27(id$1H); const id$1G = getExtendedCurrentValues2; downlinkNames[getExtendedCurrentValues2]; const maxSize$1m = 0; const fromBytes$1I = bytes => { if (bytes.length !== maxSize$1m) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$1I = () => toBytes$27(id$1G); const id$1F = getHalfHourDemand; downlinkNames[getHalfHourDemand]; const maxSize$1l = 3; const fromBytes$1H = bytes => { const buffer = new BinaryBuffer(bytes, false); return { date: getDate$1(buffer) }; }; const toBytes$1H = parameters => { const buffer = new BinaryBuffer(maxSize$1l, false); setDate$1(buffer, parameters.date); return toBytes$27(id$1F, buffer.data); }; const id$1E = getHalfHourDemandExport; downlinkNames[getHalfHourDemandExport]; const maxSize$1k = 3; const fromBytes$1G = bytes => { const buffer = new BinaryBuffer(bytes, false); return { date: getDate$1(buffer) }; }; const toBytes$1G = parameters => { const buffer = new BinaryBuffer(maxSize$1k, false); setDate$1(buffer, parameters.date); return toBytes$27(id$1E, buffer.data); }; const id$1D = getHalfHourDemandPrevious; downlinkNames[getHalfHourDemandPrevious]; const maxSize$1j = 0; const fromBytes$1F = bytes => { if (bytes.length !== maxSize$1j) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$1F = () => toBytes$27(id$1D); const TARIFF_NUMBER = 4; const ENERGY_NAMES = ['A+', 'A+R+', 'A+R-', 'A-', 'A-R+', 'A-R-']; const UNDEFINED_ENERGY_VALUE = 0xffffffff; const energiesMask = { 'A+': 0x01, 'A+R+': 0x02, 'A+R-': 0x04, 'A-': 0x08, 'A-R+': 0x10, 'A-R-': 0x20 }; const getEnergiesFlagsLocal = energies => { const booleanObject = {}; Object.keys(energies).forEach(name => { booleanObject[name] = !!energies[name]; }); return fromObject(energiesMask, booleanObject); }; const getAPlusTariffBit = tariff => tariff < TARIFF_NUMBER ? 1 << tariff : 0; const getAMinusTariffBit = tariff => tariff < TARIFF_NUMBER ? 1 << tariff << 4 : 0; const getTariffEnergiesFlag = (tariff, energies) => { let flag = 0; if (tariff < TARIFF_NUMBER) { if (energies['A+'] || energies['A+R+'] || energies['A+R-']) { flag |= getAPlusTariffBit(tariff); } if (energies['A-'] || energies['A-R+'] || energies['A-R-']) { flag |= getAMinusTariffBit(tariff); } } return flag; }; const getDate = function (buffer) { const date0 = buffer.getUint8(); const date1 = buffer.getUint8(); return { year: date0 >> 1, month: date0 << 3 & 0x0f | date1 >> 5, date: date1 & 0x1f }; }; const setDate = function (buffer, { year, month, date }) { const date0 = year << 1 | month >> 3 & 0x01; const date1 = month << 5 & 0xe0 | date & 0x1f; buffer.setUint8(date0); buffer.setUint8(date1); }; const getEnergiesFlags = function (buffer) { const byte = buffer.getUint8(); return toObject(energiesMask, byte); }; const setEnergiesFlags = function (buffer, energies) { buffer.setUint8(getEnergiesFlagsLocal(energies)); }; const getHalfHourEnergy1 = function (buffer, halfhoursNumber) { const halfhours = []; for (let index = 0; index < halfhoursNumber; index++) { const value = buffer.getUint16(); const tariff = value >> 14 & 0b11; const energy = value & 16383; halfhours.push(value === UNDEFINED_ENERGY_VALUE ? undefined : { tariff, energy }); } return halfhours; }; const setHalfHourEnergy1 = function (buffer, halfhours) { if (halfhours) { for (let index = 0; index < halfhours.length; index++) { const { tariff, energy } = halfhours[index]; const value = tariff << 14 | energy; buffer.setUint16(value === undefined ? UNDEFINED_ENERGY_VALUE : value); } } }; const getHalfHourEnergies1 = function (buffer, energiesFlags, halfhoursNumber) { const energies = {}; ENERGY_NAMES.forEach(energyName => { if (energiesFlags[energyName]) { energies[energyName] = getHalfHourEnergy1(buffer, halfhoursNumber); } }); return energies; }; const setHalfHourEnergies1 = function (buffer, energies) { ENERGY_NAMES.forEach(energyName => { setHalfHourEnergy1(buffer, energies[energyName]); }); }; const getAPlusTariffEnergies = function (buffer, energyFlags) { const energies = {}; if (energyFlags & energiesMask['A+']) { energies['A+'] = buffer.getUint32(); } if (energyFlags & energiesMask['A+R+']) { energies['A+R+'] = buffer.getUint32(); } if (energyFlags & energiesMask['A+R-']) { energies['A+R-'] = buffer.getUint32(); } return energies; }; const setAPlusTariffEnergies = function (buffer, energies) { if (energies) { if (energies['A+']) { buffer.setUint32(energies['A+']); } if (energies['A+R+']) { buffer.setUint32(energies['A+R+']); } if (energies['A+R-']) { buffer.setUint32(energies['A+R-']); } } }; const getAMinusTariffEnergies = function (buffer, energyFlags) { const energies = {}; if (energyFlags & energiesMask['A-']) { energies['A-'] = buffer.getUint32(); } if (energyFlags & energiesMask['A-R+']) { energies['A-R+'] = buffer.getUint32(); } if (energyFlags & energiesMask['A-R-']) { energies['A-R-'] = buffer.getUint32(); } return energies; }; const setAMinusTariffEnergies = function (buffer, energies) { if (energies) { if (energies['A-']) { buffer.setUint32(energies['A-']); } if (energies['A-R+']) { buffer.setUint32(energies['A-R+']); } if (energies['A-R-']) { buffer.setUint32(energies['A-R-']); } } }; const getTariffsEnergies = function (buffer) { const energyFlags = buffer.getUint8(); const tariffFlags = buffer.getUint8(); const tariffs = new Array(TARIFF_NUMBER).fill(null); for (let index = 0; index < TARIFF_NUMBER; index++) { if (tariffFlags & getAPlusTariffBit(index)) { tariffs[index] = getAPlusTariffEnergies(buffer, energyFlags); } } for (let index = 0; index < TARIFF_NUMBER; index++) { if (tariffFlags & getAMinusTariffBit(index)) { tariffs[index] = { ...tariffs[index], ...getAMinusTariffEnergies(buffer, energyFlags) }; } } return tariffs; }; const setTariffsEnergies = function (buffer, tariffs) { let energiesFlags = 0; let tariffsFlags = 0; tariffs.forEach((tariff, index) => { if (tariff) { energiesFlags |= getEnergiesFlagsLocal(tariff); tariffsFlags |= getTariffEnergiesFlag(index, tariff); } }); buffer.setUint8(energiesFlags); buffer.setUint8(tariffsFlags); tariffs.forEach(tariff => setAPlusTariffEnergies(buffer, tariff)); tariffs.forEach(tariff => setAMinusTariffEnergies(buffer, tariff)); }; const getPowerMax = function (buffer) { return { hours: buffer.getUint8(), minutes: buffer.getUint8(), power: buffer.getUint32() }; }; const setPowerMax = function (buffer, value) { if (value) { const { hours, minutes, power } = value; buffer.setUint8(hours); buffer.setUint8(minutes); buffer.setUint32(power); } }; const getAPlusTariffPowerMax = function (buffer, energyFlags) { const energies = {}; if (energyFlags & energiesMask['A+']) { energies['A+'] = getPowerMax(buffer); } if (energyFlags & energiesMask['A+R+']) { energies['A+R+'] = getPowerMax(buffer); } if (energyFlags & energiesMask['A+R-']) { energies['A+R-'] = getPowerMax(buffer); } return energies; }; const setAPlusTariffPowerMax = function (buffer, energies) { if (energies) { setPowerMax(buffer, energies['A+']); setPowerMax(buffer, energies['A+R+']); setPowerMax(buffer, energies['A+R+']); } }; const getAMinusTariffPowerMax = function (buffer, energyFlags) { const energies = {}; if (energyFlags & energiesMask['A-']) { energies['A-'] = getPowerMax(buffer); } if (energyFlags & energiesMask['A-R+']) { energies['A-R+'] = getPowerMax(buffer); } if (energyFlags & energiesMask['A-R-']) { energies['A-R-'] = getPowerMax(buffer); } return energies; }; const setAMinusTariffPowerMax = function (buffer, energies) { if (energies) { setPowerMax(buffer, energies['A-']); setPowerMax(buffer, energies['A-R+']); setPowerMax(buffer, energies['A-R-']); } }; const getTariffsPowerMax = function (buffer) { const energyFlags = buffer.getUint8(); const tariffFlags = buffer.getUint8(); const tariffs = new Array(TARIFF_NUMBER).fill(null); for (let index = 0; index < TARIFF_NUMBER; index++) { if (tariffFlags & getAPlusTariffBit(index)) { tariffs[index] = getAPlusTariffPowerMax(buffer, energyFlags); } } for (let index = 0; index < TARIFF_NUMBER; index++) { if (tariffFlags & getAMinusTariffBit(index)) { tariffs[index] = { ...tariffs[index], ...getAMinusTariffPowerMax(buffer, energyFlags) }; } } return tariffs; }; const setTariffsPowerMax = function (buffer, tariffs) { let energiesFlags = 0; let tariffsFlags = 0; tariffs.forEach((tariff, index) => { if (tariff) { energiesFlags |= getEnergiesFlagsLocal(tariff); tariffsFlags |= getTariffEnergiesFlag(index, tariff); } }); buffer.setUint8(energiesFlags); buffer.setUint8(tariffsFlags); tariffs.forEach(tariff => setAPlusTariffPowerMax(buffer, tariff)); tariffs.forEach(tariff => setAMinusTariffPowerMax(buffer, tariff)); }; const id$1C = getHalfHourEnergies; downlinkNames[getHalfHourEnergies]; const maxSize$1i = 5; const fromBytes$1E = bytes => { const buffer = new BinaryBuffer(bytes, false); return { date: getDate(buffer), energies: getEnergiesFlags(buffer), firstHalfhour: buffer.getUint8(), halfhoursNumber: buffer.getUint8() }; }; const toBytes$1E = parameters => { const buffer = new BinaryBuffer(maxSize$1i, false); setDate(buffer, parameters.date); setEnergiesFlags(buffer, parameters.energies); buffer.setUint8(parameters.firstHalfhour); buffer.setUint8(parameters.halfhoursNumber); return toBytes$27(id$1C, buffer.data); }; const id$1B = getMagneticFieldThreshold; downlinkNames[getMagneticFieldThreshold]; const maxSize$1h = 0; const fromBytes$1D = bytes => { if (bytes.length !== maxSize$1h) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$1D = () => toBytes$27(id$1B); const id$1A = getMeterInfo; downlinkNames[getMeterInfo]; const maxSize$1g = 0; const fromBytes$1C = bytes => { if (bytes.length !== maxSize$1g) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$1C = () => toBytes$27(id$1A); const id$1z = getMonthDemand; downlinkNames[getMonthDemand]; const maxSize$1f = 2; const fromBytes$1B = bytes => { const buffer = new BinaryBuffer(bytes, false); return { year: buffer.getUint8(), month: buffer.getUint8() }; }; const toBytes$1B = parameters => { const buffer = new BinaryBuffer(maxSize$1f, false); buffer.setUint8(parameters.year); buffer.setUint8(parameters.month); return toBytes$27(id$1z, buffer.data); }; const id$1y = getMonthDemandExport; downlinkNames[getMonthDemandExport]; const maxSize$1e = 2; const fromBytes$1A = bytes => { const buffer = new BinaryBuffer(bytes, false); return { year: buffer.getUint8(), month: buffer.getUint8() }; }; const toBytes$1A = parameters => { const buffer = new BinaryBuffer(maxSize$1e, false); buffer.setUint8(parameters.year); buffer.setUint8(parameters.month); return toBytes$27(id$1y, buffer.data); }; const id$1x = getMonthMaxDemand; downlinkNames[getMonthMaxDemand]; const fromBytes$1z = bytes => { const [year, month] = bytes; return { year, month }; }; const toBytes$1z = ({ year, month }) => toBytes$27(id$1x, [year, month]); const id$1w = getMonthMaxDemandExport; downlinkNames[getMonthMaxDemandExport]; const fromBytes$1y = bytes => { const [year, month] = bytes; return { year, month }; }; const toBytes$1y = ({ year, month }) => toBytes$27(id$1w, [year, month]); const id$1v = getOperatorParameters; downlinkNames[getOperatorParameters]; const maxSize$1d = 0; const fromBytes$1x = bytes => { if (bytes.length !== maxSize$1d) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$1x = () => toBytes$27(id$1v); const id$1u = getOperatorParametersExtended3; downlinkNames[getOperatorParametersExtended3]; const maxSize$1c = 0; const fromBytes$1w = bytes => { if (bytes.length !== maxSize$1c) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$1w = () => toBytes$27(id$1u); const id$1t = getRatePlanInfo; downlinkNames[getRatePlanInfo]; const fromBytes$1v = bytes => ({ tariffTable: bytes[0] }); const toBytes$1v = parameters => toBytes$27(id$1t, [parameters.tariffTable]); const id$1s = getSaldo; downlinkNames[getSaldo]; const maxSize$1b = 0; const fromBytes$1u = bytes => { if (bytes.length !== maxSize$1b) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$1u = () => toBytes$27(id$1s); const id$1r = getSaldoParameters; downlinkNames[getSaldoParameters]; const maxSize$1a = 0; const fromBytes$1t = bytes => { if (bytes.length !== maxSize$1a) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$1t = () => toBytes$27(id$1r); const id$1q = getSeasonProfile; downlinkNames[getSeasonProfile]; const maxSize$19 = 3; const fromBytes$1s = ([tariffTable, index, isActive]) => ({ tariffTable, index, isActive: isActive === 0 }); const toBytes$1s = parameters => { const buffer = new BinaryBuffer(maxSize$19, false); buffer.setUint8(parameters.tariffTable); buffer.setUint8(parameters.index); buffer.setUint8(parameters.isActive ? 0 : 1); return toBytes$27(id$1q, buffer.data); }; const id$1p = getSpecialDay; downlinkNames[getSpecialDay]; const maxSize$18 = 3; const fromBytes$1r = ([tariffTable, index, isActive]) => ({ tariffTable, index, isActive: isActive === 0 }); const toBytes$1r = parameters => { const buffer = new BinaryBuffer(maxSize$18, false); buffer.setUint8(parameters.tariffTable); buffer.setUint8(parameters.index); buffer.setUint8(parameters.isActive ? 0 : 1); return toBytes$27(id$1p, buffer.data); }; const id$1o = getVersion; downlinkNames[getVersion]; const maxSize$17 = 0; const fromBytes$1q = bytes => { if (bytes.length !== maxSize$17) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$1q = () => toBytes$27(id$1o); const id$1n = prepareRatePlan; downlinkNames[prepareRatePlan]; const maxSize$16 = 5; const fromBytes$1p = bytes => { const buffer = new BinaryBuffer(bytes, false); return { tariffTable: buffer.getUint8(), id: buffer.getUint32() }; }; const toBytes$1p = parameters => { const buffer = new BinaryBuffer(maxSize$16, false); buffer.setUint8(parameters.tariffTable); buffer.setUint32(parameters.id); return toBytes$27(id$1n, buffer.data); }; const id$1m = resetPowerMaxDay; downlinkNames[resetPowerMaxDay]; const maxSize$15 = 0; const fromBytes$1o = bytes => { if (bytes.length !== maxSize$15) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$1o = () => toBytes$27(id$1m); const id$1l = resetPowerMaxMonth; downlinkNames[resetPowerMaxMonth]; const maxSize$14 = 0; const fromBytes$1n = bytes => { if (bytes.length !== maxSize$14) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$1n = () => toBytes$27(id$1l); const id$1k = runTariffPlan; downlinkNames[runTariffPlan]; const fromBytes$1m = bytes => ({ tariffTable: bytes[0] }); const toBytes$1m = parameters => toBytes$27(id$1k, [parameters.tariffTable]); const KEY_SIZE = 16; const id$1j = setAccessKey; downlinkNames[setAccessKey]; const maxSize$13 = 1 + KEY_SIZE; const fromBytes$1l = bytes => { const buffer = new BinaryBuffer(bytes, false); return { accessLevel: buffer.getUint8(), key: buffer.getBytes(KEY_SIZE) }; }; const toBytes$1l = parameters => { const buffer = new BinaryBuffer(maxSize$13, false); buffer.setUint8(parameters.accessLevel); buffer.setBytes(parameters.key); return toBytes$27(id$1j, buffer.data); }; const id$1i = setCorrectDateTime; downlinkNames[setCorrectDateTime]; const maxSize$12 = 2; const fromBytes$1k = bytes => { if (bytes.length !== maxSize$12) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } const buffer = new BinaryBuffer(bytes, false); return { seconds: buffer.getInt16() }; }; const toBytes$1k = parameters => { const buffer = new BinaryBuffer(maxSize$12, false); buffer.setInt16(parameters.seconds); return toBytes$27(id$1i, buffer.data); }; const id$1h = setCorrectTime; downlinkNames[setCorrectTime]; const maxSize$11 = 9; const fromBytes$1j = bytes => { if (bytes.length !== maxSize$11) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } const buffer = new BinaryBuffer(bytes, false); return getTimeCorrectionParameters(buffer); }; const toBytes$1j = parameters => { const buffer = new BinaryBuffer(maxSize$11, false); setTimeCorrectionParameters(buffer, parameters); return toBytes$27(id$1h, buffer.data); }; const id$1g = setDateTime; downlinkNames[setDateTime]; const maxSize$10 = 8; const fromBytes$1i = bytes => { const buffer = new BinaryBuffer(bytes, false); return getDateTime$1(buffer); }; const toBytes$1i = parameters => { const buffer = new BinaryBuffer(maxSize$10, false); setDateTime$1(buffer, parameters); return toBytes$27(id$1g, buffer.data); }; const MAX_PERIODS_NUMBER$1 = 8; const PERIODS_FINAL_BYTE$1 = 0xff; const id$1f = setDayProfile; downlinkNames[setDayProfile]; const fromBytes$1h = bytes => { const finalByteIndex = bytes.indexOf(PERIODS_FINAL_BYTE$1); const cleanBytes = finalByteIndex === -1 ? bytes : bytes.slice(0, finalByteIndex); const buffer = new BinaryBuffer(cleanBytes, false); return { tariffTable: buffer.getUint8(), index: buffer.getUint8(), periods: [...cleanBytes.slice(buffer.offset)].map(getDayProfileFromByte) }; }; const toBytes$1h = parameters => { const hasPeriodsFinalByte = parameters.periods.length < MAX_PERIODS_NUMBER$1; const size = 2 + parameters.periods.length + +hasPeriodsFinalByte; const buffer = new BinaryBuffer(size, false); buffer.setUint8(parameters.tariffTable); buffer.setUint8(parameters.index); parameters.periods.forEach(period => { setDayProfile$1(buffer, period); }); if (hasPeriodsFinalByte) { buffer.setUint8(PERIODS_FINAL_BYTE$1); } return toBytes$27(id$1f, buffer.data); }; const id$1e = setDemandParameters; const name$2 = downlinkNames[setDemandParameters]; const maxSize$ = 4; const fromBytes$1g = bytes => { validateCommandPayload(name$2, bytes, maxSize$); const buffer = new BinaryBuffer(bytes, false); return getDemandParameters$1(buffer); }; const toBytes$1g = parameters => { const buffer = new BinaryBuffer(maxSize$, false); setDemandParameters$1(buffer, parameters); return toBytes$27(id$1e, buffer.data); }; const id$1d = setDisplayParam; downlinkNames[setDisplayParam]; const maxSize$_ = 33; const fromBytes$1f = bytes => { if (bytes.length < 1 || bytes.length > maxSize$_) { throw new Error('Invalid SetDisplayParam data size.'); } const [displayMode, ...order] = bytes; return { displayMode, order }; }; const toBytes$1f = parameters => toBytes$27(id$1d, [parameters.displayMode, ...parameters.order]); const id$1c = setOperatorParameters; downlinkNames[setOperatorParameters]; const maxSize$Z = OPERATOR_PARAMETERS_SIZE; const fromBytes$1e = bytes => { if (bytes.length !== maxSize$Z) { throw new Error('Invalid SetOpParams data size.'); } const buffer = new BinaryBuffer(bytes, false); return getOperatorParameters$1(buffer); }; const toBytes$1e = parameters => { const buffer = new BinaryBuffer(maxSize$Z, false); setOperatorParameters$1(buffer, parameters); return toBytes$27(id$1c, buffer.data); }; const id$1b = setOperatorParametersExtended3; downlinkNames[setOperatorParametersExtended3]; const maxSize$Y = 17; const fromBytes$1d = bytes => { const buffer = new BinaryBuffer(bytes, false); return getOperatorParametersExtended3$1(buffer); }; const toBytes$1d = parameters => { const buffer = new BinaryBuffer(maxSize$Y, false); setOperatorParametersExtended3$1(buffer, parameters); return toBytes$27(id$1b, buffer.data); }; const id$1a = setSaldo; downlinkNames[setSaldo]; const maxSize$X = 12; const fromBytes$1c = bytes => { const buffer = new BinaryBuffer(bytes, false); return { date: { month: buffer.getUint8(), date: buffer.getUint8(), hours: buffer.getUint8(), minutes: buffer.getUint8() }, saldoNew: buffer.getInt32(), saldoOld: buffer.getInt32() }; }; const toBytes$1c = parameters => { const buffer = new BinaryBuffer(maxSize$X, false); buffer.setUint8(parameters.date.month); buffer.setUint8(parameters.date.date); buffer.setUint8(parameters.date.hours); buffer.setUint8(parameters.date.minutes); buffer.setInt32(parameters.saldoNew); buffer.setInt32(parameters.saldoOld); return toBytes$27(id$1a, buffer.data); }; const id$19 = setSaldoParameters; downlinkNames[setSaldoParameters]; const maxSize$W = 37; const fromBytes$1b = bytes => { const buffer = new BinaryBuffer(bytes, false); return getSaldoParameters$1(buffer); }; const toBytes$1b = parameters => { const buffer = new BinaryBuffer(maxSize$W, false); setSaldoParameters$1(buffer, parameters); return toBytes$27(id$19, buffer.data); }; const id$18 = setSeasonProfile; downlinkNames[setSeasonProfile]; const maxSize$V = SEASON_PROFILE_SIZE; const fromBytes$1a = bytes => { const buffer = new BinaryBuffer(bytes, false); return { tariffTable: buffer.getUint8(), index: buffer.getUint8(), ...getSeasonProfile$1(buffer) }; }; const toBytes$1a = parameters => { const buffer = new BinaryBuffer(maxSize$V, false); buffer.setUint8(parameters.tariffTable); buffer.setUint8(parameters.index); setSeasonProfile$1(buffer, parameters); return toBytes$27(id$18, buffer.data); }; const id$17 = setSpecialDay; downlinkNames[setSpecialDay]; const maxSize$U = 6; const fromBytes$19 = bytes => { const buffer = new BinaryBuffer(bytes, false); return { tariffTable: buffer.getUint8(), index: buffer.getUint8(), ...getSpecialDay$1(buffer) }; }; const toBytes$19 = parameters => { const buffer = new BinaryBuffer(maxSize$U, false); buffer.setUint8(parameters.tariffTable); buffer.setUint8(parameters.index); setSpecialDay$1(buffer, parameters); return toBytes$27(id$17, buffer.data); }; const id$16 = setSpecialOperation; downlinkNames[setSpecialOperation]; const maxSize$T = 2; const fromBytes$18 = bytes => { const buffer = new BinaryBuffer(bytes, false); const type = buffer.getUint8(); const flags = buffer.getUint8(); const readScreensInfo = !!(flags & 0x80); const resetElectroMagneticIndication = !!(flags & 1); const resetMagneticIndication = !!(flags & 2); return { type, readScreensInfo, resetElectroMagneticIndication, resetMagneticIndication }; }; const toBytes$18 = parameters => { const buffer = new BinaryBuffer(maxSize$T, false); let flags = 0; if (parameters.readScreensInfo) { flags |= 0x80; } if (parameters.resetElectroMagneticIndication) { flags |= 1; } if (parameters.resetMagneticIndication) { flags |= 2; } buffer.setUint8(parameters.type); buffer.setUint8(flags); return toBytes$27(id$16, buffer.data); }; const id$15 = turnRelayOff; downlinkNames[turnRelayOff]; const maxSize$S = 0; const fromBytes$17 = bytes => { if (bytes.length !== maxSize$S) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$17 = () => toBytes$27(id$15); const id$14 = turnRelayOn; downlinkNames[turnRelayOn]; const maxSize$R = 0; const fromBytes$16 = bytes => { if (bytes.length !== maxSize$R) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$16 = () => toBytes$27(id$14); // this is required to shadow crypto-js implementation const aes = { encrypt: () => {}, decrypt: () => {} }; var calculateLrc = (data, initialLrc = 0x55) => { let lrc = initialLrc; data.forEach(item => { lrc ^= item; }); return lrc; }; const ACCESS_LEVEL_MASK = 0x03; const MESSAGE_HEADER_SIZE = 2; const BLOCK_SIZE = 16; const COMMANDS_END_MARK = [0]; const COMMAND_HEADER_SIZE = 2; const getFromBytes$2 = (fromBytesMap, nameMap) => (bytes = [], config = {}) => { const aesKey = config?.aesKey; const commands = []; const [messageId, maskedAccessLevel] = bytes; const accessLevel = maskedAccessLevel & ACCESS_LEVEL_MASK; const message = { messageId, accessLevel, commands, bytes, lrc: { received: undefined, calculated: 0 } }; let messageBody = bytes.slice(MESSAGE_HEADER_SIZE); let error; if (aesKey && accessLevel !== UNENCRYPTED) { messageBody = [...aes.decrypt(aesKey, messageBody)]; } const receivedLrc = messageBody[messageBody.length - 1]; messageBody = messageBody.slice(0, -1); const calculatedLrc = calculateLrc(messageBody); if (accessLevel !== UNENCRYPTED || receivedLrc !== 0) { if (receivedLrc !== calculatedLrc) { error = 'Mismatch LRC.'; } } const accessLevel2 = messageBody[0] & ACCESS_LEVEL_MASK; const commandsData = messageBody.slice(1); if (accessLevel !== accessLevel2) { error = 'Mismatch access levels.'; } let position = 0; do { const commandId = commandsData[position]; const commandBodySize = commandsData[position + 1]; const commandSize = COMMAND_HEADER_SIZE + commandBodySize; const commandBody = commandsData.slice(position + COMMAND_HEADER_SIZE, position + commandSize); const command = { id: commandId, name: nameMap[commandId], headerSize: COMMAND_HEADER_SIZE, bytes: commandsData.slice(position, position + commandSize) }; if (!commandId) { break; } try { if (!fromBytesMap[commandId]) { throw new Error(`Unsupported command id: ${commandId}!`); } command.parameters = fromBytesMap[commandId](commandBody, config); commands.push(command); } catch (exception) { commands.push({ command, error: exception.message }); } position += commandSize; } while (position <= commandsData.length); message.lrc.calculated = calculatedLrc; message.lrc.received = receivedLrc; if (error) { return { message, error }; } return message; }; const getToBytes$1 = toBytesMap => (commands, { messageId = 1, accessLevel = READ_ONLY, aesKey }) => { const commandBytes = commands.map(command => { if ('id' in command) { return toBytesMap[command.id](command.parameters || {}); } if ('command' in command) { return command.command.bytes; } throw new Error('wrong command format'); }); const maskedAccessLevel = accessLevel | 0x10; const header = [messageId, maskedAccessLevel]; let body = [].concat(maskedAccessLevel, ...commandBytes, COMMANDS_END_MARK); if (accessLevel !== UNENCRYPTED) { const padding = (body.length + 1) % BLOCK_SIZE; if (padding) { body = body.concat(new Array(BLOCK_SIZE - padding).fill(0)); } } body = body.concat(calculateLrc(body)); if (aesKey && accessLevel !== UNENCRYPTED) { body = [...aes.encrypt(aesKey, body)]; } return header.concat(body); }; const toBytesMap$1 = {}; const fromBytesMap$1 = {}; const nameMap$1 = downlinkNames; const fromBytes$15 = getFromBytes$2(fromBytesMap$1, nameMap$1); const toBytes$15 = getToBytes$1(toBytesMap$1); toBytesMap$1[id$24] = toBytes$26; toBytesMap$1[id$23] = toBytes$25; toBytesMap$1[id$22] = toBytes$24; toBytesMap$1[id$21] = toBytes$23; toBytesMap$1[id$20] = toBytes$22; toBytesMap$1[id$1$] = toBytes$21; toBytesMap$1[id$1_] = toBytes$20; toBytesMap$1[id$1Z] = toBytes$1$; toBytesMap$1[id$1Y] = toBytes$1_; toBytesMap$1[id$1X] = toBytes$1Z; toBytesMap$1[id$1W] = toBytes$1Y; toBytesMap$1[id$1V] = toBytes$1X; toBytesMap$1[id$1U] = toBytes$1W; toBytesMap$1[id$1T] = toBytes$1V; toBytesMap$1[id$1S] = toBytes$1U; toBytesMap$1[id$1R] = toBytes$1T; toBytesMap$1[id$1Q] = toBytes$1S; toBytesMap$1[id$1P] = toBytes$1R; toBytesMap$1[id$1O] = toBytes$1Q; toBytesMap$1[id$1N] = toBytes$1P; toBytesMap$1[id$1M] = toBytes$1O; toBytesMap$1[id$1L] = toBytes$1N; toBytesMap$1[id$1K] = toBytes$1M; toBytesMap$1[id$1J] = toBytes$1L; toBytesMap$1[id$1I] = toBytes$1K; toBytesMap$1[id$1H] = toBytes$1J; toBytesMap$1[id$1G] = toBytes$1I; toBytesMap$1[id$1F] = toBytes$1H; toBytesMap$1[id$1E] = toBytes$1G; toBytesMap$1[id$1D] = toBytes$1F; toBytesMap$1[id$1C] = toBytes$1E; toBytesMap$1[id$1B] = toBytes$1D; toBytesMap$1[id$1A] = toBytes$1C; toBytesMap$1[id$1z] = toBytes$1B; toBytesMap$1[id$1y] = toBytes$1A; toBytesMap$1[id$1x] = toBytes$1z; toBytesMap$1[id$1w] = toBytes$1y; toBytesMap$1[id$1v] = toBytes$1x; toBytesMap$1[id$1u] = toBytes$1w; toBytesMap$1[id$1t] = toBytes$1v; toBytesMap$1[id$1s] = toBytes$1u; toBytesMap$1[id$1r] = toBytes$1t; toBytesMap$1[id$1q] = toBytes$1s; toBytesMap$1[id$1p] = toBytes$1r; toBytesMap$1[id$1o] = toBytes$1q; toBytesMap$1[id$1n] = toBytes$1p; toBytesMap$1[id$1m] = toBytes$1o; toBytesMap$1[id$1l] = toBytes$1n; toBytesMap$1[id$1k] = toBytes$1m; toBytesMap$1[id$1j] = toBytes$1l; toBytesMap$1[id$1i] = toBytes$1k; toBytesMap$1[id$1h] = toBytes$1j; toBytesMap$1[id$1g] = toBytes$1i; toBytesMap$1[id$1f] = toBytes$1h; toBytesMap$1[id$1e] = toBytes$1g; toBytesMap$1[id$1d] = toBytes$1f; toBytesMap$1[id$1c] = toBytes$1e; toBytesMap$1[id$1b] = toBytes$1d; toBytesMap$1[id$1a] = toBytes$1c; toBytesMap$1[id$19] = toBytes$1b; toBytesMap$1[id$18] = toBytes$1a; toBytesMap$1[id$17] = toBytes$19; toBytesMap$1[id$16] = toBytes$18; toBytesMap$1[id$15] = toBytes$17; toBytesMap$1[id$14] = toBytes$16; fromBytesMap$1[id$24] = fromBytes$26; fromBytesMap$1[id$23] = fromBytes$25; fromBytesMap$1[id$22] = fromBytes$24; fromBytesMap$1[id$21] = fromBytes$23; fromBytesMap$1[id$20] = fromBytes$22; fromBytesMap$1[id$1$] = fromBytes$21; fromBytesMap$1[id$1_] = fromBytes$20; fromBytesMap$1[id$1Z] = fromBytes$1$; fromBytesMap$1[id$1Y] = fromBytes$1_; fromBytesMap$1[id$1X] = fromBytes$1Z; fromBytesMap$1[id$1W] = fromBytes$1Y; fromBytesMap$1[id$1V] = fromBytes$1X; fromBytesMap$1[id$1U] = fromBytes$1W; fromBytesMap$1[id$1T] = fromBytes$1V; fromBytesMap$1[id$1S] = fromBytes$1U; fromBytesMap$1[id$1R] = fromBytes$1T; fromBytesMap$1[id$1Q] = fromBytes$1S; fromBytesMap$1[id$1P] = fromBytes$1R; fromBytesMap$1[id$1O] = fromBytes$1Q; fromBytesMap$1[id$1N] = fromBytes$1P; fromBytesMap$1[id$1M] = fromBytes$1O; fromBytesMap$1[id$1L] = fromBytes$1N; fromBytesMap$1[id$1K] = fromBytes$1M; fromBytesMap$1[id$1J] = fromBytes$1L; fromBytesMap$1[id$1I] = fromBytes$1K; fromBytesMap$1[id$1H] = fromBytes$1J; fromBytesMap$1[id$1G] = fromBytes$1I; fromBytesMap$1[id$1F] = fromBytes$1H; fromBytesMap$1[id$1E] = fromBytes$1G; fromBytesMap$1[id$1D] = fromBytes$1F; fromBytesMap$1[id$1C] = fromBytes$1E; fromBytesMap$1[id$1B] = fromBytes$1D; fromBytesMap$1[id$1A] = fromBytes$1C; fromBytesMap$1[id$1z] = fromBytes$1B; fromBytesMap$1[id$1y] = fromBytes$1A; fromBytesMap$1[id$1x] = fromBytes$1z; fromBytesMap$1[id$1w] = fromBytes$1y; fromBytesMap$1[id$1v] = fromBytes$1x; fromBytesMap$1[id$1u] = fromBytes$1w; fromBytesMap$1[id$1t] = fromBytes$1v; fromBytesMap$1[id$1s] = fromBytes$1u; fromBytesMap$1[id$1r] = fromBytes$1t; fromBytesMap$1[id$1q] = fromBytes$1s; fromBytesMap$1[id$1p] = fromBytes$1r; fromBytesMap$1[id$1o] = fromBytes$1q; fromBytesMap$1[id$1n] = fromBytes$1p; fromBytesMap$1[id$1m] = fromBytes$1o; fromBytesMap$1[id$1l] = fromBytes$1n; fromBytesMap$1[id$1k] = fromBytes$1m; fromBytesMap$1[id$1j] = fromBytes$1l; fromBytesMap$1[id$1i] = fromBytes$1k; fromBytesMap$1[id$1h] = fromBytes$1j; fromBytesMap$1[id$1g] = fromBytes$1i; fromBytesMap$1[id$1f] = fromBytes$1h; fromBytesMap$1[id$1e] = fromBytes$1g; fromBytesMap$1[id$1d] = fromBytes$1f; fromBytesMap$1[id$1c] = fromBytes$1e; fromBytesMap$1[id$1b] = fromBytes$1d; fromBytesMap$1[id$1a] = fromBytes$1c; fromBytesMap$1[id$19] = fromBytes$1b; fromBytesMap$1[id$18] = fromBytes$1a; fromBytesMap$1[id$17] = fromBytes$19; fromBytesMap$1[id$16] = fromBytes$18; fromBytesMap$1[id$15] = fromBytes$17; fromBytesMap$1[id$14] = fromBytes$16; var downlink = /*#__PURE__*/Object.freeze({ __proto__: null, fromBytes: fromBytes$15, fromBytesMap: fromBytesMap$1, nameMap: nameMap$1, toBytes: toBytes$15, toBytesMap: toBytesMap$1 }); const id$13 = activateRatePlan; uplinkNames[activateRatePlan]; const maxSize$Q = 0; const fromBytes$14 = bytes => { if (bytes.length !== maxSize$Q) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$14 = () => toBytes$27(id$13); const id$12 = errorResponse; uplinkNames[errorResponse]; const maxSize$P = 2; const getFromBytes$1 = commandNamesParameter => bytes => { const buffer = new BinaryBuffer(bytes, false); const errorCommandId = buffer.getUint8(); const errorCode = buffer.getUint8(); return { commandId: errorCommandId, commandName: commandNamesParameter[errorCommandId], errorCode, errorName: resultNames[errorCode] }; }; const fromBytes$13 = getFromBytes$1(uplinkNames); const toBytes$13 = parameters => { const buffer = new BinaryBuffer(maxSize$P, false); buffer.setUint8(parameters.commandId); buffer.setUint8(parameters.errorCode); return toBytes$27(id$12, buffer.data); }; const id$11 = getBuildVersion; uplinkNames[getBuildVersion]; const maxSize$O = 6; const fromBytes$12 = bytes => { if (bytes.length !== maxSize$O) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } const [date, month, year, n3, n2, n1] = bytes; return { date: { date, month, year }, version: `${n3}.${n2}.${n1}` }; }; const toBytes$12 = parameters => { const { date, version } = parameters; const versionParts = version.split('.').map(part => parseInt(part, 10)); return toBytes$27(id$11, [date.date, date.month, date.year, ...versionParts]); }; const id$10 = getCorrectTime; uplinkNames[getCorrectTime]; const maxSize$N = 9; const fromBytes$11 = bytes => { const buffer = new BinaryBuffer(bytes, false); return getTimeCorrectionParameters(buffer); }; const toBytes$11 = parameters => { const buffer = new BinaryBuffer(maxSize$N, false); setTimeCorrectionParameters(buffer, parameters); return toBytes$27(id$10, buffer.data); }; const id$ = getCriticalEvent; uplinkNames[getCriticalEvent]; const maxSize$M = 9; const fromBytes$10 = bytes => { if (bytes.length !== maxSize$M) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } const [event, index, year, month, date, hours, minutes, seconds, count] = bytes; return { event, name: criticalEventNames[event], index, date: { year, month, date, hours, minutes, seconds }, count }; }; const toBytes$10 = parameters => { const { event, index, date, count } = parameters; return toBytes$27(id$, [event, index, date.year, date.month, date.date, date.hours, date.minutes, date.seconds, count]); }; const id$_ = getCurrentStatusMeter; uplinkNames[getCurrentStatusMeter]; const maxSize$L = 31; const calibrationFlagsMask = { calibrationEnable: 0x01, hardkey: 0x02, keyPressTest: 0x04, keyOpenkeyTest: 0x08, keyGerkonTest: 0x10, keyOpenKlemaTest: 0x20, keyOpenModuleTest: 0x40, keyPress2Test: 0x80 }; const fromBytes$ = bytes => { const buffer = new BinaryBuffer(bytes, false); const operatingSeconds = buffer.getUint32(); const tbadVAVB = buffer.getUint32(); const tbadImaxAll = buffer.getUint32(); const tbadPmaxAll = buffer.getUint32(); buffer.getUint32(); const tbadFREQ = buffer.getUint32(); const relayStatus = toObject(extendedCurrentValues2RelayStatusMask, buffer.getUint8()); const statusEvent1 = buffer.getUint8(); const statusEvent2 = buffer.getUint8(); const calibrationFlags = toObject(calibrationFlagsMask, buffer.getUint8()); const currentTariffs = { 'A+': buffer.getUint8(), 'A-': buffer.getUint8() }; const isSummerTime = !!(buffer.getUint8() & 1); const statusEventValue = statusEvent1 | statusEvent2 << 8; return { operatingSeconds, tbadVAVB, tbadImaxAll, tbadPmaxAll, tbadFREQ, relayStatus, statusEvent: toObject(eventStatusMask, statusEventValue), calibrationFlags, currentTariffs, isSummerTime }; }; const toBytes$ = parameters => { const buffer = new BinaryBuffer(maxSize$L, false); const statusEventValue = fromObject(eventStatusMask, parameters.statusEvent); buffer.setUint32(parameters.operatingSeconds); buffer.setUint32(parameters.tbadVAVB); buffer.setUint32(parameters.tbadImaxAll); buffer.setUint32(parameters.tbadPmaxAll); buffer.setUint32(0); buffer.setUint32(parameters.tbadFREQ); buffer.setUint8(fromObject(extendedCurrentValues2RelayStatusMask, parameters.relayStatus)); buffer.setUint8(statusEventValue & 0xff); buffer.setUint8(statusEventValue >> 8 & 0xff); buffer.setUint8(fromObject(calibrationFlagsMask, parameters.calibrationFlags)); buffer.setUint8(parameters.currentTariffs['A+']); buffer.setUint8(parameters.currentTariffs['A-']); buffer.setUint8(parameters.isSummerTime ? 1 : 0); return toBytes$27(id$_, buffer.data); }; const id$Z = getCurrentValues; uplinkNames[getCurrentValues]; const maxSize$K = 32; const fromBytes$_ = bytes => { const buffer = new BinaryBuffer(bytes, false); return { powerA: buffer.getInt32(), iaRms: buffer.getInt32(), vavbRms: buffer.getInt32(), varA: buffer.getInt32(), pfA: buffer.getInt16() / 1000, ibRms: buffer.getInt32(), powerB: buffer.getInt32(), varB: buffer.getInt32(), pfB: buffer.getInt16() / 1000 }; }; const toBytes$_ = parameters => { const buffer = new BinaryBuffer(maxSize$K, false); buffer.setInt32(parameters.powerA); buffer.setInt32(parameters.iaRms); buffer.setInt32(parameters.vavbRms); buffer.setInt32(parameters.varA); buffer.setInt16(parameters.pfA * 1000); buffer.setInt32(parameters.ibRms); buffer.setInt32(parameters.powerB); buffer.setInt32(parameters.varB); buffer.setInt16(parameters.pfB * 1000); return toBytes$27(id$Z, buffer.data); }; const id$Y = getDateTime; uplinkNames[getDateTime]; const maxSize$J = 8; const fromBytes$Z = bytes => { const buffer = new BinaryBuffer(bytes, false); return getDateTime$1(buffer); }; const toBytes$Z = parameters => { const buffer = new BinaryBuffer(maxSize$J, false); setDateTime$1(buffer, parameters); return toBytes$27(id$Y, buffer.data); }; const COMMAND_SIZE$5 = 19; const id$X = getDayDemand; uplinkNames[getDayDemand]; const fromBytes$Y = bytes => { const buffer = new BinaryBuffer(bytes, false); let parameters; if (bytes.length === COMMAND_SIZE$5) { parameters = { date: getDate$1(buffer), energies: getEnergies(buffer) }; } else { parameters = { date: getDate$1(buffer), ...getPackedEnergyWithType(buffer) }; } return parameters; }; const toBytes$Y = parameters => { let size = COMMAND_SIZE$5; if (parameters?.energyType) { const energiesNumber = parameters.energies.filter(energy => energy !== null).length; size = DATE_SIZE$3 + PACKED_ENERGY_TYPE_SIZE + energiesNumber * ENERGY_SIZE; } const buffer = new BinaryBuffer(size, false); setDate$1(buffer, parameters.date); setPackedEnergyWithType(buffer, parameters); return toBytes$27(id$X, buffer.data); }; const COMMAND_SIZE$4 = 19; const id$W = getDayDemandExport; uplinkNames[getDayDemandExport]; const fromBytes$X = bytes => { const buffer = new BinaryBuffer(bytes, false); let parameters; if (bytes.length === COMMAND_SIZE$4) { parameters = { date: getDate$1(buffer), energies: getEnergies(buffer) }; } else { parameters = { date: getDate$1(buffer), ...getPackedEnergyWithType(buffer) }; } return parameters; }; const toBytes$X = parameters => { let size = COMMAND_SIZE$4; if (parameters?.energyType) { const energiesNumber = parameters.energies.filter(energy => energy !== null).length; size = DATE_SIZE$3 + PACKED_ENERGY_TYPE_SIZE + energiesNumber * ENERGY_SIZE; } const buffer = new BinaryBuffer(size, false); setDate$1(buffer, parameters.date); setPackedEnergyWithType(buffer, parameters); return toBytes$27(id$W, buffer.data); }; const DATE_SIZE$2 = 2; const ENERGY_FLAGS_SIZE$2 = 1; const TARIFF_FLAGS_SIZE$1 = 1; const MAX_TARIFFS_ENERGIES_SIZE$1 = 6 * 4 * 4; const id$V = getDayEnergies; uplinkNames[getDayEnergies]; const maxSize$I = DATE_SIZE$2 + ENERGY_FLAGS_SIZE$2 + TARIFF_FLAGS_SIZE$1 + MAX_TARIFFS_ENERGIES_SIZE$1; const fromBytes$W = bytes => { const buffer = new BinaryBuffer(bytes, false); return { date: getDate(buffer), energies: getTariffsEnergies(buffer) }; }; const toBytes$W = parameters => { const buffer = new BinaryBuffer(maxSize$I, false); setDate(buffer, parameters.date); setTariffsEnergies(buffer, parameters.energies); return toBytes$27(id$V, buffer.getBytesToOffset()); }; const id$U = getDayMaxDemand; uplinkNames[getDayMaxDemand]; const maxSize$H = 27; const fromBytes$V = bytes => { const buffer = new BinaryBuffer(bytes, false); return getDayMaxDemandResponse(buffer); }; const toBytes$V = parameters => { const buffer = new BinaryBuffer(maxSize$H, false); setDayMaxDemandResponse(buffer, parameters); return toBytes$27(id$U, buffer.getBytesToOffset()); }; const id$T = getDayMaxDemandExport; uplinkNames[getDayMaxDemandExport]; const maxSize$G = 27; const fromBytes$U = bytes => { const buffer = new BinaryBuffer(bytes, false); return getDayMaxDemandResponse(buffer); }; const toBytes$U = parameters => { const buffer = new BinaryBuffer(maxSize$G, false); setDayMaxDemandResponse(buffer, parameters); return toBytes$27(id$T, buffer.getBytesToOffset()); }; const id$S = getDayMaxDemandPrevious; uplinkNames[getDayMaxDemandPrevious]; const maxSize$F = 27; const fromBytes$T = bytes => { const buffer = new BinaryBuffer(bytes, false); return getDayMaxDemandResponse(buffer); }; const toBytes$T = parameters => { const buffer = new BinaryBuffer(maxSize$F, false); setDayMaxDemandResponse(buffer, parameters); return toBytes$27(id$S, buffer.getBytesToOffset()); }; const DATE_SIZE$1 = 2; const ENERGY_FLAGS_SIZE$1 = 1; const TARIFF_FLAGS_SIZE = 1; const MAX_TARIFFS_ENERGIES_SIZE = 6 * 4 * (1 + 1 + 4); const id$R = getDayMaxPower; uplinkNames[getDayMaxPower]; const maxSize$E = DATE_SIZE$1 + ENERGY_FLAGS_SIZE$1 + TARIFF_FLAGS_SIZE + MAX_TARIFFS_ENERGIES_SIZE; const fromBytes$S = bytes => { const buffer = new BinaryBuffer(bytes, false); return { date: getDate(buffer), tariffs: getTariffsPowerMax(buffer) }; }; const toBytes$S = parameters => { const buffer = new BinaryBuffer(maxSize$E, false); setDate(buffer, parameters.date); setTariffsPowerMax(buffer, parameters.tariffs); return toBytes$27(id$R, buffer.getBytesToOffset()); }; const MAX_PERIODS_NUMBER = 8; const PERIODS_FINAL_BYTE = 0xff; const id$Q = getDayProfile; uplinkNames[getDayProfile]; const fromBytes$R = bytes => { const finalByteIndex = bytes.indexOf(PERIODS_FINAL_BYTE); const cleanData = finalByteIndex === -1 ? bytes : bytes.slice(0, finalByteIndex); return { periods: [...cleanData].map(getDayProfileFromByte) }; }; const toBytes$R = parameters => { const hasPeriodsFinalByte = parameters.periods.length < MAX_PERIODS_NUMBER; const size = parameters.periods.length + +hasPeriodsFinalByte; const buffer = new BinaryBuffer(size, false); parameters.periods.forEach(period => { setDayProfile$1(buffer, period); }); if (hasPeriodsFinalByte) { buffer.setUint8(PERIODS_FINAL_BYTE); } return toBytes$27(id$Q, buffer.data); }; const ADDITIONAL_HOUR = 25; const getRecordIndex = (hours, minutes, periodMin) => Math.trunc((hours * 60 + minutes) / periodMin); const getLastSummerHourIndex = periodMin => getRecordIndex(ADDITIONAL_HOUR, 0, periodMin); const energyFromWord = (word, index, periodMin) => { if (word === 0xffff) { return null; } const indexLastSummerRecord = getLastSummerHourIndex(periodMin); if (index === indexLastSummerRecord) { return { lastSummerHour: word >> 8 & 0xff }; } return periodMin === 60 ? { energy: word } : { tariff: word >> 14 & 0x03, energy: word & 0x3fff }; }; const energyToWord = data => { if (data === null) { return 0xffff; } const { energy, tariff, lastSummerHour } = data; if (lastSummerHour) { return lastSummerHour << 8 | 0xff; } return tariff ? tariff << 14 | energy & 0x3fff : energy; }; const energyFromBinary = (bytes, offset, periodMin = 30) => bytes.reduce((collector, value, index) => { collector.push(energyFromWord(value, (offset ?? 0) + index, periodMin)); return collector; }, []); const energyToBinary = energies => energies.reduce((collector, value) => { collector.push(energyToWord(value)); return collector; }, []); const voltageFromWord = (word, index, periodMin) => { if (word === 0xffff) { return 0xffff; } const indexLastSummerRecord = getLastSummerHourIndex(periodMin); return index === indexLastSummerRecord ? { lastSummerHour: word >> 8 & 0xff } : { voltage: word }; }; const voltageToWord = ({ voltage, lastSummerHour }) => { if (lastSummerHour) { return lastSummerHour << 8 | 0xff; } return voltage; }; const voltageFromBinary = (bytes, offset, periodMin = 30) => bytes.reduce((collector, value, index) => { collector.push(voltageFromWord(value, (offset ?? 0) + index, periodMin)); return collector; }, []); const voltageToBinary = energies => energies.reduce((collector, value) => { collector.push(voltageToWord(value)); return collector; }, []); const id$P = getDemand; uplinkNames[getDemand]; const fromBytes$Q = bytes => { if (!bytes || bytes.length < maxSize$1v) { throw new Error('Invalid uplink GetDemand byte length.'); } const buffer = new BinaryBuffer(bytes, false); const parameters = getDemand$1(buffer); if (bytes.length !== maxSize$1v + 2 * parameters.count) { throw new Error('Invalid uplink GetDemand demands byte length.'); } const demandsBytes = new Array(parameters.count).fill(0).map(() => buffer.getUint16()); const isEnergiesDemand = parameters.energyType === A_PLUS || parameters.energyType === A_MINUS; parameters.demands = isEnergiesDemand ? energyFromBinary(demandsBytes, parameters.firstIndex, parameters.period) : voltageFromBinary(demandsBytes, parameters.firstIndex, parameters.period); return parameters; }; const toBytes$Q = parameters => { const buffer = new BinaryBuffer(maxSize$1v + parameters.count * 2, false); setDemand(buffer, parameters); if (parameters.energyType === A_PLUS || parameters.energyType === A_MINUS) { energyToBinary(parameters.demands).forEach(value => buffer.setUint16(value)); } else { voltageToBinary(parameters.demands).forEach(value => buffer.setUint16(value)); } return toBytes$27(id$P, buffer.data); }; const id$O = getDemandParameters; const name$1 = uplinkNames[getDemandParameters]; const maxSize$D = 4; const fromBytes$P = bytes => { validateCommandPayload(name$1, bytes, maxSize$D); const buffer = new BinaryBuffer(bytes, false); return getDemandParameters$1(buffer); }; const toBytes$P = parameters => { const buffer = new BinaryBuffer(maxSize$D, false); setDemandParameters$1(buffer, parameters); return toBytes$27(id$O, buffer.data); }; const id$N = getDeviceId; uplinkNames[getDeviceId]; const maxSize$C = 8; const fromBytes$O = bytes => { const buffer = new BinaryBuffer(bytes, false); return getDeviceId$1(buffer); }; const toBytes$O = parameters => { const buffer = new BinaryBuffer(maxSize$C, false); setDeviceId(buffer, parameters); return toBytes$27(id$N, buffer.data); }; const id$M = getDeviceType; uplinkNames[getDeviceType]; const maxSize$B = 9; const fromBytes$N = bytes => { const buffer = new BinaryBuffer(bytes, false); return getDeviceType$1(buffer); }; const toBytes$N = parameters => { const buffer = new BinaryBuffer(maxSize$B, false); setDeviceType(buffer, parameters); return toBytes$27(id$M, buffer.data); }; const id$L = getDisplayParam; uplinkNames[getDisplayParam]; const fromBytes$M = bytes => { const [displayMode, ...order] = bytes; return { displayMode, order }; }; const toBytes$M = parameters => toBytes$27(id$L, [parameters.displayMode, ...parameters.order]); const COMMAND_SIZE$3 = 16; const id$K = getEnergy; uplinkNames[getEnergy]; const fromBytes$L = bytes => { const buffer = new BinaryBuffer(bytes, false); let parameters; if (bytes.length === COMMAND_SIZE$3) { parameters = { energies: getEnergies(buffer) }; } else { parameters = getPackedEnergyWithType(buffer); } return parameters; }; const toBytes$L = parameters => { let size = COMMAND_SIZE$3; if (parameters?.energyType) { const energiesNumber = parameters.energies.filter(energy => energy !== null).length; size = PACKED_ENERGY_TYPE_SIZE + energiesNumber * ENERGY_SIZE; } const buffer = new BinaryBuffer(size, false); setPackedEnergyWithType(buffer, parameters); return toBytes$27(id$K, buffer.data); }; const COMMAND_SIZE$2 = 19; const id$J = getEnergyDayPrevious; uplinkNames[getEnergyDayPrevious]; const fromBytes$K = bytes => { const buffer = new BinaryBuffer(bytes, false); let parameters; if (bytes.length === COMMAND_SIZE$2) { parameters = { date: getDate$1(buffer), energies: getEnergies(buffer) }; } else { parameters = { date: getDate$1(buffer), ...getPackedEnergyWithType(buffer) }; } return parameters; }; const toBytes$K = parameters => { const buffer = new BinaryBuffer(getPackedEnergiesWithDateSize(parameters), false); setDate$1(buffer, parameters.date); setPackedEnergyWithType(buffer, parameters); return toBytes$27(id$J, buffer.data); }; const COMMAND_SIZE$1 = 16; const id$I = getEnergyExport; uplinkNames[getEnergyExport]; const fromBytes$J = bytes => { const buffer = new BinaryBuffer(bytes, false); let parameters; if (bytes.length === COMMAND_SIZE$1) { parameters = { energies: getEnergies(buffer) }; } else { parameters = getPackedEnergyWithType(buffer); } return parameters; }; const toBytes$J = parameters => { let size = COMMAND_SIZE$1; if (parameters?.energyType) { const energiesNumber = parameters.energies.filter(energy => energy !== null).length; size = PACKED_ENERGY_TYPE_SIZE + energiesNumber * ENERGY_SIZE; } const buffer = new BinaryBuffer(size, false); setPackedEnergyWithType(buffer, parameters); return toBytes$27(id$I, buffer.data); }; const COMMAND_SIZE = 19; const id$H = getEnergyExportDayPrevious; uplinkNames[getEnergyExportDayPrevious]; const fromBytes$I = bytes => { const buffer = new BinaryBuffer(bytes, false); let parameters; if (bytes.length === COMMAND_SIZE) { parameters = { date: getDate$1(buffer), energies: getEnergies(buffer) }; } else { parameters = { date: getDate$1(buffer), ...getPackedEnergyWithType(buffer) }; } return parameters; }; const toBytes$I = parameters => { const buffer = new BinaryBuffer(getPackedEnergiesWithDateSize(parameters), false); setDate$1(buffer, parameters.date); setPackedEnergyWithType(buffer, parameters); return toBytes$27(id$H, buffer.data); }; const BODY_WITHOUT_EVENTS_SIZE = 3 + 1; const EVENT_SIZE = 4; const id$G = getEvents; uplinkNames[getEvents]; const maxSize$A = BODY_WITHOUT_EVENTS_SIZE + 255 * EVENT_SIZE; const getFromBytes = BinaryBufferConstructor => bytes => { if (bytes.length > maxSize$A) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } const buffer = new BinaryBufferConstructor(bytes, false); const date = getDate$1(buffer); const eventsNumber = buffer.getUint8(); const events = []; while (!buffer.isEmpty) { events.push(getEvent(buffer)); } return { date, eventsNumber, events }; }; const getToBytes = BinaryBufferConstructor => parameters => { const buffer = new BinaryBufferConstructor(maxSize$A, false); setDate$1(buffer, parameters.date); buffer.setUint8(parameters.eventsNumber); for (const event of parameters.events) { setEvent(buffer, event); } return toBytes$27(id$G, buffer.getBytesToOffset()); }; const fromBytes$H = getFromBytes(BinaryBuffer); const toBytes$H = getToBytes(BinaryBuffer); const COMMAND_BODY_SIZE = 14; const OLD_COMMAND_BODY_SIZE = 20; const id$F = getEventsCounters; uplinkNames[getEventsCounters]; const fromBytes$G = bytes => { if (bytes.length !== COMMAND_BODY_SIZE && bytes.length !== OLD_COMMAND_BODY_SIZE) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } const buffer = new BinaryBuffer(bytes, false); const restart = buffer.getUint16(); const powerOff = buffer.getUint16(); const localParametersChange = buffer.getUint16(); const remoteParametersChange = buffer.getUint16(); const accessError = buffer.getUint16(); const accessClosed = buffer.getUint16(); const setClock = buffer.getUint16(); return { accessClosed, accessError, localParametersChange, remoteParametersChange, powerOff, restart, setClock }; }; const toBytes$G = parameters => { const buffer = new BinaryBuffer(COMMAND_BODY_SIZE, false); buffer.setUint16(parameters.restart); buffer.setUint16(parameters.powerOff); buffer.setUint16(parameters.localParametersChange); buffer.setUint16(parameters.remoteParametersChange); buffer.setUint16(parameters.accessError); buffer.setUint16(parameters.accessClosed); buffer.setUint16(parameters.setClock); return toBytes$27(id$F, buffer.data); }; const id$E = getEventStatus; uplinkNames[getEventStatus]; const maxSize$z = 2; const fromBytes$F = bytes => { const buffer = new BinaryBuffer(bytes, true); return getEventStatus$1(buffer); }; const toBytes$F = eventStatus => { const buffer = new BinaryBuffer(maxSize$z, true); setEventStatus(buffer, eventStatus); return toBytes$27(id$E, buffer.data); }; const id$D = getExtendedCurrentValues; uplinkNames[getExtendedCurrentValues]; const maxSize$y = 4; const fromBytes$E = bytes => { const buffer = new BinaryBuffer(bytes, false); return { temperature: buffer.getInt16(), frequency: buffer.getInt16() }; }; const toBytes$E = parameters => { const buffer = new BinaryBuffer(maxSize$y, false); buffer.setInt16(parameters.temperature); buffer.setInt16(parameters.frequency); return toBytes$27(id$D, buffer.data); }; const id$C = getExtendedCurrentValues2; uplinkNames[getExtendedCurrentValues2]; const maxSize$x = 7; const fromBytes$D = bytes => { const buffer = new BinaryBuffer(bytes, false); return getExtendedCurrentValues2$1(buffer); }; const toBytes$D = parameters => { const buffer = new BinaryBuffer(maxSize$x, false); setExtendedCurrentValues2(buffer, parameters); return toBytes$27(id$C, buffer.data); }; const id$B = getHalfHourDemand; uplinkNames[getHalfHourDemand]; const fromBytes$C = bytes => { const buffer = new BinaryBuffer(bytes, false); const hasDst = bytes.length > MIN_HALF_HOUR_COMMAND_SIZE; const date = getDate$1(buffer); const periods = getEnergyPeriods(buffer, hasDst ? MAX_HALF_HOUR_PERIODS : MIN_HALF_HOUR_PERIODS); if (hasDst) { return { date, periods, dstHour: buffer.getUint8() }; } return { date, periods }; }; const toBytes$C = parameters => { const buffer = new BinaryBuffer(parameters.periods.length > MIN_HALF_HOUR_PERIODS ? MAX_HALF_HOUR_COMMAND_SIZE : MIN_HALF_HOUR_COMMAND_SIZE, false); setDate$1(buffer, parameters.date); setEnergyPeriods(buffer, parameters.periods); if (parameters.dstHour) { buffer.setUint8(parameters.dstHour); } return toBytes$27(id$B, buffer.data); }; const id$A = getHalfHourDemandExport; uplinkNames[getHalfHourDemandExport]; const fromBytes$B = bytes => { const buffer = new BinaryBuffer(bytes, false); const hasDst = bytes.length > MIN_HALF_HOUR_COMMAND_SIZE; const date = getDate$1(buffer); const periods = getEnergyPeriods(buffer, hasDst ? MAX_HALF_HOUR_PERIODS : MIN_HALF_HOUR_PERIODS); if (hasDst) { return { date, periods, dstHour: buffer.getUint8() }; } return { date, periods }; }; const toBytes$B = parameters => { const buffer = new BinaryBuffer(parameters.periods.length > MIN_HALF_HOUR_PERIODS ? MAX_HALF_HOUR_COMMAND_SIZE : MIN_HALF_HOUR_COMMAND_SIZE, false); setDate$1(buffer, parameters.date); setEnergyPeriods(buffer, parameters.periods); if (parameters.dstHour) { buffer.setUint8(parameters.dstHour); } return toBytes$27(id$A, buffer.data); }; const id$z = getHalfHourDemandPrevious; uplinkNames[getHalfHourDemandPrevious]; const fromBytes$A = bytes => { const buffer = new BinaryBuffer(bytes, false); const hasDst = bytes.length > MIN_HALF_HOUR_COMMAND_SIZE; const date = getDate$1(buffer); const periods = getEnergyPeriods(buffer, hasDst ? MAX_HALF_HOUR_PERIODS : MIN_HALF_HOUR_PERIODS); if (hasDst) { return { date, periods, dstHour: buffer.getUint8() }; } return { date, periods }; }; const toBytes$A = parameters => { const buffer = new BinaryBuffer(parameters.periods.length > MIN_HALF_HOUR_PERIODS ? MAX_HALF_HOUR_COMMAND_SIZE : MIN_HALF_HOUR_COMMAND_SIZE, false); setDate$1(buffer, parameters.date); setEnergyPeriods(buffer, parameters.periods); if (parameters.dstHour) { buffer.setUint8(parameters.dstHour); } return toBytes$27(id$z, buffer.data); }; const DATE_SIZE = 2; const ENERGY_FLAGS_SIZE = 1; const START_HALFHOUR_SIZE = 1; const HALFHOURS_NUMBER_SIZE = 1; const MAX_HALFHOURS_ENERGY_SIZE = 247; const id$y = getHalfHourEnergies; uplinkNames[getHalfHourEnergies]; const maxSize$w = DATE_SIZE + ENERGY_FLAGS_SIZE + START_HALFHOUR_SIZE + HALFHOURS_NUMBER_SIZE + MAX_HALFHOURS_ENERGY_SIZE; const fromBytes$z = bytes => { const buffer = new BinaryBuffer(bytes, false); const date = getDate(buffer); const energiesFlags = getEnergiesFlags(buffer); const firstHalfhour = buffer.getUint8(); const halfhoursNumber = buffer.getUint8(); return { date, firstHalfhour, halfhoursNumber, energies: getHalfHourEnergies1(buffer, energiesFlags, halfhoursNumber) }; }; const toBytes$z = parameters => { const buffer = new BinaryBuffer(maxSize$w, false); const { date, firstHalfhour, halfhoursNumber, energies } = parameters; setDate(buffer, date); setEnergiesFlags(buffer, energies); buffer.setUint8(firstHalfhour); buffer.setUint8(halfhoursNumber); setHalfHourEnergies1(buffer, energies); return toBytes$27(id$y, buffer.getBytesToOffset()); }; const id$x = getMagneticFieldThreshold; uplinkNames[getMagneticFieldThreshold]; const maxSize$v = 10; const fromBytes$y = bytes => { const buffer = new BinaryBuffer(bytes, false); return { induction: buffer.getUint16(), threshold: buffer.getUint16(), inductionCoefficient: buffer.getUint16() / 100, reserved: buffer.getUint32() }; }; const toBytes$y = parameters => { const buffer = new BinaryBuffer(maxSize$v, false); buffer.setUint16(parameters.induction); buffer.setUint16(parameters.threshold); buffer.setUint16(parameters.inductionCoefficient * 100); buffer.setUint32(parameters.reserved); return toBytes$27(id$x, buffer.data); }; const id$w = getMeterInfo; uplinkNames[getMeterInfo]; const fromBytes$x = ([ten]) => ({ ten }); const toBytes$x = ({ ten }) => toBytes$27(id$w, [ten]); const id$v = getMonthDemand; uplinkNames[getMonthDemand]; const maxSize$u = 18; const fromBytes$w = bytes => { const buffer = new BinaryBuffer(bytes, false); return { year: buffer.getUint8(), month: buffer.getUint8(), energies: getEnergies(buffer) }; }; const toBytes$w = parameters => { const buffer = new BinaryBuffer(maxSize$u, false); buffer.setUint8(parameters.year); buffer.setUint8(parameters.month); setEnergies(buffer, parameters.energies); return toBytes$27(id$v, buffer.data); }; const id$u = getMonthDemandExport; uplinkNames[getMonthDemandExport]; const maxSize$t = 18; const fromBytes$v = bytes => { const buffer = new BinaryBuffer(bytes, false); return { year: buffer.getUint8(), month: buffer.getUint8(), energies: getEnergies(buffer) }; }; const toBytes$v = parameters => { const buffer = new BinaryBuffer(maxSize$t, false); buffer.setUint8(parameters.year); buffer.setUint8(parameters.month); setEnergies(buffer, parameters.energies); return toBytes$27(id$u, buffer.data); }; const id$t = getMonthMaxDemand; uplinkNames[getMonthMaxDemand]; const maxSize$s = 2 + TARIFF_NUMBER$1 * 7; const fromBytes$u = bytes => { const buffer = new BinaryBuffer(bytes, false); return { year: buffer.getUint8(), month: buffer.getUint8(), tariffs: getMonthMaxPowerByTariffs(buffer) }; }; const toBytes$u = parameters => { const buffer = new BinaryBuffer(maxSize$s, false); buffer.setUint8(parameters.year); buffer.setUint8(parameters.month); setMonthMaxPowerByTariffs(buffer, parameters.tariffs); return toBytes$27(id$t, buffer.data); }; const id$s = getMonthMaxDemandExport; uplinkNames[getMonthMaxDemandExport]; const maxSize$r = 2 + TARIFF_NUMBER$1 * 7; const fromBytes$t = bytes => { const buffer = new BinaryBuffer(bytes, false); return { year: buffer.getUint8(), month: buffer.getUint8(), tariffs: getMonthMaxPowerByTariffs(buffer) }; }; const toBytes$t = parameters => { const buffer = new BinaryBuffer(maxSize$r, false); buffer.setUint8(parameters.year); buffer.setUint8(parameters.month); setMonthMaxPowerByTariffs(buffer, parameters.tariffs); return toBytes$27(id$s, buffer.data); }; const id$r = getOperatorParameters; uplinkNames[getOperatorParameters]; const maxSize$q = OPERATOR_PARAMETERS_SIZE; const fromBytes$s = bytes => { const buffer = new BinaryBuffer(bytes, false); return getOperatorParameters$1(buffer); }; const toBytes$s = parameters => { const buffer = new BinaryBuffer(maxSize$q, false); setOperatorParameters$1(buffer, parameters); return toBytes$27(id$r, buffer.data); }; const id$q = getOperatorParametersExtended3; uplinkNames[getOperatorParametersExtended3]; const maxSize$p = 17; const fromBytes$r = bytes => { const buffer = new BinaryBuffer(bytes, false); return getOperatorParametersExtended3$1(buffer); }; const toBytes$r = parameters => { const buffer = new BinaryBuffer(maxSize$p, false); setOperatorParametersExtended3$1(buffer, parameters); return toBytes$27(id$q, buffer.data); }; const id$p = getRatePlanInfo; uplinkNames[getRatePlanInfo]; const maxSize$o = 1 + TARIFF_PLAN_SIZE * 2; const fromBytes$q = bytes => { if (bytes.length !== maxSize$o) { throw new Error('Invalid getRatePlanInfo data size.'); } const buffer = new BinaryBuffer(bytes, false); return { tariffTable: buffer.getUint8(), activePlan: getTariffPlan(buffer), passivePlan: getTariffPlan(buffer) }; }; const toBytes$q = parameters => { const buffer = new BinaryBuffer(maxSize$o, false); buffer.setUint8(parameters.tariffTable); setTariffPlan(buffer, parameters.activePlan); setTariffPlan(buffer, parameters.passivePlan); return toBytes$27(id$p, buffer.data); }; const id$o = getSaldo; uplinkNames[getSaldo]; const maxSize$n = 29; const fromBytes$p = bytes => { if (bytes.length !== maxSize$n) { throw new Error('Invalid getSaldo data size.'); } const buffer = new BinaryBuffer(bytes, false); return { currentSaldo: buffer.getInt32(), count: buffer.getUint8(), energy: new Array(4).fill(0).map(() => buffer.getInt32()), beginSaldoOfPeriod: buffer.getInt32(), date: { month: buffer.getUint8(), date: buffer.getUint8(), hours: buffer.getUint8(), minutes: buffer.getUint8() } }; }; const toBytes$p = parameters => { const buffer = new BinaryBuffer(maxSize$n, false); buffer.setInt32(parameters.currentSaldo); buffer.setUint8(parameters.count); parameters.energy.forEach(value => buffer.setInt32(value)); buffer.setInt32(parameters.beginSaldoOfPeriod); buffer.setUint8(parameters.date.month); buffer.setUint8(parameters.date.date); buffer.setUint8(parameters.date.hours); buffer.setUint8(parameters.date.minutes); return toBytes$27(id$o, buffer.data); }; const id$n = getSaldoParameters; uplinkNames[getSaldoParameters]; const maxSize$m = 37; const fromBytes$o = bytes => { if (bytes.length !== maxSize$m) { throw new Error('Invalid getSaldoParameters data size.'); } const buffer = new BinaryBuffer(bytes, false); return getSaldoParameters$1(buffer); }; const toBytes$o = parameters => { const buffer = new BinaryBuffer(maxSize$m, false); setSaldoParameters$1(buffer, parameters); return toBytes$27(id$n, buffer.data); }; const id$m = getSeasonProfile; uplinkNames[getSeasonProfile]; const maxSize$l = 9; const fromBytes$n = bytes => { const buffer = new BinaryBuffer(bytes, false); return getSeasonProfile$1(buffer); }; const toBytes$n = parameters => { const buffer = new BinaryBuffer(maxSize$l, false); setSeasonProfile$1(buffer, parameters); return toBytes$27(id$m, buffer.data); }; const id$l = getSpecialDay; uplinkNames[getSpecialDay]; const maxSize$k = 4; const fromBytes$m = bytes => { const buffer = new BinaryBuffer(bytes, false); return getSpecialDay$1(buffer); }; const toBytes$m = parameters => { const buffer = new BinaryBuffer(maxSize$k, false); setSpecialDay$1(buffer, parameters); return toBytes$27(id$l, buffer.data); }; const id$k = getVersion; uplinkNames[getVersion]; const fromBytes$l = bytes => ({ version: String.fromCharCode.apply(null, [...bytes]) }); const toBytes$l = parameters => { const version = parameters.version.split('').map(char => char.charCodeAt(0)); return toBytes$27(id$k, version); }; const id$j = prepareRatePlan; uplinkNames[prepareRatePlan]; const maxSize$j = 0; const fromBytes$k = bytes => { if (bytes.length !== maxSize$j) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$k = () => toBytes$27(id$j); const id$i = resetPowerMaxDay; uplinkNames[resetPowerMaxDay]; const maxSize$i = 0; const fromBytes$j = bytes => { if (bytes.length !== maxSize$i) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$j = () => toBytes$27(id$i); const id$h = resetPowerMaxMonth; uplinkNames[resetPowerMaxMonth]; const maxSize$h = 0; const fromBytes$i = bytes => { if (bytes.length !== maxSize$h) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$i = () => toBytes$27(id$h); const id$g = runTariffPlan; uplinkNames[runTariffPlan]; const maxSize$g = 0; const fromBytes$h = bytes => { if (bytes.length !== maxSize$g) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$h = () => toBytes$27(id$g); const id$f = setAccessKey; uplinkNames[setAccessKey]; const maxSize$f = 0; const fromBytes$g = bytes => { if (bytes.length !== maxSize$f) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$g = () => toBytes$27(id$f); const id$e = setCorrectDateTime; uplinkNames[setCorrectDateTime]; const maxSize$e = 0; const fromBytes$f = bytes => { if (bytes.length !== maxSize$e) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$f = () => toBytes$27(id$e); const id$d = setCorrectTime; uplinkNames[setCorrectTime]; const maxSize$d = 0; const fromBytes$e = bytes => { if (bytes.length !== maxSize$d) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$e = () => toBytes$27(id$d); const id$c = setDateTime; uplinkNames[setDateTime]; const maxSize$c = 0; const fromBytes$d = bytes => { if (bytes.length !== maxSize$c) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$d = () => toBytes$27(id$c); const id$b = setDayProfile; uplinkNames[setDayProfile]; const maxSize$b = 0; const fromBytes$c = bytes => { if (bytes.length !== maxSize$b) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$c = () => toBytes$27(id$b); const id$a = setDemandParameters; const name = uplinkNames[setDemandParameters]; const maxSize$a = 0; const fromBytes$b = bytes => { validateCommandPayload(name, bytes, maxSize$a); return {}; }; const toBytes$b = () => toBytes$27(id$a); const id$9 = setDisplayParam; uplinkNames[setDisplayParam]; const maxSize$9 = 0; const fromBytes$a = bytes => { if (bytes.length !== maxSize$9) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$a = () => toBytes$27(id$9); const id$8 = setOperatorParameters; uplinkNames[setOperatorParameters]; const maxSize$8 = 0; const fromBytes$9 = bytes => { if (bytes.length !== maxSize$8) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$9 = () => toBytes$27(id$8); const id$7 = setOperatorParametersExtended3; uplinkNames[setOperatorParametersExtended3]; const maxSize$7 = 0; const fromBytes$8 = bytes => { if (bytes.length !== maxSize$7) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$8 = () => toBytes$27(id$7); const id$6 = setSaldo; uplinkNames[setSaldo]; const maxSize$6 = 0; const fromBytes$7 = bytes => { if (bytes.length !== maxSize$6) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$7 = () => toBytes$27(id$6); const id$5 = setSaldoParameters; uplinkNames[setSaldoParameters]; const maxSize$5 = 0; const fromBytes$6 = bytes => { if (bytes.length !== maxSize$5) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$6 = () => toBytes$27(id$5); const id$4 = setSeasonProfile; uplinkNames[setSeasonProfile]; const maxSize$4 = 0; const fromBytes$5 = bytes => { if (bytes.length !== maxSize$4) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$5 = () => toBytes$27(id$4); const id$3 = setSpecialDay; uplinkNames[setSpecialDay]; const maxSize$3 = 0; const fromBytes$4 = bytes => { if (bytes.length !== maxSize$3) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$4 = () => toBytes$27(id$3); const id$2 = setSpecialOperation; uplinkNames[setSpecialOperation]; const maxSize$2 = 1; const fromBytes$3 = bytes => { const buffer = new BinaryBuffer(bytes, false); const flags = buffer.getUint8(); const electroMagneticIndication = !!(flags & 1); const magneticIndication = !!(flags & 2); return { electroMagneticIndication, magneticIndication }; }; const toBytes$3 = parameters => { const buffer = new BinaryBuffer(maxSize$2, false); let flags = 0; if (parameters.electroMagneticIndication) { flags |= 1; } if (parameters.magneticIndication) { flags |= 2; } buffer.setUint8(flags); return toBytes$27(id$2, buffer.data); }; const id$1 = turnRelayOff; uplinkNames[turnRelayOff]; const maxSize$1 = 0; const fromBytes$2 = bytes => { if (bytes.length !== maxSize$1) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$2 = () => toBytes$27(id$1); const id = turnRelayOn; uplinkNames[turnRelayOn]; const maxSize = 0; const fromBytes$1 = bytes => { if (bytes.length !== maxSize) { throw new Error(`Wrong buffer size: ${bytes.length}.`); } return {}; }; const toBytes$1 = () => toBytes$27(id); const toBytesMap = {}; const fromBytesMap = {}; const nameMap = uplinkNames; const fromBytes = getFromBytes$2(fromBytesMap, nameMap); const toBytes = getToBytes$1(toBytesMap); toBytesMap[id$13] = toBytes$14; toBytesMap[id$12] = toBytes$13; toBytesMap[id$11] = toBytes$12; toBytesMap[id$10] = toBytes$11; toBytesMap[id$] = toBytes$10; toBytesMap[id$_] = toBytes$; toBytesMap[id$Z] = toBytes$_; toBytesMap[id$Y] = toBytes$Z; toBytesMap[id$X] = toBytes$Y; toBytesMap[id$W] = toBytes$X; toBytesMap[id$V] = toBytes$W; toBytesMap[id$U] = toBytes$V; toBytesMap[id$T] = toBytes$U; toBytesMap[id$S] = toBytes$T; toBytesMap[id$R] = toBytes$S; toBytesMap[id$Q] = toBytes$R; toBytesMap[id$P] = toBytes$Q; toBytesMap[id$O] = toBytes$P; toBytesMap[id$N] = toBytes$O; toBytesMap[id$M] = toBytes$N; toBytesMap[id$L] = toBytes$M; toBytesMap[id$K] = toBytes$L; toBytesMap[id$J] = toBytes$K; toBytesMap[id$I] = toBytes$J; toBytesMap[id$H] = toBytes$I; toBytesMap[id$G] = toBytes$H; toBytesMap[id$F] = toBytes$G; toBytesMap[id$E] = toBytes$F; toBytesMap[id$D] = toBytes$E; toBytesMap[id$C] = toBytes$D; toBytesMap[id$B] = toBytes$C; toBytesMap[id$A] = toBytes$B; toBytesMap[id$z] = toBytes$A; toBytesMap[id$y] = toBytes$z; toBytesMap[id$x] = toBytes$y; toBytesMap[id$w] = toBytes$x; toBytesMap[id$v] = toBytes$w; toBytesMap[id$u] = toBytes$v; toBytesMap[id$t] = toBytes$u; toBytesMap[id$s] = toBytes$t; toBytesMap[id$r] = toBytes$s; toBytesMap[id$q] = toBytes$r; toBytesMap[id$p] = toBytes$q; toBytesMap[id$o] = toBytes$p; toBytesMap[id$n] = toBytes$o; toBytesMap[id$m] = toBytes$n; toBytesMap[id$l] = toBytes$m; toBytesMap[id$k] = toBytes$l; toBytesMap[id$j] = toBytes$k; toBytesMap[id$i] = toBytes$j; toBytesMap[id$h] = toBytes$i; toBytesMap[id$g] = toBytes$h; toBytesMap[id$f] = toBytes$g; toBytesMap[id$e] = toBytes$f; toBytesMap[id$d] = toBytes$e; toBytesMap[id$c] = toBytes$d; toBytesMap[id$b] = toBytes$c; toBytesMap[id$a] = toBytes$b; toBytesMap[id$9] = toBytes$a; toBytesMap[id$8] = toBytes$9; toBytesMap[id$7] = toBytes$8; toBytesMap[id$6] = toBytes$7; toBytesMap[id$5] = toBytes$6; toBytesMap[id$4] = toBytes$5; toBytesMap[id$3] = toBytes$4; toBytesMap[id$2] = toBytes$3; toBytesMap[id$1] = toBytes$2; toBytesMap[id] = toBytes$1; fromBytesMap[id$13] = fromBytes$14; fromBytesMap[id$12] = fromBytes$13; fromBytesMap[id$11] = fromBytes$12; fromBytesMap[id$10] = fromBytes$11; fromBytesMap[id$] = fromBytes$10; fromBytesMap[id$_] = fromBytes$; fromBytesMap[id$Z] = fromBytes$_; fromBytesMap[id$Y] = fromBytes$Z; fromBytesMap[id$X] = fromBytes$Y; fromBytesMap[id$W] = fromBytes$X; fromBytesMap[id$V] = fromBytes$W; fromBytesMap[id$U] = fromBytes$V; fromBytesMap[id$T] = fromBytes$U; fromBytesMap[id$S] = fromBytes$T; fromBytesMap[id$R] = fromBytes$S; fromBytesMap[id$Q] = fromBytes$R; fromBytesMap[id$P] = fromBytes$Q; fromBytesMap[id$O] = fromBytes$P; fromBytesMap[id$N] = fromBytes$O; fromBytesMap[id$M] = fromBytes$N; fromBytesMap[id$L] = fromBytes$M; fromBytesMap[id$K] = fromBytes$L; fromBytesMap[id$J] = fromBytes$K; fromBytesMap[id$I] = fromBytes$J; fromBytesMap[id$H] = fromBytes$I; fromBytesMap[id$G] = fromBytes$H; fromBytesMap[id$F] = fromBytes$G; fromBytesMap[id$E] = fromBytes$F; fromBytesMap[id$D] = fromBytes$E; fromBytesMap[id$C] = fromBytes$D; fromBytesMap[id$B] = fromBytes$C; fromBytesMap[id$A] = fromBytes$B; fromBytesMap[id$z] = fromBytes$A; fromBytesMap[id$y] = fromBytes$z; fromBytesMap[id$x] = fromBytes$y; fromBytesMap[id$w] = fromBytes$x; fromBytesMap[id$v] = fromBytes$w; fromBytesMap[id$u] = fromBytes$v; fromBytesMap[id$t] = fromBytes$u; fromBytesMap[id$s] = fromBytes$t; fromBytesMap[id$r] = fromBytes$s; fromBytesMap[id$q] = fromBytes$r; fromBytesMap[id$p] = fromBytes$q; fromBytesMap[id$o] = fromBytes$p; fromBytesMap[id$n] = fromBytes$o; fromBytesMap[id$m] = fromBytes$n; fromBytesMap[id$l] = fromBytes$m; fromBytesMap[id$k] = fromBytes$l; fromBytesMap[id$j] = fromBytes$k; fromBytesMap[id$i] = fromBytes$j; fromBytesMap[id$h] = fromBytes$i; fromBytesMap[id$g] = fromBytes$h; fromBytesMap[id$f] = fromBytes$g; fromBytesMap[id$e] = fromBytes$f; fromBytesMap[id$d] = fromBytes$e; fromBytesMap[id$c] = fromBytes$d; fromBytesMap[id$b] = fromBytes$c; fromBytesMap[id$a] = fromBytes$b; fromBytesMap[id$9] = fromBytes$a; fromBytesMap[id$8] = fromBytes$9; fromBytesMap[id$7] = fromBytes$8; fromBytesMap[id$6] = fromBytes$7; fromBytesMap[id$5] = fromBytes$6; fromBytesMap[id$4] = fromBytes$5; fromBytesMap[id$3] = fromBytes$4; fromBytesMap[id$2] = fromBytes$3; fromBytesMap[id$1] = fromBytes$2; fromBytesMap[id] = fromBytes$1; var uplink = /*#__PURE__*/Object.freeze({ __proto__: null, fromBytes: fromBytes, fromBytesMap: fromBytesMap, nameMap: nameMap, toBytes: toBytes, toBytesMap: toBytesMap }); var mtxMessage = /*#__PURE__*/Object.freeze({ __proto__: null, downlink: downlink, uplink: uplink }); /** * Data segment wrapper around an MTX message. */ // 0b10010001 (segmentIndex: 1, segmentsNumber: 1, isLast: true) const SINGLE_SEGMENT_FLAG = 0x91; const DATA_SEGMENT_COMMAND_ID = 0x1e; const get = bytes => { // check if it is a DataSegment command if (bytes[0] !== DATA_SEGMENT_COMMAND_ID) { return {}; } // DataSegment command size const size = bytes[1]; // segment metadata const flag = bytes[3]; // payload const data = bytes.slice(4, size + 2); // if the mtx message is unencrypted, the device sets the LRC to 0 // no need to validate for now // const expectedLrc = calculateLrc(bytes.slice(0, size + 2)); // const actualLrc = bytes[size + 2]; // just a single data segment (without lrc validation) if (flag === SINGLE_SEGMENT_FLAG) { return data; } return null; }; const set = bytes => { const body = [DATA_SEGMENT_COMMAND_ID, bytes.length + 2, 0, SINGLE_SEGMENT_FLAG, ...bytes]; return [...body, calculateLrc(body)]; }; // export message = mtxMessage; getDataSegment = get; setDataSegment = set; })(); //#endregion 

This codec is sourced from The Things Network. All rights belong to The Things Network.

This codec is licensed under the GNU General Public License v3 (GPL v3). Modifications, if any, are clearly marked. You are free to use, modify, and distribute the codec under the terms of GPL v3.

Community Feedback