]> git.basschouten.com Git - openhab-addons.git/blob
6fc5b49a78083d643a2571d6f43123ea1fb0fa0c
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2020 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.miele.internal.handler;
14
15 import java.lang.reflect.Method;
16 import java.util.Map.Entry;
17
18 import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData;
19 import org.openhab.core.library.types.DecimalType;
20 import org.openhab.core.library.types.OnOffType;
21 import org.openhab.core.library.types.OpenClosedType;
22 import org.openhab.core.library.types.StringType;
23 import org.openhab.core.types.State;
24 import org.openhab.core.types.Type;
25 import org.openhab.core.types.UnDefType;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
28
29 import com.google.gson.JsonElement;
30
31 /**
32  * The {@link ApplianceChannelSelector} for fridges with
33  * a freezer compartment
34  *
35  * @author Karel Goderis - Initial contribution
36  */
37 public enum FridgeFreezerChannelSelector implements ApplianceChannelSelector {
38
39     PRODUCT_TYPE("productTypeId", "productType", StringType.class, true),
40     DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true),
41     BRAND_ID("brandId", "brandId", StringType.class, true),
42     COMPANY_ID("companyId", "companyId", StringType.class, true),
43     STATE("state", "state", StringType.class, false),
44     FREEZERSTATE("freezerState", "freezerstate", StringType.class, false),
45     FRIDGESTATE("fridgeState", "fridgestate", StringType.class, false),
46     SUPERCOOL(null, "supercool", OnOffType.class, false),
47     SUPERFREEZE(null, "superfreeze", OnOffType.class, false),
48     FREEZERCURRENTTEMP("freezerCurrentTemperature", "freezercurrent", DecimalType.class, false) {
49         @Override
50         public State getState(String s, DeviceMetaData dmd) {
51             return getState(s);
52         }
53     },
54     FREEZERTARGETTEMP("freezerTargetTemperature", "freezertarget", DecimalType.class, false) {
55         @Override
56         public State getState(String s, DeviceMetaData dmd) {
57             return getState(s);
58         }
59     },
60     FRIDGECURRENTTEMP("fridgeCurrentTemperature", "fridgecurrent", DecimalType.class, false) {
61         @Override
62         public State getState(String s, DeviceMetaData dmd) {
63             return getState(s);
64         }
65     },
66     FRIDGETARGETTEMP("fridgeTargetTemperature", "fridgetarget", DecimalType.class, false) {
67         @Override
68         public State getState(String s, DeviceMetaData dmd) {
69             return getState(s);
70         }
71     },
72     DOOR("signalDoor", "door", OpenClosedType.class, false) {
73         @Override
74
75         public State getState(String s, DeviceMetaData dmd) {
76             if ("true".equals(s)) {
77                 return getState("OPEN");
78             }
79
80             if ("false".equals(s)) {
81                 return getState("CLOSED");
82             }
83
84             return UnDefType.UNDEF;
85         }
86     },
87     START(null, "start", OnOffType.class, false);
88
89     private final Logger logger = LoggerFactory.getLogger(FridgeFreezerChannelSelector.class);
90
91     private final String mieleID;
92     private final String channelID;
93     private final Class<? extends Type> typeClass;
94     private final boolean isProperty;
95
96     FridgeFreezerChannelSelector(String propertyID, String channelID, Class<? extends Type> typeClass,
97             boolean isProperty) {
98         this.mieleID = propertyID;
99         this.channelID = channelID;
100         this.typeClass = typeClass;
101         this.isProperty = isProperty;
102     }
103
104     @Override
105     public String toString() {
106         return mieleID;
107     }
108
109     @Override
110     public String getMieleID() {
111         return mieleID;
112     }
113
114     @Override
115     public String getChannelID() {
116         return channelID;
117     }
118
119     @Override
120     public Class<? extends Type> getTypeClass() {
121         return typeClass;
122     }
123
124     @Override
125     public boolean isProperty() {
126         return isProperty;
127     }
128
129     @Override
130     public State getState(String s, DeviceMetaData dmd) {
131         if (dmd != null) {
132             String localizedValue = getMieleEnum(s, dmd);
133             if (localizedValue == null) {
134                 localizedValue = dmd.LocalizedValue;
135             }
136             if (localizedValue == null) {
137                 localizedValue = s;
138             }
139
140             return getState(localizedValue);
141         } else {
142             return getState(s);
143         }
144     }
145
146     public State getState(String s) {
147         try {
148             Method valueOf = typeClass.getMethod("valueOf", String.class);
149             State state = (State) valueOf.invoke(typeClass, s);
150             if (state != null) {
151                 return state;
152             }
153         } catch (Exception e) {
154             logger.error("An exception occurred while converting '{}' into a State", s);
155         }
156
157         return null;
158     }
159
160     public String getMieleEnum(String s, DeviceMetaData dmd) {
161         if (dmd.MieleEnum != null) {
162             for (Entry<String, JsonElement> enumEntry : dmd.MieleEnum.entrySet()) {
163                 if (enumEntry.getValue().getAsString().trim().equals(s.trim())) {
164                     return enumEntry.getKey();
165                 }
166             }
167         }
168
169         return null;
170     }
171 }