]> git.basschouten.com Git - openhab-addons.git/blob
c00f7fac593f15b19de55c52f5d2afc6644a4504
[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.Map.Entry;
23 import java.util.TimeZone;
24
25 import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData;
26 import org.openhab.core.library.types.DateTimeType;
27 import org.openhab.core.library.types.DecimalType;
28 import org.openhab.core.library.types.OnOffType;
29 import org.openhab.core.library.types.OpenClosedType;
30 import org.openhab.core.library.types.QuantityType;
31 import org.openhab.core.library.types.StringType;
32 import org.openhab.core.types.State;
33 import org.openhab.core.types.Type;
34 import org.openhab.core.types.UnDefType;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37
38 import com.google.gson.JsonElement;
39
40 /**
41  * The {@link ApplianceChannelSelector} for dishwashers
42  *
43  * @author Karel Goderis - Initial contribution
44  * @author Kai Kreuzer - Changed START_TIME to DateTimeType
45  * @author Jacob Laursen - Added power/water consumption channels, raw channels
46  */
47 public enum DishwasherChannelSelector implements ApplianceChannelSelector {
48
49     PRODUCT_TYPE("productTypeId", "productType", StringType.class, true, false),
50     DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true, false),
51     STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false, false),
52     STATE(null, STATE_CHANNEL_ID, DecimalType.class, false, false),
53     PROGRAM_TEXT(PROGRAM_ID_PROPERTY_NAME, PROGRAM_TEXT_CHANNEL_ID, StringType.class, false, false) {
54         @Override
55         public State getState(String s, DeviceMetaData dmd) {
56             State state = getTextState(s, dmd, programs, MISSING_PROGRAM_TEXT_PREFIX);
57             if (state != null) {
58                 return state;
59             }
60             return super.getState(s, dmd);
61         }
62     },
63     PROGRAM(null, PROGRAM_CHANNEL_ID, DecimalType.class, false, false),
64     PROGRAM_PHASE_TEXT(PHASE_PROPERTY_NAME, PHASE_TEXT_CHANNEL_ID, StringType.class, false, false) {
65         @Override
66         public State getState(String s, DeviceMetaData dmd) {
67             State state = getTextState(s, dmd, phases, MISSING_PHASE_TEXT_PREFIX);
68             if (state != null) {
69                 return state;
70             }
71             return super.getState(s, dmd);
72         }
73     },
74     PROGRAM_PHASE(RAW_PHASE_PROPERTY_NAME, PHASE_CHANNEL_ID, DecimalType.class, false, false),
75     START_TIME("startTime", "start", DateTimeType.class, false, false) {
76         @Override
77         public State getState(String s, DeviceMetaData dmd) {
78             Date date = new Date();
79             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
80             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
81             try {
82                 date.setTime(Long.valueOf(s) * 60000);
83             } catch (Exception e) {
84                 date.setTime(0);
85             }
86             return getState(dateFormatter.format(date));
87         }
88     },
89     DURATION("duration", "duration", DateTimeType.class, false, false) {
90         @Override
91         public State getState(String s, DeviceMetaData dmd) {
92             Date date = new Date();
93             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
94             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
95             try {
96                 date.setTime(Long.valueOf(s) * 60000);
97             } catch (Exception e) {
98                 date.setTime(0);
99             }
100             return getState(dateFormatter.format(date));
101         }
102     },
103     ELAPSED_TIME("elapsedTime", "elapsed", DateTimeType.class, false, false) {
104         @Override
105         public State getState(String s, DeviceMetaData dmd) {
106             Date date = new Date();
107             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
108             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
109             try {
110                 date.setTime(Long.valueOf(s) * 60000);
111             } catch (Exception e) {
112                 date.setTime(0);
113             }
114             return getState(dateFormatter.format(date));
115         }
116     },
117     FINISH_TIME("finishTime", "finish", DateTimeType.class, false, false) {
118         @Override
119         public State getState(String s, DeviceMetaData dmd) {
120             Date date = new Date();
121             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
122             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
123             try {
124                 date.setTime(Long.valueOf(s) * 60000);
125             } catch (Exception e) {
126                 date.setTime(0);
127             }
128             return getState(dateFormatter.format(date));
129         }
130     },
131     DOOR("signalDoor", "door", OpenClosedType.class, false, false) {
132         @Override
133         public State getState(String s, DeviceMetaData dmd) {
134             if ("true".equals(s)) {
135                 return getState("OPEN");
136             }
137
138             if ("false".equals(s)) {
139                 return getState("CLOSED");
140             }
141
142             return UnDefType.UNDEF;
143         }
144     },
145     SWITCH(null, "switch", OnOffType.class, false, false),
146     POWER_CONSUMPTION(EXTENDED_DEVICE_STATE_PROPERTY_NAME, POWER_CONSUMPTION_CHANNEL_ID, QuantityType.class, false,
147             true),
148     WATER_CONSUMPTION(EXTENDED_DEVICE_STATE_PROPERTY_NAME, WATER_CONSUMPTION_CHANNEL_ID, QuantityType.class, false,
149             true);
150
151     private final Logger logger = LoggerFactory.getLogger(DishwasherChannelSelector.class);
152
153     private static final Map<String, String> programs = Map.ofEntries(entry("26", "Pots & Pans"),
154             entry("27", "Clean Machine"), entry("28", "Economy"), entry("30", "Normal"), entry("32", "Sensor Wash"),
155             entry("34", "Energy Saver"), entry("35", "China & Crystal"), entry("36", "Extra Quiet"),
156             entry("37", "SaniWash"), entry("38", "QuickPowerWash"), entry("42", "Tall items"));
157
158     private static final Map<String, String> phases = Map.ofEntries(entry("2", "Pre-Wash"), entry("3", "Main Wash"),
159             entry("4", "Rinses"), entry("6", "Final rinse"), entry("7", "Drying"), entry("8", "Finished"));
160
161     private final String mieleID;
162     private final String channelID;
163     private final Class<? extends Type> typeClass;
164     private final boolean isProperty;
165     private final boolean isExtendedState;
166
167     DishwasherChannelSelector(String propertyID, String channelID, Class<? extends Type> typeClass, boolean isProperty,
168             boolean isExtendedState) {
169         this.mieleID = propertyID;
170         this.channelID = channelID;
171         this.typeClass = typeClass;
172         this.isProperty = isProperty;
173         this.isExtendedState = isExtendedState;
174     }
175
176     @Override
177     public String toString() {
178         return mieleID;
179     }
180
181     @Override
182     public String getMieleID() {
183         return mieleID;
184     }
185
186     @Override
187     public String getChannelID() {
188         return channelID;
189     }
190
191     @Override
192     public boolean isProperty() {
193         return isProperty;
194     }
195
196     @Override
197     public boolean isExtendedState() {
198         return isExtendedState;
199     }
200
201     @Override
202     public State getState(String s, DeviceMetaData dmd) {
203         if (dmd != null) {
204             String localizedValue = getMieleEnum(s, dmd);
205             if (localizedValue == null) {
206                 localizedValue = dmd.LocalizedValue;
207             }
208             if (localizedValue == null) {
209                 localizedValue = s;
210             }
211
212             return getState(localizedValue);
213         } else {
214             return getState(s);
215         }
216     }
217
218     public State getState(String s) {
219         try {
220             Method valueOf = typeClass.getMethod("valueOf", String.class);
221             State state = (State) valueOf.invoke(typeClass, s);
222             if (state != null) {
223                 return state;
224             }
225         } catch (Exception e) {
226             logger.error("An exception occurred while converting '{}' into a State", s);
227         }
228
229         return null;
230     }
231
232     public State getTextState(String s, DeviceMetaData dmd, Map<String, String> valueMap, String prefix) {
233         if ("0".equals(s)) {
234             return UnDefType.UNDEF;
235         }
236
237         if (dmd == null || dmd.LocalizedValue == null || dmd.LocalizedValue.startsWith(prefix)) {
238             String text = valueMap.get(s);
239             if (text != null) {
240                 return getState(text);
241             }
242             if (dmd == null || dmd.LocalizedValue == null) {
243                 return getState(prefix + s);
244             }
245         }
246
247         return null;
248     }
249
250     public String getMieleEnum(String s, DeviceMetaData dmd) {
251         if (dmd.MieleEnum != null) {
252             for (Entry<String, JsonElement> enumEntry : dmd.MieleEnum.entrySet()) {
253                 if (enumEntry.getValue().getAsString().trim().equals(s.trim())) {
254                     return enumEntry.getKey();
255                 }
256             }
257         }
258
259         return null;
260     }
261 }