From ed06f884c251b4dd74a26169c2fdf3742a17e8b3 Mon Sep 17 00:00:00 2001 From: sqozz Date: Fri, 17 Jan 2020 22:20:41 +0100 Subject: [PATCH 1/9] Add function to sync the time with the plug --- sem6000.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/sem6000.py b/sem6000.py index 7622a78..ae35642 100644 --- a/sem6000.py +++ b/sem6000.py @@ -1,5 +1,6 @@ from bluepy import btle import time +import datetime import uuid class SEMSocket(): @@ -40,6 +41,17 @@ class SEMSocket(): msg = self.BTLEMessage(self, cmd, payload) msg.send() + def syncTime(self): + #15, 12, 1, 0, SECOND, MINUTE, HOUR_OF_DAY, DAY_OF_MONTH, MONTH (+1), int(YEAR/256), YEAR%256, 0, 0, CHKSUM, 255, 255 + now = datetime.datetime.now() + cmd = bytearray([0x01]) + payload = bytearray([0x00]) + payload += bytearray([now.second, now.minute, now.hour]) + payload += bytearray([now.day, now.month, int(now.year/256), now.year%256]) + payload += bytearray([0x00, 0x00]) + msg = self.BTLEMessage(self, cmd, payload) + msg.send() + def login(self, password): self.password = password cmd = bytearray([0x17]) @@ -189,6 +201,8 @@ class SEMSocket(): print("Checksum error!") else: print("Unknown error:", data) + elif message_type == 0x01: + print("Time synced") elif message_type == 0x03: #switch toggle print("Switch toggled") self.__btle_device.getStatus() -- 2.43.2 From 8f06b28f316d6dacca89d748148909ff321c87ed Mon Sep 17 00:00:00 2001 From: Thomas Kolb Date: Sun, 19 Jan 2020 17:34:18 +0100 Subject: [PATCH 2/9] Added power factor calculation --- sem6000.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/sem6000.py b/sem6000.py index 7622a78..0491ed8 100644 --- a/sem6000.py +++ b/sem6000.py @@ -8,6 +8,7 @@ class SEMSocket(): voltage = 0 current = 0 power = 0 + power_factor = 0 frequency = 0 mac_address = "" custom_service = None @@ -193,11 +194,18 @@ class SEMSocket(): 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 + voltage = data[8] + current = (data[9] << 8 | data[10]) / 1000 + power = (data[5] << 16 | data[6] << 8 | data[7]) / 1000 + + self.__btle_device.voltage = voltage + self.__btle_device.current = current + self.__btle_device.power = power self.__btle_device.frequency = data[11] self.__btle_device.powered = bool(data[4]) + + # calculated values + self.__btle_device.power_factor = power / (voltage * current) elif message_type == 0x17: if data[5] == 0x00 or data[5] == 0x01: if data[4]: -- 2.43.2 From 01cc1ed9b7115ccbcdb4ea466e0aeb76d57a5e1a Mon Sep 17 00:00:00 2001 From: Thomas Kolb Date: Sun, 19 Jan 2020 17:34:57 +0100 Subject: [PATCH 3/9] example: removed invalid constructor argument --- example.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example.py b/example.py index b36b2fd..c7a2a5a 100644 --- a/example.py +++ b/example.py @@ -18,7 +18,7 @@ while True: # -1: infinite retries # integer: seconds before exception is thrown - socket = SEMSocket('f0:c7:7f:0d:e7:17', auto_reconnect_timeout=None) + socket = SEMSocket('f0:c7:7f:0d:e7:17') print("Connected.") #socket.login("1337") -- 2.43.2 From 2f13d6f6a513f20b7e88747a9f802af52d565b9d Mon Sep 17 00:00:00 2001 From: Thomas Kolb Date: Sun, 19 Jan 2020 17:46:55 +0100 Subject: [PATCH 4/9] example: print power factor --- example.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example.py b/example.py index c7a2a5a..5758b0c 100644 --- a/example.py +++ b/example.py @@ -28,7 +28,7 @@ while True: socket.getStatus() socket.setStatus(True) print("=== {} ({}) ===".format(socket.mac_address, "on" if socket.powered else "off")) - print("\t{}V {}A → {}W@{}Hz".format(socket.voltage, socket.current, socket.power, socket.frequency)) + print("\t{}V {}A → {}W@{}Hz (PF: {})".format(socket.voltage, socket.current, socket.power, socket.frequency, socket.power_factor)) except (SEMSocket.NotConnectedException, bluepy.btle.BTLEDisconnectError): print("Restarting...") if socket != None: -- 2.43.2 From 7b82461f032f543d20482829abaca49a4002ef60 Mon Sep 17 00:00:00 2001 From: Thomas Kolb Date: Sun, 19 Jan 2020 17:48:02 +0100 Subject: [PATCH 5/9] example: restart on BrokenPipeError --- example.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example.py b/example.py index 5758b0c..b8cd2f5 100644 --- a/example.py +++ b/example.py @@ -29,7 +29,7 @@ while True: socket.setStatus(True) print("=== {} ({}) ===".format(socket.mac_address, "on" if socket.powered else "off")) print("\t{}V {}A → {}W@{}Hz (PF: {})".format(socket.voltage, socket.current, socket.power, socket.frequency, socket.power_factor)) - except (SEMSocket.NotConnectedException, bluepy.btle.BTLEDisconnectError): + except (SEMSocket.NotConnectedException, bluepy.btle.BTLEDisconnectError, BrokenPipeError): print("Restarting...") if socket != None: socket.disconnect() -- 2.43.2 From 63b066511af611af907095c03fa65503cc96083e Mon Sep 17 00:00:00 2001 From: Thomas Kolb Date: Sun, 19 Jan 2020 17:54:18 +0100 Subject: [PATCH 6/9] Ignore some files in Git Specifically compiled Python code and Vim swap files. --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..36e90e3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +__pycache__/ +*.pyc + +.*.sw? -- 2.43.2 From 101d4f41493e5447d4f75d7b649d3c446fb9e6e3 Mon Sep 17 00:00:00 2001 From: sqozz Date: Fri, 17 Jan 2020 22:25:54 +0100 Subject: [PATCH 7/9] Add parsing of the total consumed power --- sem6000.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/sem6000.py b/sem6000.py index 0491ed8..51a0d86 100644 --- a/sem6000.py +++ b/sem6000.py @@ -9,6 +9,7 @@ class SEMSocket(): current = 0 power = 0 power_factor = 0 + total_power = 0 frequency = 0 mac_address = "" custom_service = None @@ -194,15 +195,17 @@ class SEMSocket(): print("Switch toggled") self.__btle_device.getStatus() elif message_type == 0x04: #status related data - voltage = data[8] - current = (data[9] << 8 | data[10]) / 1000 - power = (data[5] << 16 | data[6] << 8 | data[7]) / 1000 + voltage = data[8] + current = (data[9] << 8 | data[10]) / 1000 + power = (data[5] << 16 | data[6] << 8 | data[7]) / 1000 + total_power = (data[14] << 24 | data[15] << 16 | data[16] << 8 | data[17]) / 1000 self.__btle_device.voltage = voltage self.__btle_device.current = current self.__btle_device.power = power self.__btle_device.frequency = data[11] self.__btle_device.powered = bool(data[4]) + self.__btle_device.total_power = total_power # calculated values self.__btle_device.power_factor = power / (voltage * current) -- 2.43.2 From 6f810c949b747f5647e41c5e550f75661c87ebe4 Mon Sep 17 00:00:00 2001 From: sqozz Date: Mon, 20 Jan 2020 21:29:20 +0100 Subject: [PATCH 8/9] Fix ZeroDivisionError if plug is powered off --- sem6000.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sem6000.py b/sem6000.py index 51a0d86..df90f0a 100644 --- a/sem6000.py +++ b/sem6000.py @@ -208,7 +208,10 @@ class SEMSocket(): self.__btle_device.total_power = total_power # calculated values - self.__btle_device.power_factor = power / (voltage * current) + try: + self.__btle_device.power_factor = power / (voltage * current) + except ZeroDivisionError: + self.__btle_device.power_factor = None elif message_type == 0x17: if data[5] == 0x00 or data[5] == 0x01: if data[4]: -- 2.43.2 From a0874625c7d6d2bb1d0594145f2a4a6d351de458 Mon Sep 17 00:00:00 2001 From: Thomas Kolb Date: Tue, 28 Jan 2020 15:54:36 +0100 Subject: [PATCH 9/9] fix: use function parameter in changePassword() --- sem6000.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sem6000.py b/sem6000.py index df90f0a..2472775 100644 --- a/sem6000.py +++ b/sem6000.py @@ -63,7 +63,7 @@ class SEMSocket(): payload.append(0x00) payload.append(0x01) for i in range(4): - payload.append(int(self.newPassword[i])) + payload.append(int(newPassword[i])) for i in range(4): payload.append(int(self.password[i])) self.password = newPassword -- 2.43.2