2 * Copyright (c) 2010-2022 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.nikohomecontrol.internal.discovery;
15 import static org.openhab.binding.nikohomecontrol.internal.NikoHomeControlBindingConstants.*;
17 import java.io.IOException;
18 import java.net.InetAddress;
19 import java.util.concurrent.ScheduledFuture;
20 import java.util.concurrent.TimeUnit;
22 import org.eclipse.jdt.annotation.NonNullByDefault;
23 import org.eclipse.jdt.annotation.Nullable;
24 import org.openhab.binding.nikohomecontrol.internal.NikoHomeControlBindingConstants;
25 import org.openhab.binding.nikohomecontrol.internal.protocol.NikoHomeControlDiscover;
26 import org.openhab.core.config.discovery.AbstractDiscoveryService;
27 import org.openhab.core.config.discovery.DiscoveryResult;
28 import org.openhab.core.config.discovery.DiscoveryResultBuilder;
29 import org.openhab.core.config.discovery.DiscoveryService;
30 import org.openhab.core.net.NetworkAddressService;
31 import org.openhab.core.thing.ThingUID;
32 import org.osgi.service.component.annotations.Component;
33 import org.osgi.service.component.annotations.Reference;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
38 * {@link NikoHomeControlBridgeDiscoveryService} is used to discover a Niko Home Control IP-interface in the local
41 * @author Mark Herwege - Initial Contribution
43 @Component(service = DiscoveryService.class, configurationPid = "discovery.nikohomecontrol")
45 public class NikoHomeControlBridgeDiscoveryService extends AbstractDiscoveryService {
47 private final Logger logger = LoggerFactory.getLogger(NikoHomeControlBridgeDiscoveryService.class);
49 private volatile @Nullable ScheduledFuture<?> nhcDiscoveryJob;
51 private @NonNullByDefault({}) NetworkAddressService networkAddressService;
53 private static final int TIMEOUT = 5;
54 private static final int REFRESH_INTERVAL = 60;
56 public NikoHomeControlBridgeDiscoveryService() {
57 super(NikoHomeControlBindingConstants.BRIDGE_THING_TYPES_UIDS, TIMEOUT);
58 logger.debug("bridge discovery service started");
62 * Discovers devices connected to a Niko Home Control controller
64 private void discoverBridge() {
66 String broadcastAddr = networkAddressService.getConfiguredBroadcastAddress();
67 if (broadcastAddr == null) {
68 logger.warn("discovery not possible, no broadcast address found");
71 logger.debug("discovery broadcast on {}", broadcastAddr);
72 NikoHomeControlDiscover nhcDiscover = new NikoHomeControlDiscover(broadcastAddr);
73 if (nhcDiscover.isNhcII()) {
74 addNhcIIBridge(nhcDiscover.getAddr(), nhcDiscover.getNhcBridgeId());
76 addNhcIBridge(nhcDiscover.getAddr(), nhcDiscover.getNhcBridgeId());
78 } catch (IOException e) {
79 logger.debug("no bridge found.");
83 private void addNhcIBridge(InetAddress addr, String bridgeId) {
84 logger.debug("NHC I bridge found at {}", addr);
86 String bridgeName = "Niko Home Control Bridge";
87 ThingUID uid = new ThingUID(BINDING_ID, "bridge", bridgeId);
89 DiscoveryResult discoveryResult = DiscoveryResultBuilder.create(uid).withLabel(bridgeName)
90 .withProperty(CONFIG_HOST_NAME, addr.getHostAddress()).build();
91 thingDiscovered(discoveryResult);
94 private void addNhcIIBridge(InetAddress addr, String bridgeId) {
95 logger.debug("NHC II bridge found at {}", addr);
97 String bridgeName = "Niko Home Control II Bridge";
98 ThingUID uid = new ThingUID(BINDING_ID, "bridge2", bridgeId);
100 DiscoveryResult discoveryResult = DiscoveryResultBuilder.create(uid).withLabel(bridgeName)
101 .withProperty(CONFIG_HOST_NAME, addr.getHostAddress()).build();
102 thingDiscovered(discoveryResult);
106 protected void startScan() {
111 protected synchronized void stopScan() {
113 removeOlderResults(getTimestampOfLastScan());
117 protected void startBackgroundDiscovery() {
118 logger.debug("Start background bridge discovery");
119 ScheduledFuture<?> job = nhcDiscoveryJob;
120 if (job == null || job.isCancelled()) {
121 nhcDiscoveryJob = scheduler.scheduleWithFixedDelay(this::discoverBridge, 0, REFRESH_INTERVAL,
127 protected void stopBackgroundDiscovery() {
128 logger.debug("Stop bridge background discovery");
129 ScheduledFuture<?> job = nhcDiscoveryJob;
130 if (job != null && !job.isCancelled()) {
132 nhcDiscoveryJob = null;
137 protected void setNetworkAddressService(NetworkAddressService networkAddressService) {
138 this.networkAddressService = networkAddressService;
141 protected void unsetNetworkAddressService(NetworkAddressService networkAddressService) {
142 this.networkAddressService = null;