]> git.basschouten.com Git - openhab-addons.git/commitdiff
[miele] Localization of state, program and phase (#11603)
authorjlaur <jacob-github@vindvejr.dk>
Mon, 29 Nov 2021 07:16:08 +0000 (08:16 +0100)
committerGitHub <noreply@github.com>
Mon, 29 Nov 2021 07:16:08 +0000 (08:16 +0100)
* Initial changes for state, program and phase localization.
* Fix bridge configuration reload.
* Extracted DeviceMetaData from MieleBridgeHandler.
* Fix fallback to gateway text.
* Consolidate getMieleEnum in DeviceMetaData.
* Localize thing offline texts and increased accuracy.
* Validate language during bridge initialization.
* Interpret magic value for temperature.
* Add missing i18n channel label/description strings.
* Add missing washing machine phase texts in Dutch.
* Add missing French dishwasher phase texts.

Fixes #11602

Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>
36 files changed:
bundles/org.openhab.binding.miele/README.md
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/DeviceMetaData.java [new file with mode: 0644]
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/DeviceUtil.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleBindingConstants.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleHandlerFactory.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleTranslationProvider.java [new file with mode: 0644]
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/ApplianceChannelSelector.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/CoffeeMachineChannelSelector.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/CoffeeMachineHandler.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/DishWasherHandler.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/DishwasherChannelSelector.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/ExtendedDeviceStateListener.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeChannelSelector.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeFreezerChannelSelector.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeFreezerHandler.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeHandler.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/HobChannelSelector.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/HobHandler.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/HoodChannelSelector.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/HoodHandler.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenChannelSelector.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenHandler.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/TumbleDryerChannelSelector.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/TumbleDryerHandler.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineChannelSelector.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineHandler.java
bundles/org.openhab.binding.miele/src/main/resources/OH-INF/i18n/miele.properties
bundles/org.openhab.binding.miele/src/main/resources/OH-INF/i18n/miele_da.properties
bundles/org.openhab.binding.miele/src/main/resources/OH-INF/i18n/miele_de.properties [new file with mode: 0644]
bundles/org.openhab.binding.miele/src/main/resources/OH-INF/i18n/miele_fr.properties [new file with mode: 0644]
bundles/org.openhab.binding.miele/src/main/resources/OH-INF/i18n/miele_nl.properties [new file with mode: 0644]
bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/washingmachine.xml
bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/xgw3000.xml
bundles/org.openhab.binding.miele/src/test/java/org/openhab/binding/miele/internal/DeviceUtilTest.java

index 3856a68815e0bf874c37da619cc89f05ecaaed8a..0c72e1bf27bc9ff48e40c0f85202ce9c8c549ffe 100644 (file)
@@ -128,15 +128,15 @@ Channels available for each appliance type are listed below.
 
 | Program | Description                         |
 |---------|-------------------------------------|
-| 26      | Pots & Pans                         |
-| 27      | Clean Machine                       |
-| 28      | Economy                             |
+| 26      | Intensive                           |
+| 27      | Maintenance programme               |
+| 28      | ECO                                 |
 | 30      | Normal                              |
-| 32      | Sensor Wash                         |
-| 34      | Energy Saver                        |
-| 35      | China & Crystal                     |
+| 32      | Automatic                           |
+| 34      | SolarSave                           |
+| 35      | Gentle                              |
 | 36      | Extra Quiet                         |
-| 37      | SaniWash                            |
+| 37      | Hygiene                             |
 | 38      | QuickPowerWash                      |
 | 42      | Tall items                          |
 
@@ -282,6 +282,7 @@ See oven.
 | Program | Description                         |
 |---------|-------------------------------------|
 | 10      | Automatic Plus                      |
+| 20      | Cottons                             |
 | 23      | Cottons hygiene                     |
 | 30      | Minimum iron                        |
 | 31      | Gentle minimum iron                 |
@@ -314,11 +315,11 @@ See oven.
 | 513   | 1      | Programme running            |
 | 514   | 2      | Drying                       |
 | 515   | 3      | Drying Machine iron          |
-| 516   | 4      | Drying Hand iron (1)         |
+| 516   | 4      | Drying Hand iron (2)         |
 | 517   | 5      | Drying Normal                |
 | 518   | 6      | Drying Normal+               |
 | 519   | 7      | Cooling down                 |
-| 520   | 8      | Drying Hand iron (2)         |
+| 520   | 8      | Drying Hand iron (1)         |
 | 522   | 10     | Finished                     |
 
 #### Washing Machine
@@ -338,7 +339,7 @@ See oven.
 | finish              | DateTime             | Read       | Time to finish the program running on the appliance                 |
 | door                | Contact              | Read       | Current state of the door of the appliance                          |
 | switch              | Switch               | Write      | Switch the appliance on or off                                      |
-| target              | Number:Temperature   | Read       | Temperature of the selected program                                 |
+| target              | Number:Temperature   | Read       | Temperature of the selected program (10 °C = cold)                  |
 | spinningspeed       | String               | Read       | Spinning speed in the program running on the appliance              |
 | powerConsumption    | Number:Power         | Read       | Power consumption by the currently running program on the appliance |
 | waterConsumption    | Number:Volume        | Read       | Water consumption by the currently running program on the appliance |
diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/DeviceMetaData.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/DeviceMetaData.java
new file mode 100644 (file)
index 0000000..9d84b35
--- /dev/null
@@ -0,0 +1,46 @@
+/**
+ * Copyright (c) 2010-2021 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.miele.internal;
+
+import java.util.Map.Entry;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+
+/**
+ * The {@link DeviceMetaData} class represents the Metadata node in the response JSON.
+ *
+ * @author Jacob Laursen - Initial contribution
+ */
+public class DeviceMetaData {
+    public String Filter;
+    public String description;
+    public String LocalizedID;
+    public String LocalizedValue;
+    public JsonObject MieleEnum;
+    public String access;
+
+    public String getMieleEnum(String s) {
+        if (this.MieleEnum == null) {
+            return null;
+        }
+
+        for (Entry<String, JsonElement> enumEntry : this.MieleEnum.entrySet()) {
+            if (enumEntry.getValue().getAsString().trim().equals(s.trim())) {
+                return enumEntry.getKey();
+            }
+        }
+
+        return null;
+    }
+}
index c80b28d38f0d43def674b851c5bf75ed038c2d0e..31e168fc75871c09d7f3786308d2b1f967f4d30c 100644 (file)
  */
 package org.openhab.binding.miele.internal;
 
+import static org.openhab.binding.miele.internal.MieleBindingConstants.*;
+
 import java.nio.charset.StandardCharsets;
+import java.util.Map;
 
 import org.openhab.core.library.types.QuantityType;
+import org.openhab.core.library.types.StringType;
 import org.openhab.core.library.unit.SIUnits;
 import org.openhab.core.types.State;
 import org.openhab.core.types.UnDefType;
@@ -28,6 +32,15 @@ import org.openhab.core.types.UnDefType;
 public class DeviceUtil {
     private static final byte[] HEX_ARRAY = "0123456789ABCDEF".getBytes(StandardCharsets.US_ASCII);
     private static final String TEMPERATURE_UNDEFINED = "32768";
+    private static final String TEMPERATURE_COLD = "-32760";
+    private static final String TEXT_PREFIX = "miele.";
+
+    private static final Map<String, String> states = Map.ofEntries(Map.entry("1", "off"), Map.entry("2", "stand-by"),
+            Map.entry("3", "programmed"), Map.entry("4", "waiting-to-start"), Map.entry("5", "running"),
+            Map.entry("6", "paused"), Map.entry("7", "end"), Map.entry("8", "failure"), Map.entry("9", "abort"),
+            Map.entry("10", "idle"), Map.entry("11", "rinse-hold"), Map.entry("12", "service"),
+            Map.entry("13", "super-freezing"), Map.entry("14", "super-cooling"), Map.entry("15", "super-heating"),
+            Map.entry("144", "default"), Map.entry("145", "locked"), Map.entry("255", "not-connected"));
 
     /**
      * Convert byte array to hex representation.
@@ -60,7 +73,59 @@ public class DeviceUtil {
         if (TEMPERATURE_UNDEFINED.equals(s)) {
             return UnDefType.UNDEF;
         }
+        if (TEMPERATURE_COLD.equals(s)) {
+            return new QuantityType<>(10, SIUnits.CELSIUS);
+        }
         int temperature = Integer.parseInt(s);
         return new QuantityType<>(temperature, SIUnits.CELSIUS);
     }
+
+    /**
+     * Get state text for provided string taking into consideration {@link DeviceMetaData}
+     * as well as built-in/translated strings.
+     */
+    public static State getStateTextState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
+        return getTextState(s, dmd, translationProvider, states, MISSING_STATE_TEXT_PREFIX, "");
+    }
+
+    /**
+     * Get text for provided string taking into consideration {@link DeviceMetaData}
+     * as well as built-in/translated strings.
+     * 
+     * @param s Raw string to be processed
+     * @param dmd {@link DeviceMetaData} possibly containing LocalizedValue and/or enum from gateway
+     * @param translationProvider {@link MieleTranslationProvider} for localization support
+     * @param valueMap Map of numeric values with corresponding text keys
+     * @param propertyPrefix Property prefix appended to text key (including dot)
+     * @param appliancePrefix Appliance prefix appended to text key (including dot)
+     * @return Text string as State
+     */
+    public static State getTextState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider,
+            Map<String, String> valueMap, String propertyPrefix, String appliancePrefix) {
+        if ("0".equals(s)) {
+            return UnDefType.UNDEF;
+        }
+
+        String gatewayText = null;
+        if (dmd != null) {
+            if (dmd.LocalizedValue != null && !dmd.LocalizedValue.isEmpty()) {
+                gatewayText = dmd.LocalizedValue;
+            } else {
+                gatewayText = dmd.getMieleEnum(s);
+            }
+        }
+
+        String value = valueMap.get(s);
+        if (value != null) {
+            String key = TEXT_PREFIX + propertyPrefix + appliancePrefix + value;
+            return new StringType(
+                    translationProvider.getText(key, gatewayText != null ? gatewayText : propertyPrefix + s));
+        }
+
+        if (gatewayText != null) {
+            return new StringType(gatewayText);
+        }
+
+        return new StringType(propertyPrefix + s);
+    }
 }
index 0ac74412f827b1172f1920a043136ed883582de7..65e693f031c9087eb31c2dfa25d6632d6adb0b22 100644 (file)
@@ -97,12 +97,21 @@ public class MieleBindingConstants {
     public static final int STATE_NOT_CONNECTED = 255;
 
     // Miele missing string prefixes
+    public static final String MISSING_STATE_TEXT_PREFIX = "state.";
     public static final String MISSING_PROGRAM_TEXT_PREFIX = "program.";
     public static final String MISSING_PHASE_TEXT_PREFIX = "phase.";
 
+    // Miele appliance localization text prefixes
+    public static final String MIELE_COFFEE_MACHINE_TEXT_PREFIX = "coffeemachine.";
+    public static final String MIELE_DISHWASHER_TEXT_PREFIX = "dishwasher.";
+    public static final String MIELE_OVEN_TEXT_PREFIX = "oven.";
+    public static final String MIELE_TUMBLE_DRYER_TEXT_PREFIX = "tumbledryer.";
+    public static final String MIELE_WASHING_MACHINE_TEXT_PREFIX = "washingmachine.";
+
     // Bridge config properties
     public static final String HOST = "ipAddress";
     public static final String INTERFACE = "interface";
     public static final String USER_NAME = "userName";
     public static final String PASSWORD = "password";
+    public static final String LANGUAGE = "language";
 }
index 4754db07a39b861c99b1ef4c6aa44444cfd6eff8..e824716f912b6ea1f1bbbad6ffab40eaaf57fdc2 100644 (file)
@@ -35,6 +35,8 @@ import org.openhab.binding.miele.internal.handler.TumbleDryerHandler;
 import org.openhab.binding.miele.internal.handler.WashingMachineHandler;
 import org.openhab.core.config.core.Configuration;
 import org.openhab.core.config.discovery.DiscoveryService;
+import org.openhab.core.i18n.LocaleProvider;
+import org.openhab.core.i18n.TranslationProvider;
 import org.openhab.core.thing.Bridge;
 import org.openhab.core.thing.Thing;
 import org.openhab.core.thing.ThingTypeUID;
@@ -43,7 +45,10 @@ import org.openhab.core.thing.binding.BaseThingHandlerFactory;
 import org.openhab.core.thing.binding.ThingHandler;
 import org.openhab.core.thing.binding.ThingHandlerFactory;
 import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 
 /**
  * The {@link MieleHandlerFactory} is responsible for creating things and thing
@@ -59,8 +64,18 @@ public class MieleHandlerFactory extends BaseThingHandlerFactory {
                     MieleApplianceHandler.SUPPORTED_THING_TYPES.stream())
             .collect(Collectors.toSet());
 
+    private final TranslationProvider i18nProvider;
+    private final LocaleProvider localeProvider;
+
     private Map<ThingUID, ServiceRegistration<?>> discoveryServiceRegs = new HashMap<>();
 
+    @Activate
+    public MieleHandlerFactory(final @Reference TranslationProvider i18nProvider,
+            final @Reference LocaleProvider localeProvider, ComponentContext componentContext) {
+        this.i18nProvider = i18nProvider;
+        this.localeProvider = localeProvider;
+    }
+
     @Override
     public boolean supportsThingType(ThingTypeUID thingTypeUID) {
         return SUPPORTED_THING_TYPES_UIDS.contains(thingTypeUID);
@@ -89,31 +104,31 @@ public class MieleHandlerFactory extends BaseThingHandlerFactory {
             return handler;
         } else if (MieleApplianceHandler.SUPPORTED_THING_TYPES.contains(thing.getThingTypeUID())) {
             if (thing.getThingTypeUID().equals(THING_TYPE_HOOD)) {
-                return new HoodHandler(thing);
+                return new HoodHandler(thing, i18nProvider, localeProvider);
             }
             if (thing.getThingTypeUID().equals(THING_TYPE_FRIDGEFREEZER)) {
-                return new FridgeFreezerHandler(thing);
+                return new FridgeFreezerHandler(thing, i18nProvider, localeProvider);
             }
             if (thing.getThingTypeUID().equals(THING_TYPE_FRIDGE)) {
-                return new FridgeHandler(thing);
+                return new FridgeHandler(thing, i18nProvider, localeProvider);
             }
             if (thing.getThingTypeUID().equals(THING_TYPE_OVEN)) {
-                return new OvenHandler(thing);
+                return new OvenHandler(thing, i18nProvider, localeProvider);
             }
             if (thing.getThingTypeUID().equals(THING_TYPE_HOB)) {
-                return new HobHandler(thing);
+                return new HobHandler(thing, i18nProvider, localeProvider);
             }
             if (thing.getThingTypeUID().equals(THING_TYPE_WASHINGMACHINE)) {
-                return new WashingMachineHandler(thing);
+                return new WashingMachineHandler(thing, i18nProvider, localeProvider);
             }
             if (thing.getThingTypeUID().equals(THING_TYPE_DRYER)) {
-                return new TumbleDryerHandler(thing);
+                return new TumbleDryerHandler(thing, i18nProvider, localeProvider);
             }
             if (thing.getThingTypeUID().equals(THING_TYPE_DISHWASHER)) {
-                return new DishWasherHandler(thing);
+                return new DishWasherHandler(thing, i18nProvider, localeProvider);
             }
             if (thing.getThingTypeUID().equals(THING_TYPE_COFFEEMACHINE)) {
-                return new CoffeeMachineHandler(thing);
+                return new CoffeeMachineHandler(thing, i18nProvider, localeProvider);
             }
         }
 
diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleTranslationProvider.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleTranslationProvider.java
new file mode 100644 (file)
index 0000000..fc46299
--- /dev/null
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2010-2021 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.miele.internal;
+
+import java.util.Locale;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+import org.openhab.core.i18n.LocaleProvider;
+import org.openhab.core.i18n.TranslationProvider;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.FrameworkUtil;
+
+/**
+ * {@link MieleTranslationProvider} provides i18n message lookup
+ *
+ * @author Jacob Laursen - Initial contribution
+ */
+@NonNullByDefault
+public class MieleTranslationProvider {
+
+    private final Bundle bundle;
+    private final TranslationProvider i18nProvider;
+    private final LocaleProvider localeProvider;
+    @Nullable
+    private final Locale locale;
+
+    public MieleTranslationProvider(TranslationProvider i18nProvider, LocaleProvider localeProvider) {
+        this.bundle = FrameworkUtil.getBundle(this.getClass());
+        this.i18nProvider = i18nProvider;
+        this.localeProvider = localeProvider;
+        this.locale = null;
+    }
+
+    public MieleTranslationProvider(TranslationProvider i18nProvider, LocaleProvider localeProvider, Locale locale) {
+        this.bundle = FrameworkUtil.getBundle(this.getClass());
+        this.i18nProvider = i18nProvider;
+        this.localeProvider = localeProvider;
+        this.locale = locale;
+    }
+
+    public String getText(String key, String defaultText, @Nullable Object... arguments) {
+        String text = i18nProvider.getText(bundle, key, defaultText,
+                locale != null ? locale : localeProvider.getLocale(), arguments);
+        if (text == null) {
+            return defaultText;
+        }
+        return text;
+    }
+}
index 9ed9a638d204619fea2058979fe3b06818ee960d..ed58dc4ed6f845152f629f2d73f9ce5268f49a54 100644 (file)
@@ -12,7 +12,8 @@
  */
 package org.openhab.binding.miele.internal.handler;
 
-import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData;
+import org.openhab.binding.miele.internal.DeviceMetaData;
+import org.openhab.binding.miele.internal.MieleTranslationProvider;
 import org.openhab.core.types.State;
 
 /**
@@ -51,6 +52,17 @@ public interface ApplianceChannelSelector {
      */
     boolean isExtendedState();
 
+    /**
+     * Returns a State for the given string, taking into
+     * account the metadata provided as well as text
+     * translations for corresponding numeric values.
+     *
+     * @param s - the value to be used to instantiate the State
+     * @param dmd - the device meta data
+     * @param translationProvider {@link MieleTranslationProvider} instance
+     */
+    State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider);
+
     /**
      * Returns a State for the given string, taking into
      * account the metadata provided. The meta data is sent by
index bde856833f8b1adcc08269b8379447ad3ffaefb0..f6b00d5cc1e1bc88d653dff772ab5dd881dee319 100644 (file)
@@ -17,9 +17,10 @@ import static org.openhab.binding.miele.internal.MieleBindingConstants.*;
 import java.lang.reflect.Method;
 import java.util.Collections;
 import java.util.Map;
-import java.util.Map.Entry;
 
-import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData;
+import org.openhab.binding.miele.internal.DeviceMetaData;
+import org.openhab.binding.miele.internal.DeviceUtil;
+import org.openhab.binding.miele.internal.MieleTranslationProvider;
 import org.openhab.core.library.types.DecimalType;
 import org.openhab.core.library.types.OnOffType;
 import org.openhab.core.library.types.OpenClosedType;
@@ -30,8 +31,6 @@ import org.openhab.core.types.UnDefType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.gson.JsonElement;
-
 /**
  * The {@link ApplianceChannelSelector} for coffee machines
  *
@@ -42,35 +41,46 @@ public enum CoffeeMachineChannelSelector implements ApplianceChannelSelector {
 
     PRODUCT_TYPE("productTypeId", "productType", StringType.class, true),
     DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true),
-    STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false),
+    STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false) {
+        @Override
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
+            State state = DeviceUtil.getStateTextState(s, dmd, translationProvider);
+            if (state != null) {
+                return state;
+            }
+            return super.getState(s, dmd, translationProvider);
+        }
+    },
     STATE(null, STATE_CHANNEL_ID, DecimalType.class, false),
     PROGRAM_TEXT(PROGRAM_ID_PROPERTY_NAME, PROGRAM_TEXT_CHANNEL_ID, StringType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
-            State state = getTextState(s, dmd, programs, MISSING_PROGRAM_TEXT_PREFIX);
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
+            State state = DeviceUtil.getTextState(s, dmd, translationProvider, programs, MISSING_PROGRAM_TEXT_PREFIX,
+                    MIELE_COFFEE_MACHINE_TEXT_PREFIX);
             if (state != null) {
                 return state;
             }
-            return super.getState(s, dmd);
+            return super.getState(s, dmd, translationProvider);
         }
     },
     PROGRAM(null, PROGRAM_CHANNEL_ID, DecimalType.class, false),
     PROGRAMTYPE("programType", "type", StringType.class, false),
     PROGRAM_PHASE_TEXT(PHASE_PROPERTY_NAME, PHASE_TEXT_CHANNEL_ID, StringType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
-            State state = getTextState(s, dmd, phases, MISSING_PHASE_TEXT_PREFIX);
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
+            State state = DeviceUtil.getTextState(s, dmd, translationProvider, phases, MISSING_PHASE_TEXT_PREFIX,
+                    MIELE_COFFEE_MACHINE_TEXT_PREFIX);
             if (state != null) {
                 return state;
             }
-            return super.getState(s, dmd);
+            return super.getState(s, dmd, translationProvider);
         }
     },
     PROGRAM_PHASE(RAW_PHASE_PROPERTY_NAME, PHASE_CHANNEL_ID, DecimalType.class, false),
     // lightingStatus signalFailure signalInfo
     DOOR("signalDoor", "door", OpenClosedType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             if ("true".equals(s)) {
                 return getState("OPEN");
             }
@@ -128,10 +138,15 @@ public enum CoffeeMachineChannelSelector implements ApplianceChannelSelector {
         return false;
     }
 
+    @Override
+    public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
+        return this.getState(s, dmd);
+    }
+
     @Override
     public State getState(String s, DeviceMetaData dmd) {
         if (dmd != null) {
-            String localizedValue = getMieleEnum(s, dmd);
+            String localizedValue = dmd.getMieleEnum(s);
             if (localizedValue == null) {
                 localizedValue = dmd.LocalizedValue;
             }
@@ -158,34 +173,4 @@ public enum CoffeeMachineChannelSelector implements ApplianceChannelSelector {
 
         return null;
     }
-
-    public State getTextState(String s, DeviceMetaData dmd, Map<String, String> valueMap, String prefix) {
-        if ("0".equals(s)) {
-            return UnDefType.UNDEF;
-        }
-
-        if (dmd == null || dmd.LocalizedValue == null || dmd.LocalizedValue.startsWith(prefix)) {
-            String text = valueMap.get(s);
-            if (text != null) {
-                return getState(text);
-            }
-            if (dmd == null || dmd.LocalizedValue == null) {
-                return getState(prefix + s);
-            }
-        }
-
-        return null;
-    }
-
-    public String getMieleEnum(String s, DeviceMetaData dmd) {
-        if (dmd.MieleEnum != null) {
-            for (Entry<String, JsonElement> enumEntry : dmd.MieleEnum.entrySet()) {
-                if (enumEntry.getValue().getAsString().trim().equals(s.trim())) {
-                    return enumEntry.getKey();
-                }
-            }
-        }
-
-        return null;
-    }
 }
index cff9f134c5cc7fcd0a7b609f4012361e3142c1b6..a1d94851971dd446d137a3ed4b522f086c6b1db4 100644 (file)
@@ -15,6 +15,8 @@ package org.openhab.binding.miele.internal.handler;
 import static org.openhab.binding.miele.internal.MieleBindingConstants.APPLIANCE_ID;
 import static org.openhab.binding.miele.internal.MieleBindingConstants.MIELE_DEVICE_CLASS_COFFEE_SYSTEM;
 
+import org.openhab.core.i18n.LocaleProvider;
+import org.openhab.core.i18n.TranslationProvider;
 import org.openhab.core.library.types.OnOffType;
 import org.openhab.core.thing.ChannelUID;
 import org.openhab.core.thing.Thing;
@@ -37,8 +39,9 @@ public class CoffeeMachineHandler extends MieleApplianceHandler<CoffeeMachineCha
 
     private final Logger logger = LoggerFactory.getLogger(CoffeeMachineHandler.class);
 
-    public CoffeeMachineHandler(Thing thing) {
-        super(thing, CoffeeMachineChannelSelector.class, MIELE_DEVICE_CLASS_COFFEE_SYSTEM);
+    public CoffeeMachineHandler(Thing thing, TranslationProvider i18nProvider, LocaleProvider localeProvider) {
+        super(thing, i18nProvider, localeProvider, CoffeeMachineChannelSelector.class,
+                MIELE_DEVICE_CLASS_COFFEE_SYSTEM);
     }
 
     @Override
index d1281f43b82db5b0813a4eaa6d2ba6b8b94e222e..e855d059f141f913cc6da512df05dfe50f5b46e2 100644 (file)
@@ -19,6 +19,8 @@ import static org.openhab.binding.miele.internal.MieleBindingConstants.WATER_CON
 
 import java.math.BigDecimal;
 
+import org.openhab.core.i18n.LocaleProvider;
+import org.openhab.core.i18n.TranslationProvider;
 import org.openhab.core.library.types.OnOffType;
 import org.openhab.core.library.types.QuantityType;
 import org.openhab.core.library.unit.Units;
@@ -49,8 +51,8 @@ public class DishWasherHandler extends MieleApplianceHandler<DishwasherChannelSe
 
     private final Logger logger = LoggerFactory.getLogger(DishWasherHandler.class);
 
-    public DishWasherHandler(Thing thing) {
-        super(thing, DishwasherChannelSelector.class, MIELE_DEVICE_CLASS_DISHWASHER);
+    public DishWasherHandler(Thing thing, TranslationProvider i18nProvider, LocaleProvider localeProvider) {
+        super(thing, i18nProvider, localeProvider, DishwasherChannelSelector.class, MIELE_DEVICE_CLASS_DISHWASHER);
     }
 
     @Override
index c00f7fac593f15b19de55c52f5d2afc6644a4504..b6b33f2c581379af61526917f190d355e538fc94 100644 (file)
@@ -19,10 +19,11 @@ import java.lang.reflect.Method;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.TimeZone;
 
-import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData;
+import org.openhab.binding.miele.internal.DeviceMetaData;
+import org.openhab.binding.miele.internal.DeviceUtil;
+import org.openhab.binding.miele.internal.MieleTranslationProvider;
 import org.openhab.core.library.types.DateTimeType;
 import org.openhab.core.library.types.DecimalType;
 import org.openhab.core.library.types.OnOffType;
@@ -35,8 +36,6 @@ import org.openhab.core.types.UnDefType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.gson.JsonElement;
-
 /**
  * The {@link ApplianceChannelSelector} for dishwashers
  *
@@ -48,33 +47,44 @@ public enum DishwasherChannelSelector implements ApplianceChannelSelector {
 
     PRODUCT_TYPE("productTypeId", "productType", StringType.class, true, false),
     DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true, false),
-    STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false, false),
+    STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false, false) {
+        @Override
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
+            State state = DeviceUtil.getStateTextState(s, dmd, translationProvider);
+            if (state != null) {
+                return state;
+            }
+            return super.getState(s, dmd, translationProvider);
+        }
+    },
     STATE(null, STATE_CHANNEL_ID, DecimalType.class, false, false),
     PROGRAM_TEXT(PROGRAM_ID_PROPERTY_NAME, PROGRAM_TEXT_CHANNEL_ID, StringType.class, false, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
-            State state = getTextState(s, dmd, programs, MISSING_PROGRAM_TEXT_PREFIX);
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
+            State state = DeviceUtil.getTextState(s, dmd, translationProvider, programs, MISSING_PROGRAM_TEXT_PREFIX,
+                    MIELE_DISHWASHER_TEXT_PREFIX);
             if (state != null) {
                 return state;
             }
-            return super.getState(s, dmd);
+            return super.getState(s, dmd, translationProvider);
         }
     },
     PROGRAM(null, PROGRAM_CHANNEL_ID, DecimalType.class, false, false),
     PROGRAM_PHASE_TEXT(PHASE_PROPERTY_NAME, PHASE_TEXT_CHANNEL_ID, StringType.class, false, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
-            State state = getTextState(s, dmd, phases, MISSING_PHASE_TEXT_PREFIX);
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
+            State state = DeviceUtil.getTextState(s, dmd, translationProvider, phases, MISSING_PHASE_TEXT_PREFIX,
+                    MIELE_DISHWASHER_TEXT_PREFIX);
             if (state != null) {
                 return state;
             }
-            return super.getState(s, dmd);
+            return super.getState(s, dmd, translationProvider);
         }
     },
     PROGRAM_PHASE(RAW_PHASE_PROPERTY_NAME, PHASE_CHANNEL_ID, DecimalType.class, false, false),
     START_TIME("startTime", "start", DateTimeType.class, false, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             Date date = new Date();
             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
@@ -88,7 +98,7 @@ public enum DishwasherChannelSelector implements ApplianceChannelSelector {
     },
     DURATION("duration", "duration", DateTimeType.class, false, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             Date date = new Date();
             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
@@ -102,7 +112,7 @@ public enum DishwasherChannelSelector implements ApplianceChannelSelector {
     },
     ELAPSED_TIME("elapsedTime", "elapsed", DateTimeType.class, false, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             Date date = new Date();
             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
@@ -116,7 +126,7 @@ public enum DishwasherChannelSelector implements ApplianceChannelSelector {
     },
     FINISH_TIME("finishTime", "finish", DateTimeType.class, false, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             Date date = new Date();
             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
@@ -130,7 +140,7 @@ public enum DishwasherChannelSelector implements ApplianceChannelSelector {
     },
     DOOR("signalDoor", "door", OpenClosedType.class, false, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             if ("true".equals(s)) {
                 return getState("OPEN");
             }
@@ -150,13 +160,13 @@ public enum DishwasherChannelSelector implements ApplianceChannelSelector {
 
     private final Logger logger = LoggerFactory.getLogger(DishwasherChannelSelector.class);
 
-    private static final Map<String, String> programs = Map.ofEntries(entry("26", "Pots & Pans"),
-            entry("27", "Clean Machine"), entry("28", "Economy"), entry("30", "Normal"), entry("32", "Sensor Wash"),
-            entry("34", "Energy Saver"), entry("35", "China & Crystal"), entry("36", "Extra Quiet"),
-            entry("37", "SaniWash"), entry("38", "QuickPowerWash"), entry("42", "Tall items"));
+    private static final Map<String, String> programs = Map.ofEntries(entry("26", "intensive"),
+            entry("27", "maintenance-programme"), entry("28", "eco"), entry("30", "normal"), entry("32", "automatic"),
+            entry("34", "solarsave"), entry("35", "gentle"), entry("36", "extra-quiet"), entry("37", "hygiene"),
+            entry("38", "quickpowerwash"), entry("42", "tall-items"));
 
-    private static final Map<String, String> phases = Map.ofEntries(entry("2", "Pre-Wash"), entry("3", "Main Wash"),
-            entry("4", "Rinses"), entry("6", "Final rinse"), entry("7", "Drying"), entry("8", "Finished"));
+    private static final Map<String, String> phases = Map.ofEntries(entry("2", "pre-wash"), entry("3", "main-wash"),
+            entry("4", "rinses"), entry("6", "final-rinse"), entry("7", "drying"), entry("8", "finished"));
 
     private final String mieleID;
     private final String channelID;
@@ -198,10 +208,15 @@ public enum DishwasherChannelSelector implements ApplianceChannelSelector {
         return isExtendedState;
     }
 
+    @Override
+    public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
+        return this.getState(s, dmd);
+    }
+
     @Override
     public State getState(String s, DeviceMetaData dmd) {
         if (dmd != null) {
-            String localizedValue = getMieleEnum(s, dmd);
+            String localizedValue = dmd.getMieleEnum(s);
             if (localizedValue == null) {
                 localizedValue = dmd.LocalizedValue;
             }
@@ -228,34 +243,4 @@ public enum DishwasherChannelSelector implements ApplianceChannelSelector {
 
         return null;
     }
-
-    public State getTextState(String s, DeviceMetaData dmd, Map<String, String> valueMap, String prefix) {
-        if ("0".equals(s)) {
-            return UnDefType.UNDEF;
-        }
-
-        if (dmd == null || dmd.LocalizedValue == null || dmd.LocalizedValue.startsWith(prefix)) {
-            String text = valueMap.get(s);
-            if (text != null) {
-                return getState(text);
-            }
-            if (dmd == null || dmd.LocalizedValue == null) {
-                return getState(prefix + s);
-            }
-        }
-
-        return null;
-    }
-
-    public String getMieleEnum(String s, DeviceMetaData dmd) {
-        if (dmd.MieleEnum != null) {
-            for (Entry<String, JsonElement> enumEntry : dmd.MieleEnum.entrySet()) {
-                if (enumEntry.getValue().getAsString().trim().equals(s.trim())) {
-                    return enumEntry.getKey();
-                }
-            }
-        }
-
-        return null;
-    }
 }
index f34623d67789026c3f4a3ebca10f46f3f342d699..df5ec2b5bed3aa7adfb771c2dbf6ed762d684e61 100644 (file)
@@ -16,7 +16,7 @@ package org.openhab.binding.miele.internal.handler;
  * Appliance handlers can implement the {@link ExtendedDeviceStateListener} interface
  * to extract additional information from the ExtendedDeviceState property.
  *
- * @author Jacob Laursen - Added power/water consumption channels
+ * @author Jacob Laursen - Initial contribution
  */
 public interface ExtendedDeviceStateListener {
     void onApplianceExtendedStateChanged(byte[] extendedDeviceState);
index c97cffd0fc5275dc1ee8dba7afa6a0c121c13600..7d90b846a940bf682438760a6381de49953c0a45 100644 (file)
@@ -15,10 +15,10 @@ package org.openhab.binding.miele.internal.handler;
 import static org.openhab.binding.miele.internal.MieleBindingConstants.*;
 
 import java.lang.reflect.Method;
-import java.util.Map.Entry;
 
+import org.openhab.binding.miele.internal.DeviceMetaData;
 import org.openhab.binding.miele.internal.DeviceUtil;
-import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData;
+import org.openhab.binding.miele.internal.MieleTranslationProvider;
 import org.openhab.core.library.types.DecimalType;
 import org.openhab.core.library.types.OnOffType;
 import org.openhab.core.library.types.OpenClosedType;
@@ -30,8 +30,6 @@ import org.openhab.core.types.UnDefType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.gson.JsonElement;
-
 /**
  * The {@link ApplianceChannelSelector} for fridges
  *
@@ -42,25 +40,34 @@ public enum FridgeChannelSelector implements ApplianceChannelSelector {
 
     PRODUCT_TYPE("productTypeId", "productType", StringType.class, true),
     DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true),
-    STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false),
+    STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false) {
+        @Override
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
+            State state = DeviceUtil.getStateTextState(s, dmd, translationProvider);
+            if (state != null) {
+                return state;
+            }
+            return super.getState(s, dmd, translationProvider);
+        }
+    },
     STATE(null, STATE_CHANNEL_ID, DecimalType.class, false),
     SUPERCOOL(null, SUPERCOOL_CHANNEL_ID, OnOffType.class, false),
     FRIDGECURRENTTEMP("currentTemperature", "current", QuantityType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             return getTemperatureState(s);
         }
     },
     FRIDGETARGETTEMP("targetTemperature", "target", QuantityType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             return getTemperatureState(s);
         }
     },
     DOOR("signalDoor", "door", OpenClosedType.class, false) {
         @Override
 
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             if ("true".equals(s)) {
                 return getState("OPEN");
             }
@@ -113,10 +120,15 @@ public enum FridgeChannelSelector implements ApplianceChannelSelector {
         return false;
     }
 
+    @Override
+    public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
+        return this.getState(s, dmd);
+    }
+
     @Override
     public State getState(String s, DeviceMetaData dmd) {
         if (dmd != null) {
-            String localizedValue = getMieleEnum(s, dmd);
+            String localizedValue = dmd.getMieleEnum(s);
             if (localizedValue == null) {
                 localizedValue = dmd.LocalizedValue;
             }
@@ -152,16 +164,4 @@ public enum FridgeChannelSelector implements ApplianceChannelSelector {
             return UnDefType.UNDEF;
         }
     }
-
-    public String getMieleEnum(String s, DeviceMetaData dmd) {
-        if (dmd.MieleEnum != null) {
-            for (Entry<String, JsonElement> enumEntry : dmd.MieleEnum.entrySet()) {
-                if (enumEntry.getValue().getAsString().trim().equals(s.trim())) {
-                    return enumEntry.getKey();
-                }
-            }
-        }
-
-        return null;
-    }
 }
index 14d332dc0a1dcc1e768454542d251eea82bd7511..d81db220b288ddaca17c7d99f37b215d44612834 100644 (file)
@@ -15,10 +15,10 @@ package org.openhab.binding.miele.internal.handler;
 import static org.openhab.binding.miele.internal.MieleBindingConstants.*;
 
 import java.lang.reflect.Method;
-import java.util.Map.Entry;
 
+import org.openhab.binding.miele.internal.DeviceMetaData;
 import org.openhab.binding.miele.internal.DeviceUtil;
-import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData;
+import org.openhab.binding.miele.internal.MieleTranslationProvider;
 import org.openhab.core.library.types.DecimalType;
 import org.openhab.core.library.types.OnOffType;
 import org.openhab.core.library.types.OpenClosedType;
@@ -30,8 +30,6 @@ import org.openhab.core.types.UnDefType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.gson.JsonElement;
-
 /**
  * The {@link ApplianceChannelSelector} for fridges with
  * a freezer compartment
@@ -43,7 +41,16 @@ public enum FridgeFreezerChannelSelector implements ApplianceChannelSelector {
 
     PRODUCT_TYPE("productTypeId", "productType", StringType.class, true),
     DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true),
-    STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false),
+    STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false) {
+        @Override
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
+            State state = DeviceUtil.getStateTextState(s, dmd, translationProvider);
+            if (state != null) {
+                return state;
+            }
+            return super.getState(s, dmd, translationProvider);
+        }
+    },
     STATE(null, STATE_CHANNEL_ID, DecimalType.class, false),
     FREEZERSTATE("freezerState", "freezerstate", StringType.class, false),
     FRIDGESTATE("fridgeState", "fridgestate", StringType.class, false),
@@ -51,32 +58,32 @@ public enum FridgeFreezerChannelSelector implements ApplianceChannelSelector {
     SUPERFREEZE(null, SUPERFREEZE_CHANNEL_ID, OnOffType.class, false),
     FREEZERCURRENTTEMP("freezerCurrentTemperature", "freezercurrent", QuantityType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             return getTemperatureState(s);
         }
     },
     FREEZERTARGETTEMP("freezerTargetTemperature", "freezertarget", QuantityType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             return getTemperatureState(s);
         }
     },
     FRIDGECURRENTTEMP("fridgeCurrentTemperature", "fridgecurrent", QuantityType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             return getTemperatureState(s);
         }
     },
     FRIDGETARGETTEMP("fridgeTargetTemperature", "fridgetarget", QuantityType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             return getTemperatureState(s);
         }
     },
     DOOR("signalDoor", "door", OpenClosedType.class, false) {
         @Override
 
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             if ("true".equals(s)) {
                 return getState("OPEN");
             }
@@ -130,10 +137,15 @@ public enum FridgeFreezerChannelSelector implements ApplianceChannelSelector {
         return false;
     }
 
+    @Override
+    public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
+        return this.getState(s, dmd);
+    }
+
     @Override
     public State getState(String s, DeviceMetaData dmd) {
         if (dmd != null) {
-            String localizedValue = getMieleEnum(s, dmd);
+            String localizedValue = dmd.getMieleEnum(s);
             if (localizedValue == null) {
                 localizedValue = dmd.LocalizedValue;
             }
@@ -169,16 +181,4 @@ public enum FridgeFreezerChannelSelector implements ApplianceChannelSelector {
             return UnDefType.UNDEF;
         }
     }
-
-    public String getMieleEnum(String s, DeviceMetaData dmd) {
-        if (dmd.MieleEnum != null) {
-            for (Entry<String, JsonElement> enumEntry : dmd.MieleEnum.entrySet()) {
-                if (enumEntry.getValue().getAsString().trim().equals(s.trim())) {
-                    return enumEntry.getKey();
-                }
-            }
-        }
-
-        return null;
-    }
 }
index be9d5926cfbd199cfca67a98b97bbea69f6c9722..82be8695190a213af1ee0dd4fd0412491cfe617b 100644 (file)
@@ -15,6 +15,8 @@ package org.openhab.binding.miele.internal.handler;
 import static org.openhab.binding.miele.internal.MieleBindingConstants.*;
 
 import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceProperty;
+import org.openhab.core.i18n.LocaleProvider;
+import org.openhab.core.i18n.TranslationProvider;
 import org.openhab.core.library.types.OnOffType;
 import org.openhab.core.thing.ChannelUID;
 import org.openhab.core.thing.Thing;
@@ -37,8 +39,9 @@ public class FridgeFreezerHandler extends MieleApplianceHandler<FridgeFreezerCha
 
     private final Logger logger = LoggerFactory.getLogger(FridgeFreezerHandler.class);
 
-    public FridgeFreezerHandler(Thing thing) {
-        super(thing, FridgeFreezerChannelSelector.class, MIELE_DEVICE_CLASS_FRIDGE_FREEZER);
+    public FridgeFreezerHandler(Thing thing, TranslationProvider i18nProvider, LocaleProvider localeProvider) {
+        super(thing, i18nProvider, localeProvider, FridgeFreezerChannelSelector.class,
+                MIELE_DEVICE_CLASS_FRIDGE_FREEZER);
     }
 
     @Override
index 84bd5509f88f0fb8d4ed0ec0d81c4373015b723d..369a868659b0b72811b81aba2d6c42bbffd711e7 100644 (file)
@@ -15,6 +15,8 @@ package org.openhab.binding.miele.internal.handler;
 import static org.openhab.binding.miele.internal.MieleBindingConstants.*;
 
 import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceProperty;
+import org.openhab.core.i18n.LocaleProvider;
+import org.openhab.core.i18n.TranslationProvider;
 import org.openhab.core.library.types.OnOffType;
 import org.openhab.core.thing.ChannelUID;
 import org.openhab.core.thing.Thing;
@@ -38,8 +40,8 @@ public class FridgeHandler extends MieleApplianceHandler<FridgeChannelSelector>
 
     private final Logger logger = LoggerFactory.getLogger(FridgeHandler.class);
 
-    public FridgeHandler(Thing thing) {
-        super(thing, FridgeChannelSelector.class, MIELE_DEVICE_CLASS_FRIDGE);
+    public FridgeHandler(Thing thing, TranslationProvider i18nProvider, LocaleProvider localeProvider) {
+        super(thing, i18nProvider, localeProvider, FridgeChannelSelector.class, MIELE_DEVICE_CLASS_FRIDGE);
     }
 
     @Override
index abe82e7c86d654d5d4e7c1fc4e97e11cc2ce2b9c..9080efcae75c3db6af29002430cf7eeddc0469e1 100644 (file)
@@ -15,9 +15,10 @@ package org.openhab.binding.miele.internal.handler;
 import static org.openhab.binding.miele.internal.MieleBindingConstants.*;
 
 import java.lang.reflect.Method;
-import java.util.Map.Entry;
 
-import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData;
+import org.openhab.binding.miele.internal.DeviceMetaData;
+import org.openhab.binding.miele.internal.DeviceUtil;
+import org.openhab.binding.miele.internal.MieleTranslationProvider;
 import org.openhab.core.library.types.DecimalType;
 import org.openhab.core.library.types.StringType;
 import org.openhab.core.types.State;
@@ -25,8 +26,6 @@ import org.openhab.core.types.Type;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.gson.JsonElement;
-
 /**
  * The {@link ApplianceChannelSelector} for hobs
  *
@@ -37,13 +36,22 @@ public enum HobChannelSelector implements ApplianceChannelSelector {
 
     PRODUCT_TYPE("productTypeId", "productType", StringType.class, true),
     DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true),
-    STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false),
+    STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false) {
+        @Override
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
+            State state = DeviceUtil.getStateTextState(s, dmd, translationProvider);
+            if (state != null) {
+                return state;
+            }
+            return super.getState(s, dmd, translationProvider);
+        }
+    },
     STATE(null, STATE_CHANNEL_ID, DecimalType.class, false),
     PLATES("plateNumbers", "plates", DecimalType.class, true),
     PLATE1_POWER("plate1PowerStep", "plate1power", DecimalType.class, false),
     PLATE1_HEAT("plate1RemainingHeat", "plate1heat", DecimalType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             // If there is remaining heat, the device metadata contains some informative string which can not be
             // converted into a DecimalType. We therefore ignore the metadata and return the device property value as a
             // State
@@ -54,7 +62,7 @@ public enum HobChannelSelector implements ApplianceChannelSelector {
     PLATE2_POWER("plate2PowerStep", "plate2power", DecimalType.class, false),
     PLATE2_HEAT("plate2RemainingHeat", "plate2heat", DecimalType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             return getState(s);
         }
     },
@@ -62,7 +70,7 @@ public enum HobChannelSelector implements ApplianceChannelSelector {
     PLATE3_POWER("plate3PowerStep", "plate3power", DecimalType.class, false),
     PLATE3_HEAT("plate3RemainingHeat", "plate3heat", DecimalType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             return getState(s);
         }
     },
@@ -70,7 +78,7 @@ public enum HobChannelSelector implements ApplianceChannelSelector {
     PLATE4_POWER("plate4PowerStep", "plate4power", DecimalType.class, false),
     PLATE4_HEAT("plate4RemainingHeat", "plate4heat", DecimalType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             return getState(s);
         }
     },
@@ -78,7 +86,7 @@ public enum HobChannelSelector implements ApplianceChannelSelector {
     PLATE5_POWER("plate5PowerStep", "plate5power", DecimalType.class, false),
     PLATE5_HEAT("plate5RemainingHeat", "plate5heat", DecimalType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             return getState(s);
         }
     },
@@ -86,7 +94,7 @@ public enum HobChannelSelector implements ApplianceChannelSelector {
     PLATE6_POWER("plate6PowerStep", "plate6power", DecimalType.class, false),
     PLATE6_HEAT("plate6RemainingHeat", "plate6heat", DecimalType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             return getState(s);
         }
     },
@@ -131,10 +139,15 @@ public enum HobChannelSelector implements ApplianceChannelSelector {
         return false;
     }
 
+    @Override
+    public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
+        return this.getState(s, dmd);
+    }
+
     @Override
     public State getState(String s, DeviceMetaData dmd) {
         if (dmd != null) {
-            String localizedValue = getMieleEnum(s, dmd);
+            String localizedValue = dmd.getMieleEnum(s);
             if (localizedValue == null) {
                 localizedValue = dmd.LocalizedValue;
             }
@@ -161,16 +174,4 @@ public enum HobChannelSelector implements ApplianceChannelSelector {
 
         return null;
     }
-
-    public String getMieleEnum(String s, DeviceMetaData dmd) {
-        if (dmd.MieleEnum != null) {
-            for (Entry<String, JsonElement> enumEntry : dmd.MieleEnum.entrySet()) {
-                if (enumEntry.getValue().getAsString().trim().equals(s.trim())) {
-                    return enumEntry.getKey();
-                }
-            }
-        }
-
-        return null;
-    }
 }
index bbbde6f630030153ca730edf880e28f03d9f8c09..ad6ac3efc6dc23e0cac697f2734d730c5ac270f4 100644 (file)
@@ -14,6 +14,8 @@ package org.openhab.binding.miele.internal.handler;
 
 import static org.openhab.binding.miele.internal.MieleBindingConstants.MIELE_DEVICE_CLASS_HOB;
 
+import org.openhab.core.i18n.LocaleProvider;
+import org.openhab.core.i18n.TranslationProvider;
 import org.openhab.core.thing.ChannelUID;
 import org.openhab.core.thing.Thing;
 import org.openhab.core.types.Command;
@@ -27,8 +29,8 @@ import org.openhab.core.types.Command;
  */
 public class HobHandler extends MieleApplianceHandler<HobChannelSelector> {
 
-    public HobHandler(Thing thing) {
-        super(thing, HobChannelSelector.class, MIELE_DEVICE_CLASS_HOB);
+    public HobHandler(Thing thing, TranslationProvider i18nProvider, LocaleProvider localeProvider) {
+        super(thing, i18nProvider, localeProvider, HobChannelSelector.class, MIELE_DEVICE_CLASS_HOB);
     }
 
     @Override
index 623c9830d335cb799c746fbd9c7d8d3716f53063..b216bb8fe9bdec9d35a1cc11b93a42901dcd7f59 100644 (file)
@@ -15,9 +15,10 @@ package org.openhab.binding.miele.internal.handler;
 import static org.openhab.binding.miele.internal.MieleBindingConstants.*;
 
 import java.lang.reflect.Method;
-import java.util.Map.Entry;
 
-import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData;
+import org.openhab.binding.miele.internal.DeviceMetaData;
+import org.openhab.binding.miele.internal.DeviceUtil;
+import org.openhab.binding.miele.internal.MieleTranslationProvider;
 import org.openhab.core.library.types.DecimalType;
 import org.openhab.core.library.types.OnOffType;
 import org.openhab.core.library.types.StringType;
@@ -27,8 +28,6 @@ import org.openhab.core.types.UnDefType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.gson.JsonElement;
-
 /**
  * The {@link ApplianceChannelSelector} for ventilation hoods
  *
@@ -39,13 +38,22 @@ public enum HoodChannelSelector implements ApplianceChannelSelector {
 
     PRODUCT_TYPE("productTypeId", "productType", StringType.class, true),
     DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true),
-    STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false),
+    STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false) {
+        @Override
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
+            State state = DeviceUtil.getStateTextState(s, dmd, translationProvider);
+            if (state != null) {
+                return state;
+            }
+            return super.getState(s, dmd, translationProvider);
+        }
+    },
     STATE(null, STATE_CHANNEL_ID, DecimalType.class, false),
     VENTILATION("ventilationPower", "ventilation", DecimalType.class, false),
     LIGHT("lightingStatus", "light", OnOffType.class, false) {
         @Override
 
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             if ("true".equals(s)) {
                 return getState("ON");
             }
@@ -98,10 +106,15 @@ public enum HoodChannelSelector implements ApplianceChannelSelector {
         return false;
     }
 
+    @Override
+    public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
+        return this.getState(s, dmd);
+    }
+
     @Override
     public State getState(String s, DeviceMetaData dmd) {
         if (dmd != null) {
-            String localizedValue = getMieleEnum(s, dmd);
+            String localizedValue = dmd.getMieleEnum(s);
             if (localizedValue == null) {
                 localizedValue = dmd.LocalizedValue;
             }
@@ -128,16 +141,4 @@ public enum HoodChannelSelector implements ApplianceChannelSelector {
 
         return null;
     }
-
-    public String getMieleEnum(String s, DeviceMetaData dmd) {
-        if (dmd.MieleEnum != null) {
-            for (Entry<String, JsonElement> enumEntry : dmd.MieleEnum.entrySet()) {
-                if (enumEntry.getValue().getAsString().trim().equals(s.trim())) {
-                    return enumEntry.getKey();
-                }
-            }
-        }
-
-        return null;
-    }
 }
index 2211e0d26c848b8d4918c8039cd466e56d16eb20..bdc9350b3222a3ebadc7a5bd72de227c543d14bd 100644 (file)
@@ -15,6 +15,8 @@ package org.openhab.binding.miele.internal.handler;
 import static org.openhab.binding.miele.internal.MieleBindingConstants.APPLIANCE_ID;
 import static org.openhab.binding.miele.internal.MieleBindingConstants.MIELE_DEVICE_CLASS_HOOD;
 
+import org.openhab.core.i18n.LocaleProvider;
+import org.openhab.core.i18n.TranslationProvider;
 import org.openhab.core.library.types.OnOffType;
 import org.openhab.core.thing.ChannelUID;
 import org.openhab.core.thing.Thing;
@@ -37,8 +39,8 @@ public class HoodHandler extends MieleApplianceHandler<HoodChannelSelector> {
 
     private final Logger logger = LoggerFactory.getLogger(HoodHandler.class);
 
-    public HoodHandler(Thing thing) {
-        super(thing, HoodChannelSelector.class, MIELE_DEVICE_CLASS_HOOD);
+    public HoodHandler(Thing thing, TranslationProvider i18nProvider, LocaleProvider localeProvider) {
+        super(thing, i18nProvider, localeProvider, HoodChannelSelector.class, MIELE_DEVICE_CLASS_HOOD);
     }
 
     @Override
index 9c84e1a912a3e20a9046a7533a088ff5dc165fbe..c0b4d4f9d866fd67d5312bad515f9ba5ae3f4193 100644 (file)
@@ -15,18 +15,23 @@ package org.openhab.binding.miele.internal.handler;
 import static org.openhab.binding.miele.internal.MieleBindingConstants.*;
 
 import java.util.HashMap;
+import java.util.IllformedLocaleException;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import org.eclipse.jdt.annotation.NonNull;
+import org.openhab.binding.miele.internal.DeviceMetaData;
 import org.openhab.binding.miele.internal.DeviceUtil;
 import org.openhab.binding.miele.internal.FullyQualifiedApplianceIdentifier;
+import org.openhab.binding.miele.internal.MieleTranslationProvider;
 import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceClassObject;
-import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData;
 import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceProperty;
 import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.HomeDevice;
+import org.openhab.core.i18n.LocaleProvider;
+import org.openhab.core.i18n.TranslationProvider;
 import org.openhab.core.thing.Bridge;
 import org.openhab.core.thing.ChannelUID;
 import org.openhab.core.thing.Thing;
@@ -71,13 +76,19 @@ public abstract class MieleApplianceHandler<E extends Enum<E> & ApplianceChannel
 
     protected String applianceId;
     protected MieleBridgeHandler bridgeHandler;
+    protected TranslationProvider i18nProvider;
+    protected LocaleProvider localeProvider;
+    protected MieleTranslationProvider translationProvider;
     private Class<E> selectorType;
     protected String modelID;
 
     protected Map<String, String> metaDataCache = new HashMap<>();
 
-    public MieleApplianceHandler(Thing thing, Class<E> selectorType, String modelID) {
+    public MieleApplianceHandler(Thing thing, TranslationProvider i18nProvider, LocaleProvider localeProvider,
+            Class<E> selectorType, String modelID) {
         super(thing);
+        this.i18nProvider = i18nProvider;
+        this.localeProvider = localeProvider;
         this.selectorType = selectorType;
         this.modelID = modelID;
     }
@@ -129,6 +140,25 @@ public abstract class MieleApplianceHandler<E extends Enum<E> & ApplianceChannel
         if (bridge != null && getMieleBridgeHandler() != null) {
             ThingStatusInfo statusInfo = bridge.getStatusInfo();
             updateStatus(statusInfo.getStatus(), statusInfo.getStatusDetail(), statusInfo.getDescription());
+            initializeTranslationProvider(bridge);
+        }
+    }
+
+    private void initializeTranslationProvider(Bridge bridge) {
+        Locale locale = null;
+        String language = (String) bridge.getConfiguration().get(LANGUAGE);
+        if (language != null && !language.isBlank()) {
+            try {
+                locale = new Locale.Builder().setLanguageTag(language).build();
+            } catch (IllformedLocaleException e) {
+                logger.error("Invalid language configured: {}", e.getMessage());
+            }
+        }
+        if (locale == null) {
+            logger.debug("No language configured, using system language.");
+            this.translationProvider = new MieleTranslationProvider(i18nProvider, localeProvider);
+        } else {
+            this.translationProvider = new MieleTranslationProvider(i18nProvider, localeProvider, locale);
         }
     }
 
@@ -240,7 +270,7 @@ public abstract class MieleApplianceHandler<E extends Enum<E> & ApplianceChannel
                     ChannelUID theChannelUID = new ChannelUID(getThing().getUID(), selector.getChannelID());
 
                     if (dp.Value != null) {
-                        State state = selector.getState(dpValue, dmd);
+                        State state = selector.getState(dpValue, dmd, this.translationProvider);
                         logger.trace("Update state of {} with getState '{}'", theChannelUID, state);
                         updateState(theChannelUID, state);
                         updateRawChannel(dp.Name, dpValue);
@@ -249,10 +279,11 @@ public abstract class MieleApplianceHandler<E extends Enum<E> & ApplianceChannel
                     }
                 } else {
                     logger.debug("Updating the property '{}' of '{}' to '{}'", selector.getChannelID(),
-                            getThing().getUID(), selector.getState(dpValue, dmd).toString());
+                            getThing().getUID(), selector.getState(dpValue, dmd, this.translationProvider).toString());
                     @NonNull
                     Map<@NonNull String, @NonNull String> properties = editProperties();
-                    properties.put(selector.getChannelID(), selector.getState(dpValue, dmd).toString());
+                    properties.put(selector.getChannelID(),
+                            selector.getState(dpValue, dmd, this.translationProvider).toString());
                     updateProperties(properties);
                 }
             }
index 78ea4e8bc6233246ab1838c225da276fc9c6f338..47849b1f4c590353911c4e59da8f0a8c9e3371fa 100644 (file)
@@ -31,8 +31,10 @@ import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.IllformedLocaleException;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Random;
@@ -50,6 +52,7 @@ import java.util.zip.GZIPInputStream;
 import org.eclipse.jdt.annotation.NonNull;
 import org.openhab.binding.miele.internal.FullyQualifiedApplianceIdentifier;
 import org.openhab.core.common.NamedThreadFactory;
+import org.openhab.core.config.core.Configuration;
 import org.openhab.core.thing.Bridge;
 import org.openhab.core.thing.ChannelUID;
 import org.openhab.core.thing.Thing;
@@ -209,15 +212,6 @@ public class MieleBridgeHandler extends BaseBridgeHandler {
         }
     }
 
-    public class DeviceMetaData {
-        public String Filter;
-        public String description;
-        public String LocalizedID;
-        public String LocalizedValue;
-        public JsonObject MieleEnum;
-        public String access;
-    }
-
     public MieleBridgeHandler(Bridge bridge) {
         super(bridge);
     }
@@ -226,31 +220,59 @@ public class MieleBridgeHandler extends BaseBridgeHandler {
     public void initialize() {
         logger.debug("Initializing the Miele bridge handler.");
 
-        if (getConfig().get(HOST) != null && getConfig().get(INTERFACE) != null) {
-            if (IP_PATTERN.matcher((String) getConfig().get(HOST)).matches()
-                    && IP_PATTERN.matcher((String) getConfig().get(INTERFACE)).matches()) {
-                try {
-                    url = new URL("http://" + (String) getConfig().get(HOST) + "/remote/json-rpc");
-                } catch (MalformedURLException e) {
-                    logger.debug("An exception occurred while defining an URL :'{}'", e.getMessage());
-                    updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.CONFIGURATION_ERROR, e.getMessage());
-                    return;
-                }
+        if (!validateConfig(getConfig())) {
+            return;
+        }
 
-                // for future usage - no headers to be set for now
-                headers = new HashMap<>();
+        try {
+            url = new URL("http://" + (String) getConfig().get(HOST) + "/remote/json-rpc");
+        } catch (MalformedURLException e) {
+            logger.debug("An exception occurred while defining an URL :'{}'", e.getMessage());
+            updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.CONFIGURATION_ERROR, e.getMessage());
+            return;
+        }
+
+        // for future usage - no headers to be set for now
+        headers = new HashMap<>();
+
+        onUpdate();
+        lastBridgeConnectionState = false;
+        updateStatus(ThingStatus.UNKNOWN);
+    }
 
-                onUpdate();
-                updateStatus(ThingStatus.UNKNOWN);
-            } else {
+    private boolean validateConfig(Configuration config) {
+        if (config.get(HOST) == null || ((String) config.get(HOST)).isBlank()) {
+            updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.CONFIGURATION_ERROR,
+                    "@text/offline.configuration-error.ip-address-not-set");
+            return false;
+        }
+        if (config.get(INTERFACE) == null || ((String) config.get(INTERFACE)).isBlank()) {
+            updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.CONFIGURATION_ERROR,
+                    "@text/offline.configuration-error.ip-multicast-interface-not-set");
+            return false;
+        }
+        if (!IP_PATTERN.matcher((String) config.get(HOST)).matches()) {
+            updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.CONFIGURATION_ERROR,
+                    "@text/offline.configuration-error.invalid-ip-gateway [\"" + config.get(HOST) + "\"]");
+            return false;
+        }
+        if (!IP_PATTERN.matcher((String) config.get(INTERFACE)).matches()) {
+            updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.CONFIGURATION_ERROR,
+                    "@text/offline.configuration-error.invalid-ip-multicast-interface [\"" + config.get(INTERFACE)
+                            + "\"]");
+            return false;
+        }
+        String language = (String) config.get(LANGUAGE);
+        if (language != null && !language.isBlank()) {
+            try {
+                new Locale.Builder().setLanguageTag(language).build();
+            } catch (IllformedLocaleException e) {
                 updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.CONFIGURATION_ERROR,
-                        "Invalid IP address for the Miele@Home gateway or multicast interface:" + getConfig().get(HOST)
-                                + "/" + getConfig().get(INTERFACE));
+                        "@text/offline.configuration-error.invalid-language [\"" + language + "\"]");
+                return false;
             }
-        } else {
-            updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.CONFIGURATION_ERROR,
-                    "Cannot connect to the Miele gateway. host IP address or multicast interface are not set.");
         }
+        return true;
     }
 
     private Runnable pollingRunnable = new Runnable() {
index f6814a8163a9af89ba5b5522f8479eaba2aa329e..3bd6a1b50b1a0e866611e65d3ad52502ef2c5416 100644 (file)
@@ -19,11 +19,11 @@ import java.lang.reflect.Method;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.TimeZone;
 
+import org.openhab.binding.miele.internal.DeviceMetaData;
 import org.openhab.binding.miele.internal.DeviceUtil;
-import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData;
+import org.openhab.binding.miele.internal.MieleTranslationProvider;
 import org.openhab.core.library.types.DateTimeType;
 import org.openhab.core.library.types.DecimalType;
 import org.openhab.core.library.types.OnOffType;
@@ -36,8 +36,6 @@ import org.openhab.core.types.UnDefType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.gson.JsonElement;
-
 /**
  * The {@link ApplianceChannelSelector} for ovens
  *
@@ -49,25 +47,35 @@ public enum OvenChannelSelector implements ApplianceChannelSelector {
 
     PRODUCT_TYPE("productTypeId", "productType", StringType.class, true),
     DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true),
-    STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false),
+    STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false) {
+        @Override
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
+            State state = DeviceUtil.getStateTextState(s, dmd, translationProvider);
+            if (state != null) {
+                return state;
+            }
+            return super.getState(s, dmd, translationProvider);
+        }
+    },
     STATE(null, STATE_CHANNEL_ID, DecimalType.class, false),
     PROGRAM_TEXT(PROGRAM_ID_PROPERTY_NAME, PROGRAM_TEXT_CHANNEL_ID, StringType.class, false),
     PROGRAM(null, PROGRAM_CHANNEL_ID, DecimalType.class, false),
     PROGRAMTYPE("programType", "type", StringType.class, false),
     PROGRAM_PHASE_TEXT(PHASE_PROPERTY_NAME, PHASE_TEXT_CHANNEL_ID, StringType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
-            State state = getTextState(s, dmd, phases, MISSING_PHASE_TEXT_PREFIX);
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
+            State state = DeviceUtil.getTextState(s, dmd, translationProvider, phases, MISSING_PHASE_TEXT_PREFIX,
+                    MIELE_OVEN_TEXT_PREFIX);
             if (state != null) {
                 return state;
             }
-            return super.getState(s, dmd);
+            return super.getState(s, dmd, translationProvider);
         }
     },
     PROGRAM_PHASE(RAW_PHASE_PROPERTY_NAME, PHASE_CHANNEL_ID, DecimalType.class, false),
     START_TIME("startTime", "start", DateTimeType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             Date date = new Date();
             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
@@ -81,7 +89,7 @@ public enum OvenChannelSelector implements ApplianceChannelSelector {
     },
     DURATION("duration", "duration", DateTimeType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             Date date = new Date();
             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
@@ -95,7 +103,7 @@ public enum OvenChannelSelector implements ApplianceChannelSelector {
     },
     ELAPSED_TIME("elapsedTime", "elapsed", DateTimeType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             Date date = new Date();
             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
@@ -109,7 +117,7 @@ public enum OvenChannelSelector implements ApplianceChannelSelector {
     },
     FINISH_TIME("finishTime", "finish", DateTimeType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             Date date = new Date();
             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
@@ -123,32 +131,32 @@ public enum OvenChannelSelector implements ApplianceChannelSelector {
     },
     TARGET_TEMP("targetTemperature", "target", QuantityType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             return getTemperatureState(s);
         }
     },
     MEASURED_TEMP("measuredTemperature", "measured", QuantityType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             return getTemperatureState(s);
         }
     },
     DEVICE_TEMP_ONE("deviceTemperature1", "temp1", QuantityType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             return getTemperatureState(s);
         }
     },
     DEVICE_TEMP_TWO("deviceTemperature2", "temp2", QuantityType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             return getTemperatureState(s);
         }
     },
     DOOR("signalDoor", "door", OpenClosedType.class, false) {
         @Override
 
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             if ("true".equals(s)) {
                 return getState("OPEN");
             }
@@ -165,9 +173,9 @@ public enum OvenChannelSelector implements ApplianceChannelSelector {
 
     private final Logger logger = LoggerFactory.getLogger(OvenChannelSelector.class);
 
-    private static final Map<String, String> phases = Map.ofEntries(entry("1", "Heating"), entry("2", "Temp. hold"),
-            entry("3", "Door Open"), entry("4", "Pyrolysis"), entry("7", "Lighting"), entry("8", "Searing phase"),
-            entry("10", "Defrost"), entry("11", "Cooling down"), entry("12", "Energy save phase"));
+    private static final Map<String, String> phases = Map.ofEntries(entry("1", "heating"), entry("2", "temp-hold"),
+            entry("3", "door-open"), entry("4", "pyrolysis"), entry("7", "lighting"), entry("8", "searing-phase"),
+            entry("10", "defrost"), entry("11", "cooling-down"), entry("12", "energy-save-phase"));
 
     private final String mieleID;
     private final String channelID;
@@ -206,10 +214,15 @@ public enum OvenChannelSelector implements ApplianceChannelSelector {
         return false;
     }
 
+    @Override
+    public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
+        return this.getState(s, dmd);
+    }
+
     @Override
     public State getState(String s, DeviceMetaData dmd) {
         if (dmd != null) {
-            String localizedValue = getMieleEnum(s, dmd);
+            String localizedValue = dmd.getMieleEnum(s);
             if (localizedValue == null) {
                 localizedValue = dmd.LocalizedValue;
             }
@@ -245,34 +258,4 @@ public enum OvenChannelSelector implements ApplianceChannelSelector {
             return UnDefType.UNDEF;
         }
     }
-
-    public State getTextState(String s, DeviceMetaData dmd, Map<String, String> valueMap, String prefix) {
-        if ("0".equals(s)) {
-            return UnDefType.UNDEF;
-        }
-
-        if (dmd == null || dmd.LocalizedValue == null || dmd.LocalizedValue.startsWith(prefix)) {
-            String text = valueMap.get(s);
-            if (text != null) {
-                return getState(text);
-            }
-            if (dmd == null || dmd.LocalizedValue == null) {
-                return getState(prefix + s);
-            }
-        }
-
-        return null;
-    }
-
-    public String getMieleEnum(String s, DeviceMetaData dmd) {
-        if (dmd.MieleEnum != null) {
-            for (Entry<String, JsonElement> enumEntry : dmd.MieleEnum.entrySet()) {
-                if (enumEntry.getValue().getAsString().trim().equals(s.trim())) {
-                    return enumEntry.getKey();
-                }
-            }
-        }
-
-        return null;
-    }
 }
index 13799659e9ad3c247001add8e51916ef62b04397..8f3275b26159c2edc0f04fe60fa891f8eeb2623c 100644 (file)
@@ -15,6 +15,8 @@ package org.openhab.binding.miele.internal.handler;
 import static org.openhab.binding.miele.internal.MieleBindingConstants.APPLIANCE_ID;
 import static org.openhab.binding.miele.internal.MieleBindingConstants.MIELE_DEVICE_CLASS_OVEN;
 
+import org.openhab.core.i18n.LocaleProvider;
+import org.openhab.core.i18n.TranslationProvider;
 import org.openhab.core.library.types.OnOffType;
 import org.openhab.core.thing.ChannelUID;
 import org.openhab.core.thing.Thing;
@@ -38,8 +40,8 @@ public class OvenHandler extends MieleApplianceHandler<OvenChannelSelector> {
 
     private final Logger logger = LoggerFactory.getLogger(OvenHandler.class);
 
-    public OvenHandler(Thing thing) {
-        super(thing, OvenChannelSelector.class, MIELE_DEVICE_CLASS_OVEN);
+    public OvenHandler(Thing thing, TranslationProvider i18nProvider, LocaleProvider localeProvider) {
+        super(thing, i18nProvider, localeProvider, OvenChannelSelector.class, MIELE_DEVICE_CLASS_OVEN);
     }
 
     @Override
index 1a375da9e44477068c91e72f19b19867f8294b73..b17761cfcc2d756618cd632f243b75ef70295ced 100644 (file)
@@ -19,10 +19,11 @@ import java.lang.reflect.Method;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.TimeZone;
 
-import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData;
+import org.openhab.binding.miele.internal.DeviceMetaData;
+import org.openhab.binding.miele.internal.DeviceUtil;
+import org.openhab.binding.miele.internal.MieleTranslationProvider;
 import org.openhab.core.library.types.DateTimeType;
 import org.openhab.core.library.types.DecimalType;
 import org.openhab.core.library.types.OnOffType;
@@ -34,8 +35,6 @@ import org.openhab.core.types.UnDefType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.gson.JsonElement;
-
 /**
  * The {@link ApplianceChannelSelector} for tumble dryers
  *
@@ -47,34 +46,45 @@ public enum TumbleDryerChannelSelector implements ApplianceChannelSelector {
 
     PRODUCT_TYPE("productTypeId", "productType", StringType.class, true),
     DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true),
-    STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false),
+    STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false) {
+        @Override
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
+            State state = DeviceUtil.getStateTextState(s, dmd, translationProvider);
+            if (state != null) {
+                return state;
+            }
+            return super.getState(s, dmd, translationProvider);
+        }
+    },
     STATE(null, STATE_CHANNEL_ID, DecimalType.class, false),
     PROGRAM_TEXT(PROGRAM_ID_PROPERTY_NAME, PROGRAM_TEXT_CHANNEL_ID, StringType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
-            State state = getTextState(s, dmd, programs, MISSING_PROGRAM_TEXT_PREFIX);
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
+            State state = DeviceUtil.getTextState(s, dmd, translationProvider, programs, MISSING_PROGRAM_TEXT_PREFIX,
+                    MIELE_TUMBLE_DRYER_TEXT_PREFIX);
             if (state != null) {
                 return state;
             }
-            return super.getState(s, dmd);
+            return super.getState(s, dmd, translationProvider);
         }
     },
     PROGRAM(null, PROGRAM_CHANNEL_ID, DecimalType.class, false),
     PROGRAMTYPE("programType", "type", StringType.class, false),
     PROGRAM_PHASE_TEXT(PHASE_PROPERTY_NAME, PHASE_TEXT_CHANNEL_ID, StringType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
-            State state = getTextState(s, dmd, phases, MISSING_PHASE_TEXT_PREFIX);
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
+            State state = DeviceUtil.getTextState(s, dmd, translationProvider, phases, MISSING_PHASE_TEXT_PREFIX,
+                    MIELE_TUMBLE_DRYER_TEXT_PREFIX);
             if (state != null) {
                 return state;
             }
-            return super.getState(s, dmd);
+            return super.getState(s, dmd, translationProvider);
         }
     },
     PROGRAM_PHASE(RAW_PHASE_PROPERTY_NAME, PHASE_CHANNEL_ID, DecimalType.class, false),
     START_TIME("startTime", "start", DateTimeType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             Date date = new Date();
             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
@@ -88,7 +98,7 @@ public enum TumbleDryerChannelSelector implements ApplianceChannelSelector {
     },
     DURATION("duration", "duration", DateTimeType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             Date date = new Date();
             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
@@ -102,7 +112,7 @@ public enum TumbleDryerChannelSelector implements ApplianceChannelSelector {
     },
     ELAPSED_TIME("elapsedTime", "elapsed", DateTimeType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             Date date = new Date();
             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
@@ -116,7 +126,7 @@ public enum TumbleDryerChannelSelector implements ApplianceChannelSelector {
     },
     FINISH_TIME("finishTime", "finish", DateTimeType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             Date date = new Date();
             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
@@ -130,14 +140,14 @@ public enum TumbleDryerChannelSelector implements ApplianceChannelSelector {
     },
     DRYING_STEP("dryingStep", "step", DecimalType.class, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             return getState(s);
         }
     },
     DOOR("signalDoor", "door", OpenClosedType.class, false) {
         @Override
 
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             if ("true".equals(s)) {
                 return getState("OPEN");
             }
@@ -153,20 +163,20 @@ public enum TumbleDryerChannelSelector implements ApplianceChannelSelector {
 
     private final Logger logger = LoggerFactory.getLogger(TumbleDryerChannelSelector.class);
 
-    private static final Map<String, String> programs = Map.ofEntries(entry("10", "Automatic Plus"),
-            entry("23", "Cottons hygiene"), entry("30", "Minimum iron"), entry("31", "Gentle minimum iron"),
-            entry("40", "Woollens handcare"), entry("50", "Delicates"), entry("60", "Warm Air"),
-            entry("70", "Cool air"), entry("80", "Express"), entry("90", "Cottons"), entry("100", "Gentle smoothing"),
-            entry("120", "Proofing"), entry("130", "Denim"), entry("131", "Gentle denim"), entry("140", "Shirts"),
-            entry("141", "Gentle shirts"), entry("150", "Sportswear"), entry("160", "Outerwear"),
-            entry("170", "Silks handcare"), entry("190", "Standard pillows"), entry("220", "Basket programme"),
-            entry("240", "Smoothing"), entry("65000", "Cottons, auto load control"),
-            entry("65001", "Minimum iron, auto load control"));
-
-    private static final Map<String, String> phases = Map.ofEntries(entry("1", "Programme running"),
-            entry("2", "Drying"), entry("3", "Drying Machine iron"), entry("4", "Drying Hand iron"),
-            entry("5", "Drying Normal"), entry("6", "Drying Normal+"), entry("7", "Cooling down"),
-            entry("8", "Drying Hand iron"), entry("10", "Finished"));
+    private static final Map<String, String> programs = Map.ofEntries(entry("10", "automatic-plus"),
+            entry("20", "cottons"), entry("23", "cottons-hygiene"), entry("30", "minimum-iron"),
+            entry("31", "gentle-minimum-iron"), entry("40", "woollens-handcare"), entry("50", "delicates"),
+            entry("60", "warm-air"), entry("70", "cool-air"), entry("80", "express"), entry("90", "cottons-eco"),
+            entry("100", "gentle-smoothing"), entry("120", "proofing"), entry("130", "denim"),
+            entry("131", "gentle-denim"), entry("140", "shirts"), entry("141", "gentle-shirts"),
+            entry("150", "sportswear"), entry("160", "outerwear"), entry("170", "silks-handcare"),
+            entry("190", "standard-pillows"), entry("220", "basket-programme"), entry("240", "smoothing"),
+            entry("65000", "cottons-auto-load-control"), entry("65001", "minimum-iron-auto-load-control"));
+
+    private static final Map<String, String> phases = Map.ofEntries(entry("1", "programme-running"),
+            entry("2", "drying"), entry("3", "drying-machine-iron"), entry("4", "drying-hand-iron"),
+            entry("5", "drying-normal"), entry("6", "drying-normal-plus"), entry("7", "cooling-down"),
+            entry("8", "drying-hand-iron"), entry("10", "finished"));
 
     private final String mieleID;
     private final String channelID;
@@ -206,10 +216,15 @@ public enum TumbleDryerChannelSelector implements ApplianceChannelSelector {
         return false;
     }
 
+    @Override
+    public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
+        return this.getState(s, dmd);
+    }
+
     @Override
     public State getState(String s, DeviceMetaData dmd) {
         if (dmd != null) {
-            String localizedValue = getMieleEnum(s, dmd);
+            String localizedValue = dmd.getMieleEnum(s);
             if (localizedValue == null) {
                 localizedValue = dmd.LocalizedValue;
             }
@@ -236,34 +251,4 @@ public enum TumbleDryerChannelSelector implements ApplianceChannelSelector {
 
         return null;
     }
-
-    public State getTextState(String s, DeviceMetaData dmd, Map<String, String> valueMap, String prefix) {
-        if ("0".equals(s)) {
-            return UnDefType.UNDEF;
-        }
-
-        if (dmd == null || dmd.LocalizedValue == null || dmd.LocalizedValue.startsWith(prefix)) {
-            String text = valueMap.get(s);
-            if (text != null) {
-                return getState(text);
-            }
-            if (dmd == null || dmd.LocalizedValue == null) {
-                return getState(prefix + s);
-            }
-        }
-
-        return null;
-    }
-
-    public String getMieleEnum(String s, DeviceMetaData dmd) {
-        if (dmd.MieleEnum != null) {
-            for (Entry<String, JsonElement> enumEntry : dmd.MieleEnum.entrySet()) {
-                if (enumEntry.getValue().getAsString().trim().equals(s.trim())) {
-                    return enumEntry.getKey();
-                }
-            }
-        }
-
-        return null;
-    }
 }
index 7e56d6381fc5e2d96178bbe43e8b9c81f833a6d3..e6482af4cfef04abae375db799396184d3b52f06 100644 (file)
@@ -15,6 +15,8 @@ package org.openhab.binding.miele.internal.handler;
 import static org.openhab.binding.miele.internal.MieleBindingConstants.APPLIANCE_ID;
 import static org.openhab.binding.miele.internal.MieleBindingConstants.MIELE_DEVICE_CLASS_TUMBLE_DRYER;
 
+import org.openhab.core.i18n.LocaleProvider;
+import org.openhab.core.i18n.TranslationProvider;
 import org.openhab.core.library.types.OnOffType;
 import org.openhab.core.thing.ChannelUID;
 import org.openhab.core.thing.Thing;
@@ -38,8 +40,8 @@ public class TumbleDryerHandler extends MieleApplianceHandler<TumbleDryerChannel
 
     private final Logger logger = LoggerFactory.getLogger(TumbleDryerHandler.class);
 
-    public TumbleDryerHandler(Thing thing) {
-        super(thing, TumbleDryerChannelSelector.class, MIELE_DEVICE_CLASS_TUMBLE_DRYER);
+    public TumbleDryerHandler(Thing thing, TranslationProvider i18nProvider, LocaleProvider localeProvider) {
+        super(thing, i18nProvider, localeProvider, TumbleDryerChannelSelector.class, MIELE_DEVICE_CLASS_TUMBLE_DRYER);
     }
 
     @Override
index 4fad63fe5dc293c4f3581a37b0b71b57a59fbd46..2461d627d89274528e0a3cfa139298bab044ca68 100644 (file)
@@ -19,11 +19,11 @@ import java.lang.reflect.Method;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.TimeZone;
 
+import org.openhab.binding.miele.internal.DeviceMetaData;
 import org.openhab.binding.miele.internal.DeviceUtil;
-import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData;
+import org.openhab.binding.miele.internal.MieleTranslationProvider;
 import org.openhab.core.library.types.DateTimeType;
 import org.openhab.core.library.types.DecimalType;
 import org.openhab.core.library.types.OnOffType;
@@ -36,8 +36,6 @@ import org.openhab.core.types.UnDefType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.gson.JsonElement;
-
 /**
  * The {@link ApplianceChannelSelector} for washing machines
  *
@@ -49,34 +47,45 @@ public enum WashingMachineChannelSelector implements ApplianceChannelSelector {
 
     PRODUCT_TYPE("productTypeId", "productType", StringType.class, true, false),
     DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true, false),
-    STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false, false),
+    STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false, false) {
+        @Override
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
+            State state = DeviceUtil.getStateTextState(s, dmd, translationProvider);
+            if (state != null) {
+                return state;
+            }
+            return super.getState(s, dmd, translationProvider);
+        }
+    },
     STATE(null, STATE_CHANNEL_ID, DecimalType.class, false, false),
     PROGRAM_TEXT(PROGRAM_ID_PROPERTY_NAME, PROGRAM_TEXT_CHANNEL_ID, StringType.class, false, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
-            State state = getTextState(s, dmd, programs, MISSING_PROGRAM_TEXT_PREFIX);
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
+            State state = DeviceUtil.getTextState(s, dmd, translationProvider, programs, MISSING_PROGRAM_TEXT_PREFIX,
+                    MIELE_WASHING_MACHINE_TEXT_PREFIX);
             if (state != null) {
                 return state;
             }
-            return super.getState(s, dmd);
+            return super.getState(s, dmd, translationProvider);
         }
     },
     PROGRAM(null, PROGRAM_CHANNEL_ID, DecimalType.class, false, false),
     PROGRAMTYPE("programType", "type", StringType.class, false, false),
     PROGRAM_PHASE_TEXT(PHASE_PROPERTY_NAME, PHASE_TEXT_CHANNEL_ID, StringType.class, false, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
-            State state = getTextState(s, dmd, phases, MISSING_PHASE_TEXT_PREFIX);
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
+            State state = DeviceUtil.getTextState(s, dmd, translationProvider, phases, MISSING_PHASE_TEXT_PREFIX,
+                    MIELE_WASHING_MACHINE_TEXT_PREFIX);
             if (state != null) {
                 return state;
             }
-            return super.getState(s, dmd);
+            return super.getState(s, dmd, translationProvider);
         }
     },
     PROGRAM_PHASE(RAW_PHASE_PROPERTY_NAME, PHASE_CHANNEL_ID, DecimalType.class, false, false),
     START_TIME("startTime", "start", DateTimeType.class, false, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             Date date = new Date();
             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
@@ -90,7 +99,7 @@ public enum WashingMachineChannelSelector implements ApplianceChannelSelector {
     },
     DURATION("duration", "duration", DateTimeType.class, false, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             Date date = new Date();
             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
@@ -104,7 +113,7 @@ public enum WashingMachineChannelSelector implements ApplianceChannelSelector {
     },
     ELAPSED_TIME("elapsedTime", "elapsed", DateTimeType.class, false, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             Date date = new Date();
             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
@@ -118,7 +127,7 @@ public enum WashingMachineChannelSelector implements ApplianceChannelSelector {
     },
     FINISH_TIME("finishTime", "finish", DateTimeType.class, false, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             Date date = new Date();
             SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
             dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0"));
@@ -132,13 +141,13 @@ public enum WashingMachineChannelSelector implements ApplianceChannelSelector {
     },
     TARGET_TEMP("targetTemperature", "target", QuantityType.class, false, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             return getTemperatureState(s);
         }
     },
     SPINNING_SPEED("spinningSpeed", "spinningspeed", StringType.class, false, false) {
         @Override
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             if ("0".equals(s)) {
                 return getState("Without spinning");
             }
@@ -151,7 +160,7 @@ public enum WashingMachineChannelSelector implements ApplianceChannelSelector {
     DOOR("signalDoor", "door", OpenClosedType.class, false, false) {
         @Override
 
-        public State getState(String s, DeviceMetaData dmd) {
+        public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
             if ("true".equals(s)) {
                 return getState("OPEN");
             }
@@ -171,18 +180,18 @@ public enum WashingMachineChannelSelector implements ApplianceChannelSelector {
 
     private final Logger logger = LoggerFactory.getLogger(WashingMachineChannelSelector.class);
 
-    private static final Map<String, String> programs = Map.ofEntries(entry("1", "Cottons"), entry("3", "Minimum iron"),
-            entry("4", "Delicates"), entry("8", "Woollens"), entry("9", "Silks"), entry("17", "Starch"),
-            entry("18", "Rinse"), entry("21", "Drain/Spin"), entry("22", "Curtains"), entry("23", "Shirts"),
-            entry("24", "Denim"), entry("27", "Proofing"), entry("29", "Sportswear"), entry("31", "Automatic Plus"),
-            entry("37", "Outerwear"), entry("39", "Pillows"), entry("50", "Dark Garments"), entry("53", "First wash"),
-            entry("75", "Steam care"), entry("76", "Freshen up"), entry("91", "Maintenance wash"),
-            entry("95", "Down duvets"), entry("122", "Express 20"), entry("129", "Down filled items"),
-            entry("133", "Cottons Eco"), entry("146", "QuickPowerWash"), entry("65532", "Mix"));
+    private static final Map<String, String> programs = Map.ofEntries(entry("1", "cottons"), entry("3", "minimum-iron"),
+            entry("4", "delicates"), entry("8", "woollens"), entry("9", "silks"), entry("17", "starch"),
+            entry("18", "rinse"), entry("21", "drain-spin"), entry("22", "curtains"), entry("23", "shirts"),
+            entry("24", "denim"), entry("27", "proofing"), entry("29", "sportswear"), entry("31", "automatic-plus"),
+            entry("37", "outerwear"), entry("39", "pillows"), entry("50", "dark-garments"), entry("53", "first-wash"),
+            entry("75", "steam-care"), entry("76", "freshen-up"), entry("91", "maintenance-wash"),
+            entry("95", "down-duvets"), entry("122", "express-20"), entry("129", "down-filled-items"),
+            entry("133", "cottons-eco"), entry("146", "quickpowerwash"), entry("65532", "mix"));
 
-    private static final Map<String, String> phases = Map.ofEntries(entry("1", "Pre-wash"), entry("4", "Washing"),
-            entry("5", "Rinses"), entry("7", "Clean"), entry("9", "Drain"), entry("10", "Spin"),
-            entry("11", "Anti-crease"), entry("12", "Finished"));
+    private static final Map<String, String> phases = Map.ofEntries(entry("1", "pre-wash"), entry("4", "washing"),
+            entry("5", "rinses"), entry("7", "clean"), entry("9", "drain"), entry("10", "spin"),
+            entry("11", "anti-crease"), entry("12", "finished"));
 
     private final String mieleID;
     private final String channelID;
@@ -224,10 +233,15 @@ public enum WashingMachineChannelSelector implements ApplianceChannelSelector {
         return isExtendedState;
     }
 
+    @Override
+    public State getState(String s, DeviceMetaData dmd, MieleTranslationProvider translationProvider) {
+        return this.getState(s, dmd);
+    }
+
     @Override
     public State getState(String s, DeviceMetaData dmd) {
         if (dmd != null) {
-            String localizedValue = getMieleEnum(s, dmd);
+            String localizedValue = dmd.getMieleEnum(s);
             if (localizedValue == null) {
                 localizedValue = dmd.LocalizedValue;
             }
@@ -263,34 +277,4 @@ public enum WashingMachineChannelSelector implements ApplianceChannelSelector {
             return UnDefType.UNDEF;
         }
     }
-
-    public State getTextState(String s, DeviceMetaData dmd, Map<String, String> valueMap, String prefix) {
-        if ("0".equals(s)) {
-            return UnDefType.UNDEF;
-        }
-
-        if (dmd == null || dmd.LocalizedValue == null || dmd.LocalizedValue.startsWith(prefix)) {
-            String text = valueMap.get(s);
-            if (text != null) {
-                return getState(text);
-            }
-            if (dmd == null || dmd.LocalizedValue == null) {
-                return getState(prefix + s);
-            }
-        }
-
-        return null;
-    }
-
-    public String getMieleEnum(String s, DeviceMetaData dmd) {
-        if (dmd.MieleEnum != null) {
-            for (Entry<String, JsonElement> enumEntry : dmd.MieleEnum.entrySet()) {
-                if (enumEntry.getValue().getAsString().trim().equals(s.trim())) {
-                    return enumEntry.getKey();
-                }
-            }
-        }
-
-        return null;
-    }
 }
index 4c330cb07bc829217bb3c9509710467db28cd9ef..e5b3cd9c7821b658c56453c4c9e1272980f7c38a 100644 (file)
@@ -19,6 +19,8 @@ import static org.openhab.binding.miele.internal.MieleBindingConstants.WATER_CON
 
 import java.math.BigDecimal;
 
+import org.openhab.core.i18n.LocaleProvider;
+import org.openhab.core.i18n.TranslationProvider;
 import org.openhab.core.library.types.OnOffType;
 import org.openhab.core.library.types.QuantityType;
 import org.openhab.core.library.unit.Units;
@@ -49,8 +51,9 @@ public class WashingMachineHandler extends MieleApplianceHandler<WashingMachineC
 
     private final Logger logger = LoggerFactory.getLogger(WashingMachineHandler.class);
 
-    public WashingMachineHandler(Thing thing) {
-        super(thing, WashingMachineChannelSelector.class, MIELE_DEVICE_CLASS_WASHING_MACHINE);
+    public WashingMachineHandler(Thing thing, TranslationProvider i18nProvider, LocaleProvider localeProvider) {
+        super(thing, i18nProvider, localeProvider, WashingMachineChannelSelector.class,
+                MIELE_DEVICE_CLASS_WASHING_MACHINE);
     }
 
     @Override
index 94e0949fa0e6d3ac8eab90767064c40e6ed463b1..770734d9140ff0af20f67a1aca45023bd4f845b0 100644 (file)
@@ -11,18 +11,33 @@ thing-type.miele.dishwasher.label = Dishwasher
 thing-type.miele.dishwasher.description = This is a Miele@home compatible dishwasher
 thing-type.miele.fridge.label = Fridge
 thing-type.miele.fridge.description = This is a Miele@home compatible fridge
+thing-type.miele.fridge.channel.current.description = Current temperature in the fridge
+thing-type.miele.fridge.channel.target.description = Target temperature to be reached by the fridge
 thing-type.miele.fridgefreezer.label = Fridge Freezer
 thing-type.miele.fridgefreezer.description = This is a Miele@home compatible fridgefreezer
+thing-type.miele.fridgefreezer.channel.freezercurrent.description = Current temperature in the freezer compartment
+thing-type.miele.fridgefreezer.channel.freezertarget.description = Target temperature to be reached by the freezer compartment
+thing-type.miele.fridgefreezer.channel.fridgecurrent.description = Current temperature in the fridge compartment
+thing-type.miele.fridgefreezer.channel.fridgetarget.description = Target temperature to be reached by the fridge compartment
 thing-type.miele.hob.label = Hob
 thing-type.miele.hob.description = This is a Miele@home compatible hob
 thing-type.miele.hood.label = Hood
 thing-type.miele.hood.description = This is a Miele@home compatible hood
 thing-type.miele.oven.label = Oven
 thing-type.miele.oven.description = This is a Miele@home compatible oven
+thing-type.miele.oven.channel.measured.label = Measured Temperature
+thing-type.miele.oven.channel.measured.description = Actual measured temperature in the oven
+thing-type.miele.oven.channel.target.description = Target temperature to be reached by the oven
+thing-type.miele.oven.channel.temp1.label = Program Temperature 1
+thing-type.miele.oven.channel.temp1.description = Program temperature in the oven
+thing-type.miele.oven.channel.temp2.label = Program Temperature 2
+thing-type.miele.oven.channel.temp2.description = Program temperature in the oven
 thing-type.miele.tumbledryer.label = Tumbledryer
 thing-type.miele.tumbledryer.description = This is a Miele@home compatible tumbledryer
 thing-type.miele.washingmachine.label = Washing Machine
 thing-type.miele.washingmachine.description = This is a Miele@home compatible washing machine
+thing-type.miele.washingmachine.channel.target.label = Temperature
+thing-type.miele.washingmachine.channel.target.description = Temperature of the selected program (10 °C = cold)
 thing-type.miele.xgw3000.label = Miele XGW3000
 thing-type.miele.xgw3000.description = The Miele bridge represents the Miele@home XGW3000 gateway.
 
@@ -34,6 +49,8 @@ thing-type.config.miele.xgw3000.interface.label = Network Address of the Multica
 thing-type.config.miele.xgw3000.interface.description = Network address of openHAB host interface where the binding will listen for multicast events coming from the Miele@home gateway.
 thing-type.config.miele.xgw3000.ipAddress.label = Network Address
 thing-type.config.miele.xgw3000.ipAddress.description = Network address of the Miele@home gateway.
+thing-type.config.miele.xgw3000.language.label = Language
+thing-type.config.miele.xgw3000.language.description = Language for state, program and phase texts. Leave blank for system language.
 thing-type.config.miele.xgw3000.password.label = Password
 thing-type.config.miele.xgw3000.password.description = Password for the registered Miele@home user.
 thing-type.config.miele.xgw3000.userName.label = Username
@@ -105,3 +122,137 @@ channel-type.miele.ventilation.label = Ventilation Power
 channel-type.miele.ventilation.description = Current ventilation power
 channel-type.miele.waterConsumption.label = Water Consumption
 channel-type.miele.waterConsumption.description = Water consumption by the currently running program on the appliance
+
+# thing status descriptions
+
+offline.configuration-error.ip-address-not-set = Cannot connect to the Miele gateway: host IP address is not set.
+offline.configuration-error.ip-multicast-interface-not-set = Cannot connect to the Miele gateway: multicast interface is not set.
+offline.configuration-error.invalid-ip-gateway = Invalid IP address for the Miele@Home gateway: {0}
+offline.configuration-error.invalid-ip-multicast-interface = Invalid IP address for the multicast interface: {0}
+offline.configuration-error.invalid-language = Invalid language: {0}
+
+# miele states
+
+miele.state.off = Off
+miele.state.stand-by = Stand-by
+miele.state.programmed = Programmed
+miele.state.waiting-to-start = Waiting to Start
+miele.state.running = Running
+miele.state.paused = Paused
+miele.state.end = End
+miele.state.failure = Failure
+miele.state.abort = Abort
+miele.state.idle = Idle
+miele.state.rinse-hold = Rinse Hold
+miele.state.service = Service
+miele.state.super-freezing = Super Freezing
+miele.state.super-cooling = Super Cooling
+miele.state.super-heating = Super Heating
+miele.state.default = Default
+miele.state.locked = Locked
+miele.state.not-connected = Not Connected
+
+# miele programs
+
+miele.program.dishwasher.intensive = Intensive
+miele.program.dishwasher.maintenance-programme = Maintenance programme
+miele.program.dishwasher.eco = ECO
+miele.program.dishwasher.normal = Normal
+miele.program.dishwasher.automatic = Automatic
+miele.program.dishwasher.solarsave = SolarSave
+miele.program.dishwasher.gentle = Gentle
+miele.program.dishwasher.extra-quiet = Extra Quiet
+miele.program.dishwasher.hygiene = Hygiene
+miele.program.dishwasher.quickpowerwash = QuickPowerWash
+miele.program.dishwasher.tall-items = Tall items
+
+miele.program.tumbledryer.automatic-plus = Automatic Plus
+miele.program.tumbledryer.cottons = Cottons
+miele.program.tumbledryer.cottons-hygiene = Cottons hygiene
+miele.program.tumbledryer.minimum-iron = Minimum iron
+miele.program.tumbledryer.gentle-minimum-iron = Gentle minimum iron
+miele.program.tumbledryer.woollens-handcare = Woollens handcare
+miele.program.tumbledryer.delicates = Delicates
+miele.program.tumbledryer.warm-air = Warm Air
+miele.program.tumbledryer.cool-air = Cool air
+miele.program.tumbledryer.express = Express
+miele.program.tumbledryer.cottons-eco = Cottons Eco
+miele.program.tumbledryer.gentle-smoothing = Gentle smoothing
+miele.program.tumbledryer.proofing = Proofing
+miele.program.tumbledryer.denim = Denim
+miele.program.tumbledryer.gentle-denim = Gentle denim
+miele.program.tumbledryer.shirts = Shirts
+miele.program.tumbledryer.gentle-shirts = Gentle shirts
+miele.program.tumbledryer.sportswear = Sportswear
+miele.program.tumbledryer.outerwear = Outerwear
+miele.program.tumbledryer.silks-handcare = Silks handcare
+miele.program.tumbledryer.standard-pillows = Standard pillows
+miele.program.tumbledryer.basket-programme = Basket programme
+miele.program.tumbledryer.smoothing = Smoothing
+miele.program.tumbledryer.cottons-auto-load-control = Cottons, auto load control
+miele.program.tumbledryer.minimum-iron-auto-load-control = Minimum iron, auto load control
+
+miele.program.washingmachine.cottons = Cottons
+miele.program.washingmachine.minimum-iron = Minimum iron
+miele.program.washingmachine.delicates = Delicates
+miele.program.washingmachine.woollens = Woollens
+miele.program.washingmachine.silks = Silks
+miele.program.washingmachine.starch = Starch
+miele.program.washingmachine.rinse = Rinse
+miele.program.washingmachine.drain-spin = Drain/Spin
+miele.program.washingmachine.curtains = Curtains
+miele.program.washingmachine.shirts = Shirts
+miele.program.washingmachine.denim = Denim
+miele.program.washingmachine.proofing = Proofing
+miele.program.washingmachine.sportswear = Sportswear
+miele.program.washingmachine.automatic-plus = Automatic Plus
+miele.program.washingmachine.outerwear = Outerwear
+miele.program.washingmachine.pillows = Pillows
+miele.program.washingmachine.dark-garments = Dark Garments
+miele.program.washingmachine.first-wash = First wash
+miele.program.washingmachine.steam-care = Steam care
+miele.program.washingmachine.freshen-up = Freshen up
+miele.program.washingmachine.maintenance-wash = Maintenance wash
+miele.program.washingmachine.down-duvets = Down duvets
+miele.program.washingmachine.express-20 = Express 20
+miele.program.washingmachine.down-filled-items = Down filled items
+miele.program.washingmachine.cottons-eco = Cottons Eco
+miele.program.washingmachine.quickpowerwash = QuickPowerWash
+miele.program.washingmachine.mix = Mix
+
+# miele phases
+
+miele.phase.dishwasher.pre-wash = Pre-Wash
+miele.phase.dishwasher.main-wash = Main Wash
+miele.phase.dishwasher.rinses = Rinses
+miele.phase.dishwasher.final-rinse = Final rinse
+miele.phase.dishwasher.drying = Drying
+miele.phase.dishwasher.finished = Finished
+
+miele.phase.oven.heating = Heating
+miele.phase.oven.temp-hold = Temp. hold
+miele.phase.oven.door-open = Door Open
+miele.phase.oven.pyrolysis = Pyrolysis
+miele.phase.oven.lighting = Lighting
+miele.phase.oven.searing-phase = Searing phase
+miele.phase.oven.defrost = Defrost
+miele.phase.oven.cooling-down = Cooling down
+miele.phase.oven.energy-save-phase = Energy save phase
+
+miele.phase.tumbledryer.programme-running = Programme running
+miele.phase.tumbledryer.drying = Drying
+miele.phase.tumbledryer.drying-machine-iron = Drying Machine iron
+miele.phase.tumbledryer.drying-hand-iron = Drying Hand iron
+miele.phase.tumbledryer.drying-normal = Drying Normal
+miele.phase.tumbledryer.drying-normal-plus = Drying Normal+
+miele.phase.tumbledryer.cooling-down = Cooling down
+miele.phase.tumbledryer.finished = Finished
+
+miele.phase.washingmachine.pre-wash = Pre-wash
+miele.phase.washingmachine.washing = Washing
+miele.phase.washingmachine.rinses = Rinses
+miele.phase.washingmachine.clean = Clean
+miele.phase.washingmachine.drain = Drain
+miele.phase.washingmachine.spin = Spin
+miele.phase.washingmachine.anti-crease = Anti-crease
+miele.phase.washingmachine.finished = Finished
index 488269b00a7d9d1037d3d1aee23ef715e4acf9e9..81f90b79bc861d60eb795990558407c8e0959f64 100644 (file)
@@ -11,18 +11,33 @@ thing-type.miele.dishwasher.label = Opvaskemaskine
 thing-type.miele.dishwasher.description = Dette er en Miele@home-kompatibel opvaskemaskine
 thing-type.miele.fridge.label = Køleskab
 thing-type.miele.fridge.description = Dette er et Miele@home-kompatibelt køleskab
+thing-type.miele.fridge.channel.current.description = Aktuel temperatur i køleskabet
+thing-type.miele.fridge.channel.target.description = Måltemperatur der skal nås af køleskabet
 thing-type.miele.fridgefreezer.label = Kølefryseskab
 thing-type.miele.fridgefreezer.description = Dette er et Miele@home-kompatibelt kølefryseskab
+thing-type.miele.fridgefreezer.channel.freezercurrent.description = Aktuel temperatur i fryserummet
+thing-type.miele.fridgefreezer.channel.freezertarget.description = Måltemperatur der skal nås i fryserummet
+thing-type.miele.fridgefreezer.channel.fridgecurrent.description = Aktuel temperatur i kølerummet
+thing-type.miele.fridgefreezer.channel.fridgetarget.description = Måltemperatur der skal nås i kølerummet
 thing-type.miele.hob.label = Kogeplader
 thing-type.miele.hob.description = Dette er Miele@home-kompatible kogeplader
 thing-type.miele.hood.label = Emhætte
 thing-type.miele.hood.description = Dette er en Miele@home-kompatibel emhætte
 thing-type.miele.oven.label = Ovn
 thing-type.miele.oven.description = Dette er en Miele@home-kompatibel ovn
+thing-type.miele.oven.channel.measured.label = Målt temperatur
+thing-type.miele.oven.channel.measured.description = Aktuel målt temperatur i ovnen
+thing-type.miele.oven.channel.target.description = Måltemperatur der skal nås af ovnen
+thing-type.miele.oven.channel.temp1.label = Programtemperatur 1
+thing-type.miele.oven.channel.temp1.description = Programtemperatur i ovnen
+thing-type.miele.oven.channel.temp2.label = Programtemperatur 2
+thing-type.miele.oven.channel.temp2.description = Programtemperatur i ovnen
 thing-type.miele.tumbledryer.label = Tørretumbler
 thing-type.miele.tumbledryer.description = Dette er en Miele@home-kompatibel tørretumbler
 thing-type.miele.washingmachine.label = Vaskemaskine
 thing-type.miele.washingmachine.description = Dette er en Miele@home-kompatibel vaskemaskine
+thing-type.miele.washingmachine.channel.target.label = Temperatur
+thing-type.miele.washingmachine.channel.target.description = Temperatur for det valgte program (10 °C = koldt)
 thing-type.miele.xgw3000.label = Miele XGW3000
 thing-type.miele.xgw3000.description = Miele-bridgen repræsenterer Miele@home XGW3000-gateway'en.
 
@@ -34,7 +49,135 @@ thing-type.config.miele.xgw3000.interface.label = Netværksadresse til multicast
 thing-type.config.miele.xgw3000.interface.description = Netværksadresse til openHAB værts-interfacet hvor bindingen vil lytte på multicast-hændelser fra Miele@home-gateway'en.
 thing-type.config.miele.xgw3000.ipAddress.label = Netværksadresse
 thing-type.config.miele.xgw3000.ipAddress.description = Netværksadresse til Miele@home-gateway'en.
+thing-type.config.miele.xgw3000.language.label = Sprog
+thing-type.config.miele.xgw3000.language.description = Sprog for tilstand-, program- og fasetekster. Efterlad feltet tomt for systemsprog.
 thing-type.config.miele.xgw3000.password.label = Adgangskode
 thing-type.config.miele.xgw3000.password.description = Adgangskode til registreret Miele@home-bruger.
 thing-type.config.miele.xgw3000.userName.label = Brugernavn
 thing-type.config.miele.xgw3000.userName.description = Navn på en registeret Miele@home-bruger.
+
+# miele states
+
+miele.state.off = Frakoblet
+miele.state.stand-by = Tilkoblet
+miele.state.programmed = Programmeret
+miele.state.waiting-to-start = Udskudt start
+miele.state.running = I brug
+miele.state.paused = På pause
+miele.state.end = Slut
+miele.state.failure = Fejl
+miele.state.abort = Afbrudt
+miele.state.idle = Idle
+miele.state.rinse-hold = Skyllestop
+miele.state.service = Service
+miele.state.super-freezing = Superfrys
+miele.state.super-cooling = Superkøl
+#miele.state.super-heating = 
+#miele.state.default
+miele.state.locked = Låst
+miele.state.not-connected = Ikke forbundet
+
+# miele programs
+
+miele.program.dishwasher.intensive = Intensiv
+miele.program.dishwasher.maintenance-programme = Maskinrengøring
+miele.program.dishwasher.eco = ECO
+miele.program.dishwasher.normal = Universal+
+miele.program.dishwasher.automatic = Automatic
+miele.program.dishwasher.solarsave = SolarSpar
+miele.program.dishwasher.gentle = Automatic skåne
+miele.program.dishwasher.extra-quiet = Ekstra lydsvag
+miele.program.dishwasher.hygiene = Hygiejne
+miele.program.dishwasher.quickpowerwash = QuickPowerWash
+miele.program.dishwasher.tall-items = Uden overkurv
+
+miele.program.tumbledryer.automatic-plus = Automatic Plus
+miele.program.tumbledryer.cottons = Bomuld
+miele.program.tumbledryer.cottons-hygiene = Bomuld Allergi Plus
+miele.program.tumbledryer.minimum-iron = Strygelet
+miele.program.tumbledryer.gentle-minimum-iron = Strygelet, skånsom
+miele.program.tumbledryer.woollens-handcare = Finish uld
+miele.program.tumbledryer.delicates = Finvask
+miele.program.tumbledryer.warm-air = Varm luft
+miele.program.tumbledryer.cool-air = Kold luft
+miele.program.tumbledryer.express = Ekspres
+miele.program.tumbledryer.cottons-eco = Bomuld Eco
+miele.program.tumbledryer.gentle-smoothing = Udglatning, skånsom
+miele.program.tumbledryer.proofing = Imprægnering
+miele.program.tumbledryer.denim = Denim
+miele.program.tumbledryer.gentle-denim = Denim, skånsom
+miele.program.tumbledryer.shirts = Skjorter
+miele.program.tumbledryer.gentle-shirts = Skjorter, skånsom
+miele.program.tumbledryer.sportswear = Sportstøj
+miele.program.tumbledryer.outerwear = Outdoor
+miele.program.tumbledryer.silks-handcare = Silke
+miele.program.tumbledryer.standard-pillows = Hovedpuder
+miele.program.tumbledryer.basket-programme = Tørrekurvprogram
+miele.program.tumbledryer.smoothing = Dampudglatning
+miele.program.tumbledryer.cottons-auto-load-control = Bomuld, mængdeautomatik
+miele.program.tumbledryer.minimum-iron-auto-load-control = Strygelet, mængdeautomatik
+
+miele.program.washingmachine.cottons = Bomuld
+miele.program.washingmachine.minimum-iron = Strygelet
+miele.program.washingmachine.delicates = Finvask
+miele.program.washingmachine.woollens = Uld
+miele.program.washingmachine.silks = Silke
+miele.program.washingmachine.starch = Stivelse
+miele.program.washingmachine.rinse = Kun skyl
+miele.program.washingmachine.drain-spin = Pumpe/Centrifugering
+miele.program.washingmachine.curtains = Gardiner
+miele.program.washingmachine.shirts = Skjorter
+miele.program.washingmachine.denim = Denim
+miele.program.washingmachine.proofing = Imprægnering
+miele.program.washingmachine.sportswear = Sportstøj
+miele.program.washingmachine.automatic-plus = Automatic Plus
+miele.program.washingmachine.outerwear = Outdoor
+miele.program.washingmachine.pillows = Hovedpuder
+miele.program.washingmachine.dark-garments = Mørkt
+miele.program.washingmachine.first-wash = Nye tekstiler
+miele.program.washingmachine.steam-care = Finish damp
+miele.program.washingmachine.freshen-up = Opfriskning
+miele.program.washingmachine.maintenance-wash = Maskine rengøres
+miele.program.washingmachine.down-duvets = Fjer-/dundyner
+miele.program.washingmachine.express-20 = Ekspres 20
+miele.program.washingmachine.down-filled-items = Dun
+miele.program.washingmachine.cottons-eco = Bomuld Eco
+miele.program.washingmachine.quickpowerwash = QuickPowerWash
+miele.program.washingmachine.mix = Mix
+
+# miele phases
+
+miele.phase.dishwasher.pre-wash = Forskyl
+miele.phase.dishwasher.main-wash = Opvask
+miele.phase.dishwasher.rinses = Skylning
+miele.phase.dishwasher.final-rinse = Klarskyl
+miele.phase.dishwasher.drying = Tørring
+miele.phase.dishwasher.finished = Slut
+
+miele.phase.oven.heating = Opvarmningsfase
+miele.phase.oven.temp-hold = Tilberedning
+miele.phase.oven.door-open = Dør åben
+miele.phase.oven.pyrolysis = Pyrolyse
+miele.phase.oven.lighting = Ovnlys
+miele.phase.oven.searing-phase = Bruningsfase
+miele.phase.oven.defrost = Optøning
+miele.phase.oven.cooling-down = Afkøling
+miele.phase.oven.energy-save-phase = Energisparefase
+
+miele.phase.tumbledryer.programme-running = Program kører
+miele.phase.tumbledryer.drying = Tørring
+miele.phase.tumbledryer.drying-machine-iron = Rulletørt
+miele.phase.tumbledryer.drying-hand-iron = Strygetørt
+miele.phase.tumbledryer.drying-normal = Skabstørt
+miele.phase.tumbledryer.drying-normal-plus = Skabstørt+
+miele.phase.tumbledryer.cooling-down = Afkøling
+miele.phase.tumbledryer.finished = Slut
+
+miele.phase.washingmachine.pre-wash = Forvask
+miele.phase.washingmachine.washing = Vask
+miele.phase.washingmachine.rinses = Skylning
+miele.phase.washingmachine.clean = Rengøring
+miele.phase.washingmachine.drain = Udpumpning
+miele.phase.washingmachine.spin = Centrifugering
+miele.phase.washingmachine.anti-crease = Antikrøl
+miele.phase.washingmachine.finished = Slut
diff --git a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/i18n/miele_de.properties b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/i18n/miele_de.properties
new file mode 100644 (file)
index 0000000..1514d97
--- /dev/null
@@ -0,0 +1,125 @@
+# miele states
+
+miele.state.off = Aus
+miele.state.stand-by = Bereit
+miele.state.programmed = Programm gewählt
+miele.state.waiting-to-start = Start verzögert
+miele.state.running = In Betrieb
+miele.state.paused = Pause
+miele.state.end = Ende
+#miele.state.failure = 
+miele.state.abort = Abbruch
+#miele.state.idle = 
+#miele.state.rinse-hold = 
+#miele.state.service = 
+#miele.state.super-freezing = 
+miele.state.super-cooling = Superkühlen
+#miele.state.super-heating = 
+#miele.state.default
+#miele.state.locked = 
+#miele.state.not-connected = 
+
+# miele programs
+
+miele.program.dishwasher.intensive = Intensiv
+miele.program.dishwasher.maintenance-programme = Maschinenreinigung
+miele.program.dishwasher.eco = ECO
+miele.program.dishwasher.normal = Normal
+miele.program.dishwasher.automatic = Automatic
+miele.program.dishwasher.solarsave = SolarSpar
+miele.program.dishwasher.gentle = Fein
+miele.program.dishwasher.extra-quiet = Extra Leise
+miele.program.dishwasher.hygiene = Hygiene
+miele.program.dishwasher.quickpowerwash = QuickPowerWash
+miele.program.dishwasher.tall-items = Ohne Oberkorb
+
+miele.program.tumbledryer.automatic-plus = Automatic Plus
+miele.program.tumbledryer.cottons = Baumwolle
+miele.program.tumbledryer.cottons-hygiene = Baumwolle Hygiene
+miele.program.tumbledryer.minimum-iron = Pflegeleicht
+miele.program.tumbledryer.gentle-minimum-iron = Pflegeleicht
+miele.program.tumbledryer.woollens-handcare = Finish Wolle
+miele.program.tumbledryer.delicates = Feinwäsche
+miele.program.tumbledryer.warm-air = Lüften warm
+miele.program.tumbledryer.cool-air = Lüften kalt
+miele.program.tumbledryer.express = Express
+miele.program.tumbledryer.cottons-eco = Baumwolle ECO
+miele.program.tumbledryer.gentle-smoothing = Schonglätten
+miele.program.tumbledryer.proofing = Imprägnieren
+miele.program.tumbledryer.denim = Jeans
+miele.program.tumbledryer.gentle-denim = Jeans
+miele.program.tumbledryer.shirts = Oberhemden
+miele.program.tumbledryer.gentle-shirts = Oberhemden
+miele.program.tumbledryer.sportswear = Sportwäsche
+miele.program.tumbledryer.outerwear = Outdoor
+miele.program.tumbledryer.silks-handcare = Finish Seide
+miele.program.tumbledryer.standard-pillows = Kopfkissen normal
+miele.program.tumbledryer.basket-programme = Korbprogramm
+miele.program.tumbledryer.smoothing = Dampfglätten
+miele.program.tumbledryer.cottons-auto-load-control = Baumwolle
+miele.program.tumbledryer.minimum-iron-auto-load-control = Pflegeleicht
+
+miele.program.washingmachine.cottons = Baumwolle
+miele.program.washingmachine.minimum-iron = Pflegeleicht
+miele.program.washingmachine.delicates = Feinwäsche
+miele.program.washingmachine.woollens = Wolle
+miele.program.washingmachine.silks = Seide
+miele.program.washingmachine.starch = Stärken
+miele.program.washingmachine.rinse = Nur spülen
+miele.program.washingmachine.drain-spin = Pumpen/Schleudern
+miele.program.washingmachine.curtains = Gardinen
+miele.program.washingmachine.shirts = Oberhemden
+miele.program.washingmachine.denim = Jeans
+miele.program.washingmachine.proofing = Imprägnieren
+miele.program.washingmachine.sportswear = Sportwäsche
+miele.program.washingmachine.automatic-plus = Automatic plus
+miele.program.washingmachine.outerwear = Outdoor
+miele.program.washingmachine.pillows = Kopfkissen
+miele.program.washingmachine.dark-garments = Dunkle Wäsche
+miele.program.washingmachine.first-wash = Neue Textilien
+miele.program.washingmachine.steam-care = Finish Dampf
+miele.program.washingmachine.freshen-up = Auffrischen
+miele.program.washingmachine.maintenance-wash = Maschine reinigen
+miele.program.washingmachine.down-duvets = Federbetten
+miele.program.washingmachine.express-20 = Express 20
+miele.program.washingmachine.down-filled-items = Daunen
+miele.program.washingmachine.cottons-eco = Baumwolle Eco
+miele.program.washingmachine.quickpowerwash = QuickPowerWash
+miele.program.washingmachine.mix = Einzelteilemix
+
+# miele phases
+
+miele.phase.dishwasher.pre-wash = Vorspülen
+miele.phase.dishwasher.main-wash = Reinigen
+miele.phase.dishwasher.rinses = Spülen
+miele.phase.dishwasher.final-rinse = Klarspülen
+miele.phase.dishwasher.drying = Trocknen
+miele.phase.dishwasher.finished = Ende
+
+miele.phase.oven.heating = Aufheizphase
+miele.phase.oven.temp-hold = Garen
+miele.phase.oven.door-open = Tür geöffnet
+miele.phase.oven.pyrolysis = Pyrolyse
+miele.phase.oven.lighting = Beleuchtung
+miele.phase.oven.searing-phase = Anbratphase
+miele.phase.oven.defrost = Auftauen
+miele.phase.oven.cooling-down = Abkühlen
+miele.phase.oven.energy-save-phase = Energiesparphase
+
+miele.phase.tumbledryer.programme-running = Programm läuft
+miele.phase.tumbledryer.drying = Trocknen
+miele.phase.tumbledryer.drying-machine-iron = Mangelfeucht
+miele.phase.tumbledryer.drying-hand-iron = Bügelfeucht
+miele.phase.tumbledryer.drying-normal = Schranktrocken
+miele.phase.tumbledryer.drying-normal-plus = Schranktrocken+
+miele.phase.tumbledryer.cooling-down = Abkühlen
+miele.phase.tumbledryer.finished = Ende
+
+miele.phase.washingmachine.pre-wash = Vorwaschen
+miele.phase.washingmachine.washing = Waschen
+miele.phase.washingmachine.rinses = Spülen
+miele.phase.washingmachine.clean = Reinigen
+miele.phase.washingmachine.drain = Abpumpen
+miele.phase.washingmachine.spin = Schleudern
+miele.phase.washingmachine.anti-crease = Knitterschutz
+miele.phase.washingmachine.finished = Ende
diff --git a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/i18n/miele_fr.properties b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/i18n/miele_fr.properties
new file mode 100644 (file)
index 0000000..e9ad503
--- /dev/null
@@ -0,0 +1,125 @@
+# miele states
+
+miele.state.off = Arrêt
+miele.state.stand-by = Prêt
+miele.state.programmed = Programme sélectionné
+miele.state.waiting-to-start = Départ différé
+miele.state.running = En cours de fonctionnement
+miele.state.paused = Pause
+miele.state.end = Fin
+#miele.state.failure = 
+miele.state.abort = Interruption
+#miele.state.idle = 
+#miele.state.rinse-hold = 
+#miele.state.service = 
+#miele.state.super-freezing = 
+miele.state.super-cooling = Superfroid
+#miele.state.super-heating = 
+#miele.state.default = 
+#miele.state.locked = 
+#miele.state.not-connected = 
+
+# miele programs
+
+miele.program.dishwasher.intensive = Intensif Plus
+miele.program.dishwasher.maintenance-programme = Nettoyage machine
+miele.program.dishwasher.eco = ECO
+miele.program.dishwasher.normal = Quotidien
+miele.program.dishwasher.automatic = Automatic
+miele.program.dishwasher.solarsave = Economique Solaire
+miele.program.dishwasher.gentle = Fragile
+miele.program.dishwasher.extra-quiet = Extra silencieux
+miele.program.dishwasher.hygiene = Hygiène
+miele.program.dishwasher.quickpowerwash = QuickPowerWash
+miele.program.dishwasher.tall-items = Volumineux
+
+miele.program.tumbledryer.automatic-plus = Automatic plus
+miele.program.tumbledryer.cottons = Coton
+miele.program.tumbledryer.cottons-hygiene = Coton hygiène
+miele.program.tumbledryer.minimum-iron = Synthétique
+miele.program.tumbledryer.gentle-minimum-iron = Synthétique
+miele.program.tumbledryer.woollens-handcare = Laine
+miele.program.tumbledryer.delicates = Fin
+miele.program.tumbledryer.warm-air = Air chaud
+miele.program.tumbledryer.cool-air = Air froid
+miele.program.tumbledryer.express = Express
+miele.program.tumbledryer.cottons-eco = Coton éco
+miele.program.tumbledryer.gentle-smoothing = Défroissage doux
+miele.program.tumbledryer.proofing = Imperméabilisation
+miele.program.tumbledryer.denim = Jeans
+miele.program.tumbledryer.gentle-denim = Jeans
+miele.program.tumbledryer.shirts = Chemises
+miele.program.tumbledryer.gentle-shirts = Chemises
+miele.program.tumbledryer.sportswear = Textiles sport
+miele.program.tumbledryer.outerwear = Outdoor
+miele.program.tumbledryer.silks-handcare = Finish soie
+miele.program.tumbledryer.standard-pillows = Oreillers
+miele.program.tumbledryer.basket-programme = Programme panier
+miele.program.tumbledryer.smoothing = Défroissage vapeur
+miele.program.tumbledryer.cottons-auto-load-control = Coton
+miele.program.tumbledryer.minimum-iron-auto-load-control = Synthétique
+
+miele.program.washingmachine.cottons = Coton
+miele.program.washingmachine.minimum-iron = Synthétique
+miele.program.washingmachine.delicates = Fin
+miele.program.washingmachine.woollens = Laine
+miele.program.washingmachine.silks = Soie
+miele.program.washingmachine.starch = Amidonnage
+miele.program.washingmachine.rinse = Rinçage seul
+miele.program.washingmachine.drain-spin = Vidange/Essorage
+miele.program.washingmachine.curtains = Voilages
+miele.program.washingmachine.shirts = Chemises
+miele.program.washingmachine.denim = Jeans
+miele.program.washingmachine.proofing = Imperméabilisation
+miele.program.washingmachine.sportswear = Textile sport
+miele.program.washingmachine.automatic-plus = Automatic plus
+miele.program.washingmachine.outerwear = Textile moderne
+miele.program.washingmachine.pillows = Oreillers
+miele.program.washingmachine.dark-garments = Textile foncé
+miele.program.washingmachine.first-wash = Vêtements neufs
+miele.program.washingmachine.steam-care = Finish vapeur
+miele.program.washingmachine.freshen-up = Rafraîchir
+miele.program.washingmachine.maintenance-wash = Nettoyer machine
+miele.program.washingmachine.down-duvets = Couettes plumes
+miele.program.washingmachine.express-20 = Express 20
+miele.program.washingmachine.down-filled-items = Textile matelassé
+miele.program.washingmachine.cottons-eco = Coton éco
+miele.program.washingmachine.quickpowerwash = QuickPowerWash
+miele.program.washingmachine.mix = Mix textiles
+
+# miele phases
+
+miele.phase.dishwasher.pre-wash = Prélavage
+miele.phase.dishwasher.main-wash = Lavage
+miele.phase.dishwasher.rinses = Rinçage
+miele.phase.dishwasher.final-rinse = Rinçage final
+miele.phase.dishwasher.drying = Séchage
+miele.phase.dishwasher.finished = Arrêt
+
+miele.phase.oven.heating = Phase de chauffage
+miele.phase.oven.temp-hold = Opération en cours
+miele.phase.oven.door-open = Porte ouverte
+miele.phase.oven.pyrolysis = Pyrolyse
+miele.phase.oven.lighting = Eclairage
+miele.phase.oven.searing-phase = Phase de saisie
+miele.phase.oven.defrost = Décongeler
+miele.phase.oven.cooling-down = Refroidissement
+miele.phase.oven.energy-save-phase = Eco énergie
+
+miele.phase.tumbledryer.programme-running = Déroulement du programme
+miele.phase.tumbledryer.drying = Séchage
+miele.phase.tumbledryer.drying-machine-iron = Repasseuse
+miele.phase.tumbledryer.drying-hand-iron = Fer à repasser
+miele.phase.tumbledryer.drying-normal = Séchage normal
+miele.phase.tumbledryer.drying-normal-plus = Séchage normal+
+miele.phase.tumbledryer.cooling-down = Refroidissement
+miele.phase.tumbledryer.finished = Arrêt
+
+miele.phase.washingmachine.pre-wash = Prélavage
+miele.phase.washingmachine.washing = Lavage
+miele.phase.washingmachine.rinses = Rinçage
+miele.phase.washingmachine.clean = Nettoyage
+miele.phase.washingmachine.drain = Pompage
+miele.phase.washingmachine.spin = Essorage
+miele.phase.washingmachine.anti-crease = Infroissable
+miele.phase.washingmachine.finished = Arrêt
diff --git a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/i18n/miele_nl.properties b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/i18n/miele_nl.properties
new file mode 100644 (file)
index 0000000..66ef336
--- /dev/null
@@ -0,0 +1,125 @@
+# miele states
+
+miele.state.off = Uit
+miele.state.stand-by = Klaar
+miele.state.programmed = Programma geselecteerd
+#miele.state.waiting-to-start = 
+miele.state.running = In gebruik
+miele.state.paused = Pauze
+miele.state.end = Einde
+#miele.state.failure = 
+miele.state.abort = Annulering
+#miele.state.idle = 
+#miele.state.rinse-hold = 
+#miele.state.service = 
+#miele.state.super-freezing = 
+miele.state.super-cooling = Superkoelen
+#miele.state.super-heating = 
+#miele.state.default = 
+#miele.state.locked = 
+#miele.state.not-connected = 
+
+# miele programs
+
+miele.program.dishwasher.intensive = Intensief
+miele.program.dishwasher.maintenance-programme = Machinereiniging
+miele.program.dishwasher.eco = ECO
+miele.program.dishwasher.normal = Normaal
+miele.program.dishwasher.automatic = Automatic
+miele.program.dishwasher.solarsave = Solar Spaar
+miele.program.dishwasher.gentle = Speciaal
+miele.program.dishwasher.extra-quiet = Extra stil
+miele.program.dishwasher.hygiene = Hygiëne
+miele.program.dishwasher.quickpowerwash = QuickPowerWash
+miele.program.dishwasher.tall-items = Zonder bovenrek
+
+miele.program.tumbledryer.automatic-plus = Automatic extra
+miele.program.tumbledryer.cottons = Katoen
+miele.program.tumbledryer.cottons-hygiene = Katoen Hygiëne
+miele.program.tumbledryer.minimum-iron = Kreukherstellend
+miele.program.tumbledryer.gentle-minimum-iron = Kreukherstellend
+miele.program.tumbledryer.woollens-handcare = Wol
+miele.program.tumbledryer.delicates = Fijne was
+miele.program.tumbledryer.warm-air = Warme lucht
+miele.program.tumbledryer.cool-air = Koude lucht
+miele.program.tumbledryer.express = Express
+miele.program.tumbledryer.cottons-eco = Katoen Eco
+miele.program.tumbledryer.gentle-smoothing = Gladstrijken
+miele.program.tumbledryer.proofing = Impregneren
+miele.program.tumbledryer.denim = Jeans
+miele.program.tumbledryer.gentle-denim = Jeans
+miele.program.tumbledryer.shirts = Overhemden
+miele.program.tumbledryer.gentle-shirts = Overhemden
+miele.program.tumbledryer.sportswear = Sportkleding
+miele.program.tumbledryer.outerwear = Outdoor
+miele.program.tumbledryer.silks-handcare = Zijde
+miele.program.tumbledryer.standard-pillows = Hoofdkussens
+miele.program.tumbledryer.basket-programme = Mand witte/bonte was
+miele.program.tumbledryer.smoothing = Gladstomen
+miele.program.tumbledryer.cottons-auto-load-control = Katoen
+miele.program.tumbledryer.minimum-iron-auto-load-control = Kreukherstellend
+
+miele.program.washingmachine.cottons = Witte/Bonte was
+miele.program.washingmachine.minimum-iron = Kreukherstellend
+miele.program.washingmachine.delicates = Fijne was
+miele.program.washingmachine.woollens = Wol
+miele.program.washingmachine.silks = Zijde
+miele.program.washingmachine.starch = Stijven
+miele.program.washingmachine.rinse = Extra spoelen
+miele.program.washingmachine.drain-spin = Pompen/Centrifugeren
+miele.program.washingmachine.curtains = Vitrage
+miele.program.washingmachine.shirts = Overhemden
+miele.program.washingmachine.denim = Jeans
+miele.program.washingmachine.proofing = Impregneren
+miele.program.washingmachine.sportswear = Sportkleding
+miele.program.washingmachine.automatic-plus = Automatic exrta
+miele.program.washingmachine.outerwear = Outdoor
+miele.program.washingmachine.pillows = Hoofdkussens
+miele.program.washingmachine.dark-garments = Donker wasgoed
+miele.program.washingmachine.first-wash = Nieuw textiel
+miele.program.washingmachine.steam-care = Stomen
+miele.program.washingmachine.freshen-up = Opfrissen
+miele.program.washingmachine.maintenance-wash = Apparaat reinigen
+miele.program.washingmachine.down-duvets = Dekbedden
+miele.program.washingmachine.express-20 = Express 20
+miele.program.washingmachine.down-filled-items = Dons
+miele.program.washingmachine.cottons-eco = Witte/Bonte was Eco
+miele.program.washingmachine.quickpowerwash = QuickPowerWash
+miele.program.washingmachine.mix = Artikelenmix
+
+# miele phases
+
+miele.phase.dishwasher.pre-wash = Voorspoelen
+miele.phase.dishwasher.main-wash = Reinigen
+miele.phase.dishwasher.rinses = Spoelen
+miele.phase.dishwasher.final-rinse = Naspoelen
+miele.phase.dishwasher.drying = Drogen
+miele.phase.dishwasher.finished = Einde
+
+miele.phase.oven.heating = Opwarmfase
+miele.phase.oven.temp-hold = Functie actief
+miele.phase.oven.door-open = Deur open
+miele.phase.oven.pyrolysis = Pyrolyse
+miele.phase.oven.lighting = Verlichting
+miele.phase.oven.searing-phase = Aanbraadfase
+miele.phase.oven.defrost = Ontdooien
+miele.phase.oven.cooling-down = Afkoelen
+miele.phase.oven.energy-save-phase = Energiebesparende
+
+miele.phase.tumbledryer.programme-running = Programma wordt uitgevoerd
+miele.phase.tumbledryer.drying = Drogen
+miele.phase.tumbledryer.drying-machine-iron = Mangeldroog
+miele.phase.tumbledryer.drying-hand-iron = Strijkdroog
+miele.phase.tumbledryer.drying-normal = Kastdroog
+miele.phase.tumbledryer.drying-normal-plus = Kastdroog+
+miele.phase.tumbledryer.cooling-down = Afkoelen
+miele.phase.tumbledryer.finished = Einde
+
+miele.phase.washingmachine.pre-wash = Voorwas
+miele.phase.washingmachine.washing = Wassen
+miele.phase.washingmachine.rinses = Spoelen
+miele.phase.washingmachine.clean = Reinigen
+miele.phase.washingmachine.drain = Pompen
+miele.phase.washingmachine.spin = Centrifugeren
+miele.phase.washingmachine.anti-crease = Kreukbeveiliging
+miele.phase.washingmachine.finished = Einde
index d704a54bffc05c32ca74ab449cd6cad4da04aebe..79c69326b565573317a5f7c8ed019b55192c2f81 100644 (file)
@@ -29,7 +29,7 @@
                        <channel id="switch" typeId="switch"/>
                        <channel id="target" typeId="targetTemperature">
                                <label>Temperature</label>
-                               <description>Temperature of the selected program</description>
+                               <description>Temperature of the selected program (10 °C = cold)</description>
                        </channel>
                        <channel id="spinningspeed" typeId="spinningspeed"/>
                        <channel id="powerConsumption" typeId="powerConsumption"/>
index 58d9ca23cbac49911f9db804f20ca96a8c9fea3e..2063c0d4149dacb187986dce8e9aeb5e42b9251c 100644 (file)
                                <label>Password</label>
                                <description>Password for the registered Miele@home user.</description>
                        </parameter>
+                       <parameter name="language" type="text" required="false">
+                               <label>Language</label>
+                               <description>Language for state, program and phase texts. Leave blank for system language.</description>
+                       </parameter>
                </config-description>
        </bridge-type>
 
index d159dd5416f903680563fa93f28c625fff618d85..61599c5d605736486601c4b9ecf441d6fa359226 100644 (file)
@@ -13,6 +13,8 @@
 package org.openhab.binding.miele.internal;
 
 import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 import org.junit.jupiter.api.Test;
 import org.openhab.core.library.types.QuantityType;
@@ -58,6 +60,11 @@ public class DeviceUtilTest extends JavaTest {
         assertEquals(UnDefType.UNDEF, DeviceUtil.getTemperatureState("32768"));
     }
 
+    @Test
+    public void getTemperatureStateColdValueReturns10Degrees() throws NumberFormatException {
+        assertEquals(new QuantityType<>(10, SIUnits.CELSIUS), DeviceUtil.getTemperatureState("-32760"));
+    }
+
     @Test
     public void getTemperatureStateNonNumericValueThrowsNumberFormatException() {
         assertThrows(NumberFormatException.class, () -> DeviceUtil.getTemperatureState("A"));
@@ -67,4 +74,28 @@ public class DeviceUtilTest extends JavaTest {
     public void getTemperatureStateNullValueThrowsNumberFormatException() {
         assertThrows(NumberFormatException.class, () -> DeviceUtil.getTemperatureState(null));
     }
+
+    @Test
+    public void getStateTextStateProviderHasPrecedence() {
+        assertEquals("I brug", this.getStateTextState("5", "Running", "miele.state.running", "I brug"));
+    }
+
+    @Test
+    public void getStateTextStateGatewayTextIsReturnedWhenKeyIsUnknown() {
+        assertEquals("Running", this.getStateTextState("-1", "Running", "key.unknown", "I brug"));
+    }
+
+    @Test
+    public void getStateTextStateKeyIsReturnedWhenUnknownByGatewayAndProvider() {
+        assertEquals("state.99", this.getStateTextState("99", null, "key.unknown", "I brug"));
+    }
+
+    private String getStateTextState(String value, String localizedValue, String mockedKey, String mockedValue) {
+        var metaData = new DeviceMetaData();
+        metaData.LocalizedValue = localizedValue;
+        var translationProvider = mock(MieleTranslationProvider.class);
+        when(translationProvider.getText(mockedKey, metaData.LocalizedValue)).thenReturn(mockedValue);
+
+        return DeviceUtil.getStateTextState(value, metaData, translationProvider).toString();
+    }
 }