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