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