]> git.basschouten.com Git - openhab-addons.git/blob
ea63b1ed79fb72dc34c32c0a333c14ebfac84afb
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2022 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.solarmax.internal.connector;
14
15 import java.time.ZonedDateTime;
16 import java.util.HashMap;
17 import java.util.Map;
18
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;
24
25 /**
26  * The {@link SolarMaxData} class is a POJO for storing the values returned from the SolarMax device and accessing the
27  * (decoded) values
28  *
29  * @author Jamie Townsend - Initial contribution
30  */
31 @NonNullByDefault({ DefaultLocation.PARAMETER, DefaultLocation.FIELD, DefaultLocation.TYPE_BOUND,
32         DefaultLocation.TYPE_ARGUMENT })
33 public class SolarMaxData {
34
35     private ZonedDateTime dataDateTime = ZonedDateTime.now();
36
37     private boolean communicationSuccessful;
38
39     private final Map<SolarMaxCommandKey, @Nullable String> data = new HashMap<>();
40
41     public State getDataDateTime() {
42         return new DateTimeType(dataDateTime);
43     }
44
45     public boolean has(SolarMaxCommandKey key) {
46         return data.containsKey(key);
47     }
48
49     public Number get(SolarMaxCommandKey key) {
50         switch (key) {
51             case softwareVersion:
52                 return getSoftwareVersion();
53
54             case buildNumber:
55                 return getBuildNumber();
56
57             case startups:
58                 return getStartups();
59
60             case acPhase1Current:
61                 return getAcPhase1Current();
62
63             case acPhase2Current:
64                 return getAcPhase2Current();
65
66             case acPhase3Current:
67                 return getAcPhase3Current();
68
69             case energyGeneratedToday:
70                 return getEnergyGeneratedToday();
71
72             case energyGeneratedTotal:
73                 return getEnergyGeneratedTotal();
74
75             case operatingHours:
76                 return getOperatingHours();
77
78             case energyGeneratedYesterday:
79                 return getEnergyGeneratedYesterday();
80
81             case energyGeneratedLastMonth:
82                 return getEnergyGeneratedLastMonth();
83
84             case energyGeneratedLastYear:
85                 return getEnergyGeneratedLastYear();
86
87             case energyGeneratedThisMonth:
88                 return getEnergyGeneratedThisMonth();
89
90             case energyGeneratedThisYear:
91                 return getEnergyGeneratedThisYear();
92
93             case currentPowerGenerated:
94                 return getCurrentPowerGenerated();
95
96             case acFrequency:
97                 return getAcFrequency();
98
99             case acPhase1Voltage:
100                 return getAcPhase1Voltage();
101
102             case acPhase2Voltage:
103                 return getAcPhase2Voltage();
104
105             case acPhase3Voltage:
106                 return getAcPhase3Voltage();
107
108             case heatSinkTemperature:
109                 return getHeatSinkTemperature();
110
111             default:
112                 return null;
113         }
114     }
115
116     public void setDataDateTime(ZonedDateTime dataDateTime) {
117         this.dataDateTime = dataDateTime;
118     }
119
120     public boolean wasCommunicationSuccessful() {
121         return this.communicationSuccessful;
122     }
123
124     public void setCommunicationSuccessful(boolean communicationSuccessful) {
125         this.communicationSuccessful = communicationSuccessful;
126     }
127
128     public Number getSoftwareVersion() {
129         return getIntegerValueFrom(SolarMaxCommandKey.softwareVersion);
130     }
131
132     public Number getBuildNumber() {
133         return getIntegerValueFrom(SolarMaxCommandKey.buildNumber);
134     }
135
136     public Number getStartups() {
137         return getIntegerValueFrom(SolarMaxCommandKey.startups);
138     }
139
140     public Number getAcPhase1Current() {
141         return getDecimalValueFrom(SolarMaxCommandKey.acPhase1Current, 0.01);
142     }
143
144     public Number getAcPhase2Current() {
145         return getDecimalValueFrom(SolarMaxCommandKey.acPhase2Current, 0.01);
146     }
147
148     public Number getAcPhase3Current() {
149         return getDecimalValueFrom(SolarMaxCommandKey.acPhase3Current, 0.01);
150     }
151
152     public Number getEnergyGeneratedToday() {
153         return getIntegerValueFrom(SolarMaxCommandKey.energyGeneratedToday, 100);
154     }
155
156     public Number getEnergyGeneratedTotal() {
157         return getIntegerValueFrom(SolarMaxCommandKey.energyGeneratedTotal, 1000);
158     }
159
160     public Number getOperatingHours() {
161         return getIntegerValueFrom(SolarMaxCommandKey.operatingHours);
162     }
163
164     public Number getEnergyGeneratedYesterday() {
165         return getIntegerValueFrom(SolarMaxCommandKey.energyGeneratedYesterday, 100);
166     }
167
168     public Number getEnergyGeneratedLastMonth() {
169         return getIntegerValueFrom(SolarMaxCommandKey.energyGeneratedLastMonth, 1000);
170     }
171
172     public Number getEnergyGeneratedLastYear() {
173         return getIntegerValueFrom(SolarMaxCommandKey.energyGeneratedLastYear, 1000);
174     }
175
176     public Number getEnergyGeneratedThisMonth() {
177         return getIntegerValueFrom(SolarMaxCommandKey.energyGeneratedThisMonth, 1000);
178     }
179
180     public Number getEnergyGeneratedThisYear() {
181         return getIntegerValueFrom(SolarMaxCommandKey.energyGeneratedThisYear, 1000);
182     }
183
184     public Number getCurrentPowerGenerated() {
185         return getIntegerValueFrom(SolarMaxCommandKey.currentPowerGenerated, 0.5);
186     }
187
188     Number getAcFrequency() {
189         return getDecimalValueFrom(SolarMaxCommandKey.acFrequency, 0.01);
190     }
191
192     public Number getAcPhase1Voltage() {
193         return getDecimalValueFrom(SolarMaxCommandKey.acPhase1Voltage, 0.1);
194     }
195
196     public Number getAcPhase2Voltage() {
197         return getDecimalValueFrom(SolarMaxCommandKey.acPhase2Voltage, 0.1);
198     }
199
200     public Number getAcPhase3Voltage() {
201         return getDecimalValueFrom(SolarMaxCommandKey.acPhase3Voltage, 0.1);
202     }
203
204     public Number getHeatSinkTemperature() {
205         return getIntegerValueFrom(SolarMaxCommandKey.heatSinkTemperature);
206     }
207
208     @Nullable
209     private Number getDecimalValueFrom(SolarMaxCommandKey solarMaxCommandKey, double multiplyByFactor) {
210         if (this.data.containsKey(solarMaxCommandKey)) {
211             String valueString = this.data.get(solarMaxCommandKey);
212
213             if (valueString != null) {
214                 int valueInt = Integer.parseInt(valueString, 16);
215                 return (float) valueInt * multiplyByFactor;
216             }
217             return null;
218         }
219         return null;
220     }
221
222     @Nullable
223     private Number getIntegerValueFrom(SolarMaxCommandKey solarMaxCommandKey, double multiplyByFactor) {
224         if (this.data.containsKey(solarMaxCommandKey)) {
225             String valueString = this.data.get(solarMaxCommandKey);
226
227             if (valueString != null) {
228                 int valueInt = Integer.parseInt(valueString, 16);
229                 return (int) (valueInt * multiplyByFactor);
230             }
231             return null;
232         }
233         return null;
234     }
235
236     @Nullable
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);
242             }
243             return null;
244         }
245         return null;
246     }
247
248     protected void setData(Map<SolarMaxCommandKey, @Nullable String> data) {
249         this.data.putAll(data);
250     }
251 }