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