From 405abf4620410115c798840acc3aec015bd799f4 Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Thu, 30 Dec 2021 11:58:22 +0100 Subject: [PATCH] Fix inability to recover from network issues on initialization. (#11891) Fixes #11304 Signed-off-by: Jacob Laursen --- .../handler/DanfossAirUnitHandler.java | 52 ++++++++++++++----- 1 file changed, 38 insertions(+), 14 deletions(-) diff --git a/bundles/org.openhab.binding.danfossairunit/src/main/java/org/openhab/binding/danfossairunit/internal/handler/DanfossAirUnitHandler.java b/bundles/org.openhab.binding.danfossairunit/src/main/java/org/openhab/binding/danfossairunit/internal/handler/DanfossAirUnitHandler.java index f94e7932dcba3..a762524dd5479 100644 --- a/bundles/org.openhab.binding.danfossairunit/src/main/java/org/openhab/binding/danfossairunit/internal/handler/DanfossAirUnitHandler.java +++ b/bundles/org.openhab.binding.danfossairunit/src/main/java/org/openhab/binding/danfossairunit/internal/handler/DanfossAirUnitHandler.java @@ -17,6 +17,8 @@ import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; @@ -62,6 +64,7 @@ public class DanfossAirUnitHandler extends BaseThingHandler { private @Nullable ScheduledFuture pollingJob; private @Nullable DanfossAirUnitCommunicationController communicationController; private @Nullable DanfossAirUnit airUnit; + private boolean propertiesInitializedSuccessfully = false; public DanfossAirUnitHandler(Thing thing) { super(thing); @@ -103,18 +106,8 @@ public void initialize() { var localCommunicationController = new DanfossAirUnitCommunicationController( InetAddress.getByName(config.host), TCP_PORT); this.communicationController = localCommunicationController; - var localAirUnit = new DanfossAirUnit(localCommunicationController); - this.airUnit = localAirUnit; - scheduler.execute(() -> { - try { - thing.setProperty(PROPERTY_UNIT_NAME, localAirUnit.getUnitName()); - thing.setProperty(PROPERTY_SERIAL, localAirUnit.getUnitSerialNumber()); - startPolling(); - updateStatus(ThingStatus.ONLINE); - } catch (IOException e) { - updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.COMMUNICATION_ERROR, e.getMessage()); - } - }); + this.airUnit = new DanfossAirUnit(localCommunicationController); + startPolling(); } catch (UnknownHostException e) { updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.COMMUNICATION_ERROR, "@text/offline.communication-error.unknown-host [\"" + config.host + "\"]"); @@ -138,6 +131,10 @@ private void removeDeprecatedChannels() { } private void updateAllChannels() { + if (!initializeProperties()) { + return; + } + DanfossAirUnit localAirUnit = this.airUnit; if (localAirUnit == null) { return; @@ -153,7 +150,7 @@ private void updateAllChannels() { try { updateState(channel.getGroup().getGroupName(), channel.getChannelName(), channel.getReadAccessor().access(localAirUnit)); - if (getThing().getStatus() == ThingStatus.OFFLINE) { + if (getThing().getStatus() != ThingStatus.ONLINE) { updateStatus(ThingStatus.ONLINE); } } catch (UnexpectedResponseValueException e) { @@ -161,7 +158,7 @@ private void updateAllChannels() { logger.debug( "Cannot update channel {}: an unexpected or invalid response has been received from the air unit: {}", channel.getChannelName(), e.getMessage()); - if (getThing().getStatus() == ThingStatus.OFFLINE) { + if (getThing().getStatus() != ThingStatus.ONLINE) { updateStatus(ThingStatus.ONLINE); } } catch (IOException e) { @@ -173,6 +170,33 @@ private void updateAllChannels() { } } + private synchronized boolean initializeProperties() { + if (propertiesInitializedSuccessfully) { + return true; + } + + DanfossAirUnit localAirUnit = this.airUnit; + if (localAirUnit == null) { + return false; + } + + logger.debug("Initializing DanfossHRV properties '{}'", getThing().getUID()); + + try { + Map properties = new HashMap<>(2); + properties.put(PROPERTY_UNIT_NAME, localAirUnit.getUnitName()); + properties.put(PROPERTY_SERIAL, localAirUnit.getUnitSerialNumber()); + updateProperties(properties); + propertiesInitializedSuccessfully = true; + updateStatus(ThingStatus.ONLINE); + } catch (IOException e) { + updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.COMMUNICATION_ERROR, e.getMessage()); + logger.debug("Cannot initialize properties: an error occurred: {}", e.getMessage()); + } + + return propertiesInitializedSuccessfully; + } + @Override public void dispose() { logger.debug("Disposing Danfoss HRV handler '{}'", getThing().getUID());