From e5796cb942e86996088a14eec09e8e0ecf5803d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danilo=20B=C3=BCrger?= Date: Mon, 29 Jun 2026 23:35:58 +0200 Subject: [PATCH] [freeathome] Fix periodic WebSocket disconnect in ping keep-alive mode (#21065) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .../handler/FreeAtHomeBridgeHandler.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/bundles/org.openhab.binding.freeathome/src/main/java/org/openhab/binding/freeathome/internal/handler/FreeAtHomeBridgeHandler.java b/bundles/org.openhab.binding.freeathome/src/main/java/org/openhab/binding/freeathome/internal/handler/FreeAtHomeBridgeHandler.java index 1b5285e6a3..9eb7d9ef09 100644 --- a/bundles/org.openhab.binding.freeathome/src/main/java/org/openhab/binding/freeathome/internal/handler/FreeAtHomeBridgeHandler.java +++ b/bundles/org.openhab.binding.freeathome/src/main/java/org/openhab/binding/freeathome/internal/handler/FreeAtHomeBridgeHandler.java @@ -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); @@ -607,7 +608,7 @@ public class FreeAtHomeBridgeHandler extends BaseBridgeHandler implements WebSoc /** * Method to connect the WebSocket session. * Attempts to establish a WebSocket connection to the SysAP and handles authentication. - * + * * @return true if the connection attempt is initiated successfully, false otherwise */ public boolean connectWebsocketSession() { @@ -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 */