diff --git a/samsungctl/remote.py b/samsungctl/remote.py index a870d2c..b349750 100644 --- a/samsungctl/remote.py +++ b/samsungctl/remote.py @@ -23,3 +23,6 @@ def close(self): def control(self, key): return self.remote.control(key) + + def is_tv_on(self): + return self.remote.is_tv_on() diff --git a/samsungctl/remote_legacy.py b/samsungctl/remote_legacy.py index 2adc0da..b0a928e 100644 --- a/samsungctl/remote_legacy.py +++ b/samsungctl/remote_legacy.py @@ -59,6 +59,18 @@ def control(self, key): _key_interval = 0.2 + def is_tv_on(self): + try: + # Send an empty key to see if we are still connected + self.control('KEY') + except (exceptions.UnhandledResponse, + exceptions.AccessDenied, BrokenPipeError): + # We got a response so it's on. + # BrokenPipe can occur when the commands is sent to fast + return True + except (exceptions.ConnectionClosed, OSError): + return False + def _read_response(self, first_time=False): header = self.connection.recv(3) tv_name_len = int.from_bytes(header[1:3], diff --git a/samsungctl/remote_websocket.py b/samsungctl/remote_websocket.py index 6fad461..98d11d9 100644 --- a/samsungctl/remote_websocket.py +++ b/samsungctl/remote_websocket.py @@ -3,6 +3,7 @@ import logging import socket import time +import requests from . import exceptions @@ -12,6 +13,7 @@ class RemoteWebsocket(): """Object for remote control connection.""" + _config = None def __init__(self, config): import websocket @@ -22,6 +24,7 @@ def __init__(self, config): if config["timeout"] == 0: config["timeout"] = None + self._config = config url = URL_FORMAT.format(config["host"], config["port"], self._serialize_string(config["name"])) @@ -63,6 +66,21 @@ def control(self, key): _key_interval = 1.0 + def is_tv_on(self): + base_url = "http://{}:{}/api/v2/" + url = base_url.format(self._config['host'], self._config['port']) + try: + res = requests.get(url, timeout=5) + except (requests.exceptions.Timeout, + requests.exceptions.ConnectionError, + requests.exceptions.HTTPError, + requests.exceptions.ReadTimeout): + return False + if res is not None and res.status_code == 200: + return True + else: + return False + def _read_response(self): response = self.connection.recv() response = json.loads(response)