diff --git a/bundles/org.openhab.binding.knx/src/main/java/org/openhab/binding/knx/internal/client/AbstractKNXClient.java b/bundles/org.openhab.binding.knx/src/main/java/org/openhab/binding/knx/internal/client/AbstractKNXClient.java index 88e3386c8dd6d..ecc905fd68e05 100644 --- a/bundles/org.openhab.binding.knx/src/main/java/org/openhab/binding/knx/internal/client/AbstractKNXClient.java +++ b/bundles/org.openhab.binding.knx/src/main/java/org/openhab/binding/knx/internal/client/AbstractKNXClient.java @@ -14,6 +14,7 @@ import java.time.Duration; import java.util.Set; +import java.util.concurrent.CancellationException; import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ScheduledExecutorService; @@ -291,6 +292,8 @@ private void readNextQueuedDatapoint() { logger.trace("Sending a Group Read Request telegram for {}", datapoint.getDatapoint().getMainAddress()); processCommunicator.read(datapoint.getDatapoint()); } catch (KNXException e) { + // Note: KnxException does not cover KnxRuntimeException and subclasses KnxSecureException, + // KnxIllegArgumentException if (datapoint.getRetries() < datapoint.getLimit()) { readDatapoints.add(datapoint); logger.debug("Could not read value for datapoint {}: {}. Going to retry.", @@ -299,9 +302,15 @@ private void readNextQueuedDatapoint() { logger.warn("Giving up reading datapoint {}, the number of maximum retries ({}) is reached.", datapoint.getDatapoint().getMainAddress(), datapoint.getLimit()); } - } catch (InterruptedException e) { + } catch (InterruptedException | CancellationException e) { logger.debug("Interrupted sending KNX read request"); return; + } catch (Exception e) { + // Any other exception: Fail gracefully, i.e. notify user and continue reading next DP. + // Not catching this would end the scheduled read for all DPs in case of an error. + // Severity is warning as this is likely caused by a configuration error. + logger.warn("Error reading datapoint {}: {}", datapoint.getDatapoint().getMainAddress(), + e.getMessage()); } } }