diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/Connection.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/Connection.java index 4d1d1b340e349..a1197d17c9d80 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/Connection.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/Connection.java @@ -1053,15 +1053,30 @@ public String getDeviceListJson() throws IOException, URISyntaxException, Interr return json; } - public Map getSmartHomeDeviceStatesJson(Set applianceIds) + public Map getSmartHomeDeviceStatesJson(Set devices) throws IOException, URISyntaxException, InterruptedException { JsonObject requestObject = new JsonObject(); JsonArray stateRequests = new JsonArray(); - for (String applianceId : applianceIds) { - JsonObject stateRequest = new JsonObject(); - stateRequest.addProperty("entityId", applianceId); - stateRequest.addProperty("entityType", "APPLIANCE"); - stateRequests.add(stateRequest); + Map mergedApplianceMap = new HashMap<>(); + for (SmartHomeBaseDevice device : devices) { + String applianceId = device.findId(); + if (applianceId != null) { + JsonObject stateRequest; + if (device instanceof SmartHomeDevice && !((SmartHomeDevice) device).mergedApplianceIds.isEmpty()) { + for (String idToMerge : ((SmartHomeDevice) device).mergedApplianceIds) { + mergedApplianceMap.put(idToMerge, applianceId); + stateRequest = new JsonObject(); + stateRequest.addProperty("entityId", idToMerge); + stateRequest.addProperty("entityType", "APPLIANCE"); + stateRequests.add(stateRequest); + } + } else { + stateRequest = new JsonObject(); + stateRequest.addProperty("entityId", applianceId); + stateRequest.addProperty("entityType", "APPLIANCE"); + stateRequests.add(stateRequest); + } + } } requestObject.add("stateRequests", stateRequests); String requestBody = requestObject.toString(); @@ -1074,10 +1089,21 @@ public Map getSmartHomeDeviceStatesJson(Set appliance for (JsonElement deviceState : deviceStates) { JsonObject deviceStateObject = deviceState.getAsJsonObject(); JsonObject entity = deviceStateObject.get("entity").getAsJsonObject(); - String applicanceId = entity.get("entityId").getAsString(); + String applianceId = entity.get("entityId").getAsString(); JsonElement capabilityState = deviceStateObject.get("capabilityStates"); if (capabilityState != null && capabilityState.isJsonArray()) { - result.put(applicanceId, capabilityState.getAsJsonArray()); + String realApplianceId = mergedApplianceMap.get(applianceId); + if (realApplianceId != null) { + var capabilityArray = result.get(realApplianceId); + if (capabilityArray != null) { + capabilityArray.addAll(capabilityState.getAsJsonArray()); + result.put(realApplianceId, capabilityArray); + } else { + result.put(realApplianceId, capabilityState.getAsJsonArray()); + } + } else { + result.put(applianceId, capabilityState.getAsJsonArray()); + } } } return result; diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/handler/AccountHandler.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/handler/AccountHandler.java index f6d3f3bf6b799..277b670837679 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/handler/AccountHandler.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/handler/AccountHandler.java @@ -220,7 +220,6 @@ public List getLastKnownSmartHomeDevices() { public void addEchoHandler(EchoHandler echoHandler) { if (echoHandlers.add(echoHandler)) { - forceCheckData(); } } @@ -909,9 +908,10 @@ private synchronized void updateSmartHomeState(@Nullable String deviceFilterId) return; } List allDevices = getLastKnownSmartHomeDevices(); - Set applianceIds = new HashSet<>(); + Set targetDevices = new HashSet<>(); if (deviceFilterId != null) { - applianceIds.add(deviceFilterId); + allDevices.stream().filter(d -> deviceFilterId.equals(d.findId())).findFirst() + .ifPresent(targetDevices::add); } else { SmartHomeDeviceStateGroupUpdateCalculator smartHomeDeviceStateGroupUpdateCalculator = this.smartHomeDeviceStateGroupUpdateCalculator; if (smartHomeDeviceStateGroupUpdateCalculator == null) { @@ -928,18 +928,13 @@ private synchronized void updateSmartHomeState(@Nullable String deviceFilterId) .forEach(devicesToUpdate::add); } smartHomeDeviceStateGroupUpdateCalculator.removeDevicesWithNoUpdate(devicesToUpdate); - devicesToUpdate.stream().map(shd -> shd.applianceId).forEach(applianceId -> { - if (applianceId != null) { - applianceIds.add(applianceId); - } - }); - if (applianceIds.isEmpty()) { + devicesToUpdate.stream().filter(Objects::nonNull).forEach(targetDevices::add); + if (targetDevices.isEmpty()) { return; } - } Map applianceIdToCapabilityStates = connection - .getSmartHomeDeviceStatesJson(applianceIds); + .getSmartHomeDeviceStatesJson(targetDevices); for (SmartHomeDeviceHandler smartHomeDeviceHandler : smartHomeDeviceHandlers) { String id = smartHomeDeviceHandler.getId(); diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonSmartHomeDevices.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonSmartHomeDevices.java index c5f1207a71e5f..9e6bea857c6e6 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonSmartHomeDevices.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonSmartHomeDevices.java @@ -13,6 +13,7 @@ package org.openhab.binding.amazonechocontrol.internal.jsons; import java.util.Arrays; +import java.util.List; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; @@ -53,6 +54,7 @@ public boolean isGroup() { public @Nullable SmartHomeDevice @Nullable [] groupDevices; public @Nullable String connectedVia; public @Nullable DriverIdentity driverIdentity; + public List mergedApplianceIds = List.of(); @Override public String toString() { @@ -64,7 +66,7 @@ public String toString() { + Arrays.toString(capabilities) + ", tags=" + tags + ", applianceTypes=" + Arrays.toString(applianceTypes) + ", aliases=" + Arrays.toString(aliases) + ", groupDevices=" + Arrays.toString(groupDevices) + ", connectedVia='" + connectedVia + '\'' + ", driverIdentity=" - + driverIdentity + '}'; + + driverIdentity + ", mergedApplianceIds=" + mergedApplianceIds + '}'; } } diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/resources/OH-INF/thing/thing-types.xml b/bundles/org.openhab.binding.amazonechocontrol/src/main/resources/OH-INF/thing/thing-types.xml index 421a502548e0c..20601205a7a24 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/resources/OH-INF/thing/thing-types.xml +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/resources/OH-INF/thing/thing-types.xml @@ -535,4 +535,110 @@ Next timer + + + + Contact + + Glass Break Detection State + + + + Contact + + Smoke Alarm Detection State + + + + + Dimmer + + Brightness + + + + + Color + + Color + + + String + + Color Name + + + + String + + Color Temperature Name + + + Number + + Color Temperature In Kelvin + + + + Dimmer + + Percentage + + + + Switch + + Power State + + + + Dimmer + + Power Level + + + + + String + + ARM State + + + Contact + + Burglary Alarm + + + + Contact + + Carbon Monoxide Alarm + + + + Contact + + Fire Alarm + + + + Contact + + Water Alarm + + + + + Number:Temperature + + Temperature + + + + + Number:Temperature + + Target Setpoint + +