From 6000bc75fb57fd12752ffd1fd180ed6803eb12e5 Mon Sep 17 00:00:00 2001 From: jimtng <2554958+jimtng@users.noreply.github.com> Date: Sun, 20 Feb 2022 06:50:12 +1000 Subject: [PATCH] [daikin] Add the ability to disable background discovery (#12300) Signed-off-by: Jimmy Tanagra --- bundles/org.openhab.binding.daikin/README.md | 8 ++++ .../DaikinACUnitDiscoveryService.java | 46 +++++++++---------- 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/bundles/org.openhab.binding.daikin/README.md b/bundles/org.openhab.binding.daikin/README.md index ff9d1f2e6..f2ded25e3 100644 --- a/bundles/org.openhab.binding.daikin/README.md +++ b/bundles/org.openhab.binding.daikin/README.md @@ -13,6 +13,14 @@ This may work with the older KRP series of wired adapters, but has not been test This add-on will broadcast messages on your local network looking for Daikin air conditioning units and adding them to the queue of new items discovered. You can also manually add a new item if you know the IP address. +Background discovery polls the network every minute for devices. +Background discovery is **enabled** by default. +To **disable** background discovery, add the following line to the *conf/services/runtime.cfg* file: + +```text +discovery.daikin:background=false +``` + ### BRP072C42 adapter discovery A BRP072C42 adapter requires a registered UUID to authenticate. Upon discovery, a UUID will be generated but the adapter's key must be entered in the Thing configuration to complete the UUID registration. diff --git a/bundles/org.openhab.binding.daikin/src/main/java/org/openhab/binding/daikin/internal/discovery/DaikinACUnitDiscoveryService.java b/bundles/org.openhab.binding.daikin/src/main/java/org/openhab/binding/daikin/internal/discovery/DaikinACUnitDiscoveryService.java index eb2f89ce2..7a58fdb48 100644 --- a/bundles/org.openhab.binding.daikin/src/main/java/org/openhab/binding/daikin/internal/discovery/DaikinACUnitDiscoveryService.java +++ b/bundles/org.openhab.binding.daikin/src/main/java/org/openhab/binding/daikin/internal/discovery/DaikinACUnitDiscoveryService.java @@ -53,7 +53,7 @@ import org.slf4j.LoggerFactory; * @author Paul Smedley - Modifications to support Airbase Controllers * */ -@Component(service = DiscoveryService.class) +@Component(service = DiscoveryService.class, configurationPid = "discovery.daikin") @NonNullByDefault public class DaikinACUnitDiscoveryService extends AbstractDiscoveryService { private static final String UDP_PACKET_CONTENTS = "DAIKIN_UDP/common/basic_info"; @@ -62,17 +62,15 @@ public class DaikinACUnitDiscoveryService extends AbstractDiscoveryService { private Logger logger = LoggerFactory.getLogger(DaikinACUnitDiscoveryService.class); private @Nullable HttpClient httpClient; - private final Runnable scanner; private @Nullable ScheduledFuture backgroundFuture; public DaikinACUnitDiscoveryService() { super(Collections.singleton(DaikinBindingConstants.THING_TYPE_AC_UNIT), 600, true); - scanner = createScanner(); } @Override protected void startScan() { - scheduler.execute(scanner); + scheduler.execute(this::scanner); } @Override @@ -83,7 +81,7 @@ public class DaikinACUnitDiscoveryService extends AbstractDiscoveryService { backgroundFuture.cancel(true); backgroundFuture = null; } - backgroundFuture = scheduler.scheduleWithFixedDelay(scanner, 0, 60, TimeUnit.SECONDS); + backgroundFuture = scheduler.scheduleWithFixedDelay(this::scanner, 0, 60, TimeUnit.SECONDS); } @Override @@ -96,32 +94,30 @@ public class DaikinACUnitDiscoveryService extends AbstractDiscoveryService { super.stopBackgroundDiscovery(); } - private Runnable createScanner() { - return () -> { - long timestampOfLastScan = getTimestampOfLastScan(); - for (InetAddress broadcastAddress : getBroadcastAddresses()) { - logger.trace("Starting broadcast for {}", broadcastAddress.toString()); + private void scanner() { + long timestampOfLastScan = getTimestampOfLastScan(); + for (InetAddress broadcastAddress : getBroadcastAddresses()) { + logger.trace("Starting broadcast for {}", broadcastAddress.toString()); - try (DatagramSocket socket = new DatagramSocket()) { - socket.setBroadcast(true); - socket.setReuseAddress(true); - byte[] packetContents = UDP_PACKET_CONTENTS.getBytes(StandardCharsets.UTF_8); - DatagramPacket packet = new DatagramPacket(packetContents, packetContents.length, broadcastAddress, - REMOTE_UDP_PORT); + try (DatagramSocket socket = new DatagramSocket()) { + socket.setBroadcast(true); + socket.setReuseAddress(true); + byte[] packetContents = UDP_PACKET_CONTENTS.getBytes(StandardCharsets.UTF_8); + DatagramPacket packet = new DatagramPacket(packetContents, packetContents.length, broadcastAddress, + REMOTE_UDP_PORT); - // Send before listening in case the port isn't bound until here. - socket.send(packet); + // Send before listening in case the port isn't bound until here. + socket.send(packet); - // receivePacketAndDiscover will return false if no packet is received after 1 second - while (receivePacketAndDiscover(socket)) { - } - } catch (Exception e) { - // Nothing to do here - the host couldn't be found, likely because it doesn't exist + // receivePacketAndDiscover will return false if no packet is received after 1 second + while (receivePacketAndDiscover(socket)) { } + } catch (Exception e) { + // Nothing to do here - the host couldn't be found, likely because it doesn't exist } + } - removeOlderResults(timestampOfLastScan); - }; + removeOlderResults(timestampOfLastScan); } private boolean receivePacketAndDiscover(DatagramSocket socket) {