Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[hueemulation] Fix for Alexa failing to discover all devices. #13923

Merged
merged 2 commits into from Dec 27, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -271,15 +271,14 @@ private String getConfiguredHostAddress(InetAddress configuredAddress) {
*/
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) {
Expand Down Expand Up @@ -352,14 +351,20 @@ public String mapItemUIDtoHueID(Item item) {
* @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() {
Expand Down
Expand Up @@ -122,7 +122,7 @@ public CommonSetup(boolean withMetadata) throws IOException {
} 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");
Expand Down
Expand Up @@ -116,4 +116,36 @@ public void mapItemWithHueID() {

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"));
}
}
Expand Up @@ -136,7 +136,7 @@ public void descriptionWithAddress()
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();
Expand Down