]> git.basschouten.com Git - openhab-addons.git/blob
998df2e9a8f30b8ae3e6ec222f8913ec275f84bb
[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("", START_CHANNEL_ID, DateTimeType.class, false),
72     END_TIME("", END_CHANNEL_ID, DateTimeType.class, false),
73     DURATION("duration", "duration", DateTimeType.class, false) {
74         @Override
75         public State getState(String s, @Nullable DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
76             Date date = new Date();
77             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
78             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
79             try {
80                 date.setTime(Long.valueOf(s) * 60000);
81             } catch (Exception e) {
82                 date.setTime(0);
83             }
84             return getState(dateFormatter.format(date));
85         }
86     },
87     ELAPSED_TIME("elapsedTime", "elapsed", DateTimeType.class, false) {
88         @Override
89         public State getState(String s, @Nullable DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
90             Date date = new Date();
91             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
92             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
93             try {
94                 date.setTime(Long.valueOf(s) * 60000);
95             } catch (Exception e) {
96                 date.setTime(0);
97             }
98             return getState(dateFormatter.format(date));
99         }
100     },
101     FINISH_TIME("", FINISH_CHANNEL_ID, DateTimeType.class, false),
102     TARGET_TEMP("targetTemperature", "target", QuantityType.class, false) {
103         @Override
104         public State getState(String s, @Nullable DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
105             return getTemperatureState(s);
106         }
107     },
108     MEASURED_TEMP("measuredTemperature", "measured", QuantityType.class, false) {
109         @Override
110         public State getState(String s, @Nullable DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
111             return getTemperatureState(s);
112         }
113     },
114     DEVICE_TEMP_ONE("deviceTemperature1", "temp1", QuantityType.class, false) {
115         @Override
116         public State getState(String s, @Nullable DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
117             return getTemperatureState(s);
118         }
119     },
120     DEVICE_TEMP_TWO("deviceTemperature2", "temp2", QuantityType.class, false) {
121         @Override
122         public State getState(String s, @Nullable DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
123             return getTemperatureState(s);
124         }
125     },
126     DOOR("signalDoor", "door", OpenClosedType.class, false) {
127         @Override
128         public State getState(String s, @Nullable DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
129             if ("true".equals(s)) {
130                 return getState("OPEN");
131             }
132
133             if ("false".equals(s)) {
134                 return getState("CLOSED");
135             }
136
137             return UnDefType.UNDEF;
138         }
139     },
140     STOP("", "stop", OnOffType.class, false),
141     SWITCH("", "switch", OnOffType.class, false);
142
143     private final Logger logger = LoggerFactory.getLogger(OvenChannelSelector.class);
144
145     private static final Map<String, String> PHASES = Map.ofEntries(entry("1", "heating"), entry("2", "temp-hold"),
146             entry("3", "door-open"), entry("4", "pyrolysis"), entry("7", "lighting"), entry("8", "searing-phase"),
147             entry("10", "defrost"), entry("11", "cooling-down"), entry("12", "energy-save-phase"));
148
149     private final String mieleID;
150     private final String channelID;
151     private final Class<? extends Type> typeClass;
152     private final boolean isProperty;
153
154     OvenChannelSelector(String propertyID, String channelID, Class<? extends Type> typeClass, boolean isProperty) {
155         this.mieleID = propertyID;
156         this.channelID = channelID;
157         this.typeClass = typeClass;
158         this.isProperty = isProperty;
159     }
160
161     @Override
162     public String toString() {
163         return mieleID;
164     }
165
166     @Override
167     public String getMieleID() {
168         return mieleID;
169     }
170
171     @Override
172     public String getChannelID() {
173         return channelID;
174     }
175
176     @Override
177     public boolean isProperty() {
178         return isProperty;
179     }
180
181     @Override
182     public boolean isExtendedState() {
183         return false;
184     }
185
186     @Override
187     public State getState(String s, @Nullable DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
188         return this.getState(s, dmd);
189     }
190
191     @Override
192     public State getState(String s, @Nullable DeviceMetaData dmd) {
193         if (dmd != null) {
194             String localizedValue = dmd.getMieleEnum(s);
195             if (localizedValue == null) {
196                 localizedValue = dmd.LocalizedValue;
197             }
198             if (localizedValue == null) {
199                 localizedValue = s;
200             }
201
202             return getState(localizedValue);
203         } else {
204             return getState(s);
205         }
206     }
207
208     public State getState(String s) {
209         try {
210             Method valueOf = typeClass.getMethod("valueOf", String.class);
211             State state = (State) valueOf.invoke(typeClass, s);
212             if (state != null) {
213                 return state;
214             }
215         } catch (Exception e) {
216             logger.warn("An exception occurred while converting '{}' into a State", s);
217         }
218
219         return UnDefType.UNDEF;
220     }
221
222     public State getTemperatureState(String s) {
223         try {
224             return DeviceUtil.getTemperatureState(s);
225         } catch (NumberFormatException e) {
226             logger.warn("An exception occurred while converting '{}' into a State", s);
227             return UnDefType.UNDEF;
228         }
229     }
230 }