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;
private @Nullable ScheduledFuture<?> pollingJob;
private @Nullable DanfossAirUnitCommunicationController communicationController;
private @Nullable DanfossAirUnit airUnit;
+ private boolean propertiesInitializedSuccessfully = false;
public DanfossAirUnitHandler(Thing thing) {
super(thing);
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 + "\"]");
}
private void updateAllChannels() {
+ if (!initializeProperties()) {
+ return;
+ }
+
DanfossAirUnit localAirUnit = this.airUnit;
if (localAirUnit == null) {
return;
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) {
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) {
}
}
+ 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<String, String> 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());