]> git.basschouten.com Git - openhab-addons.git/commitdiff
[homeconnect] Retrieve list of programs when an appliance becomes available (#10773)
authorlolodomo <lg.hc@free.fr>
Sun, 30 May 2021 07:37:10 +0000 (09:37 +0200)
committerGitHub <noreply@github.com>
Sun, 30 May 2021 07:37:10 +0000 (09:37 +0200)
Cache the list of programs for an appliance

Fix #10771

Signed-off-by: Laurent Garnier <lg.hc@free.fr>
bundles/org.openhab.binding.homeconnect/src/main/java/org/openhab/binding/homeconnect/internal/client/HomeConnectApiClient.java
bundles/org.openhab.binding.homeconnect/src/main/java/org/openhab/binding/homeconnect/internal/handler/AbstractHomeConnectThingHandler.java

index 8405f6685df8e147879dd7867e9e668df0c58fef..c72a1cd0d2268dc592698639aa450e4817e0eb99 100644 (file)
@@ -80,6 +80,7 @@ public class HomeConnectApiClient {
     private final HttpClient client;
     private final String apiUrl;
     private final Map<String, List<AvailableProgramOption>> availableProgramOptionsCache;
+    private final Map<String, List<AvailableProgram>> programsCache;
     private final OAuthClientService oAuthClientService;
     private final CircularQueue<ApiRequest> 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<AvailableProgram> getPrograms(String haId)
             throws CommunicationException, AuthorizationException, ApplianceOfflineException {
-        return getAvailablePrograms(haId, BASE_PATH + haId + "/programs");
+        List<AvailableProgram> 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<AvailableProgram> getAvailablePrograms(String haId)
index 45399feb811cdb7dc4b04b8b63f1b74006845caf..344bf511e3a3119ec7b80ba3369cfc15caf2f228 100644 (file)
@@ -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();
         }