]> git.basschouten.com Git - openhab-addons.git/blob
b7201a625a83a50a8c280dcabc2480607c129915
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2023 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
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
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.modbus.sunspec.internal.parser;
14
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;
19
20 /**
21  * Parses inverter modbus data into an InverterModelBlock
22  *
23  * @author Nagy Attila Gabor - Initial contribution
24  *
25  */
26 @NonNullByDefault
27 public class InverterModelParser extends AbstractBaseParser implements SunspecParser<InverterModelBlock> {
28
29     @Override
30     public InverterModelBlock parse(ModbusRegisterArray raw) {
31         InverterModelBlock block = new InverterModelBlock();
32
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);
40
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);
48
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);
61
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);
68
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);
76
77         return block;
78     }
79 }