]> git.basschouten.com Git - openhab-addons.git/blob
44eecd47a8dcc10400b74a1c8a2a11eeb87c1084
[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 washing machines
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, UoM for temperatures, raw channels
47  */
48 @NonNullByDefault
49 public enum WashingMachineChannelSelector 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_WASHING_MACHINE_TEXT_PREFIX);
65         }
66     },
67     PROGRAM("", PROGRAM_CHANNEL_ID, DecimalType.class, false, false),
68     PROGRAMTYPE("programType", "type", StringType.class, false, false),
69     PROGRAM_PHASE_TEXT(PHASE_PROPERTY_NAME, PHASE_TEXT_CHANNEL_ID, StringType.class, false, false) {
70         @Override
71         public State getState(String s, @Nullable DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
72             return DeviceUtil.getTextState(s, dmd, translationProvider, PHASES, MISSING_PHASE_TEXT_PREFIX,
73                     MIELE_WASHING_MACHINE_TEXT_PREFIX);
74         }
75     },
76     PROGRAM_PHASE(RAW_PHASE_PROPERTY_NAME, PHASE_CHANNEL_ID, DecimalType.class, false, false),
77     START_TIME("", START_CHANNEL_ID, DateTimeType.class, false, false),
78     END_TIME("", END_CHANNEL_ID, DateTimeType.class, false, false),
79     DURATION("duration", "duration", DateTimeType.class, false, false) {
80         @Override
81         public State getState(String s, @Nullable DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
82             Date date = new Date();
83             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
84             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
85             try {
86                 date.setTime(Long.valueOf(s.trim()) * 60000);
87             } catch (Exception e) {
88                 date.setTime(0);
89             }
90             return getState(dateFormatter.format(date));
91         }
92     },
93     ELAPSED_TIME("elapsedTime", "elapsed", DateTimeType.class, false, false) {
94         @Override
95         public State getState(String s, @Nullable DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
96             Date date = new Date();
97             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
98             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
99             try {
100                 date.setTime(Long.valueOf(s) * 60000);
101             } catch (Exception e) {
102                 date.setTime(0);
103             }
104             return getState(dateFormatter.format(date));
105         }
106     },
107     FINISH_TIME("", FINISH_CHANNEL_ID, DateTimeType.class, false, false),
108     TARGET_TEMP("targetTemperature", "target", QuantityType.class, false, false) {
109         @Override
110         public State getState(String s, @Nullable DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
111             return getTemperatureState(s);
112         }
113     },
114     SPINNING_SPEED("spinningSpeed", "spinningspeed", StringType.class, false, false) {
115         @Override
116         public State getState(String s, @Nullable DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
117             if ("0".equals(s)) {
118                 return getState("Without spinning");
119             }
120             if ("256".equals(s)) {
121                 return getState("Rinsing");
122             }
123             return getState(Integer.toString((Integer.valueOf(s))));
124         }
125     },
126     DOOR("signalDoor", "door", OpenClosedType.class, false, false) {
127         @Override
128         public State getState(String s, @Nullable DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
129             if ("true".equals(s)) {
130                 return getState("OPEN");
131             }
132
133             if ("false".equals(s)) {
134                 return getState("CLOSED");
135             }
136
137             return UnDefType.UNDEF;
138         }
139     },
140     SWITCH("", "switch", OnOffType.class, false, false),
141     POWER_CONSUMPTION(EXTENDED_DEVICE_STATE_PROPERTY_NAME, POWER_CONSUMPTION_CHANNEL_ID, QuantityType.class, false,
142             true),
143     WATER_CONSUMPTION(EXTENDED_DEVICE_STATE_PROPERTY_NAME, WATER_CONSUMPTION_CHANNEL_ID, QuantityType.class, false,
144             true);
145
146     private final Logger logger = LoggerFactory.getLogger(WashingMachineChannelSelector.class);
147
148     private static final Map<String, String> PROGRAMS = Map.ofEntries(entry("1", "cottons"), entry("3", "minimum-iron"),
149             entry("4", "delicates"), entry("8", "woollens"), entry("9", "silks"), entry("17", "starch"),
150             entry("18", "rinse"), entry("21", "drain-spin"), entry("22", "curtains"), entry("23", "shirts"),
151             entry("24", "denim"), entry("27", "proofing"), entry("29", "sportswear"), entry("31", "automatic-plus"),
152             entry("37", "outerwear"), entry("39", "pillows"), entry("50", "dark-garments"), entry("53", "first-wash"),
153             entry("75", "steam-care"), entry("76", "freshen-up"), entry("91", "maintenance-wash"),
154             entry("95", "down-duvets"), entry("122", "express-20"), entry("129", "down-filled-items"),
155             entry("133", "cottons-eco"), entry("146", "quickpowerwash"), entry("65532", "mix"));
156
157     private static final Map<String, String> PHASES = Map.ofEntries(entry("1", "pre-wash"), entry("4", "washing"),
158             entry("5", "rinses"), entry("7", "clean"), entry("9", "drain"), entry("10", "spin"),
159             entry("11", "anti-crease"), entry("12", "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     WashingMachineChannelSelector(String propertyID, String channelID, Class<? extends Type> typeClass,
168             boolean isProperty, 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, @Nullable DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
203         return this.getState(s, dmd);
204     }
205
206     @Override
207     public State getState(String s, @Nullable DeviceMetaData dmd) {
208         if (dmd != null) {
209             String localizedValue = dmd.getMieleEnum(s);
210             if (localizedValue == null) {
211                 localizedValue = dmd.LocalizedValue;
212             }
213             if (localizedValue == null) {
214                 localizedValue = s;
215             }
216
217             return getState(localizedValue);
218         } else {
219             return getState(s);
220         }
221     }
222
223     public State getState(String s) {
224         try {
225             Method valueOf = typeClass.getMethod("valueOf", String.class);
226             State state = (State) valueOf.invoke(typeClass, s);
227             if (state != null) {
228                 return state;
229             }
230         } catch (Exception e) {
231             logger.warn("An exception occurred while converting '{}' into a State", s);
232         }
233
234         return UnDefType.UNDEF;
235     }
236
237     public State getTemperatureState(String s) {
238         try {
239             return DeviceUtil.getTemperatureState(s);
240         } catch (NumberFormatException e) {
241             logger.warn("An exception occurred while converting '{}' into a State", s);
242             return UnDefType.UNDEF;
243         }
244     }
245 }