Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Klf200 class with new frames, reorganisation of files #56

Merged
merged 59 commits into from
Dec 21, 2020
Merged
Show file tree
Hide file tree
Changes from 50 commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
42561fa
Edit description
icommitdesnet Nov 21, 2020
9ef18bf
Add Frame Definitions for
icommitdesnet Nov 21, 2020
164e7bb
Edit Typo
icommitdesnet Nov 21, 2020
a3a763f
add new Frames
icommitdesnet Nov 21, 2020
5f6fd98
Edit Typo
icommitdesnet Nov 21, 2020
df6b0a4
Edit Typo
icommitdesnet Nov 21, 2020
0c1758e
Add new Frames to Package and Factory
icommitdesnet Nov 21, 2020
9e0f291
Remove Whitspace
icommitdesnet Nov 21, 2020
838a32f
Move Class AliasArray to Frame Package
icommitdesnet Nov 21, 2020
780cae8
Change Structure to ApiEvent > Frames
icommitdesnet Nov 21, 2020
0428199
Fix pylint warnings in ApiEvents (except line too long)
icommitdesnet Nov 21, 2020
c238da2
Add Dataobjects to ApiEvents
icommitdesnet Nov 21, 2020
4c6a4e4
add klf200 Gateway Class
icommitdesnet Nov 21, 2020
fd92754
Merge UTC Frame REQ and CFM into one Module
icommitdesnet Nov 22, 2020
472089e
Fix SET UTC Call and switch from Login to Password Enter API
icommitdesnet Nov 22, 2020
7f05406
Fixed imports
icommitdesnet Nov 22, 2020
b604cdc
Integrate new KLF200 Class into Pyvlx.
icommitdesnet Nov 22, 2020
3dd81e5
Unified Human readalbe String generation in Frames
icommitdesnet Nov 22, 2020
b5a16ab
Add missing humanreadable frame updates
icommitdesnet Nov 22, 2020
5e1775f
Change Human Readable String generation for API and Base
icommitdesnet Nov 22, 2020
02adcde
Edit Import for Testclasses
icommitdesnet Nov 25, 2020
343ccbb
Fix Frame
icommitdesnet Nov 25, 2020
31d9e24
Fix Test Classes
icommitdesnet Nov 25, 2020
da5308d
Fix another Typo in Test Class
icommitdesnet Nov 26, 2020
1310f15
Another Fix for Testclasses Checks for Stringrepresentations
icommitdesnet Nov 26, 2020
ac7f686
add Test Classes for new Frames
icommitdesnet Nov 26, 2020
0e25e22
Fix new Frames
icommitdesnet Nov 26, 2020
9c1af49
Fix broken import
icommitdesnet Nov 27, 2020
52a1607
remove sym link
icommitdesnet Nov 27, 2020
a615803
fix pylint warnings
icommitdesnet Nov 29, 2020
fa852a9
Fix more pylint errors
icommitdesnet Nov 29, 2020
bf9284d
Update frame_get_all_nodes_information_ntf_test.py
icommitdesnet Nov 29, 2020
dcd3df9
another fix for pylint warnings
icommitdesnet Nov 29, 2020
d1c4b9a
fix Imports from API
icommitdesnet Nov 29, 2020
b0d3ed5
pylint + flake8 control
icommitdesnet Nov 30, 2020
3f6af0a
fix imports, add exception from keywords
icommitdesnet Nov 30, 2020
2a941fe
Fix Ident
icommitdesnet Nov 30, 2020
8db8163
Add Tests
icommitdesnet Nov 30, 2020
9767f23
fix linting
icommitdesnet Dec 1, 2020
56e511b
Update frame_get_local_time_cfm_test.py
icommitdesnet Dec 1, 2020
3a76377
Add unittests
icommitdesnet Dec 1, 2020
cd3ab55
Fix Frames, Add Test
icommitdesnet Dec 3, 2020
2d9c616
Add Enum Types
icommitdesnet Dec 3, 2020
16ccc02
Merge branch 'master' of https://github.com/icommitdesnet/pyvlx
icommitdesnet Dec 3, 2020
2330fa1
Add Dataobjects
icommitdesnet Dec 3, 2020
af329b3
Add Tests
icommitdesnet Dec 3, 2020
310d651
Add Enums
icommitdesnet Dec 3, 2020
1a41a0e
Fix Const
icommitdesnet Dec 3, 2020
21e1b7e
Fix: add tzinfo for testcase
icommitdesnet Dec 4, 2020
0e827b5
fix linting
icommitdesnet Dec 4, 2020
d82760a
Add Test fro PasswordChangeConfirmation
icommitdesnet Dec 4, 2020
973ca15
use Absolute Imports
icommitdesnet Dec 4, 2020
2a6912e
remove duplicate getnetworksetup
icommitdesnet Dec 4, 2020
9a6ab89
Fix logging
icommitdesnet Dec 5, 2020
ae1b84a
Align behaviour on unsucessful api calls
icommitdesnet Dec 5, 2020
12ffa18
Fix: Api Success, if Framehandling is OK. Does not depend on leavelea…
icommitdesnet Dec 5, 2020
8689fc5
Fix: remove connection=false. Api should timeout
icommitdesnet Dec 5, 2020
673c177
Fix unused imports
icommitdesnet Dec 5, 2020
804ccfa
Remove unnecessary Output
icommitdesnet Dec 7, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions pyvlx/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,4 @@
from .pyvlx import PyVLX
from .scene import Scene
from .scenes import Scenes
from .klf200gateway import Klf200Gateway
21 changes: 21 additions & 0 deletions pyvlx/api/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
"""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_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)
18 changes: 9 additions & 9 deletions pyvlx/activate_scene.py → pyvlx/api/activate_scene.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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
Expand Down
File renamed without changes.
38 changes: 19 additions & 19 deletions pyvlx/command_send.py → pyvlx/api/command_send.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,24 @@
"""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):
"""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)
Expand All @@ -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
Expand Down
27 changes: 27 additions & 0 deletions pyvlx/api/factory_default.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
"""Module for handling the FactoryDefault to API."""
from ..log import PYVLXLOG
from .api_event import ApiEvent
from .frames import FrameGatewayFactoryDefaultConfirmation, FrameGatewayFactoryDefaultRequest


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()
47 changes: 39 additions & 8 deletions pyvlx/frame_creation.py → pyvlx/api/frame_creation.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
"""Helper module for creating a frame out of raw data."""
from pyvlx.frames import (
from ..log import PYVLXLOG
from ..const import Command
from .frames import (
FrameActivateSceneConfirmation, FrameActivateSceneRequest,
FrameActivationLogUpdatedNotification,
FrameCommandRemainingTimeNotification, FrameCommandRunStatusNotification,
Expand All @@ -21,13 +23,16 @@
FrameHouseStatusMonitorEnableConfirmation,
FrameHouseStatusMonitorEnableRequest,
FrameNodeInformationChangedNotification,
FrameNodeStatePositionChangedNotification, FramePasswordEnterConfirmation,
FramePasswordEnterRequest, FrameSessionFinishedNotification,
FrameNodeStatePositionChangedNotification,
FramePasswordEnterConfirmation, FramePasswordEnterRequest,
FramePasswordChangeRequest, FramePasswordChangeConfirmation, FramePasswordChangeNotification,
FrameSessionFinishedNotification,
FrameSetNodeNameConfirmation, FrameSetNodeNameRequest,
FrameSetUTCConfirmation, FrameSetUTCRequest, extract_from_frame)

from .const import Command
from .log import PYVLXLOG
FrameGetNetworkSetupConfirmation, FrameGetNetworkSetupRequest,
FrameSetUTCConfirmation, FrameSetUTCRequest, extract_from_frame,
FrameLeaveLearnStateConfirmation, FrameLeaveLearnStateRequest,
FrameGetLocalTimeConfirmation, FrameGetLocalTimeRequest,
FrameGatewayFactoryDefaultConfirmation, FrameGatewayFactoryDefaultRequest)


def frame_from_raw(raw):
Expand All @@ -48,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:
Expand All @@ -67,11 +72,28 @@ 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_SET_FACTORY_DEFAULT_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:
Expand Down Expand Up @@ -129,6 +151,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:
Expand All @@ -148,5 +175,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
16 changes: 14 additions & 2 deletions pyvlx/frames/__init__.py → pyvlx/api/frames/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

# flake8: noqa
from .frame import FrameBase
from .alias_array import AliasArray
from .frame_activate_scene import (
ActivateSceneConfirmationStatus, FrameActivateSceneConfirmation,
FrameActivateSceneRequest)
Expand Down Expand Up @@ -30,6 +31,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
Expand All @@ -53,5 +56,14 @@
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)
from .frame_get_local_time import (
FrameGetLocalTimeRequest, FrameGetLocalTimeConfirmation)
from .frame_facory_default import (
FrameGatewayFactoryDefaultRequest, FrameGatewayFactoryDefaultConfirmation)
from .frame_password_change import (
FramePasswordChangeRequest, FramePasswordChangeConfirmation,
FramePasswordChangeNotification, PasswordChangeConfirmationStatus)
2 changes: 1 addition & 1 deletion pyvlx/alias_array.py → pyvlx/api/frames/alias_array.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
"""Module for storing alias array."""
from .exception import PyVLXException
from ...exception import PyVLXException


class AliasArray:
Expand Down
2 changes: 1 addition & 1 deletion pyvlx/frames/frame.py → pyvlx/api/frames/frame.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"""Module for Frames."""
import struct

from pyvlx.exception import PyVLXException
from ...exception import PyVLXException

from .frame_helper import calc_crc

Expand Down
Original file line number Diff line number Diff line change
@@ -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
icommitdesnet marked this conversation as resolved.
Show resolved Hide resolved

from .frame import FrameBase

Expand All @@ -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)
Expand Down Expand Up @@ -45,8 +45,8 @@ def from_payload(self, payload):

def __str__(self):
"""Return human readable string."""
return "<FrameActivateSceneRequest scene_id={} session_id={} originator={} velocity={}/>".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
)


Expand Down Expand Up @@ -82,6 +82,6 @@ def from_payload(self, payload):

def __str__(self):
"""Return human readable string."""
return "<FrameActivateSceneConfirmation session_id={} status={}/>".format(
self.session_id, self.status
return '<{} session_id="{}" status="{}"/>'.format(
type(self).__name__, self.session_id, self.status
)
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
"""Module for error notification."""
from pyvlx.const import Command
from ...const import Command

from .frame import FrameBase

Expand Down
Loading