import base64ToArrayBuffer from 'base64-arraybuffer'; import moment from 'moment'; import { base64ToHex, decimalArrayAsLittleEndianNumber, formatAlphaA3Date, formatAlphaA3Time, formatCleanNumericValue, uint8ArrayToAsciiNumber, } from './binary'; import { NeedMoreBytesError, ParserError } from './errors'; import { Parser } from './Parser'; import { ParserResult } from './ParserResult'; import type { MeterInterpretationCode } from './ReadStrategy'; import * as Registers from './registers'; export class AlphaA3Parser extends Parser { billingTable: string | undefined; constructor(interpretationCode?: MeterInterpretationCode, billingTable?: string) { super(); this.interpretationCode = interpretationCode || 1; this.billingTable = billingTable ?? undefined; } static PAYLOAD_SIZE_EDENOR = 334; static PAYLOAD_SIZE_EDEMSA_READING_STRATEGY_THREE = 340; static PAYLOAD_SIZE_EDEMSA_READING_STRATEGY_ONE_AND_TWO = 370; isPreviousBillingTable() { const CURRENT_BILLING_TABLE = '00'; return this.billingTable !== CURRENT_BILLING_TABLE; } assertIfFirstByteIsNonzero(arrayBuffer) { if (arrayBuffer[0]) { throw new ParserError('primer byte no es cero'); } } isPayloadIncomplete(arrayBuffer) { let payloadSizeAccordingToReadingStrategy = 0; switch (this.interpretationCode) { case 1: case 2: payloadSizeAccordingToReadingStrategy = AlphaA3Parser.PAYLOAD_SIZE_EDEMSA_READING_STRATEGY_ONE_AND_TWO; break; case 3: payloadSizeAccordingToReadingStrategy = AlphaA3Parser.PAYLOAD_SIZE_EDEMSA_READING_STRATEGY_THREE; break; case 9: payloadSizeAccordingToReadingStrategy = AlphaA3Parser.PAYLOAD_SIZE_EDENOR; break; default: throw new ParserError(`Unidentified reading interpretation`); } return arrayBuffer.length < payloadSizeAccordingToReadingStrategy; } parseReadingStrategyNine(arrayBuffer, aBase64String) { const result = new ParserResult(); result.add(Registers.SerialNumberModel, uint8ArrayToAsciiNumber(arrayBuffer.slice(97, 113))); result.add(Registers.ReadAtModel, moment().format()); result.add(Registers.HexPayloadModel, base64ToHex(aBase64String)); return result; } parseReadingStrategyOne(arrayBuffer) { const result = new ParserResult(); const isPreviousBillingTable = this.isPreviousBillingTable(); result.add(Registers.SerialNumberModel, uint8ArrayToAsciiNumber(arrayBuffer.slice(97, 113))); const DEMAND_RESET_DATE = formatAlphaA3Date(arrayBuffer.slice(113, 116)); result.add(Registers.DemandResetDateModel, DEMAND_RESET_DATE); result.add( Registers.DemandResetTimeModel, formatAlphaA3Time(arrayBuffer.slice(116, 118), DEMAND_RESET_DATE), ); result.add(Registers.DemandResetSeasonModel, (arrayBuffer.slice(118, 119)[0] as number).toString()); result.add(Registers.DemandResetCounterModel, (arrayBuffer.slice(119, 120)[0] as number).toString()); result.add( isPreviousBillingTable ? Registers.TotalActiveEnergyImportPreviousModel : Registers.TotalActiveEnergyImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(120, 126)), 4), ); result.add( isPreviousBillingTable ? Registers.TotalReactiveEnergyImportPreviousModel : Registers.TotalReactiveEnergyImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(126, 132)), 4), ); result.add( isPreviousBillingTable ? Registers.PowerFactorPreviousModel : Registers.PowerFactorModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(132, 138)), 4), ); const TOTAL_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS = formatAlphaA3Date(arrayBuffer.slice(138, 141)); result.add( isPreviousBillingTable ? Registers.TotalActiveEnergyImportDatePreviousModel : Registers.TotalActiveEnergyImportDateModel, TOTAL_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS, ); result.add( isPreviousBillingTable ? Registers.TotalActiveEnergyImportTimePreviousModel : Registers.TotalActiveEnergyImportTimeModel, formatAlphaA3Time(arrayBuffer.slice(141, 143), TOTAL_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS), ); result.add( isPreviousBillingTable ? Registers.TotalCumulativeMaximumDemandImportPreviousModel : Registers.TotalCumulativeMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(143, 149)), 4), ); result.add( isPreviousBillingTable ? Registers.TotalMaximumDemandImportPreviousModel : Registers.TotalMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(149, 154)), 4), ); const TOTAL_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS = formatAlphaA3Date(arrayBuffer.slice(154, 157)); result.add( isPreviousBillingTable ? Registers.TotalReactiveEnergyImportDatePreviousModel : Registers.TotalReactiveEnergyImportDateModel, TOTAL_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS, ); result.add( isPreviousBillingTable ? Registers.TotalReactiveEnergyImportTimePreviousModel : Registers.TotalReactiveEnergyImportTimeModel, formatAlphaA3Time(arrayBuffer.slice(157, 159), TOTAL_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS), ); result.add( isPreviousBillingTable ? Registers.TotalCumulativeMaximumReactiveDemandImportPreviousModel : Registers.TotalCumulativeMaximumReactiveDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(159, 165)), 4), ); result.add( isPreviousBillingTable ? Registers.TotalMaximumReactiveDemandImportPreviousModel : Registers.TotalMaximumReactiveDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(165, 170)), 4), ); result.add( isPreviousBillingTable ? Registers.Tariff1ActiveEnergyImportPreviousModel : Registers.Tariff1ActiveEnergyImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(170, 176)), 4), ); result.add( isPreviousBillingTable ? Registers.Tariff1ReactiveEnergyImportPreviousModel : Registers.Tariff1ReactiveEnergyImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(176, 182)), 4), ); result.add( isPreviousBillingTable ? Registers.Tariff1PowerFactorPreviousModel : Registers.Tariff1PowerFactorModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(182, 188)), 4), ); const TARIFF1_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS = formatAlphaA3Date(arrayBuffer.slice(188, 191)); result.add( isPreviousBillingTable ? Registers.Tariff1ActiveEnergyImportDatePreviousModel : Registers.Tariff1ActiveEnergyImportDateModel, TARIFF1_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS, ); result.add( isPreviousBillingTable ? Registers.Tariff1ActiveEnergyImportTimePreviousModel : Registers.Tariff1ActiveEnergyImportTimeModel, formatAlphaA3Time(arrayBuffer.slice(191, 193), TARIFF1_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS), ); result.add( isPreviousBillingTable ? Registers.Tariff1CumulativeMaximumDemandImportPreviousModel : Registers.Tariff1CumulativeMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(193, 199)), 4), ); result.add( isPreviousBillingTable ? Registers.Tariff1MaximumDemandImportPreviousModel : Registers.Tariff1MaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(199, 204)), 4), ); const TARIFF1_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS = formatAlphaA3Date(arrayBuffer.slice(204, 207)); result.add( isPreviousBillingTable ? Registers.Tariff1ReactiveEnergyImportDatePreviousModel : Registers.Tariff1ReactiveEnergyImportDateModel, TARIFF1_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS, ); result.add( isPreviousBillingTable ? Registers.Tariff1ReactiveEnergyImportTimePreviousModel : Registers.Tariff1ReactiveEnergyImportTimeModel, formatAlphaA3Time(arrayBuffer.slice(207, 209), TARIFF1_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS), ); result.add( isPreviousBillingTable ? Registers.Tariff1CumulativeReactiveMaximumDemandImportPreviousModel : Registers.Tariff1CumulativeReactiveMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(209, 215)), 4), ); result.add( isPreviousBillingTable ? Registers.Tariff1ReactiveMaximumDemandImportPreviousModel : Registers.Tariff1ReactiveMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(215, 220)), 4), ); result.add( isPreviousBillingTable ? Registers.Tariff2ActiveEnergyImportPreviousModel : Registers.Tariff2ActiveEnergyImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(220, 226)), 4), ); result.add( isPreviousBillingTable ? Registers.Tariff2ReactiveEnergyImportPreviousModel : Registers.Tariff2ReactiveEnergyImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(226, 232)), 4), ); result.add( isPreviousBillingTable ? Registers.Tariff2PowerFactorPreviousModel : Registers.Tariff2PowerFactorModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(232, 238)), 4), ); const TARIFF2_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS = formatAlphaA3Date(arrayBuffer.slice(238, 241)); result.add( isPreviousBillingTable ? Registers.Tariff2ActiveEnergyImportDatePreviousModel : Registers.Tariff2ActiveEnergyImportDateModel, TARIFF2_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS, ); result.add( isPreviousBillingTable ? Registers.Tariff2ActiveEnergyImportTimePreviousModel : Registers.Tariff2ActiveEnergyImportTimeModel, formatAlphaA3Time(arrayBuffer.slice(241, 243), TARIFF2_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS), ); result.add( isPreviousBillingTable ? Registers.Tariff2CumulativeMaximumDemandImportPreviousModel : Registers.Tariff2CumulativeMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(243, 249)), 4), ); result.add( isPreviousBillingTable ? Registers.Tariff2MaximumDemandImportPreviousModel : Registers.Tariff2MaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(249, 254)), 4), ); const TARIFF2_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS = formatAlphaA3Date(arrayBuffer.slice(254, 257)); result.add( isPreviousBillingTable ? Registers.Tariff2ReactiveEnergyImportDatePreviousModel : Registers.Tariff2ReactiveEnergyImportDateModel, TARIFF2_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS, ); result.add( isPreviousBillingTable ? Registers.Tariff2ReactiveEnergyImportTimePreviousModel : Registers.Tariff2ReactiveEnergyImportTimeModel, formatAlphaA3Time(arrayBuffer.slice(257, 259), TARIFF2_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS), ); result.add( isPreviousBillingTable ? Registers.Tariff2CumulativeReactiveMaximumDemandImportPreviousModel : Registers.Tariff2CumulativeReactiveMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(259, 265)), 4), ); result.add( isPreviousBillingTable ? Registers.Tariff2ReactiveMaximumDemandImportPreviousModel : Registers.Tariff2ReactiveMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(265, 270)), 4), ); result.add( isPreviousBillingTable ? Registers.Tariff3ActiveEnergyImportPreviousModel : Registers.Tariff3ActiveEnergyImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(270, 276)), 4), ); result.add( isPreviousBillingTable ? Registers.Tariff3ReactiveEnergyImportPreviousModel : Registers.Tariff3ReactiveEnergyImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(276, 282)), 4), ); result.add( isPreviousBillingTable ? Registers.Tariff3PowerFactorPreviousModel : Registers.Tariff3PowerFactorModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(282, 288)), 4), ); const TARIFF3_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS = formatAlphaA3Date(arrayBuffer.slice(288, 291)); result.add( isPreviousBillingTable ? Registers.Tariff3ActiveEnergyImportDatePreviousModel : Registers.Tariff3ActiveEnergyImportDateModel, TARIFF3_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS, ); result.add( isPreviousBillingTable ? Registers.Tariff3ActiveEnergyImportTimePreviousModel : Registers.Tariff3ActiveEnergyImportTimeModel, formatAlphaA3Time(arrayBuffer.slice(291, 293), TARIFF3_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS), ); result.add( isPreviousBillingTable ? Registers.Tariff3CumulativeMaximumDemandImportPreviousModel : Registers.Tariff3CumulativeMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(293, 299)), 4), ); result.add( isPreviousBillingTable ? Registers.Tariff3MaximumDemandImportPreviousModel : Registers.Tariff3MaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(299, 304)), 4), ); const TARIFF3_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS = formatAlphaA3Date(arrayBuffer.slice(304, 307)); result.add( isPreviousBillingTable ? Registers.Tariff3ReactiveEnergyImportDatePreviousModel : Registers.Tariff3ReactiveEnergyImportDateModel, TARIFF3_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS, ); result.add( isPreviousBillingTable ? Registers.Tariff3ReactiveEnergyImportTimePreviousModel : Registers.Tariff3ReactiveEnergyImportTimeModel, formatAlphaA3Time(arrayBuffer.slice(307, 309), TARIFF3_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS), ); result.add( isPreviousBillingTable ? Registers.Tariff3CumulativeReactiveMaximumDemandImportPreviousModel : Registers.Tariff3CumulativeReactiveMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(309, 315)), 4), ); result.add( isPreviousBillingTable ? Registers.Tariff3ReactiveMaximumDemandImportPreviousModel : Registers.Tariff3ReactiveMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(315, 320)), 4), ); result.add( isPreviousBillingTable ? Registers.Tariff4ActiveEnergyImportPreviousModel : Registers.Tariff4ActiveEnergyImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(320, 326)), 4), ); result.add( isPreviousBillingTable ? Registers.Tariff4ReactiveEnergyImportPreviousModel : Registers.Tariff4ReactiveEnergyImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(326, 332)), 4), ); result.add( isPreviousBillingTable ? Registers.Tariff4PowerFactorPreviousModel : Registers.Tariff4PowerFactorModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(332, 338)), 4), ); const TARIFF4_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS = formatAlphaA3Date(arrayBuffer.slice(338, 341)); result.add( isPreviousBillingTable ? Registers.Tariff4ActiveEnergyImportDatePreviousModel : Registers.Tariff4ActiveEnergyImportDateModel, TARIFF4_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS, ); result.add( isPreviousBillingTable ? Registers.Tariff4ActiveEnergyImportTimePreviousModel : Registers.Tariff4ActiveEnergyImportTimeModel, formatAlphaA3Time(arrayBuffer.slice(341, 343), TARIFF4_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS), ); result.add( isPreviousBillingTable ? Registers.Tariff4CumulativeMaximumDemandImportPreviousModel : Registers.Tariff4CumulativeMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(343, 349)), 4), ); result.add( isPreviousBillingTable ? Registers.Tariff4MaximumDemandImportPreviousModel : Registers.Tariff4MaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(349, 354)), 4), ); const TARIFF4_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS = formatAlphaA3Date(arrayBuffer.slice(354, 357)); result.add( isPreviousBillingTable ? Registers.Tariff4ReactiveEnergyImportDatePreviousModel : Registers.Tariff4ReactiveEnergyImportDateModel, TARIFF4_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS, ); result.add( isPreviousBillingTable ? Registers.Tariff4ReactiveEnergyImportTimePreviousModel : Registers.Tariff4ReactiveEnergyImportTimeModel, formatAlphaA3Time(arrayBuffer.slice(357, 359), TARIFF4_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS), ); result.add( isPreviousBillingTable ? Registers.Tariff4CumulativeReactiveMaximumDemandImportPreviousModel : Registers.Tariff4CumulativeReactiveMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(359, 365)), 4), ); result.add( isPreviousBillingTable ? Registers.Tariff4ReactiveMaximumDemandImportPreviousModel : Registers.Tariff4ReactiveMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(365, 370)), 4), ); return result; } parseReadingStrategyTwo(arrayBuffer) { const result = new ParserResult(); const isPreviousBillingTable = this.isPreviousBillingTable(); result.add(Registers.SerialNumberModel, uint8ArrayToAsciiNumber(arrayBuffer.slice(97, 113))); const DEMAND_RESET_DATE = formatAlphaA3Date(arrayBuffer.slice(113, 116)); result.add(Registers.DemandResetDateModel, DEMAND_RESET_DATE); result.add( Registers.DemandResetTimeModel, formatAlphaA3Time(arrayBuffer.slice(116, 118), DEMAND_RESET_DATE), ); result.add(Registers.DemandResetSeasonModel, (arrayBuffer.slice(118, 119)[0] as number).toString()); result.add(Registers.DemandResetCounterModel, (arrayBuffer.slice(119, 120)[0] as number).toString()); result.add( isPreviousBillingTable ? Registers.TotalActiveEnergyImportPreviousModel : Registers.TotalActiveEnergyImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(120, 126)), 6), ); result.add( isPreviousBillingTable ? Registers.TotalReactiveEnergyImportPreviousModel : Registers.TotalReactiveEnergyImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(126, 132)), 6), ); result.add( isPreviousBillingTable ? Registers.PowerFactorPreviousModel : Registers.PowerFactorModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(132, 138)), 4), ); const TOTAL_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS = formatAlphaA3Date(arrayBuffer.slice(138, 141)); result.add( isPreviousBillingTable ? Registers.TotalActiveEnergyImportDatePreviousModel : Registers.TotalActiveEnergyImportDateModel, TOTAL_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS, ); result.add( isPreviousBillingTable ? Registers.TotalActiveEnergyImportTimePreviousModel : Registers.TotalActiveEnergyImportTimeModel, formatAlphaA3Time(arrayBuffer.slice(141, 143), TOTAL_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS), ); result.add( isPreviousBillingTable ? Registers.TotalCumulativeMaximumDemandImportPreviousModel : Registers.TotalCumulativeMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(143, 149)), 6), ); result.add( isPreviousBillingTable ? Registers.TotalMaximumDemandImportPreviousModel : Registers.TotalMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(149, 154)), 6), ); const TOTAL_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS = formatAlphaA3Date(arrayBuffer.slice(154, 157)); result.add( isPreviousBillingTable ? Registers.TotalReactiveEnergyImportDatePreviousModel : Registers.TotalReactiveEnergyImportDateModel, TOTAL_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS, ); result.add( isPreviousBillingTable ? Registers.TotalReactiveEnergyImportTimePreviousModel : Registers.TotalReactiveEnergyImportTimeModel, formatAlphaA3Time(arrayBuffer.slice(157, 159), TOTAL_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS), ); result.add( isPreviousBillingTable ? Registers.TotalCumulativeMaximumReactiveDemandImportPreviousModel : Registers.TotalCumulativeMaximumReactiveDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(159, 165)), 6), ); result.add( isPreviousBillingTable ? Registers.TotalMaximumReactiveDemandImportPreviousModel : Registers.TotalMaximumReactiveDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(165, 170)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff1ActiveEnergyImportPreviousModel : Registers.Tariff1ActiveEnergyImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(170, 176)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff1ReactiveEnergyImportPreviousModel : Registers.Tariff1ReactiveEnergyImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(176, 182)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff1PowerFactorPreviousModel : Registers.Tariff1PowerFactorModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(182, 188)), 4), ); const TARIFF1_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS = formatAlphaA3Date(arrayBuffer.slice(188, 191)); result.add( isPreviousBillingTable ? Registers.Tariff1ActiveEnergyImportDatePreviousModel : Registers.Tariff1ActiveEnergyImportDateModel, TARIFF1_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS, ); result.add( isPreviousBillingTable ? Registers.Tariff1ActiveEnergyImportTimePreviousModel : Registers.Tariff1ActiveEnergyImportTimeModel, formatAlphaA3Time(arrayBuffer.slice(191, 193), TARIFF1_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS), ); result.add( isPreviousBillingTable ? Registers.Tariff1CumulativeMaximumDemandImportPreviousModel : Registers.Tariff1CumulativeMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(193, 199)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff1MaximumDemandImportPreviousModel : Registers.Tariff1MaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(199, 204)), 6), ); const TARIFF1_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS = formatAlphaA3Date(arrayBuffer.slice(204, 207)); result.add( isPreviousBillingTable ? Registers.Tariff1ReactiveEnergyImportDatePreviousModel : Registers.Tariff1ReactiveEnergyImportDateModel, TARIFF1_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS, ); result.add( isPreviousBillingTable ? Registers.Tariff1ReactiveEnergyImportTimePreviousModel : Registers.Tariff1ReactiveEnergyImportTimeModel, formatAlphaA3Time(arrayBuffer.slice(207, 209), TARIFF1_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS), ); result.add( isPreviousBillingTable ? Registers.Tariff1CumulativeReactiveMaximumDemandImportPreviousModel : Registers.Tariff1CumulativeReactiveMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(209, 215)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff1ReactiveMaximumDemandImportPreviousModel : Registers.Tariff1ReactiveMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(215, 220)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff2ActiveEnergyImportPreviousModel : Registers.Tariff2ActiveEnergyImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(220, 226)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff2ReactiveEnergyImportPreviousModel : Registers.Tariff2ReactiveEnergyImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(226, 232)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff2PowerFactorPreviousModel : Registers.Tariff2PowerFactorModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(232, 238)), 4), ); const TARIFF2_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS = formatAlphaA3Date(arrayBuffer.slice(238, 241)); result.add( isPreviousBillingTable ? Registers.Tariff2ActiveEnergyImportDatePreviousModel : Registers.Tariff2ActiveEnergyImportDateModel, TARIFF2_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS, ); result.add( isPreviousBillingTable ? Registers.Tariff2ActiveEnergyImportTimePreviousModel : Registers.Tariff2ActiveEnergyImportTimeModel, formatAlphaA3Time(arrayBuffer.slice(241, 243), TARIFF2_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS), ); result.add( isPreviousBillingTable ? Registers.Tariff2CumulativeMaximumDemandImportPreviousModel : Registers.Tariff2CumulativeMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(243, 249)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff2MaximumDemandImportPreviousModel : Registers.Tariff2MaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(249, 254)), 6), ); const TARIFF2_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS = formatAlphaA3Date(arrayBuffer.slice(254, 257)); result.add( isPreviousBillingTable ? Registers.Tariff2ReactiveEnergyImportDatePreviousModel : Registers.Tariff2ReactiveEnergyImportDateModel, TARIFF2_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS, ); result.add( isPreviousBillingTable ? Registers.Tariff2ReactiveEnergyImportTimePreviousModel : Registers.Tariff2ReactiveEnergyImportTimeModel, formatAlphaA3Time(arrayBuffer.slice(257, 259), TARIFF2_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS), ); result.add( isPreviousBillingTable ? Registers.Tariff2CumulativeReactiveMaximumDemandImportPreviousModel : Registers.Tariff2CumulativeReactiveMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(259, 265)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff2ReactiveMaximumDemandImportPreviousModel : Registers.Tariff2ReactiveMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(265, 270)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff3ActiveEnergyImportPreviousModel : Registers.Tariff3ActiveEnergyImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(270, 276)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff3ReactiveEnergyImportPreviousModel : Registers.Tariff3ReactiveEnergyImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(276, 282)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff3PowerFactorPreviousModel : Registers.Tariff3PowerFactorModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(282, 288)), 4), ); const TARIFF3_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS = formatAlphaA3Date(arrayBuffer.slice(288, 291)); result.add( isPreviousBillingTable ? Registers.Tariff3ActiveEnergyImportDatePreviousModel : Registers.Tariff3ActiveEnergyImportDateModel, TARIFF3_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS, ); result.add( isPreviousBillingTable ? Registers.Tariff3ActiveEnergyImportTimePreviousModel : Registers.Tariff3ActiveEnergyImportTimeModel, formatAlphaA3Time(arrayBuffer.slice(291, 293), TARIFF3_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS), ); result.add( isPreviousBillingTable ? Registers.Tariff3CumulativeMaximumDemandImportPreviousModel : Registers.Tariff3CumulativeMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(293, 299)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff3MaximumDemandImportPreviousModel : Registers.Tariff3MaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(299, 304)), 6), ); const TARIFF3_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS = formatAlphaA3Date(arrayBuffer.slice(304, 307)); result.add( isPreviousBillingTable ? Registers.Tariff3ReactiveEnergyImportDatePreviousModel : Registers.Tariff3ReactiveEnergyImportDateModel, TARIFF3_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS, ); result.add( isPreviousBillingTable ? Registers.Tariff3ReactiveEnergyImportTimePreviousModel : Registers.Tariff3ReactiveEnergyImportTimeModel, formatAlphaA3Time(arrayBuffer.slice(307, 309), TARIFF3_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS), ); result.add( isPreviousBillingTable ? Registers.Tariff3CumulativeReactiveMaximumDemandImportPreviousModel : Registers.Tariff3CumulativeReactiveMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(309, 315)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff3ReactiveMaximumDemandImportPreviousModel : Registers.Tariff3ReactiveMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(315, 320)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff4ActiveEnergyImportPreviousModel : Registers.Tariff4ActiveEnergyImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(320, 326)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff4ReactiveEnergyImportPreviousModel : Registers.Tariff4ReactiveEnergyImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(326, 332)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff4PowerFactorPreviousModel : Registers.Tariff4PowerFactorModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(332, 338)), 4), ); const TARIFF4_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS = formatAlphaA3Date(arrayBuffer.slice(338, 341)); result.add( isPreviousBillingTable ? Registers.Tariff4ActiveEnergyImportDatePreviousModel : Registers.Tariff4ActiveEnergyImportDateModel, TARIFF4_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS, ); result.add( isPreviousBillingTable ? Registers.Tariff4ActiveEnergyImportTimePreviousModel : Registers.Tariff4ActiveEnergyImportTimeModel, formatAlphaA3Time(arrayBuffer.slice(341, 343), TARIFF4_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS), ); result.add( isPreviousBillingTable ? Registers.Tariff4CumulativeMaximumDemandImportPreviousModel : Registers.Tariff4CumulativeMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(343, 349)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff4MaximumDemandImportPreviousModel : Registers.Tariff4MaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(349, 354)), 6), ); const TARIFF4_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS = formatAlphaA3Date(arrayBuffer.slice(354, 357)); result.add( isPreviousBillingTable ? Registers.Tariff4ReactiveEnergyImportDatePreviousModel : Registers.Tariff4ReactiveEnergyImportDateModel, TARIFF4_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS, ); result.add( isPreviousBillingTable ? Registers.Tariff4ReactiveEnergyImportTimePreviousModel : Registers.Tariff4ReactiveEnergyImportTimeModel, formatAlphaA3Time(arrayBuffer.slice(357, 359), TARIFF4_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS), ); result.add( isPreviousBillingTable ? Registers.Tariff4CumulativeReactiveMaximumDemandImportPreviousModel : Registers.Tariff4CumulativeReactiveMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(359, 365)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff4ReactiveMaximumDemandImportPreviousModel : Registers.Tariff4ReactiveMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(365, 370)), 6), ); return result; } parseReadingStrategyThree(arrayBuffer) { const result = new ParserResult(); const isPreviousBillingTable = this.isPreviousBillingTable(); result.add(Registers.SerialNumberModel, uint8ArrayToAsciiNumber(arrayBuffer.slice(97, 113))); const DEMAND_RESET_DATE = formatAlphaA3Date(arrayBuffer.slice(113, 116)); result.add(Registers.DemandResetDateModel, DEMAND_RESET_DATE); result.add( Registers.DemandResetTimeModel, formatAlphaA3Time(arrayBuffer.slice(116, 118), DEMAND_RESET_DATE), ); result.add(Registers.DemandResetSeasonModel, (arrayBuffer.slice(118, 119)[0] as number).toString()); result.add(Registers.DemandResetCounterModel, (arrayBuffer.slice(119, 120)[0] as number).toString()); result.add( isPreviousBillingTable ? Registers.TotalActiveEnergyImportPreviousModel : Registers.TotalActiveEnergyImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(120, 126)), 6), ); result.add( isPreviousBillingTable ? Registers.TotalReactiveEnergyImportPreviousModel : Registers.TotalReactiveEnergyImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(126, 132)), 6), ); result.add( isPreviousBillingTable ? Registers.PowerFactorPreviousModel : Registers.PowerFactorModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(132, 138)), 4), ); const TOTAL_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS = formatAlphaA3Date(arrayBuffer.slice(138, 141)); result.add( isPreviousBillingTable ? Registers.TotalActiveEnergyImportDatePreviousModel : Registers.TotalActiveEnergyImportDateModel, TOTAL_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS, ); result.add( isPreviousBillingTable ? Registers.TotalActiveEnergyImportTimePreviousModel : Registers.TotalActiveEnergyImportTimeModel, formatAlphaA3Time(arrayBuffer.slice(141, 143), TOTAL_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS), ); result.add( isPreviousBillingTable ? Registers.TotalCumulativeMaximumDemandImportPreviousModel : Registers.TotalCumulativeMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(143, 149)), 6), ); result.add( isPreviousBillingTable ? Registers.TotalMaximumDemandImportPreviousModel : Registers.TotalMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(149, 154)), 6), ); const TOTAL_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS = formatAlphaA3Date(arrayBuffer.slice(154, 157)); result.add( isPreviousBillingTable ? Registers.TotalReactiveEnergyImportDatePreviousModel : Registers.TotalReactiveEnergyImportDateModel, TOTAL_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS, ); result.add( isPreviousBillingTable ? Registers.TotalReactiveEnergyImportTimePreviousModel : Registers.TotalReactiveEnergyImportTimeModel, formatAlphaA3Time(arrayBuffer.slice(157, 159), TOTAL_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS), ); result.add( isPreviousBillingTable ? Registers.TotalCumulativeMaximumReactiveDemandImportPreviousModel : Registers.TotalCumulativeMaximumReactiveDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(159, 165)), 6), ); result.add( isPreviousBillingTable ? Registers.TotalMaximumReactiveDemandImportPreviousModel : Registers.TotalMaximumReactiveDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(165, 170)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff1ActiveEnergyImportPreviousModel : Registers.Tariff1ActiveEnergyImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(170, 176)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff1ReactiveEnergyImportPreviousModel : Registers.Tariff1ReactiveEnergyImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(176, 182)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff1PowerFactorPreviousModel : Registers.Tariff1PowerFactorModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(182, 188)), 4), ); const TARIFF1_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS = formatAlphaA3Date(arrayBuffer.slice(188, 191)); result.add( isPreviousBillingTable ? Registers.Tariff1ActiveEnergyImportDatePreviousModel : Registers.Tariff1ActiveEnergyImportDateModel, TARIFF1_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS, ); result.add( isPreviousBillingTable ? Registers.Tariff1ActiveEnergyImportTimePreviousModel : Registers.Tariff1ActiveEnergyImportTimeModel, formatAlphaA3Time(arrayBuffer.slice(191, 193), TARIFF1_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS), ); result.add( isPreviousBillingTable ? Registers.Tariff1CumulativeMaximumDemandImportPreviousModel : Registers.Tariff1CumulativeMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(193, 199)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff1MaximumDemandImportPreviousModel : Registers.Tariff1MaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(199, 204)), 6), ); const TARIFF1_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS = formatAlphaA3Date(arrayBuffer.slice(204, 207)); result.add( isPreviousBillingTable ? Registers.Tariff1ReactiveEnergyImportDatePreviousModel : Registers.Tariff1ReactiveEnergyImportDateModel, TARIFF1_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS, ); result.add( isPreviousBillingTable ? Registers.Tariff1ReactiveEnergyImportTimePreviousModel : Registers.Tariff1ReactiveEnergyImportTimeModel, formatAlphaA3Time(arrayBuffer.slice(207, 209), TARIFF1_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS), ); result.add( isPreviousBillingTable ? Registers.Tariff1CumulativeReactiveMaximumDemandImportPreviousModel : Registers.Tariff1CumulativeReactiveMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(209, 215)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff1ReactiveMaximumDemandImportPreviousModel : Registers.Tariff1ReactiveMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(215, 220)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff2ActiveEnergyImportPreviousModel : Registers.Tariff2ActiveEnergyImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(220, 226)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff2ReactiveEnergyImportPreviousModel : Registers.Tariff2ReactiveEnergyImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(226, 232)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff2PowerFactorPreviousModel : Registers.Tariff2PowerFactorModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(232, 238)), 4), ); const TARIFF2_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS = formatAlphaA3Date(arrayBuffer.slice(238, 241)); result.add( isPreviousBillingTable ? Registers.Tariff2ActiveEnergyImportDatePreviousModel : Registers.Tariff2ActiveEnergyImportDateModel, TARIFF2_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS, ); result.add( isPreviousBillingTable ? Registers.Tariff2ActiveEnergyImportTimePreviousModel : Registers.Tariff2ActiveEnergyImportTimeModel, formatAlphaA3Time(arrayBuffer.slice(241, 243), TARIFF2_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS), ); result.add( isPreviousBillingTable ? Registers.Tariff2CumulativeMaximumDemandImportPreviousModel : Registers.Tariff2CumulativeMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(243, 249)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff2MaximumDemandImportPreviousModel : Registers.Tariff2MaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(249, 254)), 6), ); const TARIFF2_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS = formatAlphaA3Date(arrayBuffer.slice(254, 257)); result.add( isPreviousBillingTable ? Registers.Tariff2ReactiveEnergyImportDatePreviousModel : Registers.Tariff2ReactiveEnergyImportDateModel, TARIFF2_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS, ); result.add( isPreviousBillingTable ? Registers.Tariff2ReactiveEnergyImportTimePreviousModel : Registers.Tariff2ReactiveEnergyImportTimeModel, formatAlphaA3Time(arrayBuffer.slice(257, 259), TARIFF2_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS), ); result.add( isPreviousBillingTable ? Registers.Tariff2CumulativeReactiveMaximumDemandImportPreviousModel : Registers.Tariff2CumulativeReactiveMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(259, 265)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff2ReactiveMaximumDemandImportPreviousModel : Registers.Tariff2ReactiveMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(265, 270)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff3ActiveEnergyImportPreviousModel : Registers.Tariff3ActiveEnergyImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(270, 276)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff3ReactiveEnergyImportPreviousModel : Registers.Tariff3ReactiveEnergyImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(276, 282)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff3PowerFactorPreviousModel : Registers.Tariff3PowerFactorModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(282, 288)), 4), ); const TARIFF3_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS = formatAlphaA3Date(arrayBuffer.slice(288, 291)); result.add( isPreviousBillingTable ? Registers.Tariff3ActiveEnergyImportDatePreviousModel : Registers.Tariff3ActiveEnergyImportDateModel, TARIFF3_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS, ); result.add( isPreviousBillingTable ? Registers.Tariff3ActiveEnergyImportTimePreviousModel : Registers.Tariff3ActiveEnergyImportTimeModel, formatAlphaA3Time(arrayBuffer.slice(291, 293), TARIFF3_ACTIVE_ENERGY_IMPORT_DATE_PREVIOUS), ); result.add( isPreviousBillingTable ? Registers.Tariff3CumulativeMaximumDemandImportPreviousModel : Registers.Tariff3CumulativeMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(293, 299)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff3MaximumDemandImportPreviousModel : Registers.Tariff3MaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(299, 304)), 6), ); const TARIFF3_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS = formatAlphaA3Date(arrayBuffer.slice(304, 307)); result.add( isPreviousBillingTable ? Registers.Tariff3ReactiveEnergyImportDatePreviousModel : Registers.Tariff3ReactiveEnergyImportDateModel, TARIFF3_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS, ); result.add( isPreviousBillingTable ? Registers.Tariff3ReactiveEnergyImportTimePreviousModel : Registers.Tariff3ReactiveEnergyImportTimeModel, formatAlphaA3Time(arrayBuffer.slice(307, 309), TARIFF3_REACTIVE_ENERGY_IMPORT_DATE_PREVIOUS), ); result.add( isPreviousBillingTable ? Registers.Tariff3CumulativeReactiveMaximumDemandImportPreviousModel : Registers.Tariff3CumulativeReactiveMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(309, 315)), 6), ); result.add( isPreviousBillingTable ? Registers.Tariff3ReactiveMaximumDemandImportPreviousModel : Registers.Tariff3ReactiveMaximumDemandImportModel, formatCleanNumericValue(decimalArrayAsLittleEndianNumber(arrayBuffer.slice(315, 320)), 6), ); return result; } parseBody(arrayBuffer, aBase64String): ParserResult { const incomplete = this.isPayloadIncomplete(arrayBuffer); if (incomplete) { throw new NeedMoreBytesError(); } switch (this.interpretationCode) { case 1: return this.parseReadingStrategyOne(arrayBuffer); case 2: return this.parseReadingStrategyTwo(arrayBuffer); case 3: return this.parseReadingStrategyThree(arrayBuffer); case 9: return this.parseReadingStrategyNine(arrayBuffer, aBase64String); default: throw new ParserError(`Unidentified reading interpretation`); } } getMeterNumber(arrayBuffer) { return uint8ArrayToAsciiNumber(arrayBuffer.slice(97, 113)); } parse(aBase64String: string, recoverMeterNumber?: Function): ParserResult { const arrayBuffer = new Uint8Array(base64ToArrayBuffer.decode(aBase64String)); if (arrayBuffer.length < 2) { throw new NeedMoreBytesError(); } this.assertIfFirstByteIsNonzero(arrayBuffer); if (recoverMeterNumber) { return recoverMeterNumber(this.getMeterNumber(arrayBuffer)); } const modelByte = arrayBuffer[1]; if (modelByte === 3) { return this.parseBody(arrayBuffer, aBase64String); } else { throw new ParserError(`Byte model no identificado`); } } getMeter; }