]> git.basschouten.com Git - openhab-addons.git/blob
ab4a741be56c5e30eeeb1487dcff7988fa45623c
[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.miele.internal.handler;
14
15 import static org.openhab.binding.miele.internal.MieleBindingConstants.*;
16
17 import java.lang.reflect.Method;
18
19 import org.openhab.binding.miele.internal.DeviceMetaData;
20 import org.openhab.binding.miele.internal.DeviceUtil;
21 import org.openhab.binding.miele.internal.MieleTranslationProvider;
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 /**
34  * The {@link ApplianceChannelSelector} for fridges with
35  * a freezer compartment
36  *
37  * @author Karel Goderis - Initial contribution
38  * @author Jacob Laursen - Added UoM for temperatures, raw channels
39  */
40 public enum FridgeFreezerChannelSelector implements ApplianceChannelSelector {
41
42     PRODUCT_TYPE("productTypeId", "productType", StringType.class, true),
43     DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true),
44     STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false) {
45         @Override
46         public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
47             State state = DeviceUtil.getStateTextState(s, dmd, translationProvider);
48             if (state != null) {
49                 return state;
50             }
51             return super.getState(s, dmd, translationProvider);
52         }
53     },
54     STATE(null, STATE_CHANNEL_ID, DecimalType.class, false),
55     FREEZERSTATE("freezerState", "freezerstate", StringType.class, false),
56     FRIDGESTATE("fridgeState", "fridgestate", StringType.class, false),
57     SUPERCOOL(null, SUPERCOOL_CHANNEL_ID, OnOffType.class, false),
58     SUPERFREEZE(null, SUPERFREEZE_CHANNEL_ID, OnOffType.class, false),
59     FREEZERCURRENTTEMP("freezerCurrentTemperature", "freezercurrent", QuantityType.class, false) {
60         @Override
61         public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
62             return getTemperatureState(s);
63         }
64     },
65     FREEZERTARGETTEMP("freezerTargetTemperature", "freezertarget", QuantityType.class, false) {
66         @Override
67         public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
68             return getTemperatureState(s);
69         }
70     },
71     FRIDGECURRENTTEMP("fridgeCurrentTemperature", "fridgecurrent", QuantityType.class, false) {
72         @Override
73         public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
74             return getTemperatureState(s);
75         }
76     },
77     FRIDGETARGETTEMP("fridgeTargetTemperature", "fridgetarget", QuantityType.class, false) {
78         @Override
79         public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
80             return getTemperatureState(s);
81         }
82     },
83     DOOR("signalDoor", "door", OpenClosedType.class, false) {
84         @Override
85
86         public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
87             if ("true".equals(s)) {
88                 return getState("OPEN");
89             }
90
91             if ("false".equals(s)) {
92                 return getState("CLOSED");
93             }
94
95             return UnDefType.UNDEF;
96         }
97     },
98     START(null, "start", OnOffType.class, false);
99
100     private final Logger logger = LoggerFactory.getLogger(FridgeFreezerChannelSelector.class);
101
102     private final String mieleID;
103     private final String channelID;
104     private final Class<? extends Type> typeClass;
105     private final boolean isProperty;
106
107     FridgeFreezerChannelSelector(String propertyID, String channelID, Class<? extends Type> typeClass,
108             boolean isProperty) {
109         this.mieleID = propertyID;
110         this.channelID = channelID;
111         this.typeClass = typeClass;
112         this.isProperty = isProperty;
113     }
114
115     @Override
116     public String toString() {
117         return mieleID;
118     }
119
120     @Override
121     public String getMieleID() {
122         return mieleID;
123     }
124
125     @Override
126     public String getChannelID() {
127         return channelID;
128     }
129
130     @Override
131     public boolean isProperty() {
132         return isProperty;
133     }
134
135     @Override
136     public boolean isExtendedState() {
137         return false;
138     }
139
140     @Override
141     public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
142         return this.getState(s, dmd);
143     }
144
145     @Override
146     public State getState(String s, DeviceMetaData dmd) {
147         if (dmd != null) {
148             String localizedValue = dmd.getMieleEnum(s);
149             if (localizedValue == null) {
150                 localizedValue = dmd.LocalizedValue;
151             }
152             if (localizedValue == null) {
153                 localizedValue = s;
154             }
155
156             return getState(localizedValue);
157         } else {
158             return getState(s);
159         }
160     }
161
162     public State getState(String s) {
163         try {
164             Method valueOf = typeClass.getMethod("valueOf", String.class);
165             State state = (State) valueOf.invoke(typeClass, s);
166             if (state != null) {
167                 return state;
168             }
169         } catch (Exception e) {
170             logger.error("An exception occurred while converting '{}' into a State", s);
171         }
172
173         return null;
174     }
175
176     public State getTemperatureState(String s) {
177         try {
178             return DeviceUtil.getTemperatureState(s);
179         } catch (NumberFormatException e) {
180             logger.warn("An exception occurred while converting '{}' into a State", s);
181             return UnDefType.UNDEF;
182         }
183     }
184 }