From 5a8b92ccb0b0aa431708d58aca385ea280551cc9 Mon Sep 17 00:00:00 2001 From: Bouwe Westerdijk Date: Tue, 10 Mar 2026 10:18:11 +0100 Subject: [PATCH 01/17] Improve relay_init related --- plugwise_usb/messages/requests.py | 12 +++++---- plugwise_usb/nodes/circle.py | 45 ++++++++++++++++++++++++++----- 2 files changed, 45 insertions(+), 12 deletions(-) diff --git a/plugwise_usb/messages/requests.py b/plugwise_usb/messages/requests.py index 63251f11d..374f048f4 100644 --- a/plugwise_usb/messages/requests.py +++ b/plugwise_usb/messages/requests.py @@ -26,6 +26,7 @@ CirclePlusRealTimeClockResponse, CirclePlusScanResponse, CirclePowerUsageResponse, + CircleRelayInitStateResponse, EnergyCalibrationResponse, NodeAckResponse, NodeFeaturesResponse, @@ -1510,11 +1511,12 @@ class CircleRelayInitStateRequest(PlugwiseRequest): """Get or set initial relay state after power-up of Circle. Supported protocols : 2.6 - Response message : NodeAckResponse # CircleInitRelayStateResponse + Response message : NodeAckResponse for set + : CircleInitRelayStateResponse for get """ _identifier = b"0138" # PWCircleGetSetInitialRelaisStateRequestV2_6 - _reply_identifier = b"0100" # b"0139" # PWCircleGetSetInitialRelaisStateReplyV2_6 + _reply_identifier = b"0139" | b"0100" # PWCircleGetSetInitialRelaisStateReplyV2_6 def __init__( self, @@ -1530,13 +1532,13 @@ def __init__( self.relay = Int(1 if relay_state else 0, length=2) self._args += [self.set_or_get, self.relay] - async def send(self) -> NodeAckResponse | None: + async def send(self) -> CircleRelayInitStateResponse | NodeAckResponse | None: """Send request.""" result = await self._send_request() - if isinstance(result, NodeAckResponse): + if isinstance(result, CircleRelayInitStateResponse | NodeAckResponse): return result if result is None: return None raise MessageError( - f"Invalid response message. Received {result.__class__.__name__}, expected NodeAckResponse" + f"Invalid response message. Received {result.__class__.__name__}, expected CircleRelayInitStateResponse or NodeAckResponse" ) diff --git a/plugwise_usb/nodes/circle.py b/plugwise_usb/nodes/circle.py index c9f99fb97..8c451aed0 100644 --- a/plugwise_usb/nodes/circle.py +++ b/plugwise_usb/nodes/circle.py @@ -1140,28 +1140,59 @@ async def _relay_init_get(self) -> bool | None: "Retrieval of initial state of relay is not " + f"supported for device {self.name}" ) + request = CircleRelayInitStateRequest( self._send, self._mac_in_bytes, False, False ) - if (response := await request.send()) is not None: + if (response := await request.send()) is None: + _LOGGER.warning( + "No response from %s to get relay init setting", self._mac_in_str + ) + return None + + if isinstance(response, CircleRelayInitStateResponse): + _LOGGER.debug("Successful get of relay init state for %s", self._mac_in_str) await self._relay_init_update_state(response.relay.value == 1) - return self._relay_config.init_state - return None - async def _relay_init_set(self, state: bool) -> bool | None: + _LOGGER.warning( + "Unexpected response type %s for %s", + response_type, + self._mac_in_str, + ) + return + + async def _relay_init_set(self, state: bool) -> None: """Configure relay init state.""" if NodeFeature.RELAY_INIT not in self._features: raise NodeError( "Configuring of initial state of relay is not" + f"supported for device {self.name}" ) + request = CircleRelayInitStateRequest( self._send, self._mac_in_bytes, True, state ) - if (response := await request.send()) is not None: + if (response := await request.send()) is None: + _LOGGER.warning( + "No response from %s to configure relay init setting", self._mac_in_str + ) + return None + + if response.node_ack_type == NodeAckResponseType.DEFAULT_FAIL: + _LOGGER.warning("Failed to set relay init state for %s", self._mac_in_str) + return None + + if response.node_ack_type == NodeAckResponseType.DEFAULT_ACK: + _LOGGER.debug("Successful set relay init state for %s", self._mac_in_str) await self._relay_init_update_state(response.relay.value == 1) - return self._relay_config.init_state - return None + return + + _LOGGER.warning( + "Unexpected response ack type %s for %s", + response.node_ack_type, + self.name, + ) + return async def _relay_init_load_from_cache(self) -> bool: """Load relay init state from cache. Returns True if retrieval was successful.""" From 21c8eeef2cfe1b28125a124ceef02ed82e8403f7 Mon Sep 17 00:00:00 2001 From: Bouwe Westerdijk Date: Tue, 10 Mar 2026 10:43:28 +0100 Subject: [PATCH 02/17] Handle two _reply_identifiers --- plugwise_usb/messages/requests.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugwise_usb/messages/requests.py b/plugwise_usb/messages/requests.py index 374f048f4..a1367bbd2 100644 --- a/plugwise_usb/messages/requests.py +++ b/plugwise_usb/messages/requests.py @@ -61,6 +61,7 @@ class PlugwiseRequest(PlugwiseMessage): """Base class for request messages to be sent from by USB-Stick.""" _reply_identifier: bytes | None = b"0000" + _reply_identifier_2: bytes | None = None def __init__( self, @@ -175,7 +176,7 @@ async def subscribe_to_response( self._unsubscribe_node_response = await node_subscription_fn( self.process_node_response, self._mac, - (self._reply_identifier,), + (self._reply_identifier, self._reply_identifier_2), self._seq_id, ) @@ -1516,7 +1517,8 @@ class CircleRelayInitStateRequest(PlugwiseRequest): """ _identifier = b"0138" # PWCircleGetSetInitialRelaisStateRequestV2_6 - _reply_identifier = b"0139" | b"0100" # PWCircleGetSetInitialRelaisStateReplyV2_6 + _reply_identifier = b"0139" # PWCircleGetSetInitialRelaisStateReplyV2_6 + _reply_identifier_2 = b"0100" def __init__( self, From 3a6eb94cb3e26c5722d88b365f0f1053243e3dc2 Mon Sep 17 00:00:00 2001 From: autoruff Date: Tue, 10 Mar 2026 09:43:38 +0000 Subject: [PATCH 03/17] fixup: pw-0138-2 Python code fixed using Ruff --- plugwise_usb/connection/__init__.py | 2 +- plugwise_usb/messages/responses.py | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/plugwise_usb/connection/__init__.py b/plugwise_usb/connection/__init__.py index ff17f1400..2ed21cfb4 100644 --- a/plugwise_usb/connection/__init__.py +++ b/plugwise_usb/connection/__init__.py @@ -234,7 +234,7 @@ async def send( return await self._queue.submit(request) try: return await self._queue.submit(request) - except (NodeError, StickError): + except NodeError, StickError: return None def _reset_states(self) -> None: diff --git a/plugwise_usb/messages/responses.py b/plugwise_usb/messages/responses.py index beb8e6d9f..7be3cf599 100644 --- a/plugwise_usb/messages/responses.py +++ b/plugwise_usb/messages/responses.py @@ -68,19 +68,21 @@ class NodeResponseType(bytes, Enum): CIRCLE_PLUS = b"00DD" # ack for CirclePlusAllowJoiningRequest with state false - HN_ALLOWNEWNODESTOJOIN_ACK_0 RELAY_SWITCHED_OFF = b"00DE" # HN_SETRELAISPOSITION_OFF REAL_TIME_CLOCK_ACCEPTED = b"00DF" # HN_SETRTCDATA_ACK - RELAY_SWITCH_FAILED = b"00E2" # HN_SETRELAISPOSITION_DENIED + RELAY_SWITCH_FAILED = b"00E2" # HN_SETRELAISPOSITION_DENIED REAL_TIME_CLOCK_FAILED = b"00E7" # HN_SETRTCDATA_NACK NODE_RESET_ACK = b"00F2" # HN_REPLYROLECHANGED_OK NODE_RESET_FAIL = b"00F3" # HN_REPLYROLECHANGED_NOT_OK SED_CONFIG_ACCEPTED = b"00F6" # HN_ACKSETSLEEPBEHAVIOR SED_CONFIG_FAILED = b"00F7" # HN_ACKREQUESTSELFREMOVALFROMNETWORK - POWER_LOG_INTERVAL_ACCEPTED = b"00F8" # ack for CircleMeasureIntervalRequest - HN_ACKSETPOWERRECORDING + POWER_LOG_INTERVAL_ACCEPTED = ( + b"00F8" # ack for CircleMeasureIntervalRequest - HN_ACKSETPOWERRECORDING + ) class NodeAckResponseType(bytes, Enum): """Response types of a 'NodeAckResponse' reply message.""" - DEFAULT_ACK= b"00A0" # HN_DEFAULT_ACK + DEFAULT_ACK = b"00A0" # HN_DEFAULT_ACK DEFAULT_FAIL = b"00A1" # HN_DEFAULT_NACK SENSE_INTERVAL_ACCEPTED = b"00B3" # HN_ACKSETSENSEINTERVAL_ACK SENSE_INTERVAL_FAILED = b"00B4" # HN_ACKSETSENSEINTERVAL_NACK From 25546886c566bef8d38ae3442d1c40b3dbf7f0a7 Mon Sep 17 00:00:00 2001 From: Bouwe Westerdijk Date: Tue, 10 Mar 2026 10:48:10 +0100 Subject: [PATCH 04/17] Add missing imports --- plugwise_usb/nodes/circle.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugwise_usb/nodes/circle.py b/plugwise_usb/nodes/circle.py index 8c451aed0..b0f0dee6d 100644 --- a/plugwise_usb/nodes/circle.py +++ b/plugwise_usb/nodes/circle.py @@ -42,11 +42,12 @@ CircleMeasureIntervalRequest, CirclePowerUsageRequest, CircleRelayInitStateRequest, + CircleRelayInitStateResponse, CircleRelaySwitchRequest, EnergyCalibrationRequest, NodeInfoRequest, ) -from ..messages.responses import NodeInfoResponse, NodeResponseType +from ..messages.responses import NodeAckResponseType, NodeInfoResponse, NodeResponseType from .helpers import EnergyCalibration, raise_not_loaded from .helpers.counter import EnergyCounters from .helpers.firmware import CIRCLE_FIRMWARE_SUPPORT From af69c460119c8ed1224e6b8c754ea7756f9e7306 Mon Sep 17 00:00:00 2001 From: Bouwe Westerdijk Date: Tue, 10 Mar 2026 10:55:53 +0100 Subject: [PATCH 05/17] Fix invalid response_type --- plugwise_usb/nodes/circle.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugwise_usb/nodes/circle.py b/plugwise_usb/nodes/circle.py index b0f0dee6d..74f7ca676 100644 --- a/plugwise_usb/nodes/circle.py +++ b/plugwise_usb/nodes/circle.py @@ -1157,7 +1157,7 @@ async def _relay_init_get(self) -> bool | None: _LOGGER.warning( "Unexpected response type %s for %s", - response_type, + response.__class__.__name__, self._mac_in_str, ) return From 71c887743500bfd02a45c820524d2191e787b740 Mon Sep 17 00:00:00 2001 From: Bouwe Westerdijk Date: Tue, 10 Mar 2026 12:51:44 +0100 Subject: [PATCH 06/17] Correct comment --- plugwise_usb/messages/requests.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugwise_usb/messages/requests.py b/plugwise_usb/messages/requests.py index a1367bbd2..27af2882c 100644 --- a/plugwise_usb/messages/requests.py +++ b/plugwise_usb/messages/requests.py @@ -1517,8 +1517,8 @@ class CircleRelayInitStateRequest(PlugwiseRequest): """ _identifier = b"0138" # PWCircleGetSetInitialRelaisStateRequestV2_6 - _reply_identifier = b"0139" # PWCircleGetSetInitialRelaisStateReplyV2_6 - _reply_identifier_2 = b"0100" + _reply_identifier = b"0139" # CircleRelayInitStateResponse + _reply_identifier_2 = b"0100" # NodeAckResponse def __init__( self, From 475d957aa86b90d698556845845410fb5fa66926 Mon Sep 17 00:00:00 2001 From: Bouwe Westerdijk Date: Tue, 10 Mar 2026 13:01:50 +0100 Subject: [PATCH 07/17] Use try-except instead of warning-logger --- plugwise_usb/nodes/circle.py | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/plugwise_usb/nodes/circle.py b/plugwise_usb/nodes/circle.py index 74f7ca676..4c21896ab 100644 --- a/plugwise_usb/nodes/circle.py +++ b/plugwise_usb/nodes/circle.py @@ -1142,24 +1142,23 @@ async def _relay_init_get(self) -> bool | None: + f"supported for device {self.name}" ) - request = CircleRelayInitStateRequest( - self._send, self._mac_in_bytes, False, False - ) + try: + request = CircleRelayInitStateRequest( + self._send, self._mac_in_bytes, False, False + ) + except MessageError as err: + raise NodeError(f"{self._mac_in_str} error: {err}") + if (response := await request.send()) is None: _LOGGER.warning( "No response from %s to get relay init setting", self._mac_in_str ) - return None + return if isinstance(response, CircleRelayInitStateResponse): _LOGGER.debug("Successful get of relay init state for %s", self._mac_in_str) await self._relay_init_update_state(response.relay.value == 1) - _LOGGER.warning( - "Unexpected response type %s for %s", - response.__class__.__name__, - self._mac_in_str, - ) return async def _relay_init_set(self, state: bool) -> None: @@ -1170,9 +1169,13 @@ async def _relay_init_set(self, state: bool) -> None: + f"supported for device {self.name}" ) - request = CircleRelayInitStateRequest( - self._send, self._mac_in_bytes, True, state - ) + try: + request = CircleRelayInitStateRequest( + self._send, self._mac_in_bytes, True, state + ) + except MessageError as err: + raise NodeError(f"{self._mac_in_str} error: {err}") + if (response := await request.send()) is None: _LOGGER.warning( "No response from %s to configure relay init setting", self._mac_in_str @@ -1186,13 +1189,7 @@ async def _relay_init_set(self, state: bool) -> None: if response.node_ack_type == NodeAckResponseType.DEFAULT_ACK: _LOGGER.debug("Successful set relay init state for %s", self._mac_in_str) await self._relay_init_update_state(response.relay.value == 1) - return - _LOGGER.warning( - "Unexpected response ack type %s for %s", - response.node_ack_type, - self.name, - ) return async def _relay_init_load_from_cache(self) -> bool: From 5150015fe2b3cf026cd92d3fa933e00326b18877 Mon Sep 17 00:00:00 2001 From: Bouwe Westerdijk Date: Tue, 10 Mar 2026 13:07:56 +0100 Subject: [PATCH 08/17] Implement AI suggestion --- plugwise_usb/messages/requests.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/plugwise_usb/messages/requests.py b/plugwise_usb/messages/requests.py index 27af2882c..fa4e286a8 100644 --- a/plugwise_usb/messages/requests.py +++ b/plugwise_usb/messages/requests.py @@ -159,7 +159,7 @@ async def subscribe_to_response( [ Callable[[PlugwiseResponse], Coroutine[Any, Any, bool]], bytes | None, - tuple[bytes | None, ...] | None, + tuple[bytes, ...] | None, bytes | None, ], Coroutine[Any, Any, Callable[[], None]], @@ -173,10 +173,15 @@ async def subscribe_to_response( self._unsubscribe_stick_response = await stick_subscription_fn( self._process_stick_response, self._seq_id, None ) + reply_identifiers = tuple( + reply_id + for reply_id in (self._reply_identifier, self._reply_identifier_2) + if reply_id is not None + ) or None self._unsubscribe_node_response = await node_subscription_fn( self.process_node_response, self._mac, - (self._reply_identifier, self._reply_identifier_2), + reply_identifiers, self._seq_id, ) From 2e47f1984eada17d6d5581d92012ffb5f8d1e8da Mon Sep 17 00:00:00 2001 From: autoruff Date: Tue, 10 Mar 2026 12:08:01 +0000 Subject: [PATCH 09/17] fixup: pw-0138-2 Python code fixed using Ruff --- plugwise_usb/messages/requests.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/plugwise_usb/messages/requests.py b/plugwise_usb/messages/requests.py index fa4e286a8..44ff6c4f4 100644 --- a/plugwise_usb/messages/requests.py +++ b/plugwise_usb/messages/requests.py @@ -173,11 +173,14 @@ async def subscribe_to_response( self._unsubscribe_stick_response = await stick_subscription_fn( self._process_stick_response, self._seq_id, None ) - reply_identifiers = tuple( - reply_id - for reply_id in (self._reply_identifier, self._reply_identifier_2) - if reply_id is not None - ) or None + reply_identifiers = ( + tuple( + reply_id + for reply_id in (self._reply_identifier, self._reply_identifier_2) + if reply_id is not None + ) + or None + ) self._unsubscribe_node_response = await node_subscription_fn( self.process_node_response, self._mac, From 7ce9acdf951c388c3eb987b4ef80c434402b085a Mon Sep 17 00:00:00 2001 From: Bouwe Westerdijk Date: Tue, 10 Mar 2026 13:10:01 +0100 Subject: [PATCH 10/17] Revert removing brackets --- plugwise_usb/connection/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugwise_usb/connection/__init__.py b/plugwise_usb/connection/__init__.py index 2ed21cfb4..ff17f1400 100644 --- a/plugwise_usb/connection/__init__.py +++ b/plugwise_usb/connection/__init__.py @@ -234,7 +234,7 @@ async def send( return await self._queue.submit(request) try: return await self._queue.submit(request) - except NodeError, StickError: + except (NodeError, StickError): return None def _reset_states(self) -> None: From 71607f05bc53b24f2307b16655f989111ffa1d68 Mon Sep 17 00:00:00 2001 From: Bouwe Westerdijk Date: Tue, 10 Mar 2026 13:17:20 +0100 Subject: [PATCH 11/17] Fixup _relay_init_get() as suggested by AI --- plugwise_usb/nodes/circle.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/plugwise_usb/nodes/circle.py b/plugwise_usb/nodes/circle.py index 4c21896ab..84380cf20 100644 --- a/plugwise_usb/nodes/circle.py +++ b/plugwise_usb/nodes/circle.py @@ -1153,13 +1153,15 @@ async def _relay_init_get(self) -> bool | None: _LOGGER.warning( "No response from %s to get relay init setting", self._mac_in_str ) - return + return None if isinstance(response, CircleRelayInitStateResponse): _LOGGER.debug("Successful get of relay init state for %s", self._mac_in_str) - await self._relay_init_update_state(response.relay.value == 1) + state = response.relay.value == 1 + await self._relay_init_update_state(state) + return state - return + return None async def _relay_init_set(self, state: bool) -> None: """Configure relay init state.""" From 98785060994300032e8d5c246209920f08b8d8f2 Mon Sep 17 00:00:00 2001 From: Bouwe Westerdijk Date: Tue, 10 Mar 2026 13:23:14 +0100 Subject: [PATCH 12/17] One more AI suggestion implemented, remove unneeded returns --- plugwise_usb/nodes/circle.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/plugwise_usb/nodes/circle.py b/plugwise_usb/nodes/circle.py index 84380cf20..86de98525 100644 --- a/plugwise_usb/nodes/circle.py +++ b/plugwise_usb/nodes/circle.py @@ -1161,8 +1161,6 @@ async def _relay_init_get(self) -> bool | None: await self._relay_init_update_state(state) return state - return None - async def _relay_init_set(self, state: bool) -> None: """Configure relay init state.""" if NodeFeature.RELAY_INIT not in self._features: @@ -1190,9 +1188,7 @@ async def _relay_init_set(self, state: bool) -> None: if response.node_ack_type == NodeAckResponseType.DEFAULT_ACK: _LOGGER.debug("Successful set relay init state for %s", self._mac_in_str) - await self._relay_init_update_state(response.relay.value == 1) - - return + await self._relay_init_update_state(state) async def _relay_init_load_from_cache(self) -> bool: """Load relay init state from cache. Returns True if retrieval was successful.""" From c2742b9cf4daaeece4b9e453dda08abc120ed9bd Mon Sep 17 00:00:00 2001 From: Bouwe Westerdijk Date: Tue, 10 Mar 2026 13:26:38 +0100 Subject: [PATCH 13/17] Fix docstring as suggested --- plugwise_usb/messages/requests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugwise_usb/messages/requests.py b/plugwise_usb/messages/requests.py index 44ff6c4f4..26f5a37ae 100644 --- a/plugwise_usb/messages/requests.py +++ b/plugwise_usb/messages/requests.py @@ -1521,7 +1521,7 @@ class CircleRelayInitStateRequest(PlugwiseRequest): Supported protocols : 2.6 Response message : NodeAckResponse for set - : CircleInitRelayStateResponse for get + : CircleRelayInitStateResponse for get """ _identifier = b"0138" # PWCircleGetSetInitialRelaisStateRequestV2_6 From 05425913176b891db74a5ef2ecd3fa3f84848211 Mon Sep 17 00:00:00 2001 From: Bouwe Westerdijk Date: Tue, 10 Mar 2026 13:28:35 +0100 Subject: [PATCH 14/17] Add missing from err --- plugwise_usb/nodes/circle.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugwise_usb/nodes/circle.py b/plugwise_usb/nodes/circle.py index 86de98525..a249e1a4a 100644 --- a/plugwise_usb/nodes/circle.py +++ b/plugwise_usb/nodes/circle.py @@ -1147,7 +1147,7 @@ async def _relay_init_get(self) -> bool | None: self._send, self._mac_in_bytes, False, False ) except MessageError as err: - raise NodeError(f"{self._mac_in_str} error: {err}") + raise NodeError(f"{self._mac_in_str} error: {err}") from err if (response := await request.send()) is None: _LOGGER.warning( @@ -1174,7 +1174,7 @@ async def _relay_init_set(self, state: bool) -> None: self._send, self._mac_in_bytes, True, state ) except MessageError as err: - raise NodeError(f"{self._mac_in_str} error: {err}") + raise NodeError(f"{self._mac_in_str} error: {err}") from err if (response := await request.send()) is None: _LOGGER.warning( From 5c2a4bfd41eec4f33d8ab72b3f906081b34bc6c3 Mon Sep 17 00:00:00 2001 From: Bouwe Westerdijk Date: Wed, 11 Mar 2026 08:14:21 +0100 Subject: [PATCH 15/17] Update CHANGELOG --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c05fde6b4..4d9bb8190 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## v0.47.6 - 2026-03-11 + +PR [425](https://github.com/plugwise/python-plugwise-usb/pull/425): More 0138-related improvements + ## v0.47.5 - 2026-03-09 PR [424](https://github.com/plugwise/python-plugwise-usb/pull/424): Fix 0138 AckResponse From 2d4361cee9f352d912744818bfa0b3c6d7a13f62 Mon Sep 17 00:00:00 2001 From: Bouwe Westerdijk Date: Wed, 11 Mar 2026 08:15:20 +0100 Subject: [PATCH 16/17] Set to 0.47.6 release-version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 55e13abd7..8d6a058d9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "plugwise_usb" -version = "0.47.5" +version = "0.47.6" license = "MIT" keywords = ["home", "automation", "plugwise", "module", "usb"] classifiers = [ From 62fdd9b55ddb75c4ded79fea5d6db6abb03d56fe Mon Sep 17 00:00:00 2001 From: Bouwe Westerdijk Date: Wed, 11 Mar 2026 08:23:51 +0100 Subject: [PATCH 17/17] Correct import --- plugwise_usb/nodes/circle.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/plugwise_usb/nodes/circle.py b/plugwise_usb/nodes/circle.py index a249e1a4a..2d2a5f3b9 100644 --- a/plugwise_usb/nodes/circle.py +++ b/plugwise_usb/nodes/circle.py @@ -42,12 +42,16 @@ CircleMeasureIntervalRequest, CirclePowerUsageRequest, CircleRelayInitStateRequest, - CircleRelayInitStateResponse, CircleRelaySwitchRequest, EnergyCalibrationRequest, NodeInfoRequest, ) -from ..messages.responses import NodeAckResponseType, NodeInfoResponse, NodeResponseType +from ..messages.responses import ( + CircleRelayInitStateResponse, + NodeAckResponseType, + NodeInfoResponse, + NodeResponseType, +) from .helpers import EnergyCalibration, raise_not_loaded from .helpers.counter import EnergyCounters from .helpers.firmware import CIRCLE_FIRMWARE_SUPPORT