]> git.basschouten.com Git - openhab-addons.git/blob
d9b227bc00f412ec7e71692803c0b231eeb6bc5f
[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 Class<? extends Type> getTypeClass() {
165         return typeClass;
166     }
167
168     @Override
169     public boolean isProperty() {
170         return isProperty;
171     }
172
173     @Override
174     public boolean isExtendedState() {
175         return isExtendedState;
176     }
177
178     @Override
179     public State getState(String s, DeviceMetaData dmd) {
180         if (dmd != null) {
181             String localizedValue = getMieleEnum(s, dmd);
182             if (localizedValue == null) {
183                 localizedValue = dmd.LocalizedValue;
184             }
185             if (localizedValue == null) {
186                 localizedValue = s;
187             }
188
189             return getState(localizedValue);
190         } else {
191             return getState(s);
192         }
193     }
194
195     public State getState(String s) {
196         try {
197             Method valueOf = typeClass.getMethod("valueOf", String.class);
198             State state = (State) valueOf.invoke(typeClass, s);
199             if (state != null) {
200                 return state;
201             }
202         } catch (Exception e) {
203             logger.error("An exception occurred while converting '{}' into a State", s);
204         }
205
206         return null;
207     }
208
209     public String getMieleEnum(String s, DeviceMetaData dmd) {
210         if (dmd.MieleEnum != null) {
211             for (Entry<String, JsonElement> enumEntry : dmd.MieleEnum.entrySet()) {
212                 if (enumEntry.getValue().getAsString().trim().equals(s.trim())) {
213                     return enumEntry.getKey();
214                 }
215             }
216         }
217
218         return null;
219     }
220 }