]> git.basschouten.com Git - openhab-addons.git/commitdiff
[hdpowerview] Improve Gen 1/2 discovery label (#16865)
authorJacob Laursen <jacob-github@vindvejr.dk>
Sat, 15 Jun 2024 17:34:48 +0000 (19:34 +0200)
committerGitHub <noreply@github.com>
Sat, 15 Jun 2024 17:34:48 +0000 (19:34 +0200)
* Improve Gen 1/2 discovery label

Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>
bundles/org.openhab.binding.hdpowerview/src/main/java/org/openhab/binding/hdpowerview/internal/GatewayWebTargets.java
bundles/org.openhab.binding.hdpowerview/src/main/java/org/openhab/binding/hdpowerview/internal/discovery/HDPowerViewHubDiscoveryParticipant.java [deleted file]
bundles/org.openhab.binding.hdpowerview/src/main/java/org/openhab/binding/hdpowerview/internal/discovery/HDPowerViewHubDiscoveryParticipantSddp.java [deleted file]
bundles/org.openhab.binding.hdpowerview/src/main/java/org/openhab/binding/hdpowerview/internal/discovery/HDPowerViewHubMDNSDiscoveryParticipant.java [new file with mode: 0644]
bundles/org.openhab.binding.hdpowerview/src/main/java/org/openhab/binding/hdpowerview/internal/discovery/HDPowerViewSddpDiscoveryParticipant.java [new file with mode: 0644]
bundles/org.openhab.binding.hdpowerview/src/main/resources/OH-INF/i18n/hdpowerview.properties

index 694f4f2ab876bcfc3ebe0d5a793610ca85f7d0ab..49290e9de774412a9c4e70809cbc7eb94e852add 100644 (file)
@@ -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 (file)
index 10f00c6..0000000
+++ /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<ThingTypeUID> 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 (file)
index fd4e8d6..0000000
+++ /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<ThingTypeUID> 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 (file)
index 0000000..d458173
--- /dev/null
@@ -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<ThingTypeUID> 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 (file)
index 0000000..d0f484d
--- /dev/null
@@ -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<ThingTypeUID> 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;
+    }
+}
index 8785d2082b3fee864cb82467a00500a64ff17902..521f7a8379032960ad14326953def59dd278ac6e 100644 (file)
@@ -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