]> git.basschouten.com Git - openhab-addons.git/commitdiff
[hueemulation] Fix for Alexa failing to discover all devices. (#13923)
authorMike Major <mike_j_major@hotmail.com>
Tue, 27 Dec 2022 15:58:37 +0000 (15:58 +0000)
committerGitHub <noreply@github.com>
Tue, 27 Dec 2022 15:58:37 +0000 (16:58 +0100)
* Fix for Alexa failing to discover all devices.

Signed-off-by: Mike Major <mike_j_major@hotmail.com>
bundles/org.openhab.io.hueemulation/src/main/java/org/openhab/io/hueemulation/internal/ConfigStore.java
bundles/org.openhab.io.hueemulation/src/test/java/org/openhab/io/hueemulation/internal/rest/CommonSetup.java
bundles/org.openhab.io.hueemulation/src/test/java/org/openhab/io/hueemulation/internal/rest/ItemUIDtoHueIDMappingTests.java
bundles/org.openhab.io.hueemulation/src/test/java/org/openhab/io/hueemulation/internal/upnp/UpnpTests.java

index bfd6de49f2f688f9b8516da2bdf75b1e3f4bbc87..72469d23f408d21d704d1023c8d1b1ac5e951433 100644 (file)
@@ -271,15 +271,14 @@ public class ConfigStore {
      */
     private String getHueIDPrefixFromUUID(final String uuid) {
         // Hue API example of a unique id is AA:BB:CC:DD:EE:FF:00:11-XX
-        // XX is generated from the item.
+        // 00:11-XX is generated from the item.
         String prefix = uuid;
         try {
             // Generate prefix if uuid is a randomly generated UUID
             if (UUID.fromString(uuid).version() == 4) {
-                final StringBuilder sb = new StringBuilder(23);
+                final StringBuilder sb = new StringBuilder(17);
                 sb.append(uuid, 0, 2).append(":").append(uuid, 2, 4).append(":").append(uuid, 4, 6).append(":")
-                        .append(uuid, 6, 8).append(":").append(uuid, 9, 11).append(":").append(uuid, 11, 13).append(":")
-                        .append(uuid, 14, 16).append(":").append(uuid, 16, 18);
+                        .append(uuid, 6, 8).append(":").append(uuid, 9, 11).append(":").append(uuid, 11, 13);
                 prefix = sb.toString().toUpperCase();
             }
         } catch (final IllegalArgumentException e) {
@@ -352,14 +351,20 @@ public class ConfigStore {
      * @return The unique id
      */
     public String getHueUniqueId(final String hueId) {
-        String unique = hueId;
+        String unique;
+
         try {
-            unique = String.format("%02X", Integer.valueOf(hueId));
+            final String id = String.format("%06X", Integer.valueOf(hueId));
+            final StringBuilder sb = new StringBuilder(26);
+            sb.append(hueIDPrefix).append(":").append(id, 0, 2).append(":").append(id, 2, 4).append("-").append(id, 4,
+                    6);
+            unique = sb.toString();
         } catch (final NumberFormatException | IllegalFormatException e) {
             // Use the hueId as is
+            unique = hueIDPrefix + "-" + hueId;
         }
 
-        return hueIDPrefix + "-" + unique;
+        return unique;
     }
 
     public boolean isReady() {
index 75ab4a9fb36c30e3e111e88e1669d5f7623f2a72..0a039a5a3aaf660129728213c534e328e96db571 100644 (file)
@@ -122,7 +122,7 @@ public class CommonSetup {
         } else {
             cs = new ConfigStoreWithoutMetadata(networkAddressService, configAdmin, scheduler);
         }
-        cs.activate(Collections.singletonMap("uuid", "demouuid"));
+        cs.activate(Collections.singletonMap("uuid", "a668dc9b-7172-49c3-832f-acb07dda2a20"));
         cs.switchFilter = Collections.singleton("Switchable");
         cs.whiteFilter = Collections.singleton("Switchable");
         cs.colorFilter = Collections.singleton("ColorLighting");
index baad4b1d0a4af77d56526434b7feb4e09abb90ca..3e8e0210ef14ab78f17e22f9d79f589cd06f1f06 100644 (file)
@@ -116,4 +116,36 @@ public class ItemUIDtoHueIDMappingTests {
 
         assertThat(cs.getHighestAssignedHueID(), CoreMatchers.is(1));
     }
+
+    @Test
+    public void uniqueIdForLargeHueID() {
+        ConfigStore cs = commonSetup.cs;
+        assertThat(cs.getHighestAssignedHueID(), CoreMatchers.is(1));
+
+        SwitchItem item = new SwitchItem("switch1");
+        item.setCategory("Light");
+        commonSetup.metadataRegistry.add(new Metadata(new MetadataKey(ConfigStore.METAKEY, "switch1"), "255", null));
+        itemRegistry.add(item);
+
+        String hueID = cs.mapItemUIDtoHueID(item);
+        assertThat(hueID, CoreMatchers.is("255"));
+
+        HueLightEntry device = cs.ds.lights.get(hueID);
+        assertThat(device.item, is(item));
+        assertThat(device.state, is(instanceOf(HueStatePlug.class)));
+        assertThat(device.uniqueid, CoreMatchers.is("A6:68:DC:9B:71:72:00:00-FF"));
+
+        item = new SwitchItem("switch2");
+        item.setCategory("Light");
+        commonSetup.metadataRegistry.add(new Metadata(new MetadataKey(ConfigStore.METAKEY, "switch2"), "256000", null));
+        itemRegistry.add(item);
+
+        hueID = cs.mapItemUIDtoHueID(item);
+        assertThat(hueID, CoreMatchers.is("256000"));
+
+        device = cs.ds.lights.get(hueID);
+        assertThat(device.item, is(item));
+        assertThat(device.state, is(instanceOf(HueStatePlug.class)));
+        assertThat(device.uniqueid, CoreMatchers.is("A6:68:DC:9B:71:72:03:E8-00"));
+    }
 }
index e94aacbb6b08d693ece1816ac19f635508701ab1..1ee891a09256e7388ee7c52d81cab7fd1df1e763 100644 (file)
@@ -136,7 +136,7 @@ public class UpnpTests {
             sendSocket.receive(p);
             String received = new String(buffer);
             assertThat(received, CoreMatchers.startsWith("HTTP/1.1 200 OK"));
-            assertThat(received, CoreMatchers.containsString("hue-bridgeid: DEMOUUID"));
+            assertThat(received, CoreMatchers.containsString("hue-bridgeid: A668DC9B7172"));
         }
 
         r.dispose();