From 7d9c2f51d1fc9034f026c719f94b1d25ed1fe9e4 Mon Sep 17 00:00:00 2001 From: Andrew Fiddian-Green Date: Sun, 9 Jun 2024 09:39:50 +0100 Subject: [PATCH] [hdpowerview] Improvements to SDDP discovery (#16853) * [hdpowerview] add SDDP thing discovery Signed-off-by: Andrew Fiddian-Green Signed-off-by: Ciprian Pascu --- .../src/main/feature/feature.xml | 1 + ...DPowerViewHubDiscoveryParticipantSddp.java | 107 ++++++++++++++++++ .../src/main/resources/OH-INF/addon/addon.xml | 2 +- 3 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 bundles/org.openhab.binding.hdpowerview/src/main/java/org/openhab/binding/hdpowerview/internal/discovery/HDPowerViewHubDiscoveryParticipantSddp.java diff --git a/bundles/org.openhab.binding.hdpowerview/src/main/feature/feature.xml b/bundles/org.openhab.binding.hdpowerview/src/main/feature/feature.xml index 71ed90ed0ec..bef52ebdade 100644 --- a/bundles/org.openhab.binding.hdpowerview/src/main/feature/feature.xml +++ b/bundles/org.openhab.binding.hdpowerview/src/main/feature/feature.xml @@ -4,6 +4,7 @@ openhab-runtime-base + openhab-core-config-discovery-sddp mvn:org.openhab.addons.bundles/org.openhab.binding.hdpowerview/${project.version} 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 new file mode 100644 index 00000000000..fd4e8d6a23a --- /dev/null +++ b/bundles/org.openhab.binding.hdpowerview/src/main/java/org/openhab/binding/hdpowerview/internal/discovery/HDPowerViewHubDiscoveryParticipantSddp.java @@ -0,0 +1,107 @@ +/** + * 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/resources/OH-INF/addon/addon.xml b/bundles/org.openhab.binding.hdpowerview/src/main/resources/OH-INF/addon/addon.xml index 26fa974af64..44125c0ad2d 100644 --- a/bundles/org.openhab.binding.hdpowerview/src/main/resources/OH-INF/addon/addon.xml +++ b/bundles/org.openhab.binding.hdpowerview/src/main/resources/OH-INF/addon/addon.xml @@ -32,7 +32,7 @@ type - hunterdouglas:hub:powerview.* + hunterdouglas.*