Skip to content

Commit

Permalink
[hdpowerview] Improve Gen 1/2 discovery label (#16865)
Browse files Browse the repository at this point in the history
* Improve Gen 1/2 discovery label

Signed-off-by: Jacob Laursen <[email protected]>
  • Loading branch information
jlaur authored Jun 15, 2024
1 parent 20868ec commit 5e15726
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ public Map<String, String> getInformation() throws HubProcessingException {
Thing.PROPERTY_FIRMWARE_VERSION, result.getFwVersion(), //
Thing.PROPERTY_SERIAL_NUMBER, result.getSerialNumber());
} catch (JsonParseException e) {
throw new HubProcessingException("getFirmwareVersions(): JsonParseException");
throw new HubProcessingException("getInformation(): JsonParseException");
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,21 @@

import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.jetty.client.HttpClient;
import org.openhab.binding.hdpowerview.internal.HDPowerViewWebTargets;
import org.openhab.binding.hdpowerview.internal.config.HDPowerViewHubConfiguration;
import org.openhab.binding.hdpowerview.internal.dto.Firmware;
import org.openhab.binding.hdpowerview.internal.dto.HubFirmware;
import org.openhab.binding.hdpowerview.internal.exceptions.HubException;
import org.openhab.core.config.discovery.DiscoveryResult;
import org.openhab.core.config.discovery.DiscoveryResultBuilder;
import org.openhab.core.config.discovery.mdns.MDNSDiscoveryParticipant;
import org.openhab.core.io.net.http.HttpClientFactory;
import org.openhab.core.thing.ThingTypeUID;
import org.openhab.core.thing.ThingUID;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -37,11 +45,17 @@
*/
@NonNullByDefault
@Component
public class HDPowerViewHubDiscoveryParticipant implements MDNSDiscoveryParticipant {
public class HDPowerViewHubMDNSDiscoveryParticipant implements MDNSDiscoveryParticipant {

private static final String LABEL_KEY = "discovery.hub.label";
public static final String LABEL_KEY_HUB = "discovery.hub.label";

private final Logger logger = LoggerFactory.getLogger(HDPowerViewHubDiscoveryParticipant.class);
private final Logger logger = LoggerFactory.getLogger(HDPowerViewHubMDNSDiscoveryParticipant.class);
private final HttpClient httpClient;

@Activate
public HDPowerViewHubMDNSDiscoveryParticipant(@Reference HttpClientFactory httpClientFactory) {
httpClient = httpClientFactory.getCommonHttpClient();
}

@Override
public Set<ThingTypeUID> getSupportedThingTypeUIDs() {
Expand All @@ -58,11 +72,12 @@ public String getServiceType() {
for (String host : service.getHostAddresses()) {
if (VALID_IP_V4_ADDRESS.matcher(host).matches()) {
ThingUID thingUID = new ThingUID(THING_TYPE_HUB, host.replace('.', '_'));
String generation = this.getGeneration(host);
DiscoveryResult hub = DiscoveryResultBuilder.create(thingUID)
.withProperty(HDPowerViewHubConfiguration.HOST, host)
.withRepresentationProperty(HDPowerViewHubConfiguration.HOST)
.withLabel(String.format("@text/%s [\"%s\"]", LABEL_KEY, host)).build();
logger.debug("mDNS discovered Gen 1/2 hub on host '{}'", host);
.withLabel(String.format("@text/%s [\"%s\", \"%s\"]", LABEL_KEY_HUB, generation, host)).build();
logger.debug("mDNS discovered Gen {} hub on host '{}'", generation, host);
return hub;
}
}
Expand All @@ -78,4 +93,18 @@ public String getServiceType() {
}
return null;
}

private String getGeneration(String host) {
var webTargets = new HDPowerViewWebTargets(httpClient, host);
try {
HubFirmware firmware = webTargets.getFirmwareVersions();
Firmware mainProcessor = firmware.mainProcessor;
if (mainProcessor != null) {
return String.valueOf(mainProcessor.revision);
}
} catch (HubException e) {
logger.debug("Failed to discover hub firmware versions", e);
}
return "1/2";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,22 +30,21 @@
import org.slf4j.LoggerFactory;

/**
* Discovers HD PowerView hubs by means of SDDP
* Discovers HD PowerView hubs/gateways by means of SDDP
*
* @author Andrew Fiddian-Green - Initial contribution
*/
@NonNullByDefault
@Component
public class HDPowerViewHubDiscoveryParticipantSddp implements SddpDiscoveryParticipant {
public class HDPowerViewSddpDiscoveryParticipant implements SddpDiscoveryParticipant {

private static final String LABEL_KEY_HUB = "discovery.hub.label";
private static final String LABEL_KEY_GATEWAY = "discovery.gateway.label";

private static final String HUNTER_DOUGLAS = "hunterdouglas:";
private static final String POWERVIEW_HUB_ID = "hub:powerview";
private static final String POWERVIEW_GEN3_ID = "powerview:gen3:gateway";

private final Logger logger = LoggerFactory.getLogger(HDPowerViewHubDiscoveryParticipantSddp.class);
private final Logger logger = LoggerFactory.getLogger(HDPowerViewSddpDiscoveryParticipant.class);

@Override
public Set<ThingTypeUID> getSupportedThingTypeUIDs() {
Expand All @@ -57,13 +56,17 @@ public Set<ThingTypeUID> getSupportedThingTypeUIDs() {
final ThingUID thingUID = getThingUID(device);
if (thingUID != null) {
try {
int generation = getGeneration(device);
String label = generation == 3 //
? String.format("@text/%s [\"%s\"]", LABEL_KEY_GATEWAY, device.ipAddress)
: String.format("@text/%s [\"%s\", \"%s\"]",
HDPowerViewHubMDNSDiscoveryParticipant.LABEL_KEY_HUB, device.ipAddress, generation);

DiscoveryResult hub = DiscoveryResultBuilder.create(thingUID)
.withProperty(HDPowerViewHubConfiguration.HOST, device.ipAddress)
.withRepresentationProperty(HDPowerViewHubConfiguration.HOST)
.withLabel(String.format("@text/%s [\"%s\"]",
isGateway(device) ? LABEL_KEY_GATEWAY : LABEL_KEY_HUB, device.ipAddress))
.build();
logger.debug("SDDP discovered hub/gateway '{}' on host '{}'", thingUID, device.ipAddress);
.withRepresentationProperty(HDPowerViewHubConfiguration.HOST).withLabel(label).build();
logger.debug("SDDP discovered Gen {} hub/gateway '{}' on host '{}'", generation, thingUID,
device.ipAddress);
return hub;
} catch (IllegalArgumentException e) {
// error already logged, so fall through
Expand All @@ -77,7 +80,7 @@ public Set<ThingTypeUID> getSupportedThingTypeUIDs() {
if (device.type.startsWith(HUNTER_DOUGLAS)) {
try {
if (VALID_IP_V4_ADDRESS.matcher(device.ipAddress).matches()) {
return new ThingUID(isGateway(device) ? THING_TYPE_GATEWAY : THING_TYPE_HUB,
return new ThingUID(getGeneration(device) == 3 ? THING_TYPE_GATEWAY : THING_TYPE_HUB,
device.ipAddress.replace('.', '_'));
}
} catch (IllegalArgumentException e) {
Expand All @@ -90,15 +93,15 @@ public Set<ThingTypeUID> getSupportedThingTypeUIDs() {
/**
* Check if the device 'type' property represents a Gen 3 gateway or a Gen 1/2 hub.
*
* @return true if a Gen 3 gateway or false if a Gen 1/2 hub.
* @return 3 if a Gen 3 gateway, 2 if Gen 2 hub or 1 if Gen 1 hub.
* @throws IllegalArgumentException if neither Gen 3, 2 or 1.
*/
private boolean isGateway(SddpDevice device) throws IllegalArgumentException {
private int getGeneration(SddpDevice device) throws IllegalArgumentException {
if (device.type.contains(POWERVIEW_GEN3_ID)) {
return true;
return 3;
}
if (device.type.contains(POWERVIEW_HUB_ID)) {
return false;
return device.type.endsWith("v2") ? 2 : 1;
}
final IllegalArgumentException e = new IllegalArgumentException("Device has unexpected 'type' property");
logger.debug("{}", e.getMessage());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ offline.gone.shade-unknown-to-hub = Shade is unknown to Hub/Gateway

# discovery

discovery.hub.label = PowerView Gen 1/2 Hub ({0})
discovery.hub.label = PowerView Gen {0} Hub ({1})
discovery.gateway.label = PowerView Gen 3 Gateway ({0})

# dynamic channels
Expand Down

0 comments on commit 5e15726

Please sign in to comment.