]> git.basschouten.com Git - openhab-addons.git/commitdiff
[miele] Fix supercool/superfreeze for fridges/fridge-freezers (#11321)
authorjlaur <jacob-github@vindvejr.dk>
Thu, 30 Sep 2021 07:00:26 +0000 (09:00 +0200)
committerGitHub <noreply@github.com>
Thu, 30 Sep 2021 07:00:26 +0000 (09:00 +0200)
* Fix typos.

Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>
* Do not expose getTypeClass through interface.

Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>
* Fix channel supercool for fridges and partially fix supercool/superfreeze for fridge-freezers.

Fixes #11320

Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>
* Fix two-way channel synchronization for supercool/superfreeze for fridge-freezer.

Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>
18 files changed:
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/ExtendedDeviceStateUtil.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/handler/ApplianceChannelSelector.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/ApplianceStatusListener.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/DishwasherChannelSelector.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/HoodChannelSelector.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/TumbleDryerChannelSelector.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineChannelSelector.java
bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/channeltypes.xml

index 409c9fe23e4d793603d60cc297eb6e642c323697..f8c1692243ba06a20b9ed70eb3a7b18de9f81a55 100644 (file)
@@ -39,7 +39,7 @@ public class ExtendedDeviceStateUtil {
 
     /**
      * Convert string consisting of 8 bit characters to byte array.
-     * Note: This simple operation has been extracted and pure here to document
+     * Note: This simple operation has been extracted and put here to document
      * and ensure correct behavior for 8 bit characters that should be turned
      * into single bytes without any UTF-8 encoding.
      */
index 1c306cd9ee84d5c9bd99d5a68348ed86f9f70576..97af65635dbfa86ad6384807d75e8d9182543f3d 100644 (file)
@@ -32,8 +32,11 @@ public class MieleBindingConstants {
     public static final String PROTOCOL_PROPERTY_NAME = "protocol";
     public static final String SERIAL_NUMBER_PROPERTY_NAME = "serialNumber";
     public static final String EXTENDED_DEVICE_STATE_PROPERTY_NAME = "extendedDeviceState";
+    public static final String STATE_PROPERTY_NAME = "state";
 
     // Shared Channel ID's
+    public static final String SUPERCOOL_CHANNEL_ID = "supercool";
+    public static final String SUPERFREEZE_CHANNEL_ID = "superfreeze";
     public static final String POWER_CONSUMPTION_CHANNEL_ID = "powerConsumption";
     public static final String WATER_CONSUMPTION_CHANNEL_ID = "waterConsumption";
 
@@ -51,6 +54,12 @@ public class MieleBindingConstants {
 
     // Miele devices classes
     public static final String MIELE_DEVICE_CLASS_COFFEE_SYSTEM = "CoffeeSystem";
+    public static final String MIELE_DEVICE_CLASS_FRIDGE = "Fridge";
+    public static final String MIELE_DEVICE_CLASS_FRIDGE_FREEZER = "FridgeFreezer";
+
+    // Miele appliance states
+    public static final int STATE_SUPER_FREEZING = 13;
+    public static final int STATE_SUPER_COOLING = 14;
 
     // Bridge config properties
     public static final String HOST = "ipAddress";
index 260449f3b0ade962b5512fbf02ba58842416f14f..23b9fae8fc2407655b47bc5e84796409fff18fed 100644 (file)
@@ -14,7 +14,6 @@ package org.openhab.binding.miele.internal.handler;
 
 import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData;
 import org.openhab.core.types.State;
-import org.openhab.core.types.Type;
 
 /**
  * The {@link ApplianceChannelSelector} class defines a common interface for
@@ -62,9 +61,4 @@ public interface ApplianceChannelSelector {
      * @param dmd - the device meta data
      */
     State getState(String s, DeviceMetaData dmd);
-
-    /**
-     * Returns "compatible" Type for this datapoint
-     */
-    Class<? extends Type> getTypeClass();
 }
index 769417bf60cd6146e90be1986e444fa7e6a0f58e..9573812405df5728705ba71af653897740fc2a19 100644 (file)
@@ -52,14 +52,14 @@ public interface ApplianceStatusListener {
     void onAppliancePropertyChanged(String serialNumber, DeviceProperty dp);
 
     /**
-     * This method us called whenever an appliance is removed.
+     * This method is called whenever an appliance is removed.
      *
      * @param appliance The XGW homedevice definition of the appliance that was removed
      */
     void onApplianceRemoved(HomeDevice appliance);
 
     /**
-     * This method us called whenever an appliance is added.
+     * This method is called whenever an appliance is added.
      *
      * @param appliance The XGW homedevice definition of the appliance that was removed
      */
index 2395f847091e8041cb09b599bb176e16a865f8f3..44b0bf3bbd3421d2fd50c112cfc55996319ae107 100644 (file)
@@ -89,11 +89,6 @@ public enum CoffeeMachineChannelSelector implements ApplianceChannelSelector {
         return channelID;
     }
 
-    @Override
-    public Class<? extends Type> getTypeClass() {
-        return typeClass;
-    }
-
     @Override
     public boolean isProperty() {
         return isProperty;
index d9b227bc00f412ec7e71692803c0b231eeb6bc5f..a8c819a025c826611aaa662a943aac2d2d1c1c18 100644 (file)
@@ -160,11 +160,6 @@ public enum DishwasherChannelSelector implements ApplianceChannelSelector {
         return channelID;
     }
 
-    @Override
-    public Class<? extends Type> getTypeClass() {
-        return typeClass;
-    }
-
     @Override
     public boolean isProperty() {
         return isProperty;
index ceb8706356b363c7ad626c5fe5e8271afdd2831a..5efdd859d9078c430ce42d25a39f799980d5eb71 100644 (file)
@@ -12,6 +12,8 @@
  */
 package org.openhab.binding.miele.internal.handler;
 
+import static org.openhab.binding.miele.internal.MieleBindingConstants.SUPERCOOL_CHANNEL_ID;
+
 import java.lang.reflect.Method;
 import java.util.Map.Entry;
 
@@ -40,7 +42,7 @@ public enum FridgeChannelSelector implements ApplianceChannelSelector {
     BRAND_ID("brandId", "brandId", StringType.class, true),
     COMPANY_ID("companyId", "companyId", StringType.class, true),
     STATE("state", "state", StringType.class, false),
-    SUPERCOOL(null, "supercool", OnOffType.class, false),
+    SUPERCOOL(null, SUPERCOOL_CHANNEL_ID, OnOffType.class, false),
     FRIDGECURRENTTEMP("currentTemperature", "current", DecimalType.class, false) {
         @Override
         public State getState(String s, DeviceMetaData dmd) {
@@ -99,11 +101,6 @@ public enum FridgeChannelSelector implements ApplianceChannelSelector {
         return channelID;
     }
 
-    @Override
-    public Class<? extends Type> getTypeClass() {
-        return typeClass;
-    }
-
     @Override
     public boolean isProperty() {
         return isProperty;
index c2dbd7417cf28ccac64db5cf13e7dbf5f28a67bb..26a32701408b16e94812d762892853b69f083e86 100644 (file)
@@ -12,6 +12,9 @@
  */
 package org.openhab.binding.miele.internal.handler;
 
+import static org.openhab.binding.miele.internal.MieleBindingConstants.SUPERCOOL_CHANNEL_ID;
+import static org.openhab.binding.miele.internal.MieleBindingConstants.SUPERFREEZE_CHANNEL_ID;
+
 import java.lang.reflect.Method;
 import java.util.Map.Entry;
 
@@ -43,8 +46,8 @@ public enum FridgeFreezerChannelSelector implements ApplianceChannelSelector {
     STATE("state", "state", StringType.class, false),
     FREEZERSTATE("freezerState", "freezerstate", StringType.class, false),
     FRIDGESTATE("fridgeState", "fridgestate", StringType.class, false),
-    SUPERCOOL(null, "supercool", OnOffType.class, false),
-    SUPERFREEZE(null, "superfreeze", OnOffType.class, false),
+    SUPERCOOL(null, SUPERCOOL_CHANNEL_ID, OnOffType.class, false),
+    SUPERFREEZE(null, SUPERFREEZE_CHANNEL_ID, OnOffType.class, false),
     FREEZERCURRENTTEMP("freezerCurrentTemperature", "freezercurrent", DecimalType.class, false) {
         @Override
         public State getState(String s, DeviceMetaData dmd) {
@@ -116,11 +119,6 @@ public enum FridgeFreezerChannelSelector implements ApplianceChannelSelector {
         return channelID;
     }
 
-    @Override
-    public Class<? extends Type> getTypeClass() {
-        return typeClass;
-    }
-
     @Override
     public boolean isProperty() {
         return isProperty;
index 24dd6f75980b3493340a1727a554822d8c5510d8..a3f665cb684cc333f59f6b91684bfd0ea6c1359e 100644 (file)
  */
 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.PROTOCOL_PROPERTY_NAME;
+import static org.openhab.binding.miele.internal.MieleBindingConstants.*;
 
 import org.openhab.binding.miele.internal.FullyQualifiedApplianceIdentifier;
+import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceProperty;
 import org.openhab.core.library.types.OnOffType;
 import org.openhab.core.thing.ChannelUID;
 import org.openhab.core.thing.Thing;
@@ -39,7 +39,7 @@ public class FridgeFreezerHandler extends MieleApplianceHandler<FridgeFreezerCha
     private final Logger logger = LoggerFactory.getLogger(FridgeFreezerHandler.class);
 
     public FridgeFreezerHandler(Thing thing) {
-        super(thing, FridgeFreezerChannelSelector.class, "FridgeFreezer");
+        super(thing, FridgeFreezerChannelSelector.class, MIELE_DEVICE_CLASS_FRIDGE_FREEZER);
     }
 
     @Override
@@ -89,4 +89,34 @@ public class FridgeFreezerHandler extends MieleApplianceHandler<FridgeFreezerCha
                     channelID, command.toString());
         }
     }
+
+    @Override
+    protected void onAppliancePropertyChanged(DeviceProperty dp) {
+        super.onAppliancePropertyChanged(dp);
+
+        if (!dp.Name.equals(STATE_PROPERTY_NAME)) {
+            return;
+        }
+
+        // Supercool/superfreeze is not exposed directly as property, but can be deduced from state.
+        OnOffType superCoolState, superFreezeState;
+        if (dp.Value.equals(String.valueOf(STATE_SUPER_COOLING))) {
+            superCoolState = OnOffType.ON;
+            superFreezeState = OnOffType.OFF;
+        } else if (dp.Value.equals(String.valueOf(STATE_SUPER_FREEZING))) {
+            superCoolState = OnOffType.OFF;
+            superFreezeState = OnOffType.ON;
+        } else {
+            superCoolState = OnOffType.OFF;
+            superFreezeState = OnOffType.OFF;
+        }
+
+        ChannelUID superCoolChannelUid = new ChannelUID(getThing().getUID(), SUPERCOOL_CHANNEL_ID);
+        logger.trace("Update state of {} to {} through '{}'", superCoolChannelUid, superCoolState, dp.Name);
+        updateState(superCoolChannelUid, superCoolState);
+
+        ChannelUID superFreezeChannelUid = new ChannelUID(getThing().getUID(), SUPERFREEZE_CHANNEL_ID);
+        logger.trace("Update state of {} to {} through '{}'", superFreezeChannelUid, superFreezeState, dp.Name);
+        updateState(superFreezeChannelUid, superFreezeState);
+    }
 }
index 60db1c257e1283037bfe551c9a363b69f279913c..79462a5be3b3e97197148834cef3f6f77fe862e4 100644 (file)
  */
 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.PROTOCOL_PROPERTY_NAME;
+import static org.openhab.binding.miele.internal.MieleBindingConstants.*;
 
 import org.openhab.binding.miele.internal.FullyQualifiedApplianceIdentifier;
+import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceProperty;
 import org.openhab.core.library.types.OnOffType;
 import org.openhab.core.thing.ChannelUID;
 import org.openhab.core.thing.Thing;
 import org.openhab.core.types.Command;
 import org.openhab.core.types.RefreshType;
+import org.openhab.core.types.State;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -39,7 +40,7 @@ public class FridgeHandler extends MieleApplianceHandler<FridgeChannelSelector>
     private final Logger logger = LoggerFactory.getLogger(FridgeHandler.class);
 
     public FridgeHandler(Thing thing) {
-        super(thing, FridgeChannelSelector.class, "Fridge");
+        super(thing, FridgeChannelSelector.class, MIELE_DEVICE_CLASS_FRIDGE);
     }
 
     @Override
@@ -89,4 +90,19 @@ public class FridgeHandler extends MieleApplianceHandler<FridgeChannelSelector>
                     channelID, command.toString());
         }
     }
+
+    @Override
+    protected void onAppliancePropertyChanged(DeviceProperty dp) {
+        super.onAppliancePropertyChanged(dp);
+
+        if (!dp.Name.equals(STATE_PROPERTY_NAME)) {
+            return;
+        }
+
+        // Supercool is not exposed directly as property, but can be deduced from state.
+        ChannelUID channelUid = new ChannelUID(getThing().getUID(), SUPERCOOL_CHANNEL_ID);
+        State state = dp.Value.equals(String.valueOf(STATE_SUPER_COOLING)) ? OnOffType.ON : OnOffType.OFF;
+        logger.trace("Update state of {} to {} through '{}'", channelUid, state, dp.Name);
+        updateState(channelUid, state);
+    }
 }
index d588c9b11bb4006c78535f6b61ad36f06e48a316..4c6f1021625641d4fc047681ab73a82985acc7d1 100644 (file)
@@ -119,11 +119,6 @@ public enum HobChannelSelector implements ApplianceChannelSelector {
         return channelID;
     }
 
-    @Override
-    public Class<? extends Type> getTypeClass() {
-        return typeClass;
-    }
-
     @Override
     public boolean isProperty() {
         return isProperty;
index c36f85711b94a96483698d2754df69a0ac411150..0c99dc5caffee2c20f653151f76faf46548ae7ed 100644 (file)
@@ -86,11 +86,6 @@ public enum HoodChannelSelector implements ApplianceChannelSelector {
         return channelID;
     }
 
-    @Override
-    public Class<? extends Type> getTypeClass() {
-        return typeClass;
-    }
-
     @Override
     public boolean isProperty() {
         return isProperty;
index b743d9864a910e5d91f5f0c443e4dc8a13694795..9b7082433fe1b73c2c21f2090d94cfe887ec3a67 100644 (file)
@@ -192,7 +192,7 @@ public abstract class MieleApplianceHandler<E extends Enum<E> & ApplianceChannel
         this.onAppliancePropertyChanged(dp);
     }
 
-    private void onAppliancePropertyChanged(DeviceProperty dp) {
+    protected void onAppliancePropertyChanged(DeviceProperty dp) {
         try {
             DeviceMetaData dmd = null;
             if (dp.Metadata == null) {
index d40c19cf9c48253d2026f4ccd51eeb34ec89c205..9f88b5f0075c47876327b114bb3169ebcde5f3c6 100644 (file)
@@ -281,7 +281,7 @@ public class MieleBridgeHandler extends BaseBridgeHandler {
                                                     listener.onApplianceStateChanged(applianceIdentifier, dco);
                                                 }
                                             } catch (Exception e) {
-                                                logger.debug("An exception occurred while quering an appliance : '{}'",
+                                                logger.debug("An exception occurred while querying an appliance : '{}'",
                                                         e.getMessage());
                                             }
                                         }
@@ -387,7 +387,7 @@ public class MieleBridgeHandler extends BaseBridgeHandler {
                                             break;
                                         }
                                         case "value": {
-                                            dp.Value = subparts[1];
+                                            dp.Value = StringUtils.trim(StringUtils.strip(subparts[1]));
                                             break;
                                         }
                                         case "id": {
@@ -600,7 +600,7 @@ public class MieleBridgeHandler extends BaseBridgeHandler {
     /**
      * This method is called whenever the connection to the given {@link MieleBridge} is resumed.
      *
-     * @param bridge the hue bridge the connection is resumed to
+     * @param bridge the Miele bridge the connection is resumed to
      */
     public void onConnectionResumed() {
         updateStatus(ThingStatus.ONLINE);
index 5749b303bc4c5414eb0dd5bcaa25299f7533de05..bf93d57e51566eb47569f0ba475fea41a240e8ae 100644 (file)
@@ -175,11 +175,6 @@ public enum OvenChannelSelector implements ApplianceChannelSelector {
         return channelID;
     }
 
-    @Override
-    public Class<? extends Type> getTypeClass() {
-        return typeClass;
-    }
-
     @Override
     public boolean isProperty() {
         return isProperty;
index e6b2b5e2c085611ab98345bffd0bedaeb3ceb59d..eec05044510cd7f33a44281fdd2fe3ab9904e33e 100644 (file)
@@ -157,11 +157,6 @@ public enum TumbleDryerChannelSelector implements ApplianceChannelSelector {
         return channelID;
     }
 
-    @Override
-    public Class<? extends Type> getTypeClass() {
-        return typeClass;
-    }
-
     @Override
     public boolean isProperty() {
         return isProperty;
index d54c19236b91e7198e189ce9e9fcaa0e87b153d5..18b50e4f7cf402dea7f51fda4aabac00df945c85 100644 (file)
@@ -182,11 +182,6 @@ public enum WashingMachineChannelSelector implements ApplianceChannelSelector {
         return channelID;
     }
 
-    @Override
-    public Class<? extends Type> getTypeClass() {
-        return typeClass;
-    }
-
     @Override
     public boolean isProperty() {
         return isProperty;
index 38b136e7dbe6aa1b48a710e191575965fbb27dab..72721267faf53ba077cc530f1fb30e73aeba13e8 100644 (file)
        </channel-type>
 
        <channel-type id="supercool" advanced="false">
-               <item-type>String</item-type>
+               <item-type>Switch</item-type>
                <label>Super Cool</label>
                <description>Start Super Cooling</description>
-               <state readOnly="true"></state>
+               <state readOnly="false"></state>
        </channel-type>
 
        <channel-type id="current" advanced="false">
        </channel-type>
 
        <channel-type id="superfreeze" advanced="false">
-               <item-type>String</item-type>
+               <item-type>Switch</item-type>
                <label>Super Freeze</label>
                <description>Start Super Freezing</description>
-               <state readOnly="true"></state>
+               <state readOnly="false"></state>
        </channel-type>
 
        <channel-type id="freezercurrent" advanced="false">