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");
}
}
+++ /dev/null
-/**
- * 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;
- }
-}
+++ /dev/null
-/**
- * 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;
- }
-}
--- /dev/null
+/**
+ * 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";
+ }
+}
--- /dev/null
+/**
+ * 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;
+ }
+}
# 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