From 5aa35ed41c9bbfa728929b46739e361cf1a509c9 Mon Sep 17 00:00:00 2001 From: Aidan Holland Date: Sun, 27 May 2018 13:34:26 -0400 Subject: [PATCH] Simplification --- README.rst | 19 +++++--- aquosRemote/aquos.py | 102 +++++++++++++++++++++++++++---------------- setup.py | 2 +- 3 files changed, 80 insertions(+), 43 deletions(-) diff --git a/README.rst b/README.rst index 2b5559c..671d81e 100644 --- a/README.rst +++ b/README.rst @@ -41,7 +41,7 @@ Usage aquos.off() # Puts TV into standby mode - aqous.set_standbymode # Enables standby mode + aqous.set_standbymode() # Enables standby mode aquos.play() # Play button (⏯) @@ -81,8 +81,16 @@ Usage aquos.set_input(x) # Sets TV input to input x -Note: tv\_on function will work only after you turn off tv using this -function, then un-plug and re-plug-in the tv. + aquos.get_device_name() # Gets TV device name + + aquos.get_model_name() # Gets TV model name + + aquos.get_software_version() # Gets TV software version + + aquos.get_ip_protocol_version() # Gets TV ip protocol + +Note: on function will work only after you use the setup=True argument or after +you turn off tv using this function, then un-plug and re-plug-in the tv. Example ------- @@ -93,8 +101,9 @@ An example program would look like: from aquosRemote.aquos import aquosTV - aquos = aquosTV('IP.ADD.RESS.XX') # Without Auth - aquos = aquosTV('IP.ADD.RESS.XX', 'username', 'password') # With Auth + aquos = aquosTV('IP.ADD.RESS.XX') # Without auth and setup + aquos = aquosTV('IP.ADD.RESS.XX', setup=True) # With setup + aquos = aquosTV('IP.ADD.RESS.XX', 'username', 'password') # With auth aquos.tv_on() ... diff --git a/aquosRemote/aquos.py b/aquosRemote/aquos.py index df18eba..4d3990f 100644 --- a/aquosRemote/aquos.py +++ b/aquosRemote/aquos.py @@ -1,38 +1,69 @@ import socket +from time import sleep from contextlib import closing class aquosTV(object): - def __init__(self, ip, port=10002, username=None, password=None): + def __init__(self, ip, port=10002, username=None, password=None, setup=False): self.ip = str(ip) self.port = int(port) + self.auth = (username and password) self.username = username self.password = password if not self._check_ip(): + if setup: + self.on() + sleep(1) + self.set_standbymode() + self.off() raise Exception("Port %s is not open on %s" % (self.port, self.ip)) + def _check_ip(self): + with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as sock: + sock.settimeout(3) + return (sock.connect_ex((self.ip, self.port)) == 0) + + def format_command(self, command): + if not command.endswith("\r"): + new_command = command + number = command[4:] + if number.isdigit(): + new_command = command[:4] + self.format_number(number) + new_command += "\r" + return new_command + return command + + def format_number(self, number): + return "% 4d" % int(number) + def send_command(self, command, byte_size=1024, timeout=3): + command = self.format_command(command) + # print(command) try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((self.ip, self.port)) s.settimeout(timeout) - if (self.username and self.password): + if (self.auth): s.send(self.username + "\r" + self.password + "\r") s.send(command.encode('utf-8')) msg = s.recv(byte_size) - return msg + return msg.strip() except socket.error: raise Exception("Error connecting to %s:%s" % (self.ip, self.port)) + def remote_number(self, number): + number = self.format_number(number) + return self.send_command("RCKY" + number) + def off(self): - return self.send_command("POWR0 \r") + return self.send_command("POWR0") - def set_standbymode(self): - return self.send_command("RSPW1 \r\r") + def set_standbymode(self, mode=1): + return self.send_command("RSPW" + self.format_number(mode)) def on(self): - return self.send_command("POWR1 \r") + return self.send_command("POWR1") def play(self): return self.remote_number(16) @@ -56,13 +87,13 @@ def skip_back(self): return self.remote_number(19) def toggle_mute(self): - return self.send_command("MUTE0 \r") + return self.send_command("MUTE0") def mute_on(self): - return self.send_command("MUTE1 \r") + return self.send_command("MUTE1") def mute_off(self): - return self.send_command("MUTE2 \r") + return self.send_command("MUTE2") def volume_up(self): return self.remote_number(33) @@ -81,20 +112,14 @@ def volume_repeat(self, number): self.volume_up() x += 1 else: - return "error" - return "OK\r" + return "ERR" + return "OK" def set_volume(self, level): - if level > 9: - sLevel = str(level) + " " - elif level <= 9: - sLevel = str(level) + " " - elif level == 100: - sLevel = str(level) + " " - - if (level <= 100 and level >= 0): - return self.send_command("VOLM" + sLevel + "\r") - return "error" + if (level <= 60 and level >= 0): + level = self.format_number(level) + return self.send_command("VOLM" + level) + return "ERR" def up(self): return self.remote_number(41) @@ -120,31 +145,34 @@ def netflix(self): return self.remote_number(59) def set_input(self, input_name): - return self.send_command("IAVD" + str(input_name) + " \r") + return self.send_command("IAVD" + str(input_name)) def toggle_input(self): - return self.send_command("ITGD \r") + return self.send_command("ITGD1") - def remote_number(self, number): - if number > 9: - number = str(number) + " " - else: - number = str(number) + " " - return self.send_command("RCKY" + number + "\r") + def get_device_name(self): + return self.send_command("TVNM1") - def _check_ip(self): - with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as sock: - sock.settimeout(3) - return (sock.connect_ex((self.ip, self.port)) == 0) + def get_model_name(self): + return self.send_command("MNRD1") + + def get_software_version(self): + return self.send_command("SWVN1") + + def get_ip_protocol_version(self): + return self.send_command("IPPV1") if __name__ == "__main__": # Example - # aquos = aquosTV("Basement TV", "192.168.1.2") - from time import sleep - aquos = aquosTV("192.168.1.2") + # aquos = aquosTV("192.168.1.2") + aquos = aquosTV("192.168.1.2", setup=True) aquos.on() sleep(1) + # print(aquos.get_device_name()) + # print(aquos.get_model_name()) + # print(aquos.get_software_version()) + # print(aquos.get_ip_protocol_version()) aquos.set_volume(30) sleep(1) aquos.off() diff --git a/setup.py b/setup.py index 8d82311..b7ef5e1 100644 --- a/setup.py +++ b/setup.py @@ -9,7 +9,7 @@ setup( name="aquosRemote", - version="1.3.1", + version="1.4.0", description="A small Python module for sending Remote Control Codes to your Sharp AQUOS Smart TV", long_description=long_description, url="https://github.com/thehappydinoa/aquosRemote",