2 * Copyright (c) 2010-2024 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
44 @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 TIMOUT_S = 5;
54 private static final int REFRESH_INTERVAL_S = 60;
56 public NikoHomeControlBridgeDiscoveryService() {
57 super(NikoHomeControlBindingConstants.BRIDGE_THING_TYPES_UIDS, TIMOUT_S);
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 for (String nhcController : nhcDiscover.getNhcBridgeIds()) {
74 InetAddress addr = nhcDiscover.getAddr(nhcController);
76 if (nhcDiscover.isNhcII(nhcController)) {
77 addNhcIIBridge(addr, nhcController);
79 addNhcIBridge(addr, nhcController);
83 } catch (IOException e) {
84 logger.debug("bridge discovery IO exception");
88 private void addNhcIBridge(InetAddress addr, String bridgeId) {
89 logger.debug("NHC I bridge found at {}", addr);
91 String bridgeName = "Niko Home Control Bridge";
92 ThingUID uid = new ThingUID(BINDING_ID, "bridge", bridgeId);
94 DiscoveryResult discoveryResult = DiscoveryResultBuilder.create(uid).withLabel(bridgeName)
95 .withProperty(CONFIG_HOST_NAME, addr.getHostAddress()).withRepresentationProperty(CONFIG_HOST_NAME)
97 thingDiscovered(discoveryResult);
100 private void addNhcIIBridge(InetAddress addr, String bridgeId) {
101 logger.debug("NHC II bridge found at {}", addr);
103 String bridgeName = "Niko Home Control II Bridge";
104 ThingUID uid = new ThingUID(BINDING_ID, "bridge2", bridgeId);
106 DiscoveryResult discoveryResult = DiscoveryResultBuilder.create(uid).withLabel(bridgeName)
107 .withProperty(CONFIG_HOST_NAME, addr.getHostAddress()).withRepresentationProperty(CONFIG_HOST_NAME)
109 thingDiscovered(discoveryResult);
113 protected void startScan() {
118 protected synchronized void stopScan() {
120 removeOlderResults(getTimestampOfLastScan());
124 protected void startBackgroundDiscovery() {
125 logger.debug("Start bridge background discovery");
126 ScheduledFuture<?> job = nhcDiscoveryJob;
127 if (job == null || job.isCancelled()) {
128 nhcDiscoveryJob = scheduler.scheduleWithFixedDelay(this::discoverBridge, 0, REFRESH_INTERVAL_S,
134 protected void stopBackgroundDiscovery() {
135 logger.debug("Stop bridge background discovery");
136 ScheduledFuture<?> job = nhcDiscoveryJob;
137 if (job != null && !job.isCancelled()) {
139 nhcDiscoveryJob = null;
144 protected void setNetworkAddressService(NetworkAddressService networkAddressService) {
145 this.networkAddressService = networkAddressService;
148 protected void unsetNetworkAddressService(NetworkAddressService networkAddressService) {
149 this.networkAddressService = null;