From 0d7223c8974e31093e34a29515af885abe1e9376 Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Sat, 23 Oct 2021 10:22:32 +0200 Subject: [PATCH 01/26] Use appliance cache for getting full UID with protocol prefix instead of relying on property. Fixes #11422 Signed-off-by: Jacob Laursen --- .../handler/CoffeeMachineHandler.java | 8 +- .../internal/handler/DishWasherHandler.java | 8 +- .../handler/FridgeFreezerHandler.java | 11 +- .../miele/internal/handler/FridgeHandler.java | 9 +- .../miele/internal/handler/HoodHandler.java | 10 +- .../internal/handler/MieleBridgeHandler.java | 200 ++++++++++-------- .../miele/internal/handler/OvenHandler.java | 10 +- .../internal/handler/TumbleDryerHandler.java | 8 +- .../handler/WashingMachineHandler.java | 8 +- 9 files changed, 132 insertions(+), 140 deletions(-) diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/CoffeeMachineHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/CoffeeMachineHandler.java index 2b5083d362120..db0514a0ee626 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/CoffeeMachineHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/CoffeeMachineHandler.java @@ -14,9 +14,7 @@ import static org.openhab.binding.miele.internal.MieleBindingConstants.APPLIANCE_ID; import static org.openhab.binding.miele.internal.MieleBindingConstants.MIELE_DEVICE_CLASS_COFFEE_SYSTEM; -import static org.openhab.binding.miele.internal.MieleBindingConstants.PROTOCOL_PROPERTY_NAME; -import org.openhab.binding.miele.internal.FullyQualifiedApplianceIdentifier; import org.openhab.core.library.types.OnOffType; import org.openhab.core.thing.ChannelUID; import org.openhab.core.thing.Thing; @@ -49,8 +47,6 @@ public void handleCommand(ChannelUID channelUID, Command command) { String channelID = channelUID.getId(); String applianceId = (String) getThing().getConfiguration().getProperties().get(APPLIANCE_ID); - String protocol = getThing().getProperties().get(PROTOCOL_PROPERTY_NAME); - var applianceIdentifier = new FullyQualifiedApplianceIdentifier(applianceId, protocol); CoffeeMachineChannelSelector selector = (CoffeeMachineChannelSelector) getValueSelectorFromChannelID(channelID); JsonElement result = null; @@ -60,9 +56,9 @@ public void handleCommand(ChannelUID channelUID, Command command) { switch (selector) { case SWITCH: { if (command.equals(OnOffType.ON)) { - result = bridgeHandler.invokeOperation(applianceIdentifier, modelID, "switchOn"); + result = bridgeHandler.invokeOperation(applianceId, modelID, "switchOn"); } else if (command.equals(OnOffType.OFF)) { - result = bridgeHandler.invokeOperation(applianceIdentifier, modelID, "switchOff"); + result = bridgeHandler.invokeOperation(applianceId, modelID, "switchOff"); } break; } diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/DishWasherHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/DishWasherHandler.java index de0d8d61de711..17791a24f7db7 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/DishWasherHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/DishWasherHandler.java @@ -14,12 +14,10 @@ import static org.openhab.binding.miele.internal.MieleBindingConstants.APPLIANCE_ID; import static org.openhab.binding.miele.internal.MieleBindingConstants.POWER_CONSUMPTION_CHANNEL_ID; -import static org.openhab.binding.miele.internal.MieleBindingConstants.PROTOCOL_PROPERTY_NAME; import static org.openhab.binding.miele.internal.MieleBindingConstants.WATER_CONSUMPTION_CHANNEL_ID; import java.math.BigDecimal; -import org.openhab.binding.miele.internal.FullyQualifiedApplianceIdentifier; import org.openhab.core.library.types.OnOffType; import org.openhab.core.library.types.QuantityType; import org.openhab.core.library.unit.Units; @@ -60,8 +58,6 @@ public void handleCommand(ChannelUID channelUID, Command command) { String channelID = channelUID.getId(); String applianceId = (String) getThing().getConfiguration().getProperties().get(APPLIANCE_ID); - String protocol = getThing().getProperties().get(PROTOCOL_PROPERTY_NAME); - var applianceIdentifier = new FullyQualifiedApplianceIdentifier(applianceId, protocol); DishwasherChannelSelector selector = (DishwasherChannelSelector) getValueSelectorFromChannelID(channelID); JsonElement result = null; @@ -71,9 +67,9 @@ public void handleCommand(ChannelUID channelUID, Command command) { switch (selector) { case SWITCH: { if (command.equals(OnOffType.ON)) { - result = bridgeHandler.invokeOperation(applianceIdentifier, modelID, "start"); + result = bridgeHandler.invokeOperation(applianceId, modelID, "start"); } else if (command.equals(OnOffType.OFF)) { - result = bridgeHandler.invokeOperation(applianceIdentifier, modelID, "stop"); + result = bridgeHandler.invokeOperation(applianceId, modelID, "stop"); } break; } diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeFreezerHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeFreezerHandler.java index a3f665cb684cc..b7ff6b1d8829e 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeFreezerHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeFreezerHandler.java @@ -14,7 +14,6 @@ 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; @@ -48,8 +47,6 @@ public void handleCommand(ChannelUID channelUID, Command command) { String channelID = channelUID.getId(); String applianceId = (String) getThing().getConfiguration().getProperties().get(APPLIANCE_ID); - String protocol = getThing().getProperties().get(PROTOCOL_PROPERTY_NAME); - var applianceIdentifier = new FullyQualifiedApplianceIdentifier(applianceId, protocol); FridgeFreezerChannelSelector selector = (FridgeFreezerChannelSelector) getValueSelectorFromChannelID(channelID); JsonElement result = null; @@ -59,17 +56,17 @@ public void handleCommand(ChannelUID channelUID, Command command) { switch (selector) { case SUPERCOOL: { if (command.equals(OnOffType.ON)) { - result = bridgeHandler.invokeOperation(applianceIdentifier, modelID, "startSuperCooling"); + result = bridgeHandler.invokeOperation(applianceId, modelID, "startSuperCooling"); } else if (command.equals(OnOffType.OFF)) { - result = bridgeHandler.invokeOperation(applianceIdentifier, modelID, "stopSuperCooling"); + result = bridgeHandler.invokeOperation(applianceId, modelID, "stopSuperCooling"); } break; } case SUPERFREEZE: { if (command.equals(OnOffType.ON)) { - result = bridgeHandler.invokeOperation(applianceIdentifier, modelID, "startSuperFreezing"); + result = bridgeHandler.invokeOperation(applianceId, modelID, "startSuperFreezing"); } else if (command.equals(OnOffType.OFF)) { - result = bridgeHandler.invokeOperation(applianceIdentifier, modelID, "stopSuperFreezing"); + result = bridgeHandler.invokeOperation(applianceId, modelID, "stopSuperFreezing"); } break; } diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeHandler.java index 79462a5be3b3e..e6371215f7271 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeHandler.java @@ -14,7 +14,6 @@ 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; @@ -49,8 +48,6 @@ public void handleCommand(ChannelUID channelUID, Command command) { String channelID = channelUID.getId(); String applianceId = (String) getThing().getConfiguration().getProperties().get(APPLIANCE_ID); - String protocol = getThing().getProperties().get(PROTOCOL_PROPERTY_NAME); - var applianceIdentifier = new FullyQualifiedApplianceIdentifier(applianceId, protocol); FridgeChannelSelector selector = (FridgeChannelSelector) getValueSelectorFromChannelID(channelID); JsonElement result = null; @@ -60,15 +57,15 @@ public void handleCommand(ChannelUID channelUID, Command command) { switch (selector) { case SUPERCOOL: { if (command.equals(OnOffType.ON)) { - result = bridgeHandler.invokeOperation(applianceIdentifier, modelID, "startSuperCooling"); + result = bridgeHandler.invokeOperation(applianceId, modelID, "startSuperCooling"); } else if (command.equals(OnOffType.OFF)) { - result = bridgeHandler.invokeOperation(applianceIdentifier, modelID, "stopSuperCooling"); + result = bridgeHandler.invokeOperation(applianceId, modelID, "stopSuperCooling"); } break; } case START: { if (command.equals(OnOffType.ON)) { - result = bridgeHandler.invokeOperation(applianceIdentifier, modelID, "start"); + result = bridgeHandler.invokeOperation(applianceId, modelID, "start"); } break; } diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/HoodHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/HoodHandler.java index f89c11d0db577..272f0d7bf82bc 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/HoodHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/HoodHandler.java @@ -13,9 +13,7 @@ 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 org.openhab.binding.miele.internal.FullyQualifiedApplianceIdentifier; import org.openhab.core.library.types.OnOffType; import org.openhab.core.thing.ChannelUID; import org.openhab.core.thing.Thing; @@ -48,8 +46,6 @@ public void handleCommand(ChannelUID channelUID, Command command) { String channelID = channelUID.getId(); String applianceId = (String) getThing().getConfiguration().getProperties().get(APPLIANCE_ID); - String protocol = getThing().getProperties().get(PROTOCOL_PROPERTY_NAME); - var applianceIdentifier = new FullyQualifiedApplianceIdentifier(applianceId, protocol); HoodChannelSelector selector = (HoodChannelSelector) getValueSelectorFromChannelID(channelID); JsonElement result = null; @@ -59,15 +55,15 @@ public void handleCommand(ChannelUID channelUID, Command command) { switch (selector) { case LIGHT: { if (command.equals(OnOffType.ON)) { - result = bridgeHandler.invokeOperation(applianceIdentifier, modelID, "startLighting"); + result = bridgeHandler.invokeOperation(applianceId, modelID, "startLighting"); } else if (command.equals(OnOffType.OFF)) { - result = bridgeHandler.invokeOperation(applianceIdentifier, modelID, "stopLighting"); + result = bridgeHandler.invokeOperation(applianceId, modelID, "stopLighting"); } break; } case STOP: { if (command.equals(OnOffType.ON)) { - result = bridgeHandler.invokeOperation(applianceIdentifier, modelID, "stop"); + result = bridgeHandler.invokeOperation(applianceId, modelID, "stop"); } break; } diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java index 9f88b5f0075c4..6bf71ab048f09 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java @@ -31,10 +31,13 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Random; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -45,6 +48,7 @@ import java.util.zip.GZIPInputStream; import org.apache.commons.lang3.StringUtils; +import org.eclipse.jdt.annotation.NonNull; import org.openhab.binding.miele.internal.FullyQualifiedApplianceIdentifier; import org.openhab.core.common.NamedThreadFactory; import org.openhab.core.thing.Bridge; @@ -76,7 +80,8 @@ **/ public class MieleBridgeHandler extends BaseBridgeHandler { - public static final Set SUPPORTED_THING_TYPES = Collections.singleton(THING_TYPE_XGW3000); + @NonNull + public static final Set<@NonNull ThingTypeUID> SUPPORTED_THING_TYPES = Collections.singleton(THING_TYPE_XGW3000); private static final Pattern IP_PATTERN = Pattern .compile("^(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])$"); @@ -97,7 +102,8 @@ public class MieleBridgeHandler extends BaseBridgeHandler { protected ExecutorService executor; protected Future eventListenerJob; - protected List previousHomeDevices = new CopyOnWriteArrayList<>(); + @NonNull + protected Map cachedHomeDevices = new ConcurrentHashMap(); protected URL url; protected Map headers; @@ -206,95 +212,94 @@ public void initialize() { private Runnable pollingRunnable = new Runnable() { @Override public void run() { - if (IP_PATTERN.matcher((String) getConfig().get(HOST)).matches()) { - try { - if (isReachable((String) getConfig().get(HOST))) { - currentBridgeConnectionState = true; - } else { - currentBridgeConnectionState = false; - lastBridgeConnectionState = false; - onConnectionLost(); + if (!IP_PATTERN.matcher((String) getConfig().get(HOST)).matches()) { + logger.debug("Invalid IP address for the Miele@Home gateway : '{}'", getConfig().get(HOST)); + return; + } + + try { + if (isReachable((String) getConfig().get(HOST))) { + currentBridgeConnectionState = true; + } else { + currentBridgeConnectionState = false; + lastBridgeConnectionState = false; + onConnectionLost(); + } + + if (!lastBridgeConnectionState && currentBridgeConnectionState) { + logger.debug("Connection to Miele Gateway {} established.", getConfig().get(HOST)); + lastBridgeConnectionState = true; + onConnectionResumed(); + } + + if (!currentBridgeConnectionState || getThing().getStatus() != ThingStatus.ONLINE) { + return; + } + + List homeDevices = getHomeDevices(); + for (HomeDevice hd : homeDevices) { + String key = hd.getApplianceIdentifier().getApplianceId(); + if (!cachedHomeDevices.containsKey(key)) { + logger.debug("A new appliance with ID '{}' has been added", hd.UID); + for (ApplianceStatusListener listener : applianceStatusListeners) { + listener.onApplianceAdded(hd); + } } + cachedHomeDevices.put(key, hd); + } - if (!lastBridgeConnectionState && currentBridgeConnectionState) { - logger.debug("Connection to Miele Gateway {} established.", getConfig().get(HOST)); - lastBridgeConnectionState = true; - onConnectionResumed(); + @NonNull + Set<@NonNull Entry> cachedEntries = cachedHomeDevices.entrySet(); + @NonNull + Iterator<@NonNull Entry> iterator = cachedEntries.iterator(); + + while (iterator.hasNext()) { + Entry cachedEntry = iterator.next(); + HomeDevice cachedHomeDevice = cachedEntry.getValue(); + if (!homeDevices.stream().anyMatch(d -> d.UID.equals(cachedHomeDevice.UID))) { + logger.debug("The appliance with ID '{}' has been removed", cachedHomeDevice.UID); + for (ApplianceStatusListener listener : applianceStatusListeners) { + listener.onApplianceRemoved(cachedHomeDevice); + } + iterator.remove(); } + } - if (currentBridgeConnectionState) { - if (getThing().getStatus() == ThingStatus.ONLINE) { - List currentHomeDevices = getHomeDevices(); - for (HomeDevice hd : currentHomeDevices) { - boolean isExisting = false; - for (HomeDevice phd : previousHomeDevices) { - if (phd.UID.equals(hd.UID)) { - isExisting = true; - break; - } - } - if (!isExisting) { - logger.debug("A new appliance with ID '{}' has been added", hd.UID); - for (ApplianceStatusListener listener : applianceStatusListeners) { - listener.onApplianceAdded(hd); - } - } - } + for (Thing appliance : getThing().getThings()) { + if (appliance.getStatus() == ThingStatus.ONLINE) { + String applianceId = (String) appliance.getConfiguration().getProperties().get(APPLIANCE_ID); + FullyQualifiedApplianceIdentifier applianceIdentifier = getApplianceIdentifierFromApplianceId( + applianceId); - for (HomeDevice hd : previousHomeDevices) { - boolean isCurrent = false; - for (HomeDevice chd : currentHomeDevices) { - if (chd.UID.equals(hd.UID)) { - isCurrent = true; - break; - } - } - if (!isCurrent) { - logger.debug("The appliance with ID '{}' has been removed", hd); - for (ApplianceStatusListener listener : applianceStatusListeners) { - listener.onApplianceRemoved(hd); - } - } - } + if (applianceIdentifier == null) { + logger.error("The appliance with ID '{}' was not found in appliance list from bridge.", + applianceId); + continue; + } - previousHomeDevices = currentHomeDevices; - - for (Thing appliance : getThing().getThings()) { - if (appliance.getStatus() == ThingStatus.ONLINE) { - String applianceId = (String) appliance.getConfiguration().getProperties() - .get(APPLIANCE_ID); - String protocol = appliance.getProperties().get(PROTOCOL_PROPERTY_NAME); - var applianceIdentifier = new FullyQualifiedApplianceIdentifier(applianceId, - protocol); - - Object[] args = new Object[2]; - args[0] = applianceIdentifier.getUid(); - args[1] = true; - JsonElement result = invokeRPC("HDAccess/getDeviceClassObjects", args); - - if (result != null) { - for (JsonElement obj : result.getAsJsonArray()) { - try { - DeviceClassObject dco = gson.fromJson(obj, DeviceClassObject.class); - - for (ApplianceStatusListener listener : applianceStatusListeners) { - listener.onApplianceStateChanged(applianceIdentifier, dco); - } - } catch (Exception e) { - logger.debug("An exception occurred while querying an appliance : '{}'", - e.getMessage()); - } - } + Object[] args = new Object[2]; + args[0] = applianceIdentifier.getUid(); + args[1] = true; + JsonElement result = invokeRPC("HDAccess/getDeviceClassObjects", args); + + if (result != null) { + for (JsonElement obj : result.getAsJsonArray()) { + try { + DeviceClassObject dco = gson.fromJson(obj, DeviceClassObject.class); + + for (ApplianceStatusListener listener : applianceStatusListeners) { + listener.onApplianceStateChanged(applianceIdentifier, dco); } + } catch (Exception e) { + logger.debug("An exception occurred while querying an appliance : '{}'", + e.getMessage()); } } } } - } catch (Exception e) { - logger.debug("An exception occurred while polling an appliance :'{}'", e.getMessage()); } - } else { - logger.debug("Invalid IP address for the Miele@Home gateway : '{}'", getConfig().get(HOST)); + } catch (Exception e) { + logger.debug("An exception occurred while polling an appliance :'{}'", e.getMessage()); } } @@ -339,6 +344,15 @@ public List getHomeDevices() { return devices; } + private FullyQualifiedApplianceIdentifier getApplianceIdentifierFromApplianceId(String applianceId) { + HomeDevice homeDevice = this.cachedHomeDevices.get(applianceId); + if (homeDevice == null) { + return null; + } + + return homeDevice.getApplianceIdentifier(); + } + private Runnable eventListenerRunnable = () -> { if (IP_PATTERN.matcher((String) getConfig().get(INTERFACE)).matches()) { while (true) { @@ -445,19 +459,27 @@ public List getHomeDevices() { } }; - public JsonElement invokeOperation(FullyQualifiedApplianceIdentifier applianceIdentifier, String modelID, - String methodName) { - if (getThing().getStatus() == ThingStatus.ONLINE) { - Object[] args = new Object[4]; - args[0] = applianceIdentifier.getUid(); - args[1] = "com.miele.xgw3000.gateway.hdm.deviceclasses.Miele" + modelID; - args[2] = methodName; - args[3] = null; - return invokeRPC("HDAccess/invokeDCOOperation", args); - } else { + public JsonElement invokeOperation(String applianceId, String modelID, String methodName) { + if (getThing().getStatus() != ThingStatus.ONLINE) { logger.debug("The Bridge is offline - operations can not be invoked."); return null; } + + FullyQualifiedApplianceIdentifier applianceIdentifier = getApplianceIdentifierFromApplianceId(applianceId); + if (applianceIdentifier == null) { + logger.error( + "The appliance with ID '{}' was not found in appliance list from bridge - operations can not be invoked.", + applianceId); + return null; + } + + Object[] args = new Object[4]; + args[0] = applianceIdentifier.getUid(); + args[1] = "com.miele.xgw3000.gateway.hdm.deviceclasses.Miele" + modelID; + args[2] = methodName; + args[3] = null; + + return invokeRPC("HDAccess/invokeDCOOperation", args); } protected JsonElement invokeRPC(String methodName, Object[] args) { diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenHandler.java index 20d2fdb0ae09c..d3b7ea761383d 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenHandler.java @@ -13,9 +13,7 @@ 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 org.openhab.binding.miele.internal.FullyQualifiedApplianceIdentifier; import org.openhab.core.library.types.OnOffType; import org.openhab.core.thing.ChannelUID; import org.openhab.core.thing.Thing; @@ -49,8 +47,6 @@ public void handleCommand(ChannelUID channelUID, Command command) { String channelID = channelUID.getId(); String applianceId = (String) getThing().getConfiguration().getProperties().get(APPLIANCE_ID); - String protocol = getThing().getProperties().get(PROTOCOL_PROPERTY_NAME); - var applianceIdentifier = new FullyQualifiedApplianceIdentifier(applianceId, protocol); OvenChannelSelector selector = (OvenChannelSelector) getValueSelectorFromChannelID(channelID); JsonElement result = null; @@ -60,15 +56,15 @@ public void handleCommand(ChannelUID channelUID, Command command) { switch (selector) { case SWITCH: { if (command.equals(OnOffType.ON)) { - result = bridgeHandler.invokeOperation(applianceIdentifier, modelID, "switchOn"); + result = bridgeHandler.invokeOperation(applianceId, modelID, "switchOn"); } else if (command.equals(OnOffType.OFF)) { - result = bridgeHandler.invokeOperation(applianceIdentifier, modelID, "switchOff"); + result = bridgeHandler.invokeOperation(applianceId, modelID, "switchOff"); } break; } case STOP: { if (command.equals(OnOffType.ON)) { - result = bridgeHandler.invokeOperation(applianceIdentifier, modelID, "stop"); + result = bridgeHandler.invokeOperation(applianceId, modelID, "stop"); } break; } diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/TumbleDryerHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/TumbleDryerHandler.java index 3ffe5cc12a513..80c28e205edc4 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/TumbleDryerHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/TumbleDryerHandler.java @@ -13,9 +13,7 @@ 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 org.openhab.binding.miele.internal.FullyQualifiedApplianceIdentifier; import org.openhab.core.library.types.OnOffType; import org.openhab.core.thing.ChannelUID; import org.openhab.core.thing.Thing; @@ -49,8 +47,6 @@ public void handleCommand(ChannelUID channelUID, Command command) { String channelID = channelUID.getId(); String applianceId = (String) getThing().getConfiguration().getProperties().get(APPLIANCE_ID); - String protocol = getThing().getProperties().get(PROTOCOL_PROPERTY_NAME); - var applianceIdentifier = new FullyQualifiedApplianceIdentifier(applianceId, protocol); TumbleDryerChannelSelector selector = (TumbleDryerChannelSelector) getValueSelectorFromChannelID(channelID); JsonElement result = null; @@ -60,9 +56,9 @@ public void handleCommand(ChannelUID channelUID, Command command) { switch (selector) { case SWITCH: { if (command.equals(OnOffType.ON)) { - result = bridgeHandler.invokeOperation(applianceIdentifier, modelID, "start"); + result = bridgeHandler.invokeOperation(applianceId, modelID, "start"); } else if (command.equals(OnOffType.OFF)) { - result = bridgeHandler.invokeOperation(applianceIdentifier, modelID, "stop"); + result = bridgeHandler.invokeOperation(applianceId, modelID, "stop"); } break; } diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineHandler.java index 350281a45fba0..cca617b2d2147 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineHandler.java @@ -14,12 +14,10 @@ import static org.openhab.binding.miele.internal.MieleBindingConstants.APPLIANCE_ID; import static org.openhab.binding.miele.internal.MieleBindingConstants.POWER_CONSUMPTION_CHANNEL_ID; -import static org.openhab.binding.miele.internal.MieleBindingConstants.PROTOCOL_PROPERTY_NAME; import static org.openhab.binding.miele.internal.MieleBindingConstants.WATER_CONSUMPTION_CHANNEL_ID; import java.math.BigDecimal; -import org.openhab.binding.miele.internal.FullyQualifiedApplianceIdentifier; import org.openhab.core.library.types.OnOffType; import org.openhab.core.library.types.QuantityType; import org.openhab.core.library.unit.Units; @@ -60,8 +58,6 @@ public void handleCommand(ChannelUID channelUID, Command command) { String channelID = channelUID.getId(); String applianceId = (String) getThing().getConfiguration().getProperties().get(APPLIANCE_ID); - String protocol = getThing().getProperties().get(PROTOCOL_PROPERTY_NAME); - var applianceIdentifier = new FullyQualifiedApplianceIdentifier(applianceId, protocol); WashingMachineChannelSelector selector = (WashingMachineChannelSelector) getValueSelectorFromChannelID( channelID); @@ -72,9 +68,9 @@ public void handleCommand(ChannelUID channelUID, Command command) { switch (selector) { case SWITCH: { if (command.equals(OnOffType.ON)) { - result = bridgeHandler.invokeOperation(applianceIdentifier, modelID, "start"); + result = bridgeHandler.invokeOperation(applianceId, modelID, "start"); } else if (command.equals(OnOffType.OFF)) { - result = bridgeHandler.invokeOperation(applianceIdentifier, modelID, "stop"); + result = bridgeHandler.invokeOperation(applianceId, modelID, "stop"); } break; } From 4768ebff90d9d910ca6a32fc41335aa3ce1e1058 Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Sat, 23 Oct 2021 10:34:25 +0200 Subject: [PATCH 02/26] Set bare protocol name as property. Signed-off-by: Jacob Laursen --- .../internal/discovery/MieleApplianceDiscoveryService.java | 2 +- .../binding/miele/internal/handler/MieleApplianceHandler.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/discovery/MieleApplianceDiscoveryService.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/discovery/MieleApplianceDiscoveryService.java index e604686cbe4b5..6d4f17861b774 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/discovery/MieleApplianceDiscoveryService.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/discovery/MieleApplianceDiscoveryService.java @@ -104,7 +104,7 @@ private void onApplianceAddedInternal(HomeDevice appliance) { Map properties = new HashMap<>(2); FullyQualifiedApplianceIdentifier applianceIdentifier = appliance.getApplianceIdentifier(); - properties.put(PROTOCOL_PROPERTY_NAME, applianceIdentifier.getProtocol()); + properties.put(PROTOCOL_PROPERTY_NAME, appliance.ProtocolAdapterName); properties.put(APPLIANCE_ID, applianceIdentifier.getApplianceId()); properties.put(SERIAL_NUMBER_PROPERTY_NAME, appliance.getSerialNumber()); diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java index b2a7b70e78b61..30217f2360b9e 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java @@ -318,7 +318,7 @@ public void onApplianceAdded(HomeDevice appliance) { if (applianceId.equals(applianceIdentifier.getApplianceId())) { Map properties = editProperties(); - properties.put(PROTOCOL_PROPERTY_NAME, applianceIdentifier.getProtocol()); + properties.put(PROTOCOL_PROPERTY_NAME, appliance.ProtocolAdapterName); properties.put(SERIAL_NUMBER_PROPERTY_NAME, appliance.getSerialNumber()); updateProperties(properties); updateStatus(ThingStatus.ONLINE); From 5194e981e1c0fc4f442e76680bf96a5d2c1bff25 Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Sat, 23 Oct 2021 11:14:31 +0200 Subject: [PATCH 03/26] Fix potential null pointer access warnings. Signed-off-by: Jacob Laursen --- .../binding/miele/internal/handler/CoffeeMachineHandler.java | 2 +- .../binding/miele/internal/handler/DishWasherHandler.java | 2 +- .../binding/miele/internal/handler/FridgeFreezerHandler.java | 2 +- .../binding/miele/internal/handler/FridgeHandler.java | 2 +- .../openhab/binding/miele/internal/handler/HoodHandler.java | 2 +- .../miele/internal/handler/MieleApplianceHandler.java | 5 ++++- .../openhab/binding/miele/internal/handler/OvenHandler.java | 2 +- .../binding/miele/internal/handler/TumbleDryerHandler.java | 2 +- .../miele/internal/handler/WashingMachineHandler.java | 2 +- 9 files changed, 12 insertions(+), 9 deletions(-) diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/CoffeeMachineHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/CoffeeMachineHandler.java index db0514a0ee626..cff9f134c5cc7 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/CoffeeMachineHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/CoffeeMachineHandler.java @@ -71,7 +71,7 @@ public void handleCommand(ChannelUID channelUID, Command command) { } } // process result - if (isResultProcessable(result)) { + if (result != null && isResultProcessable(result)) { logger.debug("Result of operation is {}", result.getAsString()); } } catch (IllegalArgumentException e) { diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/DishWasherHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/DishWasherHandler.java index 17791a24f7db7..ca5a44524d425 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/DishWasherHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/DishWasherHandler.java @@ -82,7 +82,7 @@ public void handleCommand(ChannelUID channelUID, Command command) { } } // process result - if (isResultProcessable(result)) { + if (result != null && isResultProcessable(result)) { logger.debug("Result of operation is {}", result.getAsString()); } } catch (IllegalArgumentException e) { diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeFreezerHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeFreezerHandler.java index b7ff6b1d8829e..fb07a7b9b2d11 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeFreezerHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeFreezerHandler.java @@ -77,7 +77,7 @@ public void handleCommand(ChannelUID channelUID, Command command) { } } // process result - if (isResultProcessable(result)) { + if (result != null && isResultProcessable(result)) { logger.debug("Result of operation is {}", result.getAsString()); } } catch (IllegalArgumentException e) { diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeHandler.java index e6371215f7271..2734860ab8447 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeHandler.java @@ -78,7 +78,7 @@ public void handleCommand(ChannelUID channelUID, Command command) { } } // process result - if (isResultProcessable(result)) { + if (result != null && isResultProcessable(result)) { logger.debug("Result of operation is {}", result.getAsString()); } } catch (IllegalArgumentException e) { diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/HoodHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/HoodHandler.java index 272f0d7bf82bc..5a9e87090623b 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/HoodHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/HoodHandler.java @@ -74,7 +74,7 @@ public void handleCommand(ChannelUID channelUID, Command command) { } } // process result - if (isResultProcessable(result)) { + if (result != null && isResultProcessable(result)) { logger.debug("Result of operation is {}", result.getAsString()); } } catch (IllegalArgumentException e) { diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java index 30217f2360b9e..109abd7f2680b 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java @@ -343,6 +343,9 @@ private synchronized MieleBridgeHandler getMieleBridgeHandler() { } protected boolean isResultProcessable(JsonElement result) { - return result != null && !result.isJsonNull(); + if (result == null) { + throw new IllegalArgumentException("Provided result is null"); + } + return !result.isJsonNull(); } } diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenHandler.java index d3b7ea761383d..9a88df00befff 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenHandler.java @@ -77,7 +77,7 @@ public void handleCommand(ChannelUID channelUID, Command command) { } } // process result - if (isResultProcessable(result)) { + if (result != null && isResultProcessable(result)) { logger.debug("Result of operation is {}", result.getAsString()); } } catch (IllegalArgumentException e) { diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/TumbleDryerHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/TumbleDryerHandler.java index 80c28e205edc4..9d90a787efaac 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/TumbleDryerHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/TumbleDryerHandler.java @@ -71,7 +71,7 @@ public void handleCommand(ChannelUID channelUID, Command command) { } } // process result - if (isResultProcessable(result)) { + if (result != null && isResultProcessable(result)) { logger.debug("Result of operation is {}", result.getAsString()); } } catch (IllegalArgumentException e) { diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineHandler.java index cca617b2d2147..7da1042be8ed1 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineHandler.java @@ -83,7 +83,7 @@ public void handleCommand(ChannelUID channelUID, Command command) { } } // process result - if (isResultProcessable(result)) { + if (result != null && isResultProcessable(result)) { logger.debug("Result of operation is {}", result.getAsString()); } } catch (IllegalArgumentException e) { From b0d85ce8f9ef60d9dee376eafe8d276c949c4603 Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Sat, 23 Oct 2021 11:23:15 +0200 Subject: [PATCH 04/26] Remove unused import. Signed-off-by: Jacob Laursen --- .../miele/internal/discovery/MieleMDNSDiscoveryParticipant.java | 1 - 1 file changed, 1 deletion(-) diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/discovery/MieleMDNSDiscoveryParticipant.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/discovery/MieleMDNSDiscoveryParticipant.java index eef48f6b0222f..729065323c8ca 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/discovery/MieleMDNSDiscoveryParticipant.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/discovery/MieleMDNSDiscoveryParticipant.java @@ -26,7 +26,6 @@ import org.openhab.core.config.discovery.DiscoveryResult; import org.openhab.core.config.discovery.DiscoveryResultBuilder; import org.openhab.core.config.discovery.mdns.MDNSDiscoveryParticipant; -import org.openhab.core.config.discovery.mdns.internal.MDNSDiscoveryService; import org.openhab.core.thing.ThingTypeUID; import org.openhab.core.thing.ThingUID; import org.osgi.service.component.annotations.Component; From f0cd04a9ce993596acee273501a87bd439646fb6 Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Sat, 23 Oct 2021 11:40:30 +0200 Subject: [PATCH 05/26] Renamed property protocol to protocolAdapter for correctness. Signed-off-by: Jacob Laursen --- .../openhab/binding/miele/internal/MieleBindingConstants.java | 2 +- .../internal/discovery/MieleApplianceDiscoveryService.java | 2 +- .../binding/miele/internal/handler/MieleApplianceHandler.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleBindingConstants.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleBindingConstants.java index d286209118f76..baa4af9e12005 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleBindingConstants.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleBindingConstants.java @@ -29,7 +29,7 @@ public class MieleBindingConstants { public static final String BINDING_ID = "miele"; public static final String APPLIANCE_ID = "uid"; public static final String DEVICE_CLASS = "dc"; - public static final String PROTOCOL_PROPERTY_NAME = "protocol"; + public static final String PROTOCOL_ADAPTER_PROPERTY_NAME = "protocolAdapter"; // JSON-RPC property names public static final String SERIAL_NUMBER_PROPERTY_NAME = "serialNumber"; diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/discovery/MieleApplianceDiscoveryService.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/discovery/MieleApplianceDiscoveryService.java index 6d4f17861b774..98cf71f0f3f9a 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/discovery/MieleApplianceDiscoveryService.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/discovery/MieleApplianceDiscoveryService.java @@ -104,7 +104,7 @@ private void onApplianceAddedInternal(HomeDevice appliance) { Map properties = new HashMap<>(2); FullyQualifiedApplianceIdentifier applianceIdentifier = appliance.getApplianceIdentifier(); - properties.put(PROTOCOL_PROPERTY_NAME, appliance.ProtocolAdapterName); + properties.put(PROTOCOL_ADAPTER_PROPERTY_NAME, appliance.ProtocolAdapterName); properties.put(APPLIANCE_ID, applianceIdentifier.getApplianceId()); properties.put(SERIAL_NUMBER_PROPERTY_NAME, appliance.getSerialNumber()); diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java index 109abd7f2680b..c7ddb14245ca1 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java @@ -318,7 +318,7 @@ public void onApplianceAdded(HomeDevice appliance) { if (applianceId.equals(applianceIdentifier.getApplianceId())) { Map properties = editProperties(); - properties.put(PROTOCOL_PROPERTY_NAME, appliance.ProtocolAdapterName); + properties.put(PROTOCOL_ADAPTER_PROPERTY_NAME, appliance.ProtocolAdapterName); properties.put(SERIAL_NUMBER_PROPERTY_NAME, appliance.getSerialNumber()); updateProperties(properties); updateStatus(ThingStatus.ONLINE); From dcebb25c629cdf875ceccdbe5cdd57d4dd7e3ea1 Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Sat, 23 Oct 2021 11:52:22 +0200 Subject: [PATCH 06/26] Add connectionType property. Signed-off-by: Jacob Laursen --- .../binding/miele/internal/MieleBindingConstants.java | 1 + .../discovery/MieleApplianceDiscoveryService.java | 4 ++++ .../miele/internal/handler/MieleApplianceHandler.java | 4 ++++ .../miele/internal/handler/MieleBridgeHandler.java | 8 ++++++++ 4 files changed, 17 insertions(+) diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleBindingConstants.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleBindingConstants.java index baa4af9e12005..81cbdb8fdc0ec 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleBindingConstants.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleBindingConstants.java @@ -30,6 +30,7 @@ public class MieleBindingConstants { public static final String APPLIANCE_ID = "uid"; public static final String DEVICE_CLASS = "dc"; public static final String PROTOCOL_ADAPTER_PROPERTY_NAME = "protocolAdapter"; + public static final String CONNECTION_TYPE_PROPERTY_NAME = "connectionType"; // JSON-RPC property names public static final String SERIAL_NUMBER_PROPERTY_NAME = "serialNumber"; diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/discovery/MieleApplianceDiscoveryService.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/discovery/MieleApplianceDiscoveryService.java index 98cf71f0f3f9a..eae1dd28d5f0a 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/discovery/MieleApplianceDiscoveryService.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/discovery/MieleApplianceDiscoveryService.java @@ -107,6 +107,10 @@ private void onApplianceAddedInternal(HomeDevice appliance) { properties.put(PROTOCOL_ADAPTER_PROPERTY_NAME, appliance.ProtocolAdapterName); properties.put(APPLIANCE_ID, applianceIdentifier.getApplianceId()); properties.put(SERIAL_NUMBER_PROPERTY_NAME, appliance.getSerialNumber()); + String connectionType = appliance.getConnectionType(); + if (connectionType != null) { + properties.put(CONNECTION_TYPE_PROPERTY_NAME, connectionType); + } for (JsonElement dc : appliance.DeviceClasses) { String dcStr = dc.getAsString(); diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java index c7ddb14245ca1..aeabde955957f 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java @@ -320,6 +320,10 @@ public void onApplianceAdded(HomeDevice appliance) { Map properties = editProperties(); properties.put(PROTOCOL_ADAPTER_PROPERTY_NAME, appliance.ProtocolAdapterName); properties.put(SERIAL_NUMBER_PROPERTY_NAME, appliance.getSerialNumber()); + String connectionType = appliance.getConnectionType(); + if (connectionType != null) { + properties.put(CONNECTION_TYPE_PROPERTY_NAME, connectionType); + } updateProperties(properties); updateStatus(ThingStatus.ONLINE); } diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java index 6bf71ab048f09..09c51e7e18123 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java @@ -134,6 +134,14 @@ public FullyQualifiedApplianceIdentifier getApplianceIdentifier() { public String getSerialNumber() { return Properties.get("serial.number").getAsString(); } + + public String getConnectionType() { + JsonElement connectionType = Properties.get("connection.type"); + if (connectionType == null) { + return null; + } + return connectionType.getAsString(); + } } public class DeviceClassObject { From b6498c526e821c88a494b1f515f1e5c4fa010c69 Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Sat, 23 Oct 2021 12:13:21 +0200 Subject: [PATCH 07/26] Add appliance model property. Signed-off-by: Jacob Laursen --- .../binding/miele/internal/MieleBindingConstants.java | 1 + .../discovery/MieleApplianceDiscoveryService.java | 1 + .../miele/internal/handler/MieleApplianceHandler.java | 1 + .../miele/internal/handler/MieleBridgeHandler.java | 10 ++++++++++ 4 files changed, 13 insertions(+) diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleBindingConstants.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleBindingConstants.java index 81cbdb8fdc0ec..44632c72546e5 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleBindingConstants.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleBindingConstants.java @@ -29,6 +29,7 @@ public class MieleBindingConstants { public static final String BINDING_ID = "miele"; public static final String APPLIANCE_ID = "uid"; public static final String DEVICE_CLASS = "dc"; + public static final String MODEL_PROPERTY_NAME = "model"; public static final String PROTOCOL_ADAPTER_PROPERTY_NAME = "protocolAdapter"; public static final String CONNECTION_TYPE_PROPERTY_NAME = "connectionType"; diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/discovery/MieleApplianceDiscoveryService.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/discovery/MieleApplianceDiscoveryService.java index eae1dd28d5f0a..dcfdb1d0160fc 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/discovery/MieleApplianceDiscoveryService.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/discovery/MieleApplianceDiscoveryService.java @@ -104,6 +104,7 @@ private void onApplianceAddedInternal(HomeDevice appliance) { Map properties = new HashMap<>(2); FullyQualifiedApplianceIdentifier applianceIdentifier = appliance.getApplianceIdentifier(); + properties.put(MODEL_PROPERTY_NAME, appliance.getApplianceModel()); properties.put(PROTOCOL_ADAPTER_PROPERTY_NAME, appliance.ProtocolAdapterName); properties.put(APPLIANCE_ID, applianceIdentifier.getApplianceId()); properties.put(SERIAL_NUMBER_PROPERTY_NAME, appliance.getSerialNumber()); diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java index aeabde955957f..c154bfa6acc59 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java @@ -318,6 +318,7 @@ public void onApplianceAdded(HomeDevice appliance) { if (applianceId.equals(applianceIdentifier.getApplianceId())) { Map properties = editProperties(); + properties.put(MODEL_PROPERTY_NAME, appliance.getApplianceModel()); properties.put(PROTOCOL_ADAPTER_PROPERTY_NAME, appliance.ProtocolAdapterName); properties.put(SERIAL_NUMBER_PROPERTY_NAME, appliance.getSerialNumber()); String connectionType = appliance.getConnectionType(); diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java index 09c51e7e18123..58d2e206748b9 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java @@ -131,6 +131,7 @@ public FullyQualifiedApplianceIdentifier getApplianceIdentifier() { return new FullyQualifiedApplianceIdentifier(this.UID); } + @NonNull public String getSerialNumber() { return Properties.get("serial.number").getAsString(); } @@ -142,6 +143,15 @@ public String getConnectionType() { } return connectionType.getAsString(); } + + @NonNull + public String getApplianceModel() { + JsonElement model = Properties.get("miele.model"); + if (model == null) { + return ""; + } + return model.getAsString(); + } } public class DeviceClassObject { From c6b458910823a46c70726b2112ba496a542f20cd Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Sat, 23 Oct 2021 12:21:15 +0200 Subject: [PATCH 08/26] Remove useless properties brandId and companyId always having value MI. Signed-off-by: Jacob Laursen --- .../miele/internal/handler/CoffeeMachineChannelSelector.java | 2 -- .../miele/internal/handler/DishwasherChannelSelector.java | 2 -- .../binding/miele/internal/handler/FridgeChannelSelector.java | 2 -- .../miele/internal/handler/FridgeFreezerChannelSelector.java | 2 -- .../binding/miele/internal/handler/HobChannelSelector.java | 2 -- .../binding/miele/internal/handler/HoodChannelSelector.java | 2 -- .../binding/miele/internal/handler/OvenChannelSelector.java | 2 -- .../miele/internal/handler/TumbleDryerChannelSelector.java | 2 -- .../miele/internal/handler/WashingMachineChannelSelector.java | 2 -- 9 files changed, 18 deletions(-) diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/CoffeeMachineChannelSelector.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/CoffeeMachineChannelSelector.java index c88a70863654f..f021b67a99d55 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/CoffeeMachineChannelSelector.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/CoffeeMachineChannelSelector.java @@ -42,8 +42,6 @@ public enum CoffeeMachineChannelSelector implements ApplianceChannelSelector { PRODUCT_TYPE("productTypeId", "productType", StringType.class, true), DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true), - BRAND_ID("brandId", "brandId", StringType.class, true), - COMPANY_ID("companyId", "companyId", StringType.class, true), STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false), STATE(null, STATE_CHANNEL_ID, DecimalType.class, false), PROGRAM_TEXT(PROGRAM_ID_PROPERTY_NAME, PROGRAM_TEXT_CHANNEL_ID, StringType.class, false) { diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/DishwasherChannelSelector.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/DishwasherChannelSelector.java index e9ab69139d1e4..3cd00b9269c4a 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/DishwasherChannelSelector.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/DishwasherChannelSelector.java @@ -48,8 +48,6 @@ public enum DishwasherChannelSelector implements ApplianceChannelSelector { PRODUCT_TYPE("productTypeId", "productType", StringType.class, true, false), DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true, false), - BRAND_ID("brandId", "brandId", StringType.class, true, false), - COMPANY_ID("companyId", "companyId", StringType.class, true, false), STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false, false), STATE(null, STATE_CHANNEL_ID, DecimalType.class, false, false), PROGRAM_TEXT(PROGRAM_ID_PROPERTY_NAME, PROGRAM_TEXT_CHANNEL_ID, StringType.class, false, false) { diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeChannelSelector.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeChannelSelector.java index 469e3a92582d7..e28c55b227031 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeChannelSelector.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeChannelSelector.java @@ -42,8 +42,6 @@ public enum FridgeChannelSelector implements ApplianceChannelSelector { PRODUCT_TYPE("productTypeId", "productType", StringType.class, true), DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true), - BRAND_ID("brandId", "brandId", StringType.class, true), - COMPANY_ID("companyId", "companyId", StringType.class, true), STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false), STATE(null, STATE_CHANNEL_ID, DecimalType.class, false), SUPERCOOL(null, SUPERCOOL_CHANNEL_ID, OnOffType.class, false), diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeFreezerChannelSelector.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeFreezerChannelSelector.java index baed695db30a6..386d1f678f34f 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeFreezerChannelSelector.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeFreezerChannelSelector.java @@ -43,8 +43,6 @@ public enum FridgeFreezerChannelSelector implements ApplianceChannelSelector { PRODUCT_TYPE("productTypeId", "productType", StringType.class, true), DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true), - BRAND_ID("brandId", "brandId", StringType.class, true), - COMPANY_ID("companyId", "companyId", StringType.class, true), STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false), STATE(null, STATE_CHANNEL_ID, DecimalType.class, false), FREEZERSTATE("freezerState", "freezerstate", StringType.class, false), diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/HobChannelSelector.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/HobChannelSelector.java index a8a3ef2089729..abe82e7c86d65 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/HobChannelSelector.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/HobChannelSelector.java @@ -37,8 +37,6 @@ public enum HobChannelSelector implements ApplianceChannelSelector { PRODUCT_TYPE("productTypeId", "productType", StringType.class, true), DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true), - BRAND_ID("brandId", "brandId", StringType.class, true), - COMPANY_ID("companyId", "companyId", StringType.class, true), STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false), STATE(null, STATE_CHANNEL_ID, DecimalType.class, false), PLATES("plateNumbers", "plates", DecimalType.class, true), diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/HoodChannelSelector.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/HoodChannelSelector.java index bdedbf2a3f013..623c9830d335c 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/HoodChannelSelector.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/HoodChannelSelector.java @@ -39,8 +39,6 @@ public enum HoodChannelSelector implements ApplianceChannelSelector { PRODUCT_TYPE("productTypeId", "productType", StringType.class, true), DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true), - BRAND_ID("brandId", "brandId", StringType.class, true), - COMPANY_ID("companyId", "companyId", StringType.class, true), STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false), STATE(null, STATE_CHANNEL_ID, DecimalType.class, false), VENTILATION("ventilationPower", "ventilation", DecimalType.class, false), diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenChannelSelector.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenChannelSelector.java index 7866c2e806118..22e3936732e9a 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenChannelSelector.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenChannelSelector.java @@ -49,8 +49,6 @@ public enum OvenChannelSelector implements ApplianceChannelSelector { PRODUCT_TYPE("productTypeId", "productType", StringType.class, true), DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true), - BRAND_ID("brandId", "brandId", StringType.class, true), - COMPANY_ID("companyId", "companyId", StringType.class, true), STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false), STATE(null, STATE_CHANNEL_ID, DecimalType.class, false), PROGRAM_TEXT(PROGRAM_ID_PROPERTY_NAME, PROGRAM_TEXT_CHANNEL_ID, StringType.class, false), diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/TumbleDryerChannelSelector.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/TumbleDryerChannelSelector.java index 8c990860a9dc8..25f8cd76b6c35 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/TumbleDryerChannelSelector.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/TumbleDryerChannelSelector.java @@ -47,8 +47,6 @@ public enum TumbleDryerChannelSelector implements ApplianceChannelSelector { PRODUCT_TYPE("productTypeId", "productType", StringType.class, true), DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true), - BRAND_ID("brandId", "brandId", StringType.class, true), - COMPANY_ID("companyId", "companyId", StringType.class, true), STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false), STATE(null, STATE_CHANNEL_ID, DecimalType.class, false), PROGRAM_TEXT(PROGRAM_ID_PROPERTY_NAME, PROGRAM_TEXT_CHANNEL_ID, StringType.class, false) { diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineChannelSelector.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineChannelSelector.java index 714627e69c2e3..166743db57136 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineChannelSelector.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineChannelSelector.java @@ -50,8 +50,6 @@ public enum WashingMachineChannelSelector implements ApplianceChannelSelector { PRODUCT_TYPE("productTypeId", "productType", StringType.class, true, false), DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true, false), - BRAND_ID("brandId", "brandId", StringType.class, true, false), - COMPANY_ID("companyId", "companyId", StringType.class, true, false), STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false, false), STATE(null, STATE_CHANNEL_ID, DecimalType.class, false, false), PROGRAM_TEXT(PROGRAM_ID_PROPERTY_NAME, PROGRAM_TEXT_CHANNEL_ID, StringType.class, false, false) { From 043e7126e415f2aed59d0d4d385a0ebab0d35929 Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Sat, 23 Oct 2021 12:42:47 +0200 Subject: [PATCH 09/26] Rename property dc to deviceClass and set it consistently (not only from auto-discovered things). Signed-off-by: Jacob Laursen --- .../miele/internal/MieleBindingConstants.java | 2 +- .../MieleApplianceDiscoveryService.java | 27 ++++--------------- .../handler/MieleApplianceHandler.java | 4 +++ .../internal/handler/MieleBridgeHandler.java | 13 +++++++++ 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleBindingConstants.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleBindingConstants.java index 44632c72546e5..0a3e9ebb16952 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleBindingConstants.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleBindingConstants.java @@ -28,7 +28,7 @@ public class MieleBindingConstants { public static final String BINDING_ID = "miele"; public static final String APPLIANCE_ID = "uid"; - public static final String DEVICE_CLASS = "dc"; + public static final String DEVICE_CLASS = "deviceClass"; public static final String MODEL_PROPERTY_NAME = "model"; public static final String PROTOCOL_ADAPTER_PROPERTY_NAME = "protocolAdapter"; public static final String CONNECTION_TYPE_PROPERTY_NAME = "connectionType"; diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/discovery/MieleApplianceDiscoveryService.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/discovery/MieleApplianceDiscoveryService.java index dcfdb1d0160fc..53ed8e45b6c43 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/discovery/MieleApplianceDiscoveryService.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/discovery/MieleApplianceDiscoveryService.java @@ -35,8 +35,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.gson.JsonElement; - /** * The {@link MieleApplianceDiscoveryService} tracks appliances that are * associated with the Miele@Home gateway @@ -47,9 +45,6 @@ */ public class MieleApplianceDiscoveryService extends AbstractDiscoveryService implements ApplianceStatusListener { - private static final String MIELE_APPLIANCE_CLASS = "com.miele.xgw3000.gateway.hdm.deviceclasses.MieleAppliance"; - private static final String MIELE_CLASS = "com.miele.xgw3000.gateway.hdm.deviceclasses.Miele"; - private final Logger logger = LoggerFactory.getLogger(MieleApplianceDiscoveryService.class); private static final int SEARCH_TIME = 60; @@ -105,6 +100,10 @@ private void onApplianceAddedInternal(HomeDevice appliance) { FullyQualifiedApplianceIdentifier applianceIdentifier = appliance.getApplianceIdentifier(); properties.put(MODEL_PROPERTY_NAME, appliance.getApplianceModel()); + String deviceClass = appliance.getDeviceClass(); + if (deviceClass != null) { + properties.put(DEVICE_CLASS, deviceClass); + } properties.put(PROTOCOL_ADAPTER_PROPERTY_NAME, appliance.ProtocolAdapterName); properties.put(APPLIANCE_ID, applianceIdentifier.getApplianceId()); properties.put(SERIAL_NUMBER_PROPERTY_NAME, appliance.getSerialNumber()); @@ -113,14 +112,6 @@ private void onApplianceAddedInternal(HomeDevice appliance) { properties.put(CONNECTION_TYPE_PROPERTY_NAME, connectionType); } - for (JsonElement dc : appliance.DeviceClasses) { - String dcStr = dc.getAsString(); - if (dcStr.contains(MIELE_CLASS) && !dcStr.equals(MIELE_APPLIANCE_CLASS)) { - properties.put(DEVICE_CLASS, dcStr.substring(MIELE_CLASS.length())); - break; - } - } - DiscoveryResult discoveryResult = DiscoveryResultBuilder.create(thingUID).withProperties(properties) .withBridge(bridgeUID).withLabel((String) properties.get(DEVICE_CLASS)) .withRepresentationProperty(APPLIANCE_ID).build(); @@ -158,15 +149,7 @@ public void onAppliancePropertyChanged(String serialNumber, DeviceProperty dp) { private ThingUID getThingUID(HomeDevice appliance) { ThingUID bridgeUID = mieleBridgeHandler.getThing().getUID(); - String modelId = null; - - for (JsonElement dc : appliance.DeviceClasses) { - String dcStr = dc.getAsString(); - if (dcStr.contains(MIELE_CLASS) && !dcStr.equals(MIELE_APPLIANCE_CLASS)) { - modelId = dcStr.substring(MIELE_CLASS.length()); - break; - } - } + String modelId = appliance.getDeviceClass(); if (modelId != null) { ThingTypeUID thingTypeUID = getThingTypeUidFromModelId(modelId); diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java index c154bfa6acc59..a16e8e5716e6e 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java @@ -319,6 +319,10 @@ public void onApplianceAdded(HomeDevice appliance) { if (applianceId.equals(applianceIdentifier.getApplianceId())) { Map properties = editProperties(); properties.put(MODEL_PROPERTY_NAME, appliance.getApplianceModel()); + String deviceClass = appliance.getDeviceClass(); + if (deviceClass != null) { + properties.put(DEVICE_CLASS, deviceClass); + } properties.put(PROTOCOL_ADAPTER_PROPERTY_NAME, appliance.ProtocolAdapterName); properties.put(SERIAL_NUMBER_PROPERTY_NAME, appliance.getSerialNumber()); String connectionType = appliance.getConnectionType(); diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java index 58d2e206748b9..5373ac71a6c87 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java @@ -111,6 +111,9 @@ public class MieleBridgeHandler extends BaseBridgeHandler { // Data structures to de-JSONify whatever Miele appliances are sending us public class HomeDevice { + private static final String MIELE_APPLIANCE_CLASS = "com.miele.xgw3000.gateway.hdm.deviceclasses.MieleAppliance"; + private static final String MIELE_CLASS = "com.miele.xgw3000.gateway.hdm.deviceclasses.Miele"; + public String Name; public String Status; public String ParentUID; @@ -152,6 +155,16 @@ public String getApplianceModel() { } return model.getAsString(); } + + public String getDeviceClass() { + for (JsonElement dc : DeviceClasses) { + String dcStr = dc.getAsString(); + if (dcStr.contains(MIELE_CLASS) && !dcStr.equals(MIELE_APPLIANCE_CLASS)) { + return dcStr.substring(MIELE_CLASS.length()); + } + } + return null; + } } public class DeviceClassObject { From 743c7d2becb5eed5fe7f776183ca4358f5b1dc3a Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Sat, 23 Oct 2021 14:03:39 +0200 Subject: [PATCH 10/26] Added constants for remaining handlers with hardcoded device classes. Signed-off-by: Jacob Laursen --- .../binding/miele/internal/MieleBindingConstants.java | 6 ++++++ .../binding/miele/internal/handler/DishWasherHandler.java | 3 ++- .../openhab/binding/miele/internal/handler/HobHandler.java | 4 +++- .../openhab/binding/miele/internal/handler/HoodHandler.java | 3 ++- .../openhab/binding/miele/internal/handler/OvenHandler.java | 3 ++- .../binding/miele/internal/handler/TumbleDryerHandler.java | 3 ++- .../miele/internal/handler/WashingMachineHandler.java | 3 ++- 7 files changed, 19 insertions(+), 6 deletions(-) diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleBindingConstants.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleBindingConstants.java index 0a3e9ebb16952..0ac74412f827b 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleBindingConstants.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleBindingConstants.java @@ -67,8 +67,14 @@ public class MieleBindingConstants { // Miele devices classes public static final String MIELE_DEVICE_CLASS_COFFEE_SYSTEM = "CoffeeSystem"; + public static final String MIELE_DEVICE_CLASS_DISHWASHER = "Dishwasher"; public static final String MIELE_DEVICE_CLASS_FRIDGE = "Fridge"; public static final String MIELE_DEVICE_CLASS_FRIDGE_FREEZER = "FridgeFreezer"; + public static final String MIELE_DEVICE_CLASS_HOB = "Hob"; + public static final String MIELE_DEVICE_CLASS_HOOD = "Hood"; + public static final String MIELE_DEVICE_CLASS_OVEN = "Oven"; + public static final String MIELE_DEVICE_CLASS_TUMBLE_DRYER = "TumbleDryer"; + public static final String MIELE_DEVICE_CLASS_WASHING_MACHINE = "WashingMachine"; // Miele appliance states public static final int STATE_UNKNOWN = 0; diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/DishWasherHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/DishWasherHandler.java index ca5a44524d425..d1281f43b82db 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/DishWasherHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/DishWasherHandler.java @@ -13,6 +13,7 @@ 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_DISHWASHER; import static org.openhab.binding.miele.internal.MieleBindingConstants.POWER_CONSUMPTION_CHANNEL_ID; import static org.openhab.binding.miele.internal.MieleBindingConstants.WATER_CONSUMPTION_CHANNEL_ID; @@ -49,7 +50,7 @@ public class DishWasherHandler extends MieleApplianceHandler { public HobHandler(Thing thing) { - super(thing, HobChannelSelector.class, "Hob"); + super(thing, HobChannelSelector.class, MIELE_DEVICE_CLASS_HOB); } @Override diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/HoodHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/HoodHandler.java index 5a9e87090623b..2211e0d26c848 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/HoodHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/HoodHandler.java @@ -13,6 +13,7 @@ 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.library.types.OnOffType; import org.openhab.core.thing.ChannelUID; @@ -37,7 +38,7 @@ public class HoodHandler extends MieleApplianceHandler { private final Logger logger = LoggerFactory.getLogger(HoodHandler.class); public HoodHandler(Thing thing) { - super(thing, HoodChannelSelector.class, "Hood"); + super(thing, HoodChannelSelector.class, MIELE_DEVICE_CLASS_HOOD); } @Override diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenHandler.java index 9a88df00befff..13799659e9ad3 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenHandler.java @@ -13,6 +13,7 @@ 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.library.types.OnOffType; import org.openhab.core.thing.ChannelUID; @@ -38,7 +39,7 @@ public class OvenHandler extends MieleApplianceHandler { private final Logger logger = LoggerFactory.getLogger(OvenHandler.class); public OvenHandler(Thing thing) { - super(thing, OvenChannelSelector.class, "Oven"); + super(thing, OvenChannelSelector.class, MIELE_DEVICE_CLASS_OVEN); } @Override diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/TumbleDryerHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/TumbleDryerHandler.java index 9d90a787efaac..7e56d6381fc5e 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/TumbleDryerHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/TumbleDryerHandler.java @@ -13,6 +13,7 @@ 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.library.types.OnOffType; import org.openhab.core.thing.ChannelUID; @@ -38,7 +39,7 @@ public class TumbleDryerHandler extends MieleApplianceHandler Date: Sat, 23 Oct 2021 14:07:02 +0200 Subject: [PATCH 11/26] Fix SCA: AuthorContributionDescriptionCheck Signed-off-by: Jacob Laursen --- .../openhab/binding/miele/internal/ExtendedDeviceStateUtil.java | 2 +- .../miele/internal/FullyQualifiedApplianceIdentifier.java | 2 +- .../binding/miele/internal/ExtendedDeviceStateUtilTest.java | 2 +- .../miele/internal/FullyQualifiedApplianceIdentifierTest.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/ExtendedDeviceStateUtil.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/ExtendedDeviceStateUtil.java index dfe1fd0411c98..165f720e52203 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/ExtendedDeviceStateUtil.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/ExtendedDeviceStateUtil.java @@ -23,7 +23,7 @@ * The {@link ExtendedDeviceStateUtil} class contains utility methods for parsing * ExtendedDeviceState information * - * @author Jacob Laursen - Added power/water consumption channels + * @author Jacob Laursen - Initial contribution */ public class ExtendedDeviceStateUtil { private static final byte[] HEX_ARRAY = "0123456789ABCDEF".getBytes(StandardCharsets.US_ASCII); diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/FullyQualifiedApplianceIdentifier.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/FullyQualifiedApplianceIdentifier.java index 2ecfd854f4ee6..4d896fd195ed1 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/FullyQualifiedApplianceIdentifier.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/FullyQualifiedApplianceIdentifier.java @@ -16,7 +16,7 @@ * The {@link FullyQualifiedApplianceIdentifier} class represents a fully qualified appliance identifier. * Example: "hdm:ZigBee:0123456789abcdef#210" * - * @author Jacob Laursen - Fixed multicast and protocol support (ZigBee/LAN) + * @author Jacob Laursen - Initial contribution */ public class FullyQualifiedApplianceIdentifier { private String uid; diff --git a/bundles/org.openhab.binding.miele/src/test/java/org/openhab/binding/miele/internal/ExtendedDeviceStateUtilTest.java b/bundles/org.openhab.binding.miele/src/test/java/org/openhab/binding/miele/internal/ExtendedDeviceStateUtilTest.java index 88c2518aa6536..d172ebf4a46c9 100644 --- a/bundles/org.openhab.binding.miele/src/test/java/org/openhab/binding/miele/internal/ExtendedDeviceStateUtilTest.java +++ b/bundles/org.openhab.binding.miele/src/test/java/org/openhab/binding/miele/internal/ExtendedDeviceStateUtilTest.java @@ -24,7 +24,7 @@ * This class provides test cases for {@link * org.openhab.binding.miele.internal.ExtendedDeviceStateUtil} * - * @author Jacob Laursen - Added power/water consumption channels + * @author Jacob Laursen - Initial contribution */ public class ExtendedDeviceStateUtilTest extends JavaTest { diff --git a/bundles/org.openhab.binding.miele/src/test/java/org/openhab/binding/miele/internal/FullyQualifiedApplianceIdentifierTest.java b/bundles/org.openhab.binding.miele/src/test/java/org/openhab/binding/miele/internal/FullyQualifiedApplianceIdentifierTest.java index f352b6cff5f43..5b8923da3a320 100644 --- a/bundles/org.openhab.binding.miele/src/test/java/org/openhab/binding/miele/internal/FullyQualifiedApplianceIdentifierTest.java +++ b/bundles/org.openhab.binding.miele/src/test/java/org/openhab/binding/miele/internal/FullyQualifiedApplianceIdentifierTest.java @@ -21,7 +21,7 @@ * This class provides test cases for {@link * org.openhab.binding.miele.internal.FullyQualifiedApplianceIdentifier} * - * @author Jacob Laursen - Fixed multicast and protocol support (ZigBee/LAN) + * @author Jacob Laursen - Initial contribution */ public class FullyQualifiedApplianceIdentifierTest extends JavaTest { From c8eda2244fc85c65ce75827826369f0f4c9eaa80 Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Sat, 23 Oct 2021 14:12:10 +0200 Subject: [PATCH 12/26] Fix SCA: ModifierOrderCheck Signed-off-by: Jacob Laursen --- .../miele/internal/handler/CoffeeMachineChannelSelector.java | 4 ++-- .../miele/internal/handler/DishwasherChannelSelector.java | 4 ++-- .../binding/miele/internal/handler/OvenChannelSelector.java | 2 +- .../miele/internal/handler/TumbleDryerChannelSelector.java | 4 ++-- .../miele/internal/handler/WashingMachineChannelSelector.java | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/CoffeeMachineChannelSelector.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/CoffeeMachineChannelSelector.java index f021b67a99d55..bde856833f8b1 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/CoffeeMachineChannelSelector.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/CoffeeMachineChannelSelector.java @@ -86,9 +86,9 @@ public State getState(String s, DeviceMetaData dmd) { private final Logger logger = LoggerFactory.getLogger(CoffeeMachineChannelSelector.class); - private final static Map programs = Collections. emptyMap(); + private static final Map programs = Collections. emptyMap(); - private final static Map phases = Collections. emptyMap(); + private static final Map phases = Collections. emptyMap(); private final String mieleID; private final String channelID; diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/DishwasherChannelSelector.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/DishwasherChannelSelector.java index 3cd00b9269c4a..c00f7fac593f1 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/DishwasherChannelSelector.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/DishwasherChannelSelector.java @@ -150,12 +150,12 @@ public State getState(String s, DeviceMetaData dmd) { private final Logger logger = LoggerFactory.getLogger(DishwasherChannelSelector.class); - private final static Map programs = Map.ofEntries(entry("26", "Pots & Pans"), + private static final Map 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 final static Map phases = Map.ofEntries(entry("2", "Pre-Wash"), entry("3", "Main Wash"), + private static final Map 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; diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenChannelSelector.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenChannelSelector.java index 22e3936732e9a..38ee7f7d382d6 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenChannelSelector.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenChannelSelector.java @@ -165,7 +165,7 @@ public State getState(String s, DeviceMetaData dmd) { private final Logger logger = LoggerFactory.getLogger(OvenChannelSelector.class); - private final static Map phases = Map.ofEntries(entry("1", "Heating"), entry("2", "Temp. hold"), + private static final Map 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")); diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/TumbleDryerChannelSelector.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/TumbleDryerChannelSelector.java index 25f8cd76b6c35..1a375da9e4447 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/TumbleDryerChannelSelector.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/TumbleDryerChannelSelector.java @@ -153,7 +153,7 @@ public State getState(String s, DeviceMetaData dmd) { private final Logger logger = LoggerFactory.getLogger(TumbleDryerChannelSelector.class); - private final static Map programs = Map.ofEntries(entry("10", "Automatic Plus"), + private static final Map 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"), @@ -163,7 +163,7 @@ public State getState(String s, DeviceMetaData dmd) { entry("240", "Smoothing"), entry("65000", "Cottons, auto load control"), entry("65001", "Minimum iron, auto load control")); - private final static Map phases = Map.ofEntries(entry("1", "Programme running"), + private static final Map 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")); diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineChannelSelector.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineChannelSelector.java index 166743db57136..99d156704a46d 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineChannelSelector.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineChannelSelector.java @@ -172,7 +172,7 @@ public State getState(String s, DeviceMetaData dmd) { private final Logger logger = LoggerFactory.getLogger(WashingMachineChannelSelector.class); - private final static Map programs = Map.ofEntries(entry("1", "Cottons"), entry("3", "Minimum iron"), + private static final Map 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"), @@ -181,7 +181,7 @@ public State getState(String s, DeviceMetaData dmd) { entry("95", "Down duvets"), entry("122", "Express 20"), entry("129", "Down filled items"), entry("133", "Cottons Eco"), entry("146", "QuickPowerWash"), entry("65532", "Mix")); - private final static Map phases = Map.ofEntries(entry("1", "Pre-wash"), entry("4", "Washing"), + private static final Map 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")); From 52f40a9725bcbdfe3288099d7f151a816a2034cd Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Sat, 23 Oct 2021 16:04:18 +0200 Subject: [PATCH 13/26] Rename ExtendedDeviceStateUtil to be a bit more generic. Signed-off-by: Jacob Laursen --- ...ndedDeviceStateUtil.java => DeviceUtil.java} | 6 +++--- .../internal/handler/FridgeChannelSelector.java | 4 ++-- .../handler/FridgeFreezerChannelSelector.java | 4 ++-- .../internal/handler/MieleApplianceHandler.java | 6 +++--- .../internal/handler/OvenChannelSelector.java | 4 ++-- .../handler/WashingMachineChannelSelector.java | 4 ++-- ...ceStateUtilTest.java => DeviceUtilTest.java} | 17 ++++++++--------- 7 files changed, 22 insertions(+), 23 deletions(-) rename bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/{ExtendedDeviceStateUtil.java => DeviceUtil.java} (92%) rename bundles/org.openhab.binding.miele/src/test/java/org/openhab/binding/miele/internal/{ExtendedDeviceStateUtilTest.java => DeviceUtilTest.java} (70%) diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/ExtendedDeviceStateUtil.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/DeviceUtil.java similarity index 92% rename from bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/ExtendedDeviceStateUtil.java rename to bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/DeviceUtil.java index 165f720e52203..c80b28d38f0d4 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/ExtendedDeviceStateUtil.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/DeviceUtil.java @@ -20,12 +20,12 @@ import org.openhab.core.types.UnDefType; /** - * The {@link ExtendedDeviceStateUtil} class contains utility methods for parsing - * ExtendedDeviceState information + * The {@link DeviceUtil} class contains utility methods for extracting + * and parsing device information, for example from ExtendedDeviceState. * * @author Jacob Laursen - Initial contribution */ -public class ExtendedDeviceStateUtil { +public class DeviceUtil { private static final byte[] HEX_ARRAY = "0123456789ABCDEF".getBytes(StandardCharsets.US_ASCII); private static final String TEMPERATURE_UNDEFINED = "32768"; diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeChannelSelector.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeChannelSelector.java index e28c55b227031..c97cffd0fc527 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeChannelSelector.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeChannelSelector.java @@ -17,7 +17,7 @@ import java.lang.reflect.Method; import java.util.Map.Entry; -import org.openhab.binding.miele.internal.ExtendedDeviceStateUtil; +import org.openhab.binding.miele.internal.DeviceUtil; import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData; import org.openhab.core.library.types.DecimalType; import org.openhab.core.library.types.OnOffType; @@ -146,7 +146,7 @@ public State getState(String s) { public State getTemperatureState(String s) { try { - return ExtendedDeviceStateUtil.getTemperatureState(s); + return DeviceUtil.getTemperatureState(s); } catch (NumberFormatException e) { logger.warn("An exception occurred while converting '{}' into a State", s); return UnDefType.UNDEF; diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeFreezerChannelSelector.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeFreezerChannelSelector.java index 386d1f678f34f..14d332dc0a1dc 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeFreezerChannelSelector.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeFreezerChannelSelector.java @@ -17,7 +17,7 @@ import java.lang.reflect.Method; import java.util.Map.Entry; -import org.openhab.binding.miele.internal.ExtendedDeviceStateUtil; +import org.openhab.binding.miele.internal.DeviceUtil; import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData; import org.openhab.core.library.types.DecimalType; import org.openhab.core.library.types.OnOffType; @@ -163,7 +163,7 @@ public State getState(String s) { public State getTemperatureState(String s) { try { - return ExtendedDeviceStateUtil.getTemperatureState(s); + return DeviceUtil.getTemperatureState(s); } catch (NumberFormatException e) { logger.warn("An exception occurred while converting '{}' into a State", s); return UnDefType.UNDEF; diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java index a16e8e5716e6e..feb57640c0ba8 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java @@ -21,7 +21,7 @@ import java.util.stream.Stream; import org.apache.commons.lang3.StringUtils; -import org.openhab.binding.miele.internal.ExtendedDeviceStateUtil; +import org.openhab.binding.miele.internal.DeviceUtil; import org.openhab.binding.miele.internal.FullyQualifiedApplianceIdentifier; import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceClassObject; import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData; @@ -217,9 +217,9 @@ protected void onAppliancePropertyChanged(DeviceProperty dp) { if (dp.Name.equals(EXTENDED_DEVICE_STATE_PROPERTY_NAME)) { if (!dp.Value.isEmpty()) { - byte[] extendedStateBytes = ExtendedDeviceStateUtil.stringToBytes(dp.Value); + byte[] extendedStateBytes = DeviceUtil.stringToBytes(dp.Value); logger.trace("Extended device state for {}: {}", getThing().getUID(), - ExtendedDeviceStateUtil.bytesToHex(extendedStateBytes)); + DeviceUtil.bytesToHex(extendedStateBytes)); if (this instanceof ExtendedDeviceStateListener) { ((ExtendedDeviceStateListener) this).onApplianceExtendedStateChanged(extendedStateBytes); } diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenChannelSelector.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenChannelSelector.java index 38ee7f7d382d6..f6814a8163a9a 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenChannelSelector.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenChannelSelector.java @@ -22,7 +22,7 @@ import java.util.Map.Entry; import java.util.TimeZone; -import org.openhab.binding.miele.internal.ExtendedDeviceStateUtil; +import org.openhab.binding.miele.internal.DeviceUtil; import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData; import org.openhab.core.library.types.DateTimeType; import org.openhab.core.library.types.DecimalType; @@ -239,7 +239,7 @@ public State getState(String s) { public State getTemperatureState(String s) { try { - return ExtendedDeviceStateUtil.getTemperatureState(s); + return DeviceUtil.getTemperatureState(s); } catch (NumberFormatException e) { logger.warn("An exception occurred while converting '{}' into a State", s); return UnDefType.UNDEF; diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineChannelSelector.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineChannelSelector.java index 99d156704a46d..2379385fb4ff4 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineChannelSelector.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineChannelSelector.java @@ -23,7 +23,7 @@ import java.util.TimeZone; import org.apache.commons.lang3.StringUtils; -import org.openhab.binding.miele.internal.ExtendedDeviceStateUtil; +import org.openhab.binding.miele.internal.DeviceUtil; import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData; import org.openhab.core.library.types.DateTimeType; import org.openhab.core.library.types.DecimalType; @@ -258,7 +258,7 @@ public State getState(String s) { public State getTemperatureState(String s) { try { - return ExtendedDeviceStateUtil.getTemperatureState(s); + return DeviceUtil.getTemperatureState(s); } catch (NumberFormatException e) { logger.warn("An exception occurred while converting '{}' into a State", s); return UnDefType.UNDEF; diff --git a/bundles/org.openhab.binding.miele/src/test/java/org/openhab/binding/miele/internal/ExtendedDeviceStateUtilTest.java b/bundles/org.openhab.binding.miele/src/test/java/org/openhab/binding/miele/internal/DeviceUtilTest.java similarity index 70% rename from bundles/org.openhab.binding.miele/src/test/java/org/openhab/binding/miele/internal/ExtendedDeviceStateUtilTest.java rename to bundles/org.openhab.binding.miele/src/test/java/org/openhab/binding/miele/internal/DeviceUtilTest.java index d172ebf4a46c9..d159dd5416f90 100644 --- a/bundles/org.openhab.binding.miele/src/test/java/org/openhab/binding/miele/internal/ExtendedDeviceStateUtilTest.java +++ b/bundles/org.openhab.binding.miele/src/test/java/org/openhab/binding/miele/internal/DeviceUtilTest.java @@ -22,17 +22,16 @@ /** * This class provides test cases for {@link - * org.openhab.binding.miele.internal.ExtendedDeviceStateUtil} + * org.openhab.binding.miele.internal.DeviceUtil} * * @author Jacob Laursen - Initial contribution */ -public class ExtendedDeviceStateUtilTest extends JavaTest { +public class DeviceUtilTest extends JavaTest { @Test public void bytesToHexWhenTopBitIsUsedReturnsCorrectString() { - String actual = ExtendedDeviceStateUtil - .bytesToHex(new byte[] { (byte) 0xde, (byte) 0xad, (byte) 0xbe, (byte) 0xef }); + String actual = DeviceUtil.bytesToHex(new byte[] { (byte) 0xde, (byte) 0xad, (byte) 0xbe, (byte) 0xef }); assertEquals("DEADBEEF", actual); } @@ -45,27 +44,27 @@ public void bytesToHexWhenTopBitIsUsedReturnsCorrectString() { @Test public void stringToBytesWhenTopBitIsUsedReturnsSingleByte() { byte[] expected = new byte[] { (byte) 0x00, (byte) 0x80, (byte) 0x00 }; - byte[] actual = ExtendedDeviceStateUtil.stringToBytes("\u0000\u0080\u0000"); + byte[] actual = DeviceUtil.stringToBytes("\u0000\u0080\u0000"); assertArrayEquals(expected, actual); } @Test public void getTemperatureStateWellFormedValueReturnsQuantityType() throws NumberFormatException { - assertEquals(new QuantityType<>(42, SIUnits.CELSIUS), ExtendedDeviceStateUtil.getTemperatureState("42")); + assertEquals(new QuantityType<>(42, SIUnits.CELSIUS), DeviceUtil.getTemperatureState("42")); } @Test public void getTemperatureStateMagicValueReturnsUndefined() throws NumberFormatException { - assertEquals(UnDefType.UNDEF, ExtendedDeviceStateUtil.getTemperatureState("32768")); + assertEquals(UnDefType.UNDEF, DeviceUtil.getTemperatureState("32768")); } @Test public void getTemperatureStateNonNumericValueThrowsNumberFormatException() { - assertThrows(NumberFormatException.class, () -> ExtendedDeviceStateUtil.getTemperatureState("A")); + assertThrows(NumberFormatException.class, () -> DeviceUtil.getTemperatureState("A")); } @Test public void getTemperatureStateNullValueThrowsNumberFormatException() { - assertThrows(NumberFormatException.class, () -> ExtendedDeviceStateUtil.getTemperatureState(null)); + assertThrows(NumberFormatException.class, () -> DeviceUtil.getTemperatureState(null)); } } From 8e3767d58f6366192a5edabd4cec08a658ca112d Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Sat, 23 Oct 2021 16:13:40 +0200 Subject: [PATCH 14/26] Extract device class string parsing to utility method. Signed-off-by: Jacob Laursen --- .../org/openhab/binding/miele/internal/DeviceUtil.java | 9 +++++++++ .../miele/internal/handler/MieleApplianceHandler.java | 3 +-- .../openhab/binding/miele/internal/DeviceUtilTest.java | 6 ++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/DeviceUtil.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/DeviceUtil.java index c80b28d38f0d4..9474b02714b06 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/DeviceUtil.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/DeviceUtil.java @@ -14,6 +14,7 @@ import java.nio.charset.StandardCharsets; +import org.apache.commons.lang3.StringUtils; import org.openhab.core.library.types.QuantityType; import org.openhab.core.library.unit.SIUnits; import org.openhab.core.types.State; @@ -63,4 +64,12 @@ public static State getTemperatureState(String s) throws NumberFormatException { int temperature = Integer.parseInt(s); return new QuantityType<>(temperature, SIUnits.CELSIUS); } + + /** + * Get device class from fully qualified string + */ + public static String getDeviceClassFromFullyQualifiedString(String fullString) { + return StringUtils.right(fullString, + fullString.length() - new String("com.miele.xgw3000.gateway.hdm.deviceclasses.Miele").length()); + } } diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java index feb57640c0ba8..0cc46681220c7 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java @@ -149,8 +149,7 @@ public void handleCommand(ChannelUID channelUID, Command command) { public void onApplianceStateChanged(FullyQualifiedApplianceIdentifier applicationIdentifier, DeviceClassObject dco) { String myApplianceId = (String) getThing().getConfiguration().getProperties().get(APPLIANCE_ID); - String modelID = StringUtils.right(dco.DeviceClass, - dco.DeviceClass.length() - new String("com.miele.xgw3000.gateway.hdm.deviceclasses.Miele").length()); + String modelID = DeviceUtil.getDeviceClassFromFullyQualifiedString(dco.DeviceClass); if (myApplianceId.equals(applicationIdentifier.getApplianceId())) { if (modelID.equals(this.modelID)) { diff --git a/bundles/org.openhab.binding.miele/src/test/java/org/openhab/binding/miele/internal/DeviceUtilTest.java b/bundles/org.openhab.binding.miele/src/test/java/org/openhab/binding/miele/internal/DeviceUtilTest.java index d159dd5416f90..26d387fd3da8d 100644 --- a/bundles/org.openhab.binding.miele/src/test/java/org/openhab/binding/miele/internal/DeviceUtilTest.java +++ b/bundles/org.openhab.binding.miele/src/test/java/org/openhab/binding/miele/internal/DeviceUtilTest.java @@ -67,4 +67,10 @@ public void getTemperatureStateNonNumericValueThrowsNumberFormatException() { public void getTemperatureStateNullValueThrowsNumberFormatException() { assertThrows(NumberFormatException.class, () -> DeviceUtil.getTemperatureState(null)); } + + @Test + public void getDeviceClassFromFullyQualifiedStringReturnsCorrectDeviceClass() { + assertEquals("WashingMachine", DeviceUtil.getDeviceClassFromFullyQualifiedString( + "com.miele.xgw3000.gateway.hdm.deviceclasses.MieleWashingMachine")); + } } From f78438e00b8b5efd871cac5d40e82f9872c022fa Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Sat, 23 Oct 2021 16:38:35 +0200 Subject: [PATCH 15/26] Fix SCA: ForbiddenPackageUsageCheck Signed-off-by: Jacob Laursen --- .../org/openhab/binding/miele/internal/DeviceUtil.java | 6 +++--- .../miele/internal/handler/MieleApplianceHandler.java | 9 ++++----- .../miele/internal/handler/MieleBridgeHandler.java | 7 +++---- .../internal/handler/WashingMachineChannelSelector.java | 3 +-- 4 files changed, 11 insertions(+), 14 deletions(-) diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/DeviceUtil.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/DeviceUtil.java index 9474b02714b06..0b5c9641f11a2 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/DeviceUtil.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/DeviceUtil.java @@ -14,7 +14,6 @@ import java.nio.charset.StandardCharsets; -import org.apache.commons.lang3.StringUtils; import org.openhab.core.library.types.QuantityType; import org.openhab.core.library.unit.SIUnits; import org.openhab.core.types.State; @@ -69,7 +68,8 @@ public static State getTemperatureState(String s) throws NumberFormatException { * Get device class from fully qualified string */ public static String getDeviceClassFromFullyQualifiedString(String fullString) { - return StringUtils.right(fullString, - fullString.length() - new String("com.miele.xgw3000.gateway.hdm.deviceclasses.Miele").length()); + // com.miele.xgw3000.gateway.hdm.deviceclasses.MieleWashingMachine + // Position of "WashingMachine" in above string: + return fullString.substring(49); } } diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java index 0cc46681220c7..21e331f2256ed 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java @@ -20,7 +20,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.apache.commons.lang3.StringUtils; import org.openhab.binding.miele.internal.DeviceUtil; import org.openhab.binding.miele.internal.FullyQualifiedApplianceIdentifier; import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceClassObject; @@ -157,8 +156,8 @@ public void onApplianceStateChanged(FullyQualifiedApplianceIdentifier applicatio try { DeviceProperty dp = gson.fromJson(prop, DeviceProperty.class); if (!dp.Name.equals(EXTENDED_DEVICE_STATE_PROPERTY_NAME)) { - dp.Value = StringUtils.trim(dp.Value); - dp.Value = StringUtils.strip(dp.Value); + dp.Value = dp.Value.trim(); + dp.Value = dp.Value.strip(); } onAppliancePropertyChanged(applicationIdentifier, dp); @@ -208,7 +207,7 @@ protected void onAppliancePropertyChanged(DeviceProperty dp) { } } if (dp.Metadata != null) { - String metadata = StringUtils.replace(dp.Metadata.toString(), "enum", "MieleEnum"); + String metadata = dp.Metadata.toString().replace("enum", "MieleEnum"); JsonObject jsonMetaData = (JsonObject) JsonParser.parseString(metadata); dmd = gson.fromJson(jsonMetaData, DeviceMetaData.class); metaDataCache.put(new StringBuilder().append(dp.Name).toString().trim(), metadata); @@ -233,7 +232,7 @@ protected void onAppliancePropertyChanged(DeviceProperty dp) { logger.trace("{} is not a valid channel for a {}", dp.Name, modelID); } - String dpValue = StringUtils.trim(StringUtils.strip(dp.Value)); + String dpValue = dp.Value.strip().trim(); if (selector != null) { if (!selector.isProperty()) { diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java index 5373ac71a6c87..6480945419479 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java @@ -47,7 +47,6 @@ import java.util.regex.Pattern; import java.util.zip.GZIPInputStream; -import org.apache.commons.lang3.StringUtils; import org.eclipse.jdt.annotation.NonNull; import org.openhab.binding.miele.internal.FullyQualifiedApplianceIdentifier; import org.openhab.core.common.NamedThreadFactory; @@ -423,16 +422,16 @@ private FullyQualifiedApplianceIdentifier getApplianceIdentifierFromApplianceId( DeviceProperty dp = new DeviceProperty(); String id = null; - String[] parts = StringUtils.split(event, "&"); + String[] parts = event.split("&"); for (String p : parts) { - String[] subparts = StringUtils.split(p, "="); + String[] subparts = p.split("="); switch (subparts[0]) { case "property": { dp.Name = subparts[1]; break; } case "value": { - dp.Value = StringUtils.trim(StringUtils.strip(subparts[1])); + dp.Value = subparts[1].strip().trim(); break; } case "id": { diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineChannelSelector.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineChannelSelector.java index 2379385fb4ff4..4fad63fe5dc29 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineChannelSelector.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineChannelSelector.java @@ -22,7 +22,6 @@ import java.util.Map.Entry; import java.util.TimeZone; -import org.apache.commons.lang3.StringUtils; import org.openhab.binding.miele.internal.DeviceUtil; import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData; import org.openhab.core.library.types.DateTimeType; @@ -96,7 +95,7 @@ public State getState(String s, DeviceMetaData dmd) { SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT+0")); try { - date.setTime(Long.valueOf(StringUtils.trim(s)) * 60000); + date.setTime(Long.valueOf(s.trim()) * 60000); } catch (Exception e) { date.setTime(0); } From 4aba0349fe6ec4c45534cd3fbf4ec572ad378ce7 Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Sat, 23 Oct 2021 17:01:45 +0200 Subject: [PATCH 16/26] Fix redundant null check. Signed-off-by: Jacob Laursen --- .../binding/miele/internal/handler/MieleApplianceHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java index 21e331f2256ed..edc6a996a4436 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java @@ -246,7 +246,7 @@ protected void onAppliancePropertyChanged(DeviceProperty dp) { } else { updateState(theChannelUID, UnDefType.UNDEF); } - } else if (dpValue != null) { + } else { logger.debug("Updating the property '{}' of '{}' to '{}'", selector.getChannelID(), getThing().getUID(), selector.getState(dpValue, dmd).toString()); Map properties = editProperties(); From 529a5c7c4c8f5bea698abf7ad2074d6d138f7693 Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Sat, 23 Oct 2021 17:51:49 +0200 Subject: [PATCH 17/26] Fix potential null pointer access warnings. Signed-off-by: Jacob Laursen --- .../handler/MieleApplianceHandler.java | 76 +++++++++++-------- 1 file changed, 45 insertions(+), 31 deletions(-) diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java index edc6a996a4436..9ec92cb233b5a 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java @@ -83,8 +83,13 @@ public MieleApplianceHandler(Thing thing, Class selectorType, String modelID) public ApplianceChannelSelector getValueSelectorFromChannelID(String valueSelectorText) throws IllegalArgumentException { - for (ApplianceChannelSelector c : selectorType.getEnumConstants()) { - if (c.getChannelID() != null && c.getChannelID().equals(valueSelectorText)) { + E[] enumConstants = selectorType.getEnumConstants(); + if (enumConstants == null) { + throw new IllegalArgumentException( + String.format("Could not get enum constants for value selector: %s", valueSelectorText)); + } + for (ApplianceChannelSelector c : enumConstants) { + if (c != null && c.getChannelID() != null && c.getChannelID().equals(valueSelectorText)) { return c; } } @@ -94,8 +99,13 @@ public ApplianceChannelSelector getValueSelectorFromChannelID(String valueSelect public ApplianceChannelSelector getValueSelectorFromMieleID(String valueSelectorText) throws IllegalArgumentException { - for (ApplianceChannelSelector c : selectorType.getEnumConstants()) { - if (c.getMieleID() != null && c.getMieleID().equals(valueSelectorText)) { + E[] enumConstants = selectorType.getEnumConstants(); + if (enumConstants == null) { + throw new IllegalArgumentException( + String.format("Could not get enum constants for value selector: %s", valueSelectorText)); + } + for (ApplianceChannelSelector c : enumConstants) { + if (c != null && c.getMieleID() != null && c.getMieleID().equals(valueSelectorText)) { return c; } } @@ -109,16 +119,14 @@ public void initialize() { final String applianceId = (String) getThing().getConfiguration().getProperties().get(APPLIANCE_ID); if (applianceId != null) { this.applianceId = applianceId; - if (getMieleBridgeHandler() != null) { - ThingStatusInfo statusInfo = getBridge().getStatusInfo(); - updateStatus(statusInfo.getStatus(), statusInfo.getStatusDetail(), statusInfo.getDescription()); - } + this.onBridgeConnectionResumed(); } } public void onBridgeConnectionResumed() { - if (getMieleBridgeHandler() != null) { - ThingStatusInfo statusInfo = getBridge().getStatusInfo(); + Bridge bridge = getBridge(); + if (bridge != null && getMieleBridgeHandler() != null) { + ThingStatusInfo statusInfo = bridge.getStatusInfo(); updateStatus(statusInfo.getStatus(), statusInfo.getStatusDetail(), statusInfo.getDescription()); } } @@ -148,23 +156,28 @@ public void handleCommand(ChannelUID channelUID, Command command) { public void onApplianceStateChanged(FullyQualifiedApplianceIdentifier applicationIdentifier, DeviceClassObject dco) { String myApplianceId = (String) getThing().getConfiguration().getProperties().get(APPLIANCE_ID); + if (myApplianceId == null || !myApplianceId.equals(applicationIdentifier.getApplianceId())) { + return; + } + String modelID = DeviceUtil.getDeviceClassFromFullyQualifiedString(dco.DeviceClass); + if (!modelID.equals(this.modelID)) { + return; + } - if (myApplianceId.equals(applicationIdentifier.getApplianceId())) { - if (modelID.equals(this.modelID)) { - for (JsonElement prop : dco.Properties.getAsJsonArray()) { - try { - DeviceProperty dp = gson.fromJson(prop, DeviceProperty.class); - if (!dp.Name.equals(EXTENDED_DEVICE_STATE_PROPERTY_NAME)) { - dp.Value = dp.Value.trim(); - dp.Value = dp.Value.strip(); - } - - onAppliancePropertyChanged(applicationIdentifier, dp); - } catch (Exception p) { - // Ignore - this is due to an unrecognized and not yet reverse-engineered array property - } + for (JsonElement prop : dco.Properties.getAsJsonArray()) { + try { + DeviceProperty dp = gson.fromJson(prop, DeviceProperty.class); + if (dp == null) { + continue; } + if (!EXTENDED_DEVICE_STATE_PROPERTY_NAME.equals(dp.Name)) { + dp.Value = dp.Value.trim(); + dp.Value = dp.Value.strip(); + } + onAppliancePropertyChanged(applicationIdentifier, dp); + } catch (Exception p) { + // Ignore - this is due to an unrecognized and not yet reverse-engineered array property } } } @@ -172,10 +185,9 @@ public void onApplianceStateChanged(FullyQualifiedApplianceIdentifier applicatio @Override public void onAppliancePropertyChanged(String serialNumber, DeviceProperty dp) { String mySerialNumber = getThing().getProperties().get(SERIAL_NUMBER_PROPERTY_NAME); - if (!mySerialNumber.equals(serialNumber)) { + if (mySerialNumber == null || !mySerialNumber.equals(serialNumber)) { return; } - this.onAppliancePropertyChanged(dp); } @@ -183,7 +195,7 @@ public void onAppliancePropertyChanged(String serialNumber, DeviceProperty dp) { public void onAppliancePropertyChanged(FullyQualifiedApplianceIdentifier applicationIdentifier, DeviceProperty dp) { String myApplianceId = (String) getThing().getConfiguration().getProperties().get(APPLIANCE_ID); - if (!myApplianceId.equals(applicationIdentifier.getApplianceId())) { + if (myApplianceId == null || !myApplianceId.equals(applicationIdentifier.getApplianceId())) { return; } @@ -200,10 +212,12 @@ protected void onAppliancePropertyChanged(DeviceProperty dp) { dmd = gson.fromJson(jsonMetaData, DeviceMetaData.class); // only keep the enum, if any - that's all we care for events we receive via multicast // all other fields are nulled - dmd.LocalizedID = null; - dmd.LocalizedValue = null; - dmd.Filter = null; - dmd.description = null; + if (dmd != null) { + dmd.LocalizedID = null; + dmd.LocalizedValue = null; + dmd.Filter = null; + dmd.description = null; + } } } if (dp.Metadata != null) { From 32d4167a94aacee5af09fe936448c4cf6bb9a080 Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Sat, 23 Oct 2021 19:35:44 +0200 Subject: [PATCH 18/26] Fix unsafe null type conversion (type annotations) Signed-off-by: Jacob Laursen --- .../miele/internal/handler/MieleApplianceHandler.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java index 9ec92cb233b5a..1ba29aef6f804 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java @@ -20,6 +20,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import org.eclipse.jdt.annotation.NonNull; import org.openhab.binding.miele.internal.DeviceUtil; import org.openhab.binding.miele.internal.FullyQualifiedApplianceIdentifier; import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceClassObject; @@ -263,7 +264,8 @@ protected void onAppliancePropertyChanged(DeviceProperty dp) { } else { logger.debug("Updating the property '{}' of '{}' to '{}'", selector.getChannelID(), getThing().getUID(), selector.getState(dpValue, dmd).toString()); - Map properties = editProperties(); + @NonNull + Map<@NonNull String, @NonNull String> properties = editProperties(); properties.put(selector.getChannelID(), selector.getState(dpValue, dmd).toString()); updateProperties(properties); } @@ -329,7 +331,8 @@ public void onApplianceAdded(HomeDevice appliance) { FullyQualifiedApplianceIdentifier applianceIdentifier = appliance.getApplianceIdentifier(); if (applianceId.equals(applianceIdentifier.getApplianceId())) { - Map properties = editProperties(); + @NonNull + Map<@NonNull String, @NonNull String> properties = editProperties(); properties.put(MODEL_PROPERTY_NAME, appliance.getApplianceModel()); String deviceClass = appliance.getDeviceClass(); if (deviceClass != null) { From 9af1bbc50d542cef173252573f9593e7c2a43907 Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Sat, 23 Oct 2021 23:16:59 +0200 Subject: [PATCH 19/26] Share same configuration (UID) for all appliance types. Signed-off-by: Jacob Laursen --- .../src/main/resources/OH-INF/config/config.xml | 15 +++++++++++++++ .../main/resources/OH-INF/thing/coffeemachine.xml | 7 +------ .../main/resources/OH-INF/thing/dishwasher.xml | 8 +------- .../src/main/resources/OH-INF/thing/fridge.xml | 8 +------- .../main/resources/OH-INF/thing/fridgefreezer.xml | 8 +------- .../src/main/resources/OH-INF/thing/hob.xml | 8 +------- .../src/main/resources/OH-INF/thing/hood.xml | 7 +------ .../src/main/resources/OH-INF/thing/oven.xml | 8 +------- .../main/resources/OH-INF/thing/tumbledryer.xml | 8 +------- .../resources/OH-INF/thing/washingmachine.xml | 7 +------ 10 files changed, 24 insertions(+), 60 deletions(-) create mode 100644 bundles/org.openhab.binding.miele/src/main/resources/OH-INF/config/config.xml diff --git a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/config/config.xml b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/config/config.xml new file mode 100644 index 0000000000000..cf07317f41b61 --- /dev/null +++ b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/config/config.xml @@ -0,0 +1,15 @@ + + + + + + + The identifier identifies one certain appliance on the ZigBee network. + + + + diff --git a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/coffeemachine.xml b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/coffeemachine.xml index d7ae1d8bcff2a..92d7a9c3cddb2 100644 --- a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/coffeemachine.xml +++ b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/coffeemachine.xml @@ -27,12 +27,7 @@ uid - - - - The identifier identifies one certain appliance on the ZigBee network. - - + diff --git a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/dishwasher.xml b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/dishwasher.xml index a50081e91ac73..dbcd85123999e 100644 --- a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/dishwasher.xml +++ b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/dishwasher.xml @@ -32,13 +32,7 @@ uid - - - - The identifier identifies one certain appliance on the ZigBee network. - - - + diff --git a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/fridge.xml b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/fridge.xml index 8e154f1870ffa..4685f0cfad650 100644 --- a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/fridge.xml +++ b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/fridge.xml @@ -29,13 +29,7 @@ uid - - - - The identifier identifies one certain appliance on the ZigBee network. - - - + diff --git a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/fridgefreezer.xml b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/fridgefreezer.xml index c257767d84063..23fe18099daea 100644 --- a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/fridgefreezer.xml +++ b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/fridgefreezer.xml @@ -38,13 +38,7 @@ uid - - - - The identifier identifies one certain appliance on the ZigBee network. - - - + diff --git a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/hob.xml b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/hob.xml index a3897500329d8..ce387651976b4 100644 --- a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/hob.xml +++ b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/hob.xml @@ -38,13 +38,7 @@ uid - - - - The identifier identifies one certain appliance on the ZigBee network. - - - + diff --git a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/hood.xml b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/hood.xml index a396b962de4e3..77888cc0c0c88 100644 --- a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/hood.xml +++ b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/hood.xml @@ -23,12 +23,7 @@ uid - - - - The identifier identifies the appliance on the ZigBee network. - - + diff --git a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/oven.xml b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/oven.xml index 58fa91d19679e..98dd1b5b7e0d5 100644 --- a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/oven.xml +++ b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/oven.xml @@ -47,13 +47,7 @@ uid - - - - The identifier identifies one certain appliance on the ZigBee network. - - - + diff --git a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/tumbledryer.xml b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/tumbledryer.xml index ea5716fb9a26b..8655a1f3674d6 100644 --- a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/tumbledryer.xml +++ b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/tumbledryer.xml @@ -32,13 +32,7 @@ uid - - - - The identifier identifies one certain appliance on the ZigBee network. - - - + diff --git a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/washingmachine.xml b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/washingmachine.xml index 39a2a95b5ac62..d704a54bffc05 100644 --- a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/washingmachine.xml +++ b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/washingmachine.xml @@ -38,12 +38,7 @@ uid - - - - The identifier identifies one certain appliance on the ZigBee network. - - + From bde2296e4ac6a90d7cade144fb39a5529f05a408 Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Sat, 23 Oct 2021 23:21:46 +0200 Subject: [PATCH 20/26] Refer to gateway instead of ZigBee network in configuration. Signed-off-by: Jacob Laursen --- .../src/main/resources/OH-INF/config/config.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/config/config.xml b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/config/config.xml index cf07317f41b61..8e620c4f31629 100644 --- a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/config/config.xml +++ b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/config/config.xml @@ -8,7 +8,7 @@ - The identifier identifies one certain appliance on the ZigBee network. + Unique identifier for specific appliance on the gateway. From 55e0955c275690e4709b5a59131879c575e558f7 Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Sun, 24 Oct 2021 17:13:25 +0200 Subject: [PATCH 21/26] Remove dependency to seriaNumber property for multicast channel updates. Signed-off-by: Jacob Laursen --- .../MieleApplianceDiscoveryService.java | 7 +--- .../handler/ApplianceStatusListener.java | 8 ---- .../handler/FridgeFreezerHandler.java | 2 +- .../miele/internal/handler/FridgeHandler.java | 2 +- .../handler/MieleApplianceHandler.java | 9 ----- .../internal/handler/MieleBridgeHandler.java | 40 ++++++++++++++----- 6 files changed, 32 insertions(+), 36 deletions(-) diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/discovery/MieleApplianceDiscoveryService.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/discovery/MieleApplianceDiscoveryService.java index 53ed8e45b6c43..5c0de6e09951a 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/discovery/MieleApplianceDiscoveryService.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/discovery/MieleApplianceDiscoveryService.java @@ -142,11 +142,6 @@ public void onAppliancePropertyChanged(FullyQualifiedApplianceIdentifier applian // nothing to do } - @Override - public void onAppliancePropertyChanged(String serialNumber, DeviceProperty dp) { - // nothing to do - } - private ThingUID getThingUID(HomeDevice appliance) { ThingUID bridgeUID = mieleBridgeHandler.getThing().getUID(); String modelId = appliance.getDeviceClass(); @@ -171,7 +166,7 @@ private ThingTypeUID getThingTypeUidFromModelId(String modelId) { * coffeemachine. At least until it is known if any models are actually reported * as CoffeeMachine, we need this special mapping. */ - if (modelId.equals(MIELE_DEVICE_CLASS_COFFEE_SYSTEM)) { + if (MIELE_DEVICE_CLASS_COFFEE_SYSTEM.equals(modelId)) { return THING_TYPE_COFFEEMACHINE; } diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/ApplianceStatusListener.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/ApplianceStatusListener.java index 9573812405df5..f11db64965dbe 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/ApplianceStatusListener.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/ApplianceStatusListener.java @@ -43,14 +43,6 @@ public interface ApplianceStatusListener { */ void onAppliancePropertyChanged(FullyQualifiedApplianceIdentifier applianceIdentifier, DeviceProperty dp); - /** - * This method is called whenever a "property" of the given appliance has changed. - * - * @param serialNumber The serial number of the appliance that has changed - * @param dco the POJO containing the new state of the property - */ - void onAppliancePropertyChanged(String serialNumber, DeviceProperty dp); - /** * This method is called whenever an appliance is removed. * diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeFreezerHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeFreezerHandler.java index fb07a7b9b2d11..be9d5926cfbd1 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeFreezerHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeFreezerHandler.java @@ -91,7 +91,7 @@ public void handleCommand(ChannelUID channelUID, Command command) { protected void onAppliancePropertyChanged(DeviceProperty dp) { super.onAppliancePropertyChanged(dp); - if (!dp.Name.equals(STATE_PROPERTY_NAME)) { + if (!STATE_PROPERTY_NAME.equals(dp.Name)) { return; } diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeHandler.java index 2734860ab8447..84bd5509f88f0 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeHandler.java @@ -92,7 +92,7 @@ public void handleCommand(ChannelUID channelUID, Command command) { protected void onAppliancePropertyChanged(DeviceProperty dp) { super.onAppliancePropertyChanged(dp); - if (!dp.Name.equals(STATE_PROPERTY_NAME)) { + if (!STATE_PROPERTY_NAME.equals(dp.Name)) { return; } diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java index 1ba29aef6f804..d9f67ffbcbbbd 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java @@ -183,15 +183,6 @@ public void onApplianceStateChanged(FullyQualifiedApplianceIdentifier applicatio } } - @Override - public void onAppliancePropertyChanged(String serialNumber, DeviceProperty dp) { - String mySerialNumber = getThing().getProperties().get(SERIAL_NUMBER_PROPERTY_NAME); - if (mySerialNumber == null || !mySerialNumber.equals(serialNumber)) { - return; - } - this.onAppliancePropertyChanged(dp); - } - @Override public void onAppliancePropertyChanged(FullyQualifiedApplianceIdentifier applicationIdentifier, DeviceProperty dp) { String myApplianceId = (String) getThing().getConfiguration().getProperties().get(APPLIANCE_ID); diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java index 6480945419479..94506c4ee4301 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java @@ -102,7 +102,8 @@ public class MieleBridgeHandler extends BaseBridgeHandler { protected Future eventListenerJob; @NonNull - protected Map cachedHomeDevices = new ConcurrentHashMap(); + protected Map cachedHomeDevicesByApplianceId = new ConcurrentHashMap(); + protected Map cachedHomeDevicesByRemoteUid = new ConcurrentHashMap(); protected URL url; protected Map headers; @@ -138,6 +139,18 @@ public String getSerialNumber() { return Properties.get("serial.number").getAsString(); } + @NonNull + public String getRemoteUid() { + JsonElement remoteUid = Properties.get("remote.uid"); + if (remoteUid == null) { + // remote.uid and serial.number seems to be the same. If remote.uid + // is missing for some reason, it makes sense to provide fallback + // to serial number. + return getSerialNumber(); + } + return remoteUid.getAsString(); + } + public String getConnectionType() { JsonElement connectionType = Properties.get("connection.type"); if (connectionType == null) { @@ -269,17 +282,18 @@ public void run() { List homeDevices = getHomeDevices(); for (HomeDevice hd : homeDevices) { String key = hd.getApplianceIdentifier().getApplianceId(); - if (!cachedHomeDevices.containsKey(key)) { + if (!cachedHomeDevicesByApplianceId.containsKey(key)) { logger.debug("A new appliance with ID '{}' has been added", hd.UID); for (ApplianceStatusListener listener : applianceStatusListeners) { listener.onApplianceAdded(hd); } } - cachedHomeDevices.put(key, hd); + cachedHomeDevicesByApplianceId.put(key, hd); + cachedHomeDevicesByRemoteUid.put(hd.getRemoteUid(), hd); } @NonNull - Set<@NonNull Entry> cachedEntries = cachedHomeDevices.entrySet(); + Set<@NonNull Entry> cachedEntries = cachedHomeDevicesByApplianceId.entrySet(); @NonNull Iterator<@NonNull Entry> iterator = cachedEntries.iterator(); @@ -375,7 +389,7 @@ public List getHomeDevices() { } private FullyQualifiedApplianceIdentifier getApplianceIdentifierFromApplianceId(String applianceId) { - HomeDevice homeDevice = this.cachedHomeDevices.get(applianceId); + HomeDevice homeDevice = this.cachedHomeDevicesByApplianceId.get(applianceId); if (homeDevice == null) { return null; } @@ -447,15 +461,19 @@ private FullyQualifiedApplianceIdentifier getApplianceIdentifierFromApplianceId( // In XGW 3000 firmware 2.03 this was changed from UID (hdm:ZigBee:0123456789abcdef#210) // to serial number (001234567890) + FullyQualifiedApplianceIdentifier applianceIdentifier; if (id.startsWith("hdm:")) { - for (ApplianceStatusListener listener : applianceStatusListeners) { - listener.onAppliancePropertyChanged(new FullyQualifiedApplianceIdentifier(id), - dp); - } + applianceIdentifier = new FullyQualifiedApplianceIdentifier(id); } else { - for (ApplianceStatusListener listener : applianceStatusListeners) { - listener.onAppliancePropertyChanged(id, dp); + HomeDevice device = cachedHomeDevicesByRemoteUid.get(id); + if (device == null) { + logger.debug("Multicast event not handled as id {} is unknown.", id); + continue; } + applianceIdentifier = device.getApplianceIdentifier(); + } + for (ApplianceStatusListener listener : applianceStatusListeners) { + listener.onAppliancePropertyChanged(applianceIdentifier, dp); } } catch (SocketTimeoutException e) { try { From 8317f1fa1abe6e95355a16508cb3f6f80eda72ce Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Mon, 25 Oct 2021 17:27:06 +0200 Subject: [PATCH 22/26] Simplified filtering of irrelevant device class. Signed-off-by: Jacob Laursen --- .../org/openhab/binding/miele/internal/DeviceUtil.java | 9 --------- .../miele/internal/handler/MieleApplianceHandler.java | 5 ----- .../miele/internal/handler/MieleBridgeHandler.java | 10 ++++++++-- .../openhab/binding/miele/internal/DeviceUtilTest.java | 6 ------ 4 files changed, 8 insertions(+), 22 deletions(-) diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/DeviceUtil.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/DeviceUtil.java index 0b5c9641f11a2..c80b28d38f0d4 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/DeviceUtil.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/DeviceUtil.java @@ -63,13 +63,4 @@ public static State getTemperatureState(String s) throws NumberFormatException { int temperature = Integer.parseInt(s); return new QuantityType<>(temperature, SIUnits.CELSIUS); } - - /** - * Get device class from fully qualified string - */ - public static String getDeviceClassFromFullyQualifiedString(String fullString) { - // com.miele.xgw3000.gateway.hdm.deviceclasses.MieleWashingMachine - // Position of "WashingMachine" in above string: - return fullString.substring(49); - } } diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java index d9f67ffbcbbbd..9c84e1a912a3e 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java @@ -161,11 +161,6 @@ public void onApplianceStateChanged(FullyQualifiedApplianceIdentifier applicatio return; } - String modelID = DeviceUtil.getDeviceClassFromFullyQualifiedString(dco.DeviceClass); - if (!modelID.equals(this.modelID)) { - return; - } - for (JsonElement prop : dco.Properties.getAsJsonArray()) { try { DeviceProperty dp = gson.fromJson(prop, DeviceProperty.class); diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java index 94506c4ee4301..9df9a9f5c2208 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java @@ -82,6 +82,8 @@ public class MieleBridgeHandler extends BaseBridgeHandler { @NonNull public static final Set<@NonNull ThingTypeUID> SUPPORTED_THING_TYPES = Collections.singleton(THING_TYPE_XGW3000); + private static final String MIELE_CLASS = "com.miele.xgw3000.gateway.hdm.deviceclasses.Miele"; + private static final Pattern IP_PATTERN = Pattern .compile("^(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])$"); @@ -112,7 +114,6 @@ public class MieleBridgeHandler extends BaseBridgeHandler { public class HomeDevice { private static final String MIELE_APPLIANCE_CLASS = "com.miele.xgw3000.gateway.hdm.deviceclasses.MieleAppliance"; - private static final String MIELE_CLASS = "com.miele.xgw3000.gateway.hdm.deviceclasses.Miele"; public String Name; public String Status; @@ -331,6 +332,11 @@ public void run() { try { DeviceClassObject dco = gson.fromJson(obj, DeviceClassObject.class); + // Skip com.prosyst.mbs.services.zigbee.hdm.deviceclasses.ReportingControl + if (!dco.DeviceClass.startsWith(MIELE_CLASS)) { + continue; + } + for (ApplianceStatusListener listener : applianceStatusListeners) { listener.onApplianceStateChanged(applianceIdentifier, dco); } @@ -523,7 +529,7 @@ public JsonElement invokeOperation(String applianceId, String modelID, String me Object[] args = new Object[4]; args[0] = applianceIdentifier.getUid(); - args[1] = "com.miele.xgw3000.gateway.hdm.deviceclasses.Miele" + modelID; + args[1] = MIELE_CLASS + modelID; args[2] = methodName; args[3] = null; diff --git a/bundles/org.openhab.binding.miele/src/test/java/org/openhab/binding/miele/internal/DeviceUtilTest.java b/bundles/org.openhab.binding.miele/src/test/java/org/openhab/binding/miele/internal/DeviceUtilTest.java index 26d387fd3da8d..d159dd5416f90 100644 --- a/bundles/org.openhab.binding.miele/src/test/java/org/openhab/binding/miele/internal/DeviceUtilTest.java +++ b/bundles/org.openhab.binding.miele/src/test/java/org/openhab/binding/miele/internal/DeviceUtilTest.java @@ -67,10 +67,4 @@ public void getTemperatureStateNonNumericValueThrowsNumberFormatException() { public void getTemperatureStateNullValueThrowsNumberFormatException() { assertThrows(NumberFormatException.class, () -> DeviceUtil.getTemperatureState(null)); } - - @Test - public void getDeviceClassFromFullyQualifiedStringReturnsCorrectDeviceClass() { - assertEquals("WashingMachine", DeviceUtil.getDeviceClassFromFullyQualifiedString( - "com.miele.xgw3000.gateway.hdm.deviceclasses.MieleWashingMachine")); - } } From 81cd54175175d651849b04b7f028f9be248629a7 Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Mon, 25 Oct 2021 20:42:08 +0200 Subject: [PATCH 23/26] Remove devices from remoteUid cache also when disappearing from gateway, although this is a quite rare scenario. Signed-off-by: Jacob Laursen --- .../binding/miele/internal/handler/MieleBridgeHandler.java | 1 + 1 file changed, 1 insertion(+) diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java index 9df9a9f5c2208..10fca0dbf8e64 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java @@ -306,6 +306,7 @@ public void run() { for (ApplianceStatusListener listener : applianceStatusListeners) { listener.onApplianceRemoved(cachedHomeDevice); } + cachedHomeDevicesByRemoteUid.remove(cachedHomeDevice.getRemoteUid()); iterator.remove(); } } From b2b166ddf829cc86054ae6efc3293d30eb31ec4a Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Mon, 25 Oct 2021 20:43:51 +0200 Subject: [PATCH 24/26] Fix potential null pointer access. Signed-off-by: Jacob Laursen --- .../binding/miele/internal/handler/MieleBridgeHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java index 10fca0dbf8e64..78ea4e8bc6233 100644 --- a/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java +++ b/bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleBridgeHandler.java @@ -334,7 +334,7 @@ public void run() { DeviceClassObject dco = gson.fromJson(obj, DeviceClassObject.class); // Skip com.prosyst.mbs.services.zigbee.hdm.deviceclasses.ReportingControl - if (!dco.DeviceClass.startsWith(MIELE_CLASS)) { + if (dco == null || !dco.DeviceClass.startsWith(MIELE_CLASS)) { continue; } From bd055462259bb219afa95a26e44b51c7b8bc2fe3 Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Sat, 30 Oct 2021 13:00:58 +0200 Subject: [PATCH 25/26] Add default i18n properties file. Signed-off-by: Jacob Laursen --- .../resources/OH-INF/i18n/miele.properties | 107 ++++++++++++++++++ .../main/resources/OH-INF/thing/xgw3000.xml | 6 +- 2 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 bundles/org.openhab.binding.miele/src/main/resources/OH-INF/i18n/miele.properties diff --git a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/i18n/miele.properties b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/i18n/miele.properties new file mode 100644 index 0000000000000..94e0949fa0e6d --- /dev/null +++ b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/i18n/miele.properties @@ -0,0 +1,107 @@ +# binding + +binding.miele.name = Miele Binding +binding.miele.description = This is the binding for Miele@home appliances + +# thing types + +thing-type.miele.coffeemachine.label = Coffee Machine +thing-type.miele.coffeemachine.description = This is a Miele@home compatible coffee machine +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.fridgefreezer.label = Fridge Freezer +thing-type.miele.fridgefreezer.description = This is a Miele@home compatible fridgefreezer +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.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.xgw3000.label = Miele XGW3000 +thing-type.miele.xgw3000.description = The Miele bridge represents the Miele@home XGW3000 gateway. + +# thing types config + +thing-type.config.miele.appliance.uid.label = ID +thing-type.config.miele.appliance.uid.description = Unique identifier for specific appliance on the gateway. +thing-type.config.miele.xgw3000.interface.label = Network Address of the Multicast Interface +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.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 +thing-type.config.miele.xgw3000.userName.description = Name of a registered Miele@home user. + +# channel types + +channel-type.miele.currentTemperature.label = Current Temperature +channel-type.miele.currentTemperature.description = Current temperature of the appliance +channel-type.miele.door.label = Door +channel-type.miele.door.description = Current state of the door of the appliance +channel-type.miele.duration.label = Duration +channel-type.miele.duration.description = Duration of the program running on the appliance +channel-type.miele.duration.state.pattern = %1$tH:%1$tM +channel-type.miele.elapsed.label = Elapsed Time +channel-type.miele.elapsed.description = Time elapsed in the program running on the appliance +channel-type.miele.elapsed.state.pattern = %1$tH:%1$tM +channel-type.miele.finish.label = Finish Time +channel-type.miele.finish.description = Time to finish the program running on the appliance +channel-type.miele.finish.state.pattern = %1$tH:%1$tM +channel-type.miele.freezerstate.label = Status +channel-type.miele.freezerstate.description = Current status of the freezer compartment +channel-type.miele.fridgestate.label = Status +channel-type.miele.fridgestate.description = Current status of the fridge compartment +channel-type.miele.heat.label = Remaining Heat +channel-type.miele.heat.description = Remaining heat level of the heating zone/plate +channel-type.miele.phase.label = Phase +channel-type.miele.phase.description = Current phase of the program running on the appliance +channel-type.miele.plates.label = Plates +channel-type.miele.plates.description = Number of heating zones/plates on the hob +channel-type.miele.power.label = Power Step +channel-type.miele.power.description = Power level of the heating zone/plate +channel-type.miele.powerConsumption.label = Power Consumption +channel-type.miele.powerConsumption.description = Power consumption by the currently running program on the appliance +channel-type.miele.program.label = Program +channel-type.miele.program.description = Current program or function running on the appliance +channel-type.miele.rawPhase.label = Raw Phase +channel-type.miele.rawPhase.description = Current phase of the program running on the appliance as raw number +channel-type.miele.rawProgram.label = Raw Program +channel-type.miele.rawProgram.description = Current program or function running on the appliance as raw number +channel-type.miele.rawState.label = Raw State +channel-type.miele.rawState.description = Current status of the appliance as raw number +channel-type.miele.spinningspeed.label = Spinning Speed +channel-type.miele.spinningspeed.description = Spinning speed in the program running on the appliance +channel-type.miele.start.label = Start Time +channel-type.miele.start.description = Programmed start time of the program +channel-type.miele.start.state.pattern = %1$tH:%1$tM +channel-type.miele.state.label = State +channel-type.miele.state.description = Current status of the appliance +channel-type.miele.step.label = Step +channel-type.miele.step.description = Current step in the program running on the appliance +channel-type.miele.stop.label = Stop +channel-type.miele.stop.description = Stop the appliance +channel-type.miele.supercool.label = Super Cool +channel-type.miele.supercool.description = Start or stop Super Cooling +channel-type.miele.superfreeze.label = Super Freeze +channel-type.miele.superfreeze.description = Start or stop Super Freezing +channel-type.miele.switch.label = Switch +channel-type.miele.switch.description = Switch the appliance on or off +channel-type.miele.targetTemperature.label = Target Temperature +channel-type.miele.targetTemperature.description = Target temperature to be reached by the appliance +channel-type.miele.temperature.label = Temperature +channel-type.miele.temperature.description = Temperature reported by the appliance +channel-type.miele.time.label = Remaining Time +channel-type.miele.time.description = Remaining time of the heating zone/plate +channel-type.miele.type.label = Program Type +channel-type.miele.type.description = Type of the program running on the appliance +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 diff --git a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/xgw3000.xml b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/xgw3000.xml index bdabbde84332c..58d9ca23cbac4 100644 --- a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/xgw3000.xml +++ b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/xgw3000.xml @@ -7,7 +7,7 @@ - The miele bridge represents the Miele@home XGW3000 gateway. + The Miele bridge represents the Miele@home XGW3000 gateway. Miele @@ -25,7 +25,7 @@ network-address Network address of openHAB host interface where the binding will listen for multicast events coming - from the Miele@home gateway + from the Miele@home gateway. @@ -36,7 +36,7 @@ password - Password for the registered Miele@home + Password for the registered Miele@home user. From d24a9bad47405f05d0fecf0d47a9ea9389962618 Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Sat, 30 Oct 2021 13:01:30 +0200 Subject: [PATCH 26/26] Add partial Danish translation. Signed-off-by: Jacob Laursen --- .../resources/OH-INF/i18n/miele_da.properties | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 bundles/org.openhab.binding.miele/src/main/resources/OH-INF/i18n/miele_da.properties diff --git a/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/i18n/miele_da.properties b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/i18n/miele_da.properties new file mode 100644 index 0000000000000..488269b00a7d9 --- /dev/null +++ b/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/i18n/miele_da.properties @@ -0,0 +1,40 @@ +# binding + +binding.miele.name = Miele Binding +binding.miele.description = Dette er bindingen til Miele@home-husholdningsapparater + +# thing types + +thing-type.miele.coffeemachine.label = Kaffemaskine +thing-type.miele.coffeemachine.description = Dette er en Miele@home-kompatibel kaffemaskine +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.fridgefreezer.label = Kølefryseskab +thing-type.miele.fridgefreezer.description = Dette er et Miele@home-kompatibelt kølefryseskab +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.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.xgw3000.label = Miele XGW3000 +thing-type.miele.xgw3000.description = Miele-bridgen repræsenterer Miele@home XGW3000-gateway'en. + +# thing types config + +thing-type.config.miele.appliance.uid.label = ID +thing-type.config.miele.appliance.uid.description = Unik identifikator til specifikt husholdningsapparat på gateway'en. +thing-type.config.miele.xgw3000.interface.label = Netværksadresse til multicast-interfacet +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.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.