[freeathome] Fix periodic WebSocket disconnect in ping keep-alive mode (#21065)

The bridge sends a WebSocket ping every 10 seconds but only refreshed its
liveness timestamp on incoming text frames. Pong replies were never seen
because the handler did not implement WebSocketPingPongListener, so on an
idle SysAP the 90 second watchdog closed a healthy connection and the
binding reconnected in a loop.

Implement WebSocketPingPongListener and update lastReceivedTime on every
pong, so ping/pong keeps the connection alive while a genuinely dead peer
is still detected once pongs stop.

Signed-off-by: Danilo Bürger <info@danilobuerger.de>
This commit is contained in:
Danilo Bürger
2026-06-29 23:35:58 +02:00
committed by GitHub
parent 433ba4a0f1
commit e5796cb942
@@ -50,6 +50,7 @@ import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.StatusCode;
import org.eclipse.jetty.websocket.api.WebSocketListener;
import org.eclipse.jetty.websocket.api.WebSocketPingPongListener;
import org.eclipse.jetty.websocket.client.ClientUpgradeRequest;
import org.eclipse.jetty.websocket.client.WebSocketClient;
import org.openhab.binding.freeathome.internal.FreeAtHomeDiscoveryService;
@@ -82,7 +83,7 @@ import com.google.gson.stream.JsonReader;
*
*/
@NonNullByDefault
public class FreeAtHomeBridgeHandler extends BaseBridgeHandler implements WebSocketListener {
public class FreeAtHomeBridgeHandler extends BaseBridgeHandler implements WebSocketListener, WebSocketPingPongListener {
private final Logger logger = LoggerFactory.getLogger(FreeAtHomeBridgeHandler.class);
@@ -1148,6 +1149,18 @@ public class FreeAtHomeBridgeHandler extends BaseBridgeHandler implements WebSoc
logger.warn("Binary message received via websocket - It shall not happen with the free@home SysAp");
}
@Override
@NonNullByDefault({})
public void onWebSocketPong(ByteBuffer payload) {
lastReceivedTime = System.currentTimeMillis();
logger.debug("WebSocket pong received");
}
@Override
@NonNullByDefault({})
public void onWebSocketPing(ByteBuffer payload) {
}
/**
* Text message received. Processing will be started
*/