]> git.basschouten.com Git - openhab-addons.git/blob
ffe67643dbbaefe967d3fef5b83f609c51969f02
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2021 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
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
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.nikohomecontrol.internal.discovery;
14
15 import static org.openhab.binding.nikohomecontrol.internal.NikoHomeControlBindingConstants.*;
16
17 import java.io.IOException;
18 import java.net.InetAddress;
19 import java.util.concurrent.ScheduledFuture;
20 import java.util.concurrent.TimeUnit;
21
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;
36
37 /**
38  * {@link NikoHomeControlBridgeDiscoveryService} is used to discover a Niko Home Control IP-interface in the local
39  * network.
40  *
41  * @author Mark Herwege - Initial Contribution
42  */
43 @Component(service = DiscoveryService.class, configurationPid = "discovery.nikohomecontrol")
44 @NonNullByDefault
45 public class NikoHomeControlBridgeDiscoveryService extends AbstractDiscoveryService {
46
47     private final Logger logger = LoggerFactory.getLogger(NikoHomeControlBridgeDiscoveryService.class);
48
49     private volatile @Nullable ScheduledFuture<?> nhcDiscoveryJob;
50
51     private @NonNullByDefault({}) NetworkAddressService networkAddressService;
52
53     private static final int TIMEOUT = 5;
54     private static final int REFRESH_INTERVAL = 60;
55
56     public NikoHomeControlBridgeDiscoveryService() {
57         super(NikoHomeControlBindingConstants.BRIDGE_THING_TYPES_UIDS, TIMEOUT);
58         logger.debug("bridge discovery service started");
59     }
60
61     /**
62      * Discovers devices connected to a Niko Home Control controller
63      */
64     private void discoverBridge() {
65         try {
66             String broadcastAddr = networkAddressService.getConfiguredBroadcastAddress();
67             if (broadcastAddr == null) {
68                 logger.warn("discovery not possible, no broadcast address found");
69                 return;
70             }
71             logger.debug("discovery broadcast on {}", broadcastAddr);
72             NikoHomeControlDiscover nhcDiscover = new NikoHomeControlDiscover(broadcastAddr);
73             if (nhcDiscover.isNhcII()) {
74                 addNhcIIBridge(nhcDiscover.getAddr(), nhcDiscover.getNhcBridgeId());
75             } else {
76                 addNhcIBridge(nhcDiscover.getAddr(), nhcDiscover.getNhcBridgeId());
77             }
78         } catch (IOException e) {
79             logger.debug("no bridge found.");
80         }
81     }
82
83     private void addNhcIBridge(InetAddress addr, String bridgeId) {
84         logger.debug("NHC I bridge found at {}", addr);
85
86         String bridgeName = "Niko Home Control Bridge";
87         ThingUID uid = new ThingUID(BINDING_ID, "bridge", bridgeId);
88
89         DiscoveryResult discoveryResult = DiscoveryResultBuilder.create(uid).withLabel(bridgeName)
90                 .withProperty(CONFIG_HOST_NAME, addr.getHostAddress()).build();
91         thingDiscovered(discoveryResult);
92     }
93
94     private void addNhcIIBridge(InetAddress addr, String bridgeId) {
95         logger.debug("NHC II bridge found at {}", addr);
96
97         String bridgeName = "Niko Home Control II Bridge";
98         ThingUID uid = new ThingUID(BINDING_ID, "bridge2", bridgeId);
99
100         DiscoveryResult discoveryResult = DiscoveryResultBuilder.create(uid).withLabel(bridgeName)
101                 .withProperty(CONFIG_HOST_NAME, addr.getHostAddress()).build();
102         thingDiscovered(discoveryResult);
103     }
104
105     @Override
106     protected void startScan() {
107         discoverBridge();
108     }
109
110     @Override
111     protected synchronized void stopScan() {
112         super.stopScan();
113         removeOlderResults(getTimestampOfLastScan());
114     }
115
116     @Override
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,
122                     TimeUnit.SECONDS);
123         }
124     }
125
126     @Override
127     protected void stopBackgroundDiscovery() {
128         logger.debug("Stop bridge background discovery");
129         ScheduledFuture<?> job = nhcDiscoveryJob;
130         if (job != null && !job.isCancelled()) {
131             job.cancel(true);
132             nhcDiscoveryJob = null;
133         }
134     }
135
136     @Reference
137     protected void setNetworkAddressService(NetworkAddressService networkAddressService) {
138         this.networkAddressService = networkAddressService;
139     }
140
141     protected void unsetNetworkAddressService(NetworkAddressService networkAddressService) {
142         this.networkAddressService = null;
143     }
144 }