]> git.basschouten.com Git - openhab-addons.git/blob
182772668bbc0dd2eae33ac98ec2475a886ee318
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2024 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 @NonNullByDefault
44 @Component(service = DiscoveryService.class, configurationPid = "discovery.nikohomecontrol")
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 TIMOUT_S = 5;
54     private static final int REFRESH_INTERVAL_S = 60;
55
56     public NikoHomeControlBridgeDiscoveryService() {
57         super(NikoHomeControlBindingConstants.BRIDGE_THING_TYPES_UIDS, TIMOUT_S);
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             for (String nhcController : nhcDiscover.getNhcBridgeIds()) {
74                 InetAddress addr = nhcDiscover.getAddr(nhcController);
75                 if (addr != null) {
76                     if (nhcDiscover.isNhcII(nhcController)) {
77                         addNhcIIBridge(addr, nhcController);
78                     } else {
79                         addNhcIBridge(addr, nhcController);
80                     }
81                 }
82             }
83         } catch (IOException e) {
84             logger.debug("bridge discovery IO exception");
85         }
86     }
87
88     private void addNhcIBridge(InetAddress addr, String bridgeId) {
89         logger.debug("NHC I bridge found at {}", addr);
90
91         String bridgeName = "Niko Home Control Bridge";
92         ThingUID uid = new ThingUID(BINDING_ID, "bridge", bridgeId);
93
94         DiscoveryResult discoveryResult = DiscoveryResultBuilder.create(uid).withLabel(bridgeName)
95                 .withProperty(CONFIG_HOST_NAME, addr.getHostAddress()).withRepresentationProperty(CONFIG_HOST_NAME)
96                 .build();
97         thingDiscovered(discoveryResult);
98     }
99
100     private void addNhcIIBridge(InetAddress addr, String bridgeId) {
101         logger.debug("NHC II bridge found at {}", addr);
102
103         String bridgeName = "Niko Home Control II Bridge";
104         ThingUID uid = new ThingUID(BINDING_ID, "bridge2", bridgeId);
105
106         DiscoveryResult discoveryResult = DiscoveryResultBuilder.create(uid).withLabel(bridgeName)
107                 .withProperty(CONFIG_HOST_NAME, addr.getHostAddress()).withRepresentationProperty(CONFIG_HOST_NAME)
108                 .build();
109         thingDiscovered(discoveryResult);
110     }
111
112     @Override
113     protected void startScan() {
114         discoverBridge();
115     }
116
117     @Override
118     protected synchronized void stopScan() {
119         super.stopScan();
120         removeOlderResults(getTimestampOfLastScan());
121     }
122
123     @Override
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,
129                     TimeUnit.SECONDS);
130         }
131     }
132
133     @Override
134     protected void stopBackgroundDiscovery() {
135         logger.debug("Stop bridge background discovery");
136         ScheduledFuture<?> job = nhcDiscoveryJob;
137         if (job != null && !job.isCancelled()) {
138             job.cancel(true);
139             nhcDiscoveryJob = null;
140         }
141     }
142
143     @Reference
144     protected void setNetworkAddressService(NetworkAddressService networkAddressService) {
145         this.networkAddressService = networkAddressService;
146     }
147
148     protected void unsetNetworkAddressService(NetworkAddressService networkAddressService) {
149         this.networkAddressService = null;
150     }
151 }