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