]> git.basschouten.com Git - openhab-addons.git/blob
7866c2e806118a6eb3641ea617e29d40284ffd96
[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 java.util.Map.entry;
16 import static org.openhab.binding.miele.internal.MieleBindingConstants.*;
17
18 import java.lang.reflect.Method;
19 import java.text.SimpleDateFormat;
20 import java.util.Date;
21 import java.util.Map;
22 import java.util.Map.Entry;
23 import java.util.TimeZone;
24
25 import org.openhab.binding.miele.internal.ExtendedDeviceStateUtil;
26 import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData;
27 import org.openhab.core.library.types.DateTimeType;
28 import org.openhab.core.library.types.DecimalType;
29 import org.openhab.core.library.types.OnOffType;
30 import org.openhab.core.library.types.OpenClosedType;
31 import org.openhab.core.library.types.QuantityType;
32 import org.openhab.core.library.types.StringType;
33 import org.openhab.core.types.State;
34 import org.openhab.core.types.Type;
35 import org.openhab.core.types.UnDefType;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
38
39 import com.google.gson.JsonElement;
40
41 /**
42  * The {@link ApplianceChannelSelector} for ovens
43  *
44  * @author Karel Goderis - Initial contribution
45  * @author Kai Kreuzer - Changed START_TIME to DateTimeType
46  * @author Jacob Laursen - Added UoM for temperatures, raw channels
47  */
48 public enum OvenChannelSelector implements ApplianceChannelSelector {
49
50     PRODUCT_TYPE("productTypeId", "productType", StringType.class, true),
51     DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true),
52     BRAND_ID("brandId", "brandId", StringType.class, true),
53     COMPANY_ID("companyId", "companyId", StringType.class, true),
54     STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false),
55     STATE(null, STATE_CHANNEL_ID, DecimalType.class, false),
56     PROGRAM_TEXT(PROGRAM_ID_PROPERTY_NAME, PROGRAM_TEXT_CHANNEL_ID, StringType.class, false),
57     PROGRAM(null, PROGRAM_CHANNEL_ID, DecimalType.class, false),
58     PROGRAMTYPE("programType", "type", StringType.class, false),
59     PROGRAM_PHASE_TEXT(PHASE_PROPERTY_NAME, PHASE_TEXT_CHANNEL_ID, StringType.class, false) {
60         @Override
61         public State getState(String s, DeviceMetaData dmd) {
62             State state = getTextState(s, dmd, phases, MISSING_PHASE_TEXT_PREFIX);
63             if (state != null) {
64                 return state;
65             }
66             return super.getState(s, dmd);
67         }
68     },
69     PROGRAM_PHASE(RAW_PHASE_PROPERTY_NAME, PHASE_CHANNEL_ID, DecimalType.class, false),
70     START_TIME("startTime", "start", DateTimeType.class, false) {
71         @Override
72         public State getState(String s, DeviceMetaData dmd) {
73             Date date = new Date();
74             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
75             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
76             try {
77                 date.setTime(Long.valueOf(s) * 60000);
78             } catch (Exception e) {
79                 date.setTime(0);
80             }
81             return getState(dateFormatter.format(date));
82         }
83     },
84     DURATION("duration", "duration", DateTimeType.class, false) {
85         @Override
86         public State getState(String s, DeviceMetaData dmd) {
87             Date date = new Date();
88             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
89             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
90             try {
91                 date.setTime(Long.valueOf(s) * 60000);
92             } catch (Exception e) {
93                 date.setTime(0);
94             }
95             return getState(dateFormatter.format(date));
96         }
97     },
98     ELAPSED_TIME("elapsedTime", "elapsed", DateTimeType.class, false) {
99         @Override
100         public State getState(String s, DeviceMetaData dmd) {
101             Date date = new Date();
102             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
103             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
104             try {
105                 date.setTime(Long.valueOf(s) * 60000);
106             } catch (Exception e) {
107                 date.setTime(0);
108             }
109             return getState(dateFormatter.format(date));
110         }
111     },
112     FINISH_TIME("finishTime", "finish", DateTimeType.class, false) {
113         @Override
114         public State getState(String s, DeviceMetaData dmd) {
115             Date date = new Date();
116             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
117             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
118             try {
119                 date.setTime(Long.valueOf(s) * 60000);
120             } catch (Exception e) {
121                 date.setTime(0);
122             }
123             return getState(dateFormatter.format(date));
124         }
125     },
126     TARGET_TEMP("targetTemperature", "target", QuantityType.class, false) {
127         @Override
128         public State getState(String s, DeviceMetaData dmd) {
129             return getTemperatureState(s);
130         }
131     },
132     MEASURED_TEMP("measuredTemperature", "measured", QuantityType.class, false) {
133         @Override
134         public State getState(String s, DeviceMetaData dmd) {
135             return getTemperatureState(s);
136         }
137     },
138     DEVICE_TEMP_ONE("deviceTemperature1", "temp1", QuantityType.class, false) {
139         @Override
140         public State getState(String s, DeviceMetaData dmd) {
141             return getTemperatureState(s);
142         }
143     },
144     DEVICE_TEMP_TWO("deviceTemperature2", "temp2", QuantityType.class, false) {
145         @Override
146         public State getState(String s, DeviceMetaData dmd) {
147             return getTemperatureState(s);
148         }
149     },
150     DOOR("signalDoor", "door", OpenClosedType.class, false) {
151         @Override
152
153         public State getState(String s, DeviceMetaData dmd) {
154             if ("true".equals(s)) {
155                 return getState("OPEN");
156             }
157
158             if ("false".equals(s)) {
159                 return getState("CLOSED");
160             }
161
162             return UnDefType.UNDEF;
163         }
164     },
165     STOP(null, "stop", OnOffType.class, false),
166     SWITCH(null, "switch", OnOffType.class, false);
167
168     private final Logger logger = LoggerFactory.getLogger(OvenChannelSelector.class);
169
170     private final static Map<String, String> phases = Map.ofEntries(entry("1", "Heating"), entry("2", "Temp. hold"),
171             entry("3", "Door Open"), entry("4", "Pyrolysis"), entry("7", "Lighting"), entry("8", "Searing phase"),
172             entry("10", "Defrost"), entry("11", "Cooling down"), entry("12", "Energy save phase"));
173
174     private final String mieleID;
175     private final String channelID;
176     private final Class<? extends Type> typeClass;
177     private final boolean isProperty;
178
179     OvenChannelSelector(String propertyID, String channelID, Class<? extends Type> typeClass, boolean isProperty) {
180         this.mieleID = propertyID;
181         this.channelID = channelID;
182         this.typeClass = typeClass;
183         this.isProperty = isProperty;
184     }
185
186     @Override
187     public String toString() {
188         return mieleID;
189     }
190
191     @Override
192     public String getMieleID() {
193         return mieleID;
194     }
195
196     @Override
197     public String getChannelID() {
198         return channelID;
199     }
200
201     @Override
202     public boolean isProperty() {
203         return isProperty;
204     }
205
206     @Override
207     public boolean isExtendedState() {
208         return false;
209     }
210
211     @Override
212     public State getState(String s, DeviceMetaData dmd) {
213         if (dmd != null) {
214             String localizedValue = getMieleEnum(s, dmd);
215             if (localizedValue == null) {
216                 localizedValue = dmd.LocalizedValue;
217             }
218             if (localizedValue == null) {
219                 localizedValue = s;
220             }
221
222             return getState(localizedValue);
223         } else {
224             return getState(s);
225         }
226     }
227
228     public State getState(String s) {
229         try {
230             Method valueOf = typeClass.getMethod("valueOf", String.class);
231             State state = (State) valueOf.invoke(typeClass, s);
232             if (state != null) {
233                 return state;
234             }
235         } catch (Exception e) {
236             logger.error("An exception occurred while converting '{}' into a State", s);
237         }
238
239         return null;
240     }
241
242     public State getTemperatureState(String s) {
243         try {
244             return ExtendedDeviceStateUtil.getTemperatureState(s);
245         } catch (NumberFormatException e) {
246             logger.warn("An exception occurred while converting '{}' into a State", s);
247             return UnDefType.UNDEF;
248         }
249     }
250
251     public State getTextState(String s, DeviceMetaData dmd, Map<String, String> valueMap, String prefix) {
252         if ("0".equals(s)) {
253             return UnDefType.UNDEF;
254         }
255
256         if (dmd == null || dmd.LocalizedValue == null || dmd.LocalizedValue.startsWith(prefix)) {
257             String text = valueMap.get(s);
258             if (text != null) {
259                 return getState(text);
260             }
261             if (dmd == null || dmd.LocalizedValue == null) {
262                 return getState(prefix + s);
263             }
264         }
265
266         return null;
267     }
268
269     public String getMieleEnum(String s, DeviceMetaData dmd) {
270         if (dmd.MieleEnum != null) {
271             for (Entry<String, JsonElement> enumEntry : dmd.MieleEnum.entrySet()) {
272                 if (enumEntry.getValue().getAsString().trim().equals(s.trim())) {
273                     return enumEntry.getKey();
274                 }
275             }
276         }
277
278         return null;
279     }
280 }