2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.modbus.sunspec.internal.parser;
15 import org.eclipse.jdt.annotation.NonNullByDefault;
16 import org.openhab.binding.modbus.sunspec.internal.SunSpecConstants;
17 import org.openhab.binding.modbus.sunspec.internal.dto.InverterModelBlock;
18 import org.openhab.core.io.transport.modbus.ModbusRegisterArray;
21 * Parses inverter modbus data into an InverterModelBlock
23 * @author Nagy Attila Gabor - Initial contribution
27 public class InverterModelParser extends AbstractBaseParser implements SunspecParser<InverterModelBlock> {
30 public InverterModelBlock parse(ModbusRegisterArray raw) {
31 InverterModelBlock block = new InverterModelBlock();
33 block.phaseConfiguration = extractUInt16(raw, 0, SunSpecConstants.INVERTER_SINGLE_PHASE);
34 block.length = extractUInt16(raw, 1, raw.size());
35 block.acCurrentTotal = extractUInt16(raw, 2, 0);
36 block.acCurrentPhaseA = extractUInt16(raw, 3, 0);
37 block.acCurrentPhaseB = extractOptionalUInt16(raw, 4);
38 block.acCurrentPhaseC = extractOptionalUInt16(raw, 5);
39 block.acCurrentSF = extractSunSSF(raw, 6);
41 block.acVoltageAB = extractOptionalUInt16(raw, 7);
42 block.acVoltageBC = extractOptionalUInt16(raw, 8);
43 block.acVoltageCA = extractOptionalUInt16(raw, 9);
44 block.acVoltageAtoN = extractUInt16(raw, 10, 0);
45 block.acVoltageBtoN = extractOptionalUInt16(raw, 11);
46 block.acVoltageCtoN = extractOptionalUInt16(raw, 12);
47 block.acVoltageSF = extractSunSSF(raw, 13);
49 block.acPower = extractInt16(raw, 14, (short) 0);
50 block.acPowerSF = extractSunSSF(raw, 15);
51 block.acFrequency = extractUInt16(raw, 16, 0);
52 block.acFrequencySF = extractSunSSF(raw, 17);
53 block.acApparentPower = extractOptionalInt16(raw, 18);
54 block.acApparentPowerSF = extractOptionalSunSSF(raw, 19);
55 block.acReactivePower = extractOptionalInt16(raw, 20);
56 block.acReactivePowerSF = extractOptionalSunSSF(raw, 21);
57 block.acPowerFactor = extractOptionalInt16(raw, 22);
58 block.acPowerFactorSF = extractOptionalSunSSF(raw, 23);
59 block.acEnergyLifetime = extractAcc32(raw, 24, 0);
60 block.acEnergyLifetimeSF = extractSunSSF(raw, 26);
62 block.dcCurrent = extractOptionalUInt16(raw, 27);
63 block.dcCurrentSF = extractOptionalSunSSF(raw, 28);
64 block.dcVoltage = extractOptionalUInt16(raw, 29);
65 block.dcVoltageSF = extractOptionalSunSSF(raw, 30);
66 block.dcPower = extractOptionalInt16(raw, 31);
67 block.dcPowerSF = extractOptionalSunSSF(raw, 32);
69 block.temperatureCabinet = extractInt16(raw, 33, (short) 0);
70 block.temperatureHeatsink = extractOptionalInt16(raw, 34);
71 block.temperatureTransformer = extractOptionalInt16(raw, 35);
72 block.temperatureOther = extractOptionalInt16(raw, 36);
73 block.temperatureSF = extractSunSSF(raw, 37);
74 block.status = extractUInt16(raw, 38, 1);
75 block.statusVendor = extractOptionalUInt16(raw, 39);