From: Jacob Laursen Date: Sat, 15 Jun 2024 17:34:48 +0000 (+0200) Subject: [hdpowerview] Improve Gen 1/2 discovery label (#16865) X-Git-Url: https://git.basschouten.com/?a=commitdiff_plain;h=5e157262c5227afa70f166279502a8fcbf28369d;p=openhab-addons.git [hdpowerview] Improve Gen 1/2 discovery label (#16865) * Improve Gen 1/2 discovery label Signed-off-by: Jacob Laursen --- diff --git a/bundles/org.openhab.binding.hdpowerview/src/main/java/org/openhab/binding/hdpowerview/internal/GatewayWebTargets.java b/bundles/org.openhab.binding.hdpowerview/src/main/java/org/openhab/binding/hdpowerview/internal/GatewayWebTargets.java index 694f4f2ab8..49290e9de7 100644 --- a/bundles/org.openhab.binding.hdpowerview/src/main/java/org/openhab/binding/hdpowerview/internal/GatewayWebTargets.java +++ b/bundles/org.openhab.binding.hdpowerview/src/main/java/org/openhab/binding/hdpowerview/internal/GatewayWebTargets.java @@ -173,7 +173,7 @@ public class GatewayWebTargets implements Closeable, HostnameVerifier { 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"); } } diff --git a/bundles/org.openhab.binding.hdpowerview/src/main/java/org/openhab/binding/hdpowerview/internal/discovery/HDPowerViewHubDiscoveryParticipant.java b/bundles/org.openhab.binding.hdpowerview/src/main/java/org/openhab/binding/hdpowerview/internal/discovery/HDPowerViewHubDiscoveryParticipant.java deleted file mode 100644 index 10f00c69d3..0000000000 --- a/bundles/org.openhab.binding.hdpowerview/src/main/java/org/openhab/binding/hdpowerview/internal/discovery/HDPowerViewHubDiscoveryParticipant.java +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Copyright (c) 2010-2024 Contributors to the openHAB project - * - * See the NOTICE file(s) distributed with this work for additional - * information. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0 - * - * SPDX-License-Identifier: EPL-2.0 - */ -package org.openhab.binding.hdpowerview.internal.discovery; - -import static org.openhab.binding.hdpowerview.internal.HDPowerViewBindingConstants.*; - -import java.util.Set; - -import javax.jmdns.ServiceInfo; - -import org.eclipse.jdt.annotation.NonNullByDefault; -import org.eclipse.jdt.annotation.Nullable; -import org.openhab.binding.hdpowerview.internal.config.HDPowerViewHubConfiguration; -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.thing.ThingTypeUID; -import org.openhab.core.thing.ThingUID; -import org.osgi.service.component.annotations.Component; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Discovers HD PowerView hubs by means of mDNS - * - * @author Andrew Fiddian-Green - Initial contribution - */ -@NonNullByDefault -@Component -public class HDPowerViewHubDiscoveryParticipant implements MDNSDiscoveryParticipant { - - private static final String LABEL_KEY = "discovery.hub.label"; - - private final Logger logger = LoggerFactory.getLogger(HDPowerViewHubDiscoveryParticipant.class); - - @Override - public Set getSupportedThingTypeUIDs() { - return Set.of(THING_TYPE_HUB); - } - - @Override - public String getServiceType() { - return "_powerview._tcp.local."; - } - - @Override - public @Nullable DiscoveryResult createResult(ServiceInfo service) { - for (String host : service.getHostAddresses()) { - if (VALID_IP_V4_ADDRESS.matcher(host).matches()) { - ThingUID thingUID = new ThingUID(THING_TYPE_HUB, host.replace('.', '_')); - 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); - return hub; - } - } - return null; - } - - @Override - public @Nullable ThingUID getThingUID(ServiceInfo service) { - for (String host : service.getHostAddresses()) { - if (VALID_IP_V4_ADDRESS.matcher(host).matches()) { - return new ThingUID(THING_TYPE_HUB, host.replace('.', '_')); - } - } - return null; - } -} diff --git a/bundles/org.openhab.binding.hdpowerview/src/main/java/org/openhab/binding/hdpowerview/internal/discovery/HDPowerViewHubDiscoveryParticipantSddp.java b/bundles/org.openhab.binding.hdpowerview/src/main/java/org/openhab/binding/hdpowerview/internal/discovery/HDPowerViewHubDiscoveryParticipantSddp.java deleted file mode 100644 index fd4e8d6a23..0000000000 --- a/bundles/org.openhab.binding.hdpowerview/src/main/java/org/openhab/binding/hdpowerview/internal/discovery/HDPowerViewHubDiscoveryParticipantSddp.java +++ /dev/null @@ -1,107 +0,0 @@ -/** - * Copyright (c) 2010-2024 Contributors to the openHAB project - * - * See the NOTICE file(s) distributed with this work for additional - * information. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0 - * - * SPDX-License-Identifier: EPL-2.0 - */ -package org.openhab.binding.hdpowerview.internal.discovery; - -import static org.openhab.binding.hdpowerview.internal.HDPowerViewBindingConstants.*; - -import java.util.Set; - -import org.eclipse.jdt.annotation.NonNullByDefault; -import org.eclipse.jdt.annotation.Nullable; -import org.openhab.binding.hdpowerview.internal.config.HDPowerViewHubConfiguration; -import org.openhab.core.config.discovery.DiscoveryResult; -import org.openhab.core.config.discovery.DiscoveryResultBuilder; -import org.openhab.core.config.discovery.sddp.SddpDevice; -import org.openhab.core.config.discovery.sddp.SddpDiscoveryParticipant; -import org.openhab.core.thing.ThingTypeUID; -import org.openhab.core.thing.ThingUID; -import org.osgi.service.component.annotations.Component; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Discovers HD PowerView hubs by means of SDDP - * - * @author Andrew Fiddian-Green - Initial contribution - */ -@NonNullByDefault -@Component -public class HDPowerViewHubDiscoveryParticipantSddp 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); - - @Override - public Set getSupportedThingTypeUIDs() { - return Set.of(THING_TYPE_HUB, THING_TYPE_GATEWAY); - } - - @Override - public @Nullable DiscoveryResult createResult(SddpDevice device) { - final ThingUID thingUID = getThingUID(device); - if (thingUID != null) { - try { - 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); - return hub; - } catch (IllegalArgumentException e) { - // error already logged, so fall through - } - } - return null; - } - - @Override - public @Nullable ThingUID getThingUID(SddpDevice device) { - 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, - device.ipAddress.replace('.', '_')); - } - } catch (IllegalArgumentException e) { - // error already logged, so fall through - } - } - return null; - } - - /** - * 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. - * @throws IllegalArgumentException if neither Gen 3, 2 or 1. - */ - private boolean isGateway(SddpDevice device) throws IllegalArgumentException { - if (device.type.contains(POWERVIEW_GEN3_ID)) { - return true; - } - if (device.type.contains(POWERVIEW_HUB_ID)) { - return false; - } - final IllegalArgumentException e = new IllegalArgumentException("Device has unexpected 'type' property"); - logger.debug("{}", e.getMessage()); - throw e; - } -} diff --git a/bundles/org.openhab.binding.hdpowerview/src/main/java/org/openhab/binding/hdpowerview/internal/discovery/HDPowerViewHubMDNSDiscoveryParticipant.java b/bundles/org.openhab.binding.hdpowerview/src/main/java/org/openhab/binding/hdpowerview/internal/discovery/HDPowerViewHubMDNSDiscoveryParticipant.java new file mode 100644 index 0000000000..d458173957 --- /dev/null +++ b/bundles/org.openhab.binding.hdpowerview/src/main/java/org/openhab/binding/hdpowerview/internal/discovery/HDPowerViewHubMDNSDiscoveryParticipant.java @@ -0,0 +1,110 @@ +/** + * Copyright (c) 2010-2024 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.hdpowerview.internal.discovery; + +import static org.openhab.binding.hdpowerview.internal.HDPowerViewBindingConstants.*; + +import java.util.Set; + +import javax.jmdns.ServiceInfo; + +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; + +/** + * Discovers HD PowerView hubs by means of mDNS + * + * @author Andrew Fiddian-Green - Initial contribution + */ +@NonNullByDefault +@Component +public class HDPowerViewHubMDNSDiscoveryParticipant implements MDNSDiscoveryParticipant { + + public static final String LABEL_KEY_HUB = "discovery.hub.label"; + + private final Logger logger = LoggerFactory.getLogger(HDPowerViewHubMDNSDiscoveryParticipant.class); + private final HttpClient httpClient; + + @Activate + public HDPowerViewHubMDNSDiscoveryParticipant(@Reference HttpClientFactory httpClientFactory) { + httpClient = httpClientFactory.getCommonHttpClient(); + } + + @Override + public Set getSupportedThingTypeUIDs() { + return Set.of(THING_TYPE_HUB); + } + + @Override + public String getServiceType() { + return "_powerview._tcp.local."; + } + + @Override + public @Nullable DiscoveryResult createResult(ServiceInfo service) { + 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\", \"%s\"]", LABEL_KEY_HUB, generation, host)).build(); + logger.debug("mDNS discovered Gen {} hub on host '{}'", generation, host); + return hub; + } + } + return null; + } + + @Override + public @Nullable ThingUID getThingUID(ServiceInfo service) { + for (String host : service.getHostAddresses()) { + if (VALID_IP_V4_ADDRESS.matcher(host).matches()) { + return new ThingUID(THING_TYPE_HUB, host.replace('.', '_')); + } + } + 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"; + } +} diff --git a/bundles/org.openhab.binding.hdpowerview/src/main/java/org/openhab/binding/hdpowerview/internal/discovery/HDPowerViewSddpDiscoveryParticipant.java b/bundles/org.openhab.binding.hdpowerview/src/main/java/org/openhab/binding/hdpowerview/internal/discovery/HDPowerViewSddpDiscoveryParticipant.java new file mode 100644 index 0000000000..d0f484d41c --- /dev/null +++ b/bundles/org.openhab.binding.hdpowerview/src/main/java/org/openhab/binding/hdpowerview/internal/discovery/HDPowerViewSddpDiscoveryParticipant.java @@ -0,0 +1,110 @@ +/** + * Copyright (c) 2010-2024 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.hdpowerview.internal.discovery; + +import static org.openhab.binding.hdpowerview.internal.HDPowerViewBindingConstants.*; + +import java.util.Set; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.openhab.binding.hdpowerview.internal.config.HDPowerViewHubConfiguration; +import org.openhab.core.config.discovery.DiscoveryResult; +import org.openhab.core.config.discovery.DiscoveryResultBuilder; +import org.openhab.core.config.discovery.sddp.SddpDevice; +import org.openhab.core.config.discovery.sddp.SddpDiscoveryParticipant; +import org.openhab.core.thing.ThingTypeUID; +import org.openhab.core.thing.ThingUID; +import org.osgi.service.component.annotations.Component; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Discovers HD PowerView hubs/gateways by means of SDDP + * + * @author Andrew Fiddian-Green - Initial contribution + */ +@NonNullByDefault +@Component +public class HDPowerViewSddpDiscoveryParticipant implements SddpDiscoveryParticipant { + + 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(HDPowerViewSddpDiscoveryParticipant.class); + + @Override + public Set getSupportedThingTypeUIDs() { + return Set.of(THING_TYPE_HUB, THING_TYPE_GATEWAY); + } + + @Override + public @Nullable DiscoveryResult createResult(SddpDevice device) { + 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(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 + } + } + return null; + } + + @Override + public @Nullable ThingUID getThingUID(SddpDevice device) { + if (device.type.startsWith(HUNTER_DOUGLAS)) { + try { + if (VALID_IP_V4_ADDRESS.matcher(device.ipAddress).matches()) { + return new ThingUID(getGeneration(device) == 3 ? THING_TYPE_GATEWAY : THING_TYPE_HUB, + device.ipAddress.replace('.', '_')); + } + } catch (IllegalArgumentException e) { + // error already logged, so fall through + } + } + return null; + } + + /** + * Check if the device 'type' property represents a Gen 3 gateway or 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 int getGeneration(SddpDevice device) throws IllegalArgumentException { + if (device.type.contains(POWERVIEW_GEN3_ID)) { + return 3; + } + if (device.type.contains(POWERVIEW_HUB_ID)) { + return device.type.endsWith("v2") ? 2 : 1; + } + final IllegalArgumentException e = new IllegalArgumentException("Device has unexpected 'type' property"); + logger.debug("{}", e.getMessage()); + throw e; + } +} diff --git a/bundles/org.openhab.binding.hdpowerview/src/main/resources/OH-INF/i18n/hdpowerview.properties b/bundles/org.openhab.binding.hdpowerview/src/main/resources/OH-INF/i18n/hdpowerview.properties index 8785d2082b..521f7a8379 100644 --- a/bundles/org.openhab.binding.hdpowerview/src/main/resources/OH-INF/i18n/hdpowerview.properties +++ b/bundles/org.openhab.binding.hdpowerview/src/main/resources/OH-INF/i18n/hdpowerview.properties @@ -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