diff --git a/broadlink/__init__.py b/broadlink/__init__.py index 8b08ffc..5583053 100644 --- a/broadlink/__init__.py +++ b/broadlink/__init__.py @@ -7,11 +7,8 @@ import threading import time from datetime import datetime -try: - from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes - from cryptography.hazmat.backends import default_backend -except ImportError: - import pyaes +from cryptography.hazmat.backends import default_backend +from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes def gendevice(devtype, host, mac): @@ -65,9 +62,9 @@ def discover(timeout=None, local_ip_address=None): if local_ip_address is None: local_ip_address = socket.gethostbyname(socket.gethostname()) if local_ip_address.startswith('127.'): - s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - s.connect(('8.8.8.8', 53)) # connecting to a UDP address doesn't send packets - local_ip_address = s.getsockname()[0] + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + s.connect(('8.8.8.8', 53)) # connecting to a UDP address doesn't send packets + local_ip_address = s.getsockname()[0] address = local_ip_address.split('.') cs = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) cs.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) @@ -159,39 +156,20 @@ class device: self.type = "Unknown" self.lock = threading.Lock() - if 'pyaes' in globals(): - self.encrypt = self.encrypt_pyaes - self.decrypt = self.decrypt_pyaes - self.update_aes = self.update_aes_pyaes - - else: - self.encrypt = self.encrypt_crypto - self.decrypt = self.decrypt_crypto - self.update_aes = self.update_aes_crypto - self.aes = None key = bytearray( [0x09, 0x76, 0x28, 0x34, 0x3f, 0xe9, 0x9e, 0x23, 0x76, 0x5c, 0x15, 0x13, 0xac, 0xcf, 0x8b, 0x02]) self.update_aes(key) - def update_aes_pyaes(self, key): - self.aes = pyaes.AESModeOfOperationCBC(key, iv=bytes(self.iv)) - - def encrypt_pyaes(self, payload): - return b"".join([self.aes.encrypt(bytes(payload[i:i + 16])) for i in range(0, len(payload), 16)]) - - def decrypt_pyaes(self, payload): - return b"".join([self.aes.decrypt(bytes(payload[i:i + 16])) for i in range(0, len(payload), 16)]) - - def update_aes_crypto(self, key): + def update_aes(self, key): self.aes = Cipher(algorithms.AES(key), modes.CBC(self.iv), backend=default_backend()) - def encrypt_crypto(self, payload): + def encrypt(self, payload): encryptor = self.aes.encryptor() return encryptor.update(payload) + encryptor.finalize() - def decrypt_crypto(self, payload): + def decrypt(self, payload): decryptor = self.aes.decryptor() return decryptor.update(payload) + decryptor.finalize() diff --git a/cli/broadlink_cli b/cli/broadlink_cli index 1a8fe57..976b537 100755 --- a/cli/broadlink_cli +++ b/cli/broadlink_cli @@ -1,11 +1,11 @@ #!/usr/bin/env python3 -import broadlink -import sys import argparse -import time import base64 import codecs +import time + +import broadlink TICK = 32.84 IR_TOKEN = 0x26 @@ -18,7 +18,6 @@ def auto_int(x): def to_microseconds(bytes): result = [] # print bytes[0] # 0x26 = 38for IR - length = bytes[2] + 256 * bytes[3] # presently ignored index = 4 while index < len(bytes): chunk = bytes[index] @@ -27,7 +26,7 @@ def to_microseconds(bytes): chunk = bytes[index] chunk = 256 * chunk + bytes[index + 1] index += 2 - result.append(int(round(chunk*TICK))) + result.append(int(round(chunk * TICK))) if chunk == 0x0d05: break return result @@ -40,7 +39,7 @@ def durations_to_broadlink(durations): result.append(len(durations) % 256) result.append(len(durations) / 256) for dur in durations: - num = int(round(dur/TICK)) + num = int(round(dur / TICK)) if num > 255: result.append(0) result.append(num / 256) @@ -69,8 +68,8 @@ parser.add_argument("--device", help="device definition as 'type host mac'") parser.add_argument("--type", type=auto_int, default=0x2712, help="type of device") parser.add_argument("--host", help="host address") parser.add_argument("--mac", help="mac address (hex reverse), as used by python-broadlink library") -parser.add_argument("--temperature",action="store_true", help="request temperature from device") -parser.add_argument("--energy",action="store_true", help="request energy consumption from device") +parser.add_argument("--temperature", action="store_true", help="request temperature from device") +parser.add_argument("--energy", action="store_true", help="request energy consumption from device") parser.add_argument("--check", action="store_true", help="check current power state") parser.add_argument("--checknl", action="store_true", help="check current nightlight state") parser.add_argument("--turnon", action="store_true", help="turn on device") @@ -83,14 +82,15 @@ parser.add_argument("--sensors", action="store_true", help="check all sensors") parser.add_argument("--learn", action="store_true", help="learn command") parser.add_argument("--rfscanlearn", action="store_true", help="rf scan learning") parser.add_argument("--learnfile", help="save learned command to a specified file") -parser.add_argument("--durations", action="store_true", help="use durations in micro seconds instead of the Broadlink format") +parser.add_argument("--durations", action="store_true", + help="use durations in micro seconds instead of the Broadlink format") parser.add_argument("--convert", action="store_true", help="convert input data to durations") parser.add_argument("data", nargs='*', help="Data to send or convert") args = parser.parse_args() if args.device: values = args.device.split() - type = int(values[0],0) + type = int(values[0], 0) host = values[1] mac = bytearray.fromhex(values[2]) elif args.mac: @@ -115,7 +115,7 @@ if args.sensors: data = dev.check_sensors() except: data = {} - data['temperature'] = dev.check_temperature() + data['temperature'] = dev.check_temperature() for key in data: print("{} {}".format(key, data[key])) if args.send: diff --git a/cli/broadlink_discovery b/cli/broadlink_discovery index 74f36ed..1edbafc 100755 --- a/cli/broadlink_discovery +++ b/cli/broadlink_discovery @@ -1,10 +1,10 @@ #!/usr/bin/env python -import broadlink -import time import argparse -parser = argparse.ArgumentParser(fromfile_prefix_chars='@'); +import broadlink + +parser = argparse.ArgumentParser(fromfile_prefix_chars='@') parser.add_argument("--timeout", type=int, default=5, help="timeout to wait for receiving discovery responses") parser.add_argument("--ip", default=None, help="ip address to use in the discovery") args = parser.parse_args() @@ -15,7 +15,8 @@ for device in devices: if device.auth(): print("###########################################") print(device.type) - print("# broadlink_cli --type {} --host {} --mac {}".format(hex(device.devtype), device.host[0], ''.join(format(x, '02x') for x in device.mac))) + print("# broadlink_cli --type {} --host {} --mac {}".format(hex(device.devtype), device.host[0], + ''.join(format(x, '02x') for x in device.mac))) print("Device file data (to be used with --device @filename in broadlink_cli) : ") print("{} {} {}".format(hex(device.devtype), device.host[0], ''.join(format(x, '02x') for x in device.mac))) if hasattr(device, 'check_temperature'): @@ -23,4 +24,3 @@ for device in devices: print("") else: print("Error authenticating with device : {}".format(device.host)) - diff --git a/setup.py b/setup.py index bc64957..ca48ea2 100644 --- a/setup.py +++ b/setup.py @@ -1,20 +1,9 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -import re -import sys -import warnings from setuptools import setup, find_packages -try: - import cryptography - dynamic_requires = ['cryptography>=2.1.1'] -except ImportError: - dynamic_requires = ["pyaes==1.6.0"] - -# For Hysen thermostatic heating controller -dynamic_requires.append('PyCRC') version = '0.11.1' @@ -26,7 +15,7 @@ setup( url='http://github.com/mjg59/python-broadlink', packages=find_packages(), scripts=[], - install_requires=dynamic_requires, + install_requires=['cryptography>=2.1.1', 'PyCRC'], description='Python API for controlling Broadlink IR controllers', classifiers=[ 'Development Status :: 4 - Beta',