[hueemulation] Fix for Alexa failing to discover all devices. (#13923)
* Fix for Alexa failing to discover all devices. Signed-off-by: Mike Major <mike_j_major@hotmail.com>
This commit is contained in:
parent
436e7c39ba
commit
a4a8d5d85f
@ -271,15 +271,14 @@ public class ConfigStore {
|
|||||||
*/
|
*/
|
||||||
private String getHueIDPrefixFromUUID(final String uuid) {
|
private String getHueIDPrefixFromUUID(final String uuid) {
|
||||||
// Hue API example of a unique id is AA:BB:CC:DD:EE:FF:00:11-XX
|
// 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;
|
String prefix = uuid;
|
||||||
try {
|
try {
|
||||||
// Generate prefix if uuid is a randomly generated UUID
|
// Generate prefix if uuid is a randomly generated UUID
|
||||||
if (UUID.fromString(uuid).version() == 4) {
|
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(":")
|
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, 6, 8).append(":").append(uuid, 9, 11).append(":").append(uuid, 11, 13);
|
||||||
.append(uuid, 14, 16).append(":").append(uuid, 16, 18);
|
|
||||||
prefix = sb.toString().toUpperCase();
|
prefix = sb.toString().toUpperCase();
|
||||||
}
|
}
|
||||||
} catch (final IllegalArgumentException e) {
|
} catch (final IllegalArgumentException e) {
|
||||||
@ -352,14 +351,20 @@ public class ConfigStore {
|
|||||||
* @return The unique id
|
* @return The unique id
|
||||||
*/
|
*/
|
||||||
public String getHueUniqueId(final String hueId) {
|
public String getHueUniqueId(final String hueId) {
|
||||||
String unique = hueId;
|
String unique;
|
||||||
|
|
||||||
try {
|
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) {
|
} catch (final NumberFormatException | IllegalFormatException e) {
|
||||||
// Use the hueId as is
|
// Use the hueId as is
|
||||||
|
unique = hueIDPrefix + "-" + hueId;
|
||||||
}
|
}
|
||||||
|
|
||||||
return hueIDPrefix + "-" + unique;
|
return unique;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isReady() {
|
public boolean isReady() {
|
||||||
|
|||||||
@ -122,7 +122,7 @@ public class CommonSetup {
|
|||||||
} else {
|
} else {
|
||||||
cs = new ConfigStoreWithoutMetadata(networkAddressService, configAdmin, scheduler);
|
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.switchFilter = Collections.singleton("Switchable");
|
||||||
cs.whiteFilter = Collections.singleton("Switchable");
|
cs.whiteFilter = Collections.singleton("Switchable");
|
||||||
cs.colorFilter = Collections.singleton("ColorLighting");
|
cs.colorFilter = Collections.singleton("ColorLighting");
|
||||||
|
|||||||
@ -116,4 +116,36 @@ public class ItemUIDtoHueIDMappingTests {
|
|||||||
|
|
||||||
assertThat(cs.getHighestAssignedHueID(), CoreMatchers.is(1));
|
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"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -136,7 +136,7 @@ public class UpnpTests {
|
|||||||
sendSocket.receive(p);
|
sendSocket.receive(p);
|
||||||
String received = new String(buffer);
|
String received = new String(buffer);
|
||||||
assertThat(received, CoreMatchers.startsWith("HTTP/1.1 200 OK"));
|
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();
|
r.dispose();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user