2 * Copyright (c) 2010-2022 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.solarmax.internal.connector;
15 import java.time.ZonedDateTime;
16 import java.util.HashMap;
19 import org.eclipse.jdt.annotation.DefaultLocation;
20 import org.eclipse.jdt.annotation.NonNullByDefault;
21 import org.eclipse.jdt.annotation.Nullable;
22 import org.openhab.core.library.types.DateTimeType;
23 import org.openhab.core.types.State;
26 * The {@link SolarMaxData} class is a POJO for storing the values returned from the SolarMax device and accessing the
29 * @author Jamie Townsend - Initial contribution
31 @NonNullByDefault({ DefaultLocation.PARAMETER, DefaultLocation.FIELD, DefaultLocation.TYPE_BOUND,
32 DefaultLocation.TYPE_ARGUMENT })
33 public class SolarMaxData {
35 private ZonedDateTime dataDateTime = ZonedDateTime.now();
37 private boolean communicationSuccessful;
39 private final Map<SolarMaxCommandKey, @Nullable String> data = new HashMap<>();
41 public State getDataDateTime() {
42 return new DateTimeType(dataDateTime);
45 public boolean has(SolarMaxCommandKey key) {
46 return data.containsKey(key);
49 public Number get(SolarMaxCommandKey key) {
52 return getSoftwareVersion();
55 return getBuildNumber();
61 return getAcPhase1Current();
64 return getAcPhase2Current();
67 return getAcPhase3Current();
69 case energyGeneratedToday:
70 return getEnergyGeneratedToday();
72 case energyGeneratedTotal:
73 return getEnergyGeneratedTotal();
76 return getOperatingHours();
78 case energyGeneratedYesterday:
79 return getEnergyGeneratedYesterday();
81 case energyGeneratedLastMonth:
82 return getEnergyGeneratedLastMonth();
84 case energyGeneratedLastYear:
85 return getEnergyGeneratedLastYear();
87 case energyGeneratedThisMonth:
88 return getEnergyGeneratedThisMonth();
90 case energyGeneratedThisYear:
91 return getEnergyGeneratedThisYear();
93 case currentPowerGenerated:
94 return getCurrentPowerGenerated();
97 return getAcFrequency();
100 return getAcPhase1Voltage();
102 case acPhase2Voltage:
103 return getAcPhase2Voltage();
105 case acPhase3Voltage:
106 return getAcPhase3Voltage();
108 case heatSinkTemperature:
109 return getHeatSinkTemperature();
116 public void setDataDateTime(ZonedDateTime dataDateTime) {
117 this.dataDateTime = dataDateTime;
120 public boolean wasCommunicationSuccessful() {
121 return this.communicationSuccessful;
124 public void setCommunicationSuccessful(boolean communicationSuccessful) {
125 this.communicationSuccessful = communicationSuccessful;
128 public Number getSoftwareVersion() {
129 return getIntegerValueFrom(SolarMaxCommandKey.softwareVersion);
132 public Number getBuildNumber() {
133 return getIntegerValueFrom(SolarMaxCommandKey.buildNumber);
136 public Number getStartups() {
137 return getIntegerValueFrom(SolarMaxCommandKey.startups);
140 public Number getAcPhase1Current() {
141 return getDecimalValueFrom(SolarMaxCommandKey.acPhase1Current, 0.01);
144 public Number getAcPhase2Current() {
145 return getDecimalValueFrom(SolarMaxCommandKey.acPhase2Current, 0.01);
148 public Number getAcPhase3Current() {
149 return getDecimalValueFrom(SolarMaxCommandKey.acPhase3Current, 0.01);
152 public Number getEnergyGeneratedToday() {
153 return getIntegerValueFrom(SolarMaxCommandKey.energyGeneratedToday, 100);
156 public Number getEnergyGeneratedTotal() {
157 return getIntegerValueFrom(SolarMaxCommandKey.energyGeneratedTotal, 1000);
160 public Number getOperatingHours() {
161 return getIntegerValueFrom(SolarMaxCommandKey.operatingHours);
164 public Number getEnergyGeneratedYesterday() {
165 return getIntegerValueFrom(SolarMaxCommandKey.energyGeneratedYesterday, 100);
168 public Number getEnergyGeneratedLastMonth() {
169 return getIntegerValueFrom(SolarMaxCommandKey.energyGeneratedLastMonth, 1000);
172 public Number getEnergyGeneratedLastYear() {
173 return getIntegerValueFrom(SolarMaxCommandKey.energyGeneratedLastYear, 1000);
176 public Number getEnergyGeneratedThisMonth() {
177 return getIntegerValueFrom(SolarMaxCommandKey.energyGeneratedThisMonth, 1000);
180 public Number getEnergyGeneratedThisYear() {
181 return getIntegerValueFrom(SolarMaxCommandKey.energyGeneratedThisYear, 1000);
184 public Number getCurrentPowerGenerated() {
185 return getIntegerValueFrom(SolarMaxCommandKey.currentPowerGenerated, 0.5);
188 Number getAcFrequency() {
189 return getDecimalValueFrom(SolarMaxCommandKey.acFrequency, 0.01);
192 public Number getAcPhase1Voltage() {
193 return getDecimalValueFrom(SolarMaxCommandKey.acPhase1Voltage, 0.1);
196 public Number getAcPhase2Voltage() {
197 return getDecimalValueFrom(SolarMaxCommandKey.acPhase2Voltage, 0.1);
200 public Number getAcPhase3Voltage() {
201 return getDecimalValueFrom(SolarMaxCommandKey.acPhase3Voltage, 0.1);
204 public Number getHeatSinkTemperature() {
205 return getIntegerValueFrom(SolarMaxCommandKey.heatSinkTemperature);
209 private Number getDecimalValueFrom(SolarMaxCommandKey solarMaxCommandKey, double multiplyByFactor) {
210 if (this.data.containsKey(solarMaxCommandKey)) {
211 String valueString = this.data.get(solarMaxCommandKey);
213 if (valueString != null) {
214 int valueInt = Integer.parseInt(valueString, 16);
215 return (float) valueInt * multiplyByFactor;
223 private Number getIntegerValueFrom(SolarMaxCommandKey solarMaxCommandKey, double multiplyByFactor) {
224 if (this.data.containsKey(solarMaxCommandKey)) {
225 String valueString = this.data.get(solarMaxCommandKey);
227 if (valueString != null) {
228 int valueInt = Integer.parseInt(valueString, 16);
229 return (int) (valueInt * multiplyByFactor);
237 private Number getIntegerValueFrom(SolarMaxCommandKey solarMaxCommandKey) {
238 if (this.data.containsKey(solarMaxCommandKey)) {
239 String valueString = this.data.get(solarMaxCommandKey);
240 if (valueString != null) {
241 return Integer.parseInt(valueString, 16);
248 protected void setData(Map<SolarMaxCommandKey, @Nullable String> data) {
249 this.data.putAll(data);