]> git.basschouten.com Git - openhab-addons.git/blob
a8c819a025c826611aaa662a943aac2d2d1c1c18
[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 org.openhab.binding.miele.internal.MieleBindingConstants.EXTENDED_DEVICE_STATE_PROPERTY_NAME;
16 import static org.openhab.binding.miele.internal.MieleBindingConstants.POWER_CONSUMPTION_CHANNEL_ID;
17 import static org.openhab.binding.miele.internal.MieleBindingConstants.WATER_CONSUMPTION_CHANNEL_ID;
18
19 import java.lang.reflect.Method;
20 import java.text.SimpleDateFormat;
21 import java.util.Date;
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.OnOffType;
28 import org.openhab.core.library.types.OpenClosedType;
29 import org.openhab.core.library.types.QuantityType;
30 import org.openhab.core.library.types.StringType;
31 import org.openhab.core.types.State;
32 import org.openhab.core.types.Type;
33 import org.openhab.core.types.UnDefType;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
36
37 import com.google.gson.JsonElement;
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
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     BRAND_ID("brandId", "brandId", StringType.class, true, false),
51     COMPANY_ID("companyId", "companyId", StringType.class, true, false),
52     STATE("state", "state", StringType.class, false, false),
53     PROGRAMID("programId", "program", StringType.class, false, false),
54     PROGRAMPHASE("phase", "phase", StringType.class, false, false),
55     START_TIME("startTime", "start", DateTimeType.class, false, false) {
56         @Override
57         public State getState(String s, DeviceMetaData dmd) {
58             Date date = new Date();
59             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
60             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
61             try {
62                 date.setTime(Long.valueOf(s) * 60000);
63             } catch (Exception e) {
64                 date.setTime(0);
65             }
66             return getState(dateFormatter.format(date));
67         }
68     },
69     DURATION("duration", "duration", DateTimeType.class, false, false) {
70         @Override
71         public State getState(String s, DeviceMetaData dmd) {
72             Date date = new Date();
73             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
74             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
75             try {
76                 date.setTime(Long.valueOf(s) * 60000);
77             } catch (Exception e) {
78                 date.setTime(0);
79             }
80             return getState(dateFormatter.format(date));
81         }
82     },
83     ELAPSED_TIME("elapsedTime", "elapsed", DateTimeType.class, false, false) {
84         @Override
85         public State getState(String s, DeviceMetaData dmd) {
86             Date date = new Date();
87             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
88             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
89             try {
90                 date.setTime(Long.valueOf(s) * 60000);
91             } catch (Exception e) {
92                 date.setTime(0);
93             }
94             return getState(dateFormatter.format(date));
95         }
96     },
97     FINISH_TIME("finishTime", "finish", DateTimeType.class, false, false) {
98         @Override
99         public State getState(String s, DeviceMetaData dmd) {
100             Date date = new Date();
101             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
102             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
103             try {
104                 date.setTime(Long.valueOf(s) * 60000);
105             } catch (Exception e) {
106                 date.setTime(0);
107             }
108             return getState(dateFormatter.format(date));
109         }
110     },
111     DOOR("signalDoor", "door", OpenClosedType.class, false, false) {
112         @Override
113         public State getState(String s, DeviceMetaData dmd) {
114             if ("true".equals(s)) {
115                 return getState("OPEN");
116             }
117
118             if ("false".equals(s)) {
119                 return getState("CLOSED");
120             }
121
122             return UnDefType.UNDEF;
123         }
124     },
125     SWITCH(null, "switch", OnOffType.class, false, false),
126     POWER_CONSUMPTION(EXTENDED_DEVICE_STATE_PROPERTY_NAME, POWER_CONSUMPTION_CHANNEL_ID, QuantityType.class, false,
127             true),
128     WATER_CONSUMPTION(EXTENDED_DEVICE_STATE_PROPERTY_NAME, WATER_CONSUMPTION_CHANNEL_ID, QuantityType.class, false,
129             true);
130
131     private final Logger logger = LoggerFactory.getLogger(DishwasherChannelSelector.class);
132
133     private final String mieleID;
134     private final String channelID;
135     private final Class<? extends Type> typeClass;
136     private final boolean isProperty;
137     private final boolean isExtendedState;
138
139     DishwasherChannelSelector(String propertyID, String channelID, Class<? extends Type> typeClass, boolean isProperty,
140             boolean isExtendedState) {
141         this.mieleID = propertyID;
142         this.channelID = channelID;
143         this.typeClass = typeClass;
144         this.isProperty = isProperty;
145         this.isExtendedState = isExtendedState;
146     }
147
148     @Override
149     public String toString() {
150         return mieleID;
151     }
152
153     @Override
154     public String getMieleID() {
155         return mieleID;
156     }
157
158     @Override
159     public String getChannelID() {
160         return channelID;
161     }
162
163     @Override
164     public boolean isProperty() {
165         return isProperty;
166     }
167
168     @Override
169     public boolean isExtendedState() {
170         return isExtendedState;
171     }
172
173     @Override
174     public State getState(String s, DeviceMetaData dmd) {
175         if (dmd != null) {
176             String localizedValue = getMieleEnum(s, dmd);
177             if (localizedValue == null) {
178                 localizedValue = dmd.LocalizedValue;
179             }
180             if (localizedValue == null) {
181                 localizedValue = s;
182             }
183
184             return getState(localizedValue);
185         } else {
186             return getState(s);
187         }
188     }
189
190     public State getState(String s) {
191         try {
192             Method valueOf = typeClass.getMethod("valueOf", String.class);
193             State state = (State) valueOf.invoke(typeClass, s);
194             if (state != null) {
195                 return state;
196             }
197         } catch (Exception e) {
198             logger.error("An exception occurred while converting '{}' into a State", s);
199         }
200
201         return null;
202     }
203
204     public String getMieleEnum(String s, DeviceMetaData dmd) {
205         if (dmd.MieleEnum != null) {
206             for (Entry<String, JsonElement> enumEntry : dmd.MieleEnum.entrySet()) {
207                 if (enumEntry.getValue().getAsString().trim().equals(s.trim())) {
208                     return enumEntry.getKey();
209                 }
210             }
211         }
212
213         return null;
214     }
215 }