]> git.basschouten.com Git - openhab-addons.git/blob
01a068b2b5ded3fb39afaaef4d717938c183877b
[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 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.TimeZone;
23
24 import org.eclipse.jdt.annotation.NonNullByDefault;
25 import org.eclipse.jdt.annotation.Nullable;
26 import org.openhab.binding.miele.internal.DeviceUtil;
27 import org.openhab.binding.miele.internal.MieleTranslationProvider;
28 import org.openhab.binding.miele.internal.api.dto.DeviceMetaData;
29 import org.openhab.core.library.types.DateTimeType;
30 import org.openhab.core.library.types.DecimalType;
31 import org.openhab.core.library.types.OnOffType;
32 import org.openhab.core.library.types.OpenClosedType;
33 import org.openhab.core.library.types.QuantityType;
34 import org.openhab.core.library.types.StringType;
35 import org.openhab.core.types.State;
36 import org.openhab.core.types.Type;
37 import org.openhab.core.types.UnDefType;
38 import org.slf4j.Logger;
39 import org.slf4j.LoggerFactory;
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 @NonNullByDefault
49 public enum OvenChannelSelector implements ApplianceChannelSelector {
50
51     PRODUCT_TYPE("productTypeId", "productType", StringType.class, true),
52     DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true),
53     STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false) {
54         @Override
55         public State getState(String s, @Nullable DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
56             return DeviceUtil.getStateTextState(s, dmd, translationProvider);
57         }
58     },
59     STATE("", STATE_CHANNEL_ID, DecimalType.class, false),
60     PROGRAM_TEXT(PROGRAM_ID_PROPERTY_NAME, PROGRAM_TEXT_CHANNEL_ID, StringType.class, false),
61     PROGRAM("", PROGRAM_CHANNEL_ID, DecimalType.class, false),
62     PROGRAMTYPE("programType", "type", StringType.class, false),
63     PROGRAM_PHASE_TEXT(PHASE_PROPERTY_NAME, PHASE_TEXT_CHANNEL_ID, StringType.class, false) {
64         @Override
65         public State getState(String s, @Nullable DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
66             return DeviceUtil.getTextState(s, dmd, translationProvider, PHASES, MISSING_PHASE_TEXT_PREFIX,
67                     MIELE_OVEN_TEXT_PREFIX);
68         }
69     },
70     PROGRAM_PHASE(RAW_PHASE_PROPERTY_NAME, PHASE_CHANNEL_ID, DecimalType.class, false),
71     START_TIME("startTime", "start", DateTimeType.class, false) {
72         @Override
73         public State getState(String s, @Nullable DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
74             Date date = new Date();
75             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
76             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
77             try {
78                 date.setTime(Long.valueOf(s) * 60000);
79             } catch (Exception e) {
80                 date.setTime(0);
81             }
82             return getState(dateFormatter.format(date));
83         }
84     },
85     DURATION("duration", "duration", DateTimeType.class, false) {
86         @Override
87         public State getState(String s, @Nullable DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
88             Date date = new Date();
89             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
90             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
91             try {
92                 date.setTime(Long.valueOf(s) * 60000);
93             } catch (Exception e) {
94                 date.setTime(0);
95             }
96             return getState(dateFormatter.format(date));
97         }
98     },
99     ELAPSED_TIME("elapsedTime", "elapsed", DateTimeType.class, false) {
100         @Override
101         public State getState(String s, @Nullable DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
102             Date date = new Date();
103             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
104             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
105             try {
106                 date.setTime(Long.valueOf(s) * 60000);
107             } catch (Exception e) {
108                 date.setTime(0);
109             }
110             return getState(dateFormatter.format(date));
111         }
112     },
113     FINISH_TIME("finishTime", "finish", DateTimeType.class, false) {
114         @Override
115         public State getState(String s, @Nullable DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
116             Date date = new Date();
117             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
118             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
119             try {
120                 date.setTime(Long.valueOf(s) * 60000);
121             } catch (Exception e) {
122                 date.setTime(0);
123             }
124             return getState(dateFormatter.format(date));
125         }
126     },
127     TARGET_TEMP("targetTemperature", "target", QuantityType.class, false) {
128         @Override
129         public State getState(String s, @Nullable DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
130             return getTemperatureState(s);
131         }
132     },
133     MEASURED_TEMP("measuredTemperature", "measured", QuantityType.class, false) {
134         @Override
135         public State getState(String s, @Nullable DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
136             return getTemperatureState(s);
137         }
138     },
139     DEVICE_TEMP_ONE("deviceTemperature1", "temp1", QuantityType.class, false) {
140         @Override
141         public State getState(String s, @Nullable DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
142             return getTemperatureState(s);
143         }
144     },
145     DEVICE_TEMP_TWO("deviceTemperature2", "temp2", QuantityType.class, false) {
146         @Override
147         public State getState(String s, @Nullable DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
148             return getTemperatureState(s);
149         }
150     },
151     DOOR("signalDoor", "door", OpenClosedType.class, false) {
152         @Override
153
154         public State getState(String s, @Nullable DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
155             if ("true".equals(s)) {
156                 return getState("OPEN");
157             }
158
159             if ("false".equals(s)) {
160                 return getState("CLOSED");
161             }
162
163             return UnDefType.UNDEF;
164         }
165     },
166     STOP("", "stop", OnOffType.class, false),
167     SWITCH("", "switch", OnOffType.class, false);
168
169     private final Logger logger = LoggerFactory.getLogger(OvenChannelSelector.class);
170
171     private static final Map<String, String> PHASES = Map.ofEntries(entry("1", "heating"), entry("2", "temp-hold"),
172             entry("3", "door-open"), entry("4", "pyrolysis"), entry("7", "lighting"), entry("8", "searing-phase"),
173             entry("10", "defrost"), entry("11", "cooling-down"), entry("12", "energy-save-phase"));
174
175     private final String mieleID;
176     private final String channelID;
177     private final Class<? extends Type> typeClass;
178     private final boolean isProperty;
179
180     OvenChannelSelector(String propertyID, String channelID, Class<? extends Type> typeClass, boolean isProperty) {
181         this.mieleID = propertyID;
182         this.channelID = channelID;
183         this.typeClass = typeClass;
184         this.isProperty = isProperty;
185     }
186
187     @Override
188     public String toString() {
189         return mieleID;
190     }
191
192     @Override
193     public String getMieleID() {
194         return mieleID;
195     }
196
197     @Override
198     public String getChannelID() {
199         return channelID;
200     }
201
202     @Override
203     public boolean isProperty() {
204         return isProperty;
205     }
206
207     @Override
208     public boolean isExtendedState() {
209         return false;
210     }
211
212     @Override
213     public State getState(String s, @Nullable DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
214         return this.getState(s, dmd);
215     }
216
217     @Override
218     public State getState(String s, @Nullable DeviceMetaData dmd) {
219         if (dmd != null) {
220             String localizedValue = dmd.getMieleEnum(s);
221             if (localizedValue == null) {
222                 localizedValue = dmd.LocalizedValue;
223             }
224             if (localizedValue == null) {
225                 localizedValue = s;
226             }
227
228             return getState(localizedValue);
229         } else {
230             return getState(s);
231         }
232     }
233
234     public State getState(String s) {
235         try {
236             Method valueOf = typeClass.getMethod("valueOf", String.class);
237             State state = (State) valueOf.invoke(typeClass, s);
238             if (state != null) {
239                 return state;
240             }
241         } catch (Exception e) {
242             logger.warn("An exception occurred while converting '{}' into a State", s);
243         }
244
245         return UnDefType.UNDEF;
246     }
247
248     public State getTemperatureState(String s) {
249         try {
250             return DeviceUtil.getTemperatureState(s);
251         } catch (NumberFormatException e) {
252             logger.warn("An exception occurred while converting '{}' into a State", s);
253             return UnDefType.UNDEF;
254         }
255     }
256 }