]> git.basschouten.com Git - openhab-addons.git/blob
2461d627d89274528e0a3cfa139298bab044ca68
[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 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.openhab.binding.miele.internal.DeviceMetaData;
25 import org.openhab.binding.miele.internal.DeviceUtil;
26 import org.openhab.binding.miele.internal.MieleTranslationProvider;
27 import org.openhab.core.library.types.DateTimeType;
28 import org.openhab.core.library.types.DecimalType;
29 import org.openhab.core.library.types.OnOffType;
30 import org.openhab.core.library.types.OpenClosedType;
31 import org.openhab.core.library.types.QuantityType;
32 import org.openhab.core.library.types.StringType;
33 import org.openhab.core.types.State;
34 import org.openhab.core.types.Type;
35 import org.openhab.core.types.UnDefType;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
38
39 /**
40  * The {@link ApplianceChannelSelector} for washing machines
41  *
42  * @author Karel Goderis - Initial contribution
43  * @author Kai Kreuzer - Changed START_TIME to DateTimeType
44  * @author Jacob Laursen - Added power/water consumption channels, UoM for temperatures, raw channels
45  */
46 public enum WashingMachineChannelSelector implements ApplianceChannelSelector {
47
48     PRODUCT_TYPE("productTypeId", "productType", StringType.class, true, false),
49     DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true, false),
50     STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false, false) {
51         @Override
52         public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
53             State state = DeviceUtil.getStateTextState(s, dmd, translationProvider);
54             if (state != null) {
55                 return state;
56             }
57             return super.getState(s, dmd, translationProvider);
58         }
59     },
60     STATE(null, 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, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
64             State state = DeviceUtil.getTextState(s, dmd, translationProvider, programs, MISSING_PROGRAM_TEXT_PREFIX,
65                     MIELE_WASHING_MACHINE_TEXT_PREFIX);
66             if (state != null) {
67                 return state;
68             }
69             return super.getState(s, dmd, translationProvider);
70         }
71     },
72     PROGRAM(null, PROGRAM_CHANNEL_ID, DecimalType.class, false, false),
73     PROGRAMTYPE("programType", "type", StringType.class, false, false),
74     PROGRAM_PHASE_TEXT(PHASE_PROPERTY_NAME, PHASE_TEXT_CHANNEL_ID, StringType.class, false, false) {
75         @Override
76         public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
77             State state = DeviceUtil.getTextState(s, dmd, translationProvider, phases, MISSING_PHASE_TEXT_PREFIX,
78                     MIELE_WASHING_MACHINE_TEXT_PREFIX);
79             if (state != null) {
80                 return state;
81             }
82             return super.getState(s, dmd, translationProvider);
83         }
84     },
85     PROGRAM_PHASE(RAW_PHASE_PROPERTY_NAME, PHASE_CHANNEL_ID, DecimalType.class, false, false),
86     START_TIME("startTime", "start", DateTimeType.class, false, false) {
87         @Override
88         public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
89             Date date = new Date();
90             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
91             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
92             try {
93                 date.setTime(Long.valueOf(s) * 60000);
94             } catch (Exception e) {
95                 date.setTime(0);
96             }
97             return getState(dateFormatter.format(date));
98         }
99     },
100     DURATION("duration", "duration", DateTimeType.class, false, false) {
101         @Override
102         public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
103             Date date = new Date();
104             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
105             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
106             try {
107                 date.setTime(Long.valueOf(s.trim()) * 60000);
108             } catch (Exception e) {
109                 date.setTime(0);
110             }
111             return getState(dateFormatter.format(date));
112         }
113     },
114     ELAPSED_TIME("elapsedTime", "elapsed", DateTimeType.class, false, false) {
115         @Override
116         public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
117             Date date = new Date();
118             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
119             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
120             try {
121                 date.setTime(Long.valueOf(s) * 60000);
122             } catch (Exception e) {
123                 date.setTime(0);
124             }
125             return getState(dateFormatter.format(date));
126         }
127     },
128     FINISH_TIME("finishTime", "finish", DateTimeType.class, false, false) {
129         @Override
130         public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
131             Date date = new Date();
132             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
133             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
134             try {
135                 date.setTime(Long.valueOf(s) * 60000);
136             } catch (Exception e) {
137                 date.setTime(0);
138             }
139             return getState(dateFormatter.format(date));
140         }
141     },
142     TARGET_TEMP("targetTemperature", "target", QuantityType.class, false, false) {
143         @Override
144         public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
145             return getTemperatureState(s);
146         }
147     },
148     SPINNING_SPEED("spinningSpeed", "spinningspeed", StringType.class, false, false) {
149         @Override
150         public State getState(String s, DeviceMetaData dmd, 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
163         public State getState(String s, DeviceMetaData dmd, 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(null, "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, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
238         return this.getState(s, dmd);
239     }
240
241     @Override
242     public State getState(String s, DeviceMetaData dmd) {
243         if (dmd != null) {
244             String localizedValue = dmd.getMieleEnum(s);
245             if (localizedValue == null) {
246                 localizedValue = dmd.LocalizedValue;
247             }
248             if (localizedValue == null) {
249                 localizedValue = s;
250             }
251
252             return getState(localizedValue);
253         } else {
254             return getState(s);
255         }
256     }
257
258     public State getState(String s) {
259         try {
260             Method valueOf = typeClass.getMethod("valueOf", String.class);
261             State state = (State) valueOf.invoke(typeClass, s);
262             if (state != null) {
263                 return state;
264             }
265         } catch (Exception e) {
266             logger.error("An exception occurred while converting '{}' into a State", s);
267         }
268
269         return null;
270     }
271
272     public State getTemperatureState(String s) {
273         try {
274             return DeviceUtil.getTemperatureState(s);
275         } catch (NumberFormatException e) {
276             logger.warn("An exception occurred while converting '{}' into a State", s);
277             return UnDefType.UNDEF;
278         }
279     }
280 }