]> git.basschouten.com Git - openhab-addons.git/blob
f367e8e9c2750816c357eebe51c8f7076a800eda
[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.digitalstrom.internal.lib.structure.devices.impl;
14
15 import java.util.Arrays;
16 import java.util.List;
17
18 import org.openhab.binding.digitalstrom.internal.lib.serverconnection.constants.JSONApiResponseKeysEnum;
19 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.AbstractGeneralDeviceInformations;
20 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.Circuit;
21 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.deviceparameters.CachedMeteringValue;
22 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.deviceparameters.DeviceStateUpdate;
23 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.deviceparameters.constants.MeteringTypeEnum;
24 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.deviceparameters.constants.MeteringUnitsEnum;
25 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.deviceparameters.impl.DeviceStateUpdateImpl;
26
27 import com.google.gson.JsonObject;
28
29 /**
30  * The {@link CircuitImpl} is the implementation of the {@link Circuit} and represent a digitalSTROM circuit.
31  *
32  * @author Michael Ochel - initial contributer
33  * @author Matthias Siegele - initial contributer
34  */
35 public class CircuitImpl extends AbstractGeneralDeviceInformations implements Circuit {
36
37     // Config
38     private Integer hwVersion;
39     private String hwVersionString;
40     private String swVersion;
41     private Integer armSwVersion;
42     private Integer dspSwVersion;
43     private Integer apiVersion;
44     private String hwName;
45     private Integer busMemberType;
46     private Boolean hasDevices;
47     private Boolean hasMetering;
48     private String vdcConfigURL;
49     private String vdcModelUID;
50     private String vdcHardwareGuid;
51     private String vdcHardwareModelGuid;
52     private String vdcVendorGuid;
53     private String vdcOemGuid;
54     private Boolean ignoreActionsFromNewDevices;
55
56     // Metering
57     private CachedMeteringValue consumption;
58     private CachedMeteringValue energyWh;
59     private CachedMeteringValue energyWs;
60     // currently energyDelta not exist
61     // private CachedMeteringValue energyDeltaWh;
62     // private CachedMeteringValue energyDeltaWs;
63
64     /**
65      * Creates a new {@link CircuitImpl} through the digitalSTROM json response as {@link JsonObject}.
66      *
67      * @param jObject of the digitalSTROM json response, must not be null
68      */
69     public CircuitImpl(JsonObject jObject) {
70         super(jObject);
71         if (jObject.get(JSONApiResponseKeysEnum.HW_VERSION.getKey()) != null) {
72             hwVersion = jObject.get(JSONApiResponseKeysEnum.HW_VERSION.getKey()).getAsInt();
73         }
74         if (jObject.get(JSONApiResponseKeysEnum.HW_VERSION_STRING.getKey()) != null) {
75             hwVersionString = jObject.get(JSONApiResponseKeysEnum.HW_VERSION_STRING.getKey()).getAsString();
76         }
77         if (jObject.get(JSONApiResponseKeysEnum.SW_VERSION.getKey()) != null) {
78             swVersion = jObject.get(JSONApiResponseKeysEnum.SW_VERSION.getKey()).getAsString();
79         }
80         if (jObject.get(JSONApiResponseKeysEnum.ARM_SW_VERSION.getKey()) != null) {
81             armSwVersion = jObject.get(JSONApiResponseKeysEnum.ARM_SW_VERSION.getKey()).getAsInt();
82         }
83         if (jObject.get(JSONApiResponseKeysEnum.DSP_SW_VERSION.getKey()) != null) {
84             dspSwVersion = jObject.get(JSONApiResponseKeysEnum.DSP_SW_VERSION.getKey()).getAsInt();
85         }
86         if (jObject.get(JSONApiResponseKeysEnum.API_VERSION.getKey()) != null) {
87             apiVersion = jObject.get(JSONApiResponseKeysEnum.API_VERSION.getKey()).getAsInt();
88         }
89         if (jObject.get(JSONApiResponseKeysEnum.HW_NAME.getKey()) != null) {
90             hwName = jObject.get(JSONApiResponseKeysEnum.HW_NAME.getKey()).getAsString();
91         }
92         if (jObject.get(JSONApiResponseKeysEnum.BUS_MEMBER_TYPE.getKey()) != null) {
93             busMemberType = jObject.get(JSONApiResponseKeysEnum.BUS_MEMBER_TYPE.getKey()).getAsInt();
94         }
95         if (jObject.get(JSONApiResponseKeysEnum.HAS_DEVICES.getKey()) != null) {
96             hasDevices = jObject.get(JSONApiResponseKeysEnum.HAS_DEVICES.getKey()).getAsBoolean();
97         }
98         if (jObject.get(JSONApiResponseKeysEnum.HAS_METERING.getKey()) != null) {
99             hasMetering = jObject.get(JSONApiResponseKeysEnum.HAS_METERING.getKey()).getAsBoolean();
100         }
101         if (jObject.get(JSONApiResponseKeysEnum.VDC_CONFIG_URL.getKey()) != null) {
102             vdcConfigURL = jObject.get(JSONApiResponseKeysEnum.VDC_CONFIG_URL.getKey()).getAsString();
103         }
104         if (jObject.get(JSONApiResponseKeysEnum.VDC_MODEL_UID.getKey()) != null) {
105             vdcModelUID = jObject.get(JSONApiResponseKeysEnum.VDC_MODEL_UID.getKey()).getAsString();
106         }
107         if (jObject.get(JSONApiResponseKeysEnum.VDC_HARDWARE_GUID.getKey()) != null) {
108             vdcHardwareGuid = jObject.get(JSONApiResponseKeysEnum.VDC_HARDWARE_GUID.getKey()).getAsString();
109         }
110         if (jObject.get(JSONApiResponseKeysEnum.VDC_HARDWARE_MODEL_GUID.getKey()) != null) {
111             vdcHardwareModelGuid = jObject.get(JSONApiResponseKeysEnum.VDC_HARDWARE_MODEL_GUID.getKey()).getAsString();
112         }
113         if (jObject.get(JSONApiResponseKeysEnum.VDC_VENDOR_GUID.getKey()) != null) {
114             vdcVendorGuid = jObject.get(JSONApiResponseKeysEnum.VDC_VENDOR_GUID.getKey()).getAsString();
115         }
116         if (jObject.get(JSONApiResponseKeysEnum.VDC_OEM_GUID.getKey()) != null) {
117             vdcOemGuid = jObject.get(JSONApiResponseKeysEnum.VDC_OEM_GUID.getKey()).getAsString();
118         }
119         if (jObject.get(JSONApiResponseKeysEnum.IGNORE_ACTIONS_FROM_NEW_DEVICES.getKey()) != null) {
120             ignoreActionsFromNewDevices = jObject.get(JSONApiResponseKeysEnum.IGNORE_ACTIONS_FROM_NEW_DEVICES.getKey())
121                     .getAsBoolean();
122         }
123     }
124
125     @Override
126     public Integer getHwVersion() {
127         return hwVersion;
128     }
129
130     @Override
131     public void setHwVersion(Integer hwVersion) {
132         this.hwVersion = hwVersion;
133     }
134
135     @Override
136     public String getHwVersionString() {
137         return hwVersionString;
138     }
139
140     @Override
141     public void setHwVersionString(String hwVersionString) {
142         this.hwVersionString = hwVersionString;
143     }
144
145     @Override
146     public String getSwVersion() {
147         return swVersion;
148     }
149
150     @Override
151     public void setSwVersion(String swVersion) {
152         this.swVersion = swVersion;
153     }
154
155     @Override
156     public Integer getArmSwVersion() {
157         return armSwVersion;
158     }
159
160     @Override
161     public void setArmSwVersion(Integer armSwVersion) {
162         this.armSwVersion = armSwVersion;
163     }
164
165     @Override
166     public Integer getDspSwVersion() {
167         return dspSwVersion;
168     }
169
170     @Override
171     public void setDspSwVersion(Integer dspSwVersion) {
172         this.dspSwVersion = dspSwVersion;
173     }
174
175     @Override
176     public Integer getApiVersion() {
177         return apiVersion;
178     }
179
180     @Override
181     public void setApiVersion(Integer apiVersion) {
182         this.apiVersion = apiVersion;
183     }
184
185     @Override
186     public String getHwName() {
187         return hwName;
188     }
189
190     @Override
191     public void setHwName(String hwName) {
192         this.hwName = hwName;
193     }
194
195     @Override
196     public Integer getBusMemberType() {
197         return busMemberType;
198     }
199
200     @Override
201     public void setBusMemberType(Integer busMemberType) {
202         this.busMemberType = busMemberType;
203     }
204
205     @Override
206     public Boolean getHasDevices() {
207         return hasDevices;
208     }
209
210     @Override
211     public void setHasDevices(Boolean hasDevices) {
212         this.hasDevices = hasDevices;
213     }
214
215     @Override
216     public Boolean getHasMetering() {
217         return hasMetering;
218     }
219
220     @Override
221     public void setHasMetering(Boolean hasMetering) {
222         this.hasMetering = hasMetering;
223     }
224
225     @Override
226     public String getVdcConfigURL() {
227         return vdcConfigURL;
228     }
229
230     @Override
231     public void setVdcConfigURL(String vdcConfigURL) {
232         this.vdcConfigURL = vdcConfigURL;
233     }
234
235     @Override
236     public String getVdcModelUID() {
237         return vdcModelUID;
238     }
239
240     @Override
241     public void setVdcModelUID(String vdcModelUID) {
242         this.vdcModelUID = vdcModelUID;
243     }
244
245     @Override
246     public String getVdcHardwareGuid() {
247         return vdcHardwareGuid;
248     }
249
250     @Override
251     public void setVdcHardwareGuid(String vdcHardwareGuid) {
252         this.vdcHardwareGuid = vdcHardwareGuid;
253     }
254
255     @Override
256     public String getVdcHardwareModelGuid() {
257         return vdcHardwareModelGuid;
258     }
259
260     @Override
261     public void setVdcHardwareModelGuid(String vdcHardwareModelGuid) {
262         this.vdcHardwareModelGuid = vdcHardwareModelGuid;
263     }
264
265     @Override
266     public String getVdcVendorGuid() {
267         return vdcVendorGuid;
268     }
269
270     @Override
271     public void setVdcVendorGuid(String vdcVendorGuid) {
272         this.vdcVendorGuid = vdcVendorGuid;
273     }
274
275     @Override
276     public String getVdcOemGuid() {
277         return vdcOemGuid;
278     }
279
280     @Override
281     public void setVdcOemGuid(String vdcOemGuid) {
282         this.vdcOemGuid = vdcOemGuid;
283     }
284
285     @Override
286     public Boolean getIgnoreActionsFromNewDevices() {
287         return ignoreActionsFromNewDevices;
288     }
289
290     @Override
291     public void setIgnoreActionsFromNewDevices(Boolean ignoreActionsFromNewDevices) {
292         this.ignoreActionsFromNewDevices = ignoreActionsFromNewDevices;
293     }
294
295     @Override
296     public void addMeteringValue(CachedMeteringValue cachedMeteringValue) {
297         if (cachedMeteringValue != null) {
298             switch (cachedMeteringValue.getMeteringType()) {
299                 case CONSUMPTION:
300                     if (checkNewer(consumption, cachedMeteringValue)) {
301                         consumption = cachedMeteringValue;
302                         informListener(cachedMeteringValue);
303                     }
304                     break;
305                 case ENERGY:
306                     if (cachedMeteringValue.getMeteringUnit().equals(MeteringUnitsEnum.WH)) {
307                         if (checkNewer(energyWh, cachedMeteringValue)) {
308                             energyWh = cachedMeteringValue;
309                             informListener(cachedMeteringValue);
310                         }
311                     } else {
312                         if (checkNewer(energyWs, cachedMeteringValue)) {
313                             energyWs = cachedMeteringValue;
314                             informListener(cachedMeteringValue);
315                         }
316                     }
317                     break;
318                 default:
319                     break;
320             }
321         }
322     }
323
324     private void informListener(CachedMeteringValue newMeteringValue) {
325         if (isListenerRegisterd()) {
326             super.listener.onDeviceStateChanged(
327                     new DeviceStateUpdateImpl(DeviceStateUpdate.UPDATE_CIRCUIT_METER, newMeteringValue));
328         }
329     }
330
331     private boolean checkNewer(CachedMeteringValue oldCachedMeteringValue, CachedMeteringValue newCachedMeteringValue) {
332         return oldCachedMeteringValue == null
333                 || oldCachedMeteringValue.getDateAsDate().before(newCachedMeteringValue.getDateAsDate());
334     }
335
336     @Override
337     public double getMeteringValue(MeteringTypeEnum meteringType, MeteringUnitsEnum meteringUnit) {
338         switch (meteringType) {
339             case CONSUMPTION:
340                 return getValue(consumption);
341             case ENERGY:
342                 if (MeteringUnitsEnum.WS.equals(meteringUnit)) {
343                     return getValue(energyWs);
344                 } else {
345                     return getValue(energyWh);
346                 }
347             default:
348                 break;
349         }
350         return -1;
351     }
352
353     private double getValue(CachedMeteringValue cachedMeteringValue) {
354         return cachedMeteringValue != null ? cachedMeteringValue.getValue() : -1;
355     }
356
357     @Override
358     public List<CachedMeteringValue> getAllCachedMeteringValues() {
359         return Arrays.asList(consumption, energyWh, energyWs);
360     }
361
362     /*
363      * (non-Javadoc)
364      *
365      * @see java.lang.Object#hashCode()
366      */
367     @Override
368     public int hashCode() {
369         final int prime = 31;
370         int result = super.hashCode();
371         result = prime * result + ((apiVersion == null) ? 0 : apiVersion.hashCode());
372         result = prime * result + ((armSwVersion == null) ? 0 : armSwVersion.hashCode());
373         result = prime * result + ((busMemberType == null) ? 0 : busMemberType.hashCode());
374         result = prime * result + ((dspSwVersion == null) ? 0 : dspSwVersion.hashCode());
375         result = prime * result + ((hasDevices == null) ? 0 : hasDevices.hashCode());
376         result = prime * result + ((hasMetering == null) ? 0 : hasMetering.hashCode());
377         result = prime * result + ((hwName == null) ? 0 : hwName.hashCode());
378         result = prime * result + ((hwVersion == null) ? 0 : hwVersion.hashCode());
379         result = prime * result + ((hwVersionString == null) ? 0 : hwVersionString.hashCode());
380         result = prime * result + ((ignoreActionsFromNewDevices == null) ? 0 : ignoreActionsFromNewDevices.hashCode());
381         result = prime * result + ((swVersion == null) ? 0 : swVersion.hashCode());
382         result = prime * result + ((vdcConfigURL == null) ? 0 : vdcConfigURL.hashCode());
383         result = prime * result + ((vdcHardwareGuid == null) ? 0 : vdcHardwareGuid.hashCode());
384         result = prime * result + ((vdcHardwareModelGuid == null) ? 0 : vdcHardwareModelGuid.hashCode());
385         result = prime * result + ((vdcModelUID == null) ? 0 : vdcModelUID.hashCode());
386         result = prime * result + ((vdcOemGuid == null) ? 0 : vdcOemGuid.hashCode());
387         result = prime * result + ((vdcVendorGuid == null) ? 0 : vdcVendorGuid.hashCode());
388         return result;
389     }
390
391     /*
392      * (non-Javadoc)
393      *
394      * @see java.lang.Object#equals(java.lang.Object)
395      */
396     @Override
397     public boolean equals(Object obj) {
398         if (this == obj) {
399             return true;
400         }
401         if (!super.equals(obj)) {
402             return false;
403         }
404         if (!(obj instanceof CircuitImpl)) {
405             return false;
406         }
407         CircuitImpl other = (CircuitImpl) obj;
408         if (apiVersion == null) {
409             if (other.apiVersion != null) {
410                 return false;
411             }
412         } else if (!apiVersion.equals(other.apiVersion)) {
413             return false;
414         }
415         if (armSwVersion == null) {
416             if (other.armSwVersion != null) {
417                 return false;
418             }
419         } else if (!armSwVersion.equals(other.armSwVersion)) {
420             return false;
421         }
422         if (busMemberType == null) {
423             if (other.busMemberType != null) {
424                 return false;
425             }
426         } else if (!busMemberType.equals(other.busMemberType)) {
427             return false;
428         }
429         if (dspSwVersion == null) {
430             if (other.dspSwVersion != null) {
431                 return false;
432             }
433         } else if (!dspSwVersion.equals(other.dspSwVersion)) {
434             return false;
435         }
436         if (hasDevices == null) {
437             if (other.hasDevices != null) {
438                 return false;
439             }
440         } else if (!hasDevices.equals(other.hasDevices)) {
441             return false;
442         }
443         if (hasMetering == null) {
444             if (other.hasMetering != null) {
445                 return false;
446             }
447         } else if (!hasMetering.equals(other.hasMetering)) {
448             return false;
449         }
450         if (hwName == null) {
451             if (other.hwName != null) {
452                 return false;
453             }
454         } else if (!hwName.equals(other.hwName)) {
455             return false;
456         }
457         if (hwVersion == null) {
458             if (other.hwVersion != null) {
459                 return false;
460             }
461         } else if (!hwVersion.equals(other.hwVersion)) {
462             return false;
463         }
464         if (hwVersionString == null) {
465             if (other.hwVersionString != null) {
466                 return false;
467             }
468         } else if (!hwVersionString.equals(other.hwVersionString)) {
469             return false;
470         }
471         if (ignoreActionsFromNewDevices == null) {
472             if (other.ignoreActionsFromNewDevices != null) {
473                 return false;
474             }
475         } else if (!ignoreActionsFromNewDevices.equals(other.ignoreActionsFromNewDevices)) {
476             return false;
477         }
478         if (swVersion == null) {
479             if (other.swVersion != null) {
480                 return false;
481             }
482         } else if (!swVersion.equals(other.swVersion)) {
483             return false;
484         }
485         if (vdcConfigURL == null) {
486             if (other.vdcConfigURL != null) {
487                 return false;
488             }
489         } else if (!vdcConfigURL.equals(other.vdcConfigURL)) {
490             return false;
491         }
492         if (vdcHardwareGuid == null) {
493             if (other.vdcHardwareGuid != null) {
494                 return false;
495             }
496         } else if (!vdcHardwareGuid.equals(other.vdcHardwareGuid)) {
497             return false;
498         }
499         if (vdcHardwareModelGuid == null) {
500             if (other.vdcHardwareModelGuid != null) {
501                 return false;
502             }
503         } else if (!vdcHardwareModelGuid.equals(other.vdcHardwareModelGuid)) {
504             return false;
505         }
506         if (vdcModelUID == null) {
507             if (other.vdcModelUID != null) {
508                 return false;
509             }
510         } else if (!vdcModelUID.equals(other.vdcModelUID)) {
511             return false;
512         }
513         if (vdcOemGuid == null) {
514             if (other.vdcOemGuid != null) {
515                 return false;
516             }
517         } else if (!vdcOemGuid.equals(other.vdcOemGuid)) {
518             return false;
519         }
520         if (vdcVendorGuid == null) {
521             if (other.vdcVendorGuid != null) {
522                 return false;
523             }
524         } else if (!vdcVendorGuid.equals(other.vdcVendorGuid)) {
525             return false;
526         }
527         return true;
528     }
529 }