]> git.basschouten.com Git - openhab-addons.git/commitdiff
[freeboxos] Fix thing status handling when rebooting the player (#17238)
authorlolodomo <lg.hc@free.fr>
Tue, 13 Aug 2024 11:11:20 +0000 (13:11 +0200)
committerGitHub <noreply@github.com>
Tue, 13 Aug 2024 11:11:20 +0000 (13:11 +0200)
Fix #17227

Signed-off-by: Laurent Garnier <lg.hc@free.fr>
bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/ActivePlayerHandler.java
bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/ApiConsumerHandler.java
bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/HostHandler.java
bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/RepeaterHandler.java
bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/VmHandler.java
bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/WifiStationHandler.java
bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/i18n/freeboxos.properties

index 3bbd2f2e21405a24772c1039a0a52cb6a7a57c7a..e47f0d6d47e956734d4034b61ac2772d46521e68 100644 (file)
@@ -30,6 +30,7 @@ import org.openhab.core.library.unit.Units;
 import org.openhab.core.thing.ChannelUID;
 import org.openhab.core.thing.Thing;
 import org.openhab.core.thing.ThingStatus;
+import org.openhab.core.thing.ThingStatusDetail;
 import org.openhab.core.thing.binding.ThingHandlerService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -50,6 +51,7 @@ public class ActivePlayerHandler extends PlayerHandler implements FreeDeviceIntf
 
     public ActivePlayerHandler(Thing thing) {
         super(thing);
+        statusDrivenByLanConnectivity = false;
         eventChannelUID = new ChannelUID(getThing().getUID(), SYS_INFO, BOX_EVENT);
     }
 
@@ -69,9 +71,24 @@ public class ActivePlayerHandler extends PlayerHandler implements FreeDeviceIntf
     @Override
     protected void internalPoll() throws FreeboxException {
         super.internalPoll();
-        if (thing.getStatus().equals(ThingStatus.ONLINE)) {
+        poll();
+    }
+
+    @Override
+    protected void internalForcePoll() throws FreeboxException {
+        super.internalForcePoll();
+        poll();
+    }
+
+    private void poll() throws FreeboxException {
+        if (reachable) {
             Player player = getManager(PlayerManager.class).getDevice(getClientId());
-            updateStatus(player.reachable() ? ThingStatus.ONLINE : ThingStatus.OFFLINE);
+            logger.debug("{}: poll with player.reachable() = {}", thing.getUID(), player.reachable());
+            if (player.reachable()) {
+                updateStatus(ThingStatus.ONLINE);
+            } else {
+                updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.NONE, "@text/info-player-not-reachable");
+            }
             if (player.reachable()) {
                 Status status = getManager(PlayerManager.class).getPlayerStatus(getClientId());
                 if (status != null) {
@@ -89,6 +106,9 @@ public class ActivePlayerHandler extends PlayerHandler implements FreeDeviceIntf
                 }
             }
             updateChannelQuantity(SYS_INFO, UPTIME, uptime, Units.SECOND);
+        } else {
+            logger.debug("{}: poll with reachable={}", thing.getUID(), reachable);
+            updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.NONE, "@text/info-player-not-reachable");
         }
     }
 
index 8a9ad3713f4060575072589bdcc4201214b8b50a..aa1b5dae03133b8a8380b04f7cd822440b566980 100644 (file)
@@ -218,7 +218,7 @@ public abstract class ApiConsumerHandler extends BaseThingHandler implements Api
         ThingStatusDetail detail = thing.getStatusInfo().getStatusDetail();
         if (ThingStatusDetail.DUTY_CYCLE.equals(detail)) {
             try {
-                internalPoll();
+                internalForcePoll();
             } catch (FreeboxException ignore) {
                 // An exception is normal if the box is rebooting then let's try again later...
                 addJob("Initialize", this::initialize, 10, TimeUnit.SECONDS);
index eacac76df48dba2c6381fb0a098bf3f996009f8a..4a238d001e1e5dbe8731d534c1799153d490b46e 100644 (file)
@@ -28,6 +28,7 @@ import org.openhab.binding.freeboxos.internal.api.rest.WebSocketManager;
 import org.openhab.binding.freeboxos.internal.config.ApiConsumerConfiguration;
 import org.openhab.core.thing.Thing;
 import org.openhab.core.thing.ThingStatus;
+import org.openhab.core.thing.ThingStatusDetail;
 import org.openhab.core.thing.binding.ThingHandlerService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -46,6 +47,8 @@ public class HostHandler extends ApiConsumerHandler {
     // We start in pull mode and switch to push after a first update...
     protected boolean pushSubscribed = false;
 
+    protected boolean statusDrivenByLanConnectivity = true;
+
     protected boolean reachable;
 
     private int tryConfigureMediaSink = 1;
@@ -93,7 +96,8 @@ public class HostHandler extends ApiConsumerHandler {
 
         LanHost host = getLanHost();
         updateConnectivityChannels(host);
-        logger.debug("Switching to push mode - refreshInterval will now be ignored for Connectivity data");
+        logger.debug("{}: switching to push mode - refreshInterval will now be ignored for Connectivity data",
+                thing.getUID());
         pushSubscribed = getManager(WebSocketManager.class).registerListener(host.getMac(), this);
     }
 
@@ -114,10 +118,17 @@ public class HostHandler extends ApiConsumerHandler {
     }
 
     public void updateConnectivityChannels(LanHost host) {
+        logger.debug("{}: updateConnectivityChannels with host.reachable() = {}", thing.getUID(), host.reachable());
         updateChannelOnOff(CONNECTIVITY, REACHABLE, host.reachable());
         updateChannelDateTimeState(CONNECTIVITY, LAST_SEEN, host.getLastSeen());
         updateChannelString(CONNECTIVITY, IP_ADDRESS, host.getIpv4());
-        updateStatus(host.reachable() ? ThingStatus.ONLINE : ThingStatus.OFFLINE);
+        if (statusDrivenByLanConnectivity) {
+            if (host.reachable()) {
+                updateStatus(ThingStatus.ONLINE);
+            } else {
+                updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.NONE, "@text/info-host-not-reachable");
+            }
+        }
         // We will check and configure audio sink only when the host reachability changed
         if (reachable != host.reachable()) {
             reachable = host.reachable();
index 8cb9ed5d4d586df1148504790c7157ce11ccd028..eaa62f9929005498b692c83144ad495e165729a2 100644 (file)
@@ -66,7 +66,16 @@ public class RepeaterHandler extends HostHandler implements FreeDeviceIntf {
     @Override
     protected void internalPoll() throws FreeboxException {
         super.internalPoll();
+        poll();
+    }
+
+    @Override
+    protected void internalForcePoll() throws FreeboxException {
+        super.internalForcePoll();
+        poll();
+    }
 
+    private void poll() throws FreeboxException {
         if (!thing.getStatus().equals(ThingStatus.ONLINE)) {
             return;
         }
index 9a0917cadf7a287ac7f975addcf1f82701f1dc06..ef33694b22b97dd42552d8e6395724384b61aaad 100644 (file)
@@ -24,6 +24,7 @@ import org.openhab.binding.freeboxos.internal.api.rest.VmManager.VirtualMachine;
 import org.openhab.core.library.types.OnOffType;
 import org.openhab.core.thing.Thing;
 import org.openhab.core.thing.ThingStatus;
+import org.openhab.core.thing.ThingStatusDetail;
 import org.openhab.core.types.Command;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -75,7 +76,11 @@ public class VmHandler extends HostHandler {
         boolean running = Status.RUNNING.equals(vm.status());
         updateChannelOnOff(VM_STATUS, STATUS, running);
         updateChannelOnOff(CONNECTIVITY, REACHABLE, running);
-        updateStatus(running ? ThingStatus.ONLINE : ThingStatus.OFFLINE);
+        if (running) {
+            updateStatus(ThingStatus.ONLINE);
+        } else {
+            updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.NONE, "@text/info-vm-not-running");
+        }
     }
 
     @Override
index 47bf88c97ee6ffca5a6260b879662bfb4a346e10..a37e5f88a7499fc557c3e46a48548a9687e5e1d5 100644 (file)
@@ -57,7 +57,16 @@ public class WifiStationHandler extends HostHandler {
     @Override
     protected void internalPoll() throws FreeboxException {
         super.internalPoll();
+        poll();
+    }
+
+    @Override
+    protected void internalForcePoll() throws FreeboxException {
+        super.internalForcePoll();
+        poll();
+    }
 
+    private void poll() throws FreeboxException {
         MACAddress mac = getMac();
         if (mac == null) {
             throw new FreeboxException(
index c1d7139d8ddc67c180bc36b7ca0cec08a35677a6..c03e3084de8b114cd9e468d57b5372cc5f085ff8 100644 (file)
@@ -355,6 +355,9 @@ channel-type.freeboxos.wifi-status.description = Indicates whether the wifi netw
 # messages
 
 info-conf-pending = Please accept pairing request directly on your freebox
+info-host-not-reachable = Host is not reachable
+info-player-not-reachable = Player is not reachable
+info-vm-not-running = VM is not running
 
 # iconprovider