mirror of
https://github.com/openhab/openhab-addons.git
synced 2025-01-10 15:11:59 +01:00
[hdpowerview] Improvements to SDDP discovery (#16853)
* [hdpowerview] add SDDP thing discovery Signed-off-by: Andrew Fiddian-Green <software@whitebear.ch> Signed-off-by: Ciprian Pascu <contact@ciprianpascu.ro>
This commit is contained in:
parent
34107ec230
commit
7d9c2f51d1
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
<feature name="openhab-binding-hdpowerview" description="HD PowerView Binding" version="${project.version}">
|
<feature name="openhab-binding-hdpowerview" description="HD PowerView Binding" version="${project.version}">
|
||||||
<feature>openhab-runtime-base</feature>
|
<feature>openhab-runtime-base</feature>
|
||||||
|
<feature>openhab-core-config-discovery-sddp</feature>
|
||||||
<bundle start-level="80">mvn:org.openhab.addons.bundles/org.openhab.binding.hdpowerview/${project.version}</bundle>
|
<bundle start-level="80">mvn:org.openhab.addons.bundles/org.openhab.binding.hdpowerview/${project.version}</bundle>
|
||||||
</feature>
|
</feature>
|
||||||
</features>
|
</features>
|
||||||
|
@ -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<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;
|
||||||
|
}
|
||||||
|
}
|
@ -32,7 +32,7 @@
|
|||||||
<match-properties>
|
<match-properties>
|
||||||
<match-property>
|
<match-property>
|
||||||
<name>type</name>
|
<name>type</name>
|
||||||
<regex>hunterdouglas:hub:powerview.*</regex>
|
<regex>hunterdouglas.*</regex>
|
||||||
</match-property>
|
</match-property>
|
||||||
</match-properties>
|
</match-properties>
|
||||||
</discovery-method>
|
</discovery-method>
|
||||||
|
Loading…
Reference in New Issue
Block a user