*/
package org.openhab.binding.openthermgateway.handler;
+import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import javax.measure.Unit;
private final Logger logger = LoggerFactory.getLogger(OpenThermGatewayHandler.class);
private @Nullable OpenThermGatewayConfiguration config;
-
private @Nullable OpenThermGatewayConnector connector;
+ private @Nullable ScheduledFuture<?> reconnectTask;
private boolean connecting = false;
-
private boolean explicitDisconnect = false;
public OpenThermGatewayHandler(Thing thing) {
@Override
public void handleCommand(ChannelUID channelUID, Command command) {
+ @Nullable
+ OpenThermGatewayConnector conn = connector;
+
logger.debug("Received channel: {}, command: {}", channelUID, command);
if (!(command instanceof RefreshType)) {
gatewayCommand = GatewayCommand.parse(code, command.toFullString());
}
- if (checkConnection()) {
- @Nullable
- OpenThermGatewayConnector conn = connector;
-
- if (conn != null) {
- conn.sendCommand(gatewayCommand);
-
- if (code == GatewayCommandCode.ControlSetpoint) {
- 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")));
+ if (conn != null && conn.isConnected()) {
+ conn.sendCommand(gatewayCommand);
+
+ if (code == GatewayCommandCode.ControlSetpoint) {
+ 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")));
}
+ } else {
+ connect();
}
}
}
@Override
public void disconnected() {
- @Nullable
- OpenThermGatewayConnector conn = connector;
-
@Nullable
OpenThermGatewayConfiguration conf = config;
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.NONE, "Disconnected");
// retry connection if disconnect is not explicitly requested
- if (conf != null && !explicitDisconnect && conf.connectionRetryInterval > 0) {
- scheduler.schedule(() -> {
- if (conn != null && !connecting && !conn.isConnected()) {
- connect();
- }
- }, conf.connectionRetryInterval, TimeUnit.SECONDS);
+ if (!explicitDisconnect && conf != null && conf.connectionRetryInterval > 0) {
+ logger.debug("Scheduling to reconnect in {} seconds.", conf.connectionRetryInterval);
+ reconnectTask = scheduler.schedule(this::connect, conf.connectionRetryInterval, TimeUnit.SECONDS);
}
}
@Override
public void dispose() {
disconnect();
- super.dispose();
- }
- private boolean checkConnection() {
- @Nullable
- OpenThermGatewayConnector conn = connector;
-
- if (conn != null && conn.isConnected()) {
- return true;
+ ScheduledFuture<?> localReconnectTask = reconnectTask;
+ if (localReconnectTask != null) {
+ localReconnectTask.cancel(true);
+ reconnectTask = null;
}
- return connect();
+ super.dispose();
}
- private boolean connect() {
+ private void connect() {
@Nullable
OpenThermGatewayConfiguration conf = config;
+ explicitDisconnect = false;
+
+ if (connecting) {
+ logger.debug("OpenTherm Gateway connector is already connecting ...");
+ return;
+ }
+
disconnect();
if (conf != null) {
logger.debug("Starting OpenTherm Gateway connector");
- explicitDisconnect = false;
-
connector = new OpenThermGatewaySocketConnector(this, conf.ipaddress, conf.port);
Thread thread = new Thread(connector, "OpenTherm Gateway Binding - socket listener thread");
thread.start();
logger.debug("OpenTherm Gateway connector started");
-
- return true;
}
-
- return false;
}
private void disconnect() {
@Nullable
OpenThermGatewayConnector conn = connector;
+ explicitDisconnect = true;
+
if (conn != null) {
if (conn.isConnected()) {
logger.debug("Stopping OpenTherm Gateway connector");
-
- explicitDisconnect = true;
conn.stop();
}