From f99f4b6361e32e41adfc9cf21cb6a6e876ebee27 Mon Sep 17 00:00:00 2001 From: lolodomo Date: Sun, 30 May 2021 09:37:10 +0200 Subject: [PATCH] [homeconnect] Retrieve list of programs when an appliance becomes available (#10773) Cache the list of programs for an appliance Fix #10771 Signed-off-by: Laurent Garnier --- .../internal/client/HomeConnectApiClient.java | 13 ++++++++++++- .../handler/AbstractHomeConnectThingHandler.java | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/bundles/org.openhab.binding.homeconnect/src/main/java/org/openhab/binding/homeconnect/internal/client/HomeConnectApiClient.java b/bundles/org.openhab.binding.homeconnect/src/main/java/org/openhab/binding/homeconnect/internal/client/HomeConnectApiClient.java index 8405f6685..c72a1cd0d 100644 --- a/bundles/org.openhab.binding.homeconnect/src/main/java/org/openhab/binding/homeconnect/internal/client/HomeConnectApiClient.java +++ b/bundles/org.openhab.binding.homeconnect/src/main/java/org/openhab/binding/homeconnect/internal/client/HomeConnectApiClient.java @@ -80,6 +80,7 @@ public class HomeConnectApiClient { private final HttpClient client; private final String apiUrl; private final Map> availableProgramOptionsCache; + private final Map> programsCache; private final OAuthClientService oAuthClientService; private final CircularQueue communicationQueue; private final ApiBridgeConfiguration apiBridgeConfiguration; @@ -91,6 +92,7 @@ public class HomeConnectApiClient { this.apiBridgeConfiguration = apiBridgeConfiguration; availableProgramOptionsCache = new ConcurrentHashMap<>(); + programsCache = new ConcurrentHashMap<>(); apiUrl = simulated ? API_SIMULATOR_BASE_URL : API_BASE_URL; communicationQueue = new CircularQueue<>(COMMUNICATION_QUEUE_SIZE); if (apiRequestHistory != null) { @@ -610,7 +612,16 @@ public class HomeConnectApiClient { public List getPrograms(String haId) throws CommunicationException, AuthorizationException, ApplianceOfflineException { - return getAvailablePrograms(haId, BASE_PATH + haId + "/programs"); + List programs; + if (programsCache.containsKey(haId)) { + logger.debug("Returning cached programs for '{}'.", haId); + programs = programsCache.get(haId); + programs = programs != null ? programs : Collections.emptyList(); + } else { + programs = getAvailablePrograms(haId, BASE_PATH + haId + "/programs"); + programsCache.put(haId, programs); + } + return programs; } public List getAvailablePrograms(String haId) diff --git a/bundles/org.openhab.binding.homeconnect/src/main/java/org/openhab/binding/homeconnect/internal/handler/AbstractHomeConnectThingHandler.java b/bundles/org.openhab.binding.homeconnect/src/main/java/org/openhab/binding/homeconnect/internal/handler/AbstractHomeConnectThingHandler.java index 45399feb8..344bf511e 100644 --- a/bundles/org.openhab.binding.homeconnect/src/main/java/org/openhab/binding/homeconnect/internal/handler/AbstractHomeConnectThingHandler.java +++ b/bundles/org.openhab.binding.homeconnect/src/main/java/org/openhab/binding/homeconnect/internal/handler/AbstractHomeConnectThingHandler.java @@ -248,6 +248,7 @@ public abstract class AbstractHomeConnectThingHandler extends BaseThingHandler i } else if (isThingOffline() && !KEEP_ALIVE.equals(event.getType())) { updateStatus(ONLINE); logger.debug("Set {} to ONLINE and update channels. haId={}", getThing().getLabel(), getThingHaId()); + updateSelectedProgramStateDescription(); updateChannels(); }