From bbc584cdcf48781b0970c31ec96521f4ac2869a5 Mon Sep 17 00:00:00 2001 From: farmio Date: Thu, 18 Mar 2021 00:30:25 +0100 Subject: [PATCH 1/4] don't raise type error when comparing Addresses to other types --- test/telegram_tests/address_test.py | 13 +++++++------ xknx/telegram/address.py | 11 +++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/test/telegram_tests/address_test.py b/test/telegram_tests/address_test.py index 88338dcebc..60b9b8af5f 100644 --- a/test/telegram_tests/address_test.py +++ b/test/telegram_tests/address_test.py @@ -82,10 +82,10 @@ def test_equal(self): self.assertEqual(IndividualAddress("1.0.0"), IndividualAddress(4096)) self.assertNotEqual(IndividualAddress("1.0.0"), IndividualAddress("1.1.1")) self.assertNotEqual(IndividualAddress("1.0.0"), None) - with self.assertRaises(TypeError): - IndividualAddress( - "1.0.0" - ) == "example" # pylint: disable=expression-not-assigned + self.assertNotEqual(IndividualAddress("1.0.0"), "example") + self.assertNotEqual(IndividualAddress("1.1.1"), GroupAddress("1/1/1")) + self.assertNotEqual(IndividualAddress(250), GroupAddress(250)) + self.assertNotEqual(IndividualAddress(250), 250) def test_representation(self): """Test string representation of address.""" @@ -217,8 +217,9 @@ def test_equal(self): self.assertEqual(GroupAddress("1/0"), GroupAddress(2048)) self.assertNotEqual(GroupAddress("1/1"), GroupAddress("1/1/0")) self.assertNotEqual(GroupAddress("1/0"), None) - with self.assertRaises(TypeError): - GroupAddress("1/0") == "example" # pylint: disable=expression-not-assigned + self.assertNotEqual(GroupAddress("1/0"), "example") + self.assertNotEqual(GroupAddress(1), IndividualAddress(1)) + self.assertNotEqual(GroupAddress(1), 1) def test_representation(self): """Test string representation of address.""" diff --git a/xknx/telegram/address.py b/xknx/telegram/address.py index 0fe058c40e..073a0d7380 100644 --- a/xknx/telegram/address.py +++ b/xknx/telegram/address.py @@ -12,6 +12,7 @@ * 2nd level: "1/2" * Free format: "123" """ +from abc import ABC from enum import Enum from re import compile as re_compile from typing import Optional, Tuple, Union @@ -41,7 +42,7 @@ def address_tuple_to_int(address: Tuple[int, int]) -> int: return int(address[0] * 256 + address[1]) -class BaseAddress: # pylint: disable=too-few-public-methods +class BaseAddress(ABC): """Base class for all knx address types.""" def __init__(self) -> None: @@ -65,11 +66,9 @@ def __eq__(self, other: Optional[object]) -> bool: Returns `False` if we check against `None`. """ - if other is None: - return False - if type(self) is not type(other): - raise TypeError() - return self.__hash__() == other.__hash__() + if isinstance(self, type(other)): + return self.__hash__() == other.__hash__() + return False def __hash__(self) -> int: """Hash Address so it can be used as dict key.""" From 84b1e29a9df0add360ce22de5c8415a8ba80edb5 Mon Sep 17 00:00:00 2001 From: farmio Date: Thu, 18 Mar 2021 00:30:59 +0100 Subject: [PATCH 2/4] call value reader callback for its group address only --- xknx/core/value_reader.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xknx/core/value_reader.py b/xknx/core/value_reader.py index b8a6172917..d02cc40260 100644 --- a/xknx/core/value_reader.py +++ b/xknx/core/value_reader.py @@ -37,7 +37,8 @@ def __init__( async def read(self) -> Optional[Telegram]: """Send group read and wait for response.""" cb_obj = self.xknx.telegram_queue.register_telegram_received_cb( - self.telegram_received + self.telegram_received, + group_addresses=[self.group_address], ) await self.send_group_read() From 0388b3b5326c0cd609be5ef846b56a116a0772d0 Mon Sep 17 00:00:00 2001 From: farmio Date: Thu, 18 Mar 2021 00:42:15 +0100 Subject: [PATCH 3/4] Update changelog.md --- changelog.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/changelog.md b/changelog.md index 2be15a7bc2..eba4d816e9 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,11 @@ # Changelog +## Unreleased changes + +### Internals + +- Comparing GroupAddress or IndividualAddress to other types don't raise TypeError anymore. + ## 0.17.3 Passive addresses 2021-03-16 ### Devices From 541997abb6a12039424dd85d3682df52781f934f Mon Sep 17 00:00:00 2001 From: farmio Date: Thu, 18 Mar 2021 08:12:04 +0100 Subject: [PATCH 4/4] the queue must go on call .task_done() even when the telegram raised an exception while processing --- xknx/core/telegram_queue.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/xknx/core/telegram_queue.py b/xknx/core/telegram_queue.py index 581f527314..f870e87ac5 100644 --- a/xknx/core/telegram_queue.py +++ b/xknx/core/telegram_queue.py @@ -119,15 +119,16 @@ async def _telegram_consumer(self) -> None: self.xknx.telegrams.task_done() break - try: - if telegram.direction == TelegramDirection.INCOMING: + if telegram.direction == TelegramDirection.INCOMING: + try: await self.process_telegram_incoming(telegram) + except XKNXException as ex: + logger.error("Error while processing incoming telegram %s", ex) + finally: self.xknx.telegrams.task_done() - elif telegram.direction == TelegramDirection.OUTGOING: - self.outgoing_queue.put_nowait(telegram) - # self.xknx.telegrams.task_done() for outgoing is called in _outgoing_rate_limiter. - except XKNXException as ex: - logger.error("Error while processing telegram %s", ex) + elif telegram.direction == TelegramDirection.OUTGOING: + self.outgoing_queue.put_nowait(telegram) + # self.xknx.telegrams.task_done() for outgoing is called in _outgoing_rate_limiter. async def _outgoing_rate_limiter(self) -> None: """Endless loop for processing outgoing telegrams."""