Skip to content

Commit

Permalink
Fixed missing serial_number.
Browse files Browse the repository at this point in the history
Fixed tests to support serial_number.
Add setter for serial_number in frame for node information.
  • Loading branch information
tschamm committed Apr 25, 2020
1 parent 9ba5791 commit f778af5
Show file tree
Hide file tree
Showing 8 changed files with 74 additions and 56 deletions.
6 changes: 5 additions & 1 deletion pyvlx/frames/frame_get_node_information.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ def __str__(self):


class FrameGetNodeInformationNotification(FrameBase):
"""Frame for notification of note information request."""
"""Frame for notification of node information request."""

PAYLOAD_LEN = 124

Expand Down Expand Up @@ -103,6 +103,10 @@ def serial_number(self):
"""Property for serial number in a human readable way."""
return ":".join("{:02x}".format(c) for c in self._serial_number)

@serial_number.setter
def serial_number(self, serial_number):
self._serial_number = serial_number

def get_payload(self):
"""Return Payload."""
payload = bytes()
Expand Down
16 changes: 10 additions & 6 deletions pyvlx/lightening_device.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,18 @@
class LighteningDevice(Node):
"""Meta class for turning on device with one main parameter for intensity."""

def __init__(self, pyvlx, node_id, name):
def __init__(self, pyvlx, node_id, name, serial_number):
"""Initialize turning on device.
Parameters:
* pyvlx: PyVLX object
* node_id: internal id for addressing nodes.
Provided by KLF 200 device
* name: node name
* serial_number: serial number of the node.
"""
super().__init__(pyvlx=pyvlx, node_id=node_id, name=name)
super().__init__(pyvlx=pyvlx, node_id=node_id, name=name, serial_number=serial_number)
self.intensity = Intensity()

async def set_intensity(self, intensity, wait_for_completion=True):
Expand Down Expand Up @@ -68,23 +69,26 @@ async def turn_off(self, wait_for_completion=True):
class Light(LighteningDevice):
"""Light object."""

def __init__(self, pyvlx, node_id, name):
def __init__(self, pyvlx, node_id, name, serial_number):
"""Initialize Light class.
Parameters:
* pyvlx: PyVLX object
* node_id: internal id for addressing nodes.
Provided by KLF 200 device
* name: node name
* serial_number: serial number of the node.
"""
super().__init__(pyvlx=pyvlx, node_id=node_id, name=name)
super().__init__(pyvlx=pyvlx, node_id=node_id, name=name, serial_number=serial_number)

def __str__(self):
"""Return object as readable string."""
return '<{} name="{}" ' \
'node_id="{}"/>' \
'node_id="{}" ' \
'serial_number="{}"/>' \
.format(
type(self).__name__,
self.name,
self.node_id)
self.node_id,
self.serial_number)
4 changes: 2 additions & 2 deletions pyvlx/on_off_switch.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
class OnOffSwitch(Node):
"""Class for controlling on-off switches."""

def __init__(self, pyvlx, node_id, name):
def __init__(self, pyvlx, node_id, name, serial_number):
"""Initialize opening device."""
super().__init__(pyvlx=pyvlx, node_id=node_id, name=name)
super().__init__(pyvlx=pyvlx, node_id=node_id, name=name, serial_number=serial_number)
self.parameter = SwitchParameter()

async def set_state(self, parameter):
Expand Down
6 changes: 4 additions & 2 deletions pyvlx/opening_device.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,11 +100,13 @@ def __init__(self, pyvlx, node_id, name, serial_number, rain_sensor=False):
def __str__(self):
"""Return object as readable string."""
return '<{} name="{}" ' \
'node_id="{}" rain_sensor={}/>' \
'node_id="{}" rain_sensor={} ' \
'serial_number="{}"/>' \
.format(
type(self).__name__,
self.name,
self.node_id, self.rain_sensor)
self.node_id, self.rain_sensor,
self.serial_number)


class Blind(OpeningDevice):
Expand Down
12 changes: 6 additions & 6 deletions test/lightening_device_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,19 @@ class TestLighteningDevice(unittest.TestCase):
def test_light_str(self):
"""Test string representation of Light object."""
pyvlx = PyVLX()
light = Light(pyvlx=pyvlx, node_id=23, name='Test Light')
self.assertEqual(str(light), '<Light name="Test Light" node_id="23"/>')
light = Light(pyvlx=pyvlx, node_id=23, name='Test Light', serial_number='aa:bb:aa:bb:aa:bb:aa:23')
self.assertEqual(str(light), '<Light name="Test Light" node_id="23" serial_number="aa:bb:aa:bb:aa:bb:aa:23"/>')

def test_eq(self):
"""Testing eq method with positive results."""
pyvlx = PyVLX()
node1 = Light(pyvlx=pyvlx, node_id=23, name='xxx')
node2 = Light(pyvlx=pyvlx, node_id=23, name='xxx')
node1 = Light(pyvlx=pyvlx, node_id=23, name='xxx', serial_number='aa:bb:aa:bb:aa:bb:aa:23')
node2 = Light(pyvlx=pyvlx, node_id=23, name='xxx', serial_number='aa:bb:aa:bb:aa:bb:aa:23')
self.assertEqual(node1, node2)

def test_nq(self):
"""Testing eq method with negative results."""
pyvlx = PyVLX()
node1 = Light(pyvlx=pyvlx, node_id=23, name='xxx')
node2 = Light(pyvlx=pyvlx, node_id=24, name='xxx')
node1 = Light(pyvlx=pyvlx, node_id=23, name='xxx', serial_number='aa:bb:aa:bb:aa:bb:aa:23')
node2 = Light(pyvlx=pyvlx, node_id=24, name='xxx', serial_number='aa:bb:aa:bb:aa:bb:aa:23')
self.assertNotEqual(node1, node2)
22 changes: 15 additions & 7 deletions test/node_helper_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,66 +18,73 @@ def test_window(self):
frame.node_id = 23
frame.name = "Fnord23"
frame.node_type = NodeTypeWithSubtype.WINDOW_OPENER
frame.serial_number = bytes.fromhex('aa bb aa bb aa bb aa 23')
pyvlx = PyVLX()
node = convert_frame_to_node(pyvlx, frame)
self.assertEqual(node, Window(pyvlx=pyvlx, name="Fnord23", node_id=23))
self.assertEqual(node, Window(pyvlx=pyvlx, name="Fnord23", node_id=23, serial_number='aa:bb:aa:bb:aa:bb:aa:23'))

def test_window_with_rain_sensor(self):
"""Test convert_frame_to_node with window with rain sensor."""
frame = FrameGetNodeInformationNotification()
frame.node_id = 23
frame.name = "Fnord23"
frame.node_type = NodeTypeWithSubtype.WINDOW_OPENER_WITH_RAIN_SENSOR
frame.serial_number = bytes.fromhex('aa bb aa bb aa bb aa 23')
pyvlx = PyVLX()
node = convert_frame_to_node(pyvlx, frame)
self.assertEqual(node, Window(pyvlx=pyvlx, name="Fnord23", node_id=23, rain_sensor=True))
self.assertEqual(node, Window(pyvlx=pyvlx, name="Fnord23", node_id=23, rain_sensor=True, serial_number='aa:bb:aa:bb:aa:bb:aa:23'))

def test_blind(self):
"""Test convert_frame_to_node with blind."""
frame = FrameGetNodeInformationNotification()
frame.node_id = 23
frame.name = "Fnord23"
frame.node_type = NodeTypeWithSubtype.INTERIOR_VENETIAN_BLIND
frame.serial_number = bytes.fromhex('aa bb aa bb aa bb aa 23')
pyvlx = PyVLX()
node = convert_frame_to_node(pyvlx, frame)
self.assertEqual(node, Blind(pyvlx=pyvlx, name="Fnord23", node_id=23))
self.assertEqual(node, Blind(pyvlx=pyvlx, name="Fnord23", node_id=23, serial_number='aa:bb:aa:bb:aa:bb:aa:23'))

def test_roller_shutter(self):
"""Test convert_frame_to_node roller shutter."""
frame = FrameGetNodeInformationNotification()
frame.node_id = 23
frame.name = "Fnord23"
frame.node_type = NodeTypeWithSubtype.ROLLER_SHUTTER
frame.serial_number = bytes.fromhex('aa bb aa bb aa bb aa 23')
pyvlx = PyVLX()
node = convert_frame_to_node(pyvlx, frame)
self.assertEqual(node, RollerShutter(pyvlx=pyvlx, name="Fnord23", node_id=23))
self.assertEqual(node, RollerShutter(pyvlx=pyvlx, name="Fnord23", node_id=23, serial_number='aa:bb:aa:bb:aa:bb:aa:23'))

def test_garage_door(self):
"""Test convert_frame_to_node garage door."""
frame = FrameGetNodeInformationNotification()
frame.node_id = 23
frame.name = "Fnord23"
frame.node_type = NodeTypeWithSubtype.GARAGE_DOOR_OPENER
frame.serial_number = bytes.fromhex('aa bb aa bb aa bb aa 23')
pyvlx = PyVLX()
node = convert_frame_to_node(pyvlx, frame)
self.assertEqual(node, GarageDoor(pyvlx=pyvlx, name="Fnord23", node_id=23))
self.assertEqual(node, GarageDoor(pyvlx=pyvlx, name="Fnord23", node_id=23, serial_number='aa:bb:aa:bb:aa:bb:aa:23'))

def test_blade(self):
"""Test convert_frame_to_node blade."""
frame = FrameGetNodeInformationNotification()
frame.node_id = 23
frame.name = "Fnord23"
frame.node_type = NodeTypeWithSubtype.BLADE_OPENER
frame.serial_number = bytes.fromhex('aa bb aa bb aa bb aa 23')
pyvlx = PyVLX()
node = convert_frame_to_node(pyvlx, frame)
self.assertEqual(node, Blade(pyvlx=pyvlx, name="Fnord23", node_id=23))
self.assertEqual(node, Blade(pyvlx=pyvlx, name="Fnord23", node_id=23, serial_number='aa:bb:aa:bb:aa:bb:aa:23'))

def test_no_type(self):
"""Test convert_frame_to_node with no type (convert_frame_to_node should return None)."""
frame = FrameGetNodeInformationNotification()
frame.node_id = 23
frame.name = "Fnord23"
frame.node_type = NodeTypeWithSubtype.NO_TYPE
frame.serial_number = bytes.fromhex('aa bb aa bb aa bb aa 23')
pyvlx = PyVLX()
self.assertEqual(convert_frame_to_node(pyvlx, frame), None)

Expand All @@ -87,6 +94,7 @@ def test_light(self):
frame.node_id = 23
frame.name = "Fnord23"
frame.node_type = NodeTypeWithSubtype.LIGHT
frame.serial_number = bytes.fromhex('aa bb aa bb aa bb aa 23')
pyvlx = PyVLX()
node = convert_frame_to_node(pyvlx, frame)
self.assertEqual(node, Light(pyvlx=pyvlx, name="Fnord23", node_id=23))
self.assertEqual(node, Light(pyvlx=pyvlx, name="Fnord23", node_id=23, serial_number='aa:bb:aa:bb:aa:bb:aa:23'))
38 changes: 19 additions & 19 deletions test/nodes_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@ def test_get_item(self):
"""Test get_item."""
pyvlx = PyVLX()
nodes = Nodes(pyvlx)
window = Window(pyvlx, 0, 'Window')
window = Window(pyvlx, 0, 'Window', 'aa:bb:aa:bb:aa:bb:aa:00')
nodes.add(window)
blind = Blind(pyvlx, 1, 'Blind')
blind = Blind(pyvlx, 1, 'Blind', 'aa:bb:aa:bb:aa:bb:aa:01')
nodes.add(blind)
roller_shutter = RollerShutter(pyvlx, 4, 'Roller Shutter')
roller_shutter = RollerShutter(pyvlx, 4, 'Roller Shutter', 'aa:bb:aa:bb:aa:bb:aa:04')
nodes.add(roller_shutter)
self.assertEqual(nodes['Window'], window)
self.assertEqual(nodes['Blind'], blind)
Expand All @@ -30,7 +30,7 @@ def test_get_item_failed(self):
"""Test get_item with non existing object."""
pyvlx = PyVLX()
nodes = Nodes(pyvlx)
window1 = Window(pyvlx, 0, 'Window_1')
window1 = Window(pyvlx, 0, 'Window_1', 'aa:bb:aa:bb:aa:bb:aa:00')
nodes.add(window1)
with self.assertRaises(KeyError):
nodes['Window_2'] # pylint: disable=pointless-statement
Expand All @@ -41,9 +41,9 @@ def test_contains_item(self):
"""Test contains operator."""
pyvlx = PyVLX()
nodes = Nodes(pyvlx)
window1 = Window(pyvlx, 23, 'Window_1')
window1 = Window(pyvlx, 23, 'Window_1', 'aa:bb:aa:bb:aa:bb:aa:23')
nodes.add(window1)
window2 = Window(pyvlx, 42, 'Window_2') # not added
window2 = Window(pyvlx, 42, 'Window_2', 'aa:bb:aa:bb:aa:bb:aa:42') # not added
self.assertTrue('Window_1' in nodes)
self.assertTrue(23 in nodes)
self.assertTrue(window1 in nodes)
Expand All @@ -55,11 +55,11 @@ def test_iter(self):
"""Test iterator."""
pyvlx = PyVLX()
nodes = Nodes(pyvlx)
window1 = Window(pyvlx, 0, 'Window_1')
window1 = Window(pyvlx, 0, 'Window_1', 'aa:bb:aa:bb:aa:bb:aa:00')
nodes.add(window1)
window2 = Window(pyvlx, 1, 'Window_2')
window2 = Window(pyvlx, 1, 'Window_2', 'aa:bb:aa:bb:aa:bb:aa:01')
nodes.add(window2)
window3 = Window(pyvlx, 2, 'Window_3')
window3 = Window(pyvlx, 2, 'Window_3', 'aa:bb:aa:bb:aa:bb:aa:02')
nodes.add(window3)
self.assertEqual(
tuple(nodes.__iter__()),
Expand All @@ -70,21 +70,21 @@ def test_len(self):
pyvlx = PyVLX()
nodes = Nodes(pyvlx)
self.assertEqual(len(nodes), 0)
nodes.add(Window(pyvlx, 0, 'Window_1'))
nodes.add(Window(pyvlx, 1, 'Window_2'))
nodes.add(Window(pyvlx, 2, 'Window_3'))
nodes.add(Window(pyvlx, 3, 'Window_4'))
nodes.add(Window(pyvlx, 0, 'Window_1', 'aa:bb:aa:bb:aa:bb:aa:00'))
nodes.add(Window(pyvlx, 1, 'Window_2', 'aa:bb:aa:bb:aa:bb:aa:01'))
nodes.add(Window(pyvlx, 2, 'Window_3', 'aa:bb:aa:bb:aa:bb:aa:02'))
nodes.add(Window(pyvlx, 3, 'Window_4', 'aa:bb:aa:bb:aa:bb:aa:03'))
self.assertEqual(len(nodes), 4)

def test_add_same_object(self):
"""Test adding object with same node_id."""
pyvlx = PyVLX()
nodes = Nodes(pyvlx)
self.assertEqual(len(nodes), 0)
nodes.add(Window(pyvlx, 0, 'Window_1'))
nodes.add(Window(pyvlx, 1, 'Window_2'))
nodes.add(Window(pyvlx, 2, 'Window_3'))
nodes.add(Window(pyvlx, 1, 'Window_2_same_id'))
nodes.add(Window(pyvlx, 0, 'Window_1', 'aa:bb:aa:bb:aa:bb:aa:00'))
nodes.add(Window(pyvlx, 1, 'Window_2', 'aa:bb:aa:bb:aa:bb:aa:01'))
nodes.add(Window(pyvlx, 2, 'Window_3', 'aa:bb:aa:bb:aa:bb:aa:02'))
nodes.add(Window(pyvlx, 1, 'Window_2_same_id', 'aa:bb:aa:bb:aa:bb:aa:01'))
self.assertEqual(len(nodes), 3)
self.assertEqual(nodes[1].name, 'Window_2_same_id')

Expand All @@ -102,7 +102,7 @@ def test_clear(self):
pyvlx = PyVLX()
nodes = Nodes(pyvlx)
self.assertEqual(len(nodes), 0)
nodes.add(Window(pyvlx, 0, 'Window_1'))
nodes.add(Window(pyvlx, 1, 'Window_2'))
nodes.add(Window(pyvlx, 0, 'Window_1', 'aa:bb:aa:bb:aa:bb:aa:00'))
nodes.add(Window(pyvlx, 1, 'Window_2', 'aa:bb:aa:bb:aa:bb:aa:01'))
nodes.clear()
self.assertEqual(len(nodes), 0)
26 changes: 13 additions & 13 deletions test/opening_device_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,40 +11,40 @@ class TestOpeningDevice(unittest.TestCase):
def test_window_str(self):
"""Test string representation of Window object."""
pyvlx = PyVLX()
window = Window(pyvlx=pyvlx, node_id=23, name='Test Window', rain_sensor=True)
self.assertEqual(str(window), '<Window name="Test Window" node_id="23" rain_sensor=True/>')
window = Window(pyvlx=pyvlx, node_id=23, name='Test Window', rain_sensor=True, serial_number='aa:bb:aa:bb:aa:bb:aa:23')
self.assertEqual(str(window), '<Window name="Test Window" node_id="23" rain_sensor=True serial_number="aa:bb:aa:bb:aa:bb:aa:23"/>')

def test_blind_str(self):
"""Test string representation of Blind object."""
pyvlx = PyVLX()
blind = Blind(pyvlx=pyvlx, node_id=23, name='Test Blind')
self.assertEqual(str(blind), '<Blind name="Test Blind" node_id="23"/>')
blind = Blind(pyvlx=pyvlx, node_id=23, name='Test Blind', serial_number='aa:bb:aa:bb:aa:bb:aa:23')
self.assertEqual(str(blind), '<Blind name="Test Blind" node_id="23" serial_number="aa:bb:aa:bb:aa:bb:aa:23"/>')

def test_roller_shutter_str(self):
"""Test string representation of RolllerShutter object."""
pyvlx = PyVLX()
roller_shutter = RollerShutter(pyvlx=pyvlx, node_id=23, name='Test Roller Shutter')
self.assertEqual(str(roller_shutter), '<RollerShutter name="Test Roller Shutter" node_id="23"/>')
roller_shutter = RollerShutter(pyvlx=pyvlx, node_id=23, name='Test Roller Shutter', serial_number='aa:bb:aa:bb:aa:bb:aa:23')
self.assertEqual(str(roller_shutter), '<RollerShutter name="Test Roller Shutter" node_id="23" serial_number="aa:bb:aa:bb:aa:bb:aa:23"/>')

def test_blade_str(self):
"""Test string representation of Blade object."""
pyvlx = PyVLX()
blade = Blade(pyvlx=pyvlx, node_id=23, name='Test Blade')
self.assertEqual(str(blade), '<Blade name="Test Blade" node_id="23"/>')
blade = Blade(pyvlx=pyvlx, node_id=23, name='Test Blade', serial_number='aa:bb:aa:bb:aa:bb:aa:23')
self.assertEqual(str(blade), '<Blade name="Test Blade" node_id="23" serial_number="aa:bb:aa:bb:aa:bb:aa:23"/>')

def test_eq(self):
"""Testing eq method with positive results."""
pyvlx = PyVLX()
node1 = Blind(pyvlx=pyvlx, node_id=23, name='xxx')
node2 = Blind(pyvlx=pyvlx, node_id=23, name='xxx')
node1 = Blind(pyvlx=pyvlx, node_id=23, name='xxx', serial_number='aa:bb:aa:bb:aa:bb:aa:23')
node2 = Blind(pyvlx=pyvlx, node_id=23, name='xxx', serial_number='aa:bb:aa:bb:aa:bb:aa:23')
self.assertEqual(node1, node2)

def test_nq(self):
"""Testing eq method with negative results."""
pyvlx = PyVLX()
node1 = Blind(pyvlx=pyvlx, node_id=23, name='xxx')
node2 = Blind(pyvlx=pyvlx, node_id=24, name='xxx')
node3 = RollerShutter(pyvlx=pyvlx, node_id=23, name='xxx')
node1 = Blind(pyvlx=pyvlx, node_id=23, name='xxx', serial_number='aa:bb:aa:bb:aa:bb:aa:23')
node2 = Blind(pyvlx=pyvlx, node_id=24, name='xxx', serial_number='aa:bb:aa:bb:aa:bb:aa:24')
node3 = RollerShutter(pyvlx=pyvlx, node_id=23, name='xxx', serial_number='aa:bb:aa:bb:aa:bb:aa:23')
self.assertNotEqual(node1, node2)
self.assertNotEqual(node2, node3)
self.assertNotEqual(node3, node1)

5 comments on commit f778af5

@pawlizio
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this work? My KLF just sends empty serial_numbers for somfy devices which results that I only have one valid serial number for all of my devices. Just one is shown in HA.

@tschamm
Copy link
Contributor Author

@tschamm tschamm commented on f778af5 May 3, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi, it works for velux devices at least.

Can you provide a dump of a FrameGetAllNodesInformationNotification call, e.g. by executing examples/monitor.py?
If somfy won't provide serial numbers, perhaps a fallback could be to generate unique information from combination of product_group, product_type and node_id.

@pawlizio
Copy link
Collaborator

@pawlizio pawlizio commented on f778af5 May 3, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi, attached is a dump of monitor.py:
As you can see, all devices have serial_number='00:00:00:00:00:00:00:00'

$ env DEBUGPY_LAUNCHER_PORT=55301 C:\\Python\\Python38-32\\python.exe c:\\Users\\Paul\\.vscode\\extensions\\ms-python.python-2020.4.76186\\pythonFiles\\lib\\python\\debugpy\\no_wheels\\debugpy\\launcher c:\\Users\\Paul\\Development\\p
yvlx\\examples\\monitor.py
Reading config file: pyvlx.yaml
Connecting to KLF 200.
SEND: <FramePasswordEnterRequest password=BD****/>
REC: <FramePasswordEnterConfirmation status='PasswordEnterConfirmationStatus.SUCCESSFUL'/>
SEND: <FrameGetVersionRequest/>
REC: <FrameGetVersionConfirmation software_version="0.2.0.0.71.0" harware_version="6" product="KLF 200"/>
SEND: <FrameGetProtocolVersionRequest/>
REC: <FrameGetProtocolVersionConfirmation version="3.14"/>
Connected to: KLF 200: Software version: 0.2.0.0.71.0, hardware version: 6, protocol version: 3.14
SEND: <FrameSetUTCRequest time="2020-05-03 21:15:18"/>
REC: <FrameSetUTCConfirmation/>
SEND: <FrameHouseStatusMonitorEnableRequest/>
REC: <FrameHouseStatusMonitorEnableConfirmation/>
SEND: <FrameGetSceneListRequest/>
REC: <FrameGetSceneListConfirmation count_scenes=0/>
SEND: <FrameGetAllNodesInformationRequest/>
REC: <FrameGetAllNodesInformationConfirmation status='AllNodesInformationStatus.OK' number_of_nodes=11/>
REC: <FrameGetAllNodesInformationNotification node_id=0 order=0 placement=0 name='Rollladen WC' velocity=Velocity.SILENT node_type='NodeTypeWithSubtype.ROLLER_SHUTTER' product_group=0 product_type=0 node_variation=NodeVariation.NOT_SET
power_mode=0 build_number=0 serial_number='00:00:00:00:00:00:00:00' state=5 current_position='0x0000' target='0x0000' current_position_fp1='0xF7FF' current_position_fp2='0xF7FF' current_position_fp3='0xF7FF' current_position_fp4='0xF7FF' remaining_time=0 time='2020-05-03 21:15:19' alias_array=''/>
--- Logging error ---
Traceback (most recent call last):
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 1081, in emit
    msg = self.format(record)
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 925, in format
    return fmt.format(record)
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 664, in format
    record.message = record.getMessage()
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 369, in getMessage
    msg = msg % self.args
TypeError: %d format: a number is required, not FrameGetAllNodesInformationNotification
Call stack:
  File "c:\Users\Paul\Development\pyvlx\examples\monitor.py", line 33, in <module>
    LOOP.run_until_complete(main(LOOP))
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 603, in run_until_complete
    self.run_forever()
  File "C:\Python\Python38-32\lib\asyncio\windows_events.py", line 316, in run_forever
    super().run_forever()
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 570, in run_forever
    self._run_once()
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 1859, in _run_once
    handle._run()
  File "C:\Python\Python38-32\lib\asyncio\events.py", line 81, in _run
    self._context.run(self._callback, *self._args)
  File "C:\Users\Paul\Development\pyvlx\pyvlx\node_updater.py", line 21, in process_frame
    PYVLXLOG.debug("NodeUpdater process frame: %d", frame)
Message: 'NodeUpdater process frame: %d'
Arguments: (<pyvlx.frames.frame_get_all_nodes_information.FrameGetAllNodesInformationNotification object at 0x03D455B0>,)
REC: <FrameGetAllNodesInformationNotification node_id=1 order=1 placement=0 name='Rollladen Kinderzimmer' velocity=Velocity.SILENT node_type='NodeTypeWithSubtype.ROLLER_SHUTTER' product_group=0 product_type=0 node_variation=NodeVariation.NOT_SET power_mode=0 build_number=0 serial_number='00:00:00:00:00:00:00:00' state=5 current_position='0x0000' target='0x0000' current_position_fp1='0xF7FF' current_position_fp2='0xF7FF' current_position_fp3='0xF7FF' current_position_fp4='0xF7FF' remaining_time=0 time='2020-05-03 21:15:19' alias_array=''/>
--- Logging error ---
Traceback (most recent call last):
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 1081, in emit
    msg = self.format(record)
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 925, in format
    return fmt.format(record)
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 664, in format
    record.message = record.getMessage()
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 369, in getMessage
    msg = msg % self.args
TypeError: %d format: a number is required, not FrameGetAllNodesInformationNotification
Call stack:
  File "c:\Users\Paul\Development\pyvlx\examples\monitor.py", line 33, in <module>
    LOOP.run_until_complete(main(LOOP))
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 603, in run_until_complete
    self.run_forever()
  File "C:\Python\Python38-32\lib\asyncio\windows_events.py", line 316, in run_forever
    super().run_forever()
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 570, in run_forever
    self._run_once()
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 1859, in _run_once
    handle._run()
  File "C:\Python\Python38-32\lib\asyncio\events.py", line 81, in _run
    self._context.run(self._callback, *self._args)
  File "C:\Users\Paul\Development\pyvlx\pyvlx\node_updater.py", line 21, in process_frame
    PYVLXLOG.debug("NodeUpdater process frame: %d", frame)
Message: 'NodeUpdater process frame: %d'
Arguments: (<pyvlx.frames.frame_get_all_nodes_information.FrameGetAllNodesInformationNotification object at 0x03D45700>,)
REC: <FrameGetAllNodesInformationNotification node_id=2 order=2 placement=0 name='Raffstore Wohnzimmer Mitte' velocity=Velocity.SILENT node_type='NodeTypeWithSubtype.EXTERIOR_VENETIAN_BLIND' product_group=0 product_type=0 node_variation=NodeVariation.NOT_SET power_mode=0 build_number=0 serial_number='00:00:00:00:00:00:00:00' state=5 current_position='0xC800' target='0xC800' current_position_fp1='0xF7FF' current_position_fp2='0xF7FF' current_position_fp3='0xF7FF' current_position_fp4='0xF7FF' remaining_time=0 time='2020-05-03 21:15:19' alias_array=''/>
--- Logging error ---
Traceback (most recent call last):
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 1081, in emit
    msg = self.format(record)
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 925, in format
    return fmt.format(record)
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 664, in format
    record.message = record.getMessage()
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 369, in getMessage
    msg = msg % self.args
TypeError: %d format: a number is required, not FrameGetAllNodesInformationNotification
Call stack:
  File "c:\Users\Paul\Development\pyvlx\examples\monitor.py", line 33, in <module>
    LOOP.run_until_complete(main(LOOP))
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 603, in run_until_complete
    self.run_forever()
  File "C:\Python\Python38-32\lib\asyncio\windows_events.py", line 316, in run_forever
    super().run_forever()
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 570, in run_forever
    self._run_once()
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 1859, in _run_once
    handle._run()
  File "C:\Python\Python38-32\lib\asyncio\events.py", line 81, in _run
    self._context.run(self._callback, *self._args)
  File "C:\Users\Paul\Development\pyvlx\pyvlx\node_updater.py", line 21, in process_frame
    PYVLXLOG.debug("NodeUpdater process frame: %d", frame)
Message: 'NodeUpdater process frame: %d'
Arguments: (<pyvlx.frames.frame_get_all_nodes_information.FrameGetAllNodesInformationNotification object at 0x03D45AC0>,)
REC: <FrameGetAllNodesInformationNotification node_id=3 order=3 placement=0 name='Raffstore Wohnzimmer Rechts' velocity=Velocity.SILENT node_type='NodeTypeWithSubtype.EXTERIOR_VENETIAN_BLIND' product_group=0 product_type=0 node_variation=NodeVariation.NOT_SET power_mode=0 build_number=0 serial_number='00:00:00:00:00:00:00:00' state=5 current_position='0xC800' target='0xC800' current_position_fp1='0xF7FF' current_position_fp2='0xF7FF' current_position_fp3='0xF7FF' current_position_fp4='0xF7FF' remaining_time=0 time='2020-05-03 21:15:19' alias_array=''/>
--- Logging error ---
Traceback (most recent call last):
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 1081, in emit
    msg = self.format(record)
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 925, in format
    return fmt.format(record)
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 664, in format
    record.message = record.getMessage()
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 369, in getMessage
    msg = msg % self.args
TypeError: %d format: a number is required, not FrameGetAllNodesInformationNotification
Call stack:
  File "c:\Users\Paul\Development\pyvlx\examples\monitor.py", line 33, in <module>
    LOOP.run_until_complete(main(LOOP))
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 603, in run_until_complete
    self.run_forever()
  File "C:\Python\Python38-32\lib\asyncio\windows_events.py", line 316, in run_forever
    super().run_forever()
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 570, in run_forever
    self._run_once()
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 1859, in _run_once
    handle._run()
  File "C:\Python\Python38-32\lib\asyncio\events.py", line 81, in _run
    self._context.run(self._callback, *self._args)
  File "C:\Users\Paul\Development\pyvlx\pyvlx\node_updater.py", line 21, in process_frame
    PYVLXLOG.debug("NodeUpdater process frame: %d", frame)
Message: 'NodeUpdater process frame: %d'
Arguments: (<pyvlx.frames.frame_get_all_nodes_information.FrameGetAllNodesInformationNotification object at 0x03D45D48>,)
REC: <FrameGetAllNodesInformationNotification node_id=4 order=4 placement=0 name='Rollladen Schlafzimmer' velocity=Velocity.SILENT node_type='NodeTypeWithSubtype.ROLLER_SHUTTER' product_group=0 product_type=0 node_variation=NodeVariation.NOT_SET power_mode=0 build_number=0 serial_number='00:00:00:00:00:00:00:00' state=5 current_position='0x0000' target='0x0000' current_position_fp1='0xF7FF' current_position_fp2='0xF7FF' current_position_fp3='0xF7FF' current_position_fp4='0xF7FF' remaining_time=0 time='2020-05-03 21:15:19' alias_array=''/>
--- Logging error ---
Traceback (most recent call last):
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 1081, in emit
    msg = self.format(record)
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 925, in format
    return fmt.format(record)
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 664, in format
    record.message = record.getMessage()
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 369, in getMessage
    msg = msg % self.args
TypeError: %d format: a number is required, not FrameGetAllNodesInformationNotification
Call stack:
  File "c:\Users\Paul\Development\pyvlx\examples\monitor.py", line 33, in <module>
    LOOP.run_until_complete(main(LOOP))
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 603, in run_until_complete
    self.run_forever()
  File "C:\Python\Python38-32\lib\asyncio\windows_events.py", line 316, in run_forever
    super().run_forever()
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 570, in run_forever
    self._run_once()
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 1859, in _run_once
    handle._run()
  File "C:\Python\Python38-32\lib\asyncio\events.py", line 81, in _run
    self._context.run(self._callback, *self._args)
  File "C:\Users\Paul\Development\pyvlx\pyvlx\node_updater.py", line 21, in process_frame
    PYVLXLOG.debug("NodeUpdater process frame: %d", frame)
Message: 'NodeUpdater process frame: %d'
Arguments: (<pyvlx.frames.frame_get_all_nodes_information.FrameGetAllNodesInformationNotification object at 0x03D45FD0>,)
REC: <FrameGetAllNodesInformationNotification node_id=5 order=5 placement=0 name='Raffstore Esszimmer' velocity=Velocity.SILENT node_type='NodeTypeWithSubtype.EXTERIOR_VENETIAN_BLIND' product_group=0 product_type=0 node_variation=NodeVariation.NOT_SET power_mode=0 build_number=0 serial_number='00:00:00:00:00:00:00:00' state=5 current_position='0xC800' target='0xC800' current_position_fp1='0xF7FF' current_position_fp2='0xF7FF' current_position_fp3='0xF7FF' current_position_fp4='0xF7FF' remaining_time=0 time='2020-05-03 21:15:19' alias_array=''/>
--- Logging error ---
Traceback (most recent call last):
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 1081, in emit
    msg = self.format(record)
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 925, in format
    return fmt.format(record)
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 664, in format
    record.message = record.getMessage()
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 369, in getMessage
    msg = msg % self.args
TypeError: %d format: a number is required, not FrameGetAllNodesInformationNotification
Call stack:
  File "c:\Users\Paul\Development\pyvlx\examples\monitor.py", line 33, in <module>
    LOOP.run_until_complete(main(LOOP))
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 603, in run_until_complete
    self.run_forever()
  File "C:\Python\Python38-32\lib\asyncio\windows_events.py", line 316, in run_forever
    super().run_forever()
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 570, in run_forever
    self._run_once()
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 1859, in _run_once
    handle._run()
  File "C:\Python\Python38-32\lib\asyncio\events.py", line 81, in _run
    self._context.run(self._callback, *self._args)
  File "C:\Users\Paul\Development\pyvlx\pyvlx\node_updater.py", line 21, in process_frame
    PYVLXLOG.debug("NodeUpdater process frame: %d", frame)
Message: 'NodeUpdater process frame: %d'
Arguments: (<pyvlx.frames.frame_get_all_nodes_information.FrameGetAllNodesInformationNotification object at 0x044472B0>,)
REC: <FrameGetAllNodesInformationNotification node_id=6 order=6 placement=0 name='Rollladen Küche' velocity=Velocity.SILENT node_type='NodeTypeWithSubtype.ROLLER_SHUTTER' product_group=0 product_type=0 node_variation=NodeVariation.NOT_SET power_mode=0 build_number=0 serial_number='00:00:00:00:00:00:00:00' state=5 current_position='0x0000' target='0x0000' current_position_fp1='0xF7FF' current_position_fp2='0xF7FF' current_position_fp3='0xF7FF' current_position_fp4='0xF7FF' remaining_time=0 time='2020-05-03 21:15:19' alias_array=''/>
--- Logging error ---
Traceback (most recent call last):
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 1081, in emit
    msg = self.format(record)
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 925, in format
    return fmt.format(record)
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 664, in format
    record.message = record.getMessage()
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 369, in getMessage
    msg = msg % self.args
TypeError: %d format: a number is required, not FrameGetAllNodesInformationNotification
Call stack:
  File "c:\Users\Paul\Development\pyvlx\examples\monitor.py", line 33, in <module>
    LOOP.run_until_complete(main(LOOP))
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 603, in run_until_complete
    self.run_forever()
  File "C:\Python\Python38-32\lib\asyncio\windows_events.py", line 316, in run_forever
    super().run_forever()
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 570, in run_forever
    self._run_once()
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 1859, in _run_once
    handle._run()
  File "C:\Python\Python38-32\lib\asyncio\events.py", line 81, in _run
    self._context.run(self._callback, *self._args)
  File "C:\Users\Paul\Development\pyvlx\pyvlx\node_updater.py", line 21, in process_frame
    PYVLXLOG.debug("NodeUpdater process frame: %d", frame)
Message: 'NodeUpdater process frame: %d'
Arguments: (<pyvlx.frames.frame_get_all_nodes_information.FrameGetAllNodesInformationNotification object at 0x044474D8>,)
REC: <FrameGetAllNodesInformationNotification node_id=7 order=7 placement=0 name='Rollladen Arbeitszimmer' velocity=Velocity.SILENT node_type='NodeTypeWithSubtype.ROLLER_SHUTTER' product_group=0 product_type=0 node_variation=NodeVariation.NOT_SET power_mode=0 build_number=0 serial_number='00:00:00:00:00:00:00:00' state=5 current_position='0x0000' target='0x0000' current_position_fp1='0xF7FF' current_position_fp2='0xF7FF' current_position_fp3='0xF7FF' current_position_fp4='0xF7FF' remaining_time=0 time='2020-05-03 21:15:19' alias_array=''/>
--- Logging error ---
Traceback (most recent call last):
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 1081, in emit
    msg = self.format(record)
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 925, in format
    return fmt.format(record)
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 664, in format
    record.message = record.getMessage()
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 369, in getMessage
    msg = msg % self.args
TypeError: %d format: a number is required, not FrameGetAllNodesInformationNotification
Call stack:
  File "c:\Users\Paul\Development\pyvlx\examples\monitor.py", line 33, in <module>
    LOOP.run_until_complete(main(LOOP))
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 603, in run_until_complete
    self.run_forever()
  File "C:\Python\Python38-32\lib\asyncio\windows_events.py", line 316, in run_forever
    super().run_forever()
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 570, in run_forever
    self._run_once()
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 1859, in _run_once
    handle._run()
  File "C:\Python\Python38-32\lib\asyncio\events.py", line 81, in _run
    self._context.run(self._callback, *self._args)
  File "C:\Users\Paul\Development\pyvlx\pyvlx\node_updater.py", line 21, in process_frame
    PYVLXLOG.debug("NodeUpdater process frame: %d", frame)
Message: 'NodeUpdater process frame: %d'
Arguments: (<pyvlx.frames.frame_get_all_nodes_information.FrameGetAllNodesInformationNotification object at 0x04447718>,)
REC: <FrameGetAllNodesInformationNotification node_id=8 order=8 placement=0 name='Rollladen Fernsehzimmer' velocity=Velocity.SILENT node_type='NodeTypeWithSubtype.ROLLER_SHUTTER' product_group=0 product_type=0 node_variation=NodeVariation.NOT_SET power_mode=0 build_number=0 serial_number='00:00:00:00:00:00:00:00' state=5 current_position='0x0000' target='0x0000' current_position_fp1='0xF7FF' current_position_fp2='0xF7FF' current_position_fp3='0xF7FF' current_position_fp4='0xF7FF' remaining_time=0 time='2020-05-03 21:15:19' alias_array=''/>
--- Logging error ---
Traceback (most recent call last):
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 1081, in emit
    msg = self.format(record)
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 925, in format
    return fmt.format(record)
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 664, in format
    record.message = record.getMessage()
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 369, in getMessage
    msg = msg % self.args
TypeError: %d format: a number is required, not FrameGetAllNodesInformationNotification
Call stack:
  File "c:\Users\Paul\Development\pyvlx\examples\monitor.py", line 33, in <module>
    LOOP.run_until_complete(main(LOOP))
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 603, in run_until_complete
    self.run_forever()
  File "C:\Python\Python38-32\lib\asyncio\windows_events.py", line 316, in run_forever
    super().run_forever()
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 570, in run_forever
    self._run_once()
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 1859, in _run_once
    handle._run()
  File "C:\Python\Python38-32\lib\asyncio\events.py", line 81, in _run
    self._context.run(self._callback, *self._args)
  File "C:\Users\Paul\Development\pyvlx\pyvlx\node_updater.py", line 21, in process_frame
    PYVLXLOG.debug("NodeUpdater process frame: %d", frame)
Message: 'NodeUpdater process frame: %d'
Arguments: (<pyvlx.frames.frame_get_all_nodes_information.FrameGetAllNodesInformationNotification object at 0x04447958>,)
REC: <FrameGetAllNodesInformationNotification node_id=9 order=9 placement=0 name='Rollladen Esszimmer' velocity=Velocity.SILENT node_type='NodeTypeWithSubtype.ROLLER_SHUTTER' product_group=0 product_type=0 node_variation=NodeVariation.NOT_SET power_mode=0 build_number=0 serial_number='00:00:00:00:00:00:00:00' state=5 current_position='0x0000' target='0x0000' current_position_fp1='0xF7FF' current_position_fp2='0xF7FF' current_position_fp3='0xF7FF' current_position_fp4='0xF7FF' remaining_time=0 time='2020-05-03 21:15:19' alias_array=''/>
--- Logging error ---
Traceback (most recent call last):
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 1081, in emit
    msg = self.format(record)
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 925, in format
    return fmt.format(record)
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 664, in format
    record.message = record.getMessage()
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 369, in getMessage
    msg = msg % self.args
TypeError: %d format: a number is required, not FrameGetAllNodesInformationNotification
Call stack:
  File "c:\Users\Paul\Development\pyvlx\examples\monitor.py", line 33, in <module>
    LOOP.run_until_complete(main(LOOP))
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 603, in run_until_complete
    self.run_forever()
  File "C:\Python\Python38-32\lib\asyncio\windows_events.py", line 316, in run_forever
    super().run_forever()
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 570, in run_forever
    self._run_once()
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 1859, in _run_once
    handle._run()
  File "C:\Python\Python38-32\lib\asyncio\events.py", line 81, in _run
    self._context.run(self._callback, *self._args)
  File "C:\Users\Paul\Development\pyvlx\pyvlx\node_updater.py", line 21, in process_frame
    PYVLXLOG.debug("NodeUpdater process frame: %d", frame)
Message: 'NodeUpdater process frame: %d'
Arguments: (<pyvlx.frames.frame_get_all_nodes_information.FrameGetAllNodesInformationNotification object at 0x04447B80>,)
REC: <FrameGetAllNodesInformationNotification node_id=10 order=10 placement=0 name='Raffstore Wohnzimmer Links' velocity=Velocity.SILENT node_type='NodeTypeWithSubtype.EXTERIOR_VENETIAN_BLIND' product_group=0 product_type=0 node_variation=NodeVariation.NOT_SET power_mode=0 build_number=0 serial_number='00:00:00:00:00:00:00:00' state=5 current_position='0xC800' target='0xC800' current_position_fp1='0xF7FF' current_position_fp2='0xF7FF' current_position_fp3='0xF7FF' current_position_fp4='0xF7FF' remaining_time=0 time='2020-05-03 21:15:19' alias_array=''/>
--- Logging error ---
Traceback (most recent call last):
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 1081, in emit
    msg = self.format(record)
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 925, in format
    return fmt.format(record)
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 664, in format
    record.message = record.getMessage()
  File "C:\Python\Python38-32\lib\logging\__init__.py", line 369, in getMessage
    msg = msg % self.args
TypeError: %d format: a number is required, not FrameGetAllNodesInformationNotification
Call stack:
  File "c:\Users\Paul\Development\pyvlx\examples\monitor.py", line 33, in <module>
    LOOP.run_until_complete(main(LOOP))
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 603, in run_until_complete
    self.run_forever()
  File "C:\Python\Python38-32\lib\asyncio\windows_events.py", line 316, in run_forever
    super().run_forever()
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 570, in run_forever
    self._run_once()
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 1859, in _run_once
    handle._run()
  File "C:\Python\Python38-32\lib\asyncio\events.py", line 81, in _run
    self._context.run(self._callback, *self._args)
  File "C:\Users\Paul\Development\pyvlx\pyvlx\node_updater.py", line 21, in process_frame
    PYVLXLOG.debug("NodeUpdater process frame: %d", frame)
Message: 'NodeUpdater process frame: %d'
Arguments: (<pyvlx.frames.frame_get_all_nodes_information.FrameGetAllNodesInformationNotification object at 0x04447D90>,)
REC: <FrameGetAllNodesInformationFinishedNotification/>
SEND: <FrameGetStateRequest/>
REC: <FrameGetStateConfirmation gateway_state="GatewayState.GATEWAY_MODE_WITH_ACTUATORS" gateway_sub_state="GatewaySubState.IDLE"/>
Exception ignored in: <function _ProactorBasePipeTransport.__del__ at 0x03C0A3D0>
Traceback (most recent call last):
  File "C:\Python\Python38-32\lib\asyncio\proactor_events.py", line 116, in __del__
    self.close()
  File "C:\Python\Python38-32\lib\asyncio\proactor_events.py", line 108, in close
    self._loop.call_soon(self._call_connection_lost, None)
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 719, in call_soon
    self._check_closed()
  File "C:\Python\Python38-32\lib\asyncio\base_events.py", line 508, in _check_closed
    raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed

@tschamm
Copy link
Contributor Author

@tschamm tschamm commented on f778af5 May 4, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's not only the devices don't provide a valid serial number, but they also don't provide any other product related information. So either we generate a fake serial number, or we never use serial numbers for all devices, even velux.
Any other suggestions?

@Julius2342
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, i would say, we should return None within def serial_number(self): if there is no serial number present.

(not faking any serial number. If we would fake a serial number for HASS purpose this should happen within HASS itself)

Please sign in to comment.