From 42561faf7c9caeb6edbad8703c651c985c6db1b9 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Sat, 21 Nov 2020 09:52:32 +0100 Subject: [PATCH 01/58] Edit description --- pyvlx/frames/frame_reboot.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyvlx/frames/frame_reboot.py b/pyvlx/frames/frame_reboot.py index 26382d77..49672897 100644 --- a/pyvlx/frames/frame_reboot.py +++ b/pyvlx/frames/frame_reboot.py @@ -5,7 +5,7 @@ class FrameGatewayRebootRequest(FrameBase): - """Frame for requesting version.""" + """Frame for requesting reboot.""" PAYLOAD_LEN = 0 @@ -19,7 +19,7 @@ def __str__(self): class FrameGatewayRebootConfirmation(FrameBase): - """Frame for response for get version requests.""" + """Frame for response for get reboot requests.""" PAYLOAD_LEN = 0 From 9ef18bf3174ef646b13d057010c2b459f025cf7e Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Sat, 21 Nov 2020 10:07:18 +0100 Subject: [PATCH 02/58] Add Frame Definitions for pyvlx/frames/frame_facory_default.py pyvlx/frames/frame_get_local_time.py pyvlx/frames/frame_get_network_setup.py pyvlx/frames/frame_leave_learn_state.py pyvlx/frames/frame_password_change.py --- pyvlx/frames/__init__.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pyvlx/frames/__init__.py b/pyvlx/frames/__init__.py index d8f5f9ec..4fd36d59 100644 --- a/pyvlx/frames/__init__.py +++ b/pyvlx/frames/__init__.py @@ -55,3 +55,13 @@ SetNodeNameConfirmationStatus) from .frame_set_utc_cfm import FrameSetUTCConfirmation from .frame_set_utc_req import FrameSetUTCRequest +from .frame_leave_learn_state import ( + FrameLeaveLearnStateRequest, FrameLeaveLearnStateConfirmation, + LeaveLearnStateConfirmationStatus) +from .frame_get_local_time import ( + FrameGetLocalTimeRequest, FrameGetLocalTimeConfirmation) +from .frame_facory_default import ( + FrameGatewayFactoryDefaultRequest, FrameGatewayFactoryDefaultConfirmation) +from .frame_password_change import ( + FramePasswordChangeRequest, FramePasswordChangeConfirmation, + FramePasswordChangeNotification, PasswordChangeConfirmationStatus) From 164e7bb0ef27aca60441c815161db7226be22b69 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Sat, 21 Nov 2020 10:26:25 +0100 Subject: [PATCH 03/58] Edit Typo --- pyvlx/frames/frame_reboot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyvlx/frames/frame_reboot.py b/pyvlx/frames/frame_reboot.py index 49672897..68759425 100644 --- a/pyvlx/frames/frame_reboot.py +++ b/pyvlx/frames/frame_reboot.py @@ -19,7 +19,7 @@ def __str__(self): class FrameGatewayRebootConfirmation(FrameBase): - """Frame for response for get reboot requests.""" + """Frame for response for reboot requests.""" PAYLOAD_LEN = 0 From a3a763f43b0edaebb6ed0f648437a74f4a88802e Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Sat, 21 Nov 2020 10:26:54 +0100 Subject: [PATCH 04/58] add new Frames --- pyvlx/frames/frame_facory_default.py | 32 +++++++ pyvlx/frames/frame_get_local_time.py | 60 +++++++++++++ pyvlx/frames/frame_get_network_setup.py | 71 +++++++++++++++ pyvlx/frames/frame_leave_learn_state.py | 46 ++++++++++ pyvlx/frames/frame_password_change.py | 111 ++++++++++++++++++++++++ 5 files changed, 320 insertions(+) create mode 100644 pyvlx/frames/frame_facory_default.py create mode 100644 pyvlx/frames/frame_get_local_time.py create mode 100644 pyvlx/frames/frame_get_network_setup.py create mode 100644 pyvlx/frames/frame_leave_learn_state.py create mode 100644 pyvlx/frames/frame_password_change.py diff --git a/pyvlx/frames/frame_facory_default.py b/pyvlx/frames/frame_facory_default.py new file mode 100644 index 00000000..e9e1e39b --- /dev/null +++ b/pyvlx/frames/frame_facory_default.py @@ -0,0 +1,32 @@ +"""Module for reboot frame classes.""" +from pyvlx.const import Command + +from .frame import FrameBase + + +class FrameGatewayFactoryDefaultRequest(FrameBase): + """Frame for requesting factory reset.""" + + PAYLOAD_LEN = 0 + + def __init__(self): + """Init Frame.""" + super().__init__(Command.GW_SET_FACTORY_DEFAULT_REQ) + + def __str__(self): + """Return human readable string.""" + return "" + + +class FrameGatewayFactoryDefaultConfirmation(FrameBase): + """Frame for response for factory reset.""" + + PAYLOAD_LEN = 0 + + def __init__(self): + """Init Frame.""" + super().__init__(Command.GW_SET_FACTORY_DEFAULT_CFM) + + def __str__(self): + """Return human readable string.""" + return "" diff --git a/pyvlx/frames/frame_get_local_time.py b/pyvlx/frames/frame_get_local_time.py new file mode 100644 index 00000000..d78805c9 --- /dev/null +++ b/pyvlx/frames/frame_get_local_time.py @@ -0,0 +1,60 @@ +"""Module for get local time classes.""" +#import struct +from enum import Enum +import time +from pyvlx.const import Command + +from .frame import FrameBase + + +class FrameGetLocalTimeRequest(FrameBase): + """Frame for requesting local time.""" + + PAYLOAD_LEN = 0 + + def __init__(self): + """Init Frame.""" + super().__init__(Command.GW_GET_LOCAL_TIME_REQ) + + +class FrameGetLocalTimeConfirmation(FrameBase): + """Frame for response for get local time requests.""" + + PAYLOAD_LEN = 15 + + def __init__(self): + """Init Frame.""" + super().__init__(Command.GW_GET_LOCAL_TIME_CFM) + self.utctime = 0 + self.second = 0 + self.minute = 0 + self.hour = 0 + self.dayofmonth = 0 + self.month = 0 + self.year = 0 + self.weekday = 0 + self.dayofyear = 0 + self.daylightsavingflag = 0 + + def get_payload(self): + """Return Payload.""" + return + + def from_payload(self, payload): + """Init frame from binary data.""" + self.utctime = int.from_bytes(payload[0:4], byteorder='big', signed=True) + self.second = payload[4] + self.minute = payload[5] + self.hour = payload[6] + self.dayofmonth = payload[7] + self.month = payload[8] + self.year = int.from_bytes(payload[9:11], byteorder='big', signed=True) + self.weekday = payload[11] + self.dayofyear =int.from_bytes( payload[12:14], byteorder='big', signed=True) + self.daylightsavingflag = int.from_bytes(payload[14:15], byteorder='big', signed=True) + + def __str__(self): + """Return human readable string.""" + return ''.format( + self.utctime, self.second, self.minute, self.hour, self.dayofmonth, self.month, self.year, self.weekday ,self.dayofyear, self.daylightsavingflag + ) diff --git a/pyvlx/frames/frame_get_network_setup.py b/pyvlx/frames/frame_get_network_setup.py new file mode 100644 index 00000000..ac7b272e --- /dev/null +++ b/pyvlx/frames/frame_get_network_setup.py @@ -0,0 +1,71 @@ +"""Frames for receiving network setup from gateway.""" +from enum import Enum + +from pyvlx.const import Command + +from .frame import FrameBase + + +class FrameGetNetworkSetupRequest(FrameBase): + """Frame for requesting network setup.""" + + PAYLOAD_LEN = 0 + + def __init__(self): + """Init Frame.""" + super().__init__(Command.GW_GET_NETWORK_SETUP_REQ) + + +class DHCPParameter(Enum): + """Enum class for dncp network setup of gateway.""" + DISABLE = 0x00 + ENABLE = 0x01 + + +class FrameGetNetworkSetupConfirmation(FrameBase): + """Frame for confirmation for get network setup requests.""" + + PAYLOAD_LEN = 13 + + def __init__(self, ipaddress = bytes(4), netmask = bytes(4), gateway = bytes(4), dhcp = DHCPParameter.DISABLE): + """Init Frame.""" + super().__init__(Command.GW_GET_NETWORK_SETUP_CFM) + self._ipaddress = ipaddress + self._netmask = netmask + self._gateway = gateway + self.dhcp = DHCPParameter(dhcp) + + @property + def ipaddress(self): + """Return ipaddress as human readable string.""" + return ".".join(str(c) for c in self._ipaddress) + + @property + def netmask(self): + """Return ipaddress as human readable string.""" + return ".".join(str(c) for c in self._netmask) + + @property + def gateway(self): + """Return ipaddress as human readable string.""" + return ".".join(str(c) for c in self._gateway) + + def get_payload(self): + """Return Payload.""" + payload = bytes([self._ipaddress.value, self._netmask.value, self._gateway.value, self.dhcp.value]) + return payload + + def from_payload(self, payload): + """Init frame from binary data.""" + + self._ipaddress = payload[0:4] + self._netmask = payload[4:8] + self._gateway = payload[8:12] + self.dhcp = DHCPParameter(payload[12]) + + + def __str__(self): + """Return human readable string.""" + return ''.format( + self.ipaddress, self.netmask, self.gateway, self.dhcp + ) diff --git a/pyvlx/frames/frame_leave_learn_state.py b/pyvlx/frames/frame_leave_learn_state.py new file mode 100644 index 00000000..4b95f6e9 --- /dev/null +++ b/pyvlx/frames/frame_leave_learn_state.py @@ -0,0 +1,46 @@ +"""Module for leave learn state frame classes.""" +from enum import Enum +from pyvlx.const import Command +from .frame import FrameBase + +class LeaveLearnStateConfirmationStatus(Enum): + """Enum class for status of password enter confirmation.""" + FAILED = 0 + SUCCESSFUL = 1 + +class FrameLeaveLearnStateRequest(FrameBase): + """Frame for leaving learn state request.""" + + PAYLOAD_LEN = 0 + + def __init__(self): + """Init Frame.""" + super().__init__(Command.GW_LEAVE_LEARN_STATE_REQ) + + def __str__(self): + """Return human readable string.""" + return "" + + + +class FrameLeaveLearnStateConfirmation(FrameBase): + """Frame for confirmation for leaving learn State.""" + + PAYLOAD_LEN = 1 + + def __init__(self, status=0): + """Init Frame.""" + super().__init__(Command.GW_LEAVE_LEARN_STATE_CFM) + self.status = LeaveLearnStateConfirmationStatus(status) + + def get_payload(self): + """Return Payload.""" + return bytes([self.status.value]) + + def from_payload(self, payload): + """Init frame from binary data.""" + self.status = LeaveLearnStateConfirmationStatus(payload[0]) + + def __str__(self): + """Return human readable string.""" + return "<{} status={}/>".format(self.__class__.__name__, self.status) diff --git a/pyvlx/frames/frame_password_change.py b/pyvlx/frames/frame_password_change.py new file mode 100644 index 00000000..76b86702 --- /dev/null +++ b/pyvlx/frames/frame_password_change.py @@ -0,0 +1,111 @@ +"""Module for password enter frame classes.""" +from enum import Enum + +from pyvlx.const import Command +from pyvlx.exception import PyVLXException +from pyvlx.string_helper import bytes_to_string, string_to_bytes + +from .frame import FrameBase + + +class FramePasswordChangeRequest(FrameBase): + """Frame for sending password enter request.""" + + MAX_SIZE = 32 + PAYLOAD_LEN = 64 + + def __init__(self, currentpassword=None, newpassword=None): + """Init Frame.""" + super().__init__(Command.GW_PASSWORD_CHANGE_REQ) + self.currentpassword = currentpassword + self.newpassword = newpassword + + def get_payload(self): + """Return Payload.""" + if self.currentpassword is None: + raise PyVLXException("currentpassword is none") + if self.newpassword is None: + raise PyVLXException("newpassword is none") + if len(self.currentpassword) > self.MAX_SIZE: + raise PyVLXException("currentpassword is too long") + if len(self.newpassword) > self.MAX_SIZE: + raise PyVLXException("newpassword is too long") + + return string_to_bytes(self.currentpassword, self.MAX_SIZE)+string_to_bytes(self.newpassword, self.MAX_SIZE) + + def from_payload(self, payload): + """Init frame from binary data.""" + self.currentpassword = bytes_to_string(payload[0:33]) + self.newpassword = bytes_to_string(payload[33:]) + + def __str__(self): + """Return human readable string.""" + currentpassword_esc = ( + None if self.currentpassword is None else "{}****".format(self.currentpassword[:2]) + ) + newpassword_esc = ( + None if self.newpassword is None else "{}****".format(self.newpassword[:2]) + ) + return "<{} currentpassword={} newpassword={}/>".format(self.__class__.__name__,currentpassword_esc, newpassword_esc) + + +class PasswordChangeConfirmationStatus(Enum): + """Enum class for status of password change confirmation.""" + + SUCCESSFUL = 0 + FAILED = 1 + + +class FramePasswordChangeConfirmation(FrameBase): + """Frame for confirmation for sent password.""" + + PAYLOAD_LEN = 1 + + def __init__(self, status=PasswordChangeConfirmationStatus.SUCCESSFUL): + """Init Frame.""" + super().__init__(Command.GW_PASSWORD_CHANGE_CFM) + self.status = status + + def get_payload(self): + """Return Payload.""" + return bytes([self.status.value]) + + def from_payload(self, payload): + """Init frame from binary data.""" + self.status = PasswordChangeConfirmationStatus(payload[0]) + + def __str__(self): + """Return human readable string.""" + return "<{} status='{}'/>".format(self.__class__.__name__, self.status) + + + +class FramePasswordChangeNotification(FrameBase): + """Frame for sending password changed notification request.""" + MAX_SIZE = 32 + PAYLOAD_LEN = 32 + + def __init__(self, currentpassword=None): + """Init Frame.""" + super().__init__(Command.GW_PASSWORD_CHANGED_NTF) + self.password = None + + def get_payload(self): + """Return Payload.""" + if self.password is None: + raise PyVLXException("password is none") + if len(self.password) > self.MAX_SIZE: + raise PyVLXException("password is too long") + + return string_to_bytes(self.password, self.MAX_SIZE) + + def from_payload(self, payload): + """Init frame from binary data.""" + self.password = bytes_to_string(payload) + + def __str__(self): + """Return human readable string.""" + password_esc = ( + None if self.password is None else "{}****".format(self.password[:2]) + ) + return "<{} password={} />".format(self.__class__.__name__,password_esc) From 5f6fd989d8206b5724a0fb3cf1d9ee5631f770d4 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Sat, 21 Nov 2020 10:45:30 +0100 Subject: [PATCH 05/58] Edit Typo --- pyvlx/const.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyvlx/const.py b/pyvlx/const.py index 432bbca4..8136288d 100644 --- a/pyvlx/const.py +++ b/pyvlx/const.py @@ -28,9 +28,9 @@ class Command(Enum): GW_LEAVE_LEARN_STATE_CFM = 0x000F GW_GET_NETWORK_SETUP_REQ = 0x00E0 - GE_GET_NETWORK_SETUP_CFM = 0x00E1 + GW_GET_NETWORK_SETUP_CFM = 0x00E1 GW_SET_NETWORK_SETUP_REQ = 0x00E2 - GE_SET_NETWORK_SETUP_CFM = 0x00E3 + GW_SET_NETWORK_SETUP_CFM = 0x00E3 GW_CS_GET_SYSTEMTABLE_DATQ_REQ = 0x0100 GW_CS_GET_SYSTEMTABLE_DATA_CFM = 0x0101 From df6b0a42a51ed29ad4f078bd5f12c2d748f845d2 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Sat, 21 Nov 2020 10:46:41 +0100 Subject: [PATCH 06/58] Edit Typo --- pyvlx/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyvlx/const.py b/pyvlx/const.py index 8136288d..a71e4c98 100644 --- a/pyvlx/const.py +++ b/pyvlx/const.py @@ -219,7 +219,7 @@ class Command(Enum): GW_PASSWORD_CHANGE_REQ = 0x3002 GW_PASSWORD_CHANGE_CFM = 0x3003 - GW_PASSWORD_CHANGED_NTF = 0x3004 + GW_PASSWORD_CHANGE_NTF = 0x3004 class Originator(Enum): From 0c1758ef40feb7e99de8d694ca3132676819f696 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Sat, 21 Nov 2020 10:48:11 +0100 Subject: [PATCH 07/58] Add new Frames to Package and Factory --- pyvlx/frame_creation.py | 42 ++++++++++++++++++++++++++++++++++++---- pyvlx/frames/__init__.py | 2 ++ 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/pyvlx/frame_creation.py b/pyvlx/frame_creation.py index 25574599..ff1b65b0 100644 --- a/pyvlx/frame_creation.py +++ b/pyvlx/frame_creation.py @@ -21,11 +21,17 @@ FrameHouseStatusMonitorEnableConfirmation, FrameHouseStatusMonitorEnableRequest, FrameNodeInformationChangedNotification, - FrameNodeStatePositionChangedNotification, FramePasswordEnterConfirmation, - FramePasswordEnterRequest, FrameSessionFinishedNotification, + FrameNodeStatePositionChangedNotification, + FramePasswordEnterConfirmation, FramePasswordEnterRequest, + FramePasswordChangeRequest, FramePasswordChangeConfirmation, FramePasswordChangeNotification, + FrameSessionFinishedNotification, FrameSetNodeNameConfirmation, FrameSetNodeNameRequest, - FrameSetUTCConfirmation, FrameSetUTCRequest, extract_from_frame) - + FrameGetNetworkSetupConfirmation, FrameGetNetworkSetupRequest, + FrameSetUTCConfirmation, FrameSetUTCRequest, extract_from_frame, + FrameLeaveLearnStateConfirmation, FrameLeaveLearnStateRequest, + FrameGetLocalTimeConfirmation, FrameGetLocalTimeRequest, + FrameGatewayFactoryDefaultConfirmation, FrameGatewayFactoryDefaultRequest + ) from .const import Command from .log import PYVLXLOG @@ -67,11 +73,30 @@ def create_frame(command): if command == Command.GW_PASSWORD_ENTER_CFM: return FramePasswordEnterConfirmation() + if command == Command.GW_PASSWORD_CHANGE_REQ: + return FramePasswordChangeRequest() + if command == Command.GW_PASSWORD_CHANGE_CFM: + return FramePasswordChangeConfirmation() + if command == Command.GW_PASSWORD_CHANGE_NTF: + return FramePasswordChangeNotification() + + + if command == Command.GW_REBOOT_REQ: return FrameGatewayRebootRequest() if command == Command.GW_REBOOT_CFM: return FrameGatewayRebootConfirmation() + if command == Command.GW_SET_FACTORY_DEFAULT_REQ: + return FrameGatewayFactoryDefaultRequest() + if command == Command.GW_REBOOT_CFM: + return FrameGatewayFactoryDefaultConfirmation() + + if command == Command.GW_GET_LOCAL_TIME_REQ: + return FrameGetLocalTimeRequest() + if command == Command.GW_GET_LOCAL_TIME_CFM: + return FrameGetLocalTimeConfirmation() + if command == Command.GW_CS_DISCOVER_NODES_REQ: return FrameDiscoverNodesRequest() if command == Command.GW_CS_DISCOVER_NODES_CFM: @@ -129,6 +154,11 @@ def create_frame(command): if command == Command.GW_GET_STATE_CFM: return FrameGetStateConfirmation() + if command == Command.GW_GET_NETWORK_SETUP_REQ: + return FrameGetNetworkSetupRequest() + if command == Command.GW_GET_NETWORK_SETUP_CFM: + return FrameGetNetworkSetupConfirmation() + if command == Command.GW_SET_UTC_REQ: return FrameSetUTCRequest() if command == Command.GW_SET_UTC_CFM: @@ -148,5 +178,9 @@ def create_frame(command): if command == Command.GW_NODE_STATE_POSITION_CHANGED_NTF: return FrameNodeStatePositionChangedNotification() + if command == Command.GW_LEAVE_LEARN_STATE_CFM: + return FrameLeaveLearnStateConfirmation() + if command == command.GW_LEAVE_LEARN_STATE_REQ: + return FrameLeaveLearnStateRequest() return None diff --git a/pyvlx/frames/__init__.py b/pyvlx/frames/__init__.py index 4fd36d59..84d11b29 100644 --- a/pyvlx/frames/__init__.py +++ b/pyvlx/frames/__init__.py @@ -30,6 +30,8 @@ from .frame_get_state import ( FrameGetStateConfirmation, FrameGetStateRequest, GatewayState, GatewaySubState) +from .frame_get_network_setup import ( + FrameGetNetworkSetupConfirmation, FrameGetNetworkSetupRequest, DHCPParameter) from .frame_get_version import ( FrameGetVersionConfirmation, FrameGetVersionRequest) from .frame_helper import calc_crc, extract_from_frame From 9e0f291eb8e6226f045b7dd0e1b9badad27a44ed Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Sat, 21 Nov 2020 10:49:34 +0100 Subject: [PATCH 08/58] Remove Whitspace --- pyvlx/frame_creation.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/pyvlx/frame_creation.py b/pyvlx/frame_creation.py index ff1b65b0..a2aaddaf 100644 --- a/pyvlx/frame_creation.py +++ b/pyvlx/frame_creation.py @@ -79,8 +79,6 @@ def create_frame(command): return FramePasswordChangeConfirmation() if command == Command.GW_PASSWORD_CHANGE_NTF: return FramePasswordChangeNotification() - - if command == Command.GW_REBOOT_REQ: return FrameGatewayRebootRequest() From 838a32f1bbb4327465c864e49d83d514b4f6411e Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Sat, 21 Nov 2020 10:53:40 +0100 Subject: [PATCH 09/58] Move Class AliasArray to Frame Package --- pyvlx/frames/__init__.py | 1 + pyvlx/{ => frames}/alias_array.py | 2 +- pyvlx/frames/frame_get_all_nodes_information.py | 2 +- pyvlx/frames/frame_get_node_information.py | 2 +- test/alias_array_test.py | 2 +- test/frame_get_all_nodes_information_ntf_test.py | 2 +- test/frame_get_node_information_ntf_test.py | 2 +- 7 files changed, 7 insertions(+), 6 deletions(-) rename pyvlx/{ => frames}/alias_array.py (97%) diff --git a/pyvlx/frames/__init__.py b/pyvlx/frames/__init__.py index 84d11b29..13ef4906 100644 --- a/pyvlx/frames/__init__.py +++ b/pyvlx/frames/__init__.py @@ -2,6 +2,7 @@ # flake8: noqa from .frame import FrameBase +from .alias_array import AliasArray from .frame_activate_scene import ( ActivateSceneConfirmationStatus, FrameActivateSceneConfirmation, FrameActivateSceneRequest) diff --git a/pyvlx/alias_array.py b/pyvlx/frames/alias_array.py similarity index 97% rename from pyvlx/alias_array.py rename to pyvlx/frames/alias_array.py index 6b1e245e..c08f9345 100644 --- a/pyvlx/alias_array.py +++ b/pyvlx/frames/alias_array.py @@ -1,5 +1,5 @@ """Module for storing alias array.""" -from .exception import PyVLXException +from pyvlx.exception import PyVLXException class AliasArray: diff --git a/pyvlx/frames/frame_get_all_nodes_information.py b/pyvlx/frames/frame_get_all_nodes_information.py index 16e9b7bc..6762d500 100644 --- a/pyvlx/frames/frame_get_all_nodes_information.py +++ b/pyvlx/frames/frame_get_all_nodes_information.py @@ -3,7 +3,7 @@ from datetime import datetime from enum import Enum -from pyvlx.alias_array import AliasArray +from pyvlx.frames.alias_array import AliasArray from pyvlx.const import Command, NodeTypeWithSubtype, NodeVariation, Velocity from pyvlx.exception import PyVLXException from pyvlx.parameter import Parameter diff --git a/pyvlx/frames/frame_get_node_information.py b/pyvlx/frames/frame_get_node_information.py index 7c114dfe..592cf1fb 100644 --- a/pyvlx/frames/frame_get_node_information.py +++ b/pyvlx/frames/frame_get_node_information.py @@ -3,7 +3,7 @@ from datetime import datetime from enum import Enum -from pyvlx.alias_array import AliasArray +from pyvlx.frames.alias_array import AliasArray from pyvlx.const import Command, NodeTypeWithSubtype, NodeVariation, Velocity from pyvlx.exception import PyVLXException from pyvlx.parameter import Parameter diff --git a/test/alias_array_test.py b/test/alias_array_test.py index b344bf25..27847a7c 100644 --- a/test/alias_array_test.py +++ b/test/alias_array_test.py @@ -1,7 +1,7 @@ """Unit tests for AliasArray module.""" import unittest -from pyvlx.alias_array import AliasArray +from pyvlx.frames.alias_array import AliasArray from pyvlx.exception import PyVLXException diff --git a/test/frame_get_all_nodes_information_ntf_test.py b/test/frame_get_all_nodes_information_ntf_test.py index 0509c320..fe540718 100644 --- a/test/frame_get_all_nodes_information_ntf_test.py +++ b/test/frame_get_all_nodes_information_ntf_test.py @@ -2,7 +2,7 @@ import unittest from datetime import datetime -from pyvlx.alias_array import AliasArray +from pyvlx.frames.alias_array import AliasArray from pyvlx.const import NodeTypeWithSubtype, NodeVariation, Velocity from pyvlx.exception import PyVLXException from pyvlx.frame_creation import frame_from_raw diff --git a/test/frame_get_node_information_ntf_test.py b/test/frame_get_node_information_ntf_test.py index 9cdddafd..153d3f9e 100644 --- a/test/frame_get_node_information_ntf_test.py +++ b/test/frame_get_node_information_ntf_test.py @@ -2,7 +2,7 @@ import unittest from datetime import datetime -from pyvlx.alias_array import AliasArray +from pyvlx.frames.alias_array import AliasArray from pyvlx.const import NodeTypeWithSubtype, NodeVariation, Velocity from pyvlx.exception import PyVLXException from pyvlx.frame_creation import frame_from_raw From 780cae811d8d7a26f22ae03d85fae0c0a403a941 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Sat, 21 Nov 2020 12:48:26 +0100 Subject: [PATCH 10/58] Change Structure to ApiEvent > Frames Add Api Functionality for KLF200 Commands --- pyvlx/__init__.py | 1 + pyvlx/api/__init__.py | 23 +++++++++ pyvlx/{ => api}/activate_scene.py | 0 pyvlx/{ => api}/api_event.py | 0 pyvlx/{ => api}/command_send.py | 6 +-- pyvlx/api/factory_default.py | 27 ++++++++++ pyvlx/{ => api}/frame_creation.py | 6 +-- pyvlx/{ => api}/frames/__init__.py | 0 pyvlx/{ => api}/frames/alias_array.py | 0 pyvlx/{ => api}/frames/frame.py | 0 .../{ => api}/frames/frame_activate_scene.py | 0 .../frames/frame_activation_log_updated.py | 0 pyvlx/{ => api}/frames/frame_command_send.py | 0 .../{ => api}/frames/frame_discover_nodes.py | 0 .../frames/frame_error_notification.py | 0 .../{ => api}/frames/frame_facory_default.py | 0 .../frames/frame_get_all_nodes_information.py | 0 .../{ => api}/frames/frame_get_local_time.py | 0 .../frames/frame_get_network_setup.py | 0 .../frames/frame_get_node_information.py | 0 .../frames/frame_get_protocol_version.py | 0 .../{ => api}/frames/frame_get_scene_list.py | 0 pyvlx/{ => api}/frames/frame_get_state.py | 0 pyvlx/{ => api}/frames/frame_get_version.py | 0 pyvlx/{ => api}/frames/frame_helper.py | 0 .../frame_house_status_monitor_disable_cfm.py | 0 .../frame_house_status_monitor_disable_req.py | 0 .../frame_house_status_monitor_enable_cfm.py | 0 .../frame_house_status_monitor_enable_req.py | 0 .../frames/frame_leave_learn_state.py | 0 .../frames/frame_node_information_changed.py | 0 ...ode_state_position_changed_notification.py | 0 .../{ => api}/frames/frame_password_change.py | 0 .../{ => api}/frames/frame_password_enter.py | 0 pyvlx/{ => api}/frames/frame_reboot.py | 0 pyvlx/{ => api}/frames/frame_set_node_name.py | 0 pyvlx/{ => api}/frames/frame_set_utc_cfm.py | 0 pyvlx/{ => api}/frames/frame_set_utc_req.py | 0 pyvlx/{ => api}/get_all_nodes_information.py | 2 +- pyvlx/api/get_local_time.py | 48 ++++++++++++++++++ pyvlx/api/get_network_setup.py | 42 ++++++++++++++++ pyvlx/{ => api}/get_node_information.py | 0 pyvlx/{ => api}/get_protocol_version.py | 0 pyvlx/{ => api}/get_scene_list.py | 0 pyvlx/{ => api}/get_state.py | 0 pyvlx/{ => api}/get_version.py | 0 pyvlx/{ => api}/house_status_monitor.py | 2 +- pyvlx/api/leave_learn_state.py | 50 +++++++++++++++++++ pyvlx/{ => api}/login.py | 5 +- pyvlx/api/password_enter.py | 33 ++++++++++++ pyvlx/{ => api}/reboot.py | 0 pyvlx/{ => api}/session_id.py | 0 pyvlx/{ => api}/set_node_name.py | 0 pyvlx/{ => api}/set_utc.py | 0 pyvlx/heartbeat.py | 2 +- pyvlx/lightening_device.py | 2 +- pyvlx/node.py | 2 +- pyvlx/node_helper.py | 20 ++++---- pyvlx/node_updater.py | 12 ++--- pyvlx/nodes.py | 4 +- pyvlx/on_off_switch.py | 2 +- pyvlx/opening_device.py | 18 +++---- pyvlx/pyvlx.py | 12 ++--- pyvlx/scene.py | 2 +- pyvlx/scenes.py | 2 +- 65 files changed, 273 insertions(+), 50 deletions(-) create mode 100644 pyvlx/api/__init__.py rename pyvlx/{ => api}/activate_scene.py (100%) rename pyvlx/{ => api}/api_event.py (100%) rename pyvlx/{ => api}/command_send.py (95%) create mode 100644 pyvlx/api/factory_default.py rename pyvlx/{ => api}/frame_creation.py (98%) rename pyvlx/{ => api}/frames/__init__.py (100%) rename pyvlx/{ => api}/frames/alias_array.py (100%) rename pyvlx/{ => api}/frames/frame.py (100%) rename pyvlx/{ => api}/frames/frame_activate_scene.py (100%) rename pyvlx/{ => api}/frames/frame_activation_log_updated.py (100%) rename pyvlx/{ => api}/frames/frame_command_send.py (100%) rename pyvlx/{ => api}/frames/frame_discover_nodes.py (100%) rename pyvlx/{ => api}/frames/frame_error_notification.py (100%) rename pyvlx/{ => api}/frames/frame_facory_default.py (100%) rename pyvlx/{ => api}/frames/frame_get_all_nodes_information.py (100%) rename pyvlx/{ => api}/frames/frame_get_local_time.py (100%) rename pyvlx/{ => api}/frames/frame_get_network_setup.py (100%) rename pyvlx/{ => api}/frames/frame_get_node_information.py (100%) rename pyvlx/{ => api}/frames/frame_get_protocol_version.py (100%) rename pyvlx/{ => api}/frames/frame_get_scene_list.py (100%) rename pyvlx/{ => api}/frames/frame_get_state.py (100%) rename pyvlx/{ => api}/frames/frame_get_version.py (100%) rename pyvlx/{ => api}/frames/frame_helper.py (100%) rename pyvlx/{ => api}/frames/frame_house_status_monitor_disable_cfm.py (100%) rename pyvlx/{ => api}/frames/frame_house_status_monitor_disable_req.py (100%) rename pyvlx/{ => api}/frames/frame_house_status_monitor_enable_cfm.py (100%) rename pyvlx/{ => api}/frames/frame_house_status_monitor_enable_req.py (100%) rename pyvlx/{ => api}/frames/frame_leave_learn_state.py (100%) rename pyvlx/{ => api}/frames/frame_node_information_changed.py (100%) rename pyvlx/{ => api}/frames/frame_node_state_position_changed_notification.py (100%) rename pyvlx/{ => api}/frames/frame_password_change.py (100%) rename pyvlx/{ => api}/frames/frame_password_enter.py (100%) rename pyvlx/{ => api}/frames/frame_reboot.py (100%) rename pyvlx/{ => api}/frames/frame_set_node_name.py (100%) rename pyvlx/{ => api}/frames/frame_set_utc_cfm.py (100%) rename pyvlx/{ => api}/frames/frame_set_utc_req.py (100%) rename pyvlx/{ => api}/get_all_nodes_information.py (98%) create mode 100644 pyvlx/api/get_local_time.py create mode 100644 pyvlx/api/get_network_setup.py rename pyvlx/{ => api}/get_node_information.py (100%) rename pyvlx/{ => api}/get_protocol_version.py (100%) rename pyvlx/{ => api}/get_scene_list.py (100%) rename pyvlx/{ => api}/get_state.py (100%) rename pyvlx/{ => api}/get_version.py (100%) rename pyvlx/{ => api}/house_status_monitor.py (98%) create mode 100644 pyvlx/api/leave_learn_state.py rename pyvlx/{ => api}/login.py (93%) create mode 100644 pyvlx/api/password_enter.py rename pyvlx/{ => api}/reboot.py (100%) rename pyvlx/{ => api}/session_id.py (100%) rename pyvlx/{ => api}/set_node_name.py (100%) rename pyvlx/{ => api}/set_utc.py (100%) diff --git a/pyvlx/__init__.py b/pyvlx/__init__.py index 7cfe4c4d..9a9bb015 100644 --- a/pyvlx/__init__.py +++ b/pyvlx/__init__.py @@ -15,3 +15,4 @@ from .pyvlx import PyVLX from .scene import Scene from .scenes import Scenes + diff --git a/pyvlx/api/__init__.py b/pyvlx/api/__init__.py new file mode 100644 index 00000000..2a059fcc --- /dev/null +++ b/pyvlx/api/__init__.py @@ -0,0 +1,23 @@ +"""Module for all KLF 200 API frames.""" + +from .house_status_monitor import (house_status_monitor_enable) + +from .command_send import (CommandSend) +#from .get_local_time import (FrameGetLocalTimeRequest, FrameGetLocalTimeConfirmation) +from .get_state import (GetState) +from .get_network_setup import (GetNetworkSetup) +from .get_protocol_version import (GetProtocolVersion) +from .get_version import (GetVersion) +from .get_local_time import (GetLocalTime) +from .leave_learn_state import (LeaveLearnState) +from .factory_default import (FactoryDefault) +from .password_enter import (PasswordEnter) +from .set_utc import (SetUTC) +from .reboot import (Reboot) +from .activate_scene import (ActivateScene) +from .set_node_name import (SetNodeName) +from .get_all_nodes_information import (GetAllNodesInformation) +from .get_node_information import (GetNodeInformation) +from .get_scene_list import (GetSceneList) + + diff --git a/pyvlx/activate_scene.py b/pyvlx/api/activate_scene.py similarity index 100% rename from pyvlx/activate_scene.py rename to pyvlx/api/activate_scene.py diff --git a/pyvlx/api_event.py b/pyvlx/api/api_event.py similarity index 100% rename from pyvlx/api_event.py rename to pyvlx/api/api_event.py diff --git a/pyvlx/command_send.py b/pyvlx/api/command_send.py similarity index 95% rename from pyvlx/command_send.py rename to pyvlx/api/command_send.py index 8e358848..f3709624 100644 --- a/pyvlx/command_send.py +++ b/pyvlx/api/command_send.py @@ -1,10 +1,10 @@ """Module for retrieving scene list from API.""" -from pyvlx.api_event import ApiEvent -from pyvlx.frames import ( +from .api_event import ApiEvent +from .frames import ( CommandSendConfirmationStatus, FrameCommandRemainingTimeNotification, FrameCommandRunStatusNotification, FrameCommandSendConfirmation, FrameCommandSendRequest, FrameSessionFinishedNotification) -from pyvlx.session_id import get_new_session_id +from .session_id import get_new_session_id class CommandSend(ApiEvent): diff --git a/pyvlx/api/factory_default.py b/pyvlx/api/factory_default.py new file mode 100644 index 00000000..a7387e2b --- /dev/null +++ b/pyvlx/api/factory_default.py @@ -0,0 +1,27 @@ +"""Module for handling the FactoryDefault to API.""" +from .api_event import ApiEvent +from .frames import FrameGatewayFactoryDefaultConfirmation, FrameGatewayFactoryDefaultRequest +from pyvlx.log import PYVLXLOG + + +class FactoryDefault(ApiEvent): + """Class for handling Factory reset API.""" + + def __init__(self, pyvlx): + """Initialize facotry default class.""" + super().__init__(pyvlx=pyvlx) + self.pyvlx = pyvlx + self.success = False + + async def handle_frame(self, frame): + """Handle incoming API frame, return True if this was the expected frame.""" + if isinstance(frame, FrameGatewayFactoryDefaultConfirmation): + PYVLXLOG.warning("KLF200 is factory resetting") + self.pyvlx.connection.connected = False + self.success = True + return True + return False + + def request_frame(self): + """Construct initiating frame.""" + return FrameGatewayFactoryDefaultRequest() diff --git a/pyvlx/frame_creation.py b/pyvlx/api/frame_creation.py similarity index 98% rename from pyvlx/frame_creation.py rename to pyvlx/api/frame_creation.py index a2aaddaf..d9e18912 100644 --- a/pyvlx/frame_creation.py +++ b/pyvlx/api/frame_creation.py @@ -1,5 +1,7 @@ """Helper module for creating a frame out of raw data.""" -from pyvlx.frames import ( +from pyvlx.log import PYVLXLOG +from pyvlx.const import Command +from .frames import ( FrameActivateSceneConfirmation, FrameActivateSceneRequest, FrameActivationLogUpdatedNotification, FrameCommandRemainingTimeNotification, FrameCommandRunStatusNotification, @@ -32,8 +34,6 @@ FrameGetLocalTimeConfirmation, FrameGetLocalTimeRequest, FrameGatewayFactoryDefaultConfirmation, FrameGatewayFactoryDefaultRequest ) -from .const import Command -from .log import PYVLXLOG def frame_from_raw(raw): diff --git a/pyvlx/frames/__init__.py b/pyvlx/api/frames/__init__.py similarity index 100% rename from pyvlx/frames/__init__.py rename to pyvlx/api/frames/__init__.py diff --git a/pyvlx/frames/alias_array.py b/pyvlx/api/frames/alias_array.py similarity index 100% rename from pyvlx/frames/alias_array.py rename to pyvlx/api/frames/alias_array.py diff --git a/pyvlx/frames/frame.py b/pyvlx/api/frames/frame.py similarity index 100% rename from pyvlx/frames/frame.py rename to pyvlx/api/frames/frame.py diff --git a/pyvlx/frames/frame_activate_scene.py b/pyvlx/api/frames/frame_activate_scene.py similarity index 100% rename from pyvlx/frames/frame_activate_scene.py rename to pyvlx/api/frames/frame_activate_scene.py diff --git a/pyvlx/frames/frame_activation_log_updated.py b/pyvlx/api/frames/frame_activation_log_updated.py similarity index 100% rename from pyvlx/frames/frame_activation_log_updated.py rename to pyvlx/api/frames/frame_activation_log_updated.py diff --git a/pyvlx/frames/frame_command_send.py b/pyvlx/api/frames/frame_command_send.py similarity index 100% rename from pyvlx/frames/frame_command_send.py rename to pyvlx/api/frames/frame_command_send.py diff --git a/pyvlx/frames/frame_discover_nodes.py b/pyvlx/api/frames/frame_discover_nodes.py similarity index 100% rename from pyvlx/frames/frame_discover_nodes.py rename to pyvlx/api/frames/frame_discover_nodes.py diff --git a/pyvlx/frames/frame_error_notification.py b/pyvlx/api/frames/frame_error_notification.py similarity index 100% rename from pyvlx/frames/frame_error_notification.py rename to pyvlx/api/frames/frame_error_notification.py diff --git a/pyvlx/frames/frame_facory_default.py b/pyvlx/api/frames/frame_facory_default.py similarity index 100% rename from pyvlx/frames/frame_facory_default.py rename to pyvlx/api/frames/frame_facory_default.py diff --git a/pyvlx/frames/frame_get_all_nodes_information.py b/pyvlx/api/frames/frame_get_all_nodes_information.py similarity index 100% rename from pyvlx/frames/frame_get_all_nodes_information.py rename to pyvlx/api/frames/frame_get_all_nodes_information.py diff --git a/pyvlx/frames/frame_get_local_time.py b/pyvlx/api/frames/frame_get_local_time.py similarity index 100% rename from pyvlx/frames/frame_get_local_time.py rename to pyvlx/api/frames/frame_get_local_time.py diff --git a/pyvlx/frames/frame_get_network_setup.py b/pyvlx/api/frames/frame_get_network_setup.py similarity index 100% rename from pyvlx/frames/frame_get_network_setup.py rename to pyvlx/api/frames/frame_get_network_setup.py diff --git a/pyvlx/frames/frame_get_node_information.py b/pyvlx/api/frames/frame_get_node_information.py similarity index 100% rename from pyvlx/frames/frame_get_node_information.py rename to pyvlx/api/frames/frame_get_node_information.py diff --git a/pyvlx/frames/frame_get_protocol_version.py b/pyvlx/api/frames/frame_get_protocol_version.py similarity index 100% rename from pyvlx/frames/frame_get_protocol_version.py rename to pyvlx/api/frames/frame_get_protocol_version.py diff --git a/pyvlx/frames/frame_get_scene_list.py b/pyvlx/api/frames/frame_get_scene_list.py similarity index 100% rename from pyvlx/frames/frame_get_scene_list.py rename to pyvlx/api/frames/frame_get_scene_list.py diff --git a/pyvlx/frames/frame_get_state.py b/pyvlx/api/frames/frame_get_state.py similarity index 100% rename from pyvlx/frames/frame_get_state.py rename to pyvlx/api/frames/frame_get_state.py diff --git a/pyvlx/frames/frame_get_version.py b/pyvlx/api/frames/frame_get_version.py similarity index 100% rename from pyvlx/frames/frame_get_version.py rename to pyvlx/api/frames/frame_get_version.py diff --git a/pyvlx/frames/frame_helper.py b/pyvlx/api/frames/frame_helper.py similarity index 100% rename from pyvlx/frames/frame_helper.py rename to pyvlx/api/frames/frame_helper.py diff --git a/pyvlx/frames/frame_house_status_monitor_disable_cfm.py b/pyvlx/api/frames/frame_house_status_monitor_disable_cfm.py similarity index 100% rename from pyvlx/frames/frame_house_status_monitor_disable_cfm.py rename to pyvlx/api/frames/frame_house_status_monitor_disable_cfm.py diff --git a/pyvlx/frames/frame_house_status_monitor_disable_req.py b/pyvlx/api/frames/frame_house_status_monitor_disable_req.py similarity index 100% rename from pyvlx/frames/frame_house_status_monitor_disable_req.py rename to pyvlx/api/frames/frame_house_status_monitor_disable_req.py diff --git a/pyvlx/frames/frame_house_status_monitor_enable_cfm.py b/pyvlx/api/frames/frame_house_status_monitor_enable_cfm.py similarity index 100% rename from pyvlx/frames/frame_house_status_monitor_enable_cfm.py rename to pyvlx/api/frames/frame_house_status_monitor_enable_cfm.py diff --git a/pyvlx/frames/frame_house_status_monitor_enable_req.py b/pyvlx/api/frames/frame_house_status_monitor_enable_req.py similarity index 100% rename from pyvlx/frames/frame_house_status_monitor_enable_req.py rename to pyvlx/api/frames/frame_house_status_monitor_enable_req.py diff --git a/pyvlx/frames/frame_leave_learn_state.py b/pyvlx/api/frames/frame_leave_learn_state.py similarity index 100% rename from pyvlx/frames/frame_leave_learn_state.py rename to pyvlx/api/frames/frame_leave_learn_state.py diff --git a/pyvlx/frames/frame_node_information_changed.py b/pyvlx/api/frames/frame_node_information_changed.py similarity index 100% rename from pyvlx/frames/frame_node_information_changed.py rename to pyvlx/api/frames/frame_node_information_changed.py diff --git a/pyvlx/frames/frame_node_state_position_changed_notification.py b/pyvlx/api/frames/frame_node_state_position_changed_notification.py similarity index 100% rename from pyvlx/frames/frame_node_state_position_changed_notification.py rename to pyvlx/api/frames/frame_node_state_position_changed_notification.py diff --git a/pyvlx/frames/frame_password_change.py b/pyvlx/api/frames/frame_password_change.py similarity index 100% rename from pyvlx/frames/frame_password_change.py rename to pyvlx/api/frames/frame_password_change.py diff --git a/pyvlx/frames/frame_password_enter.py b/pyvlx/api/frames/frame_password_enter.py similarity index 100% rename from pyvlx/frames/frame_password_enter.py rename to pyvlx/api/frames/frame_password_enter.py diff --git a/pyvlx/frames/frame_reboot.py b/pyvlx/api/frames/frame_reboot.py similarity index 100% rename from pyvlx/frames/frame_reboot.py rename to pyvlx/api/frames/frame_reboot.py diff --git a/pyvlx/frames/frame_set_node_name.py b/pyvlx/api/frames/frame_set_node_name.py similarity index 100% rename from pyvlx/frames/frame_set_node_name.py rename to pyvlx/api/frames/frame_set_node_name.py diff --git a/pyvlx/frames/frame_set_utc_cfm.py b/pyvlx/api/frames/frame_set_utc_cfm.py similarity index 100% rename from pyvlx/frames/frame_set_utc_cfm.py rename to pyvlx/api/frames/frame_set_utc_cfm.py diff --git a/pyvlx/frames/frame_set_utc_req.py b/pyvlx/api/frames/frame_set_utc_req.py similarity index 100% rename from pyvlx/frames/frame_set_utc_req.py rename to pyvlx/api/frames/frame_set_utc_req.py diff --git a/pyvlx/get_all_nodes_information.py b/pyvlx/api/get_all_nodes_information.py similarity index 98% rename from pyvlx/get_all_nodes_information.py rename to pyvlx/api/get_all_nodes_information.py index f4737fd3..5b2fd1d0 100644 --- a/pyvlx/get_all_nodes_information.py +++ b/pyvlx/api/get_all_nodes_information.py @@ -5,7 +5,7 @@ FrameGetAllNodesInformationFinishedNotification, FrameGetAllNodesInformationNotification, FrameGetAllNodesInformationRequest) -from .log import PYVLXLOG +from pyvlx.log import PYVLXLOG class GetAllNodesInformation(ApiEvent): diff --git a/pyvlx/api/get_local_time.py b/pyvlx/api/get_local_time.py new file mode 100644 index 00000000..a2b4f1a0 --- /dev/null +++ b/pyvlx/api/get_local_time.py @@ -0,0 +1,48 @@ +"""Module for local time firmware version from API.""" +from .api_event import ApiEvent +from .frames import FrameGetLocalTimeConfirmation, FrameGetLocalTimeRequest +from datetime import datetime +import time + +class DtoLocalTime: + def __init__(self, utctime = None, localtime = None): + self.utctime = utctime + self.localtime = localtime + + + def __str__(self): + """Return human readable string.""" + return ( + '<"{}" utctime = "{}" localtime = "{}" />'.format( + self.__class__.__name__ ,self.utctime, self.localtime + ) + ) + + + +class GetLocalTime(ApiEvent): + """Class for retrieving firmware version from API.""" + + def __init__(self, pyvlx): + """Initialize GetLocalTime class.""" + super().__init__(pyvlx=pyvlx) + self.success = False + self.localtime = DtoLocalTime() + + async def handle_frame(self, frame): + """Handle incoming API frame, return True if this was the expected frame.""" + if not isinstance(frame, FrameGetLocalTimeConfirmation): + return False + if frame.weekday == 0: + wd = 6 + else: + wd = frame.weekday -1 + self.time = DtoLocalTime(datetime.fromtimestamp(frame.utctime), + datetime.fromtimestamp(time.mktime((frame.year+1900, frame.month, frame.dayofmonth, frame.hour, frame.minute, frame.second, wd, frame.dayofyear, frame.daylightsavingflag)))) + self.success = True + + return True + + def request_frame(self): + """Construct initiating frame.""" + return FrameGetLocalTimeRequest() diff --git a/pyvlx/api/get_network_setup.py b/pyvlx/api/get_network_setup.py new file mode 100644 index 00000000..31c6a8f5 --- /dev/null +++ b/pyvlx/api/get_network_setup.py @@ -0,0 +1,42 @@ +"""Module for retrieving gateway state from API.""" +from .api_event import ApiEvent +from .frames import FrameGetNetworkSetupConfirmation, FrameGetNetworkSetupRequest, DHCPParameter + +class DtoNetworkSetup: + def __init__(self, ipaddress = None, gateway = None, netmask = None, dhcp = None): + self.ipaddress = ipaddress + self.gateway = gateway + self.netmask = netmask + self.dhcp = dhcp + + @property + def dhcp_name(self): + """Return dhcp as human readable string.""" + return DHCPParameter(self.dhcp).name + + def __str__(self): + """Return human readable string.""" + return ''.format( + self.ipaddress, self.gateway, self.gateway, self.dhcp, self.dhcp_name + ) + +class GetNetworkSetup(ApiEvent): + """Class for retrieving gateway state from API.""" + + def __init__(self, pyvlx): + """Initialize GetNetworkSetup class.""" + super().__init__(pyvlx=pyvlx) + self.success = False + self.ip = DtoNetworkSetup() + + async def handle_frame(self, frame): + """Handle incoming API frame, return True if this was the expected frame.""" + if not isinstance(frame, FrameGetNetworkSetupConfirmation): + return False + self.success = True + self.ip = DtoNetworkSetup(frame.ipaddress, frame.gateway, frame.netmask, frame.dhcp) + return True + + def request_frame(self): + """Construct initiating frame.""" + return FrameGetNetworkSetupRequest() diff --git a/pyvlx/get_node_information.py b/pyvlx/api/get_node_information.py similarity index 100% rename from pyvlx/get_node_information.py rename to pyvlx/api/get_node_information.py diff --git a/pyvlx/get_protocol_version.py b/pyvlx/api/get_protocol_version.py similarity index 100% rename from pyvlx/get_protocol_version.py rename to pyvlx/api/get_protocol_version.py diff --git a/pyvlx/get_scene_list.py b/pyvlx/api/get_scene_list.py similarity index 100% rename from pyvlx/get_scene_list.py rename to pyvlx/api/get_scene_list.py diff --git a/pyvlx/get_state.py b/pyvlx/api/get_state.py similarity index 100% rename from pyvlx/get_state.py rename to pyvlx/api/get_state.py diff --git a/pyvlx/get_version.py b/pyvlx/api/get_version.py similarity index 100% rename from pyvlx/get_version.py rename to pyvlx/api/get_version.py diff --git a/pyvlx/house_status_monitor.py b/pyvlx/api/house_status_monitor.py similarity index 98% rename from pyvlx/house_status_monitor.py rename to pyvlx/api/house_status_monitor.py index 920c412a..a07c4efe 100644 --- a/pyvlx/house_status_monitor.py +++ b/pyvlx/api/house_status_monitor.py @@ -1,6 +1,6 @@ """Module for house status monitor.""" +from pyvlx.exception import PyVLXException from .api_event import ApiEvent -from .exception import PyVLXException from .frames import ( FrameHouseStatusMonitorDisableConfirmation, FrameHouseStatusMonitorDisableRequest, diff --git a/pyvlx/api/leave_learn_state.py b/pyvlx/api/leave_learn_state.py new file mode 100644 index 00000000..6fcb7652 --- /dev/null +++ b/pyvlx/api/leave_learn_state.py @@ -0,0 +1,50 @@ +"""Module for handling the login to API.""" +from enum import Enum +from .api_event import ApiEvent +from .frames import FrameLeaveLearnStateRequest, FrameLeaveLearnStateConfirmation, LeaveLearnStateConfirmationStatus + +from pyvlx.log import PYVLXLOG + +class DtoLeaveLearnState: + def __init__(self, status = None): + self.status = status + @property + def status_name(self): + """Return status as human readable string.""" + return LeaveLearnStateConfirmationStatus(self.status_name).name + + + def __str__(self): + """Return human readable string.""" + return ( + '<"{}" status = "{}" status = "{}" />'.format( + self.__class__.__name__, self.status, self.status_name + ) + ) + +class LeaveLearnState(ApiEvent): + """Class for handling leave learn state to API.""" + + def __init__(self, pyvlx): + """Initialize leave learn state class.""" + super().__init__(pyvlx=pyvlx) + self.status = DtoLeaveLearnState() + self.success = False + + async def handle_frame(self, frame): + """Handle incoming API frame, return True if this was the expected frame.""" + if not isinstance(frame, FrameLeaveLearnStateConfirmation): + return False + self.status = frame.status + if self.status == LeaveLearnStateConfirmationStatus.FAILED: + PYVLXLOG.warning( + 'Failed to leave learn state' + ) + self.success = False + if self.status == LeaveLearnStateConfirmationStatus.SUCCESSFUL: + self.success = True + return True + + def request_frame(self): + """Construct initiating frame.""" + return FrameLeaveLearnStateRequest() diff --git a/pyvlx/login.py b/pyvlx/api/login.py similarity index 93% rename from pyvlx/login.py rename to pyvlx/api/login.py index 65b61849..9784ab16 100644 --- a/pyvlx/login.py +++ b/pyvlx/api/login.py @@ -1,10 +1,9 @@ -"""Module for handling the login to API.""" +"""Module for Login to KLF200.""" +from pyvlx.log import PYVLXLOG from .api_event import ApiEvent from .frames import ( FramePasswordEnterConfirmation, FramePasswordEnterRequest, PasswordEnterConfirmationStatus) -from .log import PYVLXLOG - class Login(ApiEvent): """Class for handling login to API.""" diff --git a/pyvlx/api/password_enter.py b/pyvlx/api/password_enter.py new file mode 100644 index 00000000..0036c3ea --- /dev/null +++ b/pyvlx/api/password_enter.py @@ -0,0 +1,33 @@ +"""Module for handling the login to API.""" +from .api_event import ApiEvent +from .frames import ( + FramePasswordEnterConfirmation, FramePasswordEnterRequest, + PasswordEnterConfirmationStatus) +from pyvlx.log import PYVLXLOG + + +class PasswordEnter(ApiEvent): + """Class for handling login to API.""" + + def __init__(self, pyvlx, password): + """Initialize login class.""" + super().__init__(pyvlx=pyvlx) + self.password = password + self.success = False + + async def handle_frame(self, frame): + """Handle incoming API frame, return True if this was the expected frame.""" + if not isinstance(frame, FramePasswordEnterConfirmation): + return False + if frame.status == PasswordEnterConfirmationStatus.FAILED: + PYVLXLOG.warning( + 'Failed to authenticate with password "%s****"', self.password[:2] + ) + self.success = False + if frame.status == PasswordEnterConfirmationStatus.SUCCESSFUL: + self.success = True + return True + + def request_frame(self): + """Construct initiating frame.""" + return FramePasswordEnterRequest(password=self.password) diff --git a/pyvlx/reboot.py b/pyvlx/api/reboot.py similarity index 100% rename from pyvlx/reboot.py rename to pyvlx/api/reboot.py diff --git a/pyvlx/session_id.py b/pyvlx/api/session_id.py similarity index 100% rename from pyvlx/session_id.py rename to pyvlx/api/session_id.py diff --git a/pyvlx/set_node_name.py b/pyvlx/api/set_node_name.py similarity index 100% rename from pyvlx/set_node_name.py rename to pyvlx/api/set_node_name.py diff --git a/pyvlx/set_utc.py b/pyvlx/api/set_utc.py similarity index 100% rename from pyvlx/set_utc.py rename to pyvlx/api/set_utc.py diff --git a/pyvlx/heartbeat.py b/pyvlx/heartbeat.py index e9e10794..91dd5437 100644 --- a/pyvlx/heartbeat.py +++ b/pyvlx/heartbeat.py @@ -2,7 +2,7 @@ import asyncio from .exception import PyVLXException -from .get_state import GetState +from .api.get_state import GetState class Heartbeat: diff --git a/pyvlx/lightening_device.py b/pyvlx/lightening_device.py index 6ca79c26..c68a7d72 100644 --- a/pyvlx/lightening_device.py +++ b/pyvlx/lightening_device.py @@ -1,5 +1,5 @@ """Module for lights.""" -from .command_send import CommandSend +from .api.command_send import CommandSend from .exception import PyVLXException from .node import Node from .parameter import Intensity diff --git a/pyvlx/node.py b/pyvlx/node.py index b3728f18..fe6631a2 100644 --- a/pyvlx/node.py +++ b/pyvlx/node.py @@ -6,7 +6,7 @@ and roller shutters. """ from .exception import PyVLXException -from .set_node_name import SetNodeName +from .api.set_node_name import SetNodeName class Node: diff --git a/pyvlx/node_helper.py b/pyvlx/node_helper.py index d2583cc8..5b986339 100644 --- a/pyvlx/node_helper.py +++ b/pyvlx/node_helper.py @@ -31,8 +31,8 @@ def convert_frame_to_node(pyvlx, frame): ) if ( - frame.node_type == NodeTypeWithSubtype.ROLLER_SHUTTER - or frame.node_type == NodeTypeWithSubtype.DUAL_ROLLER_SHUTTER + frame.node_type == NodeTypeWithSubtype.ROLLER_SHUTTER + or frame.node_type == NodeTypeWithSubtype.DUAL_ROLLER_SHUTTER ): return RollerShutter( pyvlx=pyvlx, @@ -43,9 +43,9 @@ def convert_frame_to_node(pyvlx, frame): ) if ( - frame.node_type == NodeTypeWithSubtype.INTERIOR_VENETIAN_BLIND - or frame.node_type == NodeTypeWithSubtype.VERTICAL_INTERIOR_BLINDS - or frame.node_type == NodeTypeWithSubtype.INTERIOR_VENETIAN_BLIND + frame.node_type == NodeTypeWithSubtype.INTERIOR_VENETIAN_BLIND + or frame.node_type == NodeTypeWithSubtype.VERTICAL_INTERIOR_BLINDS + or frame.node_type == NodeTypeWithSubtype.INTERIOR_VENETIAN_BLIND ): return RollerShutter( pyvlx=pyvlx, @@ -56,9 +56,9 @@ def convert_frame_to_node(pyvlx, frame): # Blinds have position and orientation (inherit frame.current_position_fp3) attribute if ( - frame.node_type == NodeTypeWithSubtype.EXTERIOR_VENETIAN_BLIND - or frame.node_type == NodeTypeWithSubtype.ADJUSTABLE_SLUTS_ROLLING_SHUTTER - or frame.node_type == NodeTypeWithSubtype.LOUVER_BLIND + frame.node_type == NodeTypeWithSubtype.EXTERIOR_VENETIAN_BLIND + or frame.node_type == NodeTypeWithSubtype.ADJUSTABLE_SLUTS_ROLLING_SHUTTER + or frame.node_type == NodeTypeWithSubtype.LOUVER_BLIND ): return Blind( pyvlx=pyvlx, @@ -69,8 +69,8 @@ def convert_frame_to_node(pyvlx, frame): ) if ( - frame.node_type == NodeTypeWithSubtype.VERTICAL_EXTERIOR_AWNING - or frame.node_type == NodeTypeWithSubtype.HORIZONTAL_AWNING + frame.node_type == NodeTypeWithSubtype.VERTICAL_EXTERIOR_AWNING + or frame.node_type == NodeTypeWithSubtype.HORIZONTAL_AWNING ): return Awning( pyvlx=pyvlx, diff --git a/pyvlx/node_updater.py b/pyvlx/node_updater.py index 8e2aefe2..f4597658 100644 --- a/pyvlx/node_updater.py +++ b/pyvlx/node_updater.py @@ -1,5 +1,5 @@ """Module for updating nodes via frames.""" -from .frames import ( +from .api.frames import ( FrameGetAllNodesInformationNotification, FrameNodeStatePositionChangedNotification) from .lightening_device import LighteningDevice @@ -18,11 +18,11 @@ def __init__(self, pyvlx): async def process_frame(self, frame): """Update nodes via frame, usually received by house monitor.""" if isinstance( - frame, - ( - FrameGetAllNodesInformationNotification, - FrameNodeStatePositionChangedNotification, - ), + frame, + ( + FrameGetAllNodesInformationNotification, + FrameNodeStatePositionChangedNotification, + ), ): PYVLXLOG.debug("NodeUpdater process frame: %s", frame) if frame.node_id not in self.pyvlx.nodes: diff --git a/pyvlx/nodes.py b/pyvlx/nodes.py index 21e1f2b2..0b9338f7 100644 --- a/pyvlx/nodes.py +++ b/pyvlx/nodes.py @@ -1,7 +1,7 @@ """Module for storing nodes.""" from .exception import PyVLXException -from .get_all_nodes_information import GetAllNodesInformation -from .get_node_information import GetNodeInformation +from .api.get_all_nodes_information import GetAllNodesInformation +from .api.get_node_information import GetNodeInformation from .node import Node from .node_helper import convert_frame_to_node diff --git a/pyvlx/on_off_switch.py b/pyvlx/on_off_switch.py index 59657e26..de3f523e 100644 --- a/pyvlx/on_off_switch.py +++ b/pyvlx/on_off_switch.py @@ -1,5 +1,5 @@ """Module for on/off switches.""" -from .command_send import CommandSend +from .api.command_send import CommandSend from .exception import PyVLXException from .node import Node from .parameter import SwitchParameter, SwitchParameterOff, SwitchParameterOn diff --git a/pyvlx/opening_device.py b/pyvlx/opening_device.py index 7ff67947..b2fee0ed 100644 --- a/pyvlx/opening_device.py +++ b/pyvlx/opening_device.py @@ -1,5 +1,5 @@ """Module for window openers.""" -from .command_send import CommandSend +from .api.command_send import CommandSend from .exception import PyVLXException from .node import Node from .parameter import CurrentPosition, Parameter, Position, TargetPosition @@ -9,7 +9,7 @@ class OpeningDevice(Node): """Meta class for opening device with one main parameter for position.""" def __init__( - self, pyvlx, node_id, name, serial_number, position_parameter=Parameter() + self, pyvlx, node_id, name, serial_number, position_parameter=Parameter() ): """Initialize opening device. @@ -105,13 +105,13 @@ class Window(OpeningDevice): """Window object.""" def __init__( - self, - pyvlx, - node_id, - name, - serial_number, - position_parameter=Parameter(), - rain_sensor=False, + self, + pyvlx, + node_id, + name, + serial_number, + position_parameter=Parameter(), + rain_sensor=False, ): """Initialize Window class. diff --git a/pyvlx/pyvlx.py b/pyvlx/pyvlx.py index 96cbdd59..1fb7de4f 100644 --- a/pyvlx/pyvlx.py +++ b/pyvlx/pyvlx.py @@ -10,17 +10,17 @@ from .config import Config from .connection import Connection from .exception import PyVLXException -from .get_protocol_version import GetProtocolVersion -from .get_version import GetVersion from .heartbeat import Heartbeat -from .house_status_monitor import house_status_monitor_enable from .log import PYVLXLOG -from .login import Login from .node_updater import NodeUpdater from .nodes import Nodes -from .reboot import Reboot from .scenes import Scenes -from .set_utc import set_utc +from .api.get_protocol_version import GetProtocolVersion +from .api.get_version import GetVersion +from .api.house_status_monitor import house_status_monitor_enable +from .api.login import Login +from .api.reboot import Reboot +from .api.set_utc import set_utc class PyVLX: diff --git a/pyvlx/scene.py b/pyvlx/scene.py index 2776df9c..ccf90fe0 100644 --- a/pyvlx/scene.py +++ b/pyvlx/scene.py @@ -1,5 +1,5 @@ """Module for scene.""" -from .activate_scene import ActivateScene +from .api.activate_scene import ActivateScene from .exception import PyVLXException diff --git a/pyvlx/scenes.py b/pyvlx/scenes.py index bcf8c46b..0246a5b9 100644 --- a/pyvlx/scenes.py +++ b/pyvlx/scenes.py @@ -1,6 +1,6 @@ """Module for storing and accessing scene list.""" from .exception import PyVLXException -from .get_scene_list import GetSceneList +from .api.get_scene_list import GetSceneList from .scene import Scene From 04281996c2eaa26c30669a91982c382af3b61a3f Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Sat, 21 Nov 2020 13:03:03 +0100 Subject: [PATCH 11/58] Fix pylint warnings in ApiEvents (except line too long) --- pyvlx/api/activate_scene.py | 18 +++++++-------- pyvlx/api/command_send.py | 32 +++++++++++++------------- pyvlx/api/get_all_nodes_information.py | 2 +- pyvlx/api/get_local_time.py | 21 +++++++++-------- pyvlx/api/get_network_setup.py | 9 ++++---- pyvlx/api/get_node_information.py | 8 +++---- pyvlx/api/get_scene_list.py | 3 ++- pyvlx/api/leave_learn_state.py | 6 ++--- pyvlx/api/password_enter.py | 2 +- pyvlx/api/reboot.py | 3 ++- pyvlx/api/set_utc.py | 3 +-- 11 files changed, 56 insertions(+), 51 deletions(-) diff --git a/pyvlx/api/activate_scene.py b/pyvlx/api/activate_scene.py index 65055cfd..f579c58f 100644 --- a/pyvlx/api/activate_scene.py +++ b/pyvlx/api/activate_scene.py @@ -11,7 +11,7 @@ class ActivateScene(ApiEvent): """Class for activating scene via API.""" def __init__( - self, pyvlx, scene_id, wait_for_completion=True, timeout_in_seconds=60 + self, pyvlx, scene_id, wait_for_completion=True, timeout_in_seconds=60 ): """Initialize SceneList class.""" super().__init__(pyvlx=pyvlx, timeout_in_seconds=timeout_in_seconds) @@ -23,28 +23,28 @@ def __init__( async def handle_frame(self, frame): """Handle incoming API frame, return True if this was the expected frame.""" if ( - isinstance(frame, FrameActivateSceneConfirmation) - and frame.session_id == self.session_id + isinstance(frame, FrameActivateSceneConfirmation) + and frame.session_id == self.session_id ): if frame.status == ActivateSceneConfirmationStatus.ACCEPTED: self.success = True return not self.wait_for_completion if ( - isinstance(frame, FrameCommandRemainingTimeNotification) - and frame.session_id == self.session_id + isinstance(frame, FrameCommandRemainingTimeNotification) + and frame.session_id == self.session_id ): # Ignoring FrameCommandRemainingTimeNotification return False if ( - isinstance(frame, FrameCommandRunStatusNotification) - and frame.session_id == self.session_id + isinstance(frame, FrameCommandRunStatusNotification) + and frame.session_id == self.session_id ): # At the moment I don't reall understand what the FrameCommandRunStatusNotification is good for. # Ignoring these packets for now return False if ( - isinstance(frame, FrameSessionFinishedNotification) - and frame.session_id == self.session_id + isinstance(frame, FrameSessionFinishedNotification) + and frame.session_id == self.session_id ): return True return False diff --git a/pyvlx/api/command_send.py b/pyvlx/api/command_send.py index f3709624..d047a73b 100644 --- a/pyvlx/api/command_send.py +++ b/pyvlx/api/command_send.py @@ -11,14 +11,14 @@ class CommandSend(ApiEvent): """Class for sending command to API.""" def __init__( - self, - pyvlx, - node_id, - parameter, - active_parameter=0, - wait_for_completion=True, - timeout_in_seconds=60, - **functional_parameter + self, + pyvlx, + node_id, + parameter, + active_parameter=0, + wait_for_completion=True, + timeout_in_seconds=60, + **functional_parameter ): """Initialize SceneList class.""" super().__init__(pyvlx=pyvlx, timeout_in_seconds=timeout_in_seconds) @@ -33,28 +33,28 @@ def __init__( async def handle_frame(self, frame): """Handle incoming API frame, return True if this was the expected frame.""" if ( - isinstance(frame, FrameCommandSendConfirmation) - and frame.session_id == self.session_id + isinstance(frame, FrameCommandSendConfirmation) + and frame.session_id == self.session_id ): if frame.status == CommandSendConfirmationStatus.ACCEPTED: self.success = True return not self.wait_for_completion if ( - isinstance(frame, FrameCommandRemainingTimeNotification) - and frame.session_id == self.session_id + isinstance(frame, FrameCommandRemainingTimeNotification) + and frame.session_id == self.session_id ): # Ignoring FrameCommandRemainingTimeNotification return False if ( - isinstance(frame, FrameCommandRunStatusNotification) - and frame.session_id == self.session_id + isinstance(frame, FrameCommandRunStatusNotification) + and frame.session_id == self.session_id ): # At the moment I don't reall understand what the FrameCommandRunStatusNotification is good for. # Ignoring these packets for now return False if ( - isinstance(frame, FrameSessionFinishedNotification) - and frame.session_id == self.session_id + isinstance(frame, FrameSessionFinishedNotification) + and frame.session_id == self.session_id ): return True return False diff --git a/pyvlx/api/get_all_nodes_information.py b/pyvlx/api/get_all_nodes_information.py index 5b2fd1d0..33527a6f 100644 --- a/pyvlx/api/get_all_nodes_information.py +++ b/pyvlx/api/get_all_nodes_information.py @@ -1,11 +1,11 @@ """Module for retrieving node information from API.""" +from pyvlx.log import PYVLXLOG from .api_event import ApiEvent from .frames import ( FrameGetAllNodesInformationConfirmation, FrameGetAllNodesInformationFinishedNotification, FrameGetAllNodesInformationNotification, FrameGetAllNodesInformationRequest) -from pyvlx.log import PYVLXLOG class GetAllNodesInformation(ApiEvent): diff --git a/pyvlx/api/get_local_time.py b/pyvlx/api/get_local_time.py index a2b4f1a0..be0b76e7 100644 --- a/pyvlx/api/get_local_time.py +++ b/pyvlx/api/get_local_time.py @@ -1,11 +1,13 @@ """Module for local time firmware version from API.""" -from .api_event import ApiEvent -from .frames import FrameGetLocalTimeConfirmation, FrameGetLocalTimeRequest from datetime import datetime import time +from .api_event import ApiEvent +from .frames import FrameGetLocalTimeConfirmation, FrameGetLocalTimeRequest class DtoLocalTime: - def __init__(self, utctime = None, localtime = None): + """Dataobject to hold KLF200 Data""" + + def __init__(self, utctime=None, localtime=None): self.utctime = utctime self.localtime = localtime @@ -14,7 +16,7 @@ def __str__(self): """Return human readable string.""" return ( '<"{}" utctime = "{}" localtime = "{}" />'.format( - self.__class__.__name__ ,self.utctime, self.localtime + self.__class__.__name__, self.utctime, self.localtime ) ) @@ -28,19 +30,20 @@ def __init__(self, pyvlx): super().__init__(pyvlx=pyvlx) self.success = False self.localtime = DtoLocalTime() + self.time = DtoLocalTime() async def handle_frame(self, frame): """Handle incoming API frame, return True if this was the expected frame.""" if not isinstance(frame, FrameGetLocalTimeConfirmation): return False if frame.weekday == 0: - wd = 6 - else: - wd = frame.weekday -1 + weekday = 6 + else: + weekday = frame.weekday -1 self.time = DtoLocalTime(datetime.fromtimestamp(frame.utctime), - datetime.fromtimestamp(time.mktime((frame.year+1900, frame.month, frame.dayofmonth, frame.hour, frame.minute, frame.second, wd, frame.dayofyear, frame.daylightsavingflag)))) + datetime.fromtimestamp(time.mktime((frame.year+1900, frame.month, frame.dayofmonth, frame.hour, frame.minute, frame.second, weekday, frame.dayofyear, frame.daylightsavingflag)))) self.success = True - + return True def request_frame(self): diff --git a/pyvlx/api/get_network_setup.py b/pyvlx/api/get_network_setup.py index 31c6a8f5..a1d0fda3 100644 --- a/pyvlx/api/get_network_setup.py +++ b/pyvlx/api/get_network_setup.py @@ -3,7 +3,8 @@ from .frames import FrameGetNetworkSetupConfirmation, FrameGetNetworkSetupRequest, DHCPParameter class DtoNetworkSetup: - def __init__(self, ipaddress = None, gateway = None, netmask = None, dhcp = None): + """Dataobject to hold KLF200 Data""" + def __init__(self, ipaddress=None, gateway=None, netmask=None, dhcp=None): self.ipaddress = ipaddress self.gateway = gateway self.netmask = netmask @@ -17,7 +18,7 @@ def dhcp_name(self): def __str__(self): """Return human readable string.""" return ''.format( - self.ipaddress, self.gateway, self.gateway, self.dhcp, self.dhcp_name + self.ipaddress, self.gateway, self.gateway, self.dhcp, self.dhcp_name ) class GetNetworkSetup(ApiEvent): @@ -27,14 +28,14 @@ def __init__(self, pyvlx): """Initialize GetNetworkSetup class.""" super().__init__(pyvlx=pyvlx) self.success = False - self.ip = DtoNetworkSetup() + self.networksetup = DtoNetworkSetup() async def handle_frame(self, frame): """Handle incoming API frame, return True if this was the expected frame.""" if not isinstance(frame, FrameGetNetworkSetupConfirmation): return False self.success = True - self.ip = DtoNetworkSetup(frame.ipaddress, frame.gateway, frame.netmask, frame.dhcp) + self.networksetup = DtoNetworkSetup(frame.ipaddress, frame.gateway, frame.netmask, frame.dhcp) return True def request_frame(self): diff --git a/pyvlx/api/get_node_information.py b/pyvlx/api/get_node_information.py index 47305d2b..e7fcce7d 100644 --- a/pyvlx/api/get_node_information.py +++ b/pyvlx/api/get_node_information.py @@ -18,14 +18,14 @@ def __init__(self, pyvlx, node_id): async def handle_frame(self, frame): """Handle incoming API frame, return True if this was the expected frame.""" if ( - isinstance(frame, FrameGetNodeInformationConfirmation) - and frame.node_id == self.node_id + isinstance(frame, FrameGetNodeInformationConfirmation) + and frame.node_id == self.node_id ): # We are still waiting for GetNodeInformationNotification return False if ( - isinstance(frame, FrameGetNodeInformationNotification) - and frame.node_id == self.node_id + isinstance(frame, FrameGetNodeInformationNotification) + and frame.node_id == self.node_id ): self.notification_frame = frame self.success = True diff --git a/pyvlx/api/get_scene_list.py b/pyvlx/api/get_scene_list.py index f6081444..58157c3a 100644 --- a/pyvlx/api/get_scene_list.py +++ b/pyvlx/api/get_scene_list.py @@ -1,9 +1,10 @@ """Module for retrieving scene list from API.""" +from pyvlx.log import PYVLXLOG from .api_event import ApiEvent from .frames import ( FrameGetSceneListConfirmation, FrameGetSceneListNotification, FrameGetSceneListRequest) -from .log import PYVLXLOG + class GetSceneList(ApiEvent): diff --git a/pyvlx/api/leave_learn_state.py b/pyvlx/api/leave_learn_state.py index 6fcb7652..014dc393 100644 --- a/pyvlx/api/leave_learn_state.py +++ b/pyvlx/api/leave_learn_state.py @@ -1,12 +1,12 @@ """Module for handling the login to API.""" -from enum import Enum +from pyvlx.log import PYVLXLOG from .api_event import ApiEvent from .frames import FrameLeaveLearnStateRequest, FrameLeaveLearnStateConfirmation, LeaveLearnStateConfirmationStatus -from pyvlx.log import PYVLXLOG class DtoLeaveLearnState: - def __init__(self, status = None): + """Dataobject to hold KLF200 Data""" + def __init__(self, status=None): self.status = status @property def status_name(self): diff --git a/pyvlx/api/password_enter.py b/pyvlx/api/password_enter.py index 0036c3ea..5d3fe94e 100644 --- a/pyvlx/api/password_enter.py +++ b/pyvlx/api/password_enter.py @@ -1,9 +1,9 @@ """Module for handling the login to API.""" +from pyvlx.log import PYVLXLOG from .api_event import ApiEvent from .frames import ( FramePasswordEnterConfirmation, FramePasswordEnterRequest, PasswordEnterConfirmationStatus) -from pyvlx.log import PYVLXLOG class PasswordEnter(ApiEvent): diff --git a/pyvlx/api/reboot.py b/pyvlx/api/reboot.py index 8c969311..cd88ee82 100644 --- a/pyvlx/api/reboot.py +++ b/pyvlx/api/reboot.py @@ -1,7 +1,8 @@ """Module for handling the login to API.""" +from pyvlx.log import PYVLXLOG from .api_event import ApiEvent from .frames import FrameGatewayRebootConfirmation, FrameGatewayRebootRequest -from .log import PYVLXLOG + class Reboot(ApiEvent): diff --git a/pyvlx/api/set_utc.py b/pyvlx/api/set_utc.py index d9469652..272c0094 100644 --- a/pyvlx/api/set_utc.py +++ b/pyvlx/api/set_utc.py @@ -1,8 +1,7 @@ """Module for setting UTC time within gateway.""" import time - +from pyvlx.exception import PyVLXException from .api_event import ApiEvent -from .exception import PyVLXException from .frames import FrameSetUTCConfirmation, FrameSetUTCRequest From c238da2ac95579e82281012efa4731259c20c2d1 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Sat, 21 Nov 2020 20:34:08 +0100 Subject: [PATCH 12/58] Add Dataobjects to ApiEvents --- pyvlx/api/factory_default.py | 2 +- pyvlx/api/get_protocol_version.py | 25 ++++++++++++++-- pyvlx/api/get_state.py | 49 +++++++++++++++++++++++++++---- pyvlx/api/get_version.py | 21 +++++++++++-- pyvlx/api/house_status_monitor.py | 4 +-- pyvlx/api/reboot.py | 9 ++++-- pyvlx/api/set_utc.py | 10 +------ 7 files changed, 93 insertions(+), 27 deletions(-) diff --git a/pyvlx/api/factory_default.py b/pyvlx/api/factory_default.py index a7387e2b..eaafec69 100644 --- a/pyvlx/api/factory_default.py +++ b/pyvlx/api/factory_default.py @@ -1,7 +1,7 @@ """Module for handling the FactoryDefault to API.""" +from pyvlx.log import PYVLXLOG from .api_event import ApiEvent from .frames import FrameGatewayFactoryDefaultConfirmation, FrameGatewayFactoryDefaultRequest -from pyvlx.log import PYVLXLOG class FactoryDefault(ApiEvent): diff --git a/pyvlx/api/get_protocol_version.py b/pyvlx/api/get_protocol_version.py index d2aaf00c..c4ffbfb5 100644 --- a/pyvlx/api/get_protocol_version.py +++ b/pyvlx/api/get_protocol_version.py @@ -3,24 +3,43 @@ from .frames import ( FrameGetProtocolVersionConfirmation, FrameGetProtocolVersionRequest) +class DtoProtocolVersion: + """KLF 200 Dataobject """ + def __init__(self, majorversion=None, minorversion=None): + self.majorversion = majorversion + self.minorversion = minorversion + + def __str__(self): + """Return human readable string.""" + return ( + '<{} majorversion = "{}" minorversion = "{}" />'.format( + self.__class__.__name__, self.majorversion, self.minorversion + ) + ) + class GetProtocolVersion(ApiEvent): """Class for retrieving protocol version from API.""" def __init__(self, pyvlx): - """Initialize login class.""" + """Initialize GetProtocolVersion class.""" super().__init__(pyvlx=pyvlx) self.success = False - self.version = None + self.protocolversion = DtoProtocolVersion() async def handle_frame(self, frame): """Handle incoming API frame, return True if this was the expected frame.""" if not isinstance(frame, FrameGetProtocolVersionConfirmation): return False - self.version = frame.version + self.protocolversion = DtoProtocolVersion(frame.major_version, frame.minor_version) self.success = True return True def request_frame(self): """Construct initiating frame.""" return FrameGetProtocolVersionRequest() + + @property + def version(self): + """Deprecated: Return Protocol Version as human readable string.""" + return "{}.{}".format(self.protocolversion.majorversion, self.protocolversion.minorversion) diff --git a/pyvlx/api/get_state.py b/pyvlx/api/get_state.py index 91024f55..66d59911 100644 --- a/pyvlx/api/get_state.py +++ b/pyvlx/api/get_state.py @@ -1,27 +1,64 @@ """Module for retrieving gateway state from API.""" from .api_event import ApiEvent -from .frames import FrameGetStateConfirmation, FrameGetStateRequest +from .frames import FrameGetStateConfirmation, FrameGetStateRequest, GatewayState, GatewaySubState + +class DtoState: + """Data Object for Gateway State.""" + + def __init__(self, gateway_state=None, gateway_sub_state=None): + self.gateway_state = gateway_state + self.gateway_sub_state = gateway_sub_state + + @property + def gateway_state_name(self): + """Return gateway_state as human readable string.""" + return GatewayState(self.gateway_state).name + + @property + def gateway_sub_state_name(self): + """Return gateway_sub_state as human readable string.""" + return GatewaySubState(self.gateway_sub_state).name + + def __str__(self): + """Return human readable string.""" + return ( + '' + 'gateway_sub_state="{}" />' + 'gateway_sub_state=_name"{}" />'.format( + self.gateway_sub_state_name, self.gateway_state_name, self.gateway_sub_state, self.gateway_sub_state_name + ) + ) class GetState(ApiEvent): """Class for retrieving gateway state from API.""" def __init__(self, pyvlx): - """Initialize login class.""" + """Initialize GetState class.""" super().__init__(pyvlx=pyvlx) self.success = False - self.gateway_state = None - self.gateway_sub_state = None + self.state = DtoState() async def handle_frame(self, frame): """Handle incoming API frame, return True if this was the expected frame.""" if not isinstance(frame, FrameGetStateConfirmation): return False self.success = True - self.gateway_state = frame.gateway_state - self.gateway_sub_state = frame.gateway_sub_state + self.state = DtoState(frame.gateway_state, frame.gateway_sub_state) return True def request_frame(self): """Construct initiating frame.""" return FrameGetStateRequest() + + @property + def gateway_state(self): + """Deprecated: Return Gateway State as human readable string.""" + return self.state.gateway_state + + @property + def gateway_sub_state(self): + """Deprecated: Return Gateway Sub State as human readable string.""" + return self.state.gateway_sub_state + \ No newline at end of file diff --git a/pyvlx/api/get_version.py b/pyvlx/api/get_version.py index fe43b45b..941944b3 100644 --- a/pyvlx/api/get_version.py +++ b/pyvlx/api/get_version.py @@ -2,21 +2,36 @@ from .api_event import ApiEvent from .frames import FrameGetVersionConfirmation, FrameGetVersionRequest +class DtoVersion: + """Object for KLF200 Data""" + def __init__(self, softwareversion=None, hardwareversion=None, productgroup=None, producttype=None): + self.softwareversion = softwareversion + self.hardwareversion = hardwareversion + self.productgroup = productgroup + self.producttype = producttype + + def __str__(self): + """Return human readable string.""" + return ( + '<{} softwareversion = "{}" hardwareversion = "{}" productgroup = "{}" producttype = "{}" />'.format( + self.__class__.__name__, self.softwareversion, self.hardwareversion, self.productgroup, self.producttype + ) + ) class GetVersion(ApiEvent): """Class for retrieving firmware version from API.""" def __init__(self, pyvlx): - """Initialize login class.""" + """Initialize GetVersion class.""" super().__init__(pyvlx=pyvlx) self.success = False - self.version = None + self.version = DtoVersion() async def handle_frame(self, frame): """Handle incoming API frame, return True if this was the expected frame.""" if not isinstance(frame, FrameGetVersionConfirmation): return False - self.version = frame.version + self.version = DtoVersion(frame.software_version, frame.hardware_version, frame.product_group, frame.product_type) self.success = True return True diff --git a/pyvlx/api/house_status_monitor.py b/pyvlx/api/house_status_monitor.py index a07c4efe..1afe76a3 100644 --- a/pyvlx/api/house_status_monitor.py +++ b/pyvlx/api/house_status_monitor.py @@ -12,7 +12,7 @@ class HouseStatusMonitorEnable(ApiEvent): """Class for enabling house status monotor.""" def __init__(self, pyvlx): - """Initialize login class.""" + """Initialize HouseStatusMonitorEnable class.""" super().__init__(pyvlx=pyvlx) self.success = False @@ -32,7 +32,7 @@ class HouseStatusMonitorDisable(ApiEvent): """Class for disabling house status monotor.""" def __init__(self, pyvlx): - """Initialize login class.""" + """Initialize HouseStatusMonitorEnable class.""" super().__init__(pyvlx=pyvlx) self.success = False diff --git a/pyvlx/api/reboot.py b/pyvlx/api/reboot.py index cd88ee82..a064e047 100644 --- a/pyvlx/api/reboot.py +++ b/pyvlx/api/reboot.py @@ -1,4 +1,4 @@ -"""Module for handling the login to API.""" +"""Module for handling the Reboot to API.""" from pyvlx.log import PYVLXLOG from .api_event import ApiEvent from .frames import FrameGatewayRebootConfirmation, FrameGatewayRebootRequest @@ -6,18 +6,21 @@ class Reboot(ApiEvent): - """Class for handling login to API.""" + """Class for handling Reboot to API.""" def __init__(self, pyvlx): - """Initialize login class.""" + """Initialize Reboot class.""" super().__init__(pyvlx=pyvlx) self.pyvlx = pyvlx + self.success = False + async def handle_frame(self, frame): """Handle incoming API frame, return True if this was the expected frame.""" if isinstance(frame, FrameGatewayRebootConfirmation): PYVLXLOG.warning("KLF200 is rebooting") self.pyvlx.connection.connected = False + self.success = True return True return False diff --git a/pyvlx/api/set_utc.py b/pyvlx/api/set_utc.py index 272c0094..cdc965db 100644 --- a/pyvlx/api/set_utc.py +++ b/pyvlx/api/set_utc.py @@ -1,6 +1,5 @@ """Module for setting UTC time within gateway.""" import time -from pyvlx.exception import PyVLXException from .api_event import ApiEvent from .frames import FrameSetUTCConfirmation, FrameSetUTCRequest @@ -9,7 +8,7 @@ class SetUTC(ApiEvent): """Class for setting UTC time within gateway.""" def __init__(self, pyvlx): - """Initialize login class.""" + """Initialize SetUTC class.""" super().__init__(pyvlx=pyvlx) self.success = False @@ -25,10 +24,3 @@ def request_frame(self): timestamp = int(time.time()) return FrameSetUTCRequest(timestamp=timestamp) - -async def set_utc(pyvlx): - """Enable house status monitor.""" - setutc = SetUTC(pyvlx=pyvlx) - await setutc.do_api_call() - if not setutc.success: - raise PyVLXException("Unable to set utc.") From 4c6a4e45f44daa43899a76a12026156d9585c9b1 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Sat, 21 Nov 2020 20:34:50 +0100 Subject: [PATCH 13/58] add klf200 Gateway Class --- pyvlx/klf200gateway.py | 136 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 pyvlx/klf200gateway.py diff --git a/pyvlx/klf200gateway.py b/pyvlx/klf200gateway.py new file mode 100644 index 00000000..0a32f19a --- /dev/null +++ b/pyvlx/klf200gateway.py @@ -0,0 +1,136 @@ +""" +Module for basic klf200 gateway functions. +""" +from .exception import PyVLXException + +from .api import (GetState, GetNetworkSetup, GetProtocolVersion, GetVersion, + GetLocalTime, LeaveLearnState, FactoryDefault, PasswordEnter, + SetUTC, Reboot) +from .log import PYVLXLOG + +class Klf200Gateway: + """Class for node abstraction.""" + + def __init__(self, pyvlx): + """Initialize Node object.""" + self.pyvlx = pyvlx + self.state = None + self.network_setup = None + self.password = None + self.localtime = None + self.protocol_version = None + self.version = None + self.device_updated_cbs = [] + + def register_device_updated_cb(self, device_updated_cb): + """Register device updated callback.""" + self.device_updated_cbs.append(device_updated_cb) + + def unregister_device_updated_cb(self, device_updated_cb): + """Unregister device updated callback.""" + self.device_updated_cbs.remove(device_updated_cb) + + async def after_update(self): + """Execute callbacks after internal state has been changed.""" + for device_updated_cb in self.device_updated_cbs: + # pylint: disable=not-callable + await device_updated_cb(self) + + async def get_state(self): + """Retrieve state from API.""" + get_state = GetState(pyvlx=self.pyvlx) + await get_state.do_api_call() + if not get_state.success: + raise PyVLXException("Unable to retrieve state") + self.state = get_state.state + return get_state.success + + async def get_network_setup(self): + """Retrieve network setup from API.""" + get_network_setup = GetNetworkSetup(pyvlx=self.pyvlx) + await get_network_setup.do_api_call() + if not get_network_setup.success: + raise PyVLXException("Unable to retrieve network setup") + self.network_setup = get_network_setup.networksetup + return get_network_setup.success + + async def get_version(self): + """Retrieve version from API.""" + get_version = GetVersion(pyvlx=self.pyvlx) + await get_version.do_api_call() + if not get_version.success: + raise PyVLXException("Unable to retrieve version") + self.version = get_version.version + return get_version.success + + async def get_protocol_version(self): + """Retrieve protocol version from API.""" + get_protocol_version = GetProtocolVersion(pyvlx=self.pyvlx) + await get_protocol_version.do_api_call() + if not get_protocol_version.success: + raise PyVLXException("Unable to retrieve protocol version") + self.protocol_version = get_protocol_version.version + return get_protocol_version.success + + async def leave_learn_state(self): + """Leave Learn state from API.""" + leave_learn_state = LeaveLearnState(pyvlx=self.pyvlx) + await leave_learn_state.do_api_call() + if not leave_learn_state.success: + PYVLXLOG.warning("Unable to leave learn state") + return leave_learn_state.success + + async def set_utc(self): + """Set UTC Clock.""" + setutc = SetUTC(pyvlx=self.pyvlx) + await setutc.do_api_call() + if not setutc.success: + PYVLXLOG.warning("Unable to set utc.") + return setutc.success + + async def set_rtc_time_zone(self): + """Set the RTC Time Zone.""" + #idontwant = setrtctimezone(pyvlx=self.pyvlx) + raise PyVLXException("KLF 200 RTC Timezone Set not implemented") + #return setrtctimezone.success + + async def reboot(self): + """Reboot gateway.""" + reboot = Reboot(pyvlx=self.pyvlx) + await reboot.do_api_call() + if not reboot.success: + PYVLXLOG.warning("Unable to reboot gateway.") + return reboot.success + + async def factory_default(self): + """Factory Default Reset gateway.""" + factorydefault = FactoryDefault(pyvlx=self.pyvlx) + await factorydefault.do_api_call() + if not factorydefault.success: + PYVLXLOG.warning("Unable to factory Default Reset gateway.") + return factorydefault.success + + async def get_local_time(self): + """get local time from gateway.""" + getlocaltime = GetLocalTime(pyvlx=self.pyvlx) + await getlocaltime.do_api_call() + if not getlocaltime.success: + PYVLXLOG.warning("Unable to get local time.") + self.localtime = getlocaltime.localtime + return getlocaltime.success + + async def password_enter(self, password): + """get enter Password for gateway.""" + self.password = password + passwordenter = PasswordEnter(pyvlx=self.pyvlx, password=self.password) + await passwordenter.do_api_call() + if not passwordenter.success: + raise PyVLXException("Login to KLF 200 failed, check credentials") + return passwordenter.success + + def __str__(self): + """Return object as readable string.""" + return ( + '<{} state="{}" network_setup="{}" version="{}" protocol_version="{}"/>'.format( + type(self).__name__, str(self.state), str(self.network_setup), str(self.version), str(self.protocol_version)) + ) From fd92754354329d6add61332dfbea094d8cae58f9 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Sun, 22 Nov 2020 15:16:54 +0100 Subject: [PATCH 14/58] Merge UTC Frame REQ and CFM into one Module --- pyvlx/api/frames/__init__.py | 3 +-- .../{frame_set_utc_req.py => frame_set_utc.py} | 11 ++++++++++- pyvlx/api/frames/frame_set_utc_cfm.py | 14 -------------- 3 files changed, 11 insertions(+), 17 deletions(-) rename pyvlx/api/frames/{frame_set_utc_req.py => frame_set_utc.py} (77%) delete mode 100644 pyvlx/api/frames/frame_set_utc_cfm.py diff --git a/pyvlx/api/frames/__init__.py b/pyvlx/api/frames/__init__.py index 13ef4906..41696b38 100644 --- a/pyvlx/api/frames/__init__.py +++ b/pyvlx/api/frames/__init__.py @@ -56,8 +56,7 @@ from .frame_set_node_name import ( FrameSetNodeNameConfirmation, FrameSetNodeNameRequest, SetNodeNameConfirmationStatus) -from .frame_set_utc_cfm import FrameSetUTCConfirmation -from .frame_set_utc_req import FrameSetUTCRequest +from .frame_set_utc import (FrameSetUTCConfirmation, FrameSetUTCRequest) from .frame_leave_learn_state import ( FrameLeaveLearnStateRequest, FrameLeaveLearnStateConfirmation, LeaveLearnStateConfirmationStatus) diff --git a/pyvlx/api/frames/frame_set_utc_req.py b/pyvlx/api/frames/frame_set_utc.py similarity index 77% rename from pyvlx/api/frames/frame_set_utc_req.py rename to pyvlx/api/frames/frame_set_utc.py index 8c9a4da9..124bb82b 100644 --- a/pyvlx/api/frames/frame_set_utc_req.py +++ b/pyvlx/api/frames/frame_set_utc.py @@ -6,9 +6,18 @@ from .frame import FrameBase +class FrameSetUTCConfirmation(FrameBase): + """Frame for confirmation for setting UTC time.""" + + PAYLOAD_LEN = 0 + + def __init__(self): + """Init Frame.""" + super().__init__(Command.GW_SET_UTC_CFM) + class FrameSetUTCRequest(FrameBase): - """Frame for sending command to gw.""" + """Frame for command for setting UTC time.""" PAYLOAD_LEN = 4 diff --git a/pyvlx/api/frames/frame_set_utc_cfm.py b/pyvlx/api/frames/frame_set_utc_cfm.py deleted file mode 100644 index 97fbe74b..00000000 --- a/pyvlx/api/frames/frame_set_utc_cfm.py +++ /dev/null @@ -1,14 +0,0 @@ -"""Module for confirmation for setting UTC time.""" -from pyvlx.const import Command - -from .frame import FrameBase - - -class FrameSetUTCConfirmation(FrameBase): - """Frame for confirmation for setting UTC time.""" - - PAYLOAD_LEN = 0 - - def __init__(self): - """Init Frame.""" - super().__init__(Command.GW_SET_UTC_CFM) From 472089ebb4ed5c330fd74c6c5ba1c12edc873dd0 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Sun, 22 Nov 2020 15:31:07 +0100 Subject: [PATCH 15/58] Fix SET UTC Call and switch from Login to Password Enter API --- pyvlx/api/login.py | 32 -------------------------------- pyvlx/api/set_utc.py | 5 +++-- pyvlx/pyvlx.py | 8 ++++---- 3 files changed, 7 insertions(+), 38 deletions(-) delete mode 100644 pyvlx/api/login.py diff --git a/pyvlx/api/login.py b/pyvlx/api/login.py deleted file mode 100644 index 9784ab16..00000000 --- a/pyvlx/api/login.py +++ /dev/null @@ -1,32 +0,0 @@ -"""Module for Login to KLF200.""" -from pyvlx.log import PYVLXLOG -from .api_event import ApiEvent -from .frames import ( - FramePasswordEnterConfirmation, FramePasswordEnterRequest, - PasswordEnterConfirmationStatus) - -class Login(ApiEvent): - """Class for handling login to API.""" - - def __init__(self, pyvlx, password): - """Initialize login class.""" - super().__init__(pyvlx=pyvlx) - self.password = password - self.success = False - - async def handle_frame(self, frame): - """Handle incoming API frame, return True if this was the expected frame.""" - if not isinstance(frame, FramePasswordEnterConfirmation): - return False - if frame.status == PasswordEnterConfirmationStatus.FAILED: - PYVLXLOG.warning( - 'Failed to authenticate with password "%s****"', self.password[:2] - ) - self.success = False - if frame.status == PasswordEnterConfirmationStatus.SUCCESSFUL: - self.success = True - return True - - def request_frame(self): - """Construct initiating frame.""" - return FramePasswordEnterRequest(password=self.password) diff --git a/pyvlx/api/set_utc.py b/pyvlx/api/set_utc.py index cdc965db..1d6bacdd 100644 --- a/pyvlx/api/set_utc.py +++ b/pyvlx/api/set_utc.py @@ -7,9 +7,10 @@ class SetUTC(ApiEvent): """Class for setting UTC time within gateway.""" - def __init__(self, pyvlx): + def __init__(self, pyvlx, timestamp=time.time()): """Initialize SetUTC class.""" super().__init__(pyvlx=pyvlx) + self.timestamp = timestamp self.success = False async def handle_frame(self, frame): @@ -21,6 +22,6 @@ async def handle_frame(self, frame): def request_frame(self): """Construct initiating frame.""" - timestamp = int(time.time()) + timestamp = int(self.timestamp) return FrameSetUTCRequest(timestamp=timestamp) diff --git a/pyvlx/pyvlx.py b/pyvlx/pyvlx.py index 1fb7de4f..c140de7c 100644 --- a/pyvlx/pyvlx.py +++ b/pyvlx/pyvlx.py @@ -18,9 +18,9 @@ from .api.get_protocol_version import GetProtocolVersion from .api.get_version import GetVersion from .api.house_status_monitor import house_status_monitor_enable -from .api.login import Login +from .api.password_enter import PasswordEnter from .api.reboot import Reboot -from .api.set_utc import set_utc +from .api.set_utc import SetUTC class PyVLX: @@ -44,12 +44,12 @@ async def connect(self): """Connect to KLF 200.""" PYVLXLOG.debug("Connecting to KLF 200.") await self.connection.connect() - login = Login(pyvlx=self, password=self.config.password) + login = PasswordEnter(pyvlx=self, password=self.config.password) await login.do_api_call() if not login.success: raise PyVLXException("Login to KLF 200 failed, check credentials") await self.update_version() - await set_utc(pyvlx=self) + await SetUTC(pyvlx=self).do_api_call() await house_status_monitor_enable(pyvlx=self) async def reboot_gateway(self): From 7f05406421adbac7898044adefd075fdcf5192ed Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Sun, 22 Nov 2020 16:17:27 +0100 Subject: [PATCH 16/58] Fixed imports --- pyvlx/api/factory_default.py | 2 +- pyvlx/api/frame_creation.py | 4 ++-- pyvlx/api/frames/alias_array.py | 2 +- pyvlx/api/frames/frame.py | 2 +- pyvlx/api/frames/frame_activate_scene.py | 2 +- pyvlx/api/frames/frame_activation_log_updated.py | 2 +- pyvlx/api/frames/frame_command_send.py | 6 +++--- pyvlx/api/frames/frame_discover_nodes.py | 2 +- pyvlx/api/frames/frame_error_notification.py | 2 +- pyvlx/api/frames/frame_facory_default.py | 2 +- pyvlx/api/frames/frame_get_all_nodes_information.py | 10 +++++----- pyvlx/api/frames/frame_get_local_time.py | 4 +--- pyvlx/api/frames/frame_get_network_setup.py | 2 +- pyvlx/api/frames/frame_get_node_information.py | 10 +++++----- pyvlx/api/frames/frame_get_protocol_version.py | 2 +- pyvlx/api/frames/frame_get_scene_list.py | 6 +++--- pyvlx/api/frames/frame_get_state.py | 2 +- pyvlx/api/frames/frame_get_version.py | 2 +- pyvlx/api/frames/frame_helper.py | 4 ++-- .../frames/frame_house_status_monitor_disable_cfm.py | 2 +- .../frames/frame_house_status_monitor_disable_req.py | 2 +- .../frames/frame_house_status_monitor_enable_cfm.py | 2 +- .../frames/frame_house_status_monitor_enable_req.py | 2 +- pyvlx/api/frames/frame_leave_learn_state.py | 2 +- pyvlx/api/frames/frame_node_information_changed.py | 4 ++-- .../frame_node_state_position_changed_notification.py | 4 ++-- pyvlx/api/frames/frame_password_change.py | 6 +++--- pyvlx/api/frames/frame_password_enter.py | 6 +++--- pyvlx/api/frames/frame_reboot.py | 2 +- pyvlx/api/frames/frame_set_node_name.py | 4 ++-- pyvlx/api/frames/frame_set_utc.py | 2 +- pyvlx/api/get_all_nodes_information.py | 2 +- pyvlx/api/get_scene_list.py | 2 +- pyvlx/api/house_status_monitor.py | 2 +- pyvlx/api/leave_learn_state.py | 2 +- pyvlx/api/password_enter.py | 2 +- pyvlx/api/reboot.py | 2 +- pyvlx/connection.py | 4 ++-- 38 files changed, 60 insertions(+), 62 deletions(-) diff --git a/pyvlx/api/factory_default.py b/pyvlx/api/factory_default.py index eaafec69..bfb9c69f 100644 --- a/pyvlx/api/factory_default.py +++ b/pyvlx/api/factory_default.py @@ -1,5 +1,5 @@ """Module for handling the FactoryDefault to API.""" -from pyvlx.log import PYVLXLOG +from ..log import PYVLXLOG from .api_event import ApiEvent from .frames import FrameGatewayFactoryDefaultConfirmation, FrameGatewayFactoryDefaultRequest diff --git a/pyvlx/api/frame_creation.py b/pyvlx/api/frame_creation.py index d9e18912..d20b09f6 100644 --- a/pyvlx/api/frame_creation.py +++ b/pyvlx/api/frame_creation.py @@ -1,6 +1,6 @@ """Helper module for creating a frame out of raw data.""" -from pyvlx.log import PYVLXLOG -from pyvlx.const import Command +from ..log import PYVLXLOG +from ..const import Command from .frames import ( FrameActivateSceneConfirmation, FrameActivateSceneRequest, FrameActivationLogUpdatedNotification, diff --git a/pyvlx/api/frames/alias_array.py b/pyvlx/api/frames/alias_array.py index c08f9345..79a25f5a 100644 --- a/pyvlx/api/frames/alias_array.py +++ b/pyvlx/api/frames/alias_array.py @@ -1,5 +1,5 @@ """Module for storing alias array.""" -from pyvlx.exception import PyVLXException +from ...exception import PyVLXException class AliasArray: diff --git a/pyvlx/api/frames/frame.py b/pyvlx/api/frames/frame.py index 1d9c3341..23d2269f 100644 --- a/pyvlx/api/frames/frame.py +++ b/pyvlx/api/frames/frame.py @@ -1,7 +1,7 @@ """Module for Frames.""" import struct -from pyvlx.exception import PyVLXException +from ...exception import PyVLXException from .frame_helper import calc_crc diff --git a/pyvlx/api/frames/frame_activate_scene.py b/pyvlx/api/frames/frame_activate_scene.py index a4a4cba9..eb10858a 100644 --- a/pyvlx/api/frames/frame_activate_scene.py +++ b/pyvlx/api/frames/frame_activate_scene.py @@ -1,7 +1,7 @@ """Module for sending command to gw.""" from enum import Enum -from pyvlx.const import Command, Originator, Priority, Velocity +from ...const import Command, Originator, Priority, Velocity from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_activation_log_updated.py b/pyvlx/api/frames/frame_activation_log_updated.py index a8154653..c6c16f0f 100644 --- a/pyvlx/api/frames/frame_activation_log_updated.py +++ b/pyvlx/api/frames/frame_activation_log_updated.py @@ -1,5 +1,5 @@ """Module for error notification.""" -from pyvlx.const import Command +from ...const import Command from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_command_send.py b/pyvlx/api/frames/frame_command_send.py index 0351dfd7..5f36c5fe 100644 --- a/pyvlx/api/frames/frame_command_send.py +++ b/pyvlx/api/frames/frame_command_send.py @@ -1,9 +1,9 @@ """Module for sending command to gw.""" from enum import Enum -from pyvlx.const import Command, Originator, Priority -from pyvlx.exception import PyVLXException -from pyvlx.parameter import Parameter, Position +from ...const import Command, Originator, Priority +from ...exception import PyVLXException +from ...parameter import Parameter, Position from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_discover_nodes.py b/pyvlx/api/frames/frame_discover_nodes.py index f399bee6..9c1037a6 100644 --- a/pyvlx/api/frames/frame_discover_nodes.py +++ b/pyvlx/api/frames/frame_discover_nodes.py @@ -1,5 +1,5 @@ """Module for discover nodes requests.""" -from pyvlx.const import Command, NodeType +from ...const import Command, NodeType from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_error_notification.py b/pyvlx/api/frames/frame_error_notification.py index e28dc6cf..d4739d94 100644 --- a/pyvlx/api/frames/frame_error_notification.py +++ b/pyvlx/api/frames/frame_error_notification.py @@ -1,7 +1,7 @@ """Module for error notification.""" from enum import Enum -from pyvlx.const import Command +from ...const import Command from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_facory_default.py b/pyvlx/api/frames/frame_facory_default.py index e9e1e39b..e0b6b229 100644 --- a/pyvlx/api/frames/frame_facory_default.py +++ b/pyvlx/api/frames/frame_facory_default.py @@ -1,5 +1,5 @@ """Module for reboot frame classes.""" -from pyvlx.const import Command +from ...const import Command from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_get_all_nodes_information.py b/pyvlx/api/frames/frame_get_all_nodes_information.py index 6762d500..fa51dea9 100644 --- a/pyvlx/api/frames/frame_get_all_nodes_information.py +++ b/pyvlx/api/frames/frame_get_all_nodes_information.py @@ -3,11 +3,11 @@ from datetime import datetime from enum import Enum -from pyvlx.frames.alias_array import AliasArray -from pyvlx.const import Command, NodeTypeWithSubtype, NodeVariation, Velocity -from pyvlx.exception import PyVLXException -from pyvlx.parameter import Parameter -from pyvlx.string_helper import bytes_to_string, string_to_bytes +from .alias_array import AliasArray +from ...const import Command, NodeTypeWithSubtype, NodeVariation, Velocity +from ...exception import PyVLXException +from ...parameter import Parameter +from ...string_helper import bytes_to_string, string_to_bytes from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_get_local_time.py b/pyvlx/api/frames/frame_get_local_time.py index d78805c9..f1eec4fb 100644 --- a/pyvlx/api/frames/frame_get_local_time.py +++ b/pyvlx/api/frames/frame_get_local_time.py @@ -1,8 +1,6 @@ """Module for get local time classes.""" #import struct -from enum import Enum -import time -from pyvlx.const import Command +from ...const import Command from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_get_network_setup.py b/pyvlx/api/frames/frame_get_network_setup.py index ac7b272e..212a9ac9 100644 --- a/pyvlx/api/frames/frame_get_network_setup.py +++ b/pyvlx/api/frames/frame_get_network_setup.py @@ -1,7 +1,7 @@ """Frames for receiving network setup from gateway.""" from enum import Enum -from pyvlx.const import Command +from ...const import Command from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_get_node_information.py b/pyvlx/api/frames/frame_get_node_information.py index 592cf1fb..0b6b06dc 100644 --- a/pyvlx/api/frames/frame_get_node_information.py +++ b/pyvlx/api/frames/frame_get_node_information.py @@ -3,11 +3,11 @@ from datetime import datetime from enum import Enum -from pyvlx.frames.alias_array import AliasArray -from pyvlx.const import Command, NodeTypeWithSubtype, NodeVariation, Velocity -from pyvlx.exception import PyVLXException -from pyvlx.parameter import Parameter -from pyvlx.string_helper import bytes_to_string, string_to_bytes +from .alias_array import AliasArray +from ...const import Command, NodeTypeWithSubtype, NodeVariation, Velocity +from ...exception import PyVLXException +from ...parameter import Parameter +from ...string_helper import bytes_to_string, string_to_bytes from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_get_protocol_version.py b/pyvlx/api/frames/frame_get_protocol_version.py index 50f659a4..07e4ee4d 100644 --- a/pyvlx/api/frames/frame_get_protocol_version.py +++ b/pyvlx/api/frames/frame_get_protocol_version.py @@ -1,5 +1,5 @@ """Module for get version frame classes.""" -from pyvlx.const import Command +from ...const import Command from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_get_scene_list.py b/pyvlx/api/frames/frame_get_scene_list.py index 1749969a..b0dcb1fe 100644 --- a/pyvlx/api/frames/frame_get_scene_list.py +++ b/pyvlx/api/frames/frame_get_scene_list.py @@ -1,7 +1,7 @@ """Module for get scene list frame classes.""" -from pyvlx.const import Command -from pyvlx.exception import PyVLXException -from pyvlx.string_helper import bytes_to_string, string_to_bytes +from ...const import Command +from ...exception import PyVLXException +from ...string_helper import bytes_to_string, string_to_bytes from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_get_state.py b/pyvlx/api/frames/frame_get_state.py index f02cb927..6418391b 100644 --- a/pyvlx/api/frames/frame_get_state.py +++ b/pyvlx/api/frames/frame_get_state.py @@ -1,7 +1,7 @@ """Frames for receiving state from gateway.""" from enum import Enum -from pyvlx.const import Command +from ...const import Command from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_get_version.py b/pyvlx/api/frames/frame_get_version.py index d835a3da..53ba183c 100644 --- a/pyvlx/api/frames/frame_get_version.py +++ b/pyvlx/api/frames/frame_get_version.py @@ -1,5 +1,5 @@ """Module for get version frame classes.""" -from pyvlx.const import Command +from ...const import Command from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_helper.py b/pyvlx/api/frames/frame_helper.py index 39ac6d42..1ce7fbe9 100644 --- a/pyvlx/api/frames/frame_helper.py +++ b/pyvlx/api/frames/frame_helper.py @@ -1,6 +1,6 @@ """Helper module for SLIP Frames.""" -from pyvlx.const import Command -from pyvlx.exception import PyVLXException +from ...const import Command +from ...exception import PyVLXException def calc_crc(raw): diff --git a/pyvlx/api/frames/frame_house_status_monitor_disable_cfm.py b/pyvlx/api/frames/frame_house_status_monitor_disable_cfm.py index 3cf5c2b7..27cfd589 100644 --- a/pyvlx/api/frames/frame_house_status_monitor_disable_cfm.py +++ b/pyvlx/api/frames/frame_house_status_monitor_disable_cfm.py @@ -1,5 +1,5 @@ """Module for confirmation for disabling the house status monitor.""" -from pyvlx.const import Command +from ...const import Command from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_house_status_monitor_disable_req.py b/pyvlx/api/frames/frame_house_status_monitor_disable_req.py index 38052eb6..a3e801f6 100644 --- a/pyvlx/api/frames/frame_house_status_monitor_disable_req.py +++ b/pyvlx/api/frames/frame_house_status_monitor_disable_req.py @@ -1,5 +1,5 @@ """Module for requesting disabling the house status monitor.""" -from pyvlx.const import Command +from ...const import Command from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_house_status_monitor_enable_cfm.py b/pyvlx/api/frames/frame_house_status_monitor_enable_cfm.py index dc5b6d1f..edc94672 100644 --- a/pyvlx/api/frames/frame_house_status_monitor_enable_cfm.py +++ b/pyvlx/api/frames/frame_house_status_monitor_enable_cfm.py @@ -1,5 +1,5 @@ """Module for confirmation for enabling the house status monitor.""" -from pyvlx.const import Command +from ...const import Command from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_house_status_monitor_enable_req.py b/pyvlx/api/frames/frame_house_status_monitor_enable_req.py index 941f42f5..2311b8ac 100644 --- a/pyvlx/api/frames/frame_house_status_monitor_enable_req.py +++ b/pyvlx/api/frames/frame_house_status_monitor_enable_req.py @@ -1,5 +1,5 @@ """Module for requesting enabling the house status monitor.""" -from pyvlx.const import Command +from ...const import Command from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_leave_learn_state.py b/pyvlx/api/frames/frame_leave_learn_state.py index 4b95f6e9..6b62088c 100644 --- a/pyvlx/api/frames/frame_leave_learn_state.py +++ b/pyvlx/api/frames/frame_leave_learn_state.py @@ -1,6 +1,6 @@ """Module for leave learn state frame classes.""" from enum import Enum -from pyvlx.const import Command +from ...const import Command from .frame import FrameBase class LeaveLearnStateConfirmationStatus(Enum): diff --git a/pyvlx/api/frames/frame_node_information_changed.py b/pyvlx/api/frames/frame_node_information_changed.py index cd5af049..7b30155a 100644 --- a/pyvlx/api/frames/frame_node_information_changed.py +++ b/pyvlx/api/frames/frame_node_information_changed.py @@ -1,6 +1,6 @@ """Module for requesting change of node name.""" -from pyvlx.const import Command, NodeVariation -from pyvlx.string_helper import bytes_to_string, string_to_bytes +from ...const import Command, NodeVariation +from ...string_helper import bytes_to_string, string_to_bytes from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_node_state_position_changed_notification.py b/pyvlx/api/frames/frame_node_state_position_changed_notification.py index f8c760f7..4cbba9cb 100644 --- a/pyvlx/api/frames/frame_node_state_position_changed_notification.py +++ b/pyvlx/api/frames/frame_node_state_position_changed_notification.py @@ -2,8 +2,8 @@ import struct from datetime import datetime -from pyvlx.const import Command -from pyvlx.parameter import Parameter +from ...const import Command +from ...parameter import Parameter from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_password_change.py b/pyvlx/api/frames/frame_password_change.py index 76b86702..a168cdd0 100644 --- a/pyvlx/api/frames/frame_password_change.py +++ b/pyvlx/api/frames/frame_password_change.py @@ -1,9 +1,9 @@ """Module for password enter frame classes.""" from enum import Enum -from pyvlx.const import Command -from pyvlx.exception import PyVLXException -from pyvlx.string_helper import bytes_to_string, string_to_bytes +from ...const import Command +from ...exception import PyVLXException +from ...string_helper import bytes_to_string, string_to_bytes from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_password_enter.py b/pyvlx/api/frames/frame_password_enter.py index e0375d0c..41448e14 100644 --- a/pyvlx/api/frames/frame_password_enter.py +++ b/pyvlx/api/frames/frame_password_enter.py @@ -1,9 +1,9 @@ """Module for password enter frame classes.""" from enum import Enum -from pyvlx.const import Command -from pyvlx.exception import PyVLXException -from pyvlx.string_helper import bytes_to_string, string_to_bytes +from ...const import Command +from ...exception import PyVLXException +from ...string_helper import bytes_to_string, string_to_bytes from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_reboot.py b/pyvlx/api/frames/frame_reboot.py index 68759425..221af9b0 100644 --- a/pyvlx/api/frames/frame_reboot.py +++ b/pyvlx/api/frames/frame_reboot.py @@ -1,5 +1,5 @@ """Module for reboot frame classes.""" -from pyvlx.const import Command +from ...const import Command from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_set_node_name.py b/pyvlx/api/frames/frame_set_node_name.py index 32ba31d9..2123c438 100644 --- a/pyvlx/api/frames/frame_set_node_name.py +++ b/pyvlx/api/frames/frame_set_node_name.py @@ -1,8 +1,8 @@ """Module for requesting change of node name.""" from enum import Enum -from pyvlx.const import Command -from pyvlx.string_helper import bytes_to_string, string_to_bytes +from ...const import Command +from ...string_helper import bytes_to_string, string_to_bytes from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_set_utc.py b/pyvlx/api/frames/frame_set_utc.py index 124bb82b..380df94c 100644 --- a/pyvlx/api/frames/frame_set_utc.py +++ b/pyvlx/api/frames/frame_set_utc.py @@ -2,7 +2,7 @@ import struct from datetime import datetime -from pyvlx.const import Command +from ...const import Command from .frame import FrameBase diff --git a/pyvlx/api/get_all_nodes_information.py b/pyvlx/api/get_all_nodes_information.py index 33527a6f..d819c2e3 100644 --- a/pyvlx/api/get_all_nodes_information.py +++ b/pyvlx/api/get_all_nodes_information.py @@ -1,5 +1,5 @@ """Module for retrieving node information from API.""" -from pyvlx.log import PYVLXLOG +from ..log import PYVLXLOG from .api_event import ApiEvent from .frames import ( FrameGetAllNodesInformationConfirmation, diff --git a/pyvlx/api/get_scene_list.py b/pyvlx/api/get_scene_list.py index 58157c3a..9e423b22 100644 --- a/pyvlx/api/get_scene_list.py +++ b/pyvlx/api/get_scene_list.py @@ -1,5 +1,5 @@ """Module for retrieving scene list from API.""" -from pyvlx.log import PYVLXLOG +from ..log import PYVLXLOG from .api_event import ApiEvent from .frames import ( FrameGetSceneListConfirmation, FrameGetSceneListNotification, diff --git a/pyvlx/api/house_status_monitor.py b/pyvlx/api/house_status_monitor.py index 1afe76a3..aa301b35 100644 --- a/pyvlx/api/house_status_monitor.py +++ b/pyvlx/api/house_status_monitor.py @@ -1,5 +1,5 @@ """Module for house status monitor.""" -from pyvlx.exception import PyVLXException +from ..exception import PyVLXException from .api_event import ApiEvent from .frames import ( FrameHouseStatusMonitorDisableConfirmation, diff --git a/pyvlx/api/leave_learn_state.py b/pyvlx/api/leave_learn_state.py index 014dc393..4a1ac868 100644 --- a/pyvlx/api/leave_learn_state.py +++ b/pyvlx/api/leave_learn_state.py @@ -1,5 +1,5 @@ """Module for handling the login to API.""" -from pyvlx.log import PYVLXLOG +from ..log import PYVLXLOG from .api_event import ApiEvent from .frames import FrameLeaveLearnStateRequest, FrameLeaveLearnStateConfirmation, LeaveLearnStateConfirmationStatus diff --git a/pyvlx/api/password_enter.py b/pyvlx/api/password_enter.py index 5d3fe94e..92bae387 100644 --- a/pyvlx/api/password_enter.py +++ b/pyvlx/api/password_enter.py @@ -1,5 +1,5 @@ """Module for handling the login to API.""" -from pyvlx.log import PYVLXLOG +from ..log import PYVLXLOG from .api_event import ApiEvent from .frames import ( FramePasswordEnterConfirmation, FramePasswordEnterRequest, diff --git a/pyvlx/api/reboot.py b/pyvlx/api/reboot.py index a064e047..21d4e1df 100644 --- a/pyvlx/api/reboot.py +++ b/pyvlx/api/reboot.py @@ -1,5 +1,5 @@ """Module for handling the Reboot to API.""" -from pyvlx.log import PYVLXLOG +from ..log import PYVLXLOG from .api_event import ApiEvent from .frames import FrameGatewayRebootConfirmation, FrameGatewayRebootRequest diff --git a/pyvlx/connection.py b/pyvlx/connection.py index 3b45ad2a..6c1637bb 100644 --- a/pyvlx/connection.py +++ b/pyvlx/connection.py @@ -3,8 +3,8 @@ import ssl from .exception import PyVLXException -from .frame_creation import frame_from_raw -from .frames import FrameBase +from .api.frame_creation import frame_from_raw +from .api.frames import FrameBase from .log import PYVLXLOG from .slip import get_next_slip, is_slip, slip_pack From b604cdc23278fa9b6fbf8eaeb9511da042e3b22b Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Sun, 22 Nov 2020 17:27:51 +0100 Subject: [PATCH 17/58] Integrate new KLF200 Class into Pyvlx. eg. pyvlx.klf200.reboot reboots the gateway update pyvlx functions as wrapper for klf200 object --- pyvlx/__init__.py | 2 +- pyvlx/pyvlx.py | 52 ++++++++++++++++++----------------------------- 2 files changed, 21 insertions(+), 33 deletions(-) diff --git a/pyvlx/__init__.py b/pyvlx/__init__.py index 9a9bb015..65fdbda4 100644 --- a/pyvlx/__init__.py +++ b/pyvlx/__init__.py @@ -15,4 +15,4 @@ from .pyvlx import PyVLX from .scene import Scene from .scenes import Scenes - +from .klf200gateway import Klf200Gateway diff --git a/pyvlx/pyvlx.py b/pyvlx/pyvlx.py index c140de7c..1b3cfaf8 100644 --- a/pyvlx/pyvlx.py +++ b/pyvlx/pyvlx.py @@ -9,18 +9,13 @@ from .config import Config from .connection import Connection -from .exception import PyVLXException from .heartbeat import Heartbeat from .log import PYVLXLOG from .node_updater import NodeUpdater from .nodes import Nodes from .scenes import Scenes -from .api.get_protocol_version import GetProtocolVersion -from .api.get_version import GetVersion +from .klf200gateway import Klf200Gateway from .api.house_status_monitor import house_status_monitor_enable -from .api.password_enter import PasswordEnter -from .api.reboot import Reboot -from .api.set_utc import SetUTC class PyVLX: @@ -39,42 +34,35 @@ def __init__(self, path=None, host=None, password=None, loop=None): self.scenes = Scenes(self) self.version = None self.protocol_version = None + self.klf200 = Klf200Gateway(pyvlx=self) async def connect(self): """Connect to KLF 200.""" - PYVLXLOG.debug("Connecting to KLF 200.") + PYVLXLOG.warning("Connecting to KLF 200.") await self.connection.connect() - login = PasswordEnter(pyvlx=self, password=self.config.password) - await login.do_api_call() - if not login.success: - raise PyVLXException("Login to KLF 200 failed, check credentials") - await self.update_version() - await SetUTC(pyvlx=self).do_api_call() + await self.klf200.password_enter(password=self.config.password) + await self.klf200.get_version() + await self.klf200.get_protocol_version() + PYVLXLOG.warning( + "Connected to: %s, protocol version: %s", + str(self.klf200.version), + str(self.klf200.protocol_version) + ) + + await self.klf200.get_state() + await self.klf200.get_network_setup() + await self.klf200.set_utc() await house_status_monitor_enable(pyvlx=self) async def reboot_gateway(self): - """Reboot gateway.""" + """For Compatibility: Reboot the KLF 200.""" PYVLXLOG.warning("KLF 200 reboot initiated") - reboot = Reboot(pyvlx=self) - await reboot.do_api_call() + await self.klf200.reboot() async def update_version(self): - """Retrieve version and protocol version from API.""" - get_version = GetVersion(pyvlx=self) - await get_version.do_api_call() - if not get_version.success: - raise PyVLXException("Unable to retrieve version") - self.version = get_version.version - get_protocol_version = GetProtocolVersion(pyvlx=self) - await get_protocol_version.do_api_call() - if not get_protocol_version.success: - raise PyVLXException("Unable to retrieve protocol version") - self.protocol_version = get_protocol_version.version - PYVLXLOG.debug( - "Connected to: %s, protocol version: %s", - self.version, - self.protocol_version, - ) + """For Compatibility: Retrieve version and protocol version from API.""" + await self.klf200.get_version() + await self.klf200.get_protocol_version() async def send_frame(self, frame): """Send frame to API via connection.""" From 3dd81e5d6d1218276e7027d26ad2ad023f079b43 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Sun, 22 Nov 2020 20:02:55 +0100 Subject: [PATCH 18/58] Unified Human readalbe String generation in Frames --- pyvlx/api/frames/frame_activate_scene.py | 18 ++--- pyvlx/api/frames/frame_command_send.py | 73 ++++++++++--------- pyvlx/api/frames/frame_discover_nodes.py | 7 +- pyvlx/api/frames/frame_error_notification.py | 2 +- pyvlx/api/frames/frame_facory_default.py | 4 +- .../frames/frame_get_all_nodes_information.py | 19 ++--- pyvlx/api/frames/frame_get_local_time.py | 16 ++-- pyvlx/api/frames/frame_get_network_setup.py | 12 +-- .../api/frames/frame_get_node_information.py | 21 +++--- .../api/frames/frame_get_protocol_version.py | 4 +- pyvlx/api/frames/frame_get_scene_list.py | 8 +- pyvlx/api/frames/frame_get_state.py | 10 +-- pyvlx/api/frames/frame_get_version.py | 5 +- pyvlx/api/frames/frame_leave_learn_state.py | 4 +- .../frames/frame_node_information_changed.py | 19 ++--- ...ode_state_position_changed_notification.py | 11 +-- pyvlx/api/frames/frame_password_change.py | 15 ++-- pyvlx/api/frames/frame_password_enter.py | 4 +- pyvlx/api/frames/frame_reboot.py | 4 +- pyvlx/api/frames/frame_set_node_name.py | 8 +- pyvlx/api/frames/frame_set_utc.py | 2 +- 21 files changed, 140 insertions(+), 126 deletions(-) diff --git a/pyvlx/api/frames/frame_activate_scene.py b/pyvlx/api/frames/frame_activate_scene.py index eb10858a..c0bf7c6a 100644 --- a/pyvlx/api/frames/frame_activate_scene.py +++ b/pyvlx/api/frames/frame_activate_scene.py @@ -12,11 +12,11 @@ class FrameActivateSceneRequest(FrameBase): PAYLOAD_LEN = 6 def __init__( - self, - scene_id=None, - session_id=None, - originator=Originator.USER, - velocity=Velocity.DEFAULT, + self, + scene_id=None, + session_id=None, + originator=Originator.USER, + velocity=Velocity.DEFAULT, ): """Init Frame.""" super().__init__(Command.GW_ACTIVATE_SCENE_REQ) @@ -45,8 +45,8 @@ def from_payload(self, payload): def __str__(self): """Return human readable string.""" - return "".format( - self.scene_id, self.session_id, self.originator, self.velocity + return '<{} scene_id="{}" session_id="{}" originator="{}" velocity="{}"/>'.format( + type(self).__name__, self.scene_id, self.session_id, self.originator, self.velocity ) @@ -82,6 +82,6 @@ def from_payload(self, payload): def __str__(self): """Return human readable string.""" - return "".format( - self.session_id, self.status + return '<{} session_id="{}" status="{}"/>'.format( + type(self).__name__, self.session_id, self.status ) diff --git a/pyvlx/api/frames/frame_command_send.py b/pyvlx/api/frames/frame_command_send.py index 5f36c5fe..2c4e0427 100644 --- a/pyvlx/api/frames/frame_command_send.py +++ b/pyvlx/api/frames/frame_command_send.py @@ -14,13 +14,13 @@ class FrameCommandSendRequest(FrameBase): PAYLOAD_LEN = 66 def __init__( - self, - node_ids=None, - parameter=Parameter(), - active_parameter=0, - session_id=None, - originator=Originator.USER, - **functional_parameter + self, + node_ids=None, + parameter=Parameter(), + active_parameter=0, + session_id=None, + originator=Originator.USER, + **functional_parameter ): """Init Frame.""" super().__init__(Command.GW_COMMAND_SEND_REQ) @@ -33,9 +33,10 @@ def __init__( self.session_id = session_id self.originator = originator self.priority = Priority.USER_LEVEL_2 - """Set the functional parameter indicator bytes in order to show which functional parameters are included in the frame. - Functional parameter dictionary will be checked for keys 'fp1' to 'fp16' - to set the appropriate indicator and the corresponding self.functional_parameter.""" + """Set the functional parameter indicator bytes in order to show which functional + parameters are included in the frame. Functional parameter dictionary will be checked + for keys 'fp1' to 'fp16' to set the appropriate indicator and the corresponding + self.functional_parameter.""" for i in range(1, 17): key = "fp%s" % (i) if key in functional_parameter: @@ -102,12 +103,13 @@ def __str__(self): str(key), Position(Parameter(bytes(value))), ) - return ''.format( - self.node_ids, - self.parameter, - functional_parameter, - self.session_id, - self.originator, + return ( + '<{} node_ids="{}"parameter="{}" functional_parameter="{}" ' + 'session_id="{}" originator="{}"/>'.format( + type(self).__name__, self.node_ids, + self.parameter, functional_parameter, + self.session_id, self.originator, + ) ) @@ -142,8 +144,8 @@ def from_payload(self, payload): def __str__(self): """Return human readable string.""" - return "".format( - self.session_id, self.status + return '<{} session_id="{}" status="{}"/>'.format( + type(self).__name__, self.session_id, self.status ) @@ -153,12 +155,12 @@ class FrameCommandRunStatusNotification(FrameBase): PAYLOAD_LEN = 13 def __init__( - self, - session_id=None, - status_id=None, - index_id=None, - node_parameter=None, - parameter_value=None, + self, + session_id=None, + status_id=None, + index_id=None, + node_parameter=None, + parameter_value=None, ): """Init Frame.""" super().__init__(Command.GW_COMMAND_RUN_STATUS_NTF) @@ -191,13 +193,11 @@ def from_payload(self, payload): def __str__(self): """Return human readable string.""" return ( - "".format( - self.session_id, - self.status_id, - self.index_id, - self.node_parameter, - self.parameter_value, + '<{} session_id="{}" status_id="{}" ' + 'index_id="{}" node_parameter="{}" parameter_value="{}"/>'.format( + type(self).__name__, self.session_id, + self.status_id, self.index_id, + self.node_parameter, self.parameter_value ) ) @@ -233,9 +233,10 @@ def from_payload(self, payload): def __str__(self): """Return human readable string.""" return ( - "".format( - self.session_id, self.index_id, self.node_parameter, self.seconds + '<{} session_id="{}" index_id="{}" ' + 'node_parameter="{}" seconds="{}"/>'.format( + type(self).__name__, self.session_id, + self.index_id, self.node_parameter, self.seconds ) ) @@ -261,6 +262,6 @@ def from_payload(self, payload): def __str__(self): """Return human readable string.""" - return "".format( - self.session_id + return '<{} session_id="{}" />'.format( + type(self).__name__, self.session_id ) diff --git a/pyvlx/api/frames/frame_discover_nodes.py b/pyvlx/api/frames/frame_discover_nodes.py index 9c1037a6..491c38f7 100644 --- a/pyvlx/api/frames/frame_discover_nodes.py +++ b/pyvlx/api/frames/frame_discover_nodes.py @@ -25,7 +25,7 @@ def from_payload(self, payload): def __str__(self): """Return human readable string.""" - return "".format(self.node_type) + return '<{} node_type="{}"/>'.format(type(self).__name__, self.node_type) class FrameDiscoverNodesConfirmation(FrameBase): @@ -58,6 +58,7 @@ def from_payload(self, payload): def __str__(self): """Return human readable string.""" - return "".format( - ":".join("{:02x}".format(c) for c in self.payload) + return '<{} payload="{}"/>'.format( + type(self).__name__, + ':'.join('{:02x}'.format(c) for c in self.payload) ) diff --git a/pyvlx/api/frames/frame_error_notification.py b/pyvlx/api/frames/frame_error_notification.py index d4739d94..611a03d3 100644 --- a/pyvlx/api/frames/frame_error_notification.py +++ b/pyvlx/api/frames/frame_error_notification.py @@ -38,4 +38,4 @@ def from_payload(self, payload): def __str__(self): """Return human readable string.""" - return "".format(self.error_type) + return '<{} error_type="{}"/>'.format(type(self).__name__, self.error_type) diff --git a/pyvlx/api/frames/frame_facory_default.py b/pyvlx/api/frames/frame_facory_default.py index e0b6b229..ebe41de5 100644 --- a/pyvlx/api/frames/frame_facory_default.py +++ b/pyvlx/api/frames/frame_facory_default.py @@ -15,7 +15,7 @@ def __init__(self): def __str__(self): """Return human readable string.""" - return "" + return '<{}/>'.format(type(self).__name__) class FrameGatewayFactoryDefaultConfirmation(FrameBase): @@ -29,4 +29,4 @@ def __init__(self): def __str__(self): """Return human readable string.""" - return "" + return '<{}/>'.format(type(self).__name__) diff --git a/pyvlx/api/frames/frame_get_all_nodes_information.py b/pyvlx/api/frames/frame_get_all_nodes_information.py index fa51dea9..de735e40 100644 --- a/pyvlx/api/frames/frame_get_all_nodes_information.py +++ b/pyvlx/api/frames/frame_get_all_nodes_information.py @@ -51,8 +51,8 @@ def from_payload(self, payload): def __str__(self): """Return human readable string.""" - return "".format( - self.status, self.number_of_nodes + return '<{} status="{}" number_of_nodes="{}"/>'.format( + type(self).__name__, self.status, self.number_of_nodes ) @@ -167,13 +167,14 @@ def timestamp_formatted(self): def __str__(self): """Return human readable string.""" return ( - "".format( + '<{} node_id="{}" order="{}" ' + 'placement="{}" name="{}" velocity="{}" node_type="{}" product_group="{}" ' + 'product_type="{}" node_variation="{}" power_mode="{}" build_number="{}" ' + 'serial_number="{}" state="{}" current_position="{}" ' + 'target="{}" current_position_fp1="{}" current_position_fp2="{}" ' + 'current_position_fp3="{}" current_position_fp4="{}" ' + 'remaining_time="{}" time="{}" alias_array="{}"/>'.format( + type(self).__name__, self.node_id, self.order, self.placement, diff --git a/pyvlx/api/frames/frame_get_local_time.py b/pyvlx/api/frames/frame_get_local_time.py index f1eec4fb..33b28823 100644 --- a/pyvlx/api/frames/frame_get_local_time.py +++ b/pyvlx/api/frames/frame_get_local_time.py @@ -40,19 +40,23 @@ def get_payload(self): def from_payload(self, payload): """Init frame from binary data.""" - self.utctime = int.from_bytes(payload[0:4], byteorder='big', signed=True) + self.utctime = int.from_bytes(payload[0:4], byteorder='big', signed=True) self.second = payload[4] self.minute = payload[5] self.hour = payload[6] self.dayofmonth = payload[7] self.month = payload[8] - self.year = int.from_bytes(payload[9:11], byteorder='big', signed=True) + self.year = int.from_bytes(payload[9:11], byteorder='big', signed=True) self.weekday = payload[11] - self.dayofyear =int.from_bytes( payload[12:14], byteorder='big', signed=True) + self.dayofyear = int.from_bytes(payload[12:14], byteorder='big', signed=True) self.daylightsavingflag = int.from_bytes(payload[14:15], byteorder='big', signed=True) def __str__(self): """Return human readable string.""" - return ''.format( - self.utctime, self.second, self.minute, self.hour, self.dayofmonth, self.month, self.year, self.weekday ,self.dayofyear, self.daylightsavingflag - ) + return ('<{} utctime="{}" second="{}" minute="{}" hour="{}" dayofmonth="{}" ' + 'month="{}" year="{}" weekday="{}" dayofyear="{}" daylightsavingflag="{}"/>'.format( + type(self).__name__, self.utctime, self.second, self.minute, self.hour, + self.dayofmonth, self.month, self.year, self.weekday, self.dayofyear, + self.daylightsavingflag + ) + ) diff --git a/pyvlx/api/frames/frame_get_network_setup.py b/pyvlx/api/frames/frame_get_network_setup.py index 212a9ac9..f6babf3f 100644 --- a/pyvlx/api/frames/frame_get_network_setup.py +++ b/pyvlx/api/frames/frame_get_network_setup.py @@ -27,7 +27,8 @@ class FrameGetNetworkSetupConfirmation(FrameBase): PAYLOAD_LEN = 13 - def __init__(self, ipaddress = bytes(4), netmask = bytes(4), gateway = bytes(4), dhcp = DHCPParameter.DISABLE): + def __init__(self, ipaddress=bytes(4), netmask=bytes(4), gateway=bytes(4), + dhcp=DHCPParameter.DISABLE): """Init Frame.""" super().__init__(Command.GW_GET_NETWORK_SETUP_CFM) self._ipaddress = ipaddress @@ -45,14 +46,15 @@ def netmask(self): """Return ipaddress as human readable string.""" return ".".join(str(c) for c in self._netmask) - @property + @property def gateway(self): """Return ipaddress as human readable string.""" return ".".join(str(c) for c in self._gateway) def get_payload(self): """Return Payload.""" - payload = bytes([self._ipaddress.value, self._netmask.value, self._gateway.value, self.dhcp.value]) + payload = bytes([self._ipaddress.value, self._netmask.value, + self._gateway.value, self.dhcp.value]) return payload def from_payload(self, payload): @@ -66,6 +68,6 @@ def from_payload(self, payload): def __str__(self): """Return human readable string.""" - return ''.format( - self.ipaddress, self.netmask, self.gateway, self.dhcp + return '<{} ipaddress="{}" netmask="{}" gateway="{}" dhcp="{}"/>'.format( + type(self).__name__, self.ipaddress, self.netmask, self.gateway, self.dhcp ) diff --git a/pyvlx/api/frames/frame_get_node_information.py b/pyvlx/api/frames/frame_get_node_information.py index 0b6b06dc..f04906e6 100644 --- a/pyvlx/api/frames/frame_get_node_information.py +++ b/pyvlx/api/frames/frame_get_node_information.py @@ -32,7 +32,7 @@ def from_payload(self, payload): def __str__(self): """Return human readable string.""" - return "".format(self.node_id) + return '<{} node_id="{}"/>'.format(type(self).__name__, self.node_id) class NodeInformationStatus(Enum): @@ -65,8 +65,8 @@ def from_payload(self, payload): def __str__(self): """Return human readable string.""" - return "".format( - self.node_id, self.status + return '<{} node_id="{}" status="{}"/>'.format( + type(self).__name__, self.node_id, self.status ) @@ -184,13 +184,14 @@ def timestamp_formatted(self): def __str__(self): """Return human readable string.""" return ( - "".format( + '<{} node_id="{}" order="{}" ' + 'placement="{}" name="{}" velocity="{}" node_type="{}" product_group="{}" ' + 'product_type="{}" node_variation="{}" power_mode="{}" build_number="{}" ' + 'serial_number="{}" state="{}" current_position="{}" ' + 'target="{}" current_position_fp1="{}" current_position_fp2="{}" ' + 'current_position_fp3="{}" current_position_fp4="{}" ' + 'remaining_time="{}" time="{}" alias_array="{}"/>'.format( + type(self).__name__, self.node_id, self.order, self.placement, diff --git a/pyvlx/api/frames/frame_get_protocol_version.py b/pyvlx/api/frames/frame_get_protocol_version.py index 07e4ee4d..0bbeaa77 100644 --- a/pyvlx/api/frames/frame_get_protocol_version.py +++ b/pyvlx/api/frames/frame_get_protocol_version.py @@ -48,6 +48,6 @@ def from_payload(self, payload): def __str__(self): """Return human readable string.""" - return ''.format( - self.version + return '<{} version="{}"/>'.format( + type(self).__name__, self.version ) diff --git a/pyvlx/api/frames/frame_get_scene_list.py b/pyvlx/api/frames/frame_get_scene_list.py index b0dcb1fe..97f2faa8 100644 --- a/pyvlx/api/frames/frame_get_scene_list.py +++ b/pyvlx/api/frames/frame_get_scene_list.py @@ -36,8 +36,8 @@ def from_payload(self, payload): def __str__(self): """Return human readable string.""" - return "".format( - self.count_scenes + return '<{} count_scenes="{}"/>'.format( + type(self).__name__, self.count_scenes ) @@ -75,6 +75,6 @@ def from_payload(self, payload): def __str__(self): """Return human readable string.""" - return "".format( - self.scenes, self.remaining_scenes + return '<{} scenes="{}" remaining_scenes="{}">'.format( + type(self).__name__, self.scenes, self.remaining_scenes ) diff --git a/pyvlx/api/frames/frame_get_state.py b/pyvlx/api/frames/frame_get_state.py index 6418391b..a55f8f28 100644 --- a/pyvlx/api/frames/frame_get_state.py +++ b/pyvlx/api/frames/frame_get_state.py @@ -46,9 +46,9 @@ class FrameGetStateConfirmation(FrameBase): PAYLOAD_LEN = 6 def __init__( - self, - gateway_state=GatewayState.TEST_MODE, - gateway_sub_state=GatewaySubState.IDLE, + self, + gateway_state=GatewayState.TEST_MODE, + gateway_sub_state=GatewaySubState.IDLE, ): """Init Frame.""" super().__init__(Command.GW_GET_STATE_CFM) @@ -68,6 +68,6 @@ def from_payload(self, payload): def __str__(self): """Return human readable string.""" - return ''.format( - self.gateway_state, self.gateway_sub_state + return '<{} gateway_state="{}" gateway_sub_state="{}"/>'.format( + type(self).__name__, self.gateway_state, self.gateway_sub_state ) diff --git a/pyvlx/api/frames/frame_get_version.py b/pyvlx/api/frames/frame_get_version.py index 53ba183c..66f3bdef 100644 --- a/pyvlx/api/frames/frame_get_version.py +++ b/pyvlx/api/frames/frame_get_version.py @@ -64,8 +64,7 @@ def from_payload(self, payload): def __str__(self): """Return human readable string.""" return ( - ''.format( - self.software_version, self.hardware_version, self.product + '<{} software_version="{}" hardware_version="{}" product="{}"/>'.format( + type(self).__name__, self.software_version, self.hardware_version, self.product ) ) diff --git a/pyvlx/api/frames/frame_leave_learn_state.py b/pyvlx/api/frames/frame_leave_learn_state.py index 6b62088c..a30168c0 100644 --- a/pyvlx/api/frames/frame_leave_learn_state.py +++ b/pyvlx/api/frames/frame_leave_learn_state.py @@ -19,7 +19,7 @@ def __init__(self): def __str__(self): """Return human readable string.""" - return "" + return '<{}/>'.format(type(self).__name__) @@ -43,4 +43,4 @@ def from_payload(self, payload): def __str__(self): """Return human readable string.""" - return "<{} status={}/>".format(self.__class__.__name__, self.status) + return '<{} status="{}"/>'.format(type(self).__name__, self.status) diff --git a/pyvlx/api/frames/frame_node_information_changed.py b/pyvlx/api/frames/frame_node_information_changed.py index 7b30155a..24ace17b 100644 --- a/pyvlx/api/frames/frame_node_information_changed.py +++ b/pyvlx/api/frames/frame_node_information_changed.py @@ -11,12 +11,12 @@ class FrameNodeInformationChangedNotification(FrameBase): PAYLOAD_LEN = 69 def __init__( - self, - node_id=0, - name=None, - order=0, - placement=0, - node_variation=NodeVariation.NOT_SET, + self, + node_id=0, + name=None, + order=0, + placement=0, + node_variation=NodeVariation.NOT_SET, ): """Init Frame.""" super().__init__(Command.GW_NODE_INFORMATION_CHANGED_NTF) @@ -46,8 +46,9 @@ def from_payload(self, payload): def __str__(self): """Return human readable string.""" return ( - ''.format( - self.node_id, self.name, self.order, self.placement, self.node_variation + '<{} node_id="{}" name="{}" order="{}" ' + 'placement="{}" node_variation="{}"/>'.format( + type(self).__name__, self.node_id, self.name, + self.order, self.placement, self.node_variation ) ) diff --git a/pyvlx/api/frames/frame_node_state_position_changed_notification.py b/pyvlx/api/frames/frame_node_state_position_changed_notification.py index 4cbba9cb..16de817a 100644 --- a/pyvlx/api/frames/frame_node_state_position_changed_notification.py +++ b/pyvlx/api/frames/frame_node_state_position_changed_notification.py @@ -64,11 +64,12 @@ def timestamp_formatted(self): def __str__(self): """Return human readable string.""" return ( - "".format( + '<{} node_id="{}" ' + 'state="{}" current_position="{}" ' + 'target="{}" current_position_fp1="{}" current_position_fp2="{}" ' + 'current_position_fp3="{}" current_position_fp4="{}" ' + 'remaining_time="{}" time="{}"/>'.format( + type(self).__name__, self.node_id, self.state, self.current_position, diff --git a/pyvlx/api/frames/frame_password_change.py b/pyvlx/api/frames/frame_password_change.py index a168cdd0..05f2b86d 100644 --- a/pyvlx/api/frames/frame_password_change.py +++ b/pyvlx/api/frames/frame_password_change.py @@ -31,7 +31,8 @@ def get_payload(self): if len(self.newpassword) > self.MAX_SIZE: raise PyVLXException("newpassword is too long") - return string_to_bytes(self.currentpassword, self.MAX_SIZE)+string_to_bytes(self.newpassword, self.MAX_SIZE) + return string_to_bytes(self.currentpassword, + self.MAX_SIZE)+string_to_bytes(self.newpassword, self.MAX_SIZE) def from_payload(self, payload): """Init frame from binary data.""" @@ -46,7 +47,9 @@ def __str__(self): newpassword_esc = ( None if self.newpassword is None else "{}****".format(self.newpassword[:2]) ) - return "<{} currentpassword={} newpassword={}/>".format(self.__class__.__name__,currentpassword_esc, newpassword_esc) + return ('<{} currentpassword="{}" newpassword="{}"/>' + .format(type(self).__name__, currentpassword_esc, newpassword_esc) + ) class PasswordChangeConfirmationStatus(Enum): @@ -76,7 +79,7 @@ def from_payload(self, payload): def __str__(self): """Return human readable string.""" - return "<{} status='{}'/>".format(self.__class__.__name__, self.status) + return '<{} status="{}"/>'.format(type(self).__name__, self.status) @@ -85,9 +88,9 @@ class FramePasswordChangeNotification(FrameBase): MAX_SIZE = 32 PAYLOAD_LEN = 32 - def __init__(self, currentpassword=None): + def __init__(self): """Init Frame.""" - super().__init__(Command.GW_PASSWORD_CHANGED_NTF) + super().__init__(Command.GW_PASSWORD_CHANGE_NTF) self.password = None def get_payload(self): @@ -108,4 +111,4 @@ def __str__(self): password_esc = ( None if self.password is None else "{}****".format(self.password[:2]) ) - return "<{} password={} />".format(self.__class__.__name__,password_esc) + return '<{} password="{}" />'.format(type(self).__name__, password_esc) diff --git a/pyvlx/api/frames/frame_password_enter.py b/pyvlx/api/frames/frame_password_enter.py index 41448e14..8a767b2c 100644 --- a/pyvlx/api/frames/frame_password_enter.py +++ b/pyvlx/api/frames/frame_password_enter.py @@ -36,7 +36,7 @@ def __str__(self): password_esc = ( None if self.password is None else "{}****".format(self.password[:2]) ) - return "".format(password_esc) + return '<{} password="{}"/>'.format(type(self).__name__, password_esc) class PasswordEnterConfirmationStatus(Enum): @@ -66,4 +66,4 @@ def from_payload(self, payload): def __str__(self): """Return human readable string.""" - return "".format(self.status) + return '<{} status="{}"/>'.format(type(self).__name__, self.status) diff --git a/pyvlx/api/frames/frame_reboot.py b/pyvlx/api/frames/frame_reboot.py index 221af9b0..d60f6b1c 100644 --- a/pyvlx/api/frames/frame_reboot.py +++ b/pyvlx/api/frames/frame_reboot.py @@ -15,7 +15,7 @@ def __init__(self): def __str__(self): """Return human readable string.""" - return "" + return '<{}/>'.format(type(self).__name__) class FrameGatewayRebootConfirmation(FrameBase): @@ -29,4 +29,4 @@ def __init__(self): def __str__(self): """Return human readable string.""" - return "" + return '<{}/>'.format(type(self).__name__) diff --git a/pyvlx/api/frames/frame_set_node_name.py b/pyvlx/api/frames/frame_set_node_name.py index 2123c438..0a87e020 100644 --- a/pyvlx/api/frames/frame_set_node_name.py +++ b/pyvlx/api/frames/frame_set_node_name.py @@ -31,8 +31,8 @@ def from_payload(self, payload): def __str__(self): """Return human readable string.""" - return ''.format( - self.node_id, self.name + return '<{} node_id="{}" name="{}"/>'.format( + type(self).__name__, self.node_id, self.name ) @@ -66,6 +66,6 @@ def from_payload(self, payload): def __str__(self): """Return human readable string.""" - return ''.format( - self.node_id, self.status + return '<{} node_id="{}" status="{}"/>'.format( + type(self).__name__, self.node_id, self.status ) diff --git a/pyvlx/api/frames/frame_set_utc.py b/pyvlx/api/frames/frame_set_utc.py index 380df94c..3d630e82 100644 --- a/pyvlx/api/frames/frame_set_utc.py +++ b/pyvlx/api/frames/frame_set_utc.py @@ -41,4 +41,4 @@ def from_payload(self, payload): def __str__(self): """Return human readable string.""" - return ''.format(self.timestamp_formatted) + return '<{} time="{}"/>'.format(type(self).__name__, self.timestamp_formatted) From b5a16ab05cc40e79f8f0acc367445b64452a106c Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Sun, 22 Nov 2020 20:06:49 +0100 Subject: [PATCH 19/58] Add missing humanreadable frame updates --- pyvlx/api/frames/frame_command_send.py | 2 +- pyvlx/api/frames/frame_password_change.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyvlx/api/frames/frame_command_send.py b/pyvlx/api/frames/frame_command_send.py index 2c4e0427..423fa14b 100644 --- a/pyvlx/api/frames/frame_command_send.py +++ b/pyvlx/api/frames/frame_command_send.py @@ -262,6 +262,6 @@ def from_payload(self, payload): def __str__(self): """Return human readable string.""" - return '<{} session_id="{}" />'.format( + return '<{} session_id="{}"/>'.format( type(self).__name__, self.session_id ) diff --git a/pyvlx/api/frames/frame_password_change.py b/pyvlx/api/frames/frame_password_change.py index 05f2b86d..45f314f1 100644 --- a/pyvlx/api/frames/frame_password_change.py +++ b/pyvlx/api/frames/frame_password_change.py @@ -111,4 +111,4 @@ def __str__(self): password_esc = ( None if self.password is None else "{}****".format(self.password[:2]) ) - return '<{} password="{}" />'.format(type(self).__name__, password_esc) + return '<{} password="{}"/>'.format(type(self).__name__, password_esc) From 5e1775fcc7351d508e1aa64a788949ecd2adf74a Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Sun, 22 Nov 2020 20:14:08 +0100 Subject: [PATCH 20/58] Change Human Readable String generation for API and Base --- pyvlx/api/get_local_time.py | 13 +++++++---- pyvlx/api/get_network_setup.py | 9 +++++--- pyvlx/api/get_protocol_version.py | 4 ++-- pyvlx/api/get_state.py | 9 ++++---- pyvlx/api/get_version.py | 12 +++++++---- pyvlx/api/leave_learn_state.py | 7 +++--- pyvlx/api/set_utc.py | 1 - pyvlx/exception.py | 4 ++-- pyvlx/klf200gateway.py | 3 ++- pyvlx/opening_device.py | 36 +++++++++++-------------------- pyvlx/parameter.py | 10 ++++----- pyvlx/scene.py | 4 +++- 12 files changed, 57 insertions(+), 55 deletions(-) diff --git a/pyvlx/api/get_local_time.py b/pyvlx/api/get_local_time.py index be0b76e7..46d928ef 100644 --- a/pyvlx/api/get_local_time.py +++ b/pyvlx/api/get_local_time.py @@ -15,8 +15,8 @@ def __init__(self, utctime=None, localtime=None): def __str__(self): """Return human readable string.""" return ( - '<"{}" utctime = "{}" localtime = "{}" />'.format( - self.__class__.__name__, self.utctime, self.localtime + '<{} utctime="{}" localtime="{}"/>'.format( + type(self).__name__, self.utctime, self.localtime ) ) @@ -40,8 +40,13 @@ async def handle_frame(self, frame): weekday = 6 else: weekday = frame.weekday -1 - self.time = DtoLocalTime(datetime.fromtimestamp(frame.utctime), - datetime.fromtimestamp(time.mktime((frame.year+1900, frame.month, frame.dayofmonth, frame.hour, frame.minute, frame.second, weekday, frame.dayofyear, frame.daylightsavingflag)))) + self.time = DtoLocalTime( + datetime.fromtimestamp(frame.utctime), + datetime.fromtimestamp(time.mktime( + (frame.year+1900, frame.month, frame.dayofmonth, + frame.hour, frame.minute, frame.second, + weekday, frame.dayofyear, frame.daylightsavingflag) + ))) self.success = True return True diff --git a/pyvlx/api/get_network_setup.py b/pyvlx/api/get_network_setup.py index a1d0fda3..177980d2 100644 --- a/pyvlx/api/get_network_setup.py +++ b/pyvlx/api/get_network_setup.py @@ -17,8 +17,9 @@ def dhcp_name(self): def __str__(self): """Return human readable string.""" - return ''.format( - self.ipaddress, self.gateway, self.gateway, self.dhcp, self.dhcp_name + return '<{} ipaddress="{}" gateway="{}" gateway="{}" dhcp="{}" dhcp_name="{}"/>'.format( + type(self).__name__, self.ipaddress, self.gateway, + self.gateway, self.dhcp, self.dhcp_name ) class GetNetworkSetup(ApiEvent): @@ -35,7 +36,9 @@ async def handle_frame(self, frame): if not isinstance(frame, FrameGetNetworkSetupConfirmation): return False self.success = True - self.networksetup = DtoNetworkSetup(frame.ipaddress, frame.gateway, frame.netmask, frame.dhcp) + self.networksetup = DtoNetworkSetup( + frame.ipaddress, frame.gateway, frame.netmask, frame.dhcp + ) return True def request_frame(self): diff --git a/pyvlx/api/get_protocol_version.py b/pyvlx/api/get_protocol_version.py index c4ffbfb5..4526c675 100644 --- a/pyvlx/api/get_protocol_version.py +++ b/pyvlx/api/get_protocol_version.py @@ -12,8 +12,8 @@ def __init__(self, majorversion=None, minorversion=None): def __str__(self): """Return human readable string.""" return ( - '<{} majorversion = "{}" minorversion = "{}" />'.format( - self.__class__.__name__, self.majorversion, self.minorversion + '<{} majorversion="{}" minorversion="{}"/>'.format( + type(self).__name__, self.majorversion, self.minorversion ) ) diff --git a/pyvlx/api/get_state.py b/pyvlx/api/get_state.py index 66d59911..552b21e9 100644 --- a/pyvlx/api/get_state.py +++ b/pyvlx/api/get_state.py @@ -22,11 +22,10 @@ def gateway_sub_state_name(self): def __str__(self): """Return human readable string.""" return ( - '' - 'gateway_sub_state="{}" />' - 'gateway_sub_state=_name"{}" />'.format( - self.gateway_sub_state_name, self.gateway_state_name, self.gateway_sub_state, self.gateway_sub_state_name + '<{} gateway_state="{}" gateway_state_name="{}" gateway_sub_state="{}" ' + 'gateway_sub_state=_name"{}"/>'.format( + type(self).__name__, self.gateway_state, self.gateway_state_name, + self.gateway_sub_state, self.gateway_sub_state_name ) ) diff --git a/pyvlx/api/get_version.py b/pyvlx/api/get_version.py index 941944b3..e08dc9c3 100644 --- a/pyvlx/api/get_version.py +++ b/pyvlx/api/get_version.py @@ -4,7 +4,8 @@ class DtoVersion: """Object for KLF200 Data""" - def __init__(self, softwareversion=None, hardwareversion=None, productgroup=None, producttype=None): + def __init__(self, + softwareversion=None, hardwareversion=None, productgroup=None, producttype=None): self.softwareversion = softwareversion self.hardwareversion = hardwareversion self.productgroup = productgroup @@ -14,8 +15,10 @@ def __init__(self, softwareversion=None, hardwareversion=None, productgroup=None def __str__(self): """Return human readable string.""" return ( - '<{} softwareversion = "{}" hardwareversion = "{}" productgroup = "{}" producttype = "{}" />'.format( - self.__class__.__name__, self.softwareversion, self.hardwareversion, self.productgroup, self.producttype + '<{} softwareversion="{}" hardwareversion="{}" ' + 'productgroup="{}" producttype="{}"/>'.format( + type(self).__name__, + self.softwareversion, self.hardwareversion, self.productgroup, self.producttype ) ) class GetVersion(ApiEvent): @@ -31,7 +34,8 @@ async def handle_frame(self, frame): """Handle incoming API frame, return True if this was the expected frame.""" if not isinstance(frame, FrameGetVersionConfirmation): return False - self.version = DtoVersion(frame.software_version, frame.hardware_version, frame.product_group, frame.product_type) + self.version = DtoVersion(frame.software_version, frame.hardware_version, + frame.product_group, frame.product_type) self.success = True return True diff --git a/pyvlx/api/leave_learn_state.py b/pyvlx/api/leave_learn_state.py index 4a1ac868..931f4582 100644 --- a/pyvlx/api/leave_learn_state.py +++ b/pyvlx/api/leave_learn_state.py @@ -1,7 +1,8 @@ """Module for handling the login to API.""" from ..log import PYVLXLOG from .api_event import ApiEvent -from .frames import FrameLeaveLearnStateRequest, FrameLeaveLearnStateConfirmation, LeaveLearnStateConfirmationStatus +from .frames import (FrameLeaveLearnStateRequest, + FrameLeaveLearnStateConfirmation, LeaveLearnStateConfirmationStatus) class DtoLeaveLearnState: @@ -17,8 +18,8 @@ def status_name(self): def __str__(self): """Return human readable string.""" return ( - '<"{}" status = "{}" status = "{}" />'.format( - self.__class__.__name__, self.status, self.status_name + '<{} status="{}" status_name="{}"/>'.format( + type(self).__name__, self.status, self.status_name ) ) diff --git a/pyvlx/api/set_utc.py b/pyvlx/api/set_utc.py index 1d6bacdd..5182d808 100644 --- a/pyvlx/api/set_utc.py +++ b/pyvlx/api/set_utc.py @@ -24,4 +24,3 @@ def request_frame(self): """Construct initiating frame.""" timestamp = int(self.timestamp) return FrameSetUTCRequest(timestamp=timestamp) - diff --git a/pyvlx/exception.py b/pyvlx/exception.py index 1adacd60..cb70e6f2 100644 --- a/pyvlx/exception.py +++ b/pyvlx/exception.py @@ -20,6 +20,6 @@ def _format_parameter(self): def __str__(self): """Return object as readable string.""" - return ''.format( - self.description, self._format_parameter() + return '<{} description="{}" {}/>'.format( + type(self).__name__, self.description, self._format_parameter() ) diff --git a/pyvlx/klf200gateway.py b/pyvlx/klf200gateway.py index 0a32f19a..2a45a80d 100644 --- a/pyvlx/klf200gateway.py +++ b/pyvlx/klf200gateway.py @@ -132,5 +132,6 @@ def __str__(self): """Return object as readable string.""" return ( '<{} state="{}" network_setup="{}" version="{}" protocol_version="{}"/>'.format( - type(self).__name__, str(self.state), str(self.network_setup), str(self.version), str(self.protocol_version)) + type(self).__name__, str(self.state), str(self.network_setup), + str(self.version), str(self.protocol_version)) ) diff --git a/pyvlx/opening_device.py b/pyvlx/opening_device.py index b2fee0ed..3e1cab88 100644 --- a/pyvlx/opening_device.py +++ b/pyvlx/opening_device.py @@ -88,15 +88,8 @@ async def stop(self, wait_for_completion=True): def __str__(self): """Return object as readable string.""" return ( - '<{} name="{}" ' - 'node_id="{}" ' - 'serial_number="{}" ' - 'position="{}"/>'.format( - type(self).__name__, - self.name, - self.node_id, - self.serial_number, - self.position, + '<{} name="{}" node_id="{}" serial_number="{}" position="{}"/>'.format( + type(self).__name__, self.name, self.node_id, self.serial_number, self.position ) ) @@ -138,15 +131,9 @@ def __init__( def __str__(self): """Return object as readable string.""" return ( - '<{} name="{}" ' - 'node_id="{}" rain_sensor={} ' - 'serial_number="{}" position="{}"/>'.format( - type(self).__name__, - self.name, - self.node_id, - self.rain_sensor, - self.serial_number, - self.position, + '<{} name="{}" node_id="{}" rain_sensor={} serial_number="{}" position="{}"/>'.format( + type(self).__name__, self.name, self.node_id, + self.rain_sensor, self.serial_number, self.position ) ) @@ -155,7 +142,7 @@ class Blind(OpeningDevice): """Blind objects.""" def __init__( - self, pyvlx, node_id, name, serial_number, position_parameter=Parameter() + self, pyvlx, node_id, name, serial_number, position_parameter=Parameter() ): """Initialize Blind class. @@ -183,8 +170,8 @@ async def set_position(self, position, wait_for_completion=True): Parameters: * position: Position object containing the current position. * target_position: Position object holding the target position - which allows to ajust the position while the blind is in movement - without stopping the blind (if orientation position has been changed.) + which allows to ajust the position while the blind is in movement + without stopping the blind (if orientation position has been changed.) * wait_for_completion: If set, function will return after device has reached target position. @@ -241,8 +228,8 @@ async def set_orientation(self, orientation, wait_for_completion=True): Parameters: * orientation: Position object containing the target orientation. + target_orientation: Position object holding the target orientation - which allows to ajust the orientation while the blind is in movement - without stopping the blind (if the position has been changed.) + which allows to ajust the orientation while the blind is in movement + without stopping the blind (if the position has been changed.) * wait_for_completion: If set, function will return after device has reached target position. @@ -261,7 +248,8 @@ async def set_orientation(self, orientation, wait_for_completion=True): if not command_send.success: raise PyVLXException("Unable to send command") await self.after_update() - # KLF200 always send UNKNOWN position for functional parameter, so orientation is set directly and not via GW_NODE_STATE_POSITION_CHANGED_NTF + # KLF200 always send UNKNOWN position for functional parameter, + # so orientation is set directly and not via GW_NODE_STATE_POSITION_CHANGED_NTF async def open_orientation(self, wait_for_completion=True): """Open Blind slats orientation. diff --git a/pyvlx/parameter.py b/pyvlx/parameter.py index d44395be..7df725a6 100644 --- a/pyvlx/parameter.py +++ b/pyvlx/parameter.py @@ -58,11 +58,11 @@ def from_raw(raw): if len(raw) != 2: raise PyVLXException("Position::raw_must_be_two_bytes") if ( - raw != Position.from_int(Position.CURRENT) - and raw != Position.from_int(Position.IGNORE) - and raw != Position.from_int(Position.TARGET) - and raw != Position.from_int(Position.UNKNOWN_VALUE) - and Position.to_int(raw) > Position.MAX + raw != Position.from_int(Position.CURRENT) + and raw != Position.from_int(Position.IGNORE) + and raw != Position.from_int(Position.TARGET) + and raw != Position.from_int(Position.UNKNOWN_VALUE) + and Position.to_int(raw) > Position.MAX ): raise PyVLXException("parameter::raw_exceed_limit", raw=raw) return raw diff --git a/pyvlx/scene.py b/pyvlx/scene.py index ccf90fe0..224fbc6d 100644 --- a/pyvlx/scene.py +++ b/pyvlx/scene.py @@ -39,7 +39,9 @@ async def run(self, wait_for_completion=True): def __str__(self): """Return object as readable string.""" - return ''.format(self.name, self.scene_id) + return '<{} name="{}" id="{}"/>'.format( + type(self).__name__, self.name, self.scene_id + ) def __eq__(self, other): """Equal operator.""" From 02adcde98091511192db224f5a61980ef6e72893 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Wed, 25 Nov 2020 18:37:09 +0100 Subject: [PATCH 21/58] Edit Import for Testclasses --- test/alias_array_test.py | 2 +- test/frame_activate_scene_cfm_test.py | 4 ++-- test/frame_activate_scene_req_test.py | 7 +++---- test/frame_activation_log_updated_ntf_test.py | 4 ++-- test/frame_command_remaining_time_notification_test.py | 4 ++-- test/frame_command_run_status_notification_test.py | 4 ++-- test/frame_command_send_cfm_test.py | 4 ++-- test/frame_command_send_req_test.py | 4 ++-- test/frame_discover_nodes_cfm_test.py | 4 ++-- test/frame_discover_nodes_ntf_test.py | 4 ++-- test/frame_discover_nodes_req_test.py | 4 ++-- test/frame_error_test.py | 4 ++-- test/frame_get_all_nodes_information_cfm_test.py | 4 ++-- test/frame_get_all_nodes_information_finished_ntf_test.py | 4 ++-- test/frame_get_all_nodes_information_ntf_test.py | 6 +++--- test/frame_get_all_nodes_information_req_test.py | 4 ++-- test/frame_get_node_information_cfm_test.py | 4 ++-- test/frame_get_node_information_ntf_test.py | 6 +++--- test/frame_get_node_information_req_test.py | 4 ++-- test/frame_get_protocol_version_cfm_test.py | 4 ++-- test/frame_get_protocol_version_req_test.py | 4 ++-- test/frame_get_scene_list_cfm_test.py | 4 ++-- test/frame_get_scene_list_ntf_test.py | 4 ++-- test/frame_get_scene_list_req_test.py | 4 ++-- test/frame_get_state_cfm_test.py | 4 ++-- test/frame_get_state_req_test.py | 4 ++-- test/frame_get_version_cfm_test.py | 4 ++-- test/frame_get_version_req_test.py | 4 ++-- test/frame_gw_reboot_cfm_test.py | 4 ++-- test/frame_gw_reboot_req_test.py | 4 ++-- test/frame_helper_test.py | 2 +- test/frame_house_status_monitor_disable_cfm_test.py | 4 ++-- test/frame_house_status_monitor_disable_req_test.py | 4 ++-- test/frame_house_status_monitor_enable_cfm_test.py | 4 ++-- test/frame_house_status_monitor_enable_req_test.py | 4 ++-- test/frame_node_information_changed_ntf_test.py | 4 ++-- test/frame_node_information_mischroe_test.py | 4 ++-- test/frame_node_state_position_changed_ntf_test.py | 4 ++-- test/frame_password_enter_cfm_test.py | 4 ++-- test/frame_password_enter_req_test.py | 4 ++-- test/frame_session_finished_notification_test.py | 4 ++-- test/frame_set_node_name_cfm_test.py | 4 ++-- test/frame_set_node_name_req_test.py | 4 ++-- test/frame_set_utc_cfm_test.py | 4 ++-- test/frame_set_utc_req_test.py | 4 ++-- test/frame_test.py | 2 +- test/node_helper_test.py | 2 +- test/session_id_test.py | 2 +- 48 files changed, 94 insertions(+), 95 deletions(-) diff --git a/test/alias_array_test.py b/test/alias_array_test.py index 27847a7c..8ee3d8dc 100644 --- a/test/alias_array_test.py +++ b/test/alias_array_test.py @@ -1,7 +1,7 @@ """Unit tests for AliasArray module.""" import unittest -from pyvlx.frames.alias_array import AliasArray +from pyvlx.api.frames.alias_array import AliasArray from pyvlx.exception import PyVLXException diff --git a/test/frame_activate_scene_cfm_test.py b/test/frame_activate_scene_cfm_test.py index 26a2b995..52c4a3ed 100644 --- a/test/frame_activate_scene_cfm_test.py +++ b/test/frame_activate_scene_cfm_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameActivateSceneConfirmation.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import ( +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import ( ActivateSceneConfirmationStatus, FrameActivateSceneConfirmation) diff --git a/test/frame_activate_scene_req_test.py b/test/frame_activate_scene_req_test.py index e3a502ac..1d6addaf 100644 --- a/test/frame_activate_scene_req_test.py +++ b/test/frame_activate_scene_req_test.py @@ -2,10 +2,9 @@ import unittest from pyvlx.const import Originator, Priority, Velocity -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameActivateSceneRequest - - +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameActivateSceneRequest + class TestFrameActivateSceneRequest(unittest.TestCase): """Test class FrameActivateSceneRequest.""" diff --git a/test/frame_activation_log_updated_ntf_test.py b/test/frame_activation_log_updated_ntf_test.py index f229a77e..d9ecc5ea 100644 --- a/test/frame_activation_log_updated_ntf_test.py +++ b/test/frame_activation_log_updated_ntf_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameActivationLogUpdatedNotification.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameActivationLogUpdatedNotification +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameActivationLogUpdatedNotification class TestFrameActivationLogUpdatedNotification(unittest.TestCase): diff --git a/test/frame_command_remaining_time_notification_test.py b/test/frame_command_remaining_time_notification_test.py index 1ee6fe29..98e51413 100644 --- a/test/frame_command_remaining_time_notification_test.py +++ b/test/frame_command_remaining_time_notification_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameCommandRemainingTimeNotification.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameCommandRemainingTimeNotification +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameCommandRemainingTimeNotification class TestFrameCommandRemainingTimeNotification(unittest.TestCase): diff --git a/test/frame_command_run_status_notification_test.py b/test/frame_command_run_status_notification_test.py index 2e34f6fe..a3bea63d 100644 --- a/test/frame_command_run_status_notification_test.py +++ b/test/frame_command_run_status_notification_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameCommandRunStatusNotification.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameCommandRunStatusNotification +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameCommandRunStatusNotification class TestFrameCommandRunStatusNotification(unittest.TestCase): diff --git a/test/frame_command_send_cfm_test.py b/test/frame_command_send_cfm_test.py index 67ce50b0..6213e8d0 100644 --- a/test/frame_command_send_cfm_test.py +++ b/test/frame_command_send_cfm_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameCommandSendConfirmation.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import ( +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import ( CommandSendConfirmationStatus, FrameCommandSendConfirmation) diff --git a/test/frame_command_send_req_test.py b/test/frame_command_send_req_test.py index 86441872..04b04dbd 100644 --- a/test/frame_command_send_req_test.py +++ b/test/frame_command_send_req_test.py @@ -3,8 +3,8 @@ from pyvlx import Position, PyVLXException from pyvlx.const import Originator -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameCommandSendRequest +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameCommandSendRequest class TestFrameCommandSendRequest(unittest.TestCase): diff --git a/test/frame_discover_nodes_cfm_test.py b/test/frame_discover_nodes_cfm_test.py index 1d90c13c..b496b401 100644 --- a/test/frame_discover_nodes_cfm_test.py +++ b/test/frame_discover_nodes_cfm_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameDiscoverNodesConfirmation.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameDiscoverNodesConfirmation +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameDiscoverNodesConfirmation class TestFrameNodeDiscoverConfirmation(unittest.TestCase): diff --git a/test/frame_discover_nodes_ntf_test.py b/test/frame_discover_nodes_ntf_test.py index 8e6850a1..d02ecbed 100644 --- a/test/frame_discover_nodes_ntf_test.py +++ b/test/frame_discover_nodes_ntf_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameDiscoverNodesNotification.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameDiscoverNodesNotification +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameDiscoverNodesNotification class TestFrameDiscoverNodesNotification(unittest.TestCase): diff --git a/test/frame_discover_nodes_req_test.py b/test/frame_discover_nodes_req_test.py index cf8bd411..a0a74ed8 100644 --- a/test/frame_discover_nodes_req_test.py +++ b/test/frame_discover_nodes_req_test.py @@ -2,8 +2,8 @@ import unittest from pyvlx.const import NodeType -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameDiscoverNodesRequest +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameDiscoverNodesRequest class TestFrameNodeDiscover(unittest.TestCase): diff --git a/test/frame_error_test.py b/test/frame_error_test.py index 7d652d0c..b2ad8537 100644 --- a/test/frame_error_test.py +++ b/test/frame_error_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameErrorNotification.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import ErrorType, FrameErrorNotification +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import ErrorType, FrameErrorNotification class TestErrorNotification(unittest.TestCase): diff --git a/test/frame_get_all_nodes_information_cfm_test.py b/test/frame_get_all_nodes_information_cfm_test.py index 4a9ed3be..7f898132 100644 --- a/test/frame_get_all_nodes_information_cfm_test.py +++ b/test/frame_get_all_nodes_information_cfm_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameGetAllNodesInformationConfirmation.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameGetAllNodesInformationConfirmation +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameGetAllNodesInformationConfirmation class TestFrameGetAllNodesInformationConfirmation(unittest.TestCase): diff --git a/test/frame_get_all_nodes_information_finished_ntf_test.py b/test/frame_get_all_nodes_information_finished_ntf_test.py index 49a0c54a..3a9e7bbf 100644 --- a/test/frame_get_all_nodes_information_finished_ntf_test.py +++ b/test/frame_get_all_nodes_information_finished_ntf_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameGetAllNodesInformationFinishedNotification.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameGetAllNodesInformationFinishedNotification +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameGetAllNodesInformationFinishedNotification class TestFrameGetAllNodesInformationFinishedNotification(unittest.TestCase): diff --git a/test/frame_get_all_nodes_information_ntf_test.py b/test/frame_get_all_nodes_information_ntf_test.py index fe540718..a55785bc 100644 --- a/test/frame_get_all_nodes_information_ntf_test.py +++ b/test/frame_get_all_nodes_information_ntf_test.py @@ -2,11 +2,11 @@ import unittest from datetime import datetime -from pyvlx.frames.alias_array import AliasArray +from pyvlx.api.frames.alias_array import AliasArray from pyvlx.const import NodeTypeWithSubtype, NodeVariation, Velocity from pyvlx.exception import PyVLXException -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameGetAllNodesInformationNotification +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameGetAllNodesInformationNotification from pyvlx.parameter import Position diff --git a/test/frame_get_all_nodes_information_req_test.py b/test/frame_get_all_nodes_information_req_test.py index 73284561..2ce48593 100644 --- a/test/frame_get_all_nodes_information_req_test.py +++ b/test/frame_get_all_nodes_information_req_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameGetAllNodesInformationRequest.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameGetAllNodesInformationRequest +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameGetAllNodesInformationRequest class TestFrameGetAllNodesInformationRequest(unittest.TestCase): diff --git a/test/frame_get_node_information_cfm_test.py b/test/frame_get_node_information_cfm_test.py index 0843f49e..5097b4eb 100644 --- a/test/frame_get_node_information_cfm_test.py +++ b/test/frame_get_node_information_cfm_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameGetNodeInformationConfirmation.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameGetNodeInformationConfirmation +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameGetNodeInformationConfirmation class TestFrameGetNodeInformationConfirmation(unittest.TestCase): diff --git a/test/frame_get_node_information_ntf_test.py b/test/frame_get_node_information_ntf_test.py index 153d3f9e..7ed5fe73 100644 --- a/test/frame_get_node_information_ntf_test.py +++ b/test/frame_get_node_information_ntf_test.py @@ -2,11 +2,11 @@ import unittest from datetime import datetime -from pyvlx.frames.alias_array import AliasArray +from pyvlx.api.frames.alias_array import AliasArray from pyvlx.const import NodeTypeWithSubtype, NodeVariation, Velocity from pyvlx.exception import PyVLXException -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameGetNodeInformationNotification +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameGetNodeInformationNotification from pyvlx.parameter import Position diff --git a/test/frame_get_node_information_req_test.py b/test/frame_get_node_information_req_test.py index b7aefe8e..5a440db7 100644 --- a/test/frame_get_node_information_req_test.py +++ b/test/frame_get_node_information_req_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameGetNodeInformationRequest.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameGetNodeInformationRequest +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameGetNodeInformationRequest class TestFrameGetNodeInformationRequest(unittest.TestCase): diff --git a/test/frame_get_protocol_version_cfm_test.py b/test/frame_get_protocol_version_cfm_test.py index fbffc244..2bf26d26 100644 --- a/test/frame_get_protocol_version_cfm_test.py +++ b/test/frame_get_protocol_version_cfm_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameGetProtocolVersionConfirmation.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameGetProtocolVersionConfirmation +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameGetProtocolVersionConfirmation class TestFrameGetProtocolVersionConfirmation(unittest.TestCase): diff --git a/test/frame_get_protocol_version_req_test.py b/test/frame_get_protocol_version_req_test.py index 1604546e..032f2d54 100644 --- a/test/frame_get_protocol_version_req_test.py +++ b/test/frame_get_protocol_version_req_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameGetProtocolVersionRequest.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameGetProtocolVersionRequest +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameGetProtocolVersionRequest class TestFrameGetProtocolVersionRequest(unittest.TestCase): diff --git a/test/frame_get_scene_list_cfm_test.py b/test/frame_get_scene_list_cfm_test.py index 8bde6496..185e89e4 100644 --- a/test/frame_get_scene_list_cfm_test.py +++ b/test/frame_get_scene_list_cfm_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameGetSceneListConfirmation.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameGetSceneListConfirmation +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameGetSceneListConfirmation class TestFrameGetSceneListConfirmation(unittest.TestCase): diff --git a/test/frame_get_scene_list_ntf_test.py b/test/frame_get_scene_list_ntf_test.py index 82f6416f..87dfa58a 100644 --- a/test/frame_get_scene_list_ntf_test.py +++ b/test/frame_get_scene_list_ntf_test.py @@ -2,8 +2,8 @@ import unittest from pyvlx import PyVLXException -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameGetSceneListNotification +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameGetSceneListNotification class TestFrameGetSceneListNotification(unittest.TestCase): diff --git a/test/frame_get_scene_list_req_test.py b/test/frame_get_scene_list_req_test.py index d02f154a..b69e9c8a 100644 --- a/test/frame_get_scene_list_req_test.py +++ b/test/frame_get_scene_list_req_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameGetSceneListRequest.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameGetSceneListRequest +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameGetSceneListRequest class TestFrameGetSceneListRequest(unittest.TestCase): diff --git a/test/frame_get_state_cfm_test.py b/test/frame_get_state_cfm_test.py index 38f54aff..8b93d8cc 100644 --- a/test/frame_get_state_cfm_test.py +++ b/test/frame_get_state_cfm_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameGetStateConfirmation.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import ( +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import ( FrameGetStateConfirmation, GatewayState, GatewaySubState) diff --git a/test/frame_get_state_req_test.py b/test/frame_get_state_req_test.py index 41651f8a..1474c7ab 100644 --- a/test/frame_get_state_req_test.py +++ b/test/frame_get_state_req_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameGetStateRequest.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameGetStateRequest +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameGetStateRequest class TestFrameGetStateRequest(unittest.TestCase): diff --git a/test/frame_get_version_cfm_test.py b/test/frame_get_version_cfm_test.py index 0ef5e406..3a653718 100644 --- a/test/frame_get_version_cfm_test.py +++ b/test/frame_get_version_cfm_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameGetVersionConfirmation.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameGetVersionConfirmation +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameGetVersionConfirmation class TestFrameGetVersionConfirmation(unittest.TestCase): diff --git a/test/frame_get_version_req_test.py b/test/frame_get_version_req_test.py index 09a9f34e..08deac99 100644 --- a/test/frame_get_version_req_test.py +++ b/test/frame_get_version_req_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameGetVersionRequest.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameGetVersionRequest +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameGetVersionRequest class TestFrameGetVersionRequest(unittest.TestCase): diff --git a/test/frame_gw_reboot_cfm_test.py b/test/frame_gw_reboot_cfm_test.py index c808a749..5a6e89ac 100644 --- a/test/frame_gw_reboot_cfm_test.py +++ b/test/frame_gw_reboot_cfm_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameGatewayRebootConfirmation.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameGatewayRebootConfirmation +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameGatewayRebootConfirmation class TestFrameRebootConfirmation(unittest.TestCase): diff --git a/test/frame_gw_reboot_req_test.py b/test/frame_gw_reboot_req_test.py index dfbb9c96..9c9c9ed4 100644 --- a/test/frame_gw_reboot_req_test.py +++ b/test/frame_gw_reboot_req_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameGatewayRebootRequest.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameGatewayRebootRequest +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameGatewayRebootRequest class TestFrameRebootRequest(unittest.TestCase): diff --git a/test/frame_helper_test.py b/test/frame_helper_test.py index 7e061ed7..808b3846 100644 --- a/test/frame_helper_test.py +++ b/test/frame_helper_test.py @@ -2,7 +2,7 @@ import unittest from pyvlx.exception import PyVLXException -from pyvlx.frames import calc_crc, extract_from_frame +from pyvlx.api.frames import calc_crc, extract_from_frame class TestFrameHelper(unittest.TestCase): diff --git a/test/frame_house_status_monitor_disable_cfm_test.py b/test/frame_house_status_monitor_disable_cfm_test.py index a4ac971d..3d816764 100644 --- a/test/frame_house_status_monitor_disable_cfm_test.py +++ b/test/frame_house_status_monitor_disable_cfm_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameHouseStatusMonitorDisableConfirmation.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameHouseStatusMonitorDisableConfirmation +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameHouseStatusMonitorDisableConfirmation class TestFrameHouseStatusMonitorDisableConfirmation(unittest.TestCase): diff --git a/test/frame_house_status_monitor_disable_req_test.py b/test/frame_house_status_monitor_disable_req_test.py index bf713dca..4ea50e6b 100644 --- a/test/frame_house_status_monitor_disable_req_test.py +++ b/test/frame_house_status_monitor_disable_req_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameHouseStatusMonitorDisableRequest.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameHouseStatusMonitorDisableRequest +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameHouseStatusMonitorDisableRequest class TestFrameHouseStatusMonitorDisableRequest(unittest.TestCase): diff --git a/test/frame_house_status_monitor_enable_cfm_test.py b/test/frame_house_status_monitor_enable_cfm_test.py index 76754514..1b814d9c 100644 --- a/test/frame_house_status_monitor_enable_cfm_test.py +++ b/test/frame_house_status_monitor_enable_cfm_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameHouseStatusMonitorEnableConfirmation.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameHouseStatusMonitorEnableConfirmation +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameHouseStatusMonitorEnableConfirmation class TestFrameHouseStatusMonitorEnableConfirmation(unittest.TestCase): diff --git a/test/frame_house_status_monitor_enable_req_test.py b/test/frame_house_status_monitor_enable_req_test.py index 0ea7745f..fa0d18a1 100644 --- a/test/frame_house_status_monitor_enable_req_test.py +++ b/test/frame_house_status_monitor_enable_req_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameHouseStatusMonitorEnableRequest.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameHouseStatusMonitorEnableRequest +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameHouseStatusMonitorEnableRequest class TestFrameHouseStatusMonitorEnableRequest(unittest.TestCase): diff --git a/test/frame_node_information_changed_ntf_test.py b/test/frame_node_information_changed_ntf_test.py index 1106c323..856787dd 100644 --- a/test/frame_node_information_changed_ntf_test.py +++ b/test/frame_node_information_changed_ntf_test.py @@ -2,8 +2,8 @@ import unittest from pyvlx.const import NodeVariation -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameNodeInformationChangedNotification +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameNodeInformationChangedNotification class TestFrameNodeInformationChangedNotification(unittest.TestCase): diff --git a/test/frame_node_information_mischroe_test.py b/test/frame_node_information_mischroe_test.py index ca91428e..e9873c26 100644 --- a/test/frame_node_information_mischroe_test.py +++ b/test/frame_node_information_mischroe_test.py @@ -3,8 +3,8 @@ from datetime import datetime from pyvlx.const import NodeTypeWithSubtype, NodeVariation, Velocity -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import ( +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import ( FrameGetAllNodesInformationNotification, FrameGetNodeInformationNotification) from pyvlx.parameter import Position diff --git a/test/frame_node_state_position_changed_ntf_test.py b/test/frame_node_state_position_changed_ntf_test.py index 5473e390..2a23cd4b 100644 --- a/test/frame_node_state_position_changed_ntf_test.py +++ b/test/frame_node_state_position_changed_ntf_test.py @@ -3,8 +3,8 @@ from datetime import datetime from pyvlx import Position -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameNodeStatePositionChangedNotification +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameNodeStatePositionChangedNotification class TestFrameNodeStatePositionChangedNotification(unittest.TestCase): diff --git a/test/frame_password_enter_cfm_test.py b/test/frame_password_enter_cfm_test.py index c591c042..21223084 100644 --- a/test/frame_password_enter_cfm_test.py +++ b/test/frame_password_enter_cfm_test.py @@ -1,8 +1,8 @@ """Unit tests for FramePasswordEnterConfirmation.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import ( +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import ( FramePasswordEnterConfirmation, PasswordEnterConfirmationStatus) diff --git a/test/frame_password_enter_req_test.py b/test/frame_password_enter_req_test.py index 7b629513..c5964a58 100644 --- a/test/frame_password_enter_req_test.py +++ b/test/frame_password_enter_req_test.py @@ -2,8 +2,8 @@ import unittest from pyvlx.exception import PyVLXException -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FramePasswordEnterRequest +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FramePasswordEnterRequest class TestFramePasswordEnter(unittest.TestCase): diff --git a/test/frame_session_finished_notification_test.py b/test/frame_session_finished_notification_test.py index 65b6bdb0..0aa3490e 100644 --- a/test/frame_session_finished_notification_test.py +++ b/test/frame_session_finished_notification_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameSessionFinishedNotification.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameSessionFinishedNotification +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameSessionFinishedNotification class TestFrameSessionFinishedNotification(unittest.TestCase): diff --git a/test/frame_set_node_name_cfm_test.py b/test/frame_set_node_name_cfm_test.py index 9551bbda..8b82db59 100644 --- a/test/frame_set_node_name_cfm_test.py +++ b/test/frame_set_node_name_cfm_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameSetNodeNameConfirmation.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import ( +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import ( FrameSetNodeNameConfirmation, SetNodeNameConfirmationStatus) diff --git a/test/frame_set_node_name_req_test.py b/test/frame_set_node_name_req_test.py index 0ae62bd6..2e3ee70e 100644 --- a/test/frame_set_node_name_req_test.py +++ b/test/frame_set_node_name_req_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameSetNodeNameRequest.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameSetNodeNameRequest +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameSetNodeNameRequest class TestFrameSetNodeNameRequest(unittest.TestCase): diff --git a/test/frame_set_utc_cfm_test.py b/test/frame_set_utc_cfm_test.py index 140a063e..c8c3c77a 100644 --- a/test/frame_set_utc_cfm_test.py +++ b/test/frame_set_utc_cfm_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameSetUTCConfirmation.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameSetUTCConfirmation +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameSetUTCConfirmation class TestFrameSetUTCConfirmation(unittest.TestCase): diff --git a/test/frame_set_utc_req_test.py b/test/frame_set_utc_req_test.py index e73daaba..366b9cf4 100644 --- a/test/frame_set_utc_req_test.py +++ b/test/frame_set_utc_req_test.py @@ -2,8 +2,8 @@ import unittest from datetime import datetime -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameSetUTCRequest +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameSetUTCRequest class TestFrameSetUTCRequest(unittest.TestCase): diff --git a/test/frame_test.py b/test/frame_test.py index cb9bca6c..9a400146 100644 --- a/test/frame_test.py +++ b/test/frame_test.py @@ -3,7 +3,7 @@ from pyvlx import PyVLXException from pyvlx.const import Command -from pyvlx.frames.frame import FrameBase +from pyvlx.api.frames.frame import FrameBase class TestFrame(unittest.TestCase): diff --git a/test/node_helper_test.py b/test/node_helper_test.py index c81ab2a4..e0770c6b 100644 --- a/test/node_helper_test.py +++ b/test/node_helper_test.py @@ -4,7 +4,7 @@ from pyvlx import ( Blade, Blind, GarageDoor, Gate, Light, PyVLX, RollerShutter, Window) from pyvlx.const import NodeTypeWithSubtype -from pyvlx.frames import FrameGetNodeInformationNotification +from pyvlx.api.frames import FrameGetNodeInformationNotification from pyvlx.node_helper import convert_frame_to_node diff --git a/test/session_id_test.py b/test/session_id_test.py index e37c32c4..2d35183f 100644 --- a/test/session_id_test.py +++ b/test/session_id_test.py @@ -1,7 +1,7 @@ """Test for slip helper functions.""" import unittest -from pyvlx.session_id import get_new_session_id, set_session_id +from pyvlx.api.session_id import get_new_session_id, set_session_id class SessionIdSlip(unittest.TestCase): From 343ccbb3d44ecc657aa36561b7396811d8076c9c Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Wed, 25 Nov 2020 21:23:05 +0100 Subject: [PATCH 22/58] Fix Frame --- pyvlx/api/frames/frame_command_send.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyvlx/api/frames/frame_command_send.py b/pyvlx/api/frames/frame_command_send.py index 423fa14b..f88982a6 100644 --- a/pyvlx/api/frames/frame_command_send.py +++ b/pyvlx/api/frames/frame_command_send.py @@ -104,7 +104,7 @@ def __str__(self): Position(Parameter(bytes(value))), ) return ( - '<{} node_ids="{}"parameter="{}" functional_parameter="{}" ' + '<{} node_ids="{}" parameter="{}" functional_parameter="{}" ' 'session_id="{}" originator="{}"/>'.format( type(self).__name__, self.node_ids, self.parameter, functional_parameter, From 31d9e24ae33f45f361c74012390df228f0fd2ba5 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Wed, 25 Nov 2020 21:23:36 +0100 Subject: [PATCH 23/58] Fix Test Classes --- test/frame_activate_scene_cfm_test.py | 2 +- test/frame_activate_scene_req_test.py | 2 +- ...command_remaining_time_notification_test.py | 2 +- ...ame_command_run_status_notification_test.py | 2 +- test/frame_command_send_cfm_test.py | 2 +- test/frame_command_send_req_test.py | 4 ++-- test/frame_discover_nodes_ntf_test.py | 14 +++++++------- test/frame_discover_nodes_req_test.py | 2 +- test/frame_error_test.py | 2 +- ...frame_get_all_nodes_information_cfm_test.py | 2 +- ...frame_get_all_nodes_information_ntf_test.py | 16 ++++++++-------- test/frame_get_node_information_cfm_test.py | 2 +- test/frame_get_node_information_ntf_test.py | 18 +++++++++--------- test/frame_get_node_information_req_test.py | 2 +- test/frame_get_scene_list_cfm_test.py | 2 +- test/frame_get_scene_list_ntf_test.py | 4 ++-- test/frame_get_version_cfm_test.py | 2 +- .../frame_node_information_changed_ntf_test.py | 4 ++-- ...ame_node_state_position_changed_ntf_test.py | 8 ++++---- test/frame_password_enter_cfm_test.py | 2 +- test/frame_password_enter_req_test.py | 4 ++-- ...frame_session_finished_notification_test.py | 2 +- test/frame_set_node_name_cfm_test.py | 2 +- test/frame_set_node_name_req_test.py | 2 +- test/scene_test.py | 2 +- 25 files changed, 53 insertions(+), 53 deletions(-) diff --git a/test/frame_activate_scene_cfm_test.py b/test/frame_activate_scene_cfm_test.py index 52c4a3ed..c6ddcab1 100644 --- a/test/frame_activate_scene_cfm_test.py +++ b/test/frame_activate_scene_cfm_test.py @@ -42,5 +42,5 @@ def test_str(self): ) self.assertEqual( str(frame), - "", + '', ) diff --git a/test/frame_activate_scene_req_test.py b/test/frame_activate_scene_req_test.py index 1d6addaf..8af1a5ec 100644 --- a/test/frame_activate_scene_req_test.py +++ b/test/frame_activate_scene_req_test.py @@ -39,5 +39,5 @@ def test_str(self): ) self.assertEqual( str(frame), - "", + '', ) diff --git a/test/frame_command_remaining_time_notification_test.py b/test/frame_command_remaining_time_notification_test.py index 98e51413..ecd5603b 100644 --- a/test/frame_command_remaining_time_notification_test.py +++ b/test/frame_command_remaining_time_notification_test.py @@ -33,5 +33,5 @@ def test_str(self): ) self.assertEqual( str(frame), - "", + '', ) diff --git a/test/frame_command_run_status_notification_test.py b/test/frame_command_run_status_notification_test.py index a3bea63d..43f37169 100644 --- a/test/frame_command_run_status_notification_test.py +++ b/test/frame_command_run_status_notification_test.py @@ -46,5 +46,5 @@ def test_str(self): ) self.assertEqual( str(frame), - "", + '', ) diff --git a/test/frame_command_send_cfm_test.py b/test/frame_command_send_cfm_test.py index 6213e8d0..9da6bfd0 100644 --- a/test/frame_command_send_cfm_test.py +++ b/test/frame_command_send_cfm_test.py @@ -39,5 +39,5 @@ def test_str(self): ) self.assertEqual( str(frame), - "", + '', ) diff --git a/test/frame_command_send_req_test.py b/test/frame_command_send_req_test.py index 04b04dbd..dbbd9a34 100644 --- a/test/frame_command_send_req_test.py +++ b/test/frame_command_send_req_test.py @@ -58,10 +58,10 @@ def test_str(self): ) self.assertEqual( str(frame), - '", + 'session_id="1000" originator="Originator.RAIN"/>', ) def test_wrong_payload(self): diff --git a/test/frame_discover_nodes_ntf_test.py b/test/frame_discover_nodes_ntf_test.py index d02ecbed..aab2f1f2 100644 --- a/test/frame_discover_nodes_ntf_test.py +++ b/test/frame_discover_nodes_ntf_test.py @@ -46,11 +46,11 @@ def test_str(self): frame = FrameDiscoverNodesNotification() self.assertEqual( str(frame), - "", + '', ) diff --git a/test/frame_discover_nodes_req_test.py b/test/frame_discover_nodes_req_test.py index a0a74ed8..747d92dc 100644 --- a/test/frame_discover_nodes_req_test.py +++ b/test/frame_discover_nodes_req_test.py @@ -31,5 +31,5 @@ def test_str(self): """Test string representation of FrameDiscoverNodesRequest.""" frame = FrameDiscoverNodesRequest(NodeType.LIGHT) self.assertEqual( - str(frame), "" + str(frame), '' ) diff --git a/test/frame_error_test.py b/test/frame_error_test.py index b2ad8537..2a2b5949 100644 --- a/test/frame_error_test.py +++ b/test/frame_error_test.py @@ -26,5 +26,5 @@ def test_str(self): frame = FrameErrorNotification(error_type=ErrorType.ErrorOnFrameStructure) self.assertEqual( str(frame), - "", + '', ) diff --git a/test/frame_get_all_nodes_information_cfm_test.py b/test/frame_get_all_nodes_information_cfm_test.py index 7f898132..9ed6d542 100644 --- a/test/frame_get_all_nodes_information_cfm_test.py +++ b/test/frame_get_all_nodes_information_cfm_test.py @@ -26,5 +26,5 @@ def test_str(self): frame = FrameGetAllNodesInformationConfirmation(number_of_nodes=23) self.assertEqual( str(frame), - "", + '', ) diff --git a/test/frame_get_all_nodes_information_ntf_test.py b/test/frame_get_all_nodes_information_ntf_test.py index a55785bc..c2198a22 100644 --- a/test/frame_get_all_nodes_information_ntf_test.py +++ b/test/frame_get_all_nodes_information_ntf_test.py @@ -89,14 +89,14 @@ def test_str(self): test_ts = datetime.fromtimestamp(50528771).strftime("%Y-%m-%d %H:%M:%S") self.assertEqual( str(frame), - "".format( + ''.format( test_ts ), ) diff --git a/test/frame_get_node_information_cfm_test.py b/test/frame_get_node_information_cfm_test.py index 5097b4eb..7178c954 100644 --- a/test/frame_get_node_information_cfm_test.py +++ b/test/frame_get_node_information_cfm_test.py @@ -26,5 +26,5 @@ def test_str(self): frame = FrameGetNodeInformationConfirmation(node_id=23) self.assertEqual( str(frame), - "", + '', ) diff --git a/test/frame_get_node_information_ntf_test.py b/test/frame_get_node_information_ntf_test.py index 7ed5fe73..5ad62e90 100644 --- a/test/frame_get_node_information_ntf_test.py +++ b/test/frame_get_node_information_ntf_test.py @@ -89,20 +89,20 @@ def test_str(self): test_ts = datetime.fromtimestamp(50528771).strftime("%Y-%m-%d %H:%M:%S") self.assertEqual( str(frame), - "".format( + ''.format( test_ts ), ) def test_serial_number(self): - """Test serial number property.""" + '""Test serial number property.""" frame = FrameGetNodeInformationNotification() frame.serial_number = "01:02:03:04:05:06:06:08" self.assertEqual(frame.serial_number, "01:02:03:04:05:06:06:08") diff --git a/test/frame_get_node_information_req_test.py b/test/frame_get_node_information_req_test.py index 5a440db7..f753041f 100644 --- a/test/frame_get_node_information_req_test.py +++ b/test/frame_get_node_information_req_test.py @@ -24,4 +24,4 @@ def test_frame_from_raw(self): def test_str(self): """Test string representation of FrameGetNodeInformationRequest.""" frame = FrameGetNodeInformationRequest(node_id=23) - self.assertEqual(str(frame), "") + self.assertEqual(str(frame), '') diff --git a/test/frame_get_scene_list_cfm_test.py b/test/frame_get_scene_list_cfm_test.py index 185e89e4..fb5b4832 100644 --- a/test/frame_get_scene_list_cfm_test.py +++ b/test/frame_get_scene_list_cfm_test.py @@ -24,4 +24,4 @@ def test_frame_from_raw(self): def test_str(self): """Test string representation of FrameGetSceneListConfirmation.""" frame = FrameGetSceneListConfirmation(count_scenes=12) - self.assertEqual(str(frame), "") + self.assertEqual(str(frame), '') diff --git a/test/frame_get_scene_list_ntf_test.py b/test/frame_get_scene_list_ntf_test.py index 87dfa58a..1f22692c 100644 --- a/test/frame_get_scene_list_ntf_test.py +++ b/test/frame_get_scene_list_ntf_test.py @@ -80,8 +80,8 @@ def test_str(self): frame.remaining_scenes = 3 self.assertEqual( str(frame), - "", + '', ) def test_wrong_payload(self): diff --git a/test/frame_get_version_cfm_test.py b/test/frame_get_version_cfm_test.py index 3a653718..83c91982 100644 --- a/test/frame_get_version_cfm_test.py +++ b/test/frame_get_version_cfm_test.py @@ -34,7 +34,7 @@ def test_str(self): ) self.assertEqual( str(frame), - '', + '', ) def test_version(self): diff --git a/test/frame_node_information_changed_ntf_test.py b/test/frame_node_information_changed_ntf_test.py index 856787dd..c50f184b 100644 --- a/test/frame_node_information_changed_ntf_test.py +++ b/test/frame_node_information_changed_ntf_test.py @@ -44,6 +44,6 @@ def test_str(self): frame = frame_from_raw(self.EXAMPLE_FRAME) self.assertEqual( str(frame), - '', + '', ) diff --git a/test/frame_node_state_position_changed_ntf_test.py b/test/frame_node_state_position_changed_ntf_test.py index 2a23cd4b..0bb48cf8 100644 --- a/test/frame_node_state_position_changed_ntf_test.py +++ b/test/frame_node_state_position_changed_ntf_test.py @@ -53,10 +53,10 @@ def test_str(self): test_ts = datetime.fromtimestamp(1288634368).strftime("%Y-%m-%d %H:%M:%S") self.assertEqual( str(frame), - "".format( + ''.format( test_ts ), ) diff --git a/test/frame_password_enter_cfm_test.py b/test/frame_password_enter_cfm_test.py index 21223084..c92fd2b8 100644 --- a/test/frame_password_enter_cfm_test.py +++ b/test/frame_password_enter_cfm_test.py @@ -34,5 +34,5 @@ def test_str(self): frame = FramePasswordEnterConfirmation() self.assertEqual( str(frame), - "", + '', ) diff --git a/test/frame_password_enter_req_test.py b/test/frame_password_enter_req_test.py index c5964a58..c85a93e7 100644 --- a/test/frame_password_enter_req_test.py +++ b/test/frame_password_enter_req_test.py @@ -54,9 +54,9 @@ def test_errors(self): def test_str(self): """Test string representation of FramePasswordEnterRequest.""" frame = FramePasswordEnterRequest(password="fnord") - self.assertEqual(str(frame), "") + self.assertEqual(str(frame), '') def test_str_no_password(self): """Test string representation of FramePasswordEnterRequest with no password.""" frame = FramePasswordEnterRequest() - self.assertEqual(str(frame), "") + self.assertEqual(str(frame), '') diff --git a/test/frame_session_finished_notification_test.py b/test/frame_session_finished_notification_test.py index 0aa3490e..8ebf9bfa 100644 --- a/test/frame_session_finished_notification_test.py +++ b/test/frame_session_finished_notification_test.py @@ -25,5 +25,5 @@ def test_str(self): """Test string representation of FrameSessionFinishedNotification.""" frame = FrameSessionFinishedNotification(session_id=1000) self.assertEqual( - str(frame), "" + str(frame), '' ) diff --git a/test/frame_set_node_name_cfm_test.py b/test/frame_set_node_name_cfm_test.py index 8b82db59..8844f1e8 100644 --- a/test/frame_set_node_name_cfm_test.py +++ b/test/frame_set_node_name_cfm_test.py @@ -38,5 +38,5 @@ def test_str(self): frame = FrameSetNodeNameConfirmation(node_id=23) self.assertEqual( str(frame), - '', + '', ) diff --git a/test/frame_set_node_name_req_test.py b/test/frame_set_node_name_req_test.py index 2e3ee70e..e39f19cf 100644 --- a/test/frame_set_node_name_req_test.py +++ b/test/frame_set_node_name_req_test.py @@ -34,5 +34,5 @@ def test_str(self): """Test string representation of FrameSetNodeNameRequest.""" frame = FrameSetNodeNameRequest(node_id=4, name="Fnord") self.assertEqual( - str(frame), '' + str(frame), '' ) diff --git a/test/scene_test.py b/test/scene_test.py index 64812c9a..cce6c487 100644 --- a/test/scene_test.py +++ b/test/scene_test.py @@ -20,4 +20,4 @@ def test_str(self): """Test string representation of Scene object.""" pyvlx = PyVLX() scene = Scene(pyvlx, 2, "Scene 1") - self.assertEqual(str(scene), '') + self.assertEqual(str(scene), '') From da5308d8a1dfab3994f11188337ed7fee096b350 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Thu, 26 Nov 2020 07:17:00 +0100 Subject: [PATCH 24/58] Fix another Typo in Test Class --- test/frame_get_node_information_ntf_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/frame_get_node_information_ntf_test.py b/test/frame_get_node_information_ntf_test.py index 5ad62e90..35131385 100644 --- a/test/frame_get_node_information_ntf_test.py +++ b/test/frame_get_node_information_ntf_test.py @@ -102,7 +102,7 @@ def test_str(self): ) def test_serial_number(self): - '""Test serial number property.""" + """Test serial number property.""" frame = FrameGetNodeInformationNotification() frame.serial_number = "01:02:03:04:05:06:06:08" self.assertEqual(frame.serial_number, "01:02:03:04:05:06:06:08") From 1310f1516b55e92d1cf89ba1a36eeaf0614dc322 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Thu, 26 Nov 2020 18:29:51 +0100 Subject: [PATCH 25/58] Another Fix for Testclasses Checks for Stringrepresentations --- test/frame_get_all_nodes_information_ntf_test.py | 3 +-- test/frame_get_node_information_ntf_test.py | 2 +- test/frame_get_scene_list_ntf_test.py | 4 ++-- test/frame_node_state_position_changed_ntf_test.py | 2 +- test/frame_session_finished_notification_test.py | 2 +- test/pyvlx | 1 + 6 files changed, 7 insertions(+), 7 deletions(-) create mode 120000 test/pyvlx diff --git a/test/frame_get_all_nodes_information_ntf_test.py b/test/frame_get_all_nodes_information_ntf_test.py index c2198a22..ddb0e2a2 100644 --- a/test/frame_get_all_nodes_information_ntf_test.py +++ b/test/frame_get_all_nodes_information_ntf_test.py @@ -12,7 +12,6 @@ class TestFrameGetAllNodesInformationNotification(unittest.TestCase): """Test class for FrameGetAllNodesInformationNotification.""" - # pylint: disable=too-many-public-methods,invalid-name EXAMPLE_FRAME = ( @@ -95,7 +94,7 @@ def test_str(self): 'power_mode="1" build_number="7" serial_number="01:02:03:04:05:06:06:08" state="1" ' 'current_position="0x000C" target="0x007B" current_position_fp1="0x04D2" ' 'current_position_fp2="0x0929" current_position_fp3="0x0D80" current_position_fp4="0x11D7" ' - 'remaining_time=1 time="{}" ' + 'remaining_time="1" time="{}" ' 'alias_array="3031=3233, 3435=3637, 3839=3031, 3233=3435, 3637=3839"/>'.format( test_ts ), diff --git a/test/frame_get_node_information_ntf_test.py b/test/frame_get_node_information_ntf_test.py index 35131385..ca42cec1 100644 --- a/test/frame_get_node_information_ntf_test.py +++ b/test/frame_get_node_information_ntf_test.py @@ -95,7 +95,7 @@ def test_str(self): 'power_mode="1" build_number="7" serial_number="01:02:03:04:05:06:06:08" state="1" ' 'current_position="0x000C" target="0x007B" current_position_fp1="0x04D2" ' 'current_position_fp2="0x0929" current_position_fp3="0x0D80" current_position_fp4="0x11D7" ' - 'remaining_time=1 time="{}" ' + 'remaining_time="1" time="{}" ' 'alias_array="3031=3233, 3435=3637, 3839=3031, 3233=3435, 3637=3839"/>'.format( test_ts ), diff --git a/test/frame_get_scene_list_ntf_test.py b/test/frame_get_scene_list_ntf_test.py index 1f22692c..51ed8064 100644 --- a/test/frame_get_scene_list_ntf_test.py +++ b/test/frame_get_scene_list_ntf_test.py @@ -80,8 +80,8 @@ def test_str(self): frame.remaining_scenes = 3 self.assertEqual( str(frame), - '', + '', ) def test_wrong_payload(self): diff --git a/test/frame_node_state_position_changed_ntf_test.py b/test/frame_node_state_position_changed_ntf_test.py index 0bb48cf8..60c83608 100644 --- a/test/frame_node_state_position_changed_ntf_test.py +++ b/test/frame_node_state_position_changed_ntf_test.py @@ -56,7 +56,7 @@ def test_str(self): ''.format( + 'current_position_fp4="0xF7FF" remaining_time="0" time="{}"/>'.format( test_ts ), ) diff --git a/test/frame_session_finished_notification_test.py b/test/frame_session_finished_notification_test.py index 8ebf9bfa..ea494826 100644 --- a/test/frame_session_finished_notification_test.py +++ b/test/frame_session_finished_notification_test.py @@ -25,5 +25,5 @@ def test_str(self): """Test string representation of FrameSessionFinishedNotification.""" frame = FrameSessionFinishedNotification(session_id=1000) self.assertEqual( - str(frame), '' + str(frame), '' ) diff --git a/test/pyvlx b/test/pyvlx new file mode 120000 index 00000000..6196e671 --- /dev/null +++ b/test/pyvlx @@ -0,0 +1 @@ +../pyvlx \ No newline at end of file From ac7f6867cc913cedf845b7c80af227f738fc1c33 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Thu, 26 Nov 2020 22:02:03 +0100 Subject: [PATCH 26/58] add Test Classes for new Frames --- test/frame_get_state_req_test.py | 4 +- test/frame_password_change_ntf_test.py | 57 +++++++++++++++++++ test/frame_password_change_req_test.py | 79 ++++++++++++++++++++++++++ test/frame_reboot_cfm_test.py | 28 +++++++++ test/frame_reboot_req_test.py | 28 +++++++++ 5 files changed, 194 insertions(+), 2 deletions(-) create mode 100644 test/frame_password_change_ntf_test.py create mode 100644 test/frame_password_change_req_test.py create mode 100644 test/frame_reboot_cfm_test.py create mode 100644 test/frame_reboot_req_test.py diff --git a/test/frame_get_state_req_test.py b/test/frame_get_state_req_test.py index 1474c7ab..41651f8a 100644 --- a/test/frame_get_state_req_test.py +++ b/test/frame_get_state_req_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameGetStateRequest.""" import unittest -from pyvlx.api.frame_creation import frame_from_raw -from pyvlx.api.frames import FrameGetStateRequest +from pyvlx.frame_creation import frame_from_raw +from pyvlx.frames import FrameGetStateRequest class TestFrameGetStateRequest(unittest.TestCase): diff --git a/test/frame_password_change_ntf_test.py b/test/frame_password_change_ntf_test.py new file mode 100644 index 00000000..e59fdda9 --- /dev/null +++ b/test/frame_password_change_ntf_test.py @@ -0,0 +1,57 @@ +"""Unit tests for PyVLX PasswordChangeNotification.""" +import unittest + +from pyvlx.exception import PyVLXException +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FramePasswordChangeNotification + + +class TestFramePasswordChange(unittest.TestCase): + """Test class for FramePasswordChangeNotification.""" + + # pylint: disable=too-many-public-methods,invalid-name + + def test_bytes(self): + """Test FramePasswordChangeNotification.""" + frame = FramePasswordChangeNotification(newpassword="fnord") + self.assertEqual( + bytes(frame), + b"\x00#0\x04fnord\x00\x00\x00\x00\x00\x00" + +b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + +b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00f", + ) + + def test_bytes_long_pw(self): + """Test FramePasswordChangeNotification with long new password.""" + frame = FramePasswordChangeNotification(newpassword="x" * 32) + self.assertEqual( + bytes(frame), b"\x00#0\x04xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\x17" + ) + + def test_frame_from_raw(self): + """Test parsing FramePasswordChangeNotification from raw bytes.""" + frame = frame_from_raw( + b"\x00#0\x04fnord\x00\x00\x00\x00\x00\x00" + +b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + +b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00f", + ) + self.assertTrue(isinstance(frame, FramePasswordChangeNotification)) + self.assertEqual(frame.newpassword, "fnord") + + def test_errors(self): + """Test FramePasswordChangeNotification with wrong password.""" + with self.assertRaises(PyVLXException): + bytes(FramePasswordChangeNotification()) + with self.assertRaises(PyVLXException): + bytes(FramePasswordChangeNotification(newpassword="x" * 33)) + + + def test_str(self): + """Test string representation of FramePasswordChangeNotification.""" + frame = FramePasswordChangeNotification(newpassword="fnord") + self.assertEqual(str(frame), '') + + def test_str_no_password(self): + """Test string representation of FramePasswordChangeNotification with no password.""" + frame = FramePasswordChangeNotification() + self.assertEqual(str(frame), '') diff --git a/test/frame_password_change_req_test.py b/test/frame_password_change_req_test.py new file mode 100644 index 00000000..ede10b00 --- /dev/null +++ b/test/frame_password_change_req_test.py @@ -0,0 +1,79 @@ +"""Unit tests for PyVLX PasswordChangeRequest.""" +import unittest + +from pyvlx.exception import PyVLXException +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FramePasswordChangeRequest + + +class TestFramePasswordChange(unittest.TestCase): + """Test class for FramePasswordChangeRequest.""" + + # pylint: disable=too-many-public-methods,invalid-name + + def test_bytes(self): + """Test FramePasswordChangeRequest.""" + frame = FramePasswordChangeRequest(currentpassword="fnord", newpassword="bfeld") + self.assertEqual( + bytes(frame), + b"\x00C0\x02fnord\x00\x00\x00\x00\x00\x00\x00\x00" + + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + b"\x00\x00\x00\x00\x00\x00\x00bfeld\x00\x00\x00\x00" + + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00i", + ) + + def test_bytes_long_newpw(self): + """Test FramePasswordChangeRequest with long new password.""" + frame = FramePasswordChangeRequest(currentpassword="fnord", newpassword="x" * 32) + self.assertEqual( + bytes(frame), b"\x00C0\x02fnord\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\x00" + ) + + def test_bytes_long_oldpw(self): + """Test FramePasswordChangeRequest with long old password.""" + frame = FramePasswordChangeRequest(currentpassword="x" * 32, newpassword="bfeld") + self.assertEqual( + bytes(frame), b"\x00C0\x02xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxbfeld\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18" + ) + + def test_bytes_long_bothpw(self): + """Test FramePasswordChangeRequest with long passwords.""" + frame = FramePasswordChangeRequest(currentpassword="x" * 32, newpassword="y" * 32) + self.assertEqual( + bytes(frame), b"\x00C0\x02xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyq" + ) + + def test_frame_from_raw(self): + """Test parsing FramePasswordChangeRequest from raw bytes.""" + frame = frame_from_raw( + b"\x00C0\x02fnord\x00\x00\x00\x00\x00\x00\x00\x00" + + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + b"\x00\x00\x00\x00\x00\x00\x00bfeld\x00\x00\x00\x00" + + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00i" + ) + self.assertTrue(isinstance(frame, FramePasswordChangeRequest)) + self.assertEqual(frame.newpassword, "bfeld") + self.assertEqual(frame.currentpassword, "fnord") + + def test_errors(self): + """Test FramePasswordChangeRequest with wrong password.""" + with self.assertRaises(PyVLXException): + bytes(FramePasswordChangeRequest()) + with self.assertRaises(PyVLXException): + bytes(FramePasswordChangeRequest(currentpassword="fnord", newpassword="x" * 33)) + with self.assertRaises(PyVLXException): + bytes(FramePasswordChangeRequest(newpassword="fnord", currentpassword="x" * 33)) + with self.assertRaises(PyVLXException): + bytes(FramePasswordChangeRequest(newpassword="x" * 33, currentpassword="x" * 33)) + + def test_str(self): + """Test string representation of FramePasswordChangeRequest.""" + frame = FramePasswordChangeRequest(currentpassword="fnord", newpassword="bfeld") + self.assertEqual(str(frame), '') + + def test_str_no_password(self): + """Test string representation of FramePasswordChangeRequest with no password.""" + frame = FramePasswordChangeRequest() + self.assertEqual(str(frame), '') diff --git a/test/frame_reboot_cfm_test.py b/test/frame_reboot_cfm_test.py new file mode 100644 index 00000000..27b395c6 --- /dev/null +++ b/test/frame_reboot_cfm_test.py @@ -0,0 +1,28 @@ +"""Unit tests for FrameGatewayRebootConfirmation.""" +import unittest + +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameGatewayRebootConfirmation + + +class TestFrameGatewayRebootConfirmation(unittest.TestCase): + """Test class TestFrameGatewayRebootConfirmation.""" + + # pylint: disable=too-many-public-methods,invalid-name + + EXAMPLE_FRAME = b"\x00\x03\x00\x02\x01" + + def test_bytes(self): + """Test FrameGatewayRebootConfirmation with NO_TYPE.""" + frame = FrameGatewayRebootConfirmation() + self.assertEqual(bytes(frame), self.EXAMPLE_FRAME) + + def test_frame_from_raw(self): + """Test parse FrameGatewayRebootConfirmation from raw.""" + frame = frame_from_raw(self.EXAMPLE_FRAME) + self.assertTrue(isinstance(frame, FrameGatewayRebootConfirmation)) + + def test_str(self): + """Test string representation of FrameGatewayRebootConfirmation.""" + frame = FrameGatewayRebootConfirmation() + self.assertEqual(str(frame), '') diff --git a/test/frame_reboot_req_test.py b/test/frame_reboot_req_test.py new file mode 100644 index 00000000..e9f7fac2 --- /dev/null +++ b/test/frame_reboot_req_test.py @@ -0,0 +1,28 @@ +"""Unit tests for FrameGatewayRebootRequest.""" +import unittest + +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameGatewayRebootRequest + + +class TestFrameGatewayRebootRequest(unittest.TestCase): + """Test class TestFrameGatewayRebootRequest.""" + + # pylint: disable=too-many-public-methods,invalid-name + + EXAMPLE_FRAME = b"\x00\x03\x00\x01\x02" + + def test_bytes(self): + """Test FrameGatewayRebootRequest with NO_TYPE.""" + frame = FrameGatewayRebootRequest() + self.assertEqual(bytes(frame), self.EXAMPLE_FRAME) + + def test_frame_from_raw(self): + """Test parse FrameGatewayRebootRequest from raw.""" + frame = frame_from_raw(self.EXAMPLE_FRAME) + self.assertTrue(isinstance(frame, FrameGatewayRebootRequest)) + + def test_str(self): + """Test string representation of FrameGatewayRebootRequest.""" + frame = FrameGatewayRebootRequest() + self.assertEqual(str(frame), '') From 0e25e2299d0effa74232790356cc66b5e7b56a8b Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Thu, 26 Nov 2020 22:02:58 +0100 Subject: [PATCH 27/58] Fix new Frames --- pyvlx/api/__init__.py | 4 +-- pyvlx/api/frames/frame_get_local_time.py | 6 ++-- pyvlx/api/frames/frame_get_network_setup.py | 6 ++-- pyvlx/api/frames/frame_leave_learn_state.py | 4 ++- pyvlx/api/frames/frame_password_change.py | 31 ++++++++++----------- pyvlx/api/frames/frame_set_utc.py | 3 +- pyvlx/api/get_local_time.py | 17 ++++++----- pyvlx/api/get_network_setup.py | 9 ++++-- pyvlx/api/get_protocol_version.py | 7 +++-- pyvlx/api/get_state.py | 3 +- pyvlx/api/get_version.py | 6 +++- pyvlx/api/leave_learn_state.py | 7 +++-- pyvlx/api/reboot.py | 2 -- pyvlx/klf200gateway.py | 20 ++++++------- 14 files changed, 64 insertions(+), 61 deletions(-) diff --git a/pyvlx/api/__init__.py b/pyvlx/api/__init__.py index 2a059fcc..759a4f6e 100644 --- a/pyvlx/api/__init__.py +++ b/pyvlx/api/__init__.py @@ -3,7 +3,7 @@ from .house_status_monitor import (house_status_monitor_enable) from .command_send import (CommandSend) -#from .get_local_time import (FrameGetLocalTimeRequest, FrameGetLocalTimeConfirmation) +# from .get_local_time import (FrameGetLocalTimeRequest, FrameGetLocalTimeConfirmation) from .get_state import (GetState) from .get_network_setup import (GetNetworkSetup) from .get_protocol_version import (GetProtocolVersion) @@ -19,5 +19,3 @@ from .get_all_nodes_information import (GetAllNodesInformation) from .get_node_information import (GetNodeInformation) from .get_scene_list import (GetSceneList) - - diff --git a/pyvlx/api/frames/frame_get_local_time.py b/pyvlx/api/frames/frame_get_local_time.py index 33b28823..8a9ca295 100644 --- a/pyvlx/api/frames/frame_get_local_time.py +++ b/pyvlx/api/frames/frame_get_local_time.py @@ -1,5 +1,4 @@ """Module for get local time classes.""" -#import struct from ...const import Command from .frame import FrameBase @@ -57,6 +56,5 @@ def __str__(self): 'month="{}" year="{}" weekday="{}" dayofyear="{}" daylightsavingflag="{}"/>'.format( type(self).__name__, self.utctime, self.second, self.minute, self.hour, self.dayofmonth, self.month, self.year, self.weekday, self.dayofyear, - self.daylightsavingflag - ) - ) + self.daylightsavingflag) + ) diff --git a/pyvlx/api/frames/frame_get_network_setup.py b/pyvlx/api/frames/frame_get_network_setup.py index f6babf3f..f2b56344 100644 --- a/pyvlx/api/frames/frame_get_network_setup.py +++ b/pyvlx/api/frames/frame_get_network_setup.py @@ -18,6 +18,7 @@ def __init__(self): class DHCPParameter(Enum): """Enum class for dncp network setup of gateway.""" + DISABLE = 0x00 ENABLE = 0x01 @@ -59,15 +60,12 @@ def get_payload(self): def from_payload(self, payload): """Init frame from binary data.""" - self._ipaddress = payload[0:4] self._netmask = payload[4:8] self._gateway = payload[8:12] self.dhcp = DHCPParameter(payload[12]) - def __str__(self): """Return human readable string.""" return '<{} ipaddress="{}" netmask="{}" gateway="{}" dhcp="{}"/>'.format( - type(self).__name__, self.ipaddress, self.netmask, self.gateway, self.dhcp - ) + type(self).__name__, self.ipaddress, self.netmask, self.gateway, self.dhcp) diff --git a/pyvlx/api/frames/frame_leave_learn_state.py b/pyvlx/api/frames/frame_leave_learn_state.py index a30168c0..7d6821fd 100644 --- a/pyvlx/api/frames/frame_leave_learn_state.py +++ b/pyvlx/api/frames/frame_leave_learn_state.py @@ -3,11 +3,14 @@ from ...const import Command from .frame import FrameBase + class LeaveLearnStateConfirmationStatus(Enum): """Enum class for status of password enter confirmation.""" + FAILED = 0 SUCCESSFUL = 1 + class FrameLeaveLearnStateRequest(FrameBase): """Frame for leaving learn state request.""" @@ -22,7 +25,6 @@ def __str__(self): return '<{}/>'.format(type(self).__name__) - class FrameLeaveLearnStateConfirmation(FrameBase): """Frame for confirmation for leaving learn State.""" diff --git a/pyvlx/api/frames/frame_password_change.py b/pyvlx/api/frames/frame_password_change.py index 45f314f1..505aeefd 100644 --- a/pyvlx/api/frames/frame_password_change.py +++ b/pyvlx/api/frames/frame_password_change.py @@ -36,8 +36,8 @@ def get_payload(self): def from_payload(self, payload): """Init frame from binary data.""" - self.currentpassword = bytes_to_string(payload[0:33]) - self.newpassword = bytes_to_string(payload[33:]) + self.currentpassword = bytes_to_string(payload[0:32]) + self.newpassword = bytes_to_string(payload[32:]) def __str__(self): """Return human readable string.""" @@ -48,8 +48,7 @@ def __str__(self): None if self.newpassword is None else "{}****".format(self.newpassword[:2]) ) return ('<{} currentpassword="{}" newpassword="{}"/>' - .format(type(self).__name__, currentpassword_esc, newpassword_esc) - ) + .format(type(self).__name__, currentpassword_esc, newpassword_esc)) class PasswordChangeConfirmationStatus(Enum): @@ -82,33 +81,33 @@ def __str__(self): return '<{} status="{}"/>'.format(type(self).__name__, self.status) - class FramePasswordChangeNotification(FrameBase): """Frame for sending password changed notification request.""" + MAX_SIZE = 32 PAYLOAD_LEN = 32 - def __init__(self): + def __init__(self, newpassword=None): """Init Frame.""" super().__init__(Command.GW_PASSWORD_CHANGE_NTF) - self.password = None + self.newpassword = newpassword def get_payload(self): """Return Payload.""" - if self.password is None: - raise PyVLXException("password is none") - if len(self.password) > self.MAX_SIZE: - raise PyVLXException("password is too long") + if self.newpassword is None: + raise PyVLXException("newpassword is none") + if len(self.newpassword) > self.MAX_SIZE: + raise PyVLXException("newpassword is too long") - return string_to_bytes(self.password, self.MAX_SIZE) + return string_to_bytes(self.newpassword, self.MAX_SIZE) def from_payload(self, payload): """Init frame from binary data.""" - self.password = bytes_to_string(payload) + self.newpassword = bytes_to_string(payload) def __str__(self): """Return human readable string.""" - password_esc = ( - None if self.password is None else "{}****".format(self.password[:2]) + newpassword_esc = ( + None if self.newpassword is None else "{}****".format(self.newpassword[:2]) ) - return '<{} password="{}"/>'.format(type(self).__name__, password_esc) + return '<{} newpassword="{}"/>'.format(type(self).__name__, newpassword_esc) diff --git a/pyvlx/api/frames/frame_set_utc.py b/pyvlx/api/frames/frame_set_utc.py index 3d630e82..e85c42d4 100644 --- a/pyvlx/api/frames/frame_set_utc.py +++ b/pyvlx/api/frames/frame_set_utc.py @@ -1,11 +1,10 @@ """Module for sending command to gw.""" import struct from datetime import datetime - from ...const import Command - from .frame import FrameBase + class FrameSetUTCConfirmation(FrameBase): """Frame for confirmation for setting UTC time.""" diff --git a/pyvlx/api/get_local_time.py b/pyvlx/api/get_local_time.py index 46d928ef..f566ddeb 100644 --- a/pyvlx/api/get_local_time.py +++ b/pyvlx/api/get_local_time.py @@ -4,24 +4,23 @@ from .api_event import ApiEvent from .frames import FrameGetLocalTimeConfirmation, FrameGetLocalTimeRequest + class DtoLocalTime: - """Dataobject to hold KLF200 Data""" + """Dataobject to hold KLF200 Data.""" def __init__(self, utctime=None, localtime=None): + """Initialize DtoLocalTime class.""" self.utctime = utctime self.localtime = localtime - def __str__(self): """Return human readable string.""" return ( '<{} utctime="{}" localtime="{}"/>'.format( - type(self).__name__, self.utctime, self.localtime - ) + type(self).__name__, self.utctime, self.localtime) ) - class GetLocalTime(ApiEvent): """Class for retrieving firmware version from API.""" @@ -39,14 +38,14 @@ async def handle_frame(self, frame): if frame.weekday == 0: weekday = 6 else: - weekday = frame.weekday -1 + weekday = frame.weekday - 1 self.time = DtoLocalTime( datetime.fromtimestamp(frame.utctime), datetime.fromtimestamp(time.mktime( - (frame.year+1900, frame.month, frame.dayofmonth, + (frame.year + 1900, frame.month, frame.dayofmonth, frame.hour, frame.minute, frame.second, - weekday, frame.dayofyear, frame.daylightsavingflag) - ))) + weekday, frame.dayofyear, frame.daylightsavingflag))) + ) self.success = True return True diff --git a/pyvlx/api/get_network_setup.py b/pyvlx/api/get_network_setup.py index 177980d2..6cfbf693 100644 --- a/pyvlx/api/get_network_setup.py +++ b/pyvlx/api/get_network_setup.py @@ -2,9 +2,12 @@ from .api_event import ApiEvent from .frames import FrameGetNetworkSetupConfirmation, FrameGetNetworkSetupRequest, DHCPParameter + class DtoNetworkSetup: - """Dataobject to hold KLF200 Data""" + """Dataobject to hold KLF200 Data.""" + def __init__(self, ipaddress=None, gateway=None, netmask=None, dhcp=None): + """Initialize DtoNetworkSetup class.""" self.ipaddress = ipaddress self.gateway = gateway self.netmask = netmask @@ -22,6 +25,7 @@ def __str__(self): self.gateway, self.dhcp, self.dhcp_name ) + class GetNetworkSetup(ApiEvent): """Class for retrieving gateway state from API.""" @@ -37,8 +41,7 @@ async def handle_frame(self, frame): return False self.success = True self.networksetup = DtoNetworkSetup( - frame.ipaddress, frame.gateway, frame.netmask, frame.dhcp - ) + frame.ipaddress, frame.gateway, frame.netmask, frame.dhcp) return True def request_frame(self): diff --git a/pyvlx/api/get_protocol_version.py b/pyvlx/api/get_protocol_version.py index 4526c675..5b7a38f0 100644 --- a/pyvlx/api/get_protocol_version.py +++ b/pyvlx/api/get_protocol_version.py @@ -3,9 +3,12 @@ from .frames import ( FrameGetProtocolVersionConfirmation, FrameGetProtocolVersionRequest) + class DtoProtocolVersion: - """KLF 200 Dataobject """ + """KLF 200 Dataobject.""" + def __init__(self, majorversion=None, minorversion=None): + """Initialize DtoProtocolVersion class.""" self.majorversion = majorversion self.minorversion = minorversion @@ -41,5 +44,5 @@ def request_frame(self): @property def version(self): - """Deprecated: Return Protocol Version as human readable string.""" + """Return Protocol Version as human readable string.""" return "{}.{}".format(self.protocolversion.majorversion, self.protocolversion.minorversion) diff --git a/pyvlx/api/get_state.py b/pyvlx/api/get_state.py index 552b21e9..10b63f49 100644 --- a/pyvlx/api/get_state.py +++ b/pyvlx/api/get_state.py @@ -2,10 +2,12 @@ from .api_event import ApiEvent from .frames import FrameGetStateConfirmation, FrameGetStateRequest, GatewayState, GatewaySubState + class DtoState: """Data Object for Gateway State.""" def __init__(self, gateway_state=None, gateway_sub_state=None): + """Initialize DtoState class.""" self.gateway_state = gateway_state self.gateway_sub_state = gateway_sub_state @@ -60,4 +62,3 @@ def gateway_state(self): def gateway_sub_state(self): """Deprecated: Return Gateway Sub State as human readable string.""" return self.state.gateway_sub_state - \ No newline at end of file diff --git a/pyvlx/api/get_version.py b/pyvlx/api/get_version.py index e08dc9c3..15c29ae8 100644 --- a/pyvlx/api/get_version.py +++ b/pyvlx/api/get_version.py @@ -2,16 +2,18 @@ from .api_event import ApiEvent from .frames import FrameGetVersionConfirmation, FrameGetVersionRequest + class DtoVersion: """Object for KLF200 Data""" + def __init__(self, softwareversion=None, hardwareversion=None, productgroup=None, producttype=None): + """Initialize DtoVersion class.""" self.softwareversion = softwareversion self.hardwareversion = hardwareversion self.productgroup = productgroup self.producttype = producttype - def __str__(self): """Return human readable string.""" return ( @@ -21,6 +23,8 @@ def __str__(self): self.softwareversion, self.hardwareversion, self.productgroup, self.producttype ) ) + + class GetVersion(ApiEvent): """Class for retrieving firmware version from API.""" diff --git a/pyvlx/api/leave_learn_state.py b/pyvlx/api/leave_learn_state.py index 931f4582..740da857 100644 --- a/pyvlx/api/leave_learn_state.py +++ b/pyvlx/api/leave_learn_state.py @@ -6,15 +6,17 @@ class DtoLeaveLearnState: - """Dataobject to hold KLF200 Data""" + """Dataobject to hold KLF200 Data.""" + def __init__(self, status=None): + """Initialize DtoLeaveLearnState class.""" self.status = status + @property def status_name(self): """Return status as human readable string.""" return LeaveLearnStateConfirmationStatus(self.status_name).name - def __str__(self): """Return human readable string.""" return ( @@ -23,6 +25,7 @@ def __str__(self): ) ) + class LeaveLearnState(ApiEvent): """Class for handling leave learn state to API.""" diff --git a/pyvlx/api/reboot.py b/pyvlx/api/reboot.py index 21d4e1df..a58c83f9 100644 --- a/pyvlx/api/reboot.py +++ b/pyvlx/api/reboot.py @@ -4,7 +4,6 @@ from .frames import FrameGatewayRebootConfirmation, FrameGatewayRebootRequest - class Reboot(ApiEvent): """Class for handling Reboot to API.""" @@ -14,7 +13,6 @@ def __init__(self, pyvlx): self.pyvlx = pyvlx self.success = False - async def handle_frame(self, frame): """Handle incoming API frame, return True if this was the expected frame.""" if isinstance(frame, FrameGatewayRebootConfirmation): diff --git a/pyvlx/klf200gateway.py b/pyvlx/klf200gateway.py index 2a45a80d..acfb6795 100644 --- a/pyvlx/klf200gateway.py +++ b/pyvlx/klf200gateway.py @@ -1,6 +1,4 @@ -""" -Module for basic klf200 gateway functions. -""" +"""Module for basic klf200 gateway functions.""" from .exception import PyVLXException from .api import (GetState, GetNetworkSetup, GetProtocolVersion, GetVersion, @@ -8,6 +6,7 @@ SetUTC, Reboot) from .log import PYVLXLOG + class Klf200Gateway: """Class for node abstraction.""" @@ -90,9 +89,9 @@ async def set_utc(self): async def set_rtc_time_zone(self): """Set the RTC Time Zone.""" - #idontwant = setrtctimezone(pyvlx=self.pyvlx) + # idontwant = setrtctimezone(pyvlx=self.pyvlx) raise PyVLXException("KLF 200 RTC Timezone Set not implemented") - #return setrtctimezone.success + # return setrtctimezone.success async def reboot(self): """Reboot gateway.""" @@ -102,8 +101,8 @@ async def reboot(self): PYVLXLOG.warning("Unable to reboot gateway.") return reboot.success - async def factory_default(self): - """Factory Default Reset gateway.""" + async def set_factory_default(self): + """Sets Factory Default gateway.""" factorydefault = FactoryDefault(pyvlx=self.pyvlx) await factorydefault.do_api_call() if not factorydefault.success: @@ -111,7 +110,7 @@ async def factory_default(self): return factorydefault.success async def get_local_time(self): - """get local time from gateway.""" + """Get local time from gateway.""" getlocaltime = GetLocalTime(pyvlx=self.pyvlx) await getlocaltime.do_api_call() if not getlocaltime.success: @@ -120,7 +119,7 @@ async def get_local_time(self): return getlocaltime.success async def password_enter(self, password): - """get enter Password for gateway.""" + """Get enter Password for gateway.""" self.password = password passwordenter = PasswordEnter(pyvlx=self.pyvlx, password=self.password) await passwordenter.do_api_call() @@ -133,5 +132,4 @@ def __str__(self): return ( '<{} state="{}" network_setup="{}" version="{}" protocol_version="{}"/>'.format( type(self).__name__, str(self.state), str(self.network_setup), - str(self.version), str(self.protocol_version)) - ) + str(self.version), str(self.protocol_version))) From 9c1af49dc94d1bf27a81a1a5a4067a676e2b1e16 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Fri, 27 Nov 2020 07:06:03 +0100 Subject: [PATCH 28/58] Fix broken import --- test/frame_get_state_req_test.py | 4 ++-- test/frame_password_change_ntf_test.py | 9 ++++----- test/frame_password_change_req_test.py | 6 ++++-- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/test/frame_get_state_req_test.py b/test/frame_get_state_req_test.py index 41651f8a..1474c7ab 100644 --- a/test/frame_get_state_req_test.py +++ b/test/frame_get_state_req_test.py @@ -1,8 +1,8 @@ """Unit tests for FrameGetStateRequest.""" import unittest -from pyvlx.frame_creation import frame_from_raw -from pyvlx.frames import FrameGetStateRequest +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameGetStateRequest class TestFrameGetStateRequest(unittest.TestCase): diff --git a/test/frame_password_change_ntf_test.py b/test/frame_password_change_ntf_test.py index e59fdda9..36a0d0b5 100644 --- a/test/frame_password_change_ntf_test.py +++ b/test/frame_password_change_ntf_test.py @@ -17,8 +17,8 @@ def test_bytes(self): self.assertEqual( bytes(frame), b"\x00#0\x04fnord\x00\x00\x00\x00\x00\x00" - +b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - +b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00f", + + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00f", ) def test_bytes_long_pw(self): @@ -32,8 +32,8 @@ def test_frame_from_raw(self): """Test parsing FramePasswordChangeNotification from raw bytes.""" frame = frame_from_raw( b"\x00#0\x04fnord\x00\x00\x00\x00\x00\x00" - +b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - +b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00f", + + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00f", ) self.assertTrue(isinstance(frame, FramePasswordChangeNotification)) self.assertEqual(frame.newpassword, "fnord") @@ -45,7 +45,6 @@ def test_errors(self): with self.assertRaises(PyVLXException): bytes(FramePasswordChangeNotification(newpassword="x" * 33)) - def test_str(self): """Test string representation of FramePasswordChangeNotification.""" frame = FramePasswordChangeNotification(newpassword="fnord") diff --git a/test/frame_password_change_req_test.py b/test/frame_password_change_req_test.py index ede10b00..bc1c7e57 100644 --- a/test/frame_password_change_req_test.py +++ b/test/frame_password_change_req_test.py @@ -27,14 +27,16 @@ def test_bytes_long_newpw(self): """Test FramePasswordChangeRequest with long new password.""" frame = FramePasswordChangeRequest(currentpassword="fnord", newpassword="x" * 32) self.assertEqual( - bytes(frame), b"\x00C0\x02fnord\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\x00" + bytes(frame), b"\x00C0\x02fnord\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\x00" ) def test_bytes_long_oldpw(self): """Test FramePasswordChangeRequest with long old password.""" frame = FramePasswordChangeRequest(currentpassword="x" * 32, newpassword="bfeld") self.assertEqual( - bytes(frame), b"\x00C0\x02xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxbfeld\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18" + bytes(frame), b"\x00C0\x02xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxbfeld\x00\x00\x00" + + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18" ) def test_bytes_long_bothpw(self): From 52a1607bfa6264302998783212c9c772c1f3590f Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Fri, 27 Nov 2020 07:14:48 +0100 Subject: [PATCH 29/58] remove sym link --- test/pyvlx | 1 - 1 file changed, 1 deletion(-) delete mode 120000 test/pyvlx diff --git a/test/pyvlx b/test/pyvlx deleted file mode 120000 index 6196e671..00000000 --- a/test/pyvlx +++ /dev/null @@ -1 +0,0 @@ -../pyvlx \ No newline at end of file From a615803216a204e3b34d234d09187296064c2552 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Sun, 29 Nov 2020 21:43:34 +0100 Subject: [PATCH 30/58] fix pylint warnings --- pyvlx/api/frame_creation.py | 3 +-- pyvlx/api/frames/frame_get_local_time.py | 3 +-- pyvlx/api/get_local_time.py | 3 +-- pyvlx/api/get_scene_list.py | 1 - pyvlx/lightening_device.py | 2 +- pyvlx/node.py | 2 +- pyvlx/nodes.py | 3 +-- pyvlx/pyvlx.py | 2 +- pyvlx/scene.py | 2 +- pyvlx/scenes.py | 2 +- test/frame_activate_scene_req_test.py | 6 ++++-- 11 files changed, 13 insertions(+), 16 deletions(-) diff --git a/pyvlx/api/frame_creation.py b/pyvlx/api/frame_creation.py index d20b09f6..b57ad571 100644 --- a/pyvlx/api/frame_creation.py +++ b/pyvlx/api/frame_creation.py @@ -32,8 +32,7 @@ FrameSetUTCConfirmation, FrameSetUTCRequest, extract_from_frame, FrameLeaveLearnStateConfirmation, FrameLeaveLearnStateRequest, FrameGetLocalTimeConfirmation, FrameGetLocalTimeRequest, - FrameGatewayFactoryDefaultConfirmation, FrameGatewayFactoryDefaultRequest - ) + FrameGatewayFactoryDefaultConfirmation, FrameGatewayFactoryDefaultRequest) def frame_from_raw(raw): diff --git a/pyvlx/api/frames/frame_get_local_time.py b/pyvlx/api/frames/frame_get_local_time.py index 8a9ca295..d3554e6b 100644 --- a/pyvlx/api/frames/frame_get_local_time.py +++ b/pyvlx/api/frames/frame_get_local_time.py @@ -56,5 +56,4 @@ def __str__(self): 'month="{}" year="{}" weekday="{}" dayofyear="{}" daylightsavingflag="{}"/>'.format( type(self).__name__, self.utctime, self.second, self.minute, self.hour, self.dayofmonth, self.month, self.year, self.weekday, self.dayofyear, - self.daylightsavingflag) - ) + self.daylightsavingflag)) diff --git a/pyvlx/api/get_local_time.py b/pyvlx/api/get_local_time.py index f566ddeb..5430d621 100644 --- a/pyvlx/api/get_local_time.py +++ b/pyvlx/api/get_local_time.py @@ -44,8 +44,7 @@ async def handle_frame(self, frame): datetime.fromtimestamp(time.mktime( (frame.year + 1900, frame.month, frame.dayofmonth, frame.hour, frame.minute, frame.second, - weekday, frame.dayofyear, frame.daylightsavingflag))) - ) + weekday, frame.dayofyear, frame.daylightsavingflag)))) self.success = True return True diff --git a/pyvlx/api/get_scene_list.py b/pyvlx/api/get_scene_list.py index 9e423b22..2af93034 100644 --- a/pyvlx/api/get_scene_list.py +++ b/pyvlx/api/get_scene_list.py @@ -6,7 +6,6 @@ FrameGetSceneListRequest) - class GetSceneList(ApiEvent): """Class for retrieving scene list from API.""" diff --git a/pyvlx/lightening_device.py b/pyvlx/lightening_device.py index c68a7d72..da370d7e 100644 --- a/pyvlx/lightening_device.py +++ b/pyvlx/lightening_device.py @@ -1,5 +1,5 @@ """Module for lights.""" -from .api.command_send import CommandSend +from .api import CommandSend from .exception import PyVLXException from .node import Node from .parameter import Intensity diff --git a/pyvlx/node.py b/pyvlx/node.py index fe6631a2..75907ace 100644 --- a/pyvlx/node.py +++ b/pyvlx/node.py @@ -6,7 +6,7 @@ and roller shutters. """ from .exception import PyVLXException -from .api.set_node_name import SetNodeName +from .api import SetNodeName class Node: diff --git a/pyvlx/nodes.py b/pyvlx/nodes.py index 0b9338f7..d706b01f 100644 --- a/pyvlx/nodes.py +++ b/pyvlx/nodes.py @@ -1,7 +1,6 @@ """Module for storing nodes.""" from .exception import PyVLXException -from .api.get_all_nodes_information import GetAllNodesInformation -from .api.get_node_information import GetNodeInformation +from .api import (GetAllNodesInformation, GetNodeInformation) from .node import Node from .node_helper import convert_frame_to_node diff --git a/pyvlx/pyvlx.py b/pyvlx/pyvlx.py index 1b3cfaf8..004b5067 100644 --- a/pyvlx/pyvlx.py +++ b/pyvlx/pyvlx.py @@ -15,7 +15,7 @@ from .nodes import Nodes from .scenes import Scenes from .klf200gateway import Klf200Gateway -from .api.house_status_monitor import house_status_monitor_enable +from .api import house_status_monitor_enable class PyVLX: diff --git a/pyvlx/scene.py b/pyvlx/scene.py index 224fbc6d..a497c9f1 100644 --- a/pyvlx/scene.py +++ b/pyvlx/scene.py @@ -1,5 +1,5 @@ """Module for scene.""" -from .api.activate_scene import ActivateScene +from .api import ActivateScene from .exception import PyVLXException diff --git a/pyvlx/scenes.py b/pyvlx/scenes.py index 0246a5b9..d95d8558 100644 --- a/pyvlx/scenes.py +++ b/pyvlx/scenes.py @@ -1,6 +1,6 @@ """Module for storing and accessing scene list.""" from .exception import PyVLXException -from .api.get_scene_list import GetSceneList +from .api import GetSceneList from .scene import Scene diff --git a/test/frame_activate_scene_req_test.py b/test/frame_activate_scene_req_test.py index 8af1a5ec..d4ab201f 100644 --- a/test/frame_activate_scene_req_test.py +++ b/test/frame_activate_scene_req_test.py @@ -4,7 +4,8 @@ from pyvlx.const import Originator, Priority, Velocity from pyvlx.api.frame_creation import frame_from_raw from pyvlx.api.frames import FrameActivateSceneRequest - + + class TestFrameActivateSceneRequest(unittest.TestCase): """Test class FrameActivateSceneRequest.""" @@ -39,5 +40,6 @@ def test_str(self): ) self.assertEqual( str(frame), - '', + '', ) From fa852a9797a2e5b002a2d9713bd6fc7ad165ccf9 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Sun, 29 Nov 2020 22:09:26 +0100 Subject: [PATCH 31/58] Fix more pylint errors --- pyvlx/api/get_state.py | 4 ++-- pyvlx/api/get_version.py | 2 +- pyvlx/klf200gateway.py | 2 +- test/frame_activate_scene_req_test.py | 2 +- test/frame_get_all_nodes_information_ntf_test.py | 1 + 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/pyvlx/api/get_state.py b/pyvlx/api/get_state.py index 10b63f49..3984969b 100644 --- a/pyvlx/api/get_state.py +++ b/pyvlx/api/get_state.py @@ -55,10 +55,10 @@ def request_frame(self): @property def gateway_state(self): - """Deprecated: Return Gateway State as human readable string.""" + """Return Gateway State as human readable string. Deprecated.""" return self.state.gateway_state @property def gateway_sub_state(self): - """Deprecated: Return Gateway Sub State as human readable string.""" + """Return Gateway Sub State as human readable string. Deprecated.""" return self.state.gateway_sub_state diff --git a/pyvlx/api/get_version.py b/pyvlx/api/get_version.py index 15c29ae8..ab51172c 100644 --- a/pyvlx/api/get_version.py +++ b/pyvlx/api/get_version.py @@ -4,7 +4,7 @@ class DtoVersion: - """Object for KLF200 Data""" + """Object for KLF200 Data.""" def __init__(self, softwareversion=None, hardwareversion=None, productgroup=None, producttype=None): diff --git a/pyvlx/klf200gateway.py b/pyvlx/klf200gateway.py index acfb6795..0f6c4e76 100644 --- a/pyvlx/klf200gateway.py +++ b/pyvlx/klf200gateway.py @@ -102,7 +102,7 @@ async def reboot(self): return reboot.success async def set_factory_default(self): - """Sets Factory Default gateway.""" + """Set Gateway to Factory Default.""" factorydefault = FactoryDefault(pyvlx=self.pyvlx) await factorydefault.do_api_call() if not factorydefault.success: diff --git a/test/frame_activate_scene_req_test.py b/test/frame_activate_scene_req_test.py index d4ab201f..470623b9 100644 --- a/test/frame_activate_scene_req_test.py +++ b/test/frame_activate_scene_req_test.py @@ -40,6 +40,6 @@ def test_str(self): ) self.assertEqual( str(frame), - '', ) diff --git a/test/frame_get_all_nodes_information_ntf_test.py b/test/frame_get_all_nodes_information_ntf_test.py index ddb0e2a2..7fd9b1af 100644 --- a/test/frame_get_all_nodes_information_ntf_test.py +++ b/test/frame_get_all_nodes_information_ntf_test.py @@ -12,6 +12,7 @@ class TestFrameGetAllNodesInformationNotification(unittest.TestCase): """Test class for FrameGetAllNodesInformationNotification.""" + # pylint: disable=too-many-public-methods,invalid-name EXAMPLE_FRAME = ( From bf9284d3c591f9b8de807244ab6951754ba26eff Mon Sep 17 00:00:00 2001 From: Georg R <39526093+icommitdesnet@users.noreply.github.com> Date: Sun, 29 Nov 2020 22:23:55 +0100 Subject: [PATCH 32/58] Update frame_get_all_nodes_information_ntf_test.py --- test/frame_get_all_nodes_information_ntf_test.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/frame_get_all_nodes_information_ntf_test.py b/test/frame_get_all_nodes_information_ntf_test.py index 7fd9b1af..e3c9e8f7 100644 --- a/test/frame_get_all_nodes_information_ntf_test.py +++ b/test/frame_get_all_nodes_information_ntf_test.py @@ -12,7 +12,8 @@ class TestFrameGetAllNodesInformationNotification(unittest.TestCase): """Test class for FrameGetAllNodesInformationNotification.""" - + + # pylint: disable=too-many-public-methods,invalid-name EXAMPLE_FRAME = ( From dcd3df9e9058cd9ba3a27d591c0644d6ebd884f9 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Sun, 29 Nov 2020 22:36:38 +0100 Subject: [PATCH 33/58] another fix for pylint warnings --- test/frame_get_all_nodes_information_ntf_test.py | 1 - 1 file changed, 1 deletion(-) diff --git a/test/frame_get_all_nodes_information_ntf_test.py b/test/frame_get_all_nodes_information_ntf_test.py index e3c9e8f7..91af3c55 100644 --- a/test/frame_get_all_nodes_information_ntf_test.py +++ b/test/frame_get_all_nodes_information_ntf_test.py @@ -13,7 +13,6 @@ class TestFrameGetAllNodesInformationNotification(unittest.TestCase): """Test class for FrameGetAllNodesInformationNotification.""" - # pylint: disable=too-many-public-methods,invalid-name EXAMPLE_FRAME = ( From d1c4b9aeef5f26375b7ece1a879f641fc4f4310e Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Sun, 29 Nov 2020 22:58:49 +0100 Subject: [PATCH 34/58] fix Imports from API --- pyvlx/connection.py | 5 +++-- pyvlx/heartbeat.py | 2 +- pyvlx/klf200gateway.py | 8 +++++--- pyvlx/lightening_device.py | 2 +- pyvlx/node.py | 2 +- pyvlx/node_updater.py | 2 +- pyvlx/nodes.py | 2 +- pyvlx/on_off_switch.py | 2 +- pyvlx/opening_device.py | 2 +- pyvlx/pyvlx.py | 3 ++- pyvlx/scene.py | 2 +- pyvlx/scenes.py | 2 +- 12 files changed, 19 insertions(+), 15 deletions(-) diff --git a/pyvlx/connection.py b/pyvlx/connection.py index 6c1637bb..8656b106 100644 --- a/pyvlx/connection.py +++ b/pyvlx/connection.py @@ -2,9 +2,10 @@ import asyncio import ssl +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameBase + from .exception import PyVLXException -from .api.frame_creation import frame_from_raw -from .api.frames import FrameBase from .log import PYVLXLOG from .slip import get_next_slip, is_slip, slip_pack diff --git a/pyvlx/heartbeat.py b/pyvlx/heartbeat.py index 91dd5437..d1855d19 100644 --- a/pyvlx/heartbeat.py +++ b/pyvlx/heartbeat.py @@ -1,8 +1,8 @@ """Module for sending get state requests to API in regular periods.""" import asyncio +from pyvlx.api import GetState from .exception import PyVLXException -from .api.get_state import GetState class Heartbeat: diff --git a/pyvlx/klf200gateway.py b/pyvlx/klf200gateway.py index 0f6c4e76..68c65d9e 100644 --- a/pyvlx/klf200gateway.py +++ b/pyvlx/klf200gateway.py @@ -1,9 +1,11 @@ """Module for basic klf200 gateway functions.""" + +from pyvlx.api import (GetState, GetNetworkSetup, GetProtocolVersion, GetVersion, + GetLocalTime, LeaveLearnState, FactoryDefault, PasswordEnter, + SetUTC, Reboot) + from .exception import PyVLXException -from .api import (GetState, GetNetworkSetup, GetProtocolVersion, GetVersion, - GetLocalTime, LeaveLearnState, FactoryDefault, PasswordEnter, - SetUTC, Reboot) from .log import PYVLXLOG diff --git a/pyvlx/lightening_device.py b/pyvlx/lightening_device.py index da370d7e..a2010a7d 100644 --- a/pyvlx/lightening_device.py +++ b/pyvlx/lightening_device.py @@ -1,5 +1,5 @@ """Module for lights.""" -from .api import CommandSend +from pyvlx.api import CommandSend from .exception import PyVLXException from .node import Node from .parameter import Intensity diff --git a/pyvlx/node.py b/pyvlx/node.py index 75907ace..7345b786 100644 --- a/pyvlx/node.py +++ b/pyvlx/node.py @@ -5,8 +5,8 @@ be derived by other objects like window openers and roller shutters. """ +from pyvlx.api import SetNodeName from .exception import PyVLXException -from .api import SetNodeName class Node: diff --git a/pyvlx/node_updater.py b/pyvlx/node_updater.py index f4597658..b7ad250a 100644 --- a/pyvlx/node_updater.py +++ b/pyvlx/node_updater.py @@ -1,5 +1,5 @@ """Module for updating nodes via frames.""" -from .api.frames import ( +from pyvlx.api.frames import ( FrameGetAllNodesInformationNotification, FrameNodeStatePositionChangedNotification) from .lightening_device import LighteningDevice diff --git a/pyvlx/nodes.py b/pyvlx/nodes.py index d706b01f..219c7c31 100644 --- a/pyvlx/nodes.py +++ b/pyvlx/nodes.py @@ -1,6 +1,6 @@ """Module for storing nodes.""" +from pyvlx.api import (GetAllNodesInformation, GetNodeInformation) from .exception import PyVLXException -from .api import (GetAllNodesInformation, GetNodeInformation) from .node import Node from .node_helper import convert_frame_to_node diff --git a/pyvlx/on_off_switch.py b/pyvlx/on_off_switch.py index de3f523e..6feff5c7 100644 --- a/pyvlx/on_off_switch.py +++ b/pyvlx/on_off_switch.py @@ -1,5 +1,5 @@ """Module for on/off switches.""" -from .api.command_send import CommandSend +from pyvlx.api.command_send import CommandSend from .exception import PyVLXException from .node import Node from .parameter import SwitchParameter, SwitchParameterOff, SwitchParameterOn diff --git a/pyvlx/opening_device.py b/pyvlx/opening_device.py index 3e1cab88..d882b249 100644 --- a/pyvlx/opening_device.py +++ b/pyvlx/opening_device.py @@ -1,5 +1,5 @@ """Module for window openers.""" -from .api.command_send import CommandSend +from pyvlx.api.command_send import CommandSend from .exception import PyVLXException from .node import Node from .parameter import CurrentPosition, Parameter, Position, TargetPosition diff --git a/pyvlx/pyvlx.py b/pyvlx/pyvlx.py index 004b5067..16f1009d 100644 --- a/pyvlx/pyvlx.py +++ b/pyvlx/pyvlx.py @@ -7,6 +7,8 @@ """ import asyncio + +from pyvlx.api import house_status_monitor_enable from .config import Config from .connection import Connection from .heartbeat import Heartbeat @@ -15,7 +17,6 @@ from .nodes import Nodes from .scenes import Scenes from .klf200gateway import Klf200Gateway -from .api import house_status_monitor_enable class PyVLX: diff --git a/pyvlx/scene.py b/pyvlx/scene.py index a497c9f1..203ee707 100644 --- a/pyvlx/scene.py +++ b/pyvlx/scene.py @@ -1,5 +1,5 @@ """Module for scene.""" -from .api import ActivateScene +from pyvlx.api import ActivateScene from .exception import PyVLXException diff --git a/pyvlx/scenes.py b/pyvlx/scenes.py index d95d8558..7ddacd2e 100644 --- a/pyvlx/scenes.py +++ b/pyvlx/scenes.py @@ -1,6 +1,6 @@ """Module for storing and accessing scene list.""" +from pyvlx.api import GetSceneList from .exception import PyVLXException -from .api import GetSceneList from .scene import Scene From b0d3ed5fec62ef795c696d83e922e53b772f8088 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Mon, 30 Nov 2020 16:02:53 +0100 Subject: [PATCH 35/58] pylint + flake8 control --- pyvlx/api/__init__.py | 4 ++-- pyvlx/api/frame_creation.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pyvlx/api/__init__.py b/pyvlx/api/__init__.py index 759a4f6e..37fab54d 100644 --- a/pyvlx/api/__init__.py +++ b/pyvlx/api/__init__.py @@ -1,9 +1,9 @@ """Module for all KLF 200 API frames.""" +# flake8: noqa from .house_status_monitor import (house_status_monitor_enable) - from .command_send import (CommandSend) -# from .get_local_time import (FrameGetLocalTimeRequest, FrameGetLocalTimeConfirmation) +from .get_local_time import (FrameGetLocalTimeRequest, FrameGetLocalTimeConfirmation) from .get_state import (GetState) from .get_network_setup import (GetNetworkSetup) from .get_protocol_version import (GetProtocolVersion) diff --git a/pyvlx/api/frame_creation.py b/pyvlx/api/frame_creation.py index b57ad571..a57ceff5 100644 --- a/pyvlx/api/frame_creation.py +++ b/pyvlx/api/frame_creation.py @@ -53,7 +53,7 @@ def frame_from_raw(raw): def create_frame(command): """Create and return empty Frame from Command.""" - # pylint: disable=too-many-branches,too-many-return-statements + # pylint: disable=too-many-branches,too-many-return-statements,too-many-statements if command == Command.GW_ERROR_NTF: return FrameErrorNotification() if command == Command.GW_COMMAND_SEND_REQ: From 3f6af0a9eed32e9bb8e21d79d107bb5396119b38 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Mon, 30 Nov 2020 17:04:26 +0100 Subject: [PATCH 36/58] fix imports, add exception from keywords --- pyvlx/api/frames/frame_helper.py | 4 ++-- pyvlx/config.py | 4 ++-- pyvlx/connection.py | 4 ++-- pyvlx/heartbeat.py | 2 +- pyvlx/klf200gateway.py | 2 +- pyvlx/lightening_device.py | 2 +- pyvlx/node.py | 2 +- pyvlx/node_updater.py | 2 +- pyvlx/nodes.py | 2 +- pyvlx/on_off_switch.py | 2 +- pyvlx/opening_device.py | 2 +- pyvlx/pyvlx.py | 2 +- pyvlx/scene.py | 2 +- pyvlx/scenes.py | 2 +- 14 files changed, 17 insertions(+), 17 deletions(-) diff --git a/pyvlx/api/frames/frame_helper.py b/pyvlx/api/frames/frame_helper.py index 1ce7fbe9..e224810a 100644 --- a/pyvlx/api/frames/frame_helper.py +++ b/pyvlx/api/frames/frame_helper.py @@ -33,6 +33,6 @@ def extract_from_frame(data): payload = data[4:-1] try: command = Command(data[2] * 256 + data[3]) - except ValueError: - raise PyVLXException("could_not_extract_from_frame_command", data=data) + except ValueError as type_error: + raise PyVLXException("could_not_extract_from_frame_command", data=data) from type_error return command, payload diff --git a/pyvlx/config.py b/pyvlx/config.py index 0af88c0a..748fa545 100644 --- a/pyvlx/config.py +++ b/pyvlx/config.py @@ -30,8 +30,8 @@ def read_config(self, path): self.password = doc["config"]["password"] if "port" in doc["config"]: self.port = doc["config"]["port"] - except FileNotFoundError as ex: - raise PyVLXException("file does not exist: {0}".format(ex)) + except FileNotFoundError as not_found: + raise PyVLXException("file does not exist: {0}".format(not_found)) from not_found @staticmethod def test_configuration(doc, path): diff --git a/pyvlx/connection.py b/pyvlx/connection.py index 8656b106..fab5f05e 100644 --- a/pyvlx/connection.py +++ b/pyvlx/connection.py @@ -2,8 +2,8 @@ import asyncio import ssl -from pyvlx.api.frame_creation import frame_from_raw -from pyvlx.api.frames import FrameBase +from .api.frame_creation import frame_from_raw +from .api.frames import FrameBase from .exception import PyVLXException from .log import PYVLXLOG diff --git a/pyvlx/heartbeat.py b/pyvlx/heartbeat.py index d1855d19..005cb949 100644 --- a/pyvlx/heartbeat.py +++ b/pyvlx/heartbeat.py @@ -1,7 +1,7 @@ """Module for sending get state requests to API in regular periods.""" import asyncio -from pyvlx.api import GetState +from .api import GetState from .exception import PyVLXException diff --git a/pyvlx/klf200gateway.py b/pyvlx/klf200gateway.py index 68c65d9e..bde57303 100644 --- a/pyvlx/klf200gateway.py +++ b/pyvlx/klf200gateway.py @@ -1,6 +1,6 @@ """Module for basic klf200 gateway functions.""" -from pyvlx.api import (GetState, GetNetworkSetup, GetProtocolVersion, GetVersion, +from .api import (GetState, GetNetworkSetup, GetProtocolVersion, GetVersion, GetLocalTime, LeaveLearnState, FactoryDefault, PasswordEnter, SetUTC, Reboot) diff --git a/pyvlx/lightening_device.py b/pyvlx/lightening_device.py index a2010a7d..da370d7e 100644 --- a/pyvlx/lightening_device.py +++ b/pyvlx/lightening_device.py @@ -1,5 +1,5 @@ """Module for lights.""" -from pyvlx.api import CommandSend +from .api import CommandSend from .exception import PyVLXException from .node import Node from .parameter import Intensity diff --git a/pyvlx/node.py b/pyvlx/node.py index 7345b786..848256b3 100644 --- a/pyvlx/node.py +++ b/pyvlx/node.py @@ -5,7 +5,7 @@ be derived by other objects like window openers and roller shutters. """ -from pyvlx.api import SetNodeName +from .api import SetNodeName from .exception import PyVLXException diff --git a/pyvlx/node_updater.py b/pyvlx/node_updater.py index b7ad250a..f4597658 100644 --- a/pyvlx/node_updater.py +++ b/pyvlx/node_updater.py @@ -1,5 +1,5 @@ """Module for updating nodes via frames.""" -from pyvlx.api.frames import ( +from .api.frames import ( FrameGetAllNodesInformationNotification, FrameNodeStatePositionChangedNotification) from .lightening_device import LighteningDevice diff --git a/pyvlx/nodes.py b/pyvlx/nodes.py index 219c7c31..af8116d8 100644 --- a/pyvlx/nodes.py +++ b/pyvlx/nodes.py @@ -1,5 +1,5 @@ """Module for storing nodes.""" -from pyvlx.api import (GetAllNodesInformation, GetNodeInformation) +from .api import (GetAllNodesInformation, GetNodeInformation) from .exception import PyVLXException from .node import Node from .node_helper import convert_frame_to_node diff --git a/pyvlx/on_off_switch.py b/pyvlx/on_off_switch.py index 6feff5c7..de3f523e 100644 --- a/pyvlx/on_off_switch.py +++ b/pyvlx/on_off_switch.py @@ -1,5 +1,5 @@ """Module for on/off switches.""" -from pyvlx.api.command_send import CommandSend +from .api.command_send import CommandSend from .exception import PyVLXException from .node import Node from .parameter import SwitchParameter, SwitchParameterOff, SwitchParameterOn diff --git a/pyvlx/opening_device.py b/pyvlx/opening_device.py index d882b249..3e1cab88 100644 --- a/pyvlx/opening_device.py +++ b/pyvlx/opening_device.py @@ -1,5 +1,5 @@ """Module for window openers.""" -from pyvlx.api.command_send import CommandSend +from .api.command_send import CommandSend from .exception import PyVLXException from .node import Node from .parameter import CurrentPosition, Parameter, Position, TargetPosition diff --git a/pyvlx/pyvlx.py b/pyvlx/pyvlx.py index 16f1009d..7c822b7a 100644 --- a/pyvlx/pyvlx.py +++ b/pyvlx/pyvlx.py @@ -8,7 +8,7 @@ import asyncio -from pyvlx.api import house_status_monitor_enable +from .api import house_status_monitor_enable from .config import Config from .connection import Connection from .heartbeat import Heartbeat diff --git a/pyvlx/scene.py b/pyvlx/scene.py index 203ee707..a497c9f1 100644 --- a/pyvlx/scene.py +++ b/pyvlx/scene.py @@ -1,5 +1,5 @@ """Module for scene.""" -from pyvlx.api import ActivateScene +from .api import ActivateScene from .exception import PyVLXException diff --git a/pyvlx/scenes.py b/pyvlx/scenes.py index 7ddacd2e..d98264bc 100644 --- a/pyvlx/scenes.py +++ b/pyvlx/scenes.py @@ -1,5 +1,5 @@ """Module for storing and accessing scene list.""" -from pyvlx.api import GetSceneList +from .api import GetSceneList from .exception import PyVLXException from .scene import Scene From 2a941fed8247f735ecb2eb36a5487741472b8e28 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Mon, 30 Nov 2020 17:05:39 +0100 Subject: [PATCH 37/58] Fix Ident --- pyvlx/klf200gateway.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyvlx/klf200gateway.py b/pyvlx/klf200gateway.py index bde57303..be395ee3 100644 --- a/pyvlx/klf200gateway.py +++ b/pyvlx/klf200gateway.py @@ -1,8 +1,8 @@ """Module for basic klf200 gateway functions.""" from .api import (GetState, GetNetworkSetup, GetProtocolVersion, GetVersion, - GetLocalTime, LeaveLearnState, FactoryDefault, PasswordEnter, - SetUTC, Reboot) + GetLocalTime, LeaveLearnState, FactoryDefault, PasswordEnter, + SetUTC, Reboot) from .exception import PyVLXException From 8db8163c2d11c69d9c922e9904e3414f65dbe177 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Mon, 30 Nov 2020 21:16:29 +0100 Subject: [PATCH 38/58] Add Tests --- pyvlx/api/frame_creation.py | 2 +- pyvlx/api/frames/frame_get_local_time.py | 16 +++++++++++--- test/frame_factory_default_cfm_test.py | 28 ++++++++++++++++++++++++ test/frame_factory_default_req_test.py | 28 ++++++++++++++++++++++++ test/frame_get_local_time_cfm_test.py | 27 +++++++++++++++++++++++ test/frame_get_local_time_req_test.py | 26 ++++++++++++++++++++++ 6 files changed, 123 insertions(+), 4 deletions(-) create mode 100644 test/frame_factory_default_cfm_test.py create mode 100644 test/frame_factory_default_req_test.py create mode 100644 test/frame_get_local_time_cfm_test.py create mode 100644 test/frame_get_local_time_req_test.py diff --git a/pyvlx/api/frame_creation.py b/pyvlx/api/frame_creation.py index a57ceff5..209926d8 100644 --- a/pyvlx/api/frame_creation.py +++ b/pyvlx/api/frame_creation.py @@ -86,7 +86,7 @@ def create_frame(command): if command == Command.GW_SET_FACTORY_DEFAULT_REQ: return FrameGatewayFactoryDefaultRequest() - if command == Command.GW_REBOOT_CFM: + if command == Command.GW_SET_FACTORY_DEFAULT_CFM: return FrameGatewayFactoryDefaultConfirmation() if command == Command.GW_GET_LOCAL_TIME_REQ: diff --git a/pyvlx/api/frames/frame_get_local_time.py b/pyvlx/api/frames/frame_get_local_time.py index d3554e6b..9f8e47cf 100644 --- a/pyvlx/api/frames/frame_get_local_time.py +++ b/pyvlx/api/frames/frame_get_local_time.py @@ -1,6 +1,6 @@ """Module for get local time classes.""" +import struct from ...const import Command - from .frame import FrameBase @@ -35,11 +35,21 @@ def __init__(self): def get_payload(self): """Return Payload.""" - return + payload = struct.pack(">I", self.utctime) + payload += self.second.to_bytes(1, byteorder="big") + payload += self.minute.to_bytes(1, byteorder="big") + payload += self.hour.to_bytes(1, byteorder="big") + payload += self.dayofmonth.to_bytes(1, byteorder="big") + payload += self.month.to_bytes(1, byteorder="big") + payload += self.year.to_bytes(2, byteorder="big") + payload += self.weekday.to_bytes(1, byteorder="big") + payload += self.dayofyear.to_bytes(2, byteorder="big") + payload += self.daylightsavingflag.to_bytes(1, byteorder="big") + return payload def from_payload(self, payload): """Init frame from binary data.""" - self.utctime = int.from_bytes(payload[0:4], byteorder='big', signed=True) + self.utctime = struct.unpack(">I", payload[0:4])[0] self.second = payload[4] self.minute = payload[5] self.hour = payload[6] diff --git a/test/frame_factory_default_cfm_test.py b/test/frame_factory_default_cfm_test.py new file mode 100644 index 00000000..57680997 --- /dev/null +++ b/test/frame_factory_default_cfm_test.py @@ -0,0 +1,28 @@ +"""Unit tests for FrameGatewayFactoryDefaultConfirmation.""" +import unittest + +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameGatewayFactoryDefaultConfirmation + + +class TestFrameGatewayFactoryDefaultConfirmation(unittest.TestCase): + """Test class FrameGatewayFactoryDefaultConfirmation.""" + + # pylint: disable=too-many-public-methods,invalid-name + + EXAMPLE_FRAME = b"\x00\x03\x00\x04\x07" + + def test_bytes(self): + """Test FrameGatewayFactoryDefaultConfirmation.""" + frame = FrameGatewayFactoryDefaultConfirmation() + self.assertEqual(bytes(frame), self.EXAMPLE_FRAME) + + def test_frame_from_raw(self): + """Test parse FrameGatewayFactoryDefaultConfirmation from raw.""" + frame = frame_from_raw(self.EXAMPLE_FRAME) + self.assertTrue(isinstance(frame, FrameGatewayFactoryDefaultConfirmation)) + + def test_str(self): + """Test string representation of FrameGatewayFactoryDefaultConfirmation.""" + frame = FrameGatewayFactoryDefaultConfirmation() + self.assertEqual(str(frame), "") diff --git a/test/frame_factory_default_req_test.py b/test/frame_factory_default_req_test.py new file mode 100644 index 00000000..de15e7a7 --- /dev/null +++ b/test/frame_factory_default_req_test.py @@ -0,0 +1,28 @@ +"""Unit tests for FrameGatewayFactoryDefaultRequest.""" +import unittest + +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameGatewayFactoryDefaultRequest + + +class TestFrameRebootRequest(unittest.TestCase): + """Test class FrameGatewayFactoryDefaultRequest.""" + + # pylint: disable=too-many-public-methods,invalid-name + + EXAMPLE_FRAME = b"\x00\x03\x00\x03\x00" + + def test_bytes(self): + """Test FrameGatewayFactoryDefaultRequest.""" + frame = FrameGatewayFactoryDefaultRequest() + self.assertEqual(bytes(frame), self.EXAMPLE_FRAME) + + def test_frame_from_raw(self): + """Test parse FrameGatewayFactoryDefaultRequest from raw.""" + frame = frame_from_raw(self.EXAMPLE_FRAME) + self.assertTrue(isinstance(frame, FrameGatewayFactoryDefaultRequest)) + + def test_str(self): + """Test string representation of FrameGatewayFactoryDefaultRequest.""" + frame = FrameGatewayFactoryDefaultRequest() + self.assertEqual(str(frame), "") diff --git a/test/frame_get_local_time_cfm_test.py b/test/frame_get_local_time_cfm_test.py new file mode 100644 index 00000000..21f15838 --- /dev/null +++ b/test/frame_get_local_time_cfm_test.py @@ -0,0 +1,27 @@ +"""Unit tests for FrameGetLocalTimeConfirmation.""" +import unittest + +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameGetLocalTimeConfirmation + + +class TestFrameGetLocalTimeConfirmation(unittest.TestCase): + """Test class for FrameGetLocalTimeConfirmation.""" + # pylint: disable=too-many-public-methods,invalid-name + + def test_bytes(self): + """Test FrameGetLocalTimeConfirmation.""" + frame = FrameGetLocalTimeConfirmation() + self.assertEqual(bytes(frame), b"\x00\x12 \x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x007") + + def test_frame_from_raw(self): + """Test parse FrameGetLocalTimeConfirmation from raw.""" + frame = frame_from_raw(b"\x00\x12 \x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x007") + self.assertTrue(isinstance(frame, FrameGetLocalTimeConfirmation)) + + def test_str(self): + """Test string representation of FrameGetLocalTimeConfirmation.""" + frame = FrameGetLocalTimeConfirmation() + + self.assertEqual(str(frame),'') diff --git a/test/frame_get_local_time_req_test.py b/test/frame_get_local_time_req_test.py new file mode 100644 index 00000000..08714e54 --- /dev/null +++ b/test/frame_get_local_time_req_test.py @@ -0,0 +1,26 @@ +"""Unit tests for FrameGetLocalTimeRequest.""" +import unittest + +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameGetLocalTimeRequest + + +class TestFrameGetLocalTimeRequest(unittest.TestCase): + """Test class for FrameGetLocalTimeRequest.""" + + # pylint: disable=too-many-public-methods,invalid-name + + def test_bytes(self): + """Test FrameGetLocalTimeRequest with NO_TYPE.""" + frame = FrameGetLocalTimeRequest() + self.assertEqual(bytes(frame), b"\x00\x03\x20\x04\x27") + + def test_frame_from_raw(self): + """Test parse FrameGetLocalTimeRequest from raw.""" + frame = frame_from_raw(b"\x00\x03\x20\x04\x27") + self.assertTrue(isinstance(frame, FrameGetLocalTimeRequest)) + + def test_str(self): + """Test string representation of FrameGetLocalTimeRequest.""" + frame = FrameGetLocalTimeRequest() + self.assertEqual(str(frame), "") From 9767f23471f153b01d11de649dcad323d7e50adb Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Tue, 1 Dec 2020 07:11:05 +0100 Subject: [PATCH 39/58] fix linting --- test/frame_get_local_time_cfm_test.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/frame_get_local_time_cfm_test.py b/test/frame_get_local_time_cfm_test.py index 21f15838..255f5f92 100644 --- a/test/frame_get_local_time_cfm_test.py +++ b/test/frame_get_local_time_cfm_test.py @@ -7,6 +7,7 @@ class TestFrameGetLocalTimeConfirmation(unittest.TestCase): """Test class for FrameGetLocalTimeConfirmation.""" + # pylint: disable=too-many-public-methods,invalid-name def test_bytes(self): @@ -23,5 +24,5 @@ def test_str(self): """Test string representation of FrameGetLocalTimeConfirmation.""" frame = FrameGetLocalTimeConfirmation() - self.assertEqual(str(frame),'') From 56e511b450b5e86c4308953b13e18c2395996bdf Mon Sep 17 00:00:00 2001 From: Georg R <39526093+icommitdesnet@users.noreply.github.com> Date: Tue, 1 Dec 2020 09:05:39 +0100 Subject: [PATCH 40/58] Update frame_get_local_time_cfm_test.py Remove whitespace --- test/frame_get_local_time_cfm_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/frame_get_local_time_cfm_test.py b/test/frame_get_local_time_cfm_test.py index 255f5f92..b9bc4370 100644 --- a/test/frame_get_local_time_cfm_test.py +++ b/test/frame_get_local_time_cfm_test.py @@ -7,7 +7,7 @@ class TestFrameGetLocalTimeConfirmation(unittest.TestCase): """Test class for FrameGetLocalTimeConfirmation.""" - + # pylint: disable=too-many-public-methods,invalid-name def test_bytes(self): From 3a76377d8307d840bb40e9fd27b1829ea7d86fc8 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Tue, 1 Dec 2020 21:55:13 +0100 Subject: [PATCH 41/58] Add unittests --- pyvlx/api/frames/frame_get_network_setup.py | 8 +++-- pyvlx/pyvlx.py | 1 + test/frame_get_local_time_cfm_test.py | 2 +- test/frame_get_network_setup_cfm_test.py | 40 +++++++++++++++++++++ test/frame_get_network_setup_req_test.py | 26 ++++++++++++++ 5 files changed, 73 insertions(+), 4 deletions(-) create mode 100644 test/frame_get_network_setup_cfm_test.py create mode 100644 test/frame_get_network_setup_req_test.py diff --git a/pyvlx/api/frames/frame_get_network_setup.py b/pyvlx/api/frames/frame_get_network_setup.py index f2b56344..0f62fbae 100644 --- a/pyvlx/api/frames/frame_get_network_setup.py +++ b/pyvlx/api/frames/frame_get_network_setup.py @@ -35,7 +35,7 @@ def __init__(self, ipaddress=bytes(4), netmask=bytes(4), gateway=bytes(4), self._ipaddress = ipaddress self._netmask = netmask self._gateway = gateway - self.dhcp = DHCPParameter(dhcp) + self.dhcp = dhcp @property def ipaddress(self): @@ -54,8 +54,10 @@ def gateway(self): def get_payload(self): """Return Payload.""" - payload = bytes([self._ipaddress.value, self._netmask.value, - self._gateway.value, self.dhcp.value]) + payload = self._ipaddress + payload += self._netmask + payload += self._gateway + payload += bytes(self.dhcp.value) return payload def from_payload(self, payload): diff --git a/pyvlx/pyvlx.py b/pyvlx/pyvlx.py index 7c822b7a..54eeb671 100644 --- a/pyvlx/pyvlx.py +++ b/pyvlx/pyvlx.py @@ -53,6 +53,7 @@ async def connect(self): await self.klf200.get_state() await self.klf200.get_network_setup() await self.klf200.set_utc() + await self.klf200.get_network_setup() await house_status_monitor_enable(pyvlx=self) async def reboot_gateway(self): diff --git a/test/frame_get_local_time_cfm_test.py b/test/frame_get_local_time_cfm_test.py index 255f5f92..b9bc4370 100644 --- a/test/frame_get_local_time_cfm_test.py +++ b/test/frame_get_local_time_cfm_test.py @@ -7,7 +7,7 @@ class TestFrameGetLocalTimeConfirmation(unittest.TestCase): """Test class for FrameGetLocalTimeConfirmation.""" - + # pylint: disable=too-many-public-methods,invalid-name def test_bytes(self): diff --git a/test/frame_get_network_setup_cfm_test.py b/test/frame_get_network_setup_cfm_test.py new file mode 100644 index 00000000..795676dc --- /dev/null +++ b/test/frame_get_network_setup_cfm_test.py @@ -0,0 +1,40 @@ +"""Unit tests for FrameGetNetworkSetupConfirmation.""" +import unittest + +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameGetNetworkSetupConfirmation , DHCPParameter + + +class TestFrameGetNetworkSetupConfirmation(unittest.TestCase): + """Test class for FrameGetNetworkSetupConfirmation.""" + + # pylint: disable=too-many-public-methods,invalid-name + TESTFRAME = bytes.fromhex('001000e1c0a80de3ffffff00c0a80d0100ec') + + def test_bytes(self): + """Test FrameGetNetworkSetupConfirmation.""" + frame = FrameGetNetworkSetupConfirmation( + ipaddress=b'\xc0\xa8\r\xe3', netmask=b'\xff\xff\xff\x00', + gateway=b'\xc0\xa8\r\x01', dhcp=DHCPParameter.ENABLE) + self.assertEqual(bytes(frame), + b"\x00\x10\x00\xe1\xc0\xa8\r\xe3\xff\xff\xff\x00\xc0\xa8\r\x01\x00\xec") + + def test_frame_from_raw(self): + """Test parse FrameGetNetworkSetupConfirmation from raw.""" + frame = frame_from_raw(self.TESTFRAME) + self.assertTrue(isinstance(frame, FrameGetNetworkSetupConfirmation)) + self.assertEqual(frame.ipaddress, '192.168.13.227') + self.assertEqual(frame.netmask, '255.255.255.0') + self.assertEqual(frame.gateway, '192.168.13.1') + self.assertEqual(frame.dhcp, DHCPParameter.DISABLE) + + def test_str(self): + """Test string representation of FrameGetNetworkSetupConfirmation.""" + frame = FrameGetNetworkSetupConfirmation( + ipaddress=b'\xc0\xa8\r\xe3', netmask=b'\xff\xff\xff\x00', + gateway=b'\xc0\xa8\r\x01', dhcp=DHCPParameter.DISABLE) + self.assertEqual( + str(frame), + '', + ) diff --git a/test/frame_get_network_setup_req_test.py b/test/frame_get_network_setup_req_test.py new file mode 100644 index 00000000..c4df79f4 --- /dev/null +++ b/test/frame_get_network_setup_req_test.py @@ -0,0 +1,26 @@ +"""Unit tests for FrameGetNetworkSetupRequest.""" +import unittest + +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameGetNetworkSetupRequest + + +class TestFrameGetNetworkSetupRequest(unittest.TestCase): + """Test class for FrameGetNetworkSetupRequest.""" + + # pylint: disable=too-many-public-methods,invalid-name + + def test_bytes(self): + """Test FrameGetNetworkSetupRequest with NO_TYPE.""" + frame = FrameGetNetworkSetupRequest() + self.assertEqual(bytes(frame), b"\x00\x03\x00\xe0\xe3") + + def test_frame_from_raw(self): + """Test parse FrameGetNetworkSetupRequest from raw.""" + frame = frame_from_raw(b"\x00\x03\x00\xe0\xe3") + self.assertTrue(isinstance(frame, FrameGetNetworkSetupRequest)) + + def test_str(self): + """Test string representation of FrameGetNetworkSetupRequest.""" + frame = FrameGetNetworkSetupRequest() + self.assertEqual(str(frame), "") From cd3ab55f7e5b49dd8c643ab03c0fc9ba38a28f34 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Thu, 3 Dec 2020 19:11:23 +0100 Subject: [PATCH 42/58] Fix Frames, Add Test --- pyvlx/api/frames/frame_get_local_time.py | 42 +++------------------ pyvlx/api/frames/frame_get_network_setup.py | 12 +----- pyvlx/api/frames/frame_get_state.py | 29 +------------- pyvlx/api/frames/frame_leave_learn_state.py | 10 +---- pyvlx/api/get_local_time.py | 31 +-------------- pyvlx/api/get_network_setup.py | 26 +------------ pyvlx/api/get_protocol_version.py | 18 +-------- pyvlx/api/get_state.py | 32 +--------------- pyvlx/api/get_version.py | 23 +---------- pyvlx/api/leave_learn_state.py | 22 +---------- pyvlx/klf200gateway.py | 4 +- test/frame_get_local_time_cfm_test.py | 14 +++++-- 12 files changed, 29 insertions(+), 234 deletions(-) diff --git a/pyvlx/api/frames/frame_get_local_time.py b/pyvlx/api/frames/frame_get_local_time.py index 9f8e47cf..32f77529 100644 --- a/pyvlx/api/frames/frame_get_local_time.py +++ b/pyvlx/api/frames/frame_get_local_time.py @@ -1,6 +1,6 @@ """Module for get local time classes.""" -import struct from ...const import Command +from ...dataobjects import DtoLocalTime from .frame import FrameBase @@ -22,48 +22,16 @@ class FrameGetLocalTimeConfirmation(FrameBase): def __init__(self): """Init Frame.""" super().__init__(Command.GW_GET_LOCAL_TIME_CFM) - self.utctime = 0 - self.second = 0 - self.minute = 0 - self.hour = 0 - self.dayofmonth = 0 - self.month = 0 - self.year = 0 - self.weekday = 0 - self.dayofyear = 0 - self.daylightsavingflag = 0 + self.time = DtoLocalTime() def get_payload(self): """Return Payload.""" - payload = struct.pack(">I", self.utctime) - payload += self.second.to_bytes(1, byteorder="big") - payload += self.minute.to_bytes(1, byteorder="big") - payload += self.hour.to_bytes(1, byteorder="big") - payload += self.dayofmonth.to_bytes(1, byteorder="big") - payload += self.month.to_bytes(1, byteorder="big") - payload += self.year.to_bytes(2, byteorder="big") - payload += self.weekday.to_bytes(1, byteorder="big") - payload += self.dayofyear.to_bytes(2, byteorder="big") - payload += self.daylightsavingflag.to_bytes(1, byteorder="big") - return payload + return self.time.to_payload() def from_payload(self, payload): """Init frame from binary data.""" - self.utctime = struct.unpack(">I", payload[0:4])[0] - self.second = payload[4] - self.minute = payload[5] - self.hour = payload[6] - self.dayofmonth = payload[7] - self.month = payload[8] - self.year = int.from_bytes(payload[9:11], byteorder='big', signed=True) - self.weekday = payload[11] - self.dayofyear = int.from_bytes(payload[12:14], byteorder='big', signed=True) - self.daylightsavingflag = int.from_bytes(payload[14:15], byteorder='big', signed=True) + self.time.from_payload(payload) def __str__(self): """Return human readable string.""" - return ('<{} utctime="{}" second="{}" minute="{}" hour="{}" dayofmonth="{}" ' - 'month="{}" year="{}" weekday="{}" dayofyear="{}" daylightsavingflag="{}"/>'.format( - type(self).__name__, self.utctime, self.second, self.minute, self.hour, - self.dayofmonth, self.month, self.year, self.weekday, self.dayofyear, - self.daylightsavingflag)) + return '<{0}>{1}'.format(type(self).__name__, self.time) diff --git a/pyvlx/api/frames/frame_get_network_setup.py b/pyvlx/api/frames/frame_get_network_setup.py index 0f62fbae..4e980926 100644 --- a/pyvlx/api/frames/frame_get_network_setup.py +++ b/pyvlx/api/frames/frame_get_network_setup.py @@ -1,8 +1,5 @@ """Frames for receiving network setup from gateway.""" -from enum import Enum - -from ...const import Command - +from ...const import Command, DHCPParameter from .frame import FrameBase @@ -16,13 +13,6 @@ def __init__(self): super().__init__(Command.GW_GET_NETWORK_SETUP_REQ) -class DHCPParameter(Enum): - """Enum class for dncp network setup of gateway.""" - - DISABLE = 0x00 - ENABLE = 0x01 - - class FrameGetNetworkSetupConfirmation(FrameBase): """Frame for confirmation for get network setup requests.""" diff --git a/pyvlx/api/frames/frame_get_state.py b/pyvlx/api/frames/frame_get_state.py index a55f8f28..55d28c3d 100644 --- a/pyvlx/api/frames/frame_get_state.py +++ b/pyvlx/api/frames/frame_get_state.py @@ -1,8 +1,5 @@ """Frames for receiving state from gateway.""" -from enum import Enum - -from ...const import Command - +from ...const import Command, GatewayState, GatewaySubState from .frame import FrameBase @@ -16,30 +13,6 @@ def __init__(self): super().__init__(Command.GW_GET_STATE_REQ) -class GatewayState(Enum): - """Enum class for status if gateway.""" - - TEST_MODE = 0 - GATEWAY_MODE_NO_ACTUATOR = 1 - GATEWAY_MODE_WITH_ACTUATORS = 2 - BEACON_MODE_NOT_CONFIGURED = 3 - BEACON_MODE_CONFIGURED = 4 - - -class GatewaySubState(Enum): - """Enum class for substate if gateway.""" - - IDLE = 0x00 - PERFORMING_TASK_CONFIGURATION_SERVICE_HANDLER = 0x01 - PERFORMING_TASK_SCENE_CONFIGURATION = 0x02 - PERFORMING_TASK_INFORMATION_SERVICE_CONFIGURATION = 0x03 - PERFORMING_TASK_CONTACT_INPUT_CONFIGURATION = 0x04 - PERFORMING_TASK_COMMAND = 0x80 - PERFORMING_TASK_ACTIVATE_GROUP = 0x81 - PERFORMING_TASK_ACTIVATE_SCENE = 0x82 - RESERVED_132 = 0x84 # <-- hey @VELUX: Can you tell us what this value means? - - class FrameGetStateConfirmation(FrameBase): """Frame for confirmation for get state requests.""" diff --git a/pyvlx/api/frames/frame_leave_learn_state.py b/pyvlx/api/frames/frame_leave_learn_state.py index 7d6821fd..f925feda 100644 --- a/pyvlx/api/frames/frame_leave_learn_state.py +++ b/pyvlx/api/frames/frame_leave_learn_state.py @@ -1,16 +1,8 @@ """Module for leave learn state frame classes.""" -from enum import Enum -from ...const import Command +from ...const import Command, LeaveLearnStateConfirmationStatus from .frame import FrameBase -class LeaveLearnStateConfirmationStatus(Enum): - """Enum class for status of password enter confirmation.""" - - FAILED = 0 - SUCCESSFUL = 1 - - class FrameLeaveLearnStateRequest(FrameBase): """Frame for leaving learn state request.""" diff --git a/pyvlx/api/get_local_time.py b/pyvlx/api/get_local_time.py index 5430d621..2f042a14 100644 --- a/pyvlx/api/get_local_time.py +++ b/pyvlx/api/get_local_time.py @@ -1,24 +1,7 @@ """Module for local time firmware version from API.""" -from datetime import datetime -import time from .api_event import ApiEvent from .frames import FrameGetLocalTimeConfirmation, FrameGetLocalTimeRequest - - -class DtoLocalTime: - """Dataobject to hold KLF200 Data.""" - - def __init__(self, utctime=None, localtime=None): - """Initialize DtoLocalTime class.""" - self.utctime = utctime - self.localtime = localtime - - def __str__(self): - """Return human readable string.""" - return ( - '<{} utctime="{}" localtime="{}"/>'.format( - type(self).__name__, self.utctime, self.localtime) - ) +from ..dataobjects import DtoLocalTime class GetLocalTime(ApiEvent): @@ -29,22 +12,12 @@ def __init__(self, pyvlx): super().__init__(pyvlx=pyvlx) self.success = False self.localtime = DtoLocalTime() - self.time = DtoLocalTime() async def handle_frame(self, frame): """Handle incoming API frame, return True if this was the expected frame.""" if not isinstance(frame, FrameGetLocalTimeConfirmation): return False - if frame.weekday == 0: - weekday = 6 - else: - weekday = frame.weekday - 1 - self.time = DtoLocalTime( - datetime.fromtimestamp(frame.utctime), - datetime.fromtimestamp(time.mktime( - (frame.year + 1900, frame.month, frame.dayofmonth, - frame.hour, frame.minute, frame.second, - weekday, frame.dayofyear, frame.daylightsavingflag)))) + self.localtime = frame.localtime self.success = True return True diff --git a/pyvlx/api/get_network_setup.py b/pyvlx/api/get_network_setup.py index 6cfbf693..bccf0b84 100644 --- a/pyvlx/api/get_network_setup.py +++ b/pyvlx/api/get_network_setup.py @@ -1,29 +1,7 @@ """Module for retrieving gateway state from API.""" from .api_event import ApiEvent -from .frames import FrameGetNetworkSetupConfirmation, FrameGetNetworkSetupRequest, DHCPParameter - - -class DtoNetworkSetup: - """Dataobject to hold KLF200 Data.""" - - def __init__(self, ipaddress=None, gateway=None, netmask=None, dhcp=None): - """Initialize DtoNetworkSetup class.""" - self.ipaddress = ipaddress - self.gateway = gateway - self.netmask = netmask - self.dhcp = dhcp - - @property - def dhcp_name(self): - """Return dhcp as human readable string.""" - return DHCPParameter(self.dhcp).name - - def __str__(self): - """Return human readable string.""" - return '<{} ipaddress="{}" gateway="{}" gateway="{}" dhcp="{}" dhcp_name="{}"/>'.format( - type(self).__name__, self.ipaddress, self.gateway, - self.gateway, self.dhcp, self.dhcp_name - ) +from .frames import FrameGetNetworkSetupConfirmation, FrameGetNetworkSetupRequest +from ..dataobjects import DtoNetworkSetup class GetNetworkSetup(ApiEvent): diff --git a/pyvlx/api/get_protocol_version.py b/pyvlx/api/get_protocol_version.py index 5b7a38f0..a63b5d44 100644 --- a/pyvlx/api/get_protocol_version.py +++ b/pyvlx/api/get_protocol_version.py @@ -2,23 +2,7 @@ from .api_event import ApiEvent from .frames import ( FrameGetProtocolVersionConfirmation, FrameGetProtocolVersionRequest) - - -class DtoProtocolVersion: - """KLF 200 Dataobject.""" - - def __init__(self, majorversion=None, minorversion=None): - """Initialize DtoProtocolVersion class.""" - self.majorversion = majorversion - self.minorversion = minorversion - - def __str__(self): - """Return human readable string.""" - return ( - '<{} majorversion="{}" minorversion="{}"/>'.format( - type(self).__name__, self.majorversion, self.minorversion - ) - ) +from ..dataobjects import DtoProtocolVersion class GetProtocolVersion(ApiEvent): diff --git a/pyvlx/api/get_state.py b/pyvlx/api/get_state.py index 3984969b..9c3e729c 100644 --- a/pyvlx/api/get_state.py +++ b/pyvlx/api/get_state.py @@ -1,35 +1,7 @@ """Module for retrieving gateway state from API.""" from .api_event import ApiEvent -from .frames import FrameGetStateConfirmation, FrameGetStateRequest, GatewayState, GatewaySubState - - -class DtoState: - """Data Object for Gateway State.""" - - def __init__(self, gateway_state=None, gateway_sub_state=None): - """Initialize DtoState class.""" - self.gateway_state = gateway_state - self.gateway_sub_state = gateway_sub_state - - @property - def gateway_state_name(self): - """Return gateway_state as human readable string.""" - return GatewayState(self.gateway_state).name - - @property - def gateway_sub_state_name(self): - """Return gateway_sub_state as human readable string.""" - return GatewaySubState(self.gateway_sub_state).name - - def __str__(self): - """Return human readable string.""" - return ( - '<{} gateway_state="{}" gateway_state_name="{}" gateway_sub_state="{}" ' - 'gateway_sub_state=_name"{}"/>'.format( - type(self).__name__, self.gateway_state, self.gateway_state_name, - self.gateway_sub_state, self.gateway_sub_state_name - ) - ) +from .frames import FrameGetStateConfirmation, FrameGetStateRequest +from ..dataobjects import DtoState class GetState(ApiEvent): diff --git a/pyvlx/api/get_version.py b/pyvlx/api/get_version.py index ab51172c..30c7d07c 100644 --- a/pyvlx/api/get_version.py +++ b/pyvlx/api/get_version.py @@ -1,28 +1,7 @@ """Module for retrieving firmware version from API.""" from .api_event import ApiEvent from .frames import FrameGetVersionConfirmation, FrameGetVersionRequest - - -class DtoVersion: - """Object for KLF200 Data.""" - - def __init__(self, - softwareversion=None, hardwareversion=None, productgroup=None, producttype=None): - """Initialize DtoVersion class.""" - self.softwareversion = softwareversion - self.hardwareversion = hardwareversion - self.productgroup = productgroup - self.producttype = producttype - - def __str__(self): - """Return human readable string.""" - return ( - '<{} softwareversion="{}" hardwareversion="{}" ' - 'productgroup="{}" producttype="{}"/>'.format( - type(self).__name__, - self.softwareversion, self.hardwareversion, self.productgroup, self.producttype - ) - ) +from ..dataobjects import DtoVersion class GetVersion(ApiEvent): diff --git a/pyvlx/api/leave_learn_state.py b/pyvlx/api/leave_learn_state.py index 740da857..446b62bf 100644 --- a/pyvlx/api/leave_learn_state.py +++ b/pyvlx/api/leave_learn_state.py @@ -3,27 +3,7 @@ from .api_event import ApiEvent from .frames import (FrameLeaveLearnStateRequest, FrameLeaveLearnStateConfirmation, LeaveLearnStateConfirmationStatus) - - -class DtoLeaveLearnState: - """Dataobject to hold KLF200 Data.""" - - def __init__(self, status=None): - """Initialize DtoLeaveLearnState class.""" - self.status = status - - @property - def status_name(self): - """Return status as human readable string.""" - return LeaveLearnStateConfirmationStatus(self.status_name).name - - def __str__(self): - """Return human readable string.""" - return ( - '<{} status="{}" status_name="{}"/>'.format( - type(self).__name__, self.status, self.status_name - ) - ) +from ..dataobjects import DtoLeaveLearnState class LeaveLearnState(ApiEvent): diff --git a/pyvlx/klf200gateway.py b/pyvlx/klf200gateway.py index be395ee3..9ab567ce 100644 --- a/pyvlx/klf200gateway.py +++ b/pyvlx/klf200gateway.py @@ -18,7 +18,7 @@ def __init__(self, pyvlx): self.state = None self.network_setup = None self.password = None - self.localtime = None + self.time = None self.protocol_version = None self.version = None self.device_updated_cbs = [] @@ -117,7 +117,7 @@ async def get_local_time(self): await getlocaltime.do_api_call() if not getlocaltime.success: PYVLXLOG.warning("Unable to get local time.") - self.localtime = getlocaltime.localtime + self.time = getlocaltime.localtime return getlocaltime.success async def password_enter(self, password): diff --git a/test/frame_get_local_time_cfm_test.py b/test/frame_get_local_time_cfm_test.py index b9bc4370..167f28af 100644 --- a/test/frame_get_local_time_cfm_test.py +++ b/test/frame_get_local_time_cfm_test.py @@ -1,5 +1,6 @@ """Unit tests for FrameGetLocalTimeConfirmation.""" import unittest +from datetime import datetime from pyvlx.api.frame_creation import frame_from_raw from pyvlx.api.frames import FrameGetLocalTimeConfirmation @@ -13,7 +14,9 @@ class TestFrameGetLocalTimeConfirmation(unittest.TestCase): def test_bytes(self): """Test FrameGetLocalTimeConfirmation.""" frame = FrameGetLocalTimeConfirmation() - self.assertEqual(bytes(frame), b"\x00\x12 \x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x007") + frame.time.localtime = datetime.strptime("2020-12-03 18:19:19.176900", "%Y-%m-%d %H:%M:%S.%f") + frame.time.utctime = datetime.strptime("2020-12-03 18:19:19.176900", "%Y-%m-%d %H:%M:%S.%f") + self.assertEqual(bytes(frame), b"\x00\x12 \x05_\xc9\x1e\x17\x13\x13\x12\x03\x0c\x00x\x04\x01R\xffe") def test_frame_from_raw(self): """Test parse FrameGetLocalTimeConfirmation from raw.""" @@ -23,6 +26,9 @@ def test_frame_from_raw(self): def test_str(self): """Test string representation of FrameGetLocalTimeConfirmation.""" frame = FrameGetLocalTimeConfirmation() - - self.assertEqual(str(frame), '') + frame.time.localtime = datetime.strptime("2020-12-03 18:19:19.176900", "%Y-%m-%d %H:%M:%S.%f") + frame.time.utctime = datetime.strptime("2020-12-03 18:19:19.176900", "%Y-%m-%d %H:%M:%S.%f") + self.assertEqual(str(frame), '' + '') From 2d9c616db43e678d3ebfe85e54f2b03282106113 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Thu, 3 Dec 2020 19:11:41 +0100 Subject: [PATCH 43/58] Add Enum Types --- pyvlx/const.py | 315 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 305 insertions(+), 10 deletions(-) diff --git a/pyvlx/const.py b/pyvlx/const.py index a71e4c98..77dcb3a4 100644 --- a/pyvlx/const.py +++ b/pyvlx/const.py @@ -225,16 +225,18 @@ class Command(Enum): class Originator(Enum): """Enum class for originator.""" - USER = 1 - RAIN = 2 - TIMER = 3 - UPS = 5 # UPC unit - SAAC = 8 # Stand Alone Automatic Controls - WIND = 9 - LOAD_SHEDDING = 11 - LOCAL_LIGHT = 12 - UNSPECIFIC_ENVIRONMENT_SENSOR = 13 - EMERGENCY = 255 + # pylint: disable=line-too-long + + USER = 1 # User Remote control causing action on actuator + RAIN = 2 # Rain sensor + TIMER = 3 # Timer controlled + UPS = 5 # UPC unit + SAAC = 8 # Stand Alone Automatic Controls + WIND = 9 # Wind sensor + LOAD_SHEDDING = 11 # Managers for requiring a particular electric load shed + LOCAL_LIGHT = 12 # Local light sensor + UNSPECIFIC_ENVIRONMENT_SENSOR = 13 # Used in context with commands transmitted on basis of an unknown sensor for protection of an end-product or house + EMERGENCY = 255 # Used in context with emergency or security commands class Priority(Enum): @@ -250,6 +252,14 @@ class Priority(Enum): COMFORT_LEVEL_4 = 7 +class LockPriorityLevel(Enum): + """Enum Class for Lock Priority Level.""" + + NO = 0 # Do not lock any priority level. + MIN30 = 1 # Lock one or more priority level in 30 minutes. + FOREVER = 2 # Lock one or more priority level forever + + class Velocity(Enum): """Enum class for velocity.""" @@ -263,6 +273,7 @@ class NodeTypeWithSubtype(Enum): """Enum class for node type plus sub type combined values.""" # pylint: disable=invalid-name + NO_TYPE = 0 INTERIOR_VENETIAN_BLIND = 0x0040 ROLLER_SHUTTER = 0x0080 @@ -334,3 +345,287 @@ class NodeVariation(Enum): KIP = 2 FLAT_ROOT = 3 SKY_LIGHT = 3 + + +class DHCPParameter(Enum): + """Enum class for dncp network setup of gateway.""" + + DISABLE = 0x00 + ENABLE = 0x01 + + +class GatewayState(Enum): + """Enum class for state of gateway.""" + + TEST_MODE = 0 + GATEWAY_MODE_NO_ACTUATOR = 1 + GATEWAY_MODE_WITH_ACTUATORS = 2 + BEACON_MODE_NOT_CONFIGURED = 3 + BEACON_MODE_CONFIGURED = 4 + + +class GatewaySubState(Enum): + """Enum class for substate of gateway.""" + + IDLE = 0x00 + PERFORMING_TASK_CONFIGURATION_SERVICE_HANDLER = 0x01 + PERFORMING_TASK_SCENE_CONFIGURATION = 0x02 + PERFORMING_TASK_INFORMATION_SERVICE_CONFIGURATION = 0x03 + PERFORMING_TASK_CONTACT_INPUT_CONFIGURATION = 0x04 + PERFORMING_TASK_COMMAND = 0x80 + PERFORMING_TASK_ACTIVATE_GROUP = 0x81 + PERFORMING_TASK_ACTIVATE_SCENE = 0x82 + RESERVED_132 = 0x84 # <-- hey @VELUX: Can you tell us what this value means? + + +class LeaveLearnStateConfirmationStatus(Enum): + """Enum class for status leaving Learn state.""" + + FAILED = 0 + SUCCESSFUL = 1 + + +class ErrorNumber(Enum): + """Enum class for Errornumber in GW_ERROR_NTF.""" + + UNDEFINED = 0 # Not further defined error. + WRONG_COMMAND = 1 # Unknown Command or command is not accepted at this state. + FRAME_ERROR = 2 # ERROR on Frame Structure. + BUSY = 7 # Busy. Try again later. + BAD_SYSTABLE_INDEX = 8 # Bad system table index. + NO_AUTH = 12 # Not authenticated. + + +class ControllerCopyMode(Enum): + """Enum class for Copy Controller Mode.""" + + # pylint: disable=line-too-long + + TCM = 0 # Transmitting Configuration Mode (TCM): The gateway gets key and system table from another controller. + RCM = 1 # Receiving Configuration Mode (RCM): The gateway gives key and system table to another controller. + + +class ControllerCopyStatus(Enum): + """Enum class for Copy Controller Mode.""" + + OK = 0 # OK. Data transfer to or from client controller. + FAILED_TRANSFER = 1 # Failed. Data transfer to or from client controller interrupted. + CANCELLED = 4 # Ok. Receiving configuration mode is cancelled in the client controller. + FAILED_TIMEOUT = 5 # Failed. Timeout. + FAILED_NOTREADY = 11 # Failed. Configuration service not ready. + + +class ChangeKeyStatus(Enum): + """Enum class for Key Change Status.""" + + # pylint: disable=line-too-long + + OK_CONTROLLER = 0 # Ok. Key Change in client controller. + OK_ALL = 2 # Ok. Key change in system table all nodes updated with current key. + OK_PARTIALLY = 3 # Ok. Key Change in System table. Not all nodes in system table was updated with current key. Check bit array. + OK_RECEIVED = 5 # Ok. Client controller received a key. + FAILED_NOTDISABLED = 7 # Failed. Local Stimuli not disabled in all Client System table nodes. See bit array. + FAILED_NOCONTROLLER = 9 # Failed. Not able to find a controller to get key from. + FAILED_DTSNOTREADY = 10 # Failed. DTS not ready. + FAILED_DTSERROR = 11 # Failed. DTS error. At DTS error no key change will take place. + FAILED_CSNOTREADY = 16 # Failed. CS not ready. + + +class PgcJobState(Enum): + """Enum class for Product Generic Configuration Job State.""" + + STARTED = 0 # PGC job started + ENDED = 1 # PGC job ended. Either OK or with error. + CS_BUSY = 2 # CS busy with other services + + +class PgcJobStatus(Enum): + """Enum class for Product Generic Configuration Job Status.""" + + OK = 0 # OK - PGC and CS job completed + OK_PARTIALLY = 1 # Partly success. + FAILED_PGCCS = 2 # Failed - Error in PGC/CS job. + FAILED = 3 # Failed - Too long key press or cancel of CS service. + + +class PgcJobType(Enum): + """Enum class for Product Generic Configuration Job Type.""" + + # pylint: disable=line-too-long + + RECEIVE_ONLY = 0 # Receive system copy or only get key. Short PGC button press. + RECEIVE_DISTRIBUTE = 1 # Receive key and distribute. Short PGC button press. + TRANSMIT = 2 # Transmit key (and system). Long PGC button press. + GENERATE = 3 # Generate new key and distribute or only generate new key. Very long PGC button press. + + +class DiscoverStatus(Enum): + """Enum class for Discovery status.""" + + # pylint: disable=line-too-long + + OK = 0 # OK. Discovered nodes. See bit array. + FAILED_CSNOTREADY = 5 # Failed. CS not ready. + OK_PARTIALLY = 6 # OK. Same as DISCOVER_NODES_PERFORMED but some nodes were not added to system table (e.g. System table has reached its limit). + FAILED_CSBUSY = 7 # CS busy with another task. + + +class PowerMode(Enum): + """Enum class for Acutuator power Mode.""" + + ALWAYS_ALIVE = 0 # ALWAYS_ALIVE + LOW_POWER_MODE = 1 # LOW_POWER_MODE + + +class ChangeType(Enum): + """Enum class Change Type in Group or Scene NTF.""" + + DELETED = 0 # Scene or Group deleted + MODIFIED = 1 # Information modified + + +class ContactInputAssignement(Enum): + """Enum class for Contact Input.""" + + NOT_ASSINGED = 0 # Input not assigned. + SCENE = 1 # Scene + PRODUCT_GROUP = 2 # Product group + BY_MODE = 3 # One node controlled by mode + + +class OutputID(Enum): + """Enum class for Error and Success Output ID.""" + + DONT_SEND = 0 # Don’t send any pulse. + PULSE_PORT_1 = 1 # Send pulse to output port number 1 + PULSE_PORT_2 = 2 # Send pulse to output port number 2 + PULSE_PORT_3 = 3 # Send pulse to output port number 3 + PULSE_PORT_4 = 4 # Send pulse to output port number 4 + PULSE_PORT_5 = 5 # Send pulse to output port number 5 + + +class GroupType(Enum): + """Enum class for Group Types.""" + + USER_GROUP = 0 # The group type is a user group. + ROOM = 1 # The group type is a Room. + HOUSE = 2 # The group type is a House. + ALL_GROUP = 3 # The group type is an All-group. + + +class LimitationTimer(Enum): + """Enum class for Limitation Timer.""" + + BY_SECONDS = 1 # 1=30 seconds 2=60 seconds 252=7590 seconds + UNLIMITED = 253 # unlimited + CLEAR_MASTER = 254 # clear entry for the Master + CLEAR_ALL = 255 # clear all + + +class LimitationType(Enum): + """Enum class for Limitation Types.""" + + MIN_LIMITATION = 0 # Resulting minimum limitation. + MAX_LIMITATION = 1 # Resulting maximum limitation. + + +class LockTime(Enum): + """Enum class for Lock Time.""" + + BY_SECONDS = 1 # 1=30 seconds, 2=60 seconds .. 254=7650 seconds + UNLIMITED = 255 # Unlimited time + + +class WinkTime(Enum): + """Enum class for Wink Time.""" + + STOP = 0 # Stop wink. + BY_SECONDS = 1 # 1=Wink in 1 sec., 2= Wink in 2 sec. 253=Wink in 253 sec. + BY_MANUFACTUERER = 254 # Manufacturer specific wink time. + FOREVER = 255 # Wink forever. + + +class NodeParameter(Enum): + """Enum Class for Node Parameter.""" + + MP = 0x00 # Main Parameter. + FP1 = 0x01 # Functional Parameter number 1. + FP2 = 0x02 # Functional Parameter number 2. + FP3 = 0x03 # Functional Parameter number 3. + FP4 = 0x04 # Functional Parameter number 4. + FP5 = 0x05 # Functional Parameter number 5. + FP6 = 0x06 # Functional Parameter number 6. + FP7 = 0x07 # Functional Parameter number 7. + FP8 = 0x08 # Functional Parameter number 8. + FP9 = 0x09 # Functional Parameter number 9. + FP10 = 0x0A # Functional Parameter number 10. + FP11 = 0x0B # Functional Parameter number 11. + FP12 = 0x0C # Functional Parameter number 12. + FP13 = 0x0D # Functional Parameter number 13. + FP14 = 0x0E # Functional Parameter number 14. + FP15 = 0x0F # Functional Parameter number 15. + FP16 = 0x10 # Functional Parameter number 16. + NOT_USED = 0xFF # Value to indicate Functional Parameter not used. + + +class OperatingState(Enum): + """Enum Class for operating state of the node.""" + + NON_EXECUTING = 0 + ERROR_EXECUTING = 1 + NOT_USED = 2 + WAIT_FOR_POWER = 3 + EXECUTING = 4 + DONE = 5 + UNKNOWN = 255 + + +class StatusReply(Enum): + """Enum Class for Node Status Reply.""" + + # pylint: disable=line-too-long + + UNKNOWN_STATUS_REPLY = 0x00 # Used to indicate unknown reply. + COMMAND_COMPLETED_OK = 0x01 # Indicates no errors detected. + NO_CONTACT = 0x02 # Indicates no communication to node. + MANUALLY_OPERATED = 0x03 # Indicates manually operated by a user. + BLOCKED = 0x04 # Indicates node has been blocked by an object. + WRONG_SYSTEMKEY = 0x05 # Indicates the node contains a wrong system key. + PRIORITY_LEVEL_LOCKED = 0x06 # Indicates the node is locked on this priority level. + REACHED_WRONG_POSITION = 0x07 # Indicates node has stopped in another position than expected. + ERROR_DURING_EXECUTION = 0x08 # Indicates an error has occurred during execution of command. + NO_EXECUTION = 0x09 # Indicates no movement of the node parameter. + CALIBRATING = 0x0A # Indicates the node is calibrating the parameters. + POWER_CONSUMPTION_TOO_HIGH = 0x0B # Indicates the node power consumption is too high. + POWER_CONSUMPTION_TOO_LOW = 0x0C # Indicates the node power consumption is too low. + LOCK_POSITION_OPEN = 0x0D # Indicates door lock errors. (Door open during lock command) + MOTION_TIME_TOO_LONG__COMMUNICATION_ENDED = 0x0E # Indicates the target was not reached in time. + THERMAL_PROTECTION = 0x0F # Indicates the node has gone into thermal protection mode. + PRODUCT_NOT_OPERATIONAL = 0x10 # Indicates the node is not currently operational. + FILTER_MAINTENANCE_NEEDED = 0x11 # Indicates the filter needs maintenance. + BATTERY_LEVEL = 0x12 # Indicates the battery level is low. + TARGET_MODIFIED = 0x13 # Indicates the node has modified the target value of the command. + MODE_NOT_IMPLEMENTED = 0x14 # Indicates this node does not support the mode received. + COMMAND_INCOMPATIBLE_TO_MOVEMENT = 0x15 # Indicates the node is unable to move in the right direction. + USER_ACTION = 0x16 # Indicates dead bolt is manually locked during unlock command. + DEAD_BOLT_ERROR = 0x17 # Indicates dead bolt error. + AUTOMATIC_CYCLE_ENGAGED = 0x18 # Indicates the node has gone into automatic cycle mode. + WRONG_LOAD_CONNECTED = 0x19 # Indicates wrong load on node. + COLOUR_NOT_REACHABLE = 0x1A # Indicates that node is unable to reach received colour code. + TARGET_NOT_REACHABLE = 0x1B # Indicates the node is unable to reach received target position. + BAD_INDEX_RECEIVED = 0x1C # Indicates io-protocol has received an invalid index. + COMMAND_OVERRULED = 0x1D # Indicates that the command was overruled by a new command. + NODE_WAITING_FOR_POWER = 0x1E # Indicates that the node reported waiting for power. + INFORMATION_CODE = 0xDF # Indicates an unknown error code received. (Hex code is shown on display) + PARAMETER_LIMITED = 0xE0 # Indicates the parameter was limited by an unknown device. (Same as LIMITATION_BY_UNKNOWN_DEVICE) + LIMITATION_BY_LOCAL_USER = 0xE1 # Indicates the parameter was limited by local button. + LIMITATION_BY_USER = 0xE2 # Indicates the parameter was limited by a remote control. + LIMITATION_BY_RAIN = 0xE3 # Indicates the parameter was limited by a rain sensor. + LIMITATION_BY_TIMER = 0xE4 # Indicates the parameter was limited by a timer. + LIMITATION_BY_UPS = 0xE6 # Indicates the parameter was limited by a power supply. + LIMITATION_BY_UNKNOWN_DEVICE = 0xE7 # Indicates the parameter was limited by an unknown device. (Same as PARAMETER_LIMITED) + LIMITATION_BY_SAAC = 0xEA # Indicates the parameter was limited by a standalone automatic controller. + LIMITATION_BY_WIND = 0xEB # Indicates the parameter was limited by a wind sensor. + LIMITATION_BY_MYSELF = 0xEC # Indicates the parameter was limited by the node itself. + LIMITATION_BY_AUTOMATIC_CYCLE = 0xED # Indicates the parameter was limited by an automatic cycle. + LIMITATION_BY_EMERGENCY = 0xEE # Indicates the parameter was limited by an emergency. From 2330fa145fc803929362108517698032b5fde17b Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Thu, 3 Dec 2020 22:16:59 +0100 Subject: [PATCH 44/58] Add Dataobjects --- pyvlx/dataobjects.py | 173 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 pyvlx/dataobjects.py diff --git a/pyvlx/dataobjects.py b/pyvlx/dataobjects.py new file mode 100644 index 00000000..96ec13d8 --- /dev/null +++ b/pyvlx/dataobjects.py @@ -0,0 +1,173 @@ +"""Module for Dataobjects.""" +from datetime import datetime +import time +from .const import (DHCPParameter, GatewayState, + GatewaySubState, LeaveLearnStateConfirmationStatus) + + +class DtoLocalTime: + """Dataobject to hold KLF200 Time Data.""" + + def __init__(self, utctime=None, localtime=None): + """Initialize DtoLocalTime class.""" + if utctime is None: + utctime = datetime.fromtimestamp(0) + if localtime is None: + localtime = datetime.fromtimestamp(0) + self.utctime = utctime + self.localtime = localtime + + def __str__(self): + """Return human readable string.""" + return ( + '<{} utctime="{}" localtime="{}"/>'.format( + type(self).__name__, self.utctime, self.localtime) + ) + + def from_payload(self, payload): + """Build the Dto From Data.""" + self.utctime = datetime.fromtimestamp(int.from_bytes(payload[0:4], "big")) + weekday = payload[11] - 1 + if weekday == -1: + weekday = 6 + + self.localtime = datetime.fromtimestamp(time.mktime( + (int.from_bytes(payload[9:11], byteorder='big') + 1900, # Year + payload[8], # month + payload[7], # day + payload[6], # hour + payload[5], # minute + payload[4], # second + weekday, + int.from_bytes(payload[12:14], byteorder='big'), # day of year + int.from_bytes(payload[14:15], byteorder='big', signed=True)))) + + def to_payload(self): + """Build the Dto From Data.""" + payload = b'' + payload = int(self.utctime.timestamp()).to_bytes(4, byteorder='big') + payload += self.localtime.second.to_bytes(1, "big") + payload += self.localtime.minute.to_bytes(1, "big") + payload += self.localtime.hour.to_bytes(1, "big") + payload += self.localtime.day.to_bytes(1, "big") + payload += self.localtime.month.to_bytes(1, "big") + payload += (self.localtime.year - 1900).to_bytes(2, "big") + if self.localtime.weekday == 6: + payload += (0).to_bytes(1, "big") + else: + payload += (self.localtime.weekday() + 1).to_bytes(1, "big") + payload += self.localtime.timetuple().tm_yday.to_bytes(2, "big") + payload += (self.localtime.timetuple().tm_isdst).to_bytes(1, "big", signed=True) + return payload + + +class DtoNetworkSetup: + """Dataobject to hold KLF200 Network Setup.""" + + def __init__(self, ipaddress=None, gateway=None, netmask=None, dhcp=None): + """Initialize DtoNetworkSetup class.""" + self.ipaddress = ipaddress + self.gateway = gateway + self.netmask = netmask + self.dhcp = dhcp + + @property + def dhcp_name(self): + """Return dhcp as human readable string.""" + return DHCPParameter(self.dhcp).name + + def __str__(self): + """Return human readable string.""" + return '<{} ipaddress="{}" gateway="{}" gateway="{}" dhcp="{}" dhcp_name="{}"/>'.format( + type(self).__name__, self.ipaddress, self.gateway, + self.gateway, self.dhcp, self.dhcp_name + ) + + +class DtoProtocolVersion: + """KLF 200 Dataobject for Protocol version.""" + + def __init__(self, majorversion=None, minorversion=None): + """Initialize DtoProtocolVersion class.""" + self.majorversion = majorversion + self.minorversion = minorversion + + def __str__(self): + """Return human readable string.""" + return ( + '<{} majorversion="{}" minorversion="{}"/>'.format( + type(self).__name__, self.majorversion, self.minorversion + ) + ) + + +class DtoState: + """Data Object for Gateway State.""" + + def __init__(self, gateway_state=None, gateway_sub_state=None): + """Initialize DtoState class.""" + self.gateway_state = gateway_state + self.gateway_sub_state = gateway_sub_state + + @property + def gateway_state_name(self): + """Return gateway_state as human readable string.""" + return GatewayState(self.gateway_state).name + + @property + def gateway_sub_state_name(self): + """Return gateway_sub_state as human readable string.""" + return GatewaySubState(self.gateway_sub_state).name + + def __str__(self): + """Return human readable string.""" + return ( + '<{} gateway_state="{}" gateway_state_name="{}" gateway_sub_state="{}" ' + 'gateway_sub_state=_name"{}"/>'.format( + type(self).__name__, self.gateway_state, self.gateway_state_name, + self.gateway_sub_state, self.gateway_sub_state_name + ) + ) + + +class DtoVersion: + """Object for KLF200 Version Information.""" + + def __init__(self, + softwareversion=None, hardwareversion=None, productgroup=None, producttype=None): + """Initialize DtoVersion class.""" + self.softwareversion = softwareversion + self.hardwareversion = hardwareversion + self.productgroup = productgroup + self.producttype = producttype + + def __str__(self): + """Return human readable string.""" + return ( + '<{} softwareversion="{}" hardwareversion="{}" ' + 'productgroup="{}" producttype="{}"/>'.format( + type(self).__name__, + self.softwareversion, self.hardwareversion, self.productgroup, self.producttype + ) + ) + + +class DtoLeaveLearnState: + """Dataobject to hold KLF200 Data.""" + + def __init__(self, status=None): + """Initialize DtoLeaveLearnState class.""" + self.status = status + + @property + def status_name(self): + """Return status as human readable string.""" + return LeaveLearnStateConfirmationStatus(self.status_name).name + + def __str__(self): + """Return human readable string.""" + return ( + '<{} status="{}" status_name="{}"/>'.format( + type(self).__name__, self.status, self.status_name + ) + ) From af329b3efd4043d1af98b6c49b076581ee22d415 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Thu, 3 Dec 2020 22:31:11 +0100 Subject: [PATCH 45/58] Add Tests --- test/frame_get_network_setup_cfm_test.py | 2 +- test/frame_leave_learn_state_cfm_test.py | 28 ++++++++++++++++++++++++ test/frame_leave_learn_state_req_test.py | 28 ++++++++++++++++++++++++ test/frame_password_change_req_test.py | 2 ++ 4 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 test/frame_leave_learn_state_cfm_test.py create mode 100644 test/frame_leave_learn_state_req_test.py diff --git a/test/frame_get_network_setup_cfm_test.py b/test/frame_get_network_setup_cfm_test.py index 795676dc..64f5375d 100644 --- a/test/frame_get_network_setup_cfm_test.py +++ b/test/frame_get_network_setup_cfm_test.py @@ -2,7 +2,7 @@ import unittest from pyvlx.api.frame_creation import frame_from_raw -from pyvlx.api.frames import FrameGetNetworkSetupConfirmation , DHCPParameter +from pyvlx.api.frames import FrameGetNetworkSetupConfirmation, DHCPParameter class TestFrameGetNetworkSetupConfirmation(unittest.TestCase): diff --git a/test/frame_leave_learn_state_cfm_test.py b/test/frame_leave_learn_state_cfm_test.py new file mode 100644 index 00000000..61d89fc7 --- /dev/null +++ b/test/frame_leave_learn_state_cfm_test.py @@ -0,0 +1,28 @@ +"""Unit tests for FrameLeaveLearnStateConfirmation.""" +import unittest + +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameLeaveLearnStateConfirmation + + +class TestFrameLeaveLearnStateConfirmation(unittest.TestCase): + """Test class FrameLeaveLearnStateConfirmation.""" + + # pylint: disable=too-many-public-methods,invalid-name + + EXAMPLE_FRAME = b"\x00\x04\x00\x0f\x00\x0b" + + def test_bytes(self): + """Test FrameLeaveLearnStateConfirmation.""" + frame = FrameLeaveLearnStateConfirmation() + self.assertEqual(bytes(frame), self.EXAMPLE_FRAME) + + def test_frame_from_raw(self): + """Test parse FrameLeaveLearnStateConfirmation from raw.""" + frame = frame_from_raw(self.EXAMPLE_FRAME) + self.assertTrue(isinstance(frame, FrameLeaveLearnStateConfirmation)) + + def test_str(self): + """Test string representation of FrameLeaveLearnStateConfirmation.""" + frame = FrameLeaveLearnStateConfirmation() + self.assertEqual(str(frame), '') diff --git a/test/frame_leave_learn_state_req_test.py b/test/frame_leave_learn_state_req_test.py new file mode 100644 index 00000000..38b785e2 --- /dev/null +++ b/test/frame_leave_learn_state_req_test.py @@ -0,0 +1,28 @@ +"""Unit tests for FrameLeaveLearnStateRequest.""" +import unittest + +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import FrameLeaveLearnStateRequest + + +class TestFrameLeaveLearnStateRequest(unittest.TestCase): + """Test class FrameLeaveLearnStateRequest.""" + + # pylint: disable=too-many-public-methods,invalid-name + + EXAMPLE_FRAME = b"\x00\x03\x00\x0e\r" + + def test_bytes(self): + """Test FrameLeaveLearnStateRequest with NO_TYPE.""" + frame = FrameLeaveLearnStateRequest() + self.assertEqual(bytes(frame), self.EXAMPLE_FRAME) + + def test_frame_from_raw(self): + """Test parse FrameLeaveLearnStateRequest from raw.""" + frame = frame_from_raw(self.EXAMPLE_FRAME) + self.assertTrue(isinstance(frame, FrameLeaveLearnStateRequest)) + + def test_str(self): + """Test string representation of FrameGetStateRequest.""" + frame = FrameLeaveLearnStateRequest() + self.assertEqual(str(frame), "") diff --git a/test/frame_password_change_req_test.py b/test/frame_password_change_req_test.py index bc1c7e57..59bc0579 100644 --- a/test/frame_password_change_req_test.py +++ b/test/frame_password_change_req_test.py @@ -63,6 +63,8 @@ def test_errors(self): """Test FramePasswordChangeRequest with wrong password.""" with self.assertRaises(PyVLXException): bytes(FramePasswordChangeRequest()) + with self.assertRaises(PyVLXException): + bytes(FramePasswordChangeRequest(currentpassword="fnord")) with self.assertRaises(PyVLXException): bytes(FramePasswordChangeRequest(currentpassword="fnord", newpassword="x" * 33)) with self.assertRaises(PyVLXException): From 310d651773426b75fe2b7ca880c52a4fcf283083 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Thu, 3 Dec 2020 22:52:34 +0100 Subject: [PATCH 46/58] Add Enums --- pyvlx/const.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/pyvlx/const.py b/pyvlx/const.py index 77dcb3a4..8d36ae5c 100644 --- a/pyvlx/const.py +++ b/pyvlx/const.py @@ -629,3 +629,26 @@ class StatusReply(Enum): LIMITATION_BY_MYSELF = 0xEC # Indicates the parameter was limited by the node itself. LIMITATION_BY_AUTOMATIC_CYCLE = 0xED # Indicates the parameter was limited by an automatic cycle. LIMITATION_BY_EMERGENCY = 0xEE # Indicates the parameter was limited by an emergency. + + +class StatusId(Enum): + """Enum Class for Status ID Reply.""" + + # pylint: disable=line-too-long + + STATUS_USER = 0x01 # The status is from a user activation. + STATUS_RAIN = 0x02 # The status is from a rain sensor activation. + STATUS_TIMER = 0x03 # The status is from a timer generated action. + STATUS_UPS = 0x05 # The status is from a UPS generated action. + STATUS_PROGRAM = 0x08 # The status is from an automatic program generated action. (SAAC) + STATUS_WIND = 0x09 # The status is from a Wind sensor generated action. + STATUS_MYSELF = 0x0A # The status is from an actuator generated action. + STATUS_AUTOMATIC_CYCLE = 0x0B # The status is from a automatic cycle generated action. + STATUS_EMERGENCY = 0x0C # The status is from an emergency or a security generated action. + STATUS_UNKNOWN = 0xFF # The status is from from an unknown command originator action. + +class RunStatus(Enum): + """Enum Class for Node Runstatus.""" + EXECUTION_COMPLETED = 0 # Execution is completed with no errors. + EXECUTION_FAILED = 1 # Execution has failed. (Get specifics in the following error code) + EXECUTION_ACTIVE = 2 # Execution is still active. From 1a41a0ee821d63500fe035ecb3ba1ebb51cb4df2 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Thu, 3 Dec 2020 22:54:01 +0100 Subject: [PATCH 47/58] Fix Const --- pyvlx/const.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pyvlx/const.py b/pyvlx/const.py index 8d36ae5c..08041c5a 100644 --- a/pyvlx/const.py +++ b/pyvlx/const.py @@ -647,8 +647,10 @@ class StatusId(Enum): STATUS_EMERGENCY = 0x0C # The status is from an emergency or a security generated action. STATUS_UNKNOWN = 0xFF # The status is from from an unknown command originator action. + class RunStatus(Enum): """Enum Class for Node Runstatus.""" + EXECUTION_COMPLETED = 0 # Execution is completed with no errors. EXECUTION_FAILED = 1 # Execution has failed. (Get specifics in the following error code) EXECUTION_ACTIVE = 2 # Execution is still active. From 21e1b7e6078e6be3ce805325b6208c67634af537 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Fri, 4 Dec 2020 08:40:04 +0100 Subject: [PATCH 48/58] Fix: add tzinfo for testcase --- test/frame_get_local_time_cfm_test.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/test/frame_get_local_time_cfm_test.py b/test/frame_get_local_time_cfm_test.py index 167f28af..afb023c6 100644 --- a/test/frame_get_local_time_cfm_test.py +++ b/test/frame_get_local_time_cfm_test.py @@ -1,6 +1,6 @@ """Unit tests for FrameGetLocalTimeConfirmation.""" import unittest -from datetime import datetime +from datetime import datetime, timezone from pyvlx.api.frame_creation import frame_from_raw from pyvlx.api.frames import FrameGetLocalTimeConfirmation @@ -14,13 +14,14 @@ class TestFrameGetLocalTimeConfirmation(unittest.TestCase): def test_bytes(self): """Test FrameGetLocalTimeConfirmation.""" frame = FrameGetLocalTimeConfirmation() - frame.time.localtime = datetime.strptime("2020-12-03 18:19:19.176900", "%Y-%m-%d %H:%M:%S.%f") - frame.time.utctime = datetime.strptime("2020-12-03 18:19:19.176900", "%Y-%m-%d %H:%M:%S.%f") - self.assertEqual(bytes(frame), b"\x00\x12 \x05_\xc9\x1e\x17\x13\x13\x12\x03\x0c\x00x\x04\x01R\xffe") - + frame.time.localtime = datetime(2020, 12, 3, 18, 19, 19, 176900) + frame.time.utctime = datetime(2020, 12, 3, 18, 19, 19, 176900, tzinfo=timezone.utc) + self.assertEqual(bytes(frame), b"\x00\x12 \x05_\xc9,'\x13\x13\x12\x03\x0c\x00x\x04\x01R\xffg") + + def test_frame_from_raw(self): """Test parse FrameGetLocalTimeConfirmation from raw.""" - frame = frame_from_raw(b"\x00\x12 \x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x007") + frame = frame_from_raw(b'\x00\x12 \x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x007') self.assertTrue(isinstance(frame, FrameGetLocalTimeConfirmation)) def test_str(self): From 0e827b51b0ad74601c5cfdb6abab69de348c404d Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Fri, 4 Dec 2020 08:42:14 +0100 Subject: [PATCH 49/58] fix linting --- test/frame_get_local_time_cfm_test.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/frame_get_local_time_cfm_test.py b/test/frame_get_local_time_cfm_test.py index afb023c6..17baee5c 100644 --- a/test/frame_get_local_time_cfm_test.py +++ b/test/frame_get_local_time_cfm_test.py @@ -17,8 +17,7 @@ def test_bytes(self): frame.time.localtime = datetime(2020, 12, 3, 18, 19, 19, 176900) frame.time.utctime = datetime(2020, 12, 3, 18, 19, 19, 176900, tzinfo=timezone.utc) self.assertEqual(bytes(frame), b"\x00\x12 \x05_\xc9,'\x13\x13\x12\x03\x0c\x00x\x04\x01R\xffg") - - + def test_frame_from_raw(self): """Test parse FrameGetLocalTimeConfirmation from raw.""" frame = frame_from_raw(b'\x00\x12 \x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x007') From d82760a2f6aaf97db3e7ceab99af9907cbb4634e Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Fri, 4 Dec 2020 13:35:08 +0100 Subject: [PATCH 50/58] Add Test fro PasswordChangeConfirmation --- test/frame_password_change_cfm_test.py | 38 ++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 test/frame_password_change_cfm_test.py diff --git a/test/frame_password_change_cfm_test.py b/test/frame_password_change_cfm_test.py new file mode 100644 index 00000000..53048605 --- /dev/null +++ b/test/frame_password_change_cfm_test.py @@ -0,0 +1,38 @@ +"""Unit tests for FramePasswordChangeConfirmation.""" +import unittest + +from pyvlx.api.frame_creation import frame_from_raw +from pyvlx.api.frames import ( + FramePasswordChangeConfirmation, PasswordChangeConfirmationStatus) + + +class TestFramePasswordChangeConfirmation(unittest.TestCase): + """Test class for FramePasswordChangeConfirmation.""" + + # pylint: disable=too-many-public-methods,invalid-name + + def test_bytes(self): + """Test FramePasswordChangeConfirmation.""" + frame = FramePasswordChangeConfirmation() + self.assertEqual(bytes(frame), b"\x00\x040\x03\x007") + + def test_bytes_error(self): + """Test failed FramePasswordChangeConfirmation.""" + frame = FramePasswordChangeConfirmation( + status=PasswordChangeConfirmationStatus.FAILED + ) + self.assertEqual(bytes(frame), b"\x00\x040\x03\x016") + + def test_frame_from_raw(self): + """Test parse FramePasswordChangeConfirmation from raw.""" + frame = frame_from_raw(b"\x00\x040\x03\x016") + self.assertTrue(isinstance(frame, FramePasswordChangeConfirmation)) + self.assertEqual(frame.status, PasswordChangeConfirmationStatus.FAILED) + + def test_str(self): + """Test string representation of FramePasswordChangeConfirmation.""" + frame = FramePasswordChangeConfirmation() + self.assertEqual( + str(frame), + '', + ) From 973ca15ec37cd1ce5d08a614b33bec8407e88ce6 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Fri, 4 Dec 2020 15:12:06 +0100 Subject: [PATCH 51/58] use Absolute Imports --- pyvlx/api/factory_default.py | 2 +- pyvlx/api/frame_creation.py | 4 ++-- pyvlx/api/frames/alias_array.py | 2 +- pyvlx/api/frames/frame.py | 2 +- pyvlx/api/frames/frame_activate_scene.py | 2 +- pyvlx/api/frames/frame_activation_log_updated.py | 2 +- pyvlx/api/frames/frame_command_send.py | 6 +++--- pyvlx/api/frames/frame_discover_nodes.py | 2 +- pyvlx/api/frames/frame_error_notification.py | 2 +- pyvlx/api/frames/frame_facory_default.py | 2 +- pyvlx/api/frames/frame_get_all_nodes_information.py | 10 +++++----- pyvlx/api/frames/frame_get_local_time.py | 4 ++-- pyvlx/api/frames/frame_get_network_setup.py | 2 +- pyvlx/api/frames/frame_get_node_information.py | 10 +++++----- pyvlx/api/frames/frame_get_protocol_version.py | 2 +- pyvlx/api/frames/frame_get_scene_list.py | 6 +++--- pyvlx/api/frames/frame_get_state.py | 2 +- pyvlx/api/frames/frame_get_version.py | 2 +- pyvlx/api/frames/frame_helper.py | 4 ++-- .../frames/frame_house_status_monitor_disable_cfm.py | 2 +- .../frames/frame_house_status_monitor_disable_req.py | 2 +- .../frames/frame_house_status_monitor_enable_cfm.py | 2 +- .../frames/frame_house_status_monitor_enable_req.py | 2 +- pyvlx/api/frames/frame_leave_learn_state.py | 2 +- pyvlx/api/frames/frame_node_information_changed.py | 4 ++-- .../frame_node_state_position_changed_notification.py | 4 ++-- pyvlx/api/frames/frame_password_change.py | 6 +++--- pyvlx/api/frames/frame_password_enter.py | 6 +++--- pyvlx/api/frames/frame_reboot.py | 2 +- pyvlx/api/frames/frame_set_node_name.py | 4 ++-- pyvlx/api/frames/frame_set_utc.py | 2 +- pyvlx/api/get_all_nodes_information.py | 2 +- pyvlx/api/get_local_time.py | 3 ++- pyvlx/api/get_network_setup.py | 3 ++- pyvlx/api/get_protocol_version.py | 3 ++- pyvlx/api/get_scene_list.py | 2 +- pyvlx/api/get_state.py | 3 ++- pyvlx/api/get_version.py | 3 ++- pyvlx/api/house_status_monitor.py | 2 +- pyvlx/api/leave_learn_state.py | 5 +++-- pyvlx/api/password_enter.py | 2 +- pyvlx/api/reboot.py | 2 +- 42 files changed, 71 insertions(+), 65 deletions(-) diff --git a/pyvlx/api/factory_default.py b/pyvlx/api/factory_default.py index bfb9c69f..eaafec69 100644 --- a/pyvlx/api/factory_default.py +++ b/pyvlx/api/factory_default.py @@ -1,5 +1,5 @@ """Module for handling the FactoryDefault to API.""" -from ..log import PYVLXLOG +from pyvlx.log import PYVLXLOG from .api_event import ApiEvent from .frames import FrameGatewayFactoryDefaultConfirmation, FrameGatewayFactoryDefaultRequest diff --git a/pyvlx/api/frame_creation.py b/pyvlx/api/frame_creation.py index 209926d8..8e4e559e 100644 --- a/pyvlx/api/frame_creation.py +++ b/pyvlx/api/frame_creation.py @@ -1,6 +1,6 @@ """Helper module for creating a frame out of raw data.""" -from ..log import PYVLXLOG -from ..const import Command +from pyvlx.log import PYVLXLOG +from pyvlx.const import Command from .frames import ( FrameActivateSceneConfirmation, FrameActivateSceneRequest, FrameActivationLogUpdatedNotification, diff --git a/pyvlx/api/frames/alias_array.py b/pyvlx/api/frames/alias_array.py index 79a25f5a..c08f9345 100644 --- a/pyvlx/api/frames/alias_array.py +++ b/pyvlx/api/frames/alias_array.py @@ -1,5 +1,5 @@ """Module for storing alias array.""" -from ...exception import PyVLXException +from pyvlx.exception import PyVLXException class AliasArray: diff --git a/pyvlx/api/frames/frame.py b/pyvlx/api/frames/frame.py index 23d2269f..1d9c3341 100644 --- a/pyvlx/api/frames/frame.py +++ b/pyvlx/api/frames/frame.py @@ -1,7 +1,7 @@ """Module for Frames.""" import struct -from ...exception import PyVLXException +from pyvlx.exception import PyVLXException from .frame_helper import calc_crc diff --git a/pyvlx/api/frames/frame_activate_scene.py b/pyvlx/api/frames/frame_activate_scene.py index c0bf7c6a..865971fc 100644 --- a/pyvlx/api/frames/frame_activate_scene.py +++ b/pyvlx/api/frames/frame_activate_scene.py @@ -1,7 +1,7 @@ """Module for sending command to gw.""" from enum import Enum -from ...const import Command, Originator, Priority, Velocity +from pyvlx.const import Command, Originator, Priority, Velocity from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_activation_log_updated.py b/pyvlx/api/frames/frame_activation_log_updated.py index c6c16f0f..a8154653 100644 --- a/pyvlx/api/frames/frame_activation_log_updated.py +++ b/pyvlx/api/frames/frame_activation_log_updated.py @@ -1,5 +1,5 @@ """Module for error notification.""" -from ...const import Command +from pyvlx.const import Command from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_command_send.py b/pyvlx/api/frames/frame_command_send.py index f88982a6..f99fdbc4 100644 --- a/pyvlx/api/frames/frame_command_send.py +++ b/pyvlx/api/frames/frame_command_send.py @@ -1,9 +1,9 @@ """Module for sending command to gw.""" from enum import Enum -from ...const import Command, Originator, Priority -from ...exception import PyVLXException -from ...parameter import Parameter, Position +from pyvlx.const import Command, Originator, Priority +from pyvlx.exception import PyVLXException +from pyvlx.parameter import Parameter, Position from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_discover_nodes.py b/pyvlx/api/frames/frame_discover_nodes.py index 491c38f7..b505add4 100644 --- a/pyvlx/api/frames/frame_discover_nodes.py +++ b/pyvlx/api/frames/frame_discover_nodes.py @@ -1,5 +1,5 @@ """Module for discover nodes requests.""" -from ...const import Command, NodeType +from pyvlx.const import Command, NodeType from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_error_notification.py b/pyvlx/api/frames/frame_error_notification.py index 611a03d3..f1a0e376 100644 --- a/pyvlx/api/frames/frame_error_notification.py +++ b/pyvlx/api/frames/frame_error_notification.py @@ -1,7 +1,7 @@ """Module for error notification.""" from enum import Enum -from ...const import Command +from pyvlx.const import Command from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_facory_default.py b/pyvlx/api/frames/frame_facory_default.py index ebe41de5..7768f674 100644 --- a/pyvlx/api/frames/frame_facory_default.py +++ b/pyvlx/api/frames/frame_facory_default.py @@ -1,5 +1,5 @@ """Module for reboot frame classes.""" -from ...const import Command +from pyvlx.const import Command from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_get_all_nodes_information.py b/pyvlx/api/frames/frame_get_all_nodes_information.py index de735e40..a4c4ef20 100644 --- a/pyvlx/api/frames/frame_get_all_nodes_information.py +++ b/pyvlx/api/frames/frame_get_all_nodes_information.py @@ -3,13 +3,13 @@ from datetime import datetime from enum import Enum -from .alias_array import AliasArray -from ...const import Command, NodeTypeWithSubtype, NodeVariation, Velocity -from ...exception import PyVLXException -from ...parameter import Parameter -from ...string_helper import bytes_to_string, string_to_bytes +from pyvlx.const import Command, NodeTypeWithSubtype, NodeVariation, Velocity +from pyvlx.exception import PyVLXException +from pyvlx.parameter import Parameter +from pyvlx.string_helper import bytes_to_string, string_to_bytes from .frame import FrameBase +from .alias_array import AliasArray class FrameGetAllNodesInformationRequest(FrameBase): diff --git a/pyvlx/api/frames/frame_get_local_time.py b/pyvlx/api/frames/frame_get_local_time.py index 32f77529..c766e420 100644 --- a/pyvlx/api/frames/frame_get_local_time.py +++ b/pyvlx/api/frames/frame_get_local_time.py @@ -1,6 +1,6 @@ """Module for get local time classes.""" -from ...const import Command -from ...dataobjects import DtoLocalTime +from pyvlx.const import Command +from pyvlx.dataobjects import DtoLocalTime from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_get_network_setup.py b/pyvlx/api/frames/frame_get_network_setup.py index 4e980926..1795b3b6 100644 --- a/pyvlx/api/frames/frame_get_network_setup.py +++ b/pyvlx/api/frames/frame_get_network_setup.py @@ -1,5 +1,5 @@ """Frames for receiving network setup from gateway.""" -from ...const import Command, DHCPParameter +from pyvlx.const import Command, DHCPParameter from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_get_node_information.py b/pyvlx/api/frames/frame_get_node_information.py index f04906e6..f27b5963 100644 --- a/pyvlx/api/frames/frame_get_node_information.py +++ b/pyvlx/api/frames/frame_get_node_information.py @@ -3,13 +3,13 @@ from datetime import datetime from enum import Enum -from .alias_array import AliasArray -from ...const import Command, NodeTypeWithSubtype, NodeVariation, Velocity -from ...exception import PyVLXException -from ...parameter import Parameter -from ...string_helper import bytes_to_string, string_to_bytes +from pyvlx.const import Command, NodeTypeWithSubtype, NodeVariation, Velocity +from pyvlx.exception import PyVLXException +from pyvlx.parameter import Parameter +from pyvlx.string_helper import bytes_to_string, string_to_bytes from .frame import FrameBase +from .alias_array import AliasArray class FrameGetNodeInformationRequest(FrameBase): diff --git a/pyvlx/api/frames/frame_get_protocol_version.py b/pyvlx/api/frames/frame_get_protocol_version.py index 0bbeaa77..0ec9ac1b 100644 --- a/pyvlx/api/frames/frame_get_protocol_version.py +++ b/pyvlx/api/frames/frame_get_protocol_version.py @@ -1,5 +1,5 @@ """Module for get version frame classes.""" -from ...const import Command +from pyvlx.const import Command from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_get_scene_list.py b/pyvlx/api/frames/frame_get_scene_list.py index 97f2faa8..1b722b69 100644 --- a/pyvlx/api/frames/frame_get_scene_list.py +++ b/pyvlx/api/frames/frame_get_scene_list.py @@ -1,7 +1,7 @@ """Module for get scene list frame classes.""" -from ...const import Command -from ...exception import PyVLXException -from ...string_helper import bytes_to_string, string_to_bytes +from pyvlx.const import Command +from pyvlx.exception import PyVLXException +from pyvlx.string_helper import bytes_to_string, string_to_bytes from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_get_state.py b/pyvlx/api/frames/frame_get_state.py index 55d28c3d..fe685b78 100644 --- a/pyvlx/api/frames/frame_get_state.py +++ b/pyvlx/api/frames/frame_get_state.py @@ -1,5 +1,5 @@ """Frames for receiving state from gateway.""" -from ...const import Command, GatewayState, GatewaySubState +from pyvlx.const import Command, GatewayState, GatewaySubState from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_get_version.py b/pyvlx/api/frames/frame_get_version.py index 66f3bdef..b5d0b06f 100644 --- a/pyvlx/api/frames/frame_get_version.py +++ b/pyvlx/api/frames/frame_get_version.py @@ -1,5 +1,5 @@ """Module for get version frame classes.""" -from ...const import Command +from pyvlx.const import Command from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_helper.py b/pyvlx/api/frames/frame_helper.py index e224810a..7df6dbe0 100644 --- a/pyvlx/api/frames/frame_helper.py +++ b/pyvlx/api/frames/frame_helper.py @@ -1,6 +1,6 @@ """Helper module for SLIP Frames.""" -from ...const import Command -from ...exception import PyVLXException +from pyvlx.const import Command +from pyvlx.exception import PyVLXException def calc_crc(raw): diff --git a/pyvlx/api/frames/frame_house_status_monitor_disable_cfm.py b/pyvlx/api/frames/frame_house_status_monitor_disable_cfm.py index 27cfd589..3cf5c2b7 100644 --- a/pyvlx/api/frames/frame_house_status_monitor_disable_cfm.py +++ b/pyvlx/api/frames/frame_house_status_monitor_disable_cfm.py @@ -1,5 +1,5 @@ """Module for confirmation for disabling the house status monitor.""" -from ...const import Command +from pyvlx.const import Command from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_house_status_monitor_disable_req.py b/pyvlx/api/frames/frame_house_status_monitor_disable_req.py index a3e801f6..38052eb6 100644 --- a/pyvlx/api/frames/frame_house_status_monitor_disable_req.py +++ b/pyvlx/api/frames/frame_house_status_monitor_disable_req.py @@ -1,5 +1,5 @@ """Module for requesting disabling the house status monitor.""" -from ...const import Command +from pyvlx.const import Command from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_house_status_monitor_enable_cfm.py b/pyvlx/api/frames/frame_house_status_monitor_enable_cfm.py index edc94672..dc5b6d1f 100644 --- a/pyvlx/api/frames/frame_house_status_monitor_enable_cfm.py +++ b/pyvlx/api/frames/frame_house_status_monitor_enable_cfm.py @@ -1,5 +1,5 @@ """Module for confirmation for enabling the house status monitor.""" -from ...const import Command +from pyvlx.const import Command from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_house_status_monitor_enable_req.py b/pyvlx/api/frames/frame_house_status_monitor_enable_req.py index 2311b8ac..941f42f5 100644 --- a/pyvlx/api/frames/frame_house_status_monitor_enable_req.py +++ b/pyvlx/api/frames/frame_house_status_monitor_enable_req.py @@ -1,5 +1,5 @@ """Module for requesting enabling the house status monitor.""" -from ...const import Command +from pyvlx.const import Command from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_leave_learn_state.py b/pyvlx/api/frames/frame_leave_learn_state.py index f925feda..4fc21410 100644 --- a/pyvlx/api/frames/frame_leave_learn_state.py +++ b/pyvlx/api/frames/frame_leave_learn_state.py @@ -1,5 +1,5 @@ """Module for leave learn state frame classes.""" -from ...const import Command, LeaveLearnStateConfirmationStatus +from pyvlx.const import Command, LeaveLearnStateConfirmationStatus from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_node_information_changed.py b/pyvlx/api/frames/frame_node_information_changed.py index 24ace17b..48efb436 100644 --- a/pyvlx/api/frames/frame_node_information_changed.py +++ b/pyvlx/api/frames/frame_node_information_changed.py @@ -1,6 +1,6 @@ """Module for requesting change of node name.""" -from ...const import Command, NodeVariation -from ...string_helper import bytes_to_string, string_to_bytes +from pyvlx.const import Command, NodeVariation +from pyvlx.string_helper import bytes_to_string, string_to_bytes from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_node_state_position_changed_notification.py b/pyvlx/api/frames/frame_node_state_position_changed_notification.py index 16de817a..58c2b7b5 100644 --- a/pyvlx/api/frames/frame_node_state_position_changed_notification.py +++ b/pyvlx/api/frames/frame_node_state_position_changed_notification.py @@ -2,8 +2,8 @@ import struct from datetime import datetime -from ...const import Command -from ...parameter import Parameter +from pyvlx.const import Command +from pyvlx.parameter import Parameter from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_password_change.py b/pyvlx/api/frames/frame_password_change.py index 505aeefd..7e40ac8c 100644 --- a/pyvlx/api/frames/frame_password_change.py +++ b/pyvlx/api/frames/frame_password_change.py @@ -1,9 +1,9 @@ """Module for password enter frame classes.""" from enum import Enum -from ...const import Command -from ...exception import PyVLXException -from ...string_helper import bytes_to_string, string_to_bytes +from pyvlx.const import Command +from pyvlx.exception import PyVLXException +from pyvlx.string_helper import bytes_to_string, string_to_bytes from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_password_enter.py b/pyvlx/api/frames/frame_password_enter.py index 8a767b2c..3ee1328d 100644 --- a/pyvlx/api/frames/frame_password_enter.py +++ b/pyvlx/api/frames/frame_password_enter.py @@ -1,9 +1,9 @@ """Module for password enter frame classes.""" from enum import Enum -from ...const import Command -from ...exception import PyVLXException -from ...string_helper import bytes_to_string, string_to_bytes +from pyvlx.const import Command +from pyvlx.exception import PyVLXException +from pyvlx.string_helper import bytes_to_string, string_to_bytes from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_reboot.py b/pyvlx/api/frames/frame_reboot.py index d60f6b1c..ad71e41f 100644 --- a/pyvlx/api/frames/frame_reboot.py +++ b/pyvlx/api/frames/frame_reboot.py @@ -1,5 +1,5 @@ """Module for reboot frame classes.""" -from ...const import Command +from pyvlx.const import Command from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_set_node_name.py b/pyvlx/api/frames/frame_set_node_name.py index 0a87e020..f7cb1f64 100644 --- a/pyvlx/api/frames/frame_set_node_name.py +++ b/pyvlx/api/frames/frame_set_node_name.py @@ -1,8 +1,8 @@ """Module for requesting change of node name.""" from enum import Enum -from ...const import Command -from ...string_helper import bytes_to_string, string_to_bytes +from pyvlx.const import Command +from pyvlx.string_helper import bytes_to_string, string_to_bytes from .frame import FrameBase diff --git a/pyvlx/api/frames/frame_set_utc.py b/pyvlx/api/frames/frame_set_utc.py index e85c42d4..55fbdfcc 100644 --- a/pyvlx/api/frames/frame_set_utc.py +++ b/pyvlx/api/frames/frame_set_utc.py @@ -1,7 +1,7 @@ """Module for sending command to gw.""" import struct from datetime import datetime -from ...const import Command +from pyvlx.const import Command from .frame import FrameBase diff --git a/pyvlx/api/get_all_nodes_information.py b/pyvlx/api/get_all_nodes_information.py index d819c2e3..33527a6f 100644 --- a/pyvlx/api/get_all_nodes_information.py +++ b/pyvlx/api/get_all_nodes_information.py @@ -1,5 +1,5 @@ """Module for retrieving node information from API.""" -from ..log import PYVLXLOG +from pyvlx.log import PYVLXLOG from .api_event import ApiEvent from .frames import ( FrameGetAllNodesInformationConfirmation, diff --git a/pyvlx/api/get_local_time.py b/pyvlx/api/get_local_time.py index 2f042a14..431ee580 100644 --- a/pyvlx/api/get_local_time.py +++ b/pyvlx/api/get_local_time.py @@ -1,7 +1,8 @@ """Module for local time firmware version from API.""" +from pyvlx.dataobjects import DtoLocalTime + from .api_event import ApiEvent from .frames import FrameGetLocalTimeConfirmation, FrameGetLocalTimeRequest -from ..dataobjects import DtoLocalTime class GetLocalTime(ApiEvent): diff --git a/pyvlx/api/get_network_setup.py b/pyvlx/api/get_network_setup.py index bccf0b84..eeff948e 100644 --- a/pyvlx/api/get_network_setup.py +++ b/pyvlx/api/get_network_setup.py @@ -1,7 +1,8 @@ """Module for retrieving gateway state from API.""" +from pyvlx.dataobjects import DtoNetworkSetup + from .api_event import ApiEvent from .frames import FrameGetNetworkSetupConfirmation, FrameGetNetworkSetupRequest -from ..dataobjects import DtoNetworkSetup class GetNetworkSetup(ApiEvent): diff --git a/pyvlx/api/get_protocol_version.py b/pyvlx/api/get_protocol_version.py index a63b5d44..072109e1 100644 --- a/pyvlx/api/get_protocol_version.py +++ b/pyvlx/api/get_protocol_version.py @@ -1,8 +1,9 @@ """Module for retrieving protocol version from API.""" + +from pyvlx.dataobjects import DtoProtocolVersion from .api_event import ApiEvent from .frames import ( FrameGetProtocolVersionConfirmation, FrameGetProtocolVersionRequest) -from ..dataobjects import DtoProtocolVersion class GetProtocolVersion(ApiEvent): diff --git a/pyvlx/api/get_scene_list.py b/pyvlx/api/get_scene_list.py index 2af93034..a6a26649 100644 --- a/pyvlx/api/get_scene_list.py +++ b/pyvlx/api/get_scene_list.py @@ -1,5 +1,5 @@ """Module for retrieving scene list from API.""" -from ..log import PYVLXLOG +from pyvlx.log import PYVLXLOG from .api_event import ApiEvent from .frames import ( FrameGetSceneListConfirmation, FrameGetSceneListNotification, diff --git a/pyvlx/api/get_state.py b/pyvlx/api/get_state.py index 9c3e729c..e0eb5f05 100644 --- a/pyvlx/api/get_state.py +++ b/pyvlx/api/get_state.py @@ -1,7 +1,8 @@ """Module for retrieving gateway state from API.""" +from pyvlx.dataobjects import DtoState + from .api_event import ApiEvent from .frames import FrameGetStateConfirmation, FrameGetStateRequest -from ..dataobjects import DtoState class GetState(ApiEvent): diff --git a/pyvlx/api/get_version.py b/pyvlx/api/get_version.py index 30c7d07c..e3afbc85 100644 --- a/pyvlx/api/get_version.py +++ b/pyvlx/api/get_version.py @@ -1,7 +1,8 @@ """Module for retrieving firmware version from API.""" +from pyvlx.dataobjects import DtoVersion + from .api_event import ApiEvent from .frames import FrameGetVersionConfirmation, FrameGetVersionRequest -from ..dataobjects import DtoVersion class GetVersion(ApiEvent): diff --git a/pyvlx/api/house_status_monitor.py b/pyvlx/api/house_status_monitor.py index aa301b35..1afe76a3 100644 --- a/pyvlx/api/house_status_monitor.py +++ b/pyvlx/api/house_status_monitor.py @@ -1,5 +1,5 @@ """Module for house status monitor.""" -from ..exception import PyVLXException +from pyvlx.exception import PyVLXException from .api_event import ApiEvent from .frames import ( FrameHouseStatusMonitorDisableConfirmation, diff --git a/pyvlx/api/leave_learn_state.py b/pyvlx/api/leave_learn_state.py index 446b62bf..3c192976 100644 --- a/pyvlx/api/leave_learn_state.py +++ b/pyvlx/api/leave_learn_state.py @@ -1,9 +1,10 @@ """Module for handling the login to API.""" -from ..log import PYVLXLOG +from pyvlx.dataobjects import DtoLeaveLearnState +from pyvlx.log import PYVLXLOG + from .api_event import ApiEvent from .frames import (FrameLeaveLearnStateRequest, FrameLeaveLearnStateConfirmation, LeaveLearnStateConfirmationStatus) -from ..dataobjects import DtoLeaveLearnState class LeaveLearnState(ApiEvent): diff --git a/pyvlx/api/password_enter.py b/pyvlx/api/password_enter.py index 92bae387..5d3fe94e 100644 --- a/pyvlx/api/password_enter.py +++ b/pyvlx/api/password_enter.py @@ -1,5 +1,5 @@ """Module for handling the login to API.""" -from ..log import PYVLXLOG +from pyvlx.log import PYVLXLOG from .api_event import ApiEvent from .frames import ( FramePasswordEnterConfirmation, FramePasswordEnterRequest, diff --git a/pyvlx/api/reboot.py b/pyvlx/api/reboot.py index a58c83f9..2bc89f86 100644 --- a/pyvlx/api/reboot.py +++ b/pyvlx/api/reboot.py @@ -1,5 +1,5 @@ """Module for handling the Reboot to API.""" -from ..log import PYVLXLOG +from pyvlx.log import PYVLXLOG from .api_event import ApiEvent from .frames import FrameGatewayRebootConfirmation, FrameGatewayRebootRequest From 2a6912e9f11935c92c343e9ac4fe5b0625ad57ca Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Fri, 4 Dec 2020 15:34:47 +0100 Subject: [PATCH 52/58] remove duplicate getnetworksetup --- pyvlx/pyvlx.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pyvlx/pyvlx.py b/pyvlx/pyvlx.py index 54eeb671..af1fc4b4 100644 --- a/pyvlx/pyvlx.py +++ b/pyvlx/pyvlx.py @@ -51,7 +51,6 @@ async def connect(self): ) await self.klf200.get_state() - await self.klf200.get_network_setup() await self.klf200.set_utc() await self.klf200.get_network_setup() await house_status_monitor_enable(pyvlx=self) From 9a6ab89e1ee9d9a5f01526b63de58e3b79e8b520 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Sat, 5 Dec 2020 09:36:53 +0100 Subject: [PATCH 53/58] Fix logging Remove pyvlx.update_version --- pyvlx/klf200gateway.py | 2 +- pyvlx/pyvlx.py | 11 +++-------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/pyvlx/klf200gateway.py b/pyvlx/klf200gateway.py index 9ab567ce..117188fb 100644 --- a/pyvlx/klf200gateway.py +++ b/pyvlx/klf200gateway.py @@ -70,7 +70,7 @@ async def get_protocol_version(self): await get_protocol_version.do_api_call() if not get_protocol_version.success: raise PyVLXException("Unable to retrieve protocol version") - self.protocol_version = get_protocol_version.version + self.protocol_version = get_protocol_version.protocolversion return get_protocol_version.success async def leave_learn_state(self): diff --git a/pyvlx/pyvlx.py b/pyvlx/pyvlx.py index af1fc4b4..8b7af524 100644 --- a/pyvlx/pyvlx.py +++ b/pyvlx/pyvlx.py @@ -39,13 +39,13 @@ def __init__(self, path=None, host=None, password=None, loop=None): async def connect(self): """Connect to KLF 200.""" - PYVLXLOG.warning("Connecting to KLF 200.") + PYVLXLOG.debug("Connecting to KLF 200.") await self.connection.connect() await self.klf200.password_enter(password=self.config.password) await self.klf200.get_version() await self.klf200.get_protocol_version() - PYVLXLOG.warning( - "Connected to: %s, protocol version: %s", + PYVLXLOG.debug( + "Connected to: %s, %s", str(self.klf200.version), str(self.klf200.protocol_version) ) @@ -60,11 +60,6 @@ async def reboot_gateway(self): PYVLXLOG.warning("KLF 200 reboot initiated") await self.klf200.reboot() - async def update_version(self): - """For Compatibility: Retrieve version and protocol version from API.""" - await self.klf200.get_version() - await self.klf200.get_protocol_version() - async def send_frame(self, frame): """Send frame to API via connection.""" if not self.connection.connected: From ae1b84aef1b6fbbd7122edb51b9e0ae7c55fe5e9 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Sat, 5 Dec 2020 09:56:22 +0100 Subject: [PATCH 54/58] Align behaviour on unsucessful api calls All raise exceptions now --- pyvlx/klf200gateway.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/pyvlx/klf200gateway.py b/pyvlx/klf200gateway.py index 117188fb..4e76eda3 100644 --- a/pyvlx/klf200gateway.py +++ b/pyvlx/klf200gateway.py @@ -6,8 +6,6 @@ from .exception import PyVLXException -from .log import PYVLXLOG - class Klf200Gateway: """Class for node abstraction.""" @@ -78,7 +76,7 @@ async def leave_learn_state(self): leave_learn_state = LeaveLearnState(pyvlx=self.pyvlx) await leave_learn_state.do_api_call() if not leave_learn_state.success: - PYVLXLOG.warning("Unable to leave learn state") + raise PyVLXException("Unable to leave learn state") return leave_learn_state.success async def set_utc(self): @@ -86,7 +84,7 @@ async def set_utc(self): setutc = SetUTC(pyvlx=self.pyvlx) await setutc.do_api_call() if not setutc.success: - PYVLXLOG.warning("Unable to set utc.") + raise PyVLXException("Unable to set utc.") return setutc.success async def set_rtc_time_zone(self): @@ -100,7 +98,7 @@ async def reboot(self): reboot = Reboot(pyvlx=self.pyvlx) await reboot.do_api_call() if not reboot.success: - PYVLXLOG.warning("Unable to reboot gateway.") + raise PyVLXException("Unable to reboot gateway.") return reboot.success async def set_factory_default(self): @@ -108,7 +106,7 @@ async def set_factory_default(self): factorydefault = FactoryDefault(pyvlx=self.pyvlx) await factorydefault.do_api_call() if not factorydefault.success: - PYVLXLOG.warning("Unable to factory Default Reset gateway.") + raise PyVLXException("Unable to factory Default Reset gateway.") return factorydefault.success async def get_local_time(self): @@ -116,7 +114,7 @@ async def get_local_time(self): getlocaltime = GetLocalTime(pyvlx=self.pyvlx) await getlocaltime.do_api_call() if not getlocaltime.success: - PYVLXLOG.warning("Unable to get local time.") + raise PyVLXException("Unable to get local time.") self.time = getlocaltime.localtime return getlocaltime.success From 12ffa18d88953e195ec427758d8a976990263078 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Sat, 5 Dec 2020 10:03:25 +0100 Subject: [PATCH 55/58] Fix: Api Success, if Framehandling is OK. Does not depend on leavelearnstate any more --- pyvlx/api/leave_learn_state.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/pyvlx/api/leave_learn_state.py b/pyvlx/api/leave_learn_state.py index 3c192976..2b33f0b2 100644 --- a/pyvlx/api/leave_learn_state.py +++ b/pyvlx/api/leave_learn_state.py @@ -21,13 +21,7 @@ async def handle_frame(self, frame): if not isinstance(frame, FrameLeaveLearnStateConfirmation): return False self.status = frame.status - if self.status == LeaveLearnStateConfirmationStatus.FAILED: - PYVLXLOG.warning( - 'Failed to leave learn state' - ) - self.success = False - if self.status == LeaveLearnStateConfirmationStatus.SUCCESSFUL: - self.success = True + self.success = True return True def request_frame(self): From 8689fc5e6135a21231b5b4cd37e4db471ac0cf79 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Sat, 5 Dec 2020 10:04:09 +0100 Subject: [PATCH 56/58] Fix: remove connection=false. Api should timeout --- pyvlx/api/factory_default.py | 1 - pyvlx/api/reboot.py | 1 - 2 files changed, 2 deletions(-) diff --git a/pyvlx/api/factory_default.py b/pyvlx/api/factory_default.py index eaafec69..858a4059 100644 --- a/pyvlx/api/factory_default.py +++ b/pyvlx/api/factory_default.py @@ -17,7 +17,6 @@ async def handle_frame(self, frame): """Handle incoming API frame, return True if this was the expected frame.""" if isinstance(frame, FrameGatewayFactoryDefaultConfirmation): PYVLXLOG.warning("KLF200 is factory resetting") - self.pyvlx.connection.connected = False self.success = True return True return False diff --git a/pyvlx/api/reboot.py b/pyvlx/api/reboot.py index 2bc89f86..30b3f41f 100644 --- a/pyvlx/api/reboot.py +++ b/pyvlx/api/reboot.py @@ -17,7 +17,6 @@ async def handle_frame(self, frame): """Handle incoming API frame, return True if this was the expected frame.""" if isinstance(frame, FrameGatewayRebootConfirmation): PYVLXLOG.warning("KLF200 is rebooting") - self.pyvlx.connection.connected = False self.success = True return True return False From 673c177294643add064684fa11ab2869213f0567 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Sat, 5 Dec 2020 10:06:17 +0100 Subject: [PATCH 57/58] Fix unused imports --- pyvlx/api/leave_learn_state.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pyvlx/api/leave_learn_state.py b/pyvlx/api/leave_learn_state.py index 2b33f0b2..0bd8d265 100644 --- a/pyvlx/api/leave_learn_state.py +++ b/pyvlx/api/leave_learn_state.py @@ -1,10 +1,9 @@ """Module for handling the login to API.""" from pyvlx.dataobjects import DtoLeaveLearnState -from pyvlx.log import PYVLXLOG from .api_event import ApiEvent from .frames import (FrameLeaveLearnStateRequest, - FrameLeaveLearnStateConfirmation, LeaveLearnStateConfirmationStatus) + FrameLeaveLearnStateConfirmation) class LeaveLearnState(ApiEvent): From 804ccfad896f7cd1943707d4541c8ffe5d2efe69 Mon Sep 17 00:00:00 2001 From: icommitdesnet Date: Mon, 7 Dec 2020 09:27:24 +0100 Subject: [PATCH 58/58] Remove unnecessary Output --- pyvlx/dataobjects.py | 36 ++++++------------------------------ 1 file changed, 6 insertions(+), 30 deletions(-) diff --git a/pyvlx/dataobjects.py b/pyvlx/dataobjects.py index 96ec13d8..f45e092d 100644 --- a/pyvlx/dataobjects.py +++ b/pyvlx/dataobjects.py @@ -1,8 +1,6 @@ """Module for Dataobjects.""" from datetime import datetime import time -from .const import (DHCPParameter, GatewayState, - GatewaySubState, LeaveLearnStateConfirmationStatus) class DtoLocalTime: @@ -71,16 +69,11 @@ def __init__(self, ipaddress=None, gateway=None, netmask=None, dhcp=None): self.netmask = netmask self.dhcp = dhcp - @property - def dhcp_name(self): - """Return dhcp as human readable string.""" - return DHCPParameter(self.dhcp).name - def __str__(self): """Return human readable string.""" - return '<{} ipaddress="{}" gateway="{}" gateway="{}" dhcp="{}" dhcp_name="{}"/>'.format( + return '<{} ipaddress="{}" gateway="{}" gateway="{}" dhcp="{}"/>'.format( type(self).__name__, self.ipaddress, self.gateway, - self.gateway, self.dhcp, self.dhcp_name + self.gateway, self.dhcp ) @@ -109,23 +102,11 @@ def __init__(self, gateway_state=None, gateway_sub_state=None): self.gateway_state = gateway_state self.gateway_sub_state = gateway_sub_state - @property - def gateway_state_name(self): - """Return gateway_state as human readable string.""" - return GatewayState(self.gateway_state).name - - @property - def gateway_sub_state_name(self): - """Return gateway_sub_state as human readable string.""" - return GatewaySubState(self.gateway_sub_state).name - def __str__(self): """Return human readable string.""" return ( - '<{} gateway_state="{}" gateway_state_name="{}" gateway_sub_state="{}" ' - 'gateway_sub_state=_name"{}"/>'.format( - type(self).__name__, self.gateway_state, self.gateway_state_name, - self.gateway_sub_state, self.gateway_sub_state_name + '<{} gateway_state="{}" gateway_sub_state="{}"/>'.format( + type(self).__name__, self.gateway_state, self.gateway_sub_state ) ) @@ -159,15 +140,10 @@ def __init__(self, status=None): """Initialize DtoLeaveLearnState class.""" self.status = status - @property - def status_name(self): - """Return status as human readable string.""" - return LeaveLearnStateConfirmationStatus(self.status_name).name - def __str__(self): """Return human readable string.""" return ( - '<{} status="{}" status_name="{}"/>'.format( - type(self).__name__, self.status, self.status_name + '<{} status="{}"/>'.format( + type(self).__name__, self.status ) )