From ba2a33947df50c94bf3f4e63b046d616c5c57426 Mon Sep 17 00:00:00 2001 From: maniac103 Date: Fri, 25 Jun 2021 13:06:16 +0200 Subject: [PATCH] [squeezebox] Map server connection state to thing status. (#10778) If a player goes offline (it e.g. lost power or network connection), mark it as such in the thing status. Signed-off-by: Danny Baumann --- .../SqueezeBoxPlayerDiscoveryParticipant.java | 4 +++ .../SqueezeBoxNotificationListener.java | 4 +++ .../SqueezeBoxPlayerEventListener.java | 2 ++ .../handler/SqueezeBoxPlayerHandler.java | 28 +++++++++++---- .../handler/SqueezeBoxServerHandler.java | 35 +++++++++++++++++++ 5 files changed, 67 insertions(+), 6 deletions(-) diff --git a/bundles/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/discovery/SqueezeBoxPlayerDiscoveryParticipant.java b/bundles/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/discovery/SqueezeBoxPlayerDiscoveryParticipant.java index 2bf5b8846a..5cd1b03bdb 100644 --- a/bundles/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/discovery/SqueezeBoxPlayerDiscoveryParticipant.java +++ b/bundles/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/discovery/SqueezeBoxPlayerDiscoveryParticipant.java @@ -211,4 +211,8 @@ public class SqueezeBoxPlayerDiscoveryParticipant extends AbstractDiscoveryServi @Override public void buttonsChangeEvent(String mac, String likeCommand, String unlikeCommand) { } + + @Override + public void connectedStateChangeEvent(String mac, boolean connected) { + } } diff --git a/bundles/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxNotificationListener.java b/bundles/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxNotificationListener.java index d29d4031c3..37b87968d4 100644 --- a/bundles/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxNotificationListener.java +++ b/bundles/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxNotificationListener.java @@ -220,4 +220,8 @@ public final class SqueezeBoxNotificationListener implements SqueezeBoxPlayerEve @Override public void buttonsChangeEvent(String mac, String likeCommand, String unlikeCommand) { } + + @Override + public void connectedStateChangeEvent(String mac, boolean connected) { + } } diff --git a/bundles/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxPlayerEventListener.java b/bundles/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxPlayerEventListener.java index b8fbf34bcf..e08d5a2d59 100644 --- a/bundles/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxPlayerEventListener.java +++ b/bundles/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxPlayerEventListener.java @@ -82,4 +82,6 @@ public interface SqueezeBoxPlayerEventListener { void sourceChangeEvent(String mac, String source); void buttonsChangeEvent(String mac, String likeCommand, String unlikeCommand); + + void connectedStateChangeEvent(String mac, boolean connected); } diff --git a/bundles/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxPlayerHandler.java b/bundles/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxPlayerHandler.java index 65ca216926..a944612763 100644 --- a/bundles/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxPlayerHandler.java +++ b/bundles/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxPlayerHandler.java @@ -123,6 +123,7 @@ public class SqueezeBoxPlayerHandler extends BaseThingHandler implements Squeeze private String likeCommand; private String unlikeCommand; + private boolean connected = false; /** * Creates SqueezeBox Player Handler @@ -141,24 +142,31 @@ public class SqueezeBoxPlayerHandler extends BaseThingHandler implements Squeeze public void initialize() { mac = getConfig().as(SqueezeBoxPlayerConfig.class).mac; timeCounter(); - updateBridgeStatus(); + updateThingStatus(); logger.debug("player thing {} initialized with mac {}", getThing().getUID(), mac); + if (squeezeBoxServerHandler != null) { + // ensure we get an up-to-date connection state + squeezeBoxServerHandler.requestPlayers(); + } } @Override public void bridgeStatusChanged(ThingStatusInfo bridgeStatusInfo) { - updateBridgeStatus(); + updateThingStatus(); } - private void updateBridgeStatus() { + private void updateThingStatus() { Thing bridge = getBridge(); if (bridge != null) { squeezeBoxServerHandler = (SqueezeBoxServerHandler) bridge.getHandler(); ThingStatus bridgeStatus = bridge.getStatus(); - if (bridgeStatus == ThingStatus.ONLINE && getThing().getStatus() != ThingStatus.ONLINE) { - updateStatus(ThingStatus.ONLINE, ThingStatusDetail.NONE); - } else if (bridgeStatus == ThingStatus.OFFLINE) { + + if (bridgeStatus == ThingStatus.OFFLINE) { updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_OFFLINE); + } else if (!this.connected) { + updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.NONE); + } else if (bridgeStatus == ThingStatus.ONLINE && getThing().getStatus() != ThingStatus.ONLINE) { + updateStatus(ThingStatus.ONLINE, ThingStatusDetail.NONE); } } else { updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.CONFIGURATION_ERROR, "Bridge not found"); @@ -527,6 +535,14 @@ public class SqueezeBoxPlayerHandler extends BaseThingHandler implements Squeeze } } + @Override + public void connectedStateChangeEvent(String mac, boolean connected) { + if (isMe(mac)) { + this.connected = connected; + updateThingStatus(); + } + } + @Override public void updateFavoritesListEvent(List favorites) { logger.trace("Player {} updating favorites list with {} favorites", mac, favorites.size()); diff --git a/bundles/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxServerHandler.java b/bundles/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxServerHandler.java index fd8e6ae66a..fc5194d181 100644 --- a/bundles/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxServerHandler.java +++ b/bundles/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxServerHandler.java @@ -30,6 +30,7 @@ import java.util.Arrays; import java.util.Base64; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -535,6 +536,8 @@ public class SqueezeBoxServerHandler extends BaseBridgeHandler { } private void handlePlayersList(String message) { + final Set connectedPlayers = new HashSet<>(); + // Split out players String[] playersList = message.split("playerindex\\S*\\s"); for (String playerParams : playersList) { @@ -571,6 +574,10 @@ public class SqueezeBoxServerHandler extends BaseBridgeHandler { player.setName(parameter.substring(parameter.indexOf(":") + 1)); } else if (parameter.startsWith("model:")) { player.setModel(parameter.substring(parameter.indexOf(":") + 1)); + } else if (parameter.startsWith("connected:")) { + if ("1".equals(parameter.substring(parameter.indexOf(":") + 1))) { + connectedPlayers.add(macAddress); + } } } @@ -587,6 +594,11 @@ public class SqueezeBoxServerHandler extends BaseBridgeHandler { sendCommand(player.getMacAddress() + " status - 1 subscribe:10 tags:yagJlNKjc"); } } + for (final SqueezeBoxPlayer player : players.values()) { + final String mac = player.getMacAddress(); + final boolean connected = connectedPlayers.contains(mac); + updatePlayer(listener -> listener.connectedStateChangeEvent(mac, connected)); + } } private void handlePlayerUpdate(String message) { @@ -601,6 +613,9 @@ public class SqueezeBoxServerHandler extends BaseBridgeHandler { // get the message type String messageType = messageParts[1]; switch (messageType) { + case "client": + handleClientMessage(mac, messageParts); + break; case "status": handleStatusMessage(mac, messageParts); break; @@ -662,6 +677,26 @@ public class SqueezeBoxServerHandler extends BaseBridgeHandler { } } + private void handleClientMessage(final String mac, String[] messageParts) { + if (messageParts.length < 3) { + return; + } + + String action = messageParts[2]; + final boolean connected; + + if ("new".equals(action) || "reconnect".equals(action)) { + connected = true; + } else if ("disconnect".equals(action) || "forget".equals(action)) { + connected = false; + } else { + logger.trace("Unhandled client message type '{}'", Arrays.toString(messageParts)); + return; + } + + updatePlayer(listener -> listener.connectedStateChangeEvent(mac, connected)); + } + private void handleStatusMessage(final String mac, String[] messageParts) { String remoteTitle = "", artist = "", album = "", genre = "", year = ""; boolean coverart = false; -- 2.47.3