[openthermgateway] fix automatic reconnect after connection attempt fails (#9965)

* Added callback to disconnected() when connection attempt fails

Signed-off-by: Arjen Korevaar <a.korevaar@mephix.com>

* Updated version number

Signed-off-by: Arjen Korevaar <a.korevaar@mephix.com>

* Cancel reconnect task when disposing

Signed-off-by: Arjen Korevaar <a.korevaar@mephix.com>
This commit is contained in:
Arjen Korevaar 2021-01-27 15:32:50 +01:00 committed by GitHub
parent 3ec52433d8
commit 5a7be93670
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 37 additions and 47 deletions

View File

@ -12,6 +12,7 @@
*/ */
package org.openhab.binding.openthermgateway.handler; package org.openhab.binding.openthermgateway.handler;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.measure.Unit; import javax.measure.Unit;
@ -56,11 +57,10 @@ public class OpenThermGatewayHandler extends BaseThingHandler implements OpenThe
private final Logger logger = LoggerFactory.getLogger(OpenThermGatewayHandler.class); private final Logger logger = LoggerFactory.getLogger(OpenThermGatewayHandler.class);
private @Nullable OpenThermGatewayConfiguration config; private @Nullable OpenThermGatewayConfiguration config;
private @Nullable OpenThermGatewayConnector connector; private @Nullable OpenThermGatewayConnector connector;
private @Nullable ScheduledFuture<?> reconnectTask;
private boolean connecting = false; private boolean connecting = false;
private boolean explicitDisconnect = false; private boolean explicitDisconnect = false;
public OpenThermGatewayHandler(Thing thing) { public OpenThermGatewayHandler(Thing thing) {
@ -80,6 +80,9 @@ public class OpenThermGatewayHandler extends BaseThingHandler implements OpenThe
@Override @Override
public void handleCommand(ChannelUID channelUID, Command command) { public void handleCommand(ChannelUID channelUID, Command command) {
@Nullable
OpenThermGatewayConnector conn = connector;
logger.debug("Received channel: {}, command: {}", channelUID, command); logger.debug("Received channel: {}, command: {}", channelUID, command);
if (!(command instanceof RefreshType)) { if (!(command instanceof RefreshType)) {
@ -105,23 +108,19 @@ public class OpenThermGatewayHandler extends BaseThingHandler implements OpenThe
gatewayCommand = GatewayCommand.parse(code, command.toFullString()); gatewayCommand = GatewayCommand.parse(code, command.toFullString());
} }
if (checkConnection()) { if (conn != null && conn.isConnected()) {
@Nullable conn.sendCommand(gatewayCommand);
OpenThermGatewayConnector conn = connector;
if (conn != null) { if (code == GatewayCommandCode.ControlSetpoint) {
conn.sendCommand(gatewayCommand); if (gatewayCommand.getMessage().equals("0.0")) {
updateState(OpenThermGatewayBindingConstants.CHANNEL_OVERRIDE_CENTRAL_HEATING_WATER_SETPOINT,
if (code == GatewayCommandCode.ControlSetpoint) { UnDefType.UNDEF);
if (gatewayCommand.getMessage().equals("0.0")) {
updateState(
OpenThermGatewayBindingConstants.CHANNEL_OVERRIDE_CENTRAL_HEATING_WATER_SETPOINT,
UnDefType.UNDEF);
}
updateState(OpenThermGatewayBindingConstants.CHANNEL_OVERRIDE_CENTRAL_HEATING_ENABLED,
OnOffType.from(!gatewayCommand.getMessage().equals("0.0")));
} }
updateState(OpenThermGatewayBindingConstants.CHANNEL_OVERRIDE_CENTRAL_HEATING_ENABLED,
OnOffType.from(!gatewayCommand.getMessage().equals("0.0")));
} }
} else {
connect();
} }
} }
} }
@ -140,9 +139,6 @@ public class OpenThermGatewayHandler extends BaseThingHandler implements OpenThe
@Override @Override
public void disconnected() { public void disconnected() {
@Nullable
OpenThermGatewayConnector conn = connector;
@Nullable @Nullable
OpenThermGatewayConfiguration conf = config; OpenThermGatewayConfiguration conf = config;
@ -151,12 +147,9 @@ public class OpenThermGatewayHandler extends BaseThingHandler implements OpenThe
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.NONE, "Disconnected"); updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.NONE, "Disconnected");
// retry connection if disconnect is not explicitly requested // retry connection if disconnect is not explicitly requested
if (conf != null && !explicitDisconnect && conf.connectionRetryInterval > 0) { if (!explicitDisconnect && conf != null && conf.connectionRetryInterval > 0) {
scheduler.schedule(() -> { logger.debug("Scheduling to reconnect in {} seconds.", conf.connectionRetryInterval);
if (conn != null && !connecting && !conn.isConnected()) { reconnectTask = scheduler.schedule(this::connect, conf.connectionRetryInterval, TimeUnit.SECONDS);
connect();
}
}, conf.connectionRetryInterval, TimeUnit.SECONDS);
} }
} }
@ -215,31 +208,32 @@ public class OpenThermGatewayHandler extends BaseThingHandler implements OpenThe
@Override @Override
public void dispose() { public void dispose() {
disconnect(); disconnect();
ScheduledFuture<?> localReconnectTask = reconnectTask;
if (localReconnectTask != null) {
localReconnectTask.cancel(true);
reconnectTask = null;
}
super.dispose(); super.dispose();
} }
private boolean checkConnection() { private void connect() {
@Nullable
OpenThermGatewayConnector conn = connector;
if (conn != null && conn.isConnected()) {
return true;
}
return connect();
}
private boolean connect() {
@Nullable @Nullable
OpenThermGatewayConfiguration conf = config; OpenThermGatewayConfiguration conf = config;
explicitDisconnect = false;
if (connecting) {
logger.debug("OpenTherm Gateway connector is already connecting ...");
return;
}
disconnect(); disconnect();
if (conf != null) { if (conf != null) {
logger.debug("Starting OpenTherm Gateway connector"); logger.debug("Starting OpenTherm Gateway connector");
explicitDisconnect = false;
connector = new OpenThermGatewaySocketConnector(this, conf.ipaddress, conf.port); connector = new OpenThermGatewaySocketConnector(this, conf.ipaddress, conf.port);
Thread thread = new Thread(connector, "OpenTherm Gateway Binding - socket listener thread"); Thread thread = new Thread(connector, "OpenTherm Gateway Binding - socket listener thread");
@ -247,22 +241,18 @@ public class OpenThermGatewayHandler extends BaseThingHandler implements OpenThe
thread.start(); thread.start();
logger.debug("OpenTherm Gateway connector started"); logger.debug("OpenTherm Gateway connector started");
return true;
} }
return false;
} }
private void disconnect() { private void disconnect() {
@Nullable @Nullable
OpenThermGatewayConnector conn = connector; OpenThermGatewayConnector conn = connector;
explicitDisconnect = true;
if (conn != null) { if (conn != null) {
if (conn.isConnected()) { if (conn.isConnected()) {
logger.debug("Stopping OpenTherm Gateway connector"); logger.debug("Stopping OpenTherm Gateway connector");
explicitDisconnect = true;
conn.stop(); conn.stop();
} }

View File

@ -110,6 +110,7 @@ public class OpenThermGatewaySocketConnector implements OpenThermGatewayConnecto
} }
} catch (IOException ex) { } catch (IOException ex) {
logger.warn("Unable to connect to the OpenTherm Gateway.", ex); logger.warn("Unable to connect to the OpenTherm Gateway.", ex);
callback.disconnected();
} }
} }

View File

@ -38,11 +38,10 @@
<channel id="airpressfault" typeId="airpressfault"/> <channel id="airpressfault" typeId="airpressfault"/>
<channel id="waterovtemp" typeId="waterovtemp"/> <channel id="waterovtemp" typeId="waterovtemp"/>
<channel id="oemfaultcode" typeId="oemfaultcode"/> <channel id="oemfaultcode" typeId="oemfaultcode"/>
<channel id="diag" typeId="diag"/>
<channel id="sendcommand" typeId="sendcommand"/> <channel id="sendcommand" typeId="sendcommand"/>
</channels> </channels>
<properties> <properties>
<property name="version">1.1.0</property> <property name="version">1.1.1</property>
</properties> </properties>
<config-description-ref uri="thing-type:openthermgateway:otgw"/> <config-description-ref uri="thing-type:openthermgateway:otgw"/>
</thing-type> </thing-type>