]> git.basschouten.com Git - openhab-addons.git/blob
aee026482c1863aa57c9fd92d543803858c7bbda
[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 java.lang.reflect.Method;
16 import java.text.SimpleDateFormat;
17 import java.util.Date;
18 import java.util.Map.Entry;
19 import java.util.TimeZone;
20
21 import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData;
22 import org.openhab.core.library.types.DateTimeType;
23 import org.openhab.core.library.types.DecimalType;
24 import org.openhab.core.library.types.OnOffType;
25 import org.openhab.core.library.types.OpenClosedType;
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 import com.google.gson.JsonElement;
34
35 /**
36  * The {@link ApplianceChannelSelector} for ovens
37  *
38  * @author Karel Goderis - Initial contribution
39  * @author Kai Kreuzer - Changed START_TIME to DateTimeType
40  */
41 public enum OvenChannelSelector implements ApplianceChannelSelector {
42
43     PRODUCT_TYPE("productTypeId", "productType", StringType.class, true),
44     DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true),
45     BRAND_ID("brandId", "brandId", StringType.class, true),
46     COMPANY_ID("companyId", "companyId", StringType.class, true),
47     STATE("state", "state", StringType.class, false),
48     PROGRAMID("programId", "program", StringType.class, false),
49     PROGRAMPHASE("phase", "phase", StringType.class, false),
50     START_TIME("startTime", "start", DateTimeType.class, false) {
51         @Override
52         public State getState(String s, DeviceMetaData dmd) {
53             Date date = new Date();
54             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
55             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
56             try {
57                 date.setTime(Long.valueOf(s) * 60000);
58             } catch (Exception e) {
59                 date.setTime(0);
60             }
61             return getState(dateFormatter.format(date));
62         }
63     },
64     DURATION("duration", "duration", DateTimeType.class, false) {
65         @Override
66         public State getState(String s, DeviceMetaData dmd) {
67             Date date = new Date();
68             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
69             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
70             try {
71                 date.setTime(Long.valueOf(s) * 60000);
72             } catch (Exception e) {
73                 date.setTime(0);
74             }
75             return getState(dateFormatter.format(date));
76         }
77     },
78     ELAPSED_TIME("elapsedTime", "elapsed", DateTimeType.class, false) {
79         @Override
80         public State getState(String s, DeviceMetaData dmd) {
81             Date date = new Date();
82             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
83             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
84             try {
85                 date.setTime(Long.valueOf(s) * 60000);
86             } catch (Exception e) {
87                 date.setTime(0);
88             }
89             return getState(dateFormatter.format(date));
90         }
91     },
92     FINISH_TIME("finishTime", "finish", DateTimeType.class, false) {
93         @Override
94         public State getState(String s, DeviceMetaData dmd) {
95             Date date = new Date();
96             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
97             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
98             try {
99                 date.setTime(Long.valueOf(s) * 60000);
100             } catch (Exception e) {
101                 date.setTime(0);
102             }
103             return getState(dateFormatter.format(date));
104         }
105     },
106     TARGET_TEMP("targetTemperature", "target", DecimalType.class, false) {
107         @Override
108         public State getState(String s, DeviceMetaData dmd) {
109             return getState(s);
110         }
111     },
112     MEASURED_TEMP("measuredTemperature", "measured", DecimalType.class, false) {
113         @Override
114         public State getState(String s, DeviceMetaData dmd) {
115             return getState(s);
116         }
117     },
118     DEVICE_TEMP_ONE("deviceTemperature1", "temp1", DecimalType.class, false) {
119         @Override
120         public State getState(String s, DeviceMetaData dmd) {
121             return getState(s);
122         }
123     },
124     DEVICE_TEMP_TWO("deviceTemperature2", "temp2", DecimalType.class, false) {
125         @Override
126         public State getState(String s, DeviceMetaData dmd) {
127             return getState(s);
128         }
129     },
130     DOOR("signalDoor", "door", OpenClosedType.class, false) {
131         @Override
132
133         public State getState(String s, DeviceMetaData dmd) {
134             if ("true".equals(s)) {
135                 return getState("OPEN");
136             }
137
138             if ("false".equals(s)) {
139                 return getState("CLOSED");
140             }
141
142             return UnDefType.UNDEF;
143         }
144     },
145     STOP(null, "stop", OnOffType.class, false),
146     SWITCH(null, "switch", OnOffType.class, false);
147
148     private final Logger logger = LoggerFactory.getLogger(OvenChannelSelector.class);
149
150     private final String mieleID;
151     private final String channelID;
152     private final Class<? extends Type> typeClass;
153     private final boolean isProperty;
154
155     OvenChannelSelector(String propertyID, String channelID, Class<? extends Type> typeClass, boolean isProperty) {
156         this.mieleID = propertyID;
157         this.channelID = channelID;
158         this.typeClass = typeClass;
159         this.isProperty = isProperty;
160     }
161
162     @Override
163     public String toString() {
164         return mieleID;
165     }
166
167     @Override
168     public String getMieleID() {
169         return mieleID;
170     }
171
172     @Override
173     public String getChannelID() {
174         return channelID;
175     }
176
177     @Override
178     public Class<? extends Type> getTypeClass() {
179         return typeClass;
180     }
181
182     @Override
183     public boolean isProperty() {
184         return isProperty;
185     }
186
187     @Override
188     public State getState(String s, DeviceMetaData dmd) {
189         if (dmd != null) {
190             String localizedValue = getMieleEnum(s, dmd);
191             if (localizedValue == null) {
192                 localizedValue = dmd.LocalizedValue;
193             }
194             if (localizedValue == null) {
195                 localizedValue = s;
196             }
197
198             return getState(localizedValue);
199         } else {
200             return getState(s);
201         }
202     }
203
204     public State getState(String s) {
205         try {
206             Method valueOf = typeClass.getMethod("valueOf", String.class);
207             State state = (State) valueOf.invoke(typeClass, s);
208             if (state != null) {
209                 return state;
210             }
211         } catch (Exception e) {
212             logger.error("An exception occurred while converting '{}' into a State", s);
213         }
214
215         return null;
216     }
217
218     public String getMieleEnum(String s, DeviceMetaData dmd) {
219         if (dmd.MieleEnum != null) {
220             for (Entry<String, JsonElement> enumEntry : dmd.MieleEnum.entrySet()) {
221                 if (enumEntry.getValue().getAsString().trim().equals(s.trim())) {
222                     return enumEntry.getKey();
223                 }
224             }
225         }
226
227         return null;
228     }
229 }