]> git.basschouten.com Git - openhab-addons.git/commitdiff
Fix online/blocked channels. (#11451)
authorjlaur <jacob-github@vindvejr.dk>
Wed, 27 Oct 2021 05:57:50 +0000 (07:57 +0200)
committerGitHub <noreply@github.com>
Wed, 27 Oct 2021 05:57:50 +0000 (07:57 +0200)
Fixes #7001

Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>
bundles/org.openhab.binding.unifi/src/main/java/org/openhab/binding/unifi/internal/api/cache/UniFiClientCache.java
bundles/org.openhab.binding.unifi/src/main/java/org/openhab/binding/unifi/internal/api/model/UniFiClient.java
bundles/org.openhab.binding.unifi/src/main/java/org/openhab/binding/unifi/internal/api/model/UniFiController.java

index e5ef67394e9fd8345f24d9ee69565d3338cd6895..63795fd0eed17d1f4e547cb88befdf2b588e7e83 100644 (file)
@@ -26,12 +26,14 @@ import org.openhab.binding.unifi.internal.api.model.UniFiClient;
 public class UniFiClientCache extends UniFiCache<UniFiClient> {
 
     public UniFiClientCache() {
-        super(PREFIX_MAC, PREFIX_IP, PREFIX_HOSTNAME, PREFIX_ALIAS);
+        super(PREFIX_ID, PREFIX_MAC, PREFIX_IP, PREFIX_HOSTNAME, PREFIX_ALIAS);
     }
 
     @Override
     protected String getSuffix(UniFiClient client, String prefix) {
         switch (prefix) {
+            case PREFIX_ID:
+                return client.getId();
             case PREFIX_MAC:
                 return client.getMac();
             case PREFIX_IP:
index be6df1b3280a3d0a6725c58b918800316ad8c993..e09c23b64aeaf02465a2f93a6985840dbf650791 100644 (file)
@@ -120,7 +120,7 @@ public abstract class UniFiClient {
     @Override
     public String toString() {
         return String.format(
-                "UniFiClient{mac: '%s', ip: '%s', hostname: '%s', alias: '%s', wired: %b, blocked: %b, device: %s}",
-                mac, ip, hostname, alias, isWired(), blocked, getDevice());
+                "UniFiClient{id: '%s', mac: '%s', ip: '%s', hostname: '%s', alias: '%s', wired: %b, blocked: %b, device: %s}",
+                id, mac, ip, hostname, alias, isWired(), blocked, getDevice());
     }
 }
index 639a07f7fd2af8e48bace0a94ac95a5c50b89d51..3a48aaf1977632d31b8805c1cd955d6d07712e87 100644 (file)
@@ -13,6 +13,8 @@
 package org.openhab.binding.unifi.internal.api.model;
 
 import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
@@ -40,12 +42,15 @@ import com.google.gson.GsonBuilder;
  *
  * @author Matthew Bowman - Initial contribution
  * @author Patrik Wimnell - Blocking / Unblocking client support
+ * @author Jacob Laursen - Fix online/blocked channels (broken by UniFi Controller 5.12.35)
  */
 @NonNullByDefault
 public class UniFiController {
 
     private final Logger logger = LoggerFactory.getLogger(UniFiController.class);
 
+    private Map<String, String> cidToIdCache = new ConcurrentHashMap<String, String>();
+
     private UniFiSiteCache sitesCache = new UniFiSiteCache();
 
     private UniFiDeviceCache devicesCache = new UniFiDeviceCache();
@@ -172,18 +177,22 @@ public class UniFiController {
 
     // Client API
 
-    public @Nullable UniFiClient getClient(@Nullable String id) {
+    public @Nullable UniFiClient getClient(@Nullable String cid) {
         UniFiClient client = null;
-        if (id != null && !id.isBlank()) {
+        if (cid != null && !cid.isBlank()) {
+            // Prefer lookups through _id, until initialized use cid.
+            String id = cidToIdCache.get(cid);
             synchronized (this) {
                 // mgb: first check active clients and fallback to insights if not found
-                client = clientsCache.get(id);
+                client = clientsCache.get(id != null ? id : cid);
                 if (client == null) {
-                    client = insightsCache.get(id);
+                    client = insightsCache.get(id != null ? id : cid);
                 }
             }
             if (client == null) {
-                logger.debug("Could not find a matching client for id = {}", id);
+                logger.debug("Could not find a matching client for cid = {}", cid);
+            } else {
+                cidToIdCache.put(cid, client.id);
             }
         }
         return client;