From 4f8b698a146dc4816eefc710777ffb6fc25f401f Mon Sep 17 00:00:00 2001 From: sqozz Date: Wed, 27 Feb 2019 22:26:39 +0100 Subject: [PATCH] Change visibility of some properties --- sem6000.py | 192 ++++++++++++++++++++++++++--------------------------- 1 file changed, 95 insertions(+), 97 deletions(-) diff --git a/sem6000.py b/sem6000.py index d7f49f1..5079212 100644 --- a/sem6000.py +++ b/sem6000.py @@ -1,5 +1,4 @@ from bluepy import btle -import struct import time import uuid @@ -13,9 +12,10 @@ class SEMSocket(): frequency = 0 mac_address = "" custom_service = None - read_char = None - write_char = None - notify_char = None + _read_char = None + _write_char = None + _notify_char = None + _btle_device = None connected = False def __init__(self, mac, auto_reconnect_timeout = None): @@ -27,92 +27,6 @@ class SEMSocket(): # initial connection may fail. It is up to the code what to do pass - class NotConnectedException(Exception): - pass - - class BTLEMessage(): - MAGIC_START = bytearray([0x0f]) - MAGIC_END = bytearray([0xff, 0xff]) - __data = bytearray() - __cmd = bytearray(1) # cmd cannot be empty - __payload = bytearray() - - def __init__(self, btle_device, cmd=bytearray(), payload=bytearray()): - self.__btle_device = btle_device - self.cmd = cmd - self.payload = payload - - @property - def cmd(self): - return self.__cmd - - @cmd.setter - def cmd(self, cmd): - self.__data = self.MAGIC_START + bytearray(1) + cmd + self.payload + bytearray(1) + self.MAGIC_END - self.__cmd = cmd - self.__calc_length() - self.__calc_checksum() - - @property - def payload(self): - return self.__payload - - @payload.setter - def payload(self, payload): - self.__data = self.MAGIC_START + bytearray(1) + self.cmd + payload + bytearray(1) + self.MAGIC_END - self.__payload = payload - self.__calc_length() - self.__calc_checksum() - - def __calc_checksum(self): - checksum = 1 - for i in range(2, self.__data[1] + 2): - checksum += self.__data[i] - self.__data[-3] = checksum & 0xff - - def __calc_length(self): - self.__data[1] = 1 + len(self.__payload) + 1 # cmd + payload + checksum - - def send(self): - if not self.__btle_device.connected: - self.__btle_device.reconnect(self.__btle_device.auto_reconnect_timeout) - - self.__btle_device.write_char.write(self.__data, True) - self.__btle_device.btle_device.waitForNotifications(5) - - - class BTLEHandler(btle.DefaultDelegate): - def __init__(self, btle_device): - btle.DefaultDelegate.__init__(self) - self.btle_device = btle_device - - def handleNotification(self, cHandle, data): - message_type = data[2] - if message_type == 0x00: - if data[4] == 0x01: - print("Checksum error!") - else: - print("Unknown error:", data) - elif message_type == 0x03: #switch toggle - print("Switch toggled") - self.btle_device.getStatus() - elif message_type == 0x04: #status related data - self.btle_device.voltage = data[8] - self.btle_device.current = (data[9] << 8 | data[10]) / 1000 - self.btle_device.power = (data[5] << 16 | data[6] << 8 | data[7]) / 1000 - self.btle_device.frequency = data[11] - self.btle_device.powered = bool(data[4]) - elif message_type == 0x17: - if data[5] == 0x00 or data[5] == 0x01: - if not data[4]: - print("Login successful") - else: - print("Login failed") - else: - print("5th byte of login-response is > 1:", data) - else: - print ("Unknown message from Handle: 0x" + format(cHandle,'02X') + " Value: "+ format(data)) - def getStatus(self): #15, 5, 4, 0, 0, 0, 5, -1, -1 cmd = bytearray([0x04]) @@ -164,14 +78,14 @@ class SEMSocket(): def __reconnect(self): try: - self.btle_device = btle.Peripheral(self.mac_address,addrType=btle.ADDR_TYPE_PUBLIC,iface=0) - self.btle_handler = self.BTLEHandler(self) + self._btle_device = btle.Peripheral(self.mac_address,addrType=btle.ADDR_TYPE_PUBLIC,iface=0) + self._btle_handler = self.BTLEHandler(self) - self.custom_service = self.btle_device.getServiceByUUID(0xfff0) - self.read_char = self.custom_service.getCharacteristics("0000fff1-0000-1000-8000-00805f9b34fb")[0] - self.write_char = self.custom_service.getCharacteristics("0000fff3-0000-1000-8000-00805f9b34fb")[0] - self.notify_char = self.custom_service.getCharacteristics("0000fff4-0000-1000-8000-00805f9b34fb")[0] - self.btle_device.setDelegate(self.btle_handler) + self._custom_service = self._btle_device.getServiceByUUID(0xfff0) + self._read_char = self._custom_service.getCharacteristics("0000fff1-0000-1000-8000-00805f9b34fb")[0] + self._write_char = self._custom_service.getCharacteristics("0000fff3-0000-1000-8000-00805f9b34fb")[0] + self._notify_char = self._custom_service.getCharacteristics("0000fff4-0000-1000-8000-00805f9b34fb")[0] + self._btle_device.setDelegate(self._btle_handler) except btle.BTLEException as e: self.connected = False else: @@ -212,4 +126,88 @@ class SEMSocket(): # self.GetSynConfig() # #self.GetSN() + class NotConnectedException(Exception): + pass + class BTLEMessage(): + MAGIC_START = bytearray([0x0f]) + MAGIC_END = bytearray([0xff, 0xff]) + __data = bytearray() + __cmd = bytearray(1) # cmd cannot be empty + __payload = bytearray() + + def __init__(self, btle_device, cmd=bytearray(), payload=bytearray()): + self.__btle_device = btle_device + self.__cmd = cmd + self.__payload = payload + + @property + def cmd(self): + return self.__cmd + + @cmd.setter + def cmd(self, cmd): + self.__data = self.MAGIC_START + bytearray(1) + cmd + self.__payload + bytearray(1) + self.MAGIC_END + self.__cmd = cmd + self.__calc_length() + self.__calc_checksum() + + @property + def payload(self): + return self.__payload + + @payload.setter + def payload(self, payload): + self.__data = self.MAGIC_START + bytearray(1) + self.__cmd + payload + bytearray(1) + self.MAGIC_END + self.__payload = payload + self.__calc_length() + self.__calc_checksum() + + def __calc_checksum(self): + checksum = 1 + for i in range(2, self.__data[1] + 2): + checksum += self.__data[i] + self.__data[-3] = checksum & 0xff + + def __calc_length(self): + self.__data[1] = 1 + len(self.__payload) + 1 # cmd + payload + checksum + + def send(self): + if not self.__btle_device.connected: + self.__btle_device.reconnect(self.__btle_device.auto_reconnect_timeout) + + self.__btle_device._write_char.write(self.__data, True) + self.__btle_device._btle_device.waitForNotifications(5) + + + class BTLEHandler(btle.DefaultDelegate): + def __init__(self, btle_device): + btle.DefaultDelegate.__init__(self) + self.__btle_device = btle_device + + def handleNotification(self, cHandle, data): + message_type = data[2] + if message_type == 0x00: + if data[4] == 0x01: + print("Checksum error!") + else: + print("Unknown error:", data) + elif message_type == 0x03: #switch toggle + print("Switch toggled") + self.__btle_device.getStatus() + elif message_type == 0x04: #status related data + self.__btle_device.voltage = data[8] + self.__btle_device.current = (data[9] << 8 | data[10]) / 1000 + self.__btle_device.power = (data[5] << 16 | data[6] << 8 | data[7]) / 1000 + self.__btle_device.frequency = data[11] + self.__btle_device.powered = bool(data[4]) + elif message_type == 0x17: + if data[5] == 0x00 or data[5] == 0x01: + if not data[4]: + print("Login successful") + else: + print("Login failed") + else: + print("5th byte of login-response is > 1:", data) + else: + print ("Unknown message from Handle: 0x" + format(cHandle,'02X') + " Value: "+ format(data))