]> git.basschouten.com Git - openhab-addons.git/blob
3b1e2bd312b71044fd7a8f88295ee77f52df4932
[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 org.openhab.binding.miele.internal.MieleBindingConstants.*;
16
17 import java.lang.reflect.Method;
18 import java.util.Collections;
19 import java.util.Map;
20
21 import org.openhab.binding.miele.internal.DeviceMetaData;
22 import org.openhab.binding.miele.internal.DeviceUtil;
23 import org.openhab.binding.miele.internal.MieleTranslationProvider;
24 import org.openhab.core.library.types.DecimalType;
25 import org.openhab.core.library.types.OnOffType;
26 import org.openhab.core.library.types.OpenClosedType;
27 import org.openhab.core.library.types.StringType;
28 import org.openhab.core.types.State;
29 import org.openhab.core.types.Type;
30 import org.openhab.core.types.UnDefType;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
33
34 /**
35  * The {@link ApplianceChannelSelector} for coffee machines
36  *
37  * @author Stephan Esch - Initial contribution
38  * @author Jacob Laursen - Added raw channels
39  */
40 public enum CoffeeMachineChannelSelector implements ApplianceChannelSelector {
41
42     PRODUCT_TYPE("productTypeId", "productType", StringType.class, true),
43     DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true),
44     STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false) {
45         @Override
46         public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
47             State state = DeviceUtil.getStateTextState(s, dmd, translationProvider);
48             if (state != null) {
49                 return state;
50             }
51             return super.getState(s, dmd, translationProvider);
52         }
53     },
54     STATE(null, STATE_CHANNEL_ID, DecimalType.class, false),
55     PROGRAM_TEXT(PROGRAM_ID_PROPERTY_NAME, PROGRAM_TEXT_CHANNEL_ID, StringType.class, false) {
56         @Override
57         public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
58             State state = DeviceUtil.getTextState(s, dmd, translationProvider, programs, MISSING_PROGRAM_TEXT_PREFIX,
59                     MIELE_COFFEE_MACHINE_TEXT_PREFIX);
60             if (state != null) {
61                 return state;
62             }
63             return super.getState(s, dmd, translationProvider);
64         }
65     },
66     PROGRAM(null, PROGRAM_CHANNEL_ID, DecimalType.class, false),
67     PROGRAMTYPE("programType", "type", StringType.class, false),
68     PROGRAM_PHASE_TEXT(PHASE_PROPERTY_NAME, PHASE_TEXT_CHANNEL_ID, StringType.class, false) {
69         @Override
70         public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
71             State state = DeviceUtil.getTextState(s, dmd, translationProvider, phases, MISSING_PHASE_TEXT_PREFIX,
72                     MIELE_COFFEE_MACHINE_TEXT_PREFIX);
73             if (state != null) {
74                 return state;
75             }
76             return super.getState(s, dmd, translationProvider);
77         }
78     },
79     PROGRAM_PHASE(RAW_PHASE_PROPERTY_NAME, PHASE_CHANNEL_ID, DecimalType.class, false),
80     // lightingStatus signalFailure signalInfo
81     DOOR("signalDoor", "door", OpenClosedType.class, false) {
82         @Override
83         public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
84             if ("true".equals(s)) {
85                 return getState("OPEN");
86             }
87
88             if ("false".equals(s)) {
89                 return getState("CLOSED");
90             }
91
92             return UnDefType.UNDEF;
93         }
94     },
95     SWITCH(null, "switch", OnOffType.class, false);
96
97     private final Logger logger = LoggerFactory.getLogger(CoffeeMachineChannelSelector.class);
98
99     private static final Map<String, String> programs = Collections.<String, String> emptyMap();
100
101     private static final Map<String, String> phases = Collections.<String, String> emptyMap();
102
103     private final String mieleID;
104     private final String channelID;
105     private final Class<? extends Type> typeClass;
106     private final boolean isProperty;
107
108     CoffeeMachineChannelSelector(String propertyID, String channelID, Class<? extends Type> typeClass,
109             boolean isProperty) {
110         this.mieleID = propertyID;
111         this.channelID = channelID;
112         this.typeClass = typeClass;
113         this.isProperty = isProperty;
114     }
115
116     @Override
117     public String toString() {
118         return mieleID;
119     }
120
121     @Override
122     public String getMieleID() {
123         return mieleID;
124     }
125
126     @Override
127     public String getChannelID() {
128         return channelID;
129     }
130
131     @Override
132     public boolean isProperty() {
133         return isProperty;
134     }
135
136     @Override
137     public boolean isExtendedState() {
138         return false;
139     }
140
141     @Override
142     public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
143         return this.getState(s, dmd);
144     }
145
146     @Override
147     public State getState(String s, DeviceMetaData dmd) {
148         if (dmd != null) {
149             String localizedValue = dmd.getMieleEnum(s);
150             if (localizedValue == null) {
151                 localizedValue = dmd.LocalizedValue;
152             }
153             if (localizedValue == null) {
154                 localizedValue = s;
155             }
156
157             return getState(localizedValue);
158         } else {
159             return getState(s);
160         }
161     }
162
163     public State getState(String s) {
164         try {
165             Method valueOf = typeClass.getMethod("valueOf", String.class);
166             State state = (State) valueOf.invoke(typeClass, s);
167             if (state != null) {
168                 return state;
169             }
170         } catch (Exception e) {
171             logger.error("An exception occurred while converting '{}' into a State", s);
172         }
173
174         return null;
175     }
176 }