]> git.basschouten.com Git - openhab-addons.git/blob
bd22781dcbfe066ea1a6c2c4effa9e20982cfe59
[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 washing machines
43  *
44  * @author Karel Goderis - Initial contribution
45  * @author Kai Kreuzer - Changed START_TIME to DateTimeType
46  * @author Jacob Laursen - Added power/water consumption channels, UoM for temperatures, raw channels
47  */
48 @NonNullByDefault
49 public enum WashingMachineChannelSelector implements ApplianceChannelSelector {
50
51     PRODUCT_TYPE("productTypeId", "productType", StringType.class, true, false),
52     DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true, false),
53     STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false, 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, false),
61     PROGRAM_TEXT(PROGRAM_ID_PROPERTY_NAME, PROGRAM_TEXT_CHANNEL_ID, StringType.class, false, false) {
62         @Override
63         public State getState(String s, @Nullable DeviceMetaData dmd,
64                 @Nullable MieleTranslationProvider translationProvider) {
65             return DeviceUtil.getTextState(s, dmd, translationProvider, PROGRAMS, MISSING_PROGRAM_TEXT_PREFIX,
66                     MIELE_WASHING_MACHINE_TEXT_PREFIX);
67         }
68     },
69     PROGRAM("", PROGRAM_CHANNEL_ID, DecimalType.class, false, false),
70     PROGRAMTYPE("programType", "type", StringType.class, false, false),
71     PROGRAM_PHASE_TEXT(PHASE_PROPERTY_NAME, PHASE_TEXT_CHANNEL_ID, StringType.class, false, false) {
72         @Override
73         public State getState(String s, @Nullable DeviceMetaData dmd,
74                 @Nullable MieleTranslationProvider translationProvider) {
75             return DeviceUtil.getTextState(s, dmd, translationProvider, PHASES, MISSING_PHASE_TEXT_PREFIX,
76                     MIELE_WASHING_MACHINE_TEXT_PREFIX);
77         }
78     },
79     PROGRAM_PHASE(RAW_PHASE_PROPERTY_NAME, PHASE_CHANNEL_ID, DecimalType.class, false, false),
80     START_TIME("startTime", "start", DateTimeType.class, false, false) {
81         @Override
82         public State getState(String s, @Nullable DeviceMetaData dmd,
83                 @Nullable MieleTranslationProvider translationProvider) {
84             Date date = new Date();
85             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
86             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
87             try {
88                 date.setTime(Long.valueOf(s) * 60000);
89             } catch (Exception e) {
90                 date.setTime(0);
91             }
92             return getState(dateFormatter.format(date));
93         }
94     },
95     DURATION("duration", "duration", DateTimeType.class, false, false) {
96         @Override
97         public State getState(String s, @Nullable DeviceMetaData dmd,
98                 @Nullable MieleTranslationProvider translationProvider) {
99             Date date = new Date();
100             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
101             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
102             try {
103                 date.setTime(Long.valueOf(s.trim()) * 60000);
104             } catch (Exception e) {
105                 date.setTime(0);
106             }
107             return getState(dateFormatter.format(date));
108         }
109     },
110     ELAPSED_TIME("elapsedTime", "elapsed", DateTimeType.class, false, false) {
111         @Override
112         public State getState(String s, @Nullable DeviceMetaData dmd,
113                 @Nullable MieleTranslationProvider translationProvider) {
114             Date date = new Date();
115             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
116             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
117             try {
118                 date.setTime(Long.valueOf(s) * 60000);
119             } catch (Exception e) {
120                 date.setTime(0);
121             }
122             return getState(dateFormatter.format(date));
123         }
124     },
125     FINISH_TIME("finishTime", "finish", DateTimeType.class, false, false) {
126         @Override
127         public State getState(String s, @Nullable DeviceMetaData dmd,
128                 @Nullable MieleTranslationProvider translationProvider) {
129             Date date = new Date();
130             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
131             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
132             try {
133                 date.setTime(Long.valueOf(s) * 60000);
134             } catch (Exception e) {
135                 date.setTime(0);
136             }
137             return getState(dateFormatter.format(date));
138         }
139     },
140     TARGET_TEMP("targetTemperature", "target", QuantityType.class, false, false) {
141         @Override
142         public State getState(String s, @Nullable DeviceMetaData dmd,
143                 @Nullable MieleTranslationProvider translationProvider) {
144             return getTemperatureState(s);
145         }
146     },
147     SPINNING_SPEED("spinningSpeed", "spinningspeed", StringType.class, false, false) {
148         @Override
149         public State getState(String s, @Nullable DeviceMetaData dmd,
150                 @Nullable MieleTranslationProvider translationProvider) {
151             if ("0".equals(s)) {
152                 return getState("Without spinning");
153             }
154             if ("256".equals(s)) {
155                 return getState("Rinsing");
156             }
157             return getState(Integer.toString((Integer.valueOf(s))));
158         }
159     },
160     DOOR("signalDoor", "door", OpenClosedType.class, false, false) {
161         @Override
162         public State getState(String s, @Nullable DeviceMetaData dmd,
163                 @Nullable MieleTranslationProvider translationProvider) {
164             if ("true".equals(s)) {
165                 return getState("OPEN");
166             }
167
168             if ("false".equals(s)) {
169                 return getState("CLOSED");
170             }
171
172             return UnDefType.UNDEF;
173         }
174     },
175     SWITCH("", "switch", OnOffType.class, false, false),
176     POWER_CONSUMPTION(EXTENDED_DEVICE_STATE_PROPERTY_NAME, POWER_CONSUMPTION_CHANNEL_ID, QuantityType.class, false,
177             true),
178     WATER_CONSUMPTION(EXTENDED_DEVICE_STATE_PROPERTY_NAME, WATER_CONSUMPTION_CHANNEL_ID, QuantityType.class, false,
179             true);
180
181     private final Logger logger = LoggerFactory.getLogger(WashingMachineChannelSelector.class);
182
183     private static final Map<String, String> PROGRAMS = Map.ofEntries(entry("1", "cottons"), entry("3", "minimum-iron"),
184             entry("4", "delicates"), entry("8", "woollens"), entry("9", "silks"), entry("17", "starch"),
185             entry("18", "rinse"), entry("21", "drain-spin"), entry("22", "curtains"), entry("23", "shirts"),
186             entry("24", "denim"), entry("27", "proofing"), entry("29", "sportswear"), entry("31", "automatic-plus"),
187             entry("37", "outerwear"), entry("39", "pillows"), entry("50", "dark-garments"), entry("53", "first-wash"),
188             entry("75", "steam-care"), entry("76", "freshen-up"), entry("91", "maintenance-wash"),
189             entry("95", "down-duvets"), entry("122", "express-20"), entry("129", "down-filled-items"),
190             entry("133", "cottons-eco"), entry("146", "quickpowerwash"), entry("65532", "mix"));
191
192     private static final Map<String, String> PHASES = Map.ofEntries(entry("1", "pre-wash"), entry("4", "washing"),
193             entry("5", "rinses"), entry("7", "clean"), entry("9", "drain"), entry("10", "spin"),
194             entry("11", "anti-crease"), entry("12", "finished"));
195
196     private final String mieleID;
197     private final String channelID;
198     private final Class<? extends Type> typeClass;
199     private final boolean isProperty;
200     private final boolean isExtendedState;
201
202     WashingMachineChannelSelector(String propertyID, String channelID, Class<? extends Type> typeClass,
203             boolean isProperty, boolean isExtendedState) {
204         this.mieleID = propertyID;
205         this.channelID = channelID;
206         this.typeClass = typeClass;
207         this.isProperty = isProperty;
208         this.isExtendedState = isExtendedState;
209     }
210
211     @Override
212     public String toString() {
213         return mieleID;
214     }
215
216     @Override
217     public String getMieleID() {
218         return mieleID;
219     }
220
221     @Override
222     public String getChannelID() {
223         return channelID;
224     }
225
226     @Override
227     public boolean isProperty() {
228         return isProperty;
229     }
230
231     @Override
232     public boolean isExtendedState() {
233         return isExtendedState;
234     }
235
236     @Override
237     public State getState(String s, @Nullable DeviceMetaData dmd,
238             @Nullable MieleTranslationProvider translationProvider) {
239         return this.getState(s, dmd);
240     }
241
242     @Override
243     public State getState(String s, @Nullable DeviceMetaData dmd) {
244         if (dmd != null) {
245             String localizedValue = dmd.getMieleEnum(s);
246             if (localizedValue == null) {
247                 localizedValue = dmd.LocalizedValue;
248             }
249             if (localizedValue == null) {
250                 localizedValue = s;
251             }
252
253             return getState(localizedValue);
254         } else {
255             return getState(s);
256         }
257     }
258
259     public State getState(String s) {
260         try {
261             Method valueOf = typeClass.getMethod("valueOf", String.class);
262             State state = (State) valueOf.invoke(typeClass, s);
263             if (state != null) {
264                 return state;
265             }
266         } catch (Exception e) {
267             logger.error("An exception occurred while converting '{}' into a State", s);
268         }
269
270         return UnDefType.UNDEF;
271     }
272
273     public State getTemperatureState(String s) {
274         try {
275             return DeviceUtil.getTemperatureState(s);
276         } catch (NumberFormatException e) {
277             logger.warn("An exception occurred while converting '{}' into a State", s);
278             return UnDefType.UNDEF;
279         }
280     }
281 }