]> git.basschouten.com Git - openhab-addons.git/blob
bde826e8e95e58de8efbbe288245879e351167d8
[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.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 dishwashers
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, raw channels
45  */
46 public enum DishwasherChannelSelector 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_DISHWASHER_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     PROGRAM_PHASE_TEXT(PHASE_PROPERTY_NAME, PHASE_TEXT_CHANNEL_ID, StringType.class, false, false) {
74         @Override
75         public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
76             State state = DeviceUtil.getTextState(s, dmd, translationProvider, phases, MISSING_PHASE_TEXT_PREFIX,
77                     MIELE_DISHWASHER_TEXT_PREFIX);
78             if (state != null) {
79                 return state;
80             }
81             return super.getState(s, dmd, translationProvider);
82         }
83     },
84     PROGRAM_PHASE(RAW_PHASE_PROPERTY_NAME, PHASE_CHANNEL_ID, DecimalType.class, false, false),
85     START_TIME("startTime", "start", DateTimeType.class, false, false) {
86         @Override
87         public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
88             Date date = new Date();
89             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
90             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
91             try {
92                 date.setTime(Long.valueOf(s) * 60000);
93             } catch (Exception e) {
94                 date.setTime(0);
95             }
96             return getState(dateFormatter.format(date));
97         }
98     },
99     DURATION("duration", "duration", DateTimeType.class, false, false) {
100         @Override
101         public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
102             Date date = new Date();
103             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
104             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
105             try {
106                 date.setTime(Long.valueOf(s) * 60000);
107             } catch (Exception e) {
108                 date.setTime(0);
109             }
110             return getState(dateFormatter.format(date));
111         }
112     },
113     ELAPSED_TIME("elapsedTime", "elapsed", DateTimeType.class, false, false) {
114         @Override
115         public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
116             Date date = new Date();
117             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
118             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
119             try {
120                 date.setTime(Long.valueOf(s) * 60000);
121             } catch (Exception e) {
122                 date.setTime(0);
123             }
124             return getState(dateFormatter.format(date));
125         }
126     },
127     FINISH_TIME("finishTime", "finish", DateTimeType.class, false, false) {
128         @Override
129         public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
130             Date date = new Date();
131             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
132             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
133             try {
134                 date.setTime(Long.valueOf(s) * 60000);
135             } catch (Exception e) {
136                 date.setTime(0);
137             }
138             return getState(dateFormatter.format(date));
139         }
140     },
141     DOOR("signalDoor", "door", OpenClosedType.class, false, false) {
142         @Override
143         public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
144             if ("true".equals(s)) {
145                 return getState("OPEN");
146             }
147
148             if ("false".equals(s)) {
149                 return getState("CLOSED");
150             }
151
152             return UnDefType.UNDEF;
153         }
154     },
155     SWITCH(null, "switch", OnOffType.class, false, false),
156     POWER_CONSUMPTION(EXTENDED_DEVICE_STATE_PROPERTY_NAME, POWER_CONSUMPTION_CHANNEL_ID, QuantityType.class, false,
157             true),
158     WATER_CONSUMPTION(EXTENDED_DEVICE_STATE_PROPERTY_NAME, WATER_CONSUMPTION_CHANNEL_ID, QuantityType.class, false,
159             true);
160
161     private final Logger logger = LoggerFactory.getLogger(DishwasherChannelSelector.class);
162
163     private static final Map<String, String> programs = Map.ofEntries(entry("26", "intensive"),
164             entry("27", "maintenance-programme"), entry("28", "eco"), entry("30", "normal"), entry("32", "automatic"),
165             entry("34", "solarsave"), entry("35", "gentle"), entry("36", "extra-quiet"), entry("37", "hygiene"),
166             entry("38", "quickpowerwash"), entry("42", "tall-items"));
167
168     private static final Map<String, String> phases = Map.ofEntries(entry("2", "pre-wash"), entry("3", "main-wash"),
169             entry("4", "rinses"), entry("6", "final-rinse"), entry("7", "drying"), entry("8", "finished"));
170
171     private final String mieleID;
172     private final String channelID;
173     private final Class<? extends Type> typeClass;
174     private final boolean isProperty;
175     private final boolean isExtendedState;
176
177     DishwasherChannelSelector(String propertyID, String channelID, Class<? extends Type> typeClass, boolean isProperty,
178             boolean isExtendedState) {
179         this.mieleID = propertyID;
180         this.channelID = channelID;
181         this.typeClass = typeClass;
182         this.isProperty = isProperty;
183         this.isExtendedState = isExtendedState;
184     }
185
186     @Override
187     public String toString() {
188         return mieleID;
189     }
190
191     @Override
192     public String getMieleID() {
193         return mieleID;
194     }
195
196     @Override
197     public String getChannelID() {
198         return channelID;
199     }
200
201     @Override
202     public boolean isProperty() {
203         return isProperty;
204     }
205
206     @Override
207     public boolean isExtendedState() {
208         return isExtendedState;
209     }
210
211     @Override
212     public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
213         return this.getState(s, dmd);
214     }
215
216     @Override
217     public State getState(String s, DeviceMetaData dmd) {
218         if (dmd != null) {
219             String localizedValue = dmd.getMieleEnum(s);
220             if (localizedValue == null) {
221                 localizedValue = dmd.LocalizedValue;
222             }
223             if (localizedValue == null) {
224                 localizedValue = s;
225             }
226
227             return getState(localizedValue);
228         } else {
229             return getState(s);
230         }
231     }
232
233     public State getState(String s) {
234         try {
235             Method valueOf = typeClass.getMethod("valueOf", String.class);
236             State state = (State) valueOf.invoke(typeClass, s);
237             if (state != null) {
238                 return state;
239             }
240         } catch (Exception e) {
241             logger.error("An exception occurred while converting '{}' into a State", s);
242         }
243
244         return null;
245     }
246 }