diff --git a/bundles/org.openhab.binding.samsungtv/src/main/java/org/openhab/binding/samsungtv/internal/handler/SamsungTvHandler.java b/bundles/org.openhab.binding.samsungtv/src/main/java/org/openhab/binding/samsungtv/internal/handler/SamsungTvHandler.java index c2486d7642cad..2902a1c27891d 100755 --- a/bundles/org.openhab.binding.samsungtv/src/main/java/org/openhab/binding/samsungtv/internal/handler/SamsungTvHandler.java +++ b/bundles/org.openhab.binding.samsungtv/src/main/java/org/openhab/binding/samsungtv/internal/handler/SamsungTvHandler.java @@ -85,7 +85,7 @@ public class SamsungTvHandler extends BaseThingHandler implements RegistryListen private static final String HTTP_ENDPOINT_V2 = "/api/v2/"; // common Samsung TV remote control ports - private final List ports = new ArrayList<>(List.of(55000, 1515, 7001, 7676, 15500)); + private final List ports = new ArrayList<>(List.of(55000, 1515, 7001, 15500)); private final Logger logger = LoggerFactory.getLogger(SamsungTvHandler.class); @@ -186,10 +186,11 @@ public boolean send(String channel, Command command) { logger.warn("{}: Cannot send WOL packet, MAC address invalid: {}", host, macAddress); return false; } - wolCount = 0; this.channel = channel; this.command = command; - cancel(); + if (channel.equals(ART_MODE) && !getArtModeSupported()) { + logger.warn("{}: artMode is not yet detected on this TV - sending WOL anyway", host); + } startWoljob(); return true; } @@ -197,18 +198,23 @@ public boolean send(String channel, Command command) { } private void startWoljob() { - int interval = 1000; wolJob.ifPresentOrElse(job -> { if (job.isCancelled()) { - wolJob = Optional.of(scheduler.scheduleWithFixedDelay(this::wolCheckPeriodic, 0, interval, - TimeUnit.MILLISECONDS)); - } // else - scheduler is already running! + start(); + } else { + logger.debug("{}: WOL job already running", host); + } }, () -> { - wolJob = Optional.of( - scheduler.scheduleWithFixedDelay(this::wolCheckPeriodic, 0, interval, TimeUnit.MILLISECONDS)); + start(); }); } + public void start() { + wolCount = 0; + wolJob = Optional + .of(scheduler.scheduleWithFixedDelay(this::wolCheckPeriodic, 0, 1000, TimeUnit.MILLISECONDS)); + } + public synchronized void cancel() { wolJob.ifPresent(job -> { logger.info("{}: cancelling WOL Job", host); @@ -255,6 +261,7 @@ private void wolCheckPeriodic() { if (wolCount++ > WOL_SERVICE_CHECK_COUNT) { logger.warn("{}: Service NOT found after {} attempts: stopping WOL attempts", host, wolCount); cancel(); + putOffline(); } } } @@ -563,14 +570,6 @@ private void checkAndCreateServices() { boolean isOnline = false; - // Websocket services and Smartthings service - if (configuration.isWebsocketProtocol()) { - createService(RemoteControllerService.SERVICE_NAME, ""); - if (!configuration.getSmartThingsApiKey().isBlank()) { - createService(SmartThingsApiService.SERVICE_NAME, ""); - } - } - // UPnP services for (Device device : upnpService.getRegistry().getDevices()) { RemoteDevice rdevice = (RemoteDevice) device; @@ -580,6 +579,14 @@ private void checkAndCreateServices() { } } + // Websocket services and Smartthings service + if (isOnline && configuration.isWebsocketProtocol()) { + createService(RemoteControllerService.SERVICE_NAME, ""); + if (!configuration.getSmartThingsApiKey().isBlank()) { + createService(SmartThingsApiService.SERVICE_NAME, ""); + } + } + if (isOnline) { putOnline(); startPolling(); @@ -641,6 +648,9 @@ private synchronized Optional createNewService(String type, St break; case RemoteControllerService.SERVICE_NAME: try { + if (configuration.isWebsocketProtocol() && !udn.isEmpty()) { + throw new RemoteControllerException("config is websocket - ignoring UPNP service"); + } service = Optional .of(new RemoteControllerService(host, configuration.getPort(), !udn.isEmpty(), this)); } catch (RemoteControllerException e) { diff --git a/bundles/org.openhab.binding.samsungtv/src/main/java/org/openhab/binding/samsungtv/internal/protocol/WebSocketBase.java b/bundles/org.openhab.binding.samsungtv/src/main/java/org/openhab/binding/samsungtv/internal/protocol/WebSocketBase.java index b3f8af6040b8c..6efc92b713251 100755 --- a/bundles/org.openhab.binding.samsungtv/src/main/java/org/openhab/binding/samsungtv/internal/protocol/WebSocketBase.java +++ b/bundles/org.openhab.binding.samsungtv/src/main/java/org/openhab/binding/samsungtv/internal/protocol/WebSocketBase.java @@ -121,7 +121,7 @@ void sendCommand(String cmd) { remoteControllerWebSocket.openConnection(); } } catch (IOException | RemoteControllerException e) { - logger.warn("{}: {}: cannot send command", host, this.getClass().getSimpleName(), e); + logger.warn("{}: {}: cannot send command: {}", host, this.getClass().getSimpleName(), e.getMessage()); } } diff --git a/bundles/org.openhab.binding.samsungtv/src/main/java/org/openhab/binding/samsungtv/internal/service/MediaRendererService.java b/bundles/org.openhab.binding.samsungtv/src/main/java/org/openhab/binding/samsungtv/internal/service/MediaRendererService.java index dba473af98d8b..dc2e52eafc1e9 100755 --- a/bundles/org.openhab.binding.samsungtv/src/main/java/org/openhab/binding/samsungtv/internal/service/MediaRendererService.java +++ b/bundles/org.openhab.binding.samsungtv/src/main/java/org/openhab/binding/samsungtv/internal/service/MediaRendererService.java @@ -248,13 +248,13 @@ protected Map updateResourceState(String actionId) { return updateResourceState(actionId, Map.of()); } - @SuppressWarnings("null") protected synchronized Map updateResourceState(String actionId, Map inputs) { Map inputsMap = new LinkedHashMap(Map.of("InstanceID", "0")); if (actionId.contains("Volume") || actionId.contains("Mute")) { inputsMap.put("Channel", "Master"); } inputsMap.putAll(inputs); + @SuppressWarnings("null") Map result = service.invokeAction(this, "RenderingControl", actionId, inputsMap); result.keySet().stream().filter(a -> !"Result".equals(a)) .forEach(a -> onValueReceived(a, result.get(a), "RenderingControl")); diff --git a/bundles/org.openhab.binding.samsungtv/src/main/java/org/openhab/binding/samsungtv/internal/service/RemoteControllerService.java b/bundles/org.openhab.binding.samsungtv/src/main/java/org/openhab/binding/samsungtv/internal/service/RemoteControllerService.java index ca084904e9e21..f43b7f63d8504 100755 --- a/bundles/org.openhab.binding.samsungtv/src/main/java/org/openhab/binding/samsungtv/internal/service/RemoteControllerService.java +++ b/bundles/org.openhab.binding.samsungtv/src/main/java/org/openhab/binding/samsungtv/internal/service/RemoteControllerService.java @@ -112,7 +112,7 @@ public List getSupportedChannelNames(boolean refresh) { if (getArtModeSupported()) { supported.addAll(refresh ? refreshArt : supportedCommandsArt); } - if (remoteController.noApps() && refresh) { + if (remoteController.noApps() && getPowerState() && refresh) { supported.addAll(refreshApps); } if (!refresh) { @@ -164,20 +164,13 @@ public boolean handleCommand(String channel, Command command) { boolean result = false; if (!remoteController.isConnected()) { logger.warn("{}: RemoteController is not connected", host); - try { - remoteController.openConnection(); - } catch (RemoteControllerException e) { - logger.warn("{}: Could not re-open connection {}", host, e.getMessage()); - return result; - } + return false; } if (command == RefreshType.REFRESH) { switch (channel) { case SOURCE_APP: - if (getPowerState()) { - remoteController.updateCurrentApp(); - } + remoteController.updateCurrentApp(); break; case ART_IMAGE: case ART_LABEL: @@ -295,11 +288,9 @@ public boolean handleCommand(String channel, Command command) { case ART_COLOR_TEMPERATURE: if (command instanceof DecimalType) { - int value = ((DecimalType) command).intValue(); - if (value >= -5 && value <= 5) { - remoteController.getArtmodeStatus("set_color_temperature", String.valueOf(value)); - result = true; - } + int value = Math.max(-5, Math.min(((DecimalType) command).intValue(), 5)); + remoteController.getArtmodeStatus("set_color_temperature", String.valueOf(value)); + result = true; } break; diff --git a/bundles/org.openhab.binding.samsungtv/src/main/resources/OH-INF/config/config.xml b/bundles/org.openhab.binding.samsungtv/src/main/resources/OH-INF/config/config.xml index b4077c337401f..b592c329f8f21 100755 --- a/bundles/org.openhab.binding.samsungtv/src/main/resources/OH-INF/config/config.xml +++ b/bundles/org.openhab.binding.samsungtv/src/main/resources/OH-INF/config/config.xml @@ -20,7 +20,7 @@ - TCP port of the Samsung TV (legacy: 1515, 7001, 7676, 15500, 55000 websockets: 8001, 8002). + TCP port of the Samsung TV (legacy: 1515, 7001, 15500, 55000 websockets: 8001, 8002). 55000