]> git.basschouten.com Git - openhab-addons.git/blob
9824301274129cf3d58613d80960ee2f2121e484
[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         public State getState(String s, @Nullable DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
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("", "stop", OnOffType.class, false),
166     SWITCH("", "switch", OnOffType.class, false);
167
168     private final Logger logger = LoggerFactory.getLogger(OvenChannelSelector.class);
169
170     private static final 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, @Nullable DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
213         return this.getState(s, dmd);
214     }
215
216     @Override
217     public State getState(String s, @Nullable DeviceMetaData dmd) {
218         if (dmd != null) {
219             String localizedValue = dmd.getMieleEnum(s);
220             if (localizedValue == null) {
221                 localizedValue = dmd.LocalizedValue;
222             }
223             if (localizedValue == null) {
224                 localizedValue = s;
225             }
226
227             return getState(localizedValue);
228         } else {
229             return getState(s);
230         }
231     }
232
233     public State getState(String s) {
234         try {
235             Method valueOf = typeClass.getMethod("valueOf", String.class);
236             State state = (State) valueOf.invoke(typeClass, s);
237             if (state != null) {
238                 return state;
239             }
240         } catch (Exception e) {
241             logger.warn("An exception occurred while converting '{}' into a State", s);
242         }
243
244         return UnDefType.UNDEF;
245     }
246
247     public State getTemperatureState(String s) {
248         try {
249             return DeviceUtil.getTemperatureState(s);
250         } catch (NumberFormatException e) {
251             logger.warn("An exception occurred while converting '{}' into a State", s);
252             return UnDefType.UNDEF;
253         }
254     }
255 }