* 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>
/**
* 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.
*/
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";
// 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";
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
* @param dmd - the device meta data
*/
State getState(String s, DeviceMetaData dmd);
-
- /**
- * Returns "compatible" Type for this datapoint
- */
- Class<? extends Type> getTypeClass();
}
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
*/
return channelID;
}
- @Override
- public Class<? extends Type> getTypeClass() {
- return typeClass;
- }
-
@Override
public boolean isProperty() {
return isProperty;
return channelID;
}
- @Override
- public Class<? extends Type> getTypeClass() {
- return typeClass;
- }
-
@Override
public boolean isProperty() {
return isProperty;
*/
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;
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) {
return channelID;
}
- @Override
- public Class<? extends Type> getTypeClass() {
- return typeClass;
- }
-
@Override
public boolean isProperty() {
return isProperty;
*/
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;
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) {
return channelID;
}
- @Override
- public Class<? extends Type> getTypeClass() {
- return typeClass;
- }
-
@Override
public boolean isProperty() {
return isProperty;
*/
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;
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
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);
+ }
}
*/
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;
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
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);
+ }
}
return channelID;
}
- @Override
- public Class<? extends Type> getTypeClass() {
- return typeClass;
- }
-
@Override
public boolean isProperty() {
return isProperty;
return channelID;
}
- @Override
- public Class<? extends Type> getTypeClass() {
- return typeClass;
- }
-
@Override
public boolean isProperty() {
return isProperty;
this.onAppliancePropertyChanged(dp);
}
- private void onAppliancePropertyChanged(DeviceProperty dp) {
+ protected void onAppliancePropertyChanged(DeviceProperty dp) {
try {
DeviceMetaData dmd = null;
if (dp.Metadata == null) {
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());
}
}
break;
}
case "value": {
- dp.Value = subparts[1];
+ dp.Value = StringUtils.trim(StringUtils.strip(subparts[1]));
break;
}
case "id": {
/**
* 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);
return channelID;
}
- @Override
- public Class<? extends Type> getTypeClass() {
- return typeClass;
- }
-
@Override
public boolean isProperty() {
return isProperty;
return channelID;
}
- @Override
- public Class<? extends Type> getTypeClass() {
- return typeClass;
- }
-
@Override
public boolean isProperty() {
return isProperty;
return channelID;
}
- @Override
- public Class<? extends Type> getTypeClass() {
- return typeClass;
- }
-
@Override
public boolean isProperty() {
return isProperty;
</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">